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)); }
/// <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); }
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); }
/// <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); }