/******************************************************************************* XDG desktop portal implementation for TDE Copyright © 2024 Mavridis Philippe Avatar detection code is based on code from the Redmond KSplash theme Copyright © 2001-2003 Brian Ledbetter 2001-2003 Copyright © 2003 Ravikiran Rajagopal 2003 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 #include #include #include // TDE #include #include #include #include #include #include // 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 = "

%1


ID: %2
"; 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;