Esempio n. 1
0
        // Recv-6.11: “Forwarding”
        private OM2MResponsePrimitive Fowarding(OM2MRequestPrimitive request)
        {
            // Check timeout
            if (OM2MTimeStamp.IsTimeout((string)request.RequestExpirationTimestamp))
            {
                throw new OM2MRequestTimeoutException();
            }

            if (OM2MTimeStamp.IsTimeout((string)request.ResultExpirationTimestamp))
            {
                throw new OM2MRequestTimeoutException();
            }

            if (OM2MTimeStamp.IsTimeout((string)request.OperationExecutionTime))
            {
                throw new OM2MRequestTimeoutException();
            }

            // Get remote CSE Id
            string remoteCseId;

            var parts = request.TargetId.Split('/');

            if (parts.Length < 2)
            {
                throw new OM2MNotFoundException("Remote CSE not found");
            }

            remoteCseId = parts[1];

            // ToDo:...

            return(null);
        }
Esempio n. 2
0
        public override OM2MResponsePrimitive DoRetrieve(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var entity = db.Resources.Find(request.TargetId) as OM2MContainerEntity;

                if (entity == null)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();
                foreach (var i in entity.AccessControlPolicyIds)
                {
                    var queryAcp = db.Resources.Find(i) as OM2MAccessControlPolicyEntity;
                    if (queryAcp == null)
                    {
                        // Damaged
                        continue;
                    }
                    acpList.Add(queryAcp);
                }

                CheckACP(acpList, request.From, OM2MOperation.Retrieve);

                var resource = entity.ToResource(request.ResultContent ?? OM2MResultContent.Attributes);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.Content = resource;

                return(response);
            }
        }
        public override OM2MResponsePrimitive DoRetrieve(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var query = db.Resources.OfType <OM2MAccessControlPolicyEntity>()
                            .Where(x => x.ResourceId == request.TargetId)
                            .Include(x => x.Privileges)
                            .Include(x => x.SelfPrivileges);

                if (query.Count() == 0)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var entity = query.First();

                CheckSelfACP(entity, request.From, OM2MOperation.Retrieve);

                var response = new OM2MResponsePrimitive(CseConfig, request);

                var resource = entity.ToResource(request.ResultContent ?? OM2MResultContent.Attributes);

                response.Content            = resource;
                response.ResponseStatusCode = OM2MResponseStatusCode.Ok;

                return(response);
            }
        }
        public override OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var query = db.Resources.OfType <OM2MAccessControlPolicyEntity>()
                            .Where(x => x.ResourceId == request.TargetId)
                            .Include(x => x.SelfPrivileges);

                if (query.Count() == 0)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var entity = query.First();

                CheckSelfACP(entity, request.From, OM2MOperation.Delete);

                var subs = db.Resources.OfType <OM2MSubscriptionEntity>()
                           .Where(x => x.ParentId == entity.ResourceId).ToList();

                CseService.NotifyDeletion(subs, entity);

                db.Resources.Remove(entity);
                db.SaveChanges();

                var response = new OM2MResponsePrimitive(CseConfig, request);

                response.ResponseStatusCode = OM2MResponseStatusCode.Deleted;

                return(response);
            }
        }
Esempio n. 5
0
        private OM2MResponsePrimitive HandleOtherException(Exception ex, OM2MRequestPrimitive request)
        {
            var response = new OM2MResponsePrimitive(CseConfig, request);

            response.ResponseStatusCode = OM2MResponseStatusCode.InternalServerError;

            return(response);
        }
Esempio n. 6
0
        private OM2MResponsePrimitive HandleOM2MException(OM2MException ex, OM2MRequestPrimitive request)
        {
            var response = new OM2MResponsePrimitive(CseConfig, request);

            response.ResponseStatusCode = ex.ResponseStatusCode;

            return(response);
        }
Esempio n. 7
0
        private OM2MResponsePrimitive Notify(OM2MRequestPrimitive request,
                                             string target)
        {
            if (Regex.IsMatch(target, ".*://.*"))
            {
                throw new NotImplementedException();
            }
            else
            {
                request.To       = target;
                request.TargetId = target;

                return(DoBlockingRequest(request));
            }
        }
Esempio n. 8
0
        // 7.3.2.1 Check the validity of received request primitive
        // ToDo:
        private void ValidateRequest(OM2MRequestPrimitive request)
        {
            // Relative timestamp to absoule
            if (request.RequestExpirationTimestamp != null)
            {
                try
                {
                    request.RequestExpirationTimestamp = OM2MTimeStamp.GetTimeStamp(request.RequestExpirationTimestamp);
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine(ex);
                    throw new OM2MBadRequestException($"Request expiration timestamp is illegal format: {request.RequestExpirationTimestamp}");
                }
            }
            if (request.ResultExpirationTimestamp != null)
            {
                try
                {
                    request.ResultExpirationTimestamp = OM2MTimeStamp.GetTimeStamp(request.ResultExpirationTimestamp);
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine(ex);
                    throw new OM2MBadRequestException($"Result expiration timestamp is illegal format: {request.ResultExpirationTimestamp}");
                }
            }

            if (request.RequestExpirationTimestamp != null)
            {
                bool isTimeOut;

                try
                {
                    isTimeOut = OM2MTimeStamp.IsTimeout((string)request.RequestExpirationTimestamp);
                }
                catch (FormatException ex)
                {
                    Console.Error.WriteLine(ex);
                    throw new OM2MBadRequestException($"Request expiration timestamp is illegal format: {request.RequestExpirationTimestamp}");
                }

                if (isTimeOut)
                {
                    throw new OM2MRequestTimeoutException();
                }
            }
        }
