summaryrefslogtreecommitdiffstats
path: root/src/account_portal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/account_portal.cpp')
-rw-r--r--src/account_portal.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/account_portal.cpp b/src/account_portal.cpp
new file mode 100644
index 0000000..a20559b
--- /dev/null
+++ b/src/account_portal.cpp
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ XDG desktop portal implementation for TDE
+ Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com>
+
+ Avatar detection code is based on code from the Redmond KSplash theme
+ Copyright © 2001-2003 Brian Ledbetter 2001-2003 <brian@shadowcom.net>
+ Copyright © 2003 Ravikiran Rajagopal 2003 <ravi@kde.org>
+
+ This program or library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the License,
+ or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Improvements and feedback are welcome!
+*******************************************************************************/
+
+// TQt
+#include <tqfile.h>
+#include <tqhbox.h>
+#include <tqlabel.h>
+#include <tqdbusdata.h>
+
+// TDE
+#include <kstandarddirs.h>
+#include <ksimpleconfig.h>
+#include <tdelocale.h>
+#include <twin.h>
+#include <kuser.h>
+#include <kdebug.h>
+
+// Portal
+#include "permission_dialog.h"
+#include "account_portal.h"
+#include "account_portal.moc"
+
+#define TQSTRING_TO_DBUS_VARIANT(x) \
+ TQT_DBusData::fromString(x).getAsVariantData().toVariant()
+
+TDEAccountPortal::TDEAccountPortal(TQT_DBusConnection &connection)
+: m_connection(connection)
+{
+}
+
+TDEAccountPortal::~TDEAccountPortal()
+{
+}
+
+void TDEAccountPortal::handleMethodReply(const TQT_DBusMessage &reply)
+{
+ m_connection.send(reply);
+}
+
+bool TDEAccountPortal::handleSignalSend(const TQT_DBusMessage& reply) {
+ handleMethodReply(reply);
+ return true;
+}
+
+bool TDEAccountPortal::GetUserInformation(const TQT_DBusObjectPath& handle,
+ const TQString& app_id,
+ const TQString& window,
+ const TQT_DBusVariantMap& options,
+ TQ_UINT32& response,
+ TQT_DBusVariantMap& results,
+ TQT_DBusError& error)
+{
+ Dictionary details;
+
+ if (OPTION_VALID("reason", "s"))
+ {
+ TQString reason(options["reason"].value.toString());
+ if (!reason.isEmpty())
+ {
+ details[i18n("Reason")] = reason;
+ }
+ }
+
+ // Try to detect which application requested the permission
+ WId wid = parse_window_id(window);
+ ApplicationInfo app = application_info_from_wid(wid);
+
+ if (!app.path.isEmpty())
+ details[i18n("Path")] = app.path;
+
+ // Run the dialog
+ TDEPermissionDialog *dialog = new TDEPermissionDialog(
+ app.name,
+ i18n("Account information"),
+ "user-info",
+ details
+ );
+ AccountInfo info = getAccountInfo();
+ appendDataPreview(dialog, info);
+
+ if (wid > 0) KWin::setMainWindow(dialog, wid);
+
+ if (dialog->exec() == KDialogBase::Yes)
+ {
+ response = 0;
+ results.insert("id", TQSTRING_TO_DBUS_VARIANT(info.userId));
+ results.insert("name", TQSTRING_TO_DBUS_VARIANT(info.realName));
+ results.insert("image", TQSTRING_TO_DBUS_VARIANT(info.avatarPath));
+ }
+ else response = 1;
+
+ delete dialog;
+ return true;
+}
+
+AccountInfo TDEAccountPortal::getAccountInfo()
+{
+ AccountInfo info;
+ KUser user;
+ info.userId = TQString::number(user.uid());
+ info.loginName = user.loginName();
+ info.realName = user.fullName();
+ info.homeDirectory = user.homeDir();
+ findUserAvatar(info);
+ return info;
+}
+
+void TDEAccountPortal::findUserAvatar(AccountInfo &info)
+{
+ // Parse tdmrc settings to determine face source and system location
+ const int fAdminOnly = 1;
+ const int fAdminFirst = fAdminOnly + 1;
+ const int fUserFirst = fAdminFirst + 1;
+ const int fUserOnly = fUserFirst + 1;
+
+ int faceSource = fAdminOnly;
+ TDEConfig *tdmconfig = new TDEConfig("tdm/tdmrc", true);
+ tdmconfig->setGroup("X-*-Greeter");
+
+ TQString fs = tdmconfig->readEntry("FaceSource");
+ if (fs == TQString::fromLatin1("UserOnly"))
+ faceSource = fUserOnly;
+ else if (fs == TQString::fromLatin1("PreferUser"))
+ faceSource = fUserFirst;
+ else if (fs == TQString::fromLatin1("PreferAdmin"))
+ faceSource = fAdminFirst;
+ else
+ faceSource = fAdminOnly;
+
+ TQString userPicsDir = tdmconfig->readEntry("FaceDir",
+ TDEGlobal::dirs()->resourceDirs("data").last() + "tdm/faces") + '/';
+
+ delete tdmconfig;
+
+ // Faces provided by administrator (default and per user)
+ const TQString systemDefault(userPicsDir + ".default.face.icon");
+ const TQString systemUser(userPicsDir + info.loginName + ".face.icon");
+
+ TQString avatar;
+ if (faceSource == fAdminFirst)
+ {
+ avatar = systemUser;
+ if (!TQFile::exists(avatar))
+ faceSource = fUserOnly;
+ }
+
+ if (faceSource >= fUserFirst)
+ {
+ avatar = info.homeDirectory + "/.face.icon";
+ if (!TQFile::exists(avatar) && faceSource == fUserFirst)
+ avatar = systemUser;
+
+ if (!TQFile::exists(avatar))
+ avatar = systemDefault;
+ }
+
+ if (faceSource <= fAdminOnly)
+ {
+ avatar = systemUser;
+ if (!TQFile::exists(avatar))
+ avatar = systemDefault;
+ }
+
+ info.avatarPath = avatar;
+}
+
+void TDEAccountPortal::appendDataPreview(TDEPermissionDialog *dlg, AccountInfo info)
+{
+ TQHBox *frame = new TQHBox(dlg);
+ frame->setFrameStyle(TQFrame::StyledPanel | TQFrame::Sunken);
+
+ TQLabel *avatar = new TQLabel(frame);
+ avatar->setPixmap(TQPixmap(info.avatarPath));
+
+ TQString userDataStr = "<qt><h1>%1</h1><hr>ID: %2</qt>";
+ userDataStr = userDataStr.arg(info.realName, info.userId);
+ TQLabel *userData = new TQLabel(userDataStr, frame);
+
+ avatar->setMargin(TDEPermissionDialog::spacingHint());
+ userData->setMargin(TDEPermissionDialog::spacingHint());
+
+ frame->setSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::Fixed);
+
+ dlg->appendWidget(frame);
+}
+
+// kate: replace-tabs true; tab-width 4; indent-width 4; \ No newline at end of file