Example #1
0
        /*
         * Сценарий обработки:
         *   клиент -> /sign
         *   бот <- "введите текст для подписи"  [флаг = ожидаю текст]
         *   клиент -> {текст}
         *   бот <- "защифрованное сообщение"    [флаг = текст принял]
         *
         *
         */
        public async Task ExecuteAsync(CommandArgs args)
        {
            //обработка флагов состояний
            if (args.CommandText == string.Empty)
            {
                signStateFlag[args.FromId] = SignState.SendCommand;
                Logger.Information($"Received command /sign from user {args.FromName}");
            }
            else if (signStateFlag.TryGetValue(args.FromId, out var state))
            {
                if (state == SignState.WaitText)
                {
                    signStateFlag[args.FromId] = SignState.SendText;
                    Logger.Information($"Received text for sign from user {args.FromName}");
                }
            }
            else
            {
                await Bot.SendTextMessageAsync(args.ChatId, $"Неизвестная команда.{Environment.NewLine}Для справки используй /help");

                return;
            }


            switch (signStateFlag[args.FromId])
            {
            //прислали /sign
            case SignState.SendCommand:
                await Bot.SendTextMessageAsync(args.ChatId, $"Введи строку для генерации подписи");

                Logger.Information($"Send to {args.FromName} message to WaitText");
                signStateFlag[args.FromId] = SignState.WaitText;
                break;

            //прислали строку для подписи
            case SignState.SendText:
                //await Bot.SendTextMessageAsync(args.ChatId, args.CommandText.GetHashCode().ToString());
                await Bot.SendTextMessageAsync(args.ChatId, SignHash.CkassaMD5(args.CommandText.ToString()));

                Logger.Information($"Send to {args.FromName} sign text");
                signStateFlag.Remove(args.FromId);
                break;
            }
        }
        public ActionResult SignFile(HttpPostedFileBase file)
        {
            if (file == null)
            {
                return(RedirectToAction("Index", new { mesg = $"Chọn tệp cần ký để tiếp tục" }));
            }

            var accessToken = Session["access_token"] as string;

            if (string.IsNullOrEmpty(accessToken))
            {
                return(RedirectToAction("Index", new { mesg = $"Get access_token để tiếp tục" }));
            }

            #region Bước 1: Lấy danh sách chữ ký số trên hệ thống VNPT Ký số
            var userCert = _getAccoutCert(accessToken);
            if (userCert == null)
            {
                return(RedirectToAction("Index", new { mesg = $"Lỗi: {GetLastError()}" }));
            }

            // TODO: Bổ sung chức năng chọn chữ ký số cho người dùng
            string certID = userCert.ID;
            #endregion

            #region Bước 2: Lấy thông tin thanh toán giao dịch
            var servicePack = _getAccoutServicePack(accessToken);
            if (servicePack == null)
            {
                return(RedirectToAction("Index", new { mesg = $"Lỗi: {GetLastError()}" }));
            }
            string servicePackID = servicePack.ID;
            #endregion

            #region Đọc dữ liệu cần ký file upload
            Filetype fileType = null;
            byte[]   unsignData;
            string   signedFile = "";
            using (Stream inputStream = file.InputStream)
            {
                try
                {
                    if (!(inputStream is MemoryStream memoryStream))
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    unsignData = memoryStream.ToArray();

                    fileType = GetFileType(unsignData, file);
                    if (fileType == null)
                    {
                        return(RedirectToAction("Index", new { mesg = "Định dạng chưa được hỗ trợ" }));
                    }
                    signedFile = file.FileName.Replace($".{fileType.Extension}", $"_signed.{fileType.Extension}");
                }
                catch (Exception ex)
                {
                    return(RedirectToAction("Index", new { mesg = $"Không thể phân tích dữ liệu cần ký: {ex.Message}" }));
                }
            }
            #endregion

            #region Bước 4: Ký dữ liệu
            byte[] signedBytes = null;
            switch (fileType.Extension)
            {
            case "pdf":
                signedBytes = SignHash.SignHashPdf(unsignData, servicePackID, certID,
                                                   _parseCert(userCert.CertBase64), accessToken);
                break;

            case "xml":
                signedBytes = SignHash.SignHashXml(unsignData, servicePackID, certID,
                                                   _parseCert(userCert.CertBase64), accessToken);
                break;

            case "docx":
            case "xlsx":
            case "pptx":
                signedBytes = SignHash.SignHashOffice(unsignData, servicePackID, certID,
                                                      _parseCert(userCert.CertBase64), accessToken);
                break;
            }
            if (signedBytes == null)
            {
                return(RedirectToAction("Index", new { mesg = $"Lỗi ký số: {GetLastError()}" }));
            }
            #endregion

            return(File(signedBytes, System.Net.Mime.MediaTypeNames.Application.Octet, signedFile));
        }