Esempio n. 9
0
        public override OM2MResponsePrimitive DoRetrieve(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                // Check existence of the resource
                var cseBaseEntity = db.Resources.Find(request.TargetId) as OM2MCseBaseEntity;
                if (cseBaseEntity == null)
                {
                    throw new OM2MNotFoundException($"Resouce {request.TargetId} not found.");
                }

                // Check authorization
                var acpList = new List <OM2MAccessControlPolicyEntity>();
                foreach (var i in cseBaseEntity.AccessControlPolicyIds)
                {
                    var queryAcp = db.Resources.Where(x => x.ResourceId == i)
                                   .OfType <OM2MAccessControlPolicyEntity>()
                                   .Include(x => x.PrivilegesCore);

                    if (queryAcp.Count() == 0)
                    {
                        // Damaged
                        continue;
                    }

                    acpList.Add(queryAcp.First());
                }

                CheckACP(acpList, request.From, request.Operation.Value);

                OM2MResultContent resultContent = request.ResultContent ?? OM2MResultContent.Attributes;

                if (resultContent.HasChildResourceReferences())
                {
                    db.Entry(cseBaseEntity).Collection(x => x.Resources)
                    .Load();
                }

                OM2MCSEBase cseBaseResource = cseBaseEntity.ToResource(resultContent);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.ResponseStatusCode = OM2MResponseStatusCode.Ok;
                response.Content            = cseBaseResource;

                return(response);
            }
        }
Esempio n. 10
0
        public override OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var entity = db.Resources.Find(request.TargetId) as OM2MAEEntity;

                if (entity == null)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();
                foreach (var i in entity.AccessControlPolicyIds)
                {
                    var queryAcp = db.Resources.Where(x => x.ResourceId == i)
                                   .OfType <OM2MAccessControlPolicyEntity>()
                                   .Include(x => x.PrivilegesCore);

                    if (queryAcp.Count() == 0)
                    {
                        // Damaged
                        continue;
                    }
                    acpList.Add(queryAcp.First());
                }

                CheckACP(acpList, request.From, OM2MOperation.Delete);

                db.Entry(entity).Collection(x => x.Resources).Load();
                var subs = entity.Resources.OfType <OM2MSubscriptionEntity>().ToList();
                CseService.NotifyDeletion(subs, entity);

                db.Resources.Remove(entity);

                var uriMapEntity = db.UriMaps.Find(entity.HierarchicalUri);
                db.UriMaps.Remove(uriMapEntity);

                db.SaveChanges();

                var response = new OM2MResponsePrimitive(CseConfig, request);

                response.ResponseStatusCode = OM2MResponseStatusCode.Deleted;

                return(response);
            }
        }
Esempio n. 11
0
        public OM2MResponsePrimitive DoBlockingRequest(OM2MRequestPrimitive request)
        {
            try
            {
                ValidateRequest(request);
            }
            catch (OM2MException ex)
            {
                var response = HandleOM2MException(ex, request);
                return(response);
            }
            catch (Exception ex)
            {
                var response = HandleOtherException(ex, request);
                return(response);
            }

            return(DoRequestCore(request));
        }
Esempio n. 12
0
        public async Task <OM2MResponsePrimitive> SendBlockingRequestAsync(OM2MRequestPrimitive request)
        {
            var text   = OM2MJsonSerializer.Serialize(request);
            var data   = Encoding.UTF8.GetBytes(text);
            var buffer = new ArraySegment <byte>(data);

            var tcs = new TaskCompletionSource <OM2MResponsePrimitive>();

            lock (m_responseWaiters)
            {
                m_responseWaiters.Add(request.RequestIdentifier, tcs);
            }

            await WebSocket.SendAsync(buffer, WebSocketMessageType.Text,
                                      true, CancellationToken.None);

            // Wait for response
            await tcs.Task;

            return(tcs.Task.Result);
        }
Esempio n. 13
0
        public OM2MResponsePrimitive DoRequest(OM2MRequestPrimitive request)
        {
            OM2MResponsePrimitive response;

            try
            {
                switch (request.Operation)
                {
                case OM2MOperation.Create:
                    response = DoCreate(request);
                    break;

                case OM2MOperation.Retrieve:
                    response = DoRetrieve(request);
                    break;

                case OM2MOperation.Update:
                    response = DoUpdate(request);
                    break;

                case OM2MOperation.Delete:
                    response = DoDelete(request);
                    break;

                default:
                    throw new OM2MBadRequestException($"Invalid operation value: {request.Operation}");
                }
            }
            catch (OM2MBadRequestException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine($"Controller internal error: {ex}");
                throw ex;
            }

            return(response);
        }
