public Attachment(byte[] data, string filename, AttachmentContentType contentType)
            {
                Data     = data;
                Filename = filename;

                switch (contentType)
                {
                case AttachmentContentType.Jpg:
                    ContentType = "image/jpeg";
                    break;

                case AttachmentContentType.Png:
                    ContentType = "image/png";
                    break;
                }
            }
        public static int CreateAttachment(int tenantID, int postID, string name, string path, int size, AttachmentContentType contentType, string mimeContentType)
        {

            return DbManager.ExecuteScalar<int>(new SqlInsert("forum_attachment")
                                                    .InColumnValue("id", 0)
                                                    .InColumnValue("TenantID", tenantID)
                                                    .InColumnValue("post_id", postID)
                                                    .InColumnValue("name", name)
                                                    .InColumnValue("size", size)
                                                    .InColumnValue("download_count", 0)
                                                    .InColumnValue("content_type", (int)contentType)
                                                    .InColumnValue("mime_content_type", mimeContentType)
                                                    .InColumnValue("create_date", DateTime.UtcNow)
                                                    .InColumnValue("path", path)
                                                    .Identity(0, 0, true));
        }
Exemple #3
0
        /// <summary>
        /// Метод подписания вложений подписью органа власти
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="certificate"></param>
        /// <returns></returns>
        private XmlDocument SignAttachmentsOv(XmlDocument doc, IntPtr certificate)
        {
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);

            string prefix = FindPrefix(doc.DocumentElement, true);

            nsmgr.AddNamespace(prefix, NamespaceUri.Smev3TypesBasic);

            log.LogDebug($"Пытаемся найти тэг заголовка вложений.");
            string     findHeaderString     = string.Format("//{0}:AttachmentHeaderList", prefix);
            XmlElement attachmentHeaderList = doc.SelectSingleNode(findHeaderString, nsmgr) as XmlElement;

            log.LogDebug($"Пытаемся найти тэг с контентом вложений.");
            string     findContentString     = string.Format("//{0}:AttachmentContentList", prefix);
            XmlElement attachmentContentList = doc.SelectSingleNode(findContentString, nsmgr) as XmlElement;

            if (attachmentHeaderList != null && attachmentContentList != null)
            {
                log.LogDebug("Список заголовков и контента с вложениями был успешно получен.");

                bool changed = false;
                AttachmentHeaderList headerList = null;

                try
                {
                    log.LogDebug("Пытаемся получить объект AttachmentHeaderList.");
                    headerList = DeserializeXml <AttachmentHeaderList>(attachmentHeaderList, NamespaceUri.Smev3TypesBasic);
                    log.LogDebug("Объект AttachmentHeaderList успешно получен.");
                }
                catch (Exception ex)
                {
                    throw new Exception($"Ошибка при получении объекта AttachmentHeaderList. {ex.Message}.");
                }

                // Если нет информации о вложениях
                if (headerList == null || headerList.AttachmentHeader == null || headerList.AttachmentHeader.Length <= 0)
                {
                    log.LogDebug("Вложения для подписи не найдены.");
                    return(doc);
                }

                // Проверим есть ли вложения для которых необходима подпись
                log.LogDebug("Проверим есть ли вложения для которых необходима подпись.");

                var needSigned = false;
                foreach (var header in headerList.AttachmentHeader)
                {
                    if (header.SignaturePKCS7 == null || header.SignaturePKCS7.Length <= 0)
                    {
                        log.LogDebug($"Вложение {header.contentId} нуждается в подписи.");
                        needSigned = true;
                        break;
                    }
                }

                // Если все вложения уже подписаны, выходим
                if (!needSigned)
                {
                    log.LogDebug("Все вложения являются подписанными.");
                    return(doc);
                }

                // Пытаемся получить список контента вложений. Обрабатывает только вложения указанные в XML в виде base64 строки, для случаев с
                // расположением вложения на FTP или в случае если данный XML является частью МТОМ запроса предполагается что вложения были подписаны отдельно, заранее
                AttachmentContentList contentList = null;

                try
                {
                    contentList = DeserializeXml <AttachmentContentList>(attachmentContentList, NamespaceUri.Smev3TypesBasic);
                }
                catch (Exception ex)
                {
                    throw new Exception($"Ошибка при десериализации контента вложений. " +
                                        $"Убедитесь, что для вложений, которые находятся на FTP, или будут расположены в МТОМ запросе подпись была получена отдельно. " +
                                        $"Содержимое ошибки {ex.Message}.");
                }

                if (contentList != null && contentList.AttachmentContent != null && contentList.AttachmentContent.Length > 0)
                {
                    foreach (AttachmentHeaderType header in headerList.AttachmentHeader)
                    {
                        if (header.SignaturePKCS7 == null || header.SignaturePKCS7.Length == 0)
                        {
                            log.LogDebug($"В заголовке вложения отсутствует подпись. Пытаемся подписать.");
                            AttachmentContentType content = contentList.AttachmentContent.FirstOrDefault(cnt => cnt.Id == header.contentId);

                            if (content != null && content.Content != null && content.Content.Length > 0)
                            {
                                byte[] signature = null;

                                try
                                {
                                    if (SignServiceUtils.IsUnix)
                                    {
                                        log.LogDebug($"Выполняем подпись под Unix платформой.");
                                        signature = SignServiceUnix.Sign(content.Content, certificate);
                                    }
                                    else
                                    {
                                        log.LogDebug($"Выполняем подпись под Windows платформой.");
                                        signature = SignServiceWin.Sign(content.Content, certificate);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    throw new Exception($"Ошибка при вычислении подписи для вложения. {ex.Message}.");
                                }

                                header.SignaturePKCS7 = signature;
                                changed = true;
                            }
                        }
                    }

                    if (changed)
                    {
                        string prefixForSerialize = FindPrefix(doc.DocumentElement, false);

                        try
                        {
                            log.LogDebug($"Пытаемся обновить список вложений.");

                            XmlElement attachmentHeaderListNew = this.SerializeToXmlElement(headerList, NamespaceUri.Smev3TypesBasic, prefixForSerialize);
                            attachmentHeaderListNew = doc.ImportNode(attachmentHeaderListNew, true) as XmlElement;
                            attachmentHeaderList.ParentNode.ReplaceChild(attachmentHeaderListNew, attachmentHeaderList);

                            log.LogDebug("Список вложений успешно обновлен.");
                        }
                        catch (Exception ex)
                        {
                            throw new Exception($"Ошибка при попытке обновить подписанные вложения. {ex.Message}.");
                        }
                    }
                }
            }

            return(doc);
        }
