public async Task <CoapMessage> PostAsync(CoapMessage message) { try { CoapUri uri = new CoapUri(message.ResourceUri.ToString()); ResponseMessageType rmt = message.MessageType == CoapMessageType.Confirmable ? ResponseMessageType.Acknowledgement : ResponseMessageType.NonConfirmable; EventMetadata metadata = await GraphManager.GetPiSystemMetadataAsync(uri.Resource); if (!await adapter.CanPublishAsync(metadata, channel.IsEncrypted)) { if (metadata.Audit) { await auditor?.WriteAuditRecordAsync(new MessageAuditRecord("XXXXXXXXXXXX", session.Identity, this.channel.TypeId, "COAP", message.Payload.Length, MessageDirectionType.In, false, DateTime.UtcNow, "Not authorized, missing resource metadata, or channel encryption requirements")); } return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Unauthorized, message.Token)); } string contentType = message.ContentType.HasValue ? message.ContentType.Value.ConvertToContentType() : "application/octet-stream"; EventMessage msg = new EventMessage(contentType, uri.Resource, ProtocolType.COAP, message.Encode(), DateTime.UtcNow, metadata.Audit); if (!string.IsNullOrEmpty(uri.CacheKey)) { msg.CacheKey = uri.CacheKey; } if (uri.Indexes == null) { await adapter.PublishAsync(msg); } else { List <KeyValuePair <string, string> > indexes = new List <KeyValuePair <string, string> >(uri.Indexes); Task task = Retry.ExecuteAsync(async() => { await adapter.PublishAsync(msg, indexes); }); task.LogExceptions(); } return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Created, message.Token)); } catch (Exception ex) { Trace.TraceError("{0} - CoAP publish error on channel '{1}'", DateTime.UtcNow.ToString("yyyy-MM-ddTHH-MM-ss.fffff"), channel.Id); throw ex; } }
private async Task PublishAsync(string identity, EventMessage message, List <KeyValuePair <string, string> > indexes = null) { EventMetadata metadata = await GraphManager.GetPiSystemMetadataAsync(message.ResourceUri); if (await adapter.CanPublishAsync(metadata, Channel.IsEncrypted)) { await adapter.PublishAsync(message, indexes); } else { if (metadata.Audit) { await messageAuditor?.WriteAuditRecordAsync(new MessageAuditRecord("XXXXXXXXXXXX", identity, this.Channel.TypeId, "REST", message.Message.Length, MessageDirectionType.In, false, DateTime.UtcNow, "Not authorized, missing resource metadata, or channel encryption requirements")); } } }
private async Task PublishAsync(PublishMessage message) { MessageAuditRecord record = null; EventMetadata metadata = null; try { MqttUri mqttUri = new MqttUri(message.Topic); metadata = await GraphManager.GetPiSystemMetadataAsync(mqttUri.Resource); if (await adapter.CanPublishAsync(metadata, Channel.IsEncrypted)) { EventMessage msg = new EventMessage(mqttUri.ContentType, mqttUri.Resource, ProtocolType.MQTT, message.Encode(), DateTime.UtcNow, metadata.Audit); if (!string.IsNullOrEmpty(mqttUri.CacheKey)) { msg.CacheKey = mqttUri.CacheKey; } await adapter.PublishAsync(msg, null); } else { if (metadata.Audit) { record = new MessageAuditRecord("XXXXXXXXXXXX", session.Identity, this.Channel.TypeId, "MQTT", message.Payload.Length, MessageDirectionType.In, false, DateTime.UtcNow, "Not authorized, missing resource metadata, or channel encryption requirements"); } throw new SecurityException(String.Format("'{0}' not authorized to publish to '{1}'", session.Identity, metadata.ResourceUriString)); } } catch (Exception ex) { logger.LogError(ex, $"MQTT adapter PublishAsync error on channel '{Channel.Id}'."); OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(Channel.Id, ex)); } finally { if (metadata != null && metadata.Audit && record != null) { await messageAuditor?.WriteAuditRecordAsync(record); } } }