Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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"));
                }
            }
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }