// 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); }
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); } }
private OM2MResponsePrimitive HandleOtherException(Exception ex, OM2MRequestPrimitive request) { var response = new OM2MResponsePrimitive(CseConfig, request); response.ResponseStatusCode = OM2MResponseStatusCode.InternalServerError; return(response); }
private OM2MResponsePrimitive HandleOM2MException(OM2MException ex, OM2MRequestPrimitive request) { var response = new OM2MResponsePrimitive(CseConfig, request); response.ResponseStatusCode = ex.ResponseStatusCode; return(response); }
private OM2MResponsePrimitive Notify(OM2MRequestPrimitive request, string target) { if (Regex.IsMatch(target, ".*://.*")) { throw new NotImplementedException(); } else { request.To = target; request.TargetId = target; return(DoBlockingRequest(request)); } }
// 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(); } } }
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); } }
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); } }
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)); }
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); }
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); }
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(); }
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); } }
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); } }
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); } }
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); } }
public abstract OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request);
public abstract OM2MResponsePrimitive DoRetrieve(OM2MRequestPrimitive request);
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); }
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); } }
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); } }
public override OM2MResponsePrimitive DoDelete(OM2MRequestPrimitive request) { throw new OM2MOperationNotAllowedException("Delete of CSEBase is not allowed."); }