summaryrefslogtreecommitdiffstats
path: root/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2019-06-10 15:00:20 +0900
committerMichele Calgaro <[email protected]>2020-10-17 10:48:27 +0800
commit3676cf129d85151dd430633847e3c289327405d5 (patch)
tree5ef29a2767f54ad7b642a75355bff277e47c9449 /tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp
parent11beb5658031277ef94a1506a6668ff32b1ea111 (diff)
downloadtdebase-3676cf129d85151dd430633847e3c289327405d5.tar.gz
tdebase-3676cf129d85151dd430633847e3c289327405d5.zip
tdeioslave media: added initial support for unlocking/locking of encrypted devices.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp')
-rw-r--r--tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp189
1 files changed, 106 insertions, 83 deletions
diff --git a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp
index 65b53a0f4..f02c93c84 100644
--- a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp
+++ b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp
@@ -45,16 +45,16 @@ const Medium MountHelper::findMedium(const KURL &url)
DCOPRef mediamanager("kded", "mediamanager");
// Try filename first
- DCOPReply reply = mediamanager.call( "properties", url.fileName() );
- if ( !reply.isValid() ) {
+ DCOPReply reply = mediamanager.call("properties", url.fileName());
+ if (!reply.isValid()) {
m_errorStr = i18n("The TDE mediamanager is not running.")+"\n";
return Medium(TQString::null, TQString::null, TQString::null);
}
const Medium& medium = Medium::create(reply);
- if ( medium.id().isEmpty() ) {
+ if (medium.id().isEmpty()) {
// Try full URL now
- reply = mediamanager.call( "properties", url.prettyURL() );
- if ( !reply.isValid() ) {
+ reply = mediamanager.call("properties", url.prettyURL());
+ if (!reply.isValid()) {
m_errorStr = i18n("Internal Error");
return Medium(TQString::null, TQString::null, TQString::null);
}
@@ -72,20 +72,19 @@ MountHelper::MountHelper() : TDEApplication()
KURL url(args->url(0));
const Medium medium = findMedium(url);
-
if (medium.id().isEmpty())
{
if (m_errorStr.isEmpty()) {
m_errorStr+= i18n("%1 cannot be found.").arg(url.prettyURL());
}
- TQTimer::singleShot(0, this, TQT_SLOT(error()) );
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
return;
}
if (!medium.isMountable() && !args->isSet("e") && !args->isSet("s"))
{
m_errorStr = i18n("%1 is not a mountable media.").arg(url.prettyURL());
- TQTimer::singleShot(0, this, TQT_SLOT(error()) );
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
return;
}
@@ -94,12 +93,48 @@ MountHelper::MountHelper() : TDEApplication()
m_isCdrom = medium.mimeType().find("dvd") != -1 || medium.mimeType().find("cd") != -1;
- if (args->isSet("d"))
+ if (args->isSet("m"))
+ {
+ // Mount drive
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call("mount", medium.id());
+ TQStringVariantMap mountResult;
+ if (reply.isValid()) {
+ reply.get(mountResult);
+ }
+ if (mountResult.contains("result") && mountResult["result"].toBool()) {
+ ::exit(0);
+ }
+ else {
+ m_errorStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : i18n("Unknown mount error.");
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
+ }
+ }
+ else if (args->isSet("u"))
+ {
+ // Unmount drive
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call("unmount", medium.id());
+ TQStringVariantMap unmountResult;
+ if (reply.isValid()) {
+ reply.get(unmountResult);
+ }
+ if (unmountResult.contains("result") && unmountResult["result"].toBool()) {
+ ::exit(0);
+ }
+ else {
+ m_errorStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : i18n("Unknown unmount error.");
+ kdDebug() << "medium unmount " << m_errorStr << endl;
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
+ }
+ }
+ else if (args->isSet("k"))
{
+ // Unlock drive
if (!medium.isEncrypted())
{
m_errorStr = i18n("%1 is not an encrypted media.").arg(url.prettyURL());
- TQTimer::singleShot(0, this, TQT_SLOT(error()) );
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
return;
}
if (!medium.needDecryption())
@@ -115,34 +150,38 @@ MountHelper::MountHelper() : TDEApplication()
TQString mime = medium.mimeType();
iconName = KMimeType::mimeType(mime)->icon(mime, false);
}
-
m_mediumId = medium.id();
dialog = new Dialog(url.prettyURL(), iconName);
+ connect(dialog, TQT_SIGNAL(user1Clicked()), this, TQT_SLOT(slotSendPassword()));
+ connect(dialog, TQT_SIGNAL(cancelClicked()), this, TQT_SLOT(slotCancel()));
+ connect(this, TQT_SIGNAL(signalPasswordError(TQString)), dialog, TQT_SLOT(slotDialogError(TQString)));
dialog->show();
-
- connect(dialog, TQT_SIGNAL (user1Clicked()), this, TQT_SLOT (slotSendPassword()));
- connect(dialog, TQT_SIGNAL (cancelClicked()), this, TQT_SLOT (slotCancel()));
- connect(this, TQT_SIGNAL (signalPasswordError(TQString)), dialog, TQT_SLOT (slotDialogError(TQString)));
}
- else if (args->isSet("u"))
+ else if (args->isSet("l"))
{
- DCOPRef mediamanager("kded", "mediamanager");
- DCOPReply reply = mediamanager.call("unmount", medium.id());
- TQStringVariantMap unmountResult;
- if (reply.isValid()) {
- reply.get(unmountResult);
- }
- if (unmountResult.contains("result") && unmountResult["result"].toBool()) {
+ // Lock drive
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call("lock", medium.id());
+ TQStringVariantMap lockResult;
+ if (reply.isValid()) {
+ reply.get(lockResult);
+ }
+ if (lockResult.contains("result") && lockResult["result"].toBool()) {
::exit(0);
}
else {
- m_errorStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : i18n("Unknown unmount error.");
- kdDebug() << "medium unmount " << m_errorStr << endl;
- error();
- }
+ m_errorStr = lockResult.contains("errStr") ? lockResult["errStr"].toString() : i18n("Unknown lock error.");
+ kdDebug() << "medium lock " << m_errorStr << endl;
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
+ }
}
- else if (args->isSet("s") || args->isSet("e"))
+ else if (args->isSet("e"))
{
+ invokeEject(device, true);
+ }
+ else if (args->isSet("s"))
+ {
+ // Safely remove drive
DCOPRef mediamanager("kded", "mediamanager");
/*
@@ -157,11 +196,11 @@ MountHelper::MountHelper() : TDEApplication()
TQStringVariantMap unmountResult;
if (medium.isMounted())
{
- DCOPReply reply = mediamanager.call( "unmount", medium.id());
+ DCOPReply reply = mediamanager.call("unmount", medium.id());
if (reply.isValid()) {
reply.get(unmountResult);
- if (unmountResult["result"].toBool()) {
- reply.get(m_errorStr);
+ if (unmountResult.contains("result") && !unmountResult["result"].toBool()) {
+ m_errorStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : i18n("Unknown unmount error.");
}
}
}
@@ -170,38 +209,26 @@ MountHelper::MountHelper() : TDEApplication()
if (unmountResult.contains("result") && unmountResult["result"].toBool() &&
medium.isEncrypted() && !medium.clearDeviceUdi().isNull())
{
- DCOPReply reply = mediamanager.call( "undecrypt", medium.id());
+ DCOPReply reply = mediamanager.call("lock", medium.id());
if (reply.isValid()) {
- TQStringVariantMap undecryptResult;
- reply.get(undecryptResult);
- if (undecryptResult["result"].toBool()) {
- reply.get(m_errorStr);
+ TQStringVariantMap lockResult;
+ reply.get(lockResult);
+ if (lockResult.contains("result") && !lockResult["result"].toBool()) {
+ m_errorStr = lockResult.contains("errStr") ? lockResult["errStr"].toString() : i18n("Unknown lock error.");
}
}
}
- if (m_errorStr.isNull()) {
+ if (m_errorStr.isEmpty()) {
invokeEject(device, true);
}
else {
- error();
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
}
}
else
{
- DCOPRef mediamanager("kded", "mediamanager");
- DCOPReply reply = mediamanager.call("mount", medium.id());
- TQStringVariantMap mountResult;
- if (reply.isValid()) {
- reply.get(mountResult);
- }
- if (mountResult.contains("result") && mountResult["result"].toBool()) {
- ::exit(0);
- }
- else {
- m_errorStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : i18n("Unknown mount error.");
- error();
- }
+ TDECmdLineArgs::usage();
}
}
@@ -212,7 +239,7 @@ void MountHelper::invokeEject(const TQString &device, bool quiet)
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
TDEGenericDevice *hwdevice = hwdevices->findByDeviceNode(device);
if (hwdevice->type() == TDEGenericDeviceType::Disk) {
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(hwdevice);
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
if (sdevice->ejectDrive()) {
// Success!
::exit(0);
@@ -228,28 +255,21 @@ void MountHelper::invokeEject(const TQString &device, bool quiet)
*proc << "-q";
}
*proc << device;
- connect( proc, TQT_SIGNAL(processExited(TDEProcess *)),
- this, TQT_SLOT( ejectFinished(TDEProcess *) ) );
+ connect(proc, TQT_SIGNAL(processExited(TDEProcess*)), this, TQT_SLOT(ejectFinished(TDEProcess*)));
proc->start();
}
-void MountHelper::ejectFinished(TDEProcess* proc)
+void MountHelper::ejectFinished(TDEProcess *proc)
{
- /*
- * If eject failed, report the error stored in m_errorStr
- */
+ //If eject failed, report the error stored in m_errorStr
if (proc->normalExit() && proc->exitStatus() == 0) {
::exit(0);
- } else {
- if (m_errorStr.isEmpty()) {
- if (m_isCdrom)
- m_errorStr = i18n("The device was successfully unmounted, but the tray could not be opened");
- else
- m_errorStr = i18n("The device was successfully unmounted, but could not be ejected");
+ }
+ else {
+ if (!m_errorStr.isEmpty()) {
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
}
-//X Comment this because the error is useless as long as the unmount is successful.
-//X TQTimer::singleShot(0, this, TQT_SLOT(error()));
- ::exit(0);
+ ::exit(0);
}
}
@@ -269,19 +289,19 @@ void MountHelper::slotSendPassword()
{
DCOPRef mediamanager("kded", "mediamanager");
- DCOPReply reply = mediamanager.call( "decrypt", m_mediumId, dialog->getPassword() );
- TQStringVariantMap decryptResult;
+ DCOPReply reply = mediamanager.call("unlock", m_mediumId, dialog->getPassword());
+ TQStringVariantMap unlockResult;
if (reply.isValid()) {
- reply.get(decryptResult);
+ reply.get(unlockResult);
}
- if (decryptResult.contains("result") && decryptResult["result"].toBool()) {
+ if (unlockResult.contains("result") && unlockResult["result"].toBool()) {
::exit(0);
}
else {
- m_errorStr = decryptResult.contains("errStr") ? decryptResult["errStr"].toString() : i18n("Unknown decrypt error.");
- kdDebug() << "medium decrypt " << m_errorStr << endl;
+ m_errorStr = unlockResult.contains("errStr") ? unlockResult["errStr"].toString() : i18n("Unknown unlock error.");
+ kdDebug() << "medium unlock " << m_errorStr << endl;
emit signalPasswordError(m_errorStr);
- error();
+ TQTimer::singleShot(0, this, TQT_SLOT(error()));
}
}
@@ -292,12 +312,13 @@ void MountHelper::slotCancel()
static TDECmdLineOptions options[] =
{
- { "d", I18N_NOOP("Decrypt given URL"), 0 },
+ { "m", I18N_NOOP("Mount given URL"), 0 },
{ "u", I18N_NOOP("Unmount given URL"), 0 },
- { "m", I18N_NOOP("Mount given URL (default)"), 0 },
- { "e", I18N_NOOP("Eject given URL via tdeeject"), 0},
- { "s", I18N_NOOP("Unmount and Eject given URL (necessary for some USB devices)"), 0},
- {"!+URL", I18N_NOOP("media:/ URL to mount/unmount/eject/remove"), 0 },
+ { "k", I18N_NOOP("Unlock given URL"), 0 },
+ { "l", I18N_NOOP("Lock given URL"), 0 },
+ { "e", I18N_NOOP("Eject given URL"), 0},
+ { "s", I18N_NOOP("Safely remove (unmount and eject) given URL"), 0},
+ {"!+URL", I18N_NOOP("media:/URL to mount/unmount/unlock/lock/eject/remove"), 0 },
TDECmdLineLastOption
};
@@ -308,13 +329,15 @@ int main(int argc, char **argv)
"tdeio_media_mounthelper", "tdeio_media_mounthelper",
"0.1");
- TDECmdLineArgs::addCmdLineOptions( options );
+ TDECmdLineArgs::addCmdLineOptions(options);
TDEGlobal::locale()->setMainCatalogue("tdeio_media");
TDEApplication::addCmdLineOptions();
+ if (TDECmdLineArgs::parsedArgs()->count()==0)
+ {
+ TDECmdLineArgs::usage();
+ }
- if (TDECmdLineArgs::parsedArgs()->count()==0) TDECmdLineArgs::usage();
- TDEApplication *app = new MountHelper();
-
+ TDEApplication *app = new MountHelper();
TDEStartupInfo::appStarted();
app->dcopClient()->attach();
return app->exec();