From 5685f1ade055465e1cde9c9809b79ad9181e3c5f Mon Sep 17 00:00:00 2001 From: uncor3 Date: Sat, 8 Nov 2025 15:09:07 +0000 Subject: [PATCH] update CMake configuration for AUR build & add PrivateInfoLabel for masked display of sensitive information --- CMakeLists.txt | 70 +++++++++++------- resources.qrc | 3 + resources/icons/ClarityEyeHideLine.png | Bin 0 -> 21118 bytes resources/icons/ClarityEyeLine.png | Bin 0 -> 19562 bytes .../MaterialSymbolsLightImageOutlineSharp.png | Bin 0 -> 9050 bytes src/core/services/init_device.cpp | 6 +- src/deviceinfowidget.cpp | 19 +++++ src/infolabel.cpp | 2 + src/infolabel.h | 3 + src/privateinfolabel.cpp | 68 +++++++++++++++++ src/privateinfolabel.h | 49 ++++++++++++ 11 files changed, 193 insertions(+), 27 deletions(-) create mode 100644 resources/icons/ClarityEyeHideLine.png create mode 100644 resources/icons/ClarityEyeLine.png create mode 100644 resources/icons/MaterialSymbolsLightImageOutlineSharp.png create mode 100644 src/privateinfolabel.cpp create mode 100644 src/privateinfolabel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a473410..43e4bc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,17 +22,18 @@ if(WIN32) set(PKG_CONFIG_EXECUTABLE "C:/msys64/mingw64/bin/pkg-config.exe") list(APPEND CMAKE_PREFIX_PATH "C:/lxqt") set(CUSTOM_LIB_PATH "C:/msys64/mingw64/lib") - set(CUSTOM_BIN_PATH "C:/msys64/mingw64/bin") set(CUSTOM_INCLUDE_PATH "C:/msys64/mingw64/include") set(CUSTOM_PKGCONFIG_PATH "C:/msys64/mingw64/lib/pkgconfig") - # Use Windows path separator for environment variables set(ENV{PKG_CONFIG_PATH} "${CUSTOM_PKGCONFIG_PATH};$ENV{PKG_CONFIG_PATH}") -else() +elseif(APPLE) set(CUSTOM_LIB_PATH "/usr/local/lib") set(CUSTOM_INCLUDE_PATH "/usr/local/include") set(CUSTOM_PKGCONFIG_PATH "/usr/local/lib/pkgconfig") - # Use Unix path separator for environment variables set(ENV{PKG_CONFIG_PATH} "${CUSTOM_PKGCONFIG_PATH}:$ENV{PKG_CONFIG_PATH}") +else () + set(CUSTOM_LIB_PATH "/usr/local/lib") + set(CUSTOM_PKGCONFIG_PATH "/usr/local/lib/pkgconfig") + set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CUSTOM_PKGCONFIG_PATH}") endif() include_directories(${CUSTOM_INCLUDE_PATH}) @@ -80,24 +81,34 @@ if(WIN32) message(STATUS "Found Qt bin directory: ${QT_BIN_PATH}") endif() +# Define library search behavior based on platform +if(LINUX) + # On Linux (AUR builds), let CMake search default system paths first. + # The custom path /usr/local/lib will be checked if it's in the default search paths. + set(CUSTOM_FIND_LIB_ARGS "") +else() + # On other platforms, only search the custom path for our specific libraries. + set(CUSTOM_FIND_LIB_ARGS + PATHS ${CUSTOM_LIB_PATH} + NO_DEFAULT_PATH + ) +endif() + find_library(IMOBILEDEVICE_LIBRARY NAMES imobiledevice-1.0 - PATHS ${CUSTOM_LIB_PATH} - NO_DEFAULT_PATH + ${CUSTOM_FIND_LIB_ARGS} REQUIRED ) find_library(IMOBILEDEVICE_GLUE_LIBRARY NAMES imobiledevice-glue-1.0 - PATHS ${CUSTOM_LIB_PATH} - NO_DEFAULT_PATH + ${CUSTOM_FIND_LIB_ARGS} REQUIRED ) find_library(TATSU_LIBRARY NAMES tatsu - PATHS ${CUSTOM_LIB_PATH} - NO_DEFAULT_PATH + ${CUSTOM_FIND_LIB_ARGS} REQUIRED ) @@ -120,8 +131,7 @@ endif() find_library(USBMUXD_LIBRARY NAMES usbmuxd-2.0 - PATHS ${CUSTOM_LIB_PATH} - NO_DEFAULT_PATH + ${CUSTOM_FIND_LIB_ARGS} REQUIRED ) @@ -130,17 +140,8 @@ if(WIN32) find_library(SSL_LIBRARY NAMES ssl PATHS C:/msys64/mingw64/lib REQUIRED) find_library(CRYPTO_LIBRARY NAMES crypto PATHS C:/msys64/mingw64/lib REQUIRED) else() - find_library(SSL_LIBRARY - NAMES ssl - PATHS /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu - REQUIRED - ) - - find_library(CRYPTO_LIBRARY - NAMES crypto - PATHS /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu - REQUIRED - ) + find_library(SSL_LIBRARY NAMES ssl REQUIRED) + find_library(CRYPTO_LIBRARY NAMES crypto REQUIRED) endif() # Add libssh for SSH connections @@ -322,10 +323,29 @@ set_target_properties(iDescriptor PROPERTIES MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE # Control library search order - system libs first, then /usr/local/lib - INSTALL_RPATH "/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/lib:$ORIGIN" - # INSTALL_RPATH "/usr/local/lib:/usr/lib/" + INSTALL_RPATH "/usr/lib/x86_64-linux-gnu:/usr/lib:/usr/local/lib:$ORIGIN" BUILD_WITH_INSTALL_RPATH TRUE ) +if (UNIX AND NOT APPLE) +# Add install rules for the project +include(GNUInstallDirs) + +# Install the main executable +install(TARGETS iDescriptor + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +# Install the .desktop file +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/iDescriptor.desktop + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications +) + +# Install the application icon +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/icons/app-icon/icon.png + RENAME iDescriptor.png + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/apps +) +endif() include(GNUInstallDirs) diff --git a/resources.qrc b/resources.qrc index 21645c9..5d6e357 100644 --- a/resources.qrc +++ b/resources.qrc @@ -31,6 +31,9 @@ resources/icons/MaterialSymbolsAndroidWifi3BarPlus.png resources/icons/IconParkTwotoneMoreTwo.png resources/icons/BxBxsTerminal.png + resources/icons/ClarityEyeHideLine.png + resources/icons/ClarityEyeLine.png + resources/icons/MaterialSymbolsLightImageOutlineSharp.png qml/MapView.qml resources/iphone.png resources/ios-wallpapers/iphone-ios4.png diff --git a/resources/icons/ClarityEyeHideLine.png b/resources/icons/ClarityEyeHideLine.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b828084b6096bb1495ed6721aec51dc28579df GIT binary patch literal 21118 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%0DB#?M28%(VA1u1GI`mp@sZQ!KduP{fNTpAs+d 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 GiT*FvRaznd literal 0 HcmV?d00001 diff --git a/resources/icons/ClarityEyeLine.png b/resources/icons/ClarityEyeLine.png new file mode 100644 index 0000000000000000000000000000000000000000..a60e450e1015d80373988d9176e2f759f69bd266 GIT binary patch literal 19562 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%0A09+K!k(^>&V16aXLzt$u;V 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 literal 0 HcmV?d00001 diff --git a/resources/icons/MaterialSymbolsLightImageOutlineSharp.png b/resources/icons/MaterialSymbolsLightImageOutlineSharp.png new file mode 100644 index 0000000000000000000000000000000000000000..8efacb8c9216facf15acf086042cd46e1232caf0 GIT binary patch literal 9050 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�_Y6AWd+gNy!ABE0u#Uq7Zft3oFlS~#Uct+bL;4Pu zB^PE7AF~Q>&ij+crc2&)uQ&|KtE&F8cv;f7EL z4(kuC*`8dBRxE+@>kb*tW~*+`L1Z|`+Yy*#Xxb*%0AoV;Y~ z{%64a>_J??Q~&IazrCh5xU@zWmFjMecmL75j8ZxZZFY)hH+Ba)V(E#8~{Siws+Oip*+5&PS-~{#%gBs zzqgW(XRE@_R%KJ=-wok5yY7lB$lU+2S+H35@SA~!N*70=uTFil3y3GI6;_mg_7Te9*;vPZI%F7`fu0(G&!w*HVn{?Zp#WuD4H z_|~Y%x^J&JnqjWnXP5tDyu-$+uKuhdV~{KOda-k36|7y|y{=>9RKBM{2m5S`WTVN7 znTC&iy1fdFdKS6s;^&XLHLbDDK;vh^H^1;3Sf z#SBK6o0kZ{5i{WhcP;~pKiwkd7h-E}4BT=n!o1)%d`Djky|q@mfjCXkAHo55-{l<} z@NNJ4|0X9$UtKLDra8A9UL zqCo%ohL8YY0EesjhLE_igJ5i)AtYf8cE0lsA>jnX$%i#&z9A%7i{HkYcL<4xs{#sY zz9A$Ia01F@z9A$Yt`P{=d_zdw&6^OD`G$~qHrPYH%{PPua?U1btMd&Z0nZ>FwuJw0 z2>Ef-#B}f@gWwj)*zi);0DJk3Zb3u#>t8vlE zGF2w#6n|w3QWriH{qTleyiV7BB_ic3Ve8yo=IV*klVc4I^*UAUB2sq?+_=(nJ)FUb zxWTTdBkpn;J_vwg3M?)w(k_q()teww`BzIcE9sVldE>ck6_nKmx!_vR)?`^0{?5Y? zDAm+uFu^9mO^oG@gYnv9CHxLefKvSzSwu4swmGRJVyaBv2shq}w!{Cxa|!NLe|xRU znDBBroK-GwTW^HCjNbvDgN~XdqY=wq@ayrNWnddOSFr|K>CGyB^NrajgDZZAp9P%7 zp9~hZ>5R=;{HTTubxxY}PMZ+sM@`EFx418o^j{<%xadq^b3|9w^p^rVh{t-ZG!&e* zGZVAJk?|0K;OgyFRi;D;%)l`PN*o%4OvUeq5O}*M zlOs?tzW=Nl{6T~OHhbk;bbL@N6a(XedQV^mgeQ0x?4CR0;>v&szGcB^rByvnj1*WC zf~;w7-cR7QCO|V{d^-6b9t1hB>q#JiciI>>#l@X+Bwim_=o34DJ|buXo;1rF|89rZ zZwTPcN%ar}^gh7zjn=`3VSrb74yKTA#K%~~MPId}K!Ca?x>cL^EaqiK+}r zD(~H|MxZ)EoHIqsj*zI?5X|h(q!k2eCJa>SiaYR+T6h<80Shi-)r)}+RvkcfV|kIC zoudyHUft{=CZP0uh;#E29o%~y^*&f=J1|C!2x-mGWIVWyWXZ8X$%EeMFVJeC264Wj zH$V<~GC;}HEw(V&fjERpfN^1IKXT!!1q(HCX`c`tdGdfi@K&V^N-CS%co2C1ZEgO; z0}I(*Da5+T9D=cz|NAyW60Zj=^oZ4qP44DD!U2sj~WH7pB4#pK06_V=p z!drZfr|riB%^ZT4Ol67(1SRl(2SM4AZ0Ik#xXVyTDXi)fiEN-yw28 z7E>@H6*zn0N@t@Fs7Rr{gDY)|v3@Zk`d08)a&#>*B)kSGZxY2GLC+k9X9oIwAjv7z z3vkz)x3ybPlwj(fs2BVSFIg6xmtfbZWrl#3O>i&_(0, (maxCapacity * 100) / designCapacity, 100)) + + "%"; d.batteryInfo.cycleCount = cycleCount; d.batteryInfo.serialNumber = !batterySerialNumber.empty() ? batterySerialNumber diff --git a/src/deviceinfowidget.cpp b/src/deviceinfowidget.cpp index 0e6f37f..243cb3e 100644 --- a/src/deviceinfowidget.cpp +++ b/src/deviceinfowidget.cpp @@ -24,6 +24,7 @@ #include "iDescriptor-ui.h" #include "iDescriptor.h" #include "infolabel.h" +#include "privateinfolabel.h" #include "toolboxwidget.h" #include #include @@ -283,6 +284,24 @@ DeviceInfoWidget::DeviceInfoWidget(iDescriptorDevice *device, QWidget *parent) createValueLabel(QString::fromStdString( device->deviceInfo.productionDevice ? "Yes" : "No"))}); + // Serial Number with privacy + if (!device->deviceInfo.serialNumber.empty()) { + infoItems.append( + {"Serial Number:", + new PrivateInfoLabel( + QString::fromStdString(device->deviceInfo.serialNumber), + this)}); + } + + // IMEI with privacy (Mobile Equipment Identifier) + if (!device->deviceInfo.mobileEquipmentIdentifier.empty()) { + infoItems.append( + {"IMEI:", new PrivateInfoLabel( + QString::fromStdString( + device->deviceInfo.mobileEquipmentIdentifier), + this)}); + } + // Distribute items into the grid int numRows = (infoItems.size() + 1) / 2; for (int i = 0; i < numRows; ++i) { diff --git a/src/infolabel.cpp b/src/infolabel.cpp index 76f72bb..4c604b2 100644 --- a/src/infolabel.cpp +++ b/src/infolabel.cpp @@ -75,3 +75,5 @@ void InfoLabel::restoreOriginalText() setStyleSheet("QLabel:hover { background-color: rgba(255, 255, 255, 0.1); " "border-radius: 2px; }"); } + +void InfoLabel::setOriginalText(const QString &text) { m_originalText = text; } diff --git a/src/infolabel.h b/src/infolabel.h index 01bc7fe..6a6d723 100644 --- a/src/infolabel.h +++ b/src/infolabel.h @@ -31,6 +31,9 @@ public: explicit InfoLabel(const QString &text = QString(), QWidget *parent = nullptr); + // Allow updating the original text (useful for PrivateInfoLabel) + void setOriginalText(const QString &text); + protected: void mousePressEvent(QMouseEvent *event) override; void enterEvent(QEnterEvent *event); diff --git a/src/privateinfolabel.cpp b/src/privateinfolabel.cpp new file mode 100644 index 0000000..6c7c9bc --- /dev/null +++ b/src/privateinfolabel.cpp @@ -0,0 +1,68 @@ +/* + * iDescriptor: A free and open-source idevice management tool. + * + * Copyright (C) 2025 Uncore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "privateinfolabel.h" + +PrivateInfoLabel::PrivateInfoLabel(const QString &fullText, QWidget *parent) + : QWidget(parent), m_fullText(fullText), m_isVisible(false) +{ + m_maskedText = getMaskedText(fullText); + + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(5); + + m_textLabel = new InfoLabel(m_maskedText, this); + layout->addWidget(m_textLabel); + + m_toggleButton = new ZIconWidget( + QIcon(":/resources/icons/ClarityEyeHideLine.png"), "Show", this); + m_toggleButton->setIconSize(QSize(20, 20)); + connect(m_toggleButton, &ZIconWidget::clicked, this, + &PrivateInfoLabel::toggleVisibility); + layout->addWidget(m_toggleButton); + + layout->addStretch(); +} + +QString PrivateInfoLabel::getMaskedText(const QString &text) +{ + if (text.length() <= 4) { + return QString("*").repeated(text.length()); + } + // Show first 4 characters, hide the rest + return text.left(4) + QString("*").repeated(text.length() - 4); +} + +void PrivateInfoLabel::toggleVisibility() +{ + m_isVisible = !m_isVisible; + if (m_isVisible) { + m_textLabel->setText(m_fullText); + m_textLabel->setOriginalText(m_fullText); + m_toggleButton->setIcon(QIcon(":/resources/icons/ClarityEyeLine.png")); + m_toggleButton->setToolTip("Hide"); + } else { + m_textLabel->setText(m_maskedText); + m_textLabel->setOriginalText(m_fullText); + m_toggleButton->setIcon( + QIcon(":/resources/icons/ClarityEyeHideLine.png")); + m_toggleButton->setToolTip("Show"); + } +} diff --git a/src/privateinfolabel.h b/src/privateinfolabel.h new file mode 100644 index 0000000..3ef5f92 --- /dev/null +++ b/src/privateinfolabel.h @@ -0,0 +1,49 @@ +/* + * iDescriptor: A free and open-source idevice management tool. + * + * Copyright (C) 2025 Uncore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef PRIVATEINFOLABEL_H +#define PRIVATEINFOLABEL_H + +#include "iDescriptor-ui.h" +#include "infolabel.h" +#include +#include + +class PrivateInfoLabel : public QWidget +{ + Q_OBJECT + +public: + explicit PrivateInfoLabel(const QString &fullText, + QWidget *parent = nullptr); + +private slots: + void toggleVisibility(); + +private: + QString m_fullText; + QString m_maskedText; + bool m_isVisible; + InfoLabel *m_textLabel; + ZIconWidget *m_toggleButton; + + QString getMaskedText(const QString &text); +}; + +#endif // PRIVATEINFOLABEL_H