Esempio n. 14
0
        private async Task ConnectCse()
        {
            var remoteWSPoa = $"ws://{CseConfig.RemoteCseHost}:{CseConfig.RemoteCsePort}";

            var client = new Protocols.OM2MWSClient(remoteWSPoa);

            await client.ConnectAsync();

            var remoteCse = new OM2MRemoteCSE();

            remoteCse.CseType             = CseConfig.CseType;
            remoteCse.CSEID               = $"/{CseConfig.CseBaseId}";
            remoteCse.CSEBase             = $"//{CseConfig.ServieProviderId}{remoteCse.CSEID}";
            remoteCse.RequestReachability = true;
            remoteCse.ResourceName        = CseConfig.CseBaseId;

            var request = new OM2MRequestPrimitive();

            request.From = CseConfig.AdminOriginator;

            request.To                = remoteWSPoa;
            request.Content           = remoteCse;
            request.Operation         = OM2MOperation.Create;
            request.ResourceType      = OM2MResourceType.RemoteCSE;
            request.RequestIdentifier = "001";

            var response = await client.SendBlockingRequestAsync(request);

            if (!response.ResponseStatusCode.Value.IsSuccess())
            {
                // Fatal error
                throw new Exception("fatal error failed to create remoteCSE on remote server.");
            }

            await client.CloseAsync();
        }
Esempio n. 15
0
            public OM2MResponsePrimitive SendRequest(OM2MRequestPrimitive request)
            {
                // Correct primitiveContent
                if (request.Content != null && request.PrimitiveContent == null)
                {
                    request.PrimitiveContent     = new OM2MPrimitiveContent();
                    request.PrimitiveContent.Any = new List <object>();
                    request.PrimitiveContent.Any.Add(request.Content);
                }

                var requestMessage = OM2MJsonSerializer.Serialize(request);

                var requestMessageData = Encoding.UTF8.GetBytes(requestMessage);

                ArraySegment <byte> buffer = new ArraySegment <byte>(requestMessageData);

                using (var resultWait = new ResultWait <OM2MResponsePrimitive>())
                {
                    OM2MResponsePrimitive response;

                    m_waittingResponses.Add(request.RequestIdentifier,
                                            resultWait);
                    try
                    {
                        Task.WaitAll(WebSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None));

                        response = resultWait.Wait(TimeSpan.FromSeconds(30));
                    }
                    finally
                    {
                        m_waittingResponses.Remove(request.RequestIdentifier);
                    }

                    return(response);
                }
            }
        // ToDo:
        public override OM2MResponsePrimitive DoCreate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var query = db.Resources.Where(x => x.ResourceId == request.TargetId);

                if (query.Count() == 0)
                {
                    throw new OM2MNotFoundException("Can not find parent resource.");
                }

                var parentEntity = query.First();

                var acpList = db.GetAcpList(parentEntity);

                CheckACP(acpList, request.From, OM2MOperation.Create);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var entity = new OM2MAccessControlPolicyEntity();

                var resource = request.Content as OM2MAccessControlPolicy;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource representation in content.");
                }

                if (resource.Privileges == null)
                {
                    throw new OM2MBadRequestException("Privileges is mandatory.");
                }
                if (resource.SelfPrivileges == null)
                {
                    throw new OM2MBadRequestException("SelfPrivileges is mandatory.");
                }

                entity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                entity.LastModifiedTime = entity.CreationTime;
                entity.ParentId         = parentEntity.ResourceId;
                entity.ResourceType     = (int)OM2MResourceType.AccessControlPolicy;

                if (resource.ExpirationTime != null)
                {
                    entity.ExpirationTime = resource.ExpirationTime;
                }

                if (resource.Labels != null)
                {
                    entity.Labels.Clear();
                    entity.Labels.AddRange(resource.Labels);
                }

                if (resource.AnnounceTo != null)
                {
                    entity.AnnounceTo.AddRange(resource.AnnounceTo);
                }

                if (resource.AnnouncedAttribute != null)
                {
                    entity.AnnouncedAttribute.AddRange(resource.AnnouncedAttribute);
                }

                foreach (var rule in resource.Privileges.AccessControlRule)
                {
                    entity.Privileges.Add(rule.ToEntity());
                }

                foreach (var rule in resource.SelfPrivileges.AccessControlRule)
                {
                    entity.SelfPrivileges.Add(rule.ToEntity());
                }

                db.Resources.Add(entity);

                db.SaveChanges();

                var subs = db.Resources.OfType <OM2MSubscriptionEntity>().Where(x => x.ParentId == parentEntity.ResourceId).ToList();
                CseService.Notify(subs, parentEntity, OM2MResourceStatus.ChildCreated);

                var response = new OM2MResponsePrimitive(CseConfig, request);

                response.Content            = entity.ToResource(OM2MResultContent.Attributes);
                response.ResponseStatusCode = OM2MResponseStatusCode.Created;

                return(response);
            }
        }
        public override OM2MResponsePrimitive DoUpdate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var query = db.Resources.OfType <OM2MAccessControlPolicyEntity>()
                            .Where(x => x.ResourceId == request.TargetId)
                            .Include(x => x.Privileges)
                            .Include(x => x.SelfPrivileges);

                if (query.Count() == 0)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var entity = query.First();

                CheckSelfACP(entity, request.From, OM2MOperation.Update);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var resource = request.Content as OM2MAccessControlPolicy;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource representation in content.");
                }

                var modifiedAttributes = new OM2MAccessControlPolicy();

                if (resource.ExpirationTime != null)
                {
                    entity.ExpirationTime             = resource.ExpirationTime;
                    modifiedAttributes.ExpirationTime = resource.ExpirationTime;
                }

                if (resource.Labels != null)
                {
                    entity.Labels.Clear();
                    entity.Labels.AddRange(resource.Labels);
                    modifiedAttributes.Labels = resource.Labels;
                }

                if (resource.AnnounceTo != null)
                {
                    entity.AnnounceTo.Clear();
                    entity.AnnounceTo.AddRange(resource.AnnounceTo);
                    modifiedAttributes.AnnounceTo = resource.AnnounceTo;
                }

                if (resource.AnnouncedAttribute != null)
                {
                    entity.AnnouncedAttribute.Clear();
                    entity.AnnouncedAttribute.AddRange(resource.AnnouncedAttribute);
                    modifiedAttributes.AnnouncedAttribute = resource.AnnouncedAttribute;
                }

                if (resource.Privileges != null)
                {
                    entity.Privileges.Clear();
                    foreach (var rule in resource.Privileges.AccessControlRule)
                    {
                        entity.Privileges.Add(rule.ToEntity());
                    }
                    modifiedAttributes.Privileges = resource.Privileges;
                }

                if (resource.SelfPrivileges != null)
                {
                    entity.SelfPrivileges.Clear();
                    foreach (var rule in resource.SelfPrivileges.AccessControlRule)
                    {
                        entity.SelfPrivileges.Add(rule.ToEntity());
                    }
                    modifiedAttributes.SelfPrivileges = resource.SelfPrivileges;
                }

                entity.LastModifiedTime             = OM2MTimeStamp.NowTimeStamp;
                modifiedAttributes.LastModifiedTime = entity.LastModifiedTime;

                db.SaveChanges();

                var subs = db.Resources.OfType <OM2MSubscriptionEntity>().Where(x => x.ParentId == entity.ResourceId).ToList();
                CseService.Notify(subs, entity, OM2MResourceStatus.Updated);

                var response = new OM2MResponsePrimitive(CseConfig, request);

                response.Content            = modifiedAttributes;
                response.ResponseStatusCode = OM2MResponseStatusCode.Updated;

                return(response);
            }
        }