Exemple #4
0
        public ISMEV3Result SendRequest <T>(T requestData, IDictionary <string, byte[]> attachments)
        {
            var result = new SMEV3Result {
                MessageId = GuidGenerator.GenerateTimeBasedGuid().ToString()
            };

            try
            {
                var senderRequestData = new SenderProvidedRequestData();
                senderRequestData.Id                 = "SIGNED_BY_CONSUMER";
                senderRequestData.MessageID          = result.MessageId;
                senderRequestData.ReferenceMessageID = senderRequestData.MessageID;

                if (testmessage)
                {
                    senderRequestData.TestMessage = new Smev3Service.Void();
                }

                senderRequestData.MessagePrimaryContent = SerializeDetails <T>(requestData);

                AttachmentContentType[] contentList = null;
                if (attachments != null && attachments.Count > 0)
                {
                    // передача будет через MTOM
                    if (attachments.Sum(o => o.Value.Length) < 5242880)
                    {
                        var attachementHeaders  = new List <AttachmentHeaderType>();
                        var attachementContents = new List <AttachmentContentType>();

                        foreach (var attachment in attachments)
                        {
                            var attachementHeader = new AttachmentHeaderType
                            {
                                contentId      = attachment.Key,
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignature(attachment.Value)
                            };
                            var attachementContent = new AttachmentContentType
                            {
                                Id      = attachment.Key,
                                Content = attachment.Value
                            };
                            attachementHeaders.Add(attachementHeader);
                            attachementContents.Add(attachementContent);
                        }
                        senderRequestData.AttachmentHeaderList = attachementHeaders.ToArray();
                        contentList = attachementContents.ToArray();
                    }
                    else                     // Передача через FTP
                    {
                        var refAttachements = new List <RefAttachmentHeaderType>();
                        foreach (var attachment in attachments)
                        {
                            var uuid = GuidGenerator.GenerateTimeBasedGuid().ToString();

                            FtpUpLoad(uuid, attachment.Key, attachment.Value);

                            var hash = SignedPkcs7.ComputeDigest(attachment.Value);

                            var refAttachement = new RefAttachmentHeaderType
                            {
                                uuid           = uuid,
                                Hash           = Convert.ToBase64String(hash),
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignatureDigest(hash)
                            };
                            refAttachements.Add(refAttachement);
                        }
                        senderRequestData.RefAttachmentHeaderList = refAttachements.ToArray();
                    }
                }

                var request  = new SendRequest(senderRequestData, null, null);
                var smevSign = SerializeWithSign(request, "SIGNED_BY_CONSUMER");
                request.CallerInformationSystemSignature = smevSign;
                request.AttachmentContentList            = contentList;

                var response = smev.SendRequest(request);
                result.SoapRequest  = behavior.SoapRequest;
                result.SoapResponse = behavior.SoapResponse;
                if (!response.MessageMetadata.StatusSpecified)
                {
                    result.Status = SMEV3ResultStatus.OK;
                    return(result);
                }

                var status = response.MessageMetadata.Status;
                if (status == InteractionStatusType.requestIsQueued ||
                    status == InteractionStatusType.requestIsAcceptedBySmev ||
                    status == InteractionStatusType.underProcessing)
                {
                    result.Status = SMEV3ResultStatus.OK;
                }
                else
                {
                    result.Status    = SMEV3ResultStatus.Fail;
                    result.ErrorText = "Статус сообщения, обработка которого не была предусмотрена";
                }
            }
            catch (FaultException e)
            {
                result.SoapRequest  = behavior.SoapRequest;
                result.SoapResponse = behavior.SoapResponse;
                result.Status       = SMEV3ResultStatus.Fail;
                result.ErrorText    = e.Message;
            }
            catch (Exception e)
            {
                result.Status    = SMEV3ResultStatus.Error;
                result.ErrorText = "";
                while (e != null)
                {
                    result.ErrorText += e.Message + "\n";
                    result.ErrorText += e.StackTrace + "\n\n";
                    e = e.InnerException;
                }
            }

            return(result);
        }
