PageRenderTime 124ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/inflow/ui/sendsigndocumentdialog.cpp

https://bitbucket.org/victorrbravo/inflow
C++ | 362 lines | 233 code | 72 blank | 57 comment | 35 complexity | 56caeb9e43b79488ae4ec3db361e06bf MD5 | raw file
  1. #include "sendsigndocumentdialog.h"
  2. #include "ui_sendsigndocumentdialog.h"
  3. #include "SafetYAWL.h"
  4. #include "SslCertificate.h"
  5. //#include "DigiDoc.h"
  6. #include "SafetDocument.h"
  7. #include <QDesktopServices>
  8. #include <QUrl>
  9. extern "C" {
  10. #include "libdotar.h"
  11. }
  12. // =======================================================================================================
  13. // =============FUNCIONES ZLIB (COMPRESION) ==========================================================================================
  14. // =======================================================================================================
  15. SendSignDocumentDialog::SendSignDocumentDialog(QWidget *parent) :
  16. QDialog(parent),
  17. ui(new Ui::SendSignDocumentDialog)
  18. {
  19. ui->setupUi(this);
  20. connect(ui->sendButton, SIGNAL(clicked()), this, SLOT(sendFiles()) );
  21. connect(ui->selectButton, SIGNAL(clicked()), this, SLOT(selectFiles()) );
  22. connect(ui->delButton, SIGNAL(clicked()), this, SLOT(delFiles()) );
  23. connect(ui->getContainerButton, SIGNAL(clicked()), this, SLOT(getContainerFiles()) );
  24. connect(ui->listFiles, SIGNAL(itemSelectionChanged()), this, SLOT(showFileInfo()) );
  25. }
  26. void SendSignDocumentDialog::compresstar(const QStringList& files, const QString& filename) {
  27. int argc = files.count()+5;
  28. char **argv = NULL;
  29. argv = new char*[argc];
  30. argv[0] = new char[20];
  31. strcpy(argv[0],"inflow");
  32. argv[1] = new char[20];
  33. strcpy(argv[1],"-C");
  34. argv[2] = new char[1024];
  35. strcpy(argv[2],"");
  36. argv[3] = new char[30];
  37. strcpy(argv[3],"-c");
  38. argv[4] = new char[150];
  39. strcpy(argv[4],qPrintable(filename));
  40. qDebug("...compresstar...(1)...files.count():%d", files.count());
  41. qDebug("...compresstar...(1)...:*%s*", qPrintable(filename));
  42. for (int i =0;i < files.count(); i++ ) {
  43. argv[5+i] = new char[1024];
  44. //strcpy(argv[5+i],qPrintable(files.at(i)));
  45. QString newfile = files.at(i);
  46. QString absfile = newfile.section("/",-1);
  47. strcpy(argv[5+i],qPrintable(absfile));
  48. strcpy(argv[2],qPrintable(newfile.section(absfile,0,0)));
  49. qDebug("...compresstar...(2)...:%s", qPrintable(absfile));
  50. qDebug("...compresstar...(2)...:%s", qPrintable(newfile.section(absfile,0,0)));
  51. }
  52. dotar(argc,argv);
  53. for(int i=0; i < argc; i++) {
  54. delete argv[i];
  55. }
  56. delete[] argv;
  57. }
  58. void SendSignDocumentDialog::sendFiles() {
  59. QStringList options;
  60. options.append(trUtf8("Enviar por correo-e"));
  61. options.append(trUtf8("Crear archivo comprimido .tar.gz"));
  62. bool ok;
  63. qDebug("...option..............");
  64. QString option = QInputDialog::getItem(this, tr("Seleccionar"),
  65. tr("Contenedor:"), options, 0, false, &ok);
  66. qDebug("...option:%s", qPrintable(option));
  67. if ( option.isEmpty()) {
  68. return;
  69. }
  70. if ( option == trUtf8("Enviar por correo-e") ) {
  71. QUrl url;
  72. url.setScheme( "mailto" );
  73. url.addQueryItem( "subject", trUtf8("Safet/Inflow: envío de archivos firmados formato XADES") );
  74. for( int i=0; i<ui->listFiles->count();i++){
  75. QListWidgetItem* item = ui->listFiles->item(i);
  76. QString filename = item->text();
  77. if ( QFile::exists(filename)) {
  78. url.addQueryItem( "attachment", filename );
  79. int row = ui->listFiles->row(item);
  80. ui->listFiles->takeItem(row);
  81. i--;
  82. }
  83. }
  84. QDesktopServices::openUrl( url );
  85. }
  86. else /* Archivo comprimido */ {
  87. qDebug(".......archivo comprimido.........");
  88. QStringList files;
  89. for( int i=0; i<ui->listFiles->count();i++){
  90. QListWidgetItem* item = ui->listFiles->item(i);
  91. QString filename = item->text();
  92. if ( QFile::exists(filename)) {
  93. files.append(filename);
  94. int row = ui->listFiles->row(item);
  95. ui->listFiles->takeItem(row);
  96. i--;
  97. }
  98. }
  99. QString types = tr("Archivos Comprimidos TAR(*.tar);;Todos (*)");
  100. QString fileName = QFileDialog::getSaveFileName(this,
  101. tr("Seleccione un directorio y un nombre de archivo"),
  102. QDir::homePath()+"/datosfirmados.tar",
  103. types);
  104. SendSignDocumentDialog::compresstar(files,fileName);
  105. }
  106. if ( ui->listFiles->count() == 0 ) {
  107. ui->sendButton->setEnabled(false);
  108. }
  109. }
  110. void SendSignDocumentDialog::delFiles() {
  111. QList<QListWidgetItem *> curitems = ui->listFiles->selectedItems();
  112. int result = QMessageBox::question(this, trUtf8("Eliminar archivos(s)"),
  113. trUtf8("¿Realmente desea eliminar el(los) elemento(s) seleccionado(s)?"),
  114. QMessageBox::Yes | QMessageBox::No);
  115. if ( result == QMessageBox::Yes ) {
  116. foreach(QListWidgetItem* item, curitems) {
  117. qDebug("removeitem...");
  118. int row = ui->listFiles->row(item);
  119. ui->listFiles->takeItem(row);
  120. }
  121. }
  122. if ( ui->listFiles->count() > 0 ) {
  123. ui->sendButton->setEnabled(true);
  124. ui->delButton->setEnabled(true);
  125. }
  126. else {
  127. ui->sendButton->setEnabled(false);
  128. ui->delButton->setEnabled(false);
  129. }
  130. }
  131. void SendSignDocumentDialog::selectFiles() {
  132. QStringList files;
  133. QString types = tr("Archivos Firmados XADES (*.ddoc);;Todos (*)");
  134. QString curdir = QDir::homePath()+ "/" + Safet::datadir;
  135. files = QFileDialog::getOpenFileNames(this,tr("Seleccione archivo(s) firmados XADES a incluir"),
  136. curdir,types);
  137. if (files.count() > 0 ) {
  138. foreach(QString f, files ) {
  139. if ( !searchInListNameFile(f)) {
  140. ui->listFiles->addItem(f);
  141. }
  142. }
  143. ui->sendButton->setEnabled(true);
  144. ui->delButton->setEnabled(true);
  145. }
  146. else {
  147. ui->sendButton->setEnabled(false);
  148. ui->delButton->setEnabled(false);
  149. }
  150. }
  151. bool SendSignDocumentDialog::searchInListNameFile(const QString& n) {
  152. for( int i=0; i<ui->listFiles->count();i++){
  153. QListWidgetItem* item = ui->listFiles->item(i);
  154. if (item->text() == n ) return true;
  155. }
  156. return false;
  157. }
  158. void SendSignDocumentDialog::getContainerFiles() {
  159. QStringList containers;
  160. QString targetdir = SafetYAWL::getConf()["XmlRepository/path"];
  161. qDebug("...Directorio destino: %s",qPrintable(targetdir));
  162. QDir dir(targetdir);
  163. dir.setFilter(QDir::Dirs | QDir::NoSymLinks);
  164. dir.setSorting(QDir::Size | QDir::Reversed);
  165. QFileInfoList list = dir.entryInfoList();
  166. qDebug(" Contenedores ");
  167. for (int i = 0; i < list.size(); ++i) {
  168. QFileInfo fileInfo = list.at(i);
  169. QString namedir = fileInfo.fileName();
  170. if ( !namedir.startsWith(".")) {
  171. qDebug("Directorio: %s",qPrintable(QString("%1").arg(namedir)));
  172. containers.append(namedir);
  173. }
  174. }
  175. bool ok;
  176. QString curcontainer = QInputDialog::getItem(this, tr("Seleccionar"),
  177. tr("Contenedor:"), containers, 0, false, &ok);
  178. if (!ok || curcontainer.isEmpty()) {
  179. return;
  180. }
  181. // agregar a la lista los archivos del contenedor
  182. QDir containerdir(targetdir+ "/" + curcontainer);
  183. containerdir.setFilter(QDir::Files | QDir::NoSymLinks);
  184. containerdir.setSorting(QDir::Size | QDir::Reversed);
  185. QFileInfoList fileslist = containerdir.entryInfoList();
  186. qDebug(" archivos... ");
  187. for (int i = 0; i < fileslist.size(); ++i) {
  188. QFileInfo fileInfo = fileslist.at(i);
  189. QString namedir = fileInfo.absoluteFilePath();
  190. if ( !namedir.startsWith(".") && !searchInListNameFile(namedir)) {
  191. ui->listFiles->addItem(namedir);
  192. }
  193. }
  194. }
  195. /*
  196. void SendSignDocumentDialog::showFileInfo() {
  197. QListWidgetItem* item;
  198. DigiDoc *myfile;
  199. if ( ui->listFiles->selectedItems().count() > 0 ) {
  200. item = ui->listFiles->selectedItems().at(0);
  201. QString filename = item->text();
  202. qDebug("...showFileInfo: %s", qPrintable(filename));
  203. myfile = new DigiDoc(this);
  204. if ( QFile::exists(filename)) {
  205. myfile->open( filename ) ;
  206. QString textinfo;
  207. for (int i = 0; i < myfile->signatures().count();i++) {
  208. DigiDocSignature signature = myfile->signatures().at(i);
  209. const SslCertificate c = signature.cert();
  210. textinfo += trUtf8("Firmado por: <b>\"%1\"</b><br/>")
  211. .arg(c.subjectInfoUtf8( QSslCertificate::CommonName ));
  212. textinfo += tr("Emitido por: <b>\"%1\"</b>").arg(c.issuerInfo( QSslCertificate::CommonName ));
  213. if ( i+1 < myfile->signatures().count() ) {
  214. textinfo += tr("<br/><br/>");
  215. }
  216. }
  217. ui->labelDididocInfo->setText(textinfo);
  218. }
  219. else {
  220. ui->labelDididocInfo->setText(trUtf8("No contiene firmas electrónicas: \"%1\"")
  221. .arg(filename));
  222. }
  223. delete myfile;
  224. }
  225. }
  226. */
  227. void SendSignDocumentDialog::showFileInfo() {
  228. QListWidgetItem* item;
  229. //DigiDoc *myfile;
  230. SafetDocument doc;
  231. doc.initializeLibdigidoc();
  232. QString libdigidocConfigFile = SafetYAWL::getConfFile().getValue("Libdigidoc", "libdigidoc.configfilepath").toString();
  233. libdigidocConfigFile = QDir::homePath() + "/" + Safet::datadir + "/" + "digidoc.conf";
  234. doc.initDigidocConfigStore(libdigidocConfigFile);
  235. if ( ui->listFiles->selectedItems().count() > 0 ) {
  236. item = ui->listFiles->selectedItems().at(0);
  237. QString filename = item->text();
  238. qDebug("...showFileInfo: %s", qPrintable(filename));
  239. //myfile = new DigiDoc(this);
  240. if ( QFile::exists(filename)) {
  241. //myfile->open( filename ) ;
  242. // abrir archivo digidoc
  243. doc.readDigiDocFile(filename);
  244. QString textinfo;
  245. //for (int i = 0; i < myfile->signatures().count();i++) {
  246. for (int i = 0; i < doc.numberOfSignaturesOnOpenXAdESContainer();i++) {
  247. //DigiDocSignature signature = myfile->signatures().at(i);
  248. //const SslCertificate c = signature.cert();
  249. textinfo += trUtf8("Firmado por: <b>\"%1\"</b><br/>")
  250. // .arg(c.subjectInfoUtf8( QSslCertificate::CommonName ));
  251. .arg(doc.getCN(i));
  252. //textinfo += tr("Emitido por: <b>\"%1\"</b>").arg(c.issuerInfo( QSslCertificate::CommonName ));
  253. textinfo += tr("Emitido por: <b>\"%1\"</b>").arg(doc.getSignerCertificateIssuerName(i));
  254. //if ( i+1 < myfile->signatures().count() ) {
  255. if ( i+1 < doc.numberOfSignaturesOnOpenXAdESContainer() ) {
  256. textinfo += tr("<br/><br/>");
  257. }
  258. }
  259. ui->labelDididocInfo->setText(textinfo);
  260. }
  261. else {
  262. ui->labelDididocInfo->setText(trUtf8("No contiene firmas electrónicas: \"%1\"")
  263. .arg(filename));
  264. }
  265. //delete myfile;
  266. }
  267. }
  268. SendSignDocumentDialog::~SendSignDocumentDialog()
  269. {
  270. delete ui;
  271. }
  272. void SendSignDocumentDialog::changeEvent(QEvent *e)
  273. {
  274. QDialog::changeEvent(e);
  275. switch (e->type()) {
  276. case QEvent::LanguageChange:
  277. ui->retranslateUi(this);
  278. break;
  279. default:
  280. break;
  281. }
  282. }