Esempio n. 18
0
        public void DoRequest(OM2MRequestPrimitive request, IOM2MOriginator originator)
        {
            if (!IsInitalized)
            {
                throw new InvalidOperationException("CseService is not initialized.");
            }

            try
            {
                ValidateRequest(request);
            }
            catch (OM2MException ex)
            {
                var response = HandleOM2MException(ex, request);
                originator.SendResponse(response);
                return;
            }
            catch (Exception ex)
            {
                var response = HandleOtherException(ex, request);
                originator.SendResponse(response);
                return;
            }

            var responseType = OM2MResponseType.BlockingRequest;

            if (request.ResponseType != null && request.ResponseType.ResponseTypeValue != null)
            {
                responseType = request.ResponseType.ResponseTypeValue.Value;
            }

            if (responseType == OM2MResponseType.NonBlockingRequestAsynch ||
                responseType == OM2MResponseType.NonBlockingRequestSynch)
            {
                // ToDo:
                // Recv-3.0: Create <request> resource locally
                OM2MRequest req = new OM2MRequest();

                req.ResourceType     = OM2MResourceType.Request;
                req.ExpirationTime   = OM2MTimeStamp.GetTimeStamp(request.RequestExpirationTimestamp);
                req.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                req.LastModifiedTime = req.CreationTime;
                // ToDo:request.AccessControlPolicyIDs
                // ToDo:req.Labels
                req.StateTag = 0;

                req.Operation  = request.Operation;
                req.Target     = request.To;
                req.Originator = request.From;
                req.RequestID  = request.RequestIdentifier;
                // ToDo:request.MetaInformation =
                req.PrimitiveContent = request.PrimitiveContent;
                req.RequestStatus    = OM2MRequestStatus.Pending;
                req.OperationResult  = null;

                // Recv-4.0: Create a success Response
                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.ResponseStatusCode   = OM2MResponseStatusCode.Accepted;
                response.OriginatingTimestamp = OM2MTimeStamp.NowTimeStamp;

                // Recv-5.0: Send Response primitive
                originator.SendResponse(response);

                // Recv-6.0: Resource handling procedures
                response = DoBlockingRequest(request);

                // Recv-7.0: “Update <request> resource”
                req.LastModifiedTime = OM2MTimeStamp.NowTimeStamp;
                req.StateTag++;
                req.RequestStatus = OM2MRequestStatus.Forwarded;

                if (responseType == OM2MResponseType.NonBlockingRequestAsynch)
                {
                    // Recv-8.0: “Send Notification”
                    var notify = new OM2MRequestPrimitive();
                    notify.RequestIdentifier = Guid.NewGuid().ToString();
                    notify.Operation         = OM2MOperation.Notify;
                    notify.From             = request.TargetId;
                    notify.To               = request.From;
                    notify.PrimitiveContent = new OM2MPrimitiveContent();
                    notify.Content          = response.Content;

                    var notifyResponse = originator.SendRequest(notify);

                    // Recv-9.0: “Wait for Response primitive”
                }
            }
            else
            {
                var response = DoRequestCore(request);
                originator.SendResponse(response);
            }
        }
