bool ZipEncrypt::zipDecrypt(std::string file, std::string password, bool delTemps, bool original) { bool result = false; boost::filesystem::path encryptedFile(file); if(boost::filesystem::exists(encryptedFile)){ std::string zippedDir = boost::algorithm::replace_last_copy(file, encryptedExtension, ""); bool success = encryption.decrypt(file, zippedDir, password); boost::filesystem::path zipPath(zippedDir); if(success && boost::filesystem::exists(zipPath)){ result = Zip::unzip(zippedDir, zipPath.parent_path().string()); } if(result && delTemps){ boost::filesystem::path dirZip(zippedDir); boost::filesystem::remove(dirZip); } if(result && original){ boost::filesystem::remove(encryptedFile); } return result; } return false; }
void MyView::startFolderEncode(TQStringList selec,TQStringList encryptOptions,bool ,bool symetric) { TQString extension; if (compressionScheme==0) extension=".zip"; else if (compressionScheme==1) extension=".tar.gz"; else extension=".tar.bz2"; if (encryptOptions.find("armor")!=encryptOptions.end () ) extension+=".asc"; else if (KGpgSettings::pgpExtension()) extension+=".pgp"; else extension+=".gpg"; KURL encryptedFile(droppedUrls.first().path()+extension); TQFile encryptedFolder(droppedUrls.first().path()+extension); if (encryptedFolder.exists()) { dialogue->hide(); TDEIO::RenameDlg *over=new TDEIO::RenameDlg(0,i18n("File Already Exists"),TQString(),encryptedFile.path(),TDEIO::M_OVERWRITE); if (over->exec()==TQDialog::Rejected) { delete over; return; } encryptedFile=over->newDestURL(); delete over; dialogue->show(); /////// strange, but if dialogue is hidden, the passive popup is not displayed... } pop = new KPassivePopup(); pop->setView(i18n("Processing folder compression and encryption"),i18n("Please wait..."),TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop)); pop->setAutoDelete(false); pop->show(); kapp->processEvents(); dialogue->slotAccept(); dialogue=0L; KArchive *arch; if (compressionScheme==0) arch=new KZip(kgpgfoldertmp->name()); else if (compressionScheme==1) arch=new KTar(kgpgfoldertmp->name(), "application/x-gzip"); else arch=new KTar(kgpgfoldertmp->name(), "application/x-bzip2"); if (!arch->open( IO_WriteOnly )) { KMessageBox::sorry(0,i18n("Unable to create temporary file")); delete arch; return; } arch->addLocalDirectory (droppedUrls.first().path(),droppedUrls.first().fileName()); arch->close(); delete arch; KgpgInterface *folderprocess=new KgpgInterface(); folderprocess->KgpgEncryptFile(selec,KURL(kgpgfoldertmp->name()),encryptedFile,encryptOptions,symetric); connect(folderprocess,TQT_SIGNAL(encryptionfinished(KURL)),TQT_TQOBJECT(this),TQT_SLOT(slotFolderFinished(KURL))); connect(folderprocess,TQT_SIGNAL(errormessage(TQString)),TQT_TQOBJECT(this),TQT_SLOT(slotFolderFinishedError(TQString))); }
bool EncryptedStore::openRead(const QString& name) { Q_D(KOdfStore); if (bad()) return false; const KArchiveEntry* fileArchiveEntry = m_pZip->directory()->entry(name); if (!fileArchiveEntry) { return false; } if (fileArchiveEntry->isDirectory()) { kWarning(30002) << name << " is a directory!"; return false; } const KZipFileEntry* fileZipEntry = static_cast<const KZipFileEntry*>(fileArchiveEntry); delete d->stream; d->stream = fileZipEntry->createDevice(); d->size = fileZipEntry->size(); if (m_encryptionData.contains(name)) { // This file is encrypted, do some decryption first if (m_bPasswordDeclined) { // The user has already declined to give a password // Open the file as empty d->stream->close(); delete d->stream; d->stream = new QBuffer(); d->stream->open(QIODevice::ReadOnly); d->size = 0; return true; } QCA::SecureArray encryptedFile(d->stream->readAll()); if (encryptedFile.size() != d->size) { // Read error detected d->stream->close(); delete d->stream; d->stream = NULL; kWarning(30002) << "read error"; return false; } d->stream->close(); delete d->stream; d->stream = NULL; KoEncryptedStore_EncryptionData encData = m_encryptionData.value(name); QCA::SecureArray decrypted; // If we don't have a password yet, try and find one if (m_password.isEmpty()) { findPasswordInKWallet(); } while (true) { QByteArray pass; QCA::SecureArray password; bool keepPass = false; // I already have a password! Let's test it. If it's not good, we can dump it, anyway. if (!m_password.isEmpty()) { password = m_password; m_password = QCA::SecureArray(); } else { if (!m_filename.isNull()) keepPass = false; QPointer<KPasswordDialog> dlg = new KPasswordDialog(d->window , keepPass ? KPasswordDialog::ShowKeepPassword : static_cast<KPasswordDialog::KPasswordDialogFlags>(0)); dlg->setPrompt(i18n("Please enter the password to open this file.")); if (! dlg->exec()) { m_bPasswordDeclined = true; d->stream = new QBuffer(); d->stream->open(QIODevice::ReadOnly); d->size = 0; delete dlg; return true; } if (dlg) { password = QCA::SecureArray(dlg->password().toUtf8()); if (keepPass) keepPass = dlg->keepPassword(); if (password.isEmpty()) { delete dlg; continue; } } delete dlg; } decrypted = decryptFile(encryptedFile, encData, password); if (decrypted.isEmpty()) { kError(30002) << "empty decrypted file" << endl; return false; } if (!encData.checksum.isEmpty()) { QCA::SecureArray checksum; if (encData.checksumShort && decrypted.size() > 1024) { // TODO: Eww!!!! I don't want to convert via insecure arrays to get the first 1K characters of a secure array <- fix QCA? checksum = QCA::Hash("sha1").hash(QCA::SecureArray(decrypted.toByteArray().left(1024))); } else { checksum = QCA::Hash("sha1").hash(decrypted); } if (checksum != encData.checksum) { continue; } } // The password passed all possible tests, so let's accept it m_password = password; m_bPasswordUsed = true; if (keepPass) { savePasswordInKWallet(); } break; } QByteArray *resultArray = new QByteArray(decrypted.toByteArray()); QIODevice *resultDevice = KFilterDev::device(new QBuffer(resultArray, NULL), "application/x-gzip"); if (!resultDevice) { delete resultArray; return false; } static_cast<KFilterDev*>(resultDevice)->setSkipHeaders(); d->stream = resultDevice; d->size = encData.filesize; } d->stream->open(QIODevice::ReadOnly); return true; }