Exemple #5
0
        /// <summary>
        ///  Отправить ответ
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="responseTo">Адрес доставки ответа, подставляется в /To, берется из запроса потребителя /ReplyTo</param>
        /// <param name="responseData"></param>
        /// <param name="attachments"></param>
        /// <returns></returns>
        public ISMEV3Result SendResponse <T>(string responseTo, T responseData, IDictionary <string, byte[]> attachments)
        {
            var result = new SMEV3Result {
                MessageId = GuidGenerator.GenerateTimeBasedGuid().ToString()
            };

            try
            {
                var senderResponseData = new SenderProvidedResponseData();
                senderResponseData.Id        = "SIGNED_BY_PROVIDER";
                senderResponseData.MessageID = result.MessageId;
                senderResponseData.To        = responseTo;

                senderResponseData.MessagePrimaryContent = SerializeDetails <T>(responseData);

                AttachmentContentType[] contentList = null;
                if (attachments != null && attachments.Count > 0)
                {
                    // передача будет через MTOM
                    if (attachments.Sum(o => o.Value.Length) < 5242880)
                    {
                        var attachementHeaders  = new List <AttachmentHeaderType>();
                        var attachementContents = new List <AttachmentContentType>();

                        foreach (var attachment in attachments)
                        {
                            var attachementHeader = new AttachmentHeaderType
                            {
                                contentId      = attachment.Key,
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignature(attachment.Value)
                            };
                            var attachementContent = new AttachmentContentType
                            {
                                Id      = attachment.Key,
                                Content = attachment.Value
                            };
                            attachementHeaders.Add(attachementHeader);
                            attachementContents.Add(attachementContent);
                        }
                        contentList = attachementContents.ToArray();
                        senderResponseData.AttachmentHeaderList = attachementHeaders.ToArray();
                    }
                    else                     // Передача через FTP
                    {
                        var refattachements = new List <RefAttachmentHeaderType>();
                        foreach (var attachment in attachments)
                        {
                            var uuid = GuidGenerator.GenerateTimeBasedGuid().ToString();

                            FtpUpLoad(uuid, attachment.Key, attachment.Value);

                            var hash = SignedPkcs7.ComputeDigest(attachment.Value);

                            var refAttachement = new RefAttachmentHeaderType
                            {
                                uuid           = uuid,
                                Hash           = Convert.ToBase64String(hash),
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignatureDigest(hash)
                            };
                            refattachements.Add(refAttachement);
                        }
                        senderResponseData.RefAttachmentHeaderList = refattachements.ToArray();
                    }
                }

                var request  = new SendResponse(senderResponseData, null, null);
                var smevSign = SerializeWithSign(request, "SIGNED_BY_PROVIDER");
                request.CallerInformationSystemSignature = smevSign;
                request.AttachmentContentList            = contentList;

                var response = smev.SendResponse(request);
                result.SoapRequest  = behavior.SoapRequest;
                result.SoapResponse = behavior.SoapResponse;
                result.Status       = SMEV3ResultStatus.OK;
            }
            catch (FaultException e)
            {
                result.SoapRequest  = behavior.SoapRequest;
                result.SoapResponse = behavior.SoapResponse;
                result.Status       = SMEV3ResultStatus.Fail;
                result.ErrorText    = e.Message;
            }
            catch (Exception e)
            {
                result.Status     = SMEV3ResultStatus.Error;
                result.ErrorText  = e.Message;
                result.ErrorText += "\n" + e.StackTrace;
            }

            return(result);
        }