Esempio n. 19
0
        public override OM2MResponsePrimitive DoUpdate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var entity = db.Resources.Find(request.TargetId) as OM2MContainerEntity;

                if (entity == null)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();
                foreach (var i in entity.AccessControlPolicyIds)
                {
                    var queryAcp = db.Resources.Find(i) as OM2MAccessControlPolicyEntity;
                    if (queryAcp == null)
                    {
                        // Damaged
                        continue;
                    }
                    acpList.Add(queryAcp);
                }

                CheckACP(acpList, request.From, OM2MOperation.Update);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var resource = request.Content as OM2MContainer;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource in primitive content.");
                }

                if (resource.CurrentNrOfInstances != null)
                {
                    throw new OM2MBadRequestException("currentNrOfInstances is not permitted.");
                }

                if (resource.CurrentByteSize != null)
                {
                    throw new OM2MBadRequestException("currentByteSize is not permitted.");
                }

                var modifiedAttrs = new OM2MContainer();

                if (resource.AccessControlPolicyIDs != null &&
                    resource.AccessControlPolicyIDs.Count > 0)
                {
                    foreach (var acp in acpList)
                    {
                        CheckSelfACP(acp, request.From, OM2MOperation.Update);
                    }

                    entity.AccessControlPolicyIds.Clear();
                    entity.AccessControlPolicyIds.AddRange(resource.AccessControlPolicyIDs);
                    modifiedAttrs.AccessControlPolicyIDs = resource.AccessControlPolicyIDs;
                }

                if (resource.Labels != null)
                {
                    entity.Labels.Clear();
                    entity.Labels.AddRange(resource.Labels);
                    modifiedAttrs.Labels = resource.Labels;
                }

                if (resource.ExpirationTime != null)
                {
                    entity.ExpirationTime        = resource.ExpirationTime;
                    modifiedAttrs.ExpirationTime = resource.ExpirationTime;
                }

                if (resource.AnnounceTo != null)
                {
                    entity.AnnounceTo.Clear();
                    entity.AnnounceTo.AddRange(resource.AnnounceTo);
                    modifiedAttrs.AnnounceTo = resource.AnnounceTo;
                }

                if (resource.AnnouncedAttribute != null)
                {
                    entity.AnnouncedAttribute.Clear();
                    entity.AnnouncedAttribute.AddRange(resource.AnnouncedAttribute);
                    modifiedAttrs.AnnouncedAttribute = resource.AnnouncedAttribute;
                }

                if (resource.MaxNrOfInstances != null)
                {
                    entity.MaxNrOfInstances        = resource.MaxNrOfInstances;
                    modifiedAttrs.MaxNrOfInstances = resource.MaxNrOfInstances;
                }

                if (resource.MaxByteSize != null)
                {
                    entity.MaxByteSize        = resource.MaxByteSize;
                    modifiedAttrs.MaxByteSize = resource.MaxByteSize;
                }

                if (resource.MaxInstanceAge != null)
                {
                    entity.MaxInstanceAge        = resource.MaxInstanceAge;
                    modifiedAttrs.MaxInstanceAge = resource.MaxInstanceAge;
                }

                if (resource.LocationID != null)
                {
                    entity.LocationID        = resource.LocationID;
                    modifiedAttrs.LocationID = resource.LocationID;
                }

                if (resource.OntologyRef != null)
                {
                    entity.OntologyRef        = resource.OntologyRef;
                    modifiedAttrs.OntologyRef = resource.OntologyRef;
                }

                entity.StateTag        = entity.StateTag + 1;
                modifiedAttrs.StateTag = entity.StateTag;

                entity.LastModifiedTime        = OM2MTimeStamp.NowTimeStamp;
                modifiedAttrs.LastModifiedTime = entity.LastModifiedTime;

                db.SaveChanges();

                var subs = entity.Resources.OfType <OM2MSubscriptionEntity>().ToList();
                CseService.Notify(subs, entity, OM2MResourceStatus.Updated);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.Content            = modifiedAttrs;
                response.ResponseStatusCode = OM2MResponseStatusCode.Updated;

                return(response);
            }
        }
Esempio n. 20
0
        public override OM2MResponsePrimitive DoCreate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var parentEntity = db.Resources.Find(request.TargetId);
                if (parentEntity == null)
                {
                    throw new OM2MNotFoundException($"Cannot find parent resource: {request.TargetId}.");
                }

                List <string> acpIds = null;

                if (parentEntity is OM2MCseBaseEntity)
                {
                    var ee = parentEntity as OM2MCseBaseEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }
                else if (parentEntity is OM2MAEEntity)
                {
                    var ee = parentEntity as OM2MAEEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }
                else if (parentEntity is OM2MContainerEntity)
                {
                    var ee = parentEntity as OM2MContainerEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }
                else if (parentEntity is OM2MRemoteCseEntity)
                {
                    var ee = parentEntity as OM2MContainerEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();

                if (acpIds != null)
                {
                    foreach (var i in acpIds)
                    {
                        var queryAcp = db.Resources.Find(i) as OM2MAccessControlPolicyEntity;
                        if (queryAcp == null)
                        {
                            // Damaged
                            continue;
                        }
                        acpList.Add(queryAcp);
                    }
                }

                CheckACP(acpList, request.From, OM2MOperation.Create);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var resource = request.Content as OM2MContainer;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource representation in content.");
                }

                /*
                 * creator				O
                 * maxNrOfInstances		O
                 * maxByteSize			O
                 * maxInstanceAge		O
                 * currentNrOfInstances	NP
                 * currentByteSize		NP
                 * locationID			O
                 * ontologyRef			O
                 */
                var entity = new OM2MContainerEntity();

                // Check NP attributes
                if (resource.CurrentNrOfInstances != null)
                {
                    throw new OM2MBadRequestException("currentNrOfInstances is not permitted.");
                }
                if (resource.CurrentByteSize != null)
                {
                    throw new OM2MBadRequestException("currentNrOfInstances is not permitted.");
                }

                // Assign M/O attributes
                if (resource.Labels != null)
                {
                    entity.Labels.AddRange(resource.Labels);
                }

                if (resource.ExpirationTime != null)
                {
                    entity.ExpirationTime = resource.ExpirationTime;
                }

                if (resource.AnnounceTo != null)
                {
                    entity.AnnounceTo.AddRange(resource.AnnounceTo);
                }

                if (resource.AnnouncedAttribute != null)
                {
                    entity.AnnouncedAttribute.AddRange(resource.AnnouncedAttribute);
                }

                if (resource.Creator != null)
                {
                    entity.Creator = resource.Creator;
                }

                if (resource.MaxNrOfInstances != null)
                {
                    entity.MaxNrOfInstances = resource.MaxNrOfInstances;
                }

                if (resource.MaxByteSize != null)
                {
                    entity.MaxByteSize = resource.MaxByteSize;
                }

                if (resource.MaxInstanceAge != null)
                {
                    entity.MaxInstanceAge = resource.MaxInstanceAge;
                }

                if (resource.LocationID != null)
                {
                    entity.LocationID = resource.LocationID;
                }

                if (resource.OntologyRef != null)
                {
                    entity.OntologyRef = resource.OntologyRef;
                }

                var id = db.GenerateId();

                entity.ResourceId       = $"/{CseConfig.CseBaseId}/con-{id}";
                entity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                entity.LastModifiedTime = entity.CreationTime;
                entity.ParentId         = parentEntity.ResourceId;
                entity.ResourceType     = (int)OM2MResourceType.Container;

                if (resource.ResourceName != null)
                {
                    // ToDo: need to check resource name
                    entity.ResourceName = resource.ResourceName;
                }
                else
                {
                    entity.ResourceName = $"con_{id}";
                }

                entity.HierarchicalUri = parentEntity.HierarchicalUri + "/" + entity.ResourceName;

                if (resource.AccessControlPolicyIDs != null &&
                    resource.AccessControlPolicyIDs.Count > 0)
                {
                    // ToDo:
                    throw new OM2MNotImplementedException();
                }
                else
                {
                    entity.AccessControlPolicyIds.AddRange(acpIds);
                }

                entity.StateTag = 0;

                parentEntity.Resources.Add(entity);

                var uriMapEntity = new OM2MUriMapEntity();
                uriMapEntity.Uri        = entity.HierarchicalUri;
                uriMapEntity.ResourceId = entity.ResourceId;
                db.UriMaps.Add(uriMapEntity);

                db.SaveChanges();

                var subs = parentEntity.Resources.OfType <OM2MSubscriptionEntity>().ToList();

                CseService.Notify(subs, entity, OM2MResourceStatus.ChildCreated);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.ResponseStatusCode = OM2MResponseStatusCode.Created;
                response.Content            = entity.ToResource(OM2MResultContent.Attributes);

                return(response);
            }
        }
Esempio n. 21
0
 public abstract OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request);
Esempio n. 22
0
 public abstract OM2MResponsePrimitive DoRetrieve(OM2MRequestPrimitive request);
Esempio n. 23
0
        private OM2MResponsePrimitive DoRequestCore(OM2MRequestPrimitive request)
        {
            var response = new OM2MResponsePrimitive(CseConfig, request);

            try
            {
                OM2MController controller = null;

                if (request.TargetId == null && request.To == null)
                {
                    throw new OM2MBadRequestException("To parameter is missing.");
                }

                if (request.TargetId == null)
                {
                    request.TargetId = request.To;
                }

                // Remove last "/"
                if (request.TargetId.EndsWith("/", StringComparison.Ordinal))
                {
                    request.TargetId = request.TargetId.Substring(0, request.TargetId.Length - 1);
                }

                // Uri -> ResourceId
                using (var db = new OM2MDbContext())
                {
                    var uriMapEntity = db.UriMaps.Find(request.TargetId);
                    if (uriMapEntity != null)
                    {
                        request.TargetId = uriMapEntity.ResourceId;
                    }
                }

                // Recv-6.0.1: Receiver is Registrar CSE & Originator is AE & operation is create
                if (m_cseBasePattern.IsMatch(request.TargetId) &&
                    (request.From == null || m_aePattern.IsMatch(request.From)) &&
                    request.Operation == OM2MOperation.Create)
                {
                    // Recv-6.0.2: “Check Service Subscription Profile”
                    // ToDo:
                }

                if (request.Content == null)
                {
                    if (request.PrimitiveContent != null && request.PrimitiveContent.Any != null &&
                        request.PrimitiveContent.Any.Count > 0)
                    {
                        request.Content = request.PrimitiveContent.Any[0];
                    }
                }

                // Recv-6.1: Hosting CSE of the targeted resource?
                if (IsHostingCseResouce(request.TargetId))
                {
                    if (request.Operation == OM2MOperation.Create)
                    {
                        if (request.ResourceType == null)
                        {
                            throw new OM2MBadRequestException($"Resouce type is missing for creation request.");
                        }
                        controller = GetControllerFromResouceType(request.ResourceType.Value);
                    }
                    else
                    {
                        controller = GetControllerFromUri(request.TargetId);
                    }

                    if (controller == null)
                    {
                        throw new OM2MBadRequestException($"Invalid request.");
                    }

                    response = controller.DoRequest(request);

                    if (request.ResultContent != null &&
                        request.ResultContent == OM2MResultContent.Nothing)
                    {
                        response.Content = null;
                    }
                }
                else
                {
                    // ToDo:Recv-6.9: CMDH processing supported?
                    // Now Not supported

                    // Recv-6.11: “Forwarding”
                    response = Fowarding(request);
                }
            }
            catch (OM2MException ex)
            {
                response.ResponseStatusCode = ex.ResponseStatusCode;
            }
            catch (Exception ex)
            {
                response.ResponseStatusCode = OM2MResponseStatusCode.InternalServerError;
            }

            return(response);
        }
Esempio n. 24
0
        public override OM2MResponsePrimitive DoUpdate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var entity = db.Resources.Find(request.TargetId) as OM2MAEEntity;

                if (entity == null)
                {
                    throw new OM2MNotFoundException("Resource not found.");
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();
                foreach (var i in entity.AccessControlPolicyIds)
                {
                    var queryAcp = db.Resources.Where(x => x.ResourceId == i)
                                   .OfType <OM2MAccessControlPolicyEntity>()
                                   .Include(x => x.PrivilegesCore);

                    if (queryAcp.Count() == 0)
                    {
                        // Damaged
                        continue;
                    }
                    acpList.Add(queryAcp.First());
                }

                CheckACP(acpList, request.From, OM2MOperation.Update);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var resource = request.Content as OM2MAE;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource in primitive content.");
                }

                if (resource.AppID != null)
                {
                    throw new OM2MBadRequestException("AppID is not permitted.");
                }

                if (resource.AEID != null)
                {
                    throw new OM2MBadRequestException("AE-ID is not permitted.");
                }

                if (resource.NodeLink != null)
                {
                    throw new OM2MBadRequestException("NodeLink is not permitted.");
                }

                var modifiedAttrs = new OM2MAE();

                if (resource.AccessControlPolicyIDs != null &&
                    resource.AccessControlPolicyIDs.Count > 0)
                {
                    foreach (var acp in acpList)
                    {
                        CheckSelfACP(acp, request.From, OM2MOperation.Update);
                    }

                    entity.AccessControlPolicyIds.Clear();
                    entity.AccessControlPolicyIds.AddRange(resource.AccessControlPolicyIDs);
                    modifiedAttrs.AccessControlPolicyIDs = resource.AccessControlPolicyIDs;
                }

                if (resource.Labels != null)
                {
                    entity.Labels.Clear();
                    entity.Labels.AddRange(resource.Labels);
                    modifiedAttrs.Labels = resource.Labels;
                }

                if (resource.ExpirationTime != null)
                {
                    entity.ExpirationTime        = resource.ExpirationTime;
                    modifiedAttrs.ExpirationTime = resource.ExpirationTime;
                }

                if (resource.AnnounceTo != null)
                {
                    entity.AnnounceTo.Clear();
                    entity.AnnounceTo.AddRange(resource.AnnounceTo);
                    modifiedAttrs.AnnounceTo = resource.AnnounceTo;
                }

                if (resource.AnnouncedAttribute != null)
                {
                    entity.AnnouncedAttribute.Clear();
                    entity.AnnouncedAttribute.AddRange(resource.AnnouncedAttribute);
                    modifiedAttrs.AnnouncedAttribute = resource.AnnouncedAttribute;
                }

                if (resource.AppName != null)
                {
                    entity.AppName        = resource.AppName;
                    modifiedAttrs.AppName = resource.AppName;
                }

                if (resource.PointOfAccess != null)
                {
                    entity.PointOfAccess.Clear();
                    entity.PointOfAccess.AddRange(resource.PointOfAccess);
                    modifiedAttrs.PointOfAccess = resource.PointOfAccess;
                }

                if (resource.OntologyRef != null)
                {
                    entity.OntologyRef        = resource.OntologyRef;
                    modifiedAttrs.OntologyRef = resource.OntologyRef;
                }

                if (resource.RequestReachability != null)
                {
                    entity.RequestReachability        = resource.RequestReachability.Value;
                    modifiedAttrs.RequestReachability = resource.RequestReachability;
                }

                entity.LastModifiedTime        = OM2MTimeStamp.NowTimeStamp;
                modifiedAttrs.LastModifiedTime = entity.LastModifiedTime;

                db.SaveChanges();

                db.Entry(entity).Collection(x => x.Resources).Load();
                var subs = entity.Resources.OfType <OM2MSubscriptionEntity>().ToList();
                CseService.Notify(subs, entity, OM2MResourceStatus.Updated);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.Content            = modifiedAttrs;
                response.ResponseStatusCode = OM2MResponseStatusCode.Updated;

                return(response);
            }
        }
Esempio n. 25
0
        public override OM2MResponsePrimitive DoCreate(OM2MRequestPrimitive request)
        {
            using (var db = CreateDbContext())
            {
                var parentEntity = db.Resources.Find(request.TargetId);
                if (parentEntity == null)
                {
                    throw new OM2MNotFoundException($"Cannot find parent resource: {request.TargetId}.");
                }

                List <string> acpIds = null;

                if (parentEntity is OM2MCseBaseEntity)
                {
                    var ee = parentEntity as OM2MCseBaseEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }
                else if (parentEntity is OM2MRemoteCseEntity)
                {
                    var ee = parentEntity as OM2MContainerEntity;
                    acpIds = ee.AccessControlPolicyIds;
                }

                if (request.From != null)
                {
                }

                var acpList = new List <OM2MAccessControlPolicyEntity>();

                if (acpIds != null)
                {
                    foreach (var i in acpIds)
                    {
                        var queryAcp = db.Resources.Where(x => x.ResourceId == i)
                                       .OfType <OM2MAccessControlPolicyEntity>()
                                       .Include(x => x.PrivilegesCore);

                        if (queryAcp.Count() == 0)
                        {
                            // Damaged
                            continue;
                        }
                        acpList.Add(queryAcp.First());
                    }
                }

                CheckACP(acpList, request.From, OM2MOperation.Create);

                if (request.Content == null)
                {
                    throw new OM2MBadRequestException("A content is required for creation.");
                }

                var resource = request.Content as OM2MAE;

                if (resource == null)
                {
                    throw new OM2MBadRequestException("Incorrect resource representation in content.");
                }

                /*
                 * appName				O
                 * App-ID				M
                 * AE-ID				NP
                 * pointOfAccess		O
                 * ontologyRef			O
                 * nodeLink				O
                 * requestReachability	M
                 * contentSerialization	O
                 * e2eSecInfo			O
                 */
                var entity = new OM2MAEEntity();

                // Check NP attributes
                if (resource.AEID != null)
                {
                    throw new OM2MBadRequestException("AE-ID is not permitted.");
                }

                // Assign M attributes
                if (resource.AppID == null)
                {
                    throw new OM2MBadRequestException("App-ID is mandatory.");
                }

                /*
                 * if (aeResource.RequestReachability == null)
                 * {
                 *      throw new OM2MBadRequestException("requestReachability is mandatory.");
                 * }*/

                entity.AppId = resource.AppID;

                // Assign M/O attributes
                if (resource.AppName != null)
                {
                    entity.AppName = resource.AppName;
                }

                if (resource.PointOfAccess != null)
                {
                    entity.PointOfAccess.AddRange(resource.PointOfAccess);
                }

                if (resource.OntologyRef != null)
                {
                    entity.OntologyRef = resource.OntologyRef;
                }

                if (resource.RequestReachability == null)
                {
                    entity.RequestReachability = true;
                }
                else
                {
                    entity.RequestReachability = resource.RequestReachability.Value;
                }

                if (resource.NodeLink != null)
                {
                    entity.NodeLink = resource.NodeLink;
                }

                var id = db.GenerateId();

                entity.ResourceId       = $"/{CseConfig.CseBaseId}/CAE{id}";
                entity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                entity.LastModifiedTime = entity.CreationTime;
                entity.ParentId         = parentEntity.ResourceId;
                entity.ResourceType     = (int)OM2MResourceType.AE;
                entity.AEId             = $"CAE{id}";

                if (resource.ResourceName != null)
                {
                    // ToDo: need to check resource name
                    entity.ResourceName = resource.ResourceName;
                }
                else
                {
                    entity.ResourceName = $"ae_{id}";
                }

                entity.HierarchicalUri = parentEntity.HierarchicalUri + "/" + entity.ResourceName;

                {
                    var acpId = db.GenerateId();

                    var acpEntity = new OM2MAccessControlPolicyEntity();
                    acpEntity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                    acpEntity.LastModifiedTime = acpEntity.CreationTime;
                    acpEntity.ParentId         = $"/{CseConfig.CseBaseId}";
                    acpEntity.ResourceId       = $"/{CseConfig.CseBaseId}/acp-{acpId}";
                    acpEntity.ResourceName     = $"acpae_{acpId}";

                    var ruleEntity = new OM2MAccessControlRuleEntity();
                    ruleEntity.AccessControlOperations = 63;
                    ruleEntity.AccessControlOriginators.Add(CseConfig.AdminOriginator);
                    acpEntity.SelfPrivileges.Add(ruleEntity);

                    ruleEntity = new OM2MAccessControlRuleEntity();
                    ruleEntity.AccessControlOperations = 63;
                    ruleEntity.AccessControlOriginators.Add(entity.AEId);
                    ruleEntity.AccessControlOriginators.Add(CseConfig.AdminOriginator);
                    acpEntity.Privileges.Add(ruleEntity);
                    acpEntity.HierarchicalUri = $"/{CseConfig.CseBaseId}/{CseConfig.CseBaseName}/{acpEntity.ResourceName}";

                    entity.AccessControlPolicyIds.Add(acpEntity.ResourceId);
                    //parentEntity.Resources.Add(acpEntity);
                    db.Resources.Add(acpEntity);

                    var uriMapEntity2 = new OM2MUriMapEntity();
                    uriMapEntity2.Uri        = acpEntity.HierarchicalUri;
                    uriMapEntity2.ResourceId = acpEntity.ResourceId;
                    db.UriMaps.Add(uriMapEntity2);
                }

                //parentEntity.Resources.Add(entity);
                db.Resources.Add(entity);

                var uriMapEntity = new OM2MUriMapEntity();
                uriMapEntity.Uri        = entity.HierarchicalUri;
                uriMapEntity.ResourceId = entity.ResourceId;
                db.UriMaps.Add(uriMapEntity);

                db.SaveChanges();

                var subs = db.Resources
                           .OfType <OM2MSubscriptionEntity>()
                           .Where(x => x.ParentId == parentEntity.ResourceId).ToList();

                CseService.Notify(subs, entity, OM2MResourceStatus.ChildCreated);

                var response = new OM2MResponsePrimitive(CseConfig, request);
                response.ResponseStatusCode = OM2MResponseStatusCode.Created;
                response.Content            = entity.ToResource(OM2MResultContent.Attributes);

                return(response);
            }
        }
Esempio n. 26
0
 public override OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request)
 {
     throw new OM2MOperationNotAllowedException("Delete of CSEBase is not allowed.");
 }