private void InitCseBase()
        {
            var cseConfig = CseConfig;

            using (var db = new OM2MDbContext())
            {
                var cseBaseEntity = new OM2MCseBaseEntity();

                var query = db.Resources.OfType <OM2MAccessControlPolicyEntity>();

                var acpEntity = query.First();

                cseBaseEntity.AccessControlPolicyIds.Add(acpEntity.ResourceId);
                cseBaseEntity.Resources.Add(acpEntity);
                cseBaseEntity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                cseBaseEntity.LastModifiedTime = cseBaseEntity.CreationTime;
                cseBaseEntity.CseId            = cseConfig.CseBaseId;
                cseBaseEntity.CseType          = (int)cseConfig.CseType;
                cseBaseEntity.ResourceName     = cseConfig.CseBaseName;
                cseBaseEntity.ResourceId       = $"/{cseConfig.CseBaseId}";
                cseBaseEntity.ResourceType     = (int)OM2MResourceType.CSEBase;
                cseBaseEntity.HierarchicalUri  = $"/{cseConfig.CseBaseId}/{cseConfig.CseBaseName}";
                cseBaseEntity.SupportedResourceType.AddRange(new OM2MResourceType[] {
                    OM2MResourceType.AccessControlPolicy,
                    OM2MResourceType.AE,
                    OM2MResourceType.Container,
                    OM2MResourceType.ContentInstance,
                    OM2MResourceType.CSEBase,
                    OM2MResourceType.Group,
                    OM2MResourceType.Node,
                    OM2MResourceType.PollingChannel,
                    OM2MResourceType.RemoteCSE,
                    OM2MResourceType.Request,
                    OM2MResourceType.Subscription
                });

                cseBaseEntity.PointOfAccess.Add("http://localhost:5000/");

                db.Resources.Add(cseBaseEntity);

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

                db.SaveChanges();
            }
        }
        private void InitACP()
        {
            using (var db = new OM2MDbContext())
            {
                var cseConfig = CseConfig;

                var acpId = db.GenerateId();

                var acpEntity = new OM2MAccessControlPolicyEntity();
                acpEntity.ParentId         = $"/{cseConfig.CseBaseId}";
                acpEntity.CreationTime     = OM2MTimeStamp.NowTimeStamp;
                acpEntity.LastModifiedTime = acpEntity.CreationTime;
                acpEntity.ResourceId       = $"/{cseConfig.CseBaseId}/acp-{acpId}";
                acpEntity.ResourceName     = CseConfig.AdminAcpName;
                acpEntity.ResourceType     = (int)OM2MResourceType.AccessControlPolicy;
                acpEntity.HierarchicalUri  = $"/{cseConfig.CseBaseId}/{cseConfig.CseBaseName}/{acpEntity.ResourceName}";

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

                ruleEntity = new OM2MAccessControlRuleEntity();
                ruleEntity.AccessControlOriginators.Add(CseConfig.AdminOriginator);
                ruleEntity.AccessControlOriginators.Add($"/{cseConfig.CseBaseId}");
                ruleEntity.AccessControlOperations = 63;

                acpEntity.Privileges.Add(ruleEntity);

                db.Resources.Add(acpEntity);

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

                db.SaveChanges();
            }
        }
Exemple #3
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);
            }
        }
Exemple #4
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);
            }
        }