From d224f51e47ab9b2edcd683f6699c0d73d4186a1c Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 31 2019 06:44:11 +0000 Subject: import kde-runtime-4.10.5-11.el7 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7b73a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/kde-runtime-4.10.5.tar.xz diff --git a/.kde-runtime.metadata b/.kde-runtime.metadata new file mode 100644 index 0000000..3251af3 --- /dev/null +++ b/.kde-runtime.metadata @@ -0,0 +1 @@ +1d472ceff3a38ff778803817b9c0eeb5b1880db6 SOURCES/kde-runtime-4.10.5.tar.xz diff --git a/SOURCES/kde-runtime-4.10-kglobalaccel-crash.patch b/SOURCES/kde-runtime-4.10-kglobalaccel-crash.patch new file mode 100644 index 0000000..385d058 --- /dev/null +++ b/SOURCES/kde-runtime-4.10-kglobalaccel-crash.patch @@ -0,0 +1,21 @@ +commit a99135656453d613f62b568adb1be88ef5425ed6 +Author: Dan Vrátil +Date: Fri Oct 11 18:30:22 2013 +0200 + + Fix crash when activeGlobalShortcutContext is called with invalid component + +diff --git a/kglobalaccel/kglobalacceld.cpp b/kglobalaccel/kglobalacceld.cpp +index 53ac5b0..3e22893 100644 +--- a/kglobalaccel/kglobalacceld.cpp ++++ b/kglobalaccel/kglobalacceld.cpp +@@ -381,8 +381,8 @@ void KGlobalAccelD::activateGlobalShortcutContext( + { + KdeDGlobalAccel::Component *const comp = + GlobalShortcutsRegistry::self()->getComponent(component); +- +- comp->activateGlobalShortcutContext(uniqueName); ++ if (comp) ++ comp->activateGlobalShortcutContext(uniqueName); + } + + diff --git a/SOURCES/kde-runtime-4.10.4-trash-readonly.patch b/SOURCES/kde-runtime-4.10.4-trash-readonly.patch new file mode 100644 index 0000000..17714dd --- /dev/null +++ b/SOURCES/kde-runtime-4.10.4-trash-readonly.patch @@ -0,0 +1,11 @@ +--- a/kioslave/trash/kio_trash.cpp ++++ a/kioslave/trash/kio_trash.cpp +@@ -416,7 +416,7 @@ bool TrashProtocol::createUDSEntry( const QString& physicalPath, const QString& + } + mode_t type = buff.st_mode & S_IFMT; // extract file type + mode_t access = buff.st_mode & 07777; // extract permissions +- access &= 07555; // make it readonly, since it's in the trashcan ++ //access &= 07555; // make it readonly, since it's in the trashcan + Q_ASSERT(!internalFileName.isEmpty()); + entry.insert( KIO::UDSEntry::UDS_NAME, internalFileName ); // internal filename, like "0-foo" + entry.insert( KIO::UDSEntry::UDS_DISPLAY_NAME, displayFileName ); // user-visible filename, like "foo" diff --git a/SOURCES/kde-runtime-4.10.5-kdesu-fullrelro.patch b/SOURCES/kde-runtime-4.10.5-kdesu-fullrelro.patch new file mode 100644 index 0000000..f506b73 --- /dev/null +++ b/SOURCES/kde-runtime-4.10.5-kdesu-fullrelro.patch @@ -0,0 +1,21 @@ +diff --git a/kdesu/kdesud/CMakeLists.txt b/kdesu/kdesud/CMakeLists.txt +index ca192bc..52e7636 100644 +--- a/kdesu/kdesud/CMakeLists.txt ++++ b/kdesu/kdesud/CMakeLists.txt +@@ -3,7 +3,6 @@ check_function_exists(getpeereucred HAVE_GETPEERUCRED) # solaris style + + configure_file (config-kdesud.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdesud.h ) + +- + set(kdesud_SRCS + kdesud.cpp + repo.cpp +@@ -13,6 +12,8 @@ set(kdesud_SRCS + + kde4_add_executable(kdesud NOGUI ${kdesud_SRCS}) + ++SET_TARGET_PROPERTIES(kdesud PROPERTIES LINK_FLAGS "-Wl,-z,relro,-z,now") ++ + target_link_libraries(kdesud ${KDE4_KDESU_LIBS} ${KDE4_KDECORE_LIBS} ${X11_LIBRARIES}) + + if(KDE4_ENABLE_FPIE) diff --git a/SOURCES/kde-runtime-4.7.90-nepomuk_onlyshowin_kde.patch b/SOURCES/kde-runtime-4.7.90-nepomuk_onlyshowin_kde.patch new file mode 100644 index 0000000..3e34bcf --- /dev/null +++ b/SOURCES/kde-runtime-4.7.90-nepomuk_onlyshowin_kde.patch @@ -0,0 +1,8 @@ +diff -up kde-runtime-4.7.90/nepomuk/controller/nepomukcontroller.desktop.onlyshowin_kde kde-runtime-4.7.90/nepomuk/controller/nepomukcontroller.desktop +--- kde-runtime-4.7.90/nepomuk/controller/nepomukcontroller.desktop.onlyshowin_kde 2011-12-02 15:17:38.000000000 -0600 ++++ kde-runtime-4.7.90/nepomuk/controller/nepomukcontroller.desktop 2011-12-09 14:40:33.763287346 -0600 +@@ -98,3 +98,4 @@ X-DBUS-StartupType=Unique + X-KDE-StartupNotify=false + X-KDE-UniqueApplet=true + X-KDE-autostart-condition=nepomukserverrc:Basic Settings:Start Nepomuk:true ++OnlyShowIn=KDE; diff --git a/SOURCES/kde-runtime-4.9.0-installdbgsymbols.patch b/SOURCES/kde-runtime-4.9.0-installdbgsymbols.patch new file mode 100644 index 0000000..f648de5 --- /dev/null +++ b/SOURCES/kde-runtime-4.9.0-installdbgsymbols.patch @@ -0,0 +1,27 @@ +diff -up kde-runtime-4.9.0/drkonqi/doc/examples/installdbgsymbols_fedora.sh.installdbgsymbols kde-runtime-4.9.0/drkonqi/doc/examples/installdbgsymbols_fedora.sh +--- kde-runtime-4.9.0/drkonqi/doc/examples/installdbgsymbols_fedora.sh.installdbgsymbols 2012-05-22 18:57:38.000000000 -0500 ++++ kde-runtime-4.9.0/drkonqi/doc/examples/installdbgsymbols_fedora.sh 2012-08-07 20:00:11.506028183 -0500 +@@ -27,12 +27,12 @@ run_in_terminal() + mkfifo $fifo + + # start terminal +- konsole -e sh -c "echo \$\$ > $fifo; $1; exit_status=\$?; sleep 1; rm $fifo; echo \$exit_status > $fifo" & ++ konsole -e sh -c "echo \$\$ > $fifo; set -x ; $1; exit_status=\$?; sleep 10; rm $fifo; echo \$exit_status > $fifo" & + + # wait for it to finish + local pid=`cat $fifo` + while [ "$?" = "0" ]; do +- sleep 1 ++ sleep 10 + kill -0 $pid 2>/dev/null + done + +@@ -80,7 +80,7 @@ done + # filter out duplicates + packages=`echo "$packages" | tr " " "\n" | sort | uniq | tr "\n" " "` + +-run_in_terminal "su -c \"debuginfo-install $packages\"" ++run_in_terminal "pkexec debuginfo-install $packages" + + if [ "$?" = "1" ]; then + exit 3 diff --git a/SOURCES/kde-runtime-4.9.2-webkit.patch b/SOURCES/kde-runtime-4.9.2-webkit.patch new file mode 100644 index 0000000..5f88a9d --- /dev/null +++ b/SOURCES/kde-runtime-4.9.2-webkit.patch @@ -0,0 +1,153 @@ +diff -up kde-runtime-4.9.2/drkonqi/CMakeLists.txt.webkit kde-runtime-4.9.2/drkonqi/CMakeLists.txt +--- kde-runtime-4.9.2/drkonqi/CMakeLists.txt.webkit 2012-09-28 02:16:14.000000000 +0200 ++++ kde-runtime-4.9.2/drkonqi/CMakeLists.txt 2012-10-11 15:28:21.060908131 +0200 +@@ -76,12 +76,14 @@ kde4_add_ui_files(drkonqi_SRCS + # Comment this out for release. + #add_definitions(-DBACKTRACE_PARSER_DEBUG) + ++# no webkit ++set (KDERUNTIME_NO_WEBKIT TRUE) ++add_definitions(-DKDERUNTIME_NO_WEBKIT) ++ + kde4_add_executable(drkonqi ${drkonqi_SRCS}) + + target_link_libraries(drkonqi + ${KDE4_KIO_LIBS} +- ${QT_QTWEBKIT_LIBRARY} +- ${KDE4_KDEWEBKIT_LIBRARY} + ${KDEPIMLIBS_KXMLRPCCLIENT_LIBRARY} + drkonqi_backtrace_parser + ) +diff -up kde-runtime-4.9.2/drkonqi/reportassistantpages_bugzilla.cpp.webkit kde-runtime-4.9.2/drkonqi/reportassistantpages_bugzilla.cpp +--- kde-runtime-4.9.2/drkonqi/reportassistantpages_bugzilla.cpp.webkit 2012-09-28 02:16:14.000000000 +0200 ++++ kde-runtime-4.9.2/drkonqi/reportassistantpages_bugzilla.cpp 2012-10-11 15:28:21.061908093 +0200 +@@ -46,7 +46,11 @@ + + /* Unhandled error dialog includes */ + #include ++#ifdef KDERUNTIME_NO_WEBKIT ++#include ++#else + #include ++#endif + #include + #include + #include +@@ -774,8 +778,11 @@ UnhandledErrorDialog::UnhandledErrorDial + + setAttribute(Qt::WA_DeleteOnClose); + ++#ifdef KDERUNTIME_NO_WEBKIT ++ QTextBrowser * htmlView = new QTextBrowser(this); ++#else + KWebView * htmlView = new KWebView(this); +- ++#endif + QLabel * iconLabel = new QLabel(this); + iconLabel->setFixedSize(32, 32); + iconLabel->setPixmap(KIcon("dialog-warning").pixmap(32, 32)); +diff -up kde-runtime-4.9.2/kioslave/thumbnail/CMakeLists.txt.webkit kde-runtime-4.9.2/kioslave/thumbnail/CMakeLists.txt +--- kde-runtime-4.9.2/kioslave/thumbnail/CMakeLists.txt.webkit 2012-09-28 02:16:14.000000000 +0200 ++++ kde-runtime-4.9.2/kioslave/thumbnail/CMakeLists.txt 2012-10-11 15:28:21.061908093 +0200 +@@ -76,18 +76,6 @@ install(TARGETS textthumbnail DESTINATIO + + ########### next target ############### + +-if(NOT WINCE) +-set(htmlthumbnail_PART_SRCS htmlcreator.cpp) +- +-kde4_add_plugin(htmlthumbnail ${htmlthumbnail_PART_SRCS}) +- +-target_link_libraries(htmlthumbnail ${KDE4_KDEWEBKIT_LIBS}) +- +-install(TARGETS htmlthumbnail DESTINATION ${PLUGIN_INSTALL_DIR}) +-endif(NOT WINCE) +- +-########### next target ############### +- + if(NOT WIN32) + set(djvuthumbnail_PART_SRCS djvucreator.cpp) + +diff -up kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/CMakeLists.txt.webkit kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/CMakeLists.txt +--- kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/CMakeLists.txt.webkit 2012-09-28 02:16:15.000000000 +0200 ++++ kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/CMakeLists.txt 2012-10-11 15:28:21.062908056 +0200 +@@ -1,5 +1,8 @@ + project(graphicswidgetsbindings) + ++set (PLASMA_NO_KDEWEBKIT TRUE) ++add_definitions(-DPLASMA_NO_KDEWEBKIT) ++ + set(graphicswidgetsbindings_SRCS + graphicswidgetsbindingsplugin.cpp + declarativetabbar.cpp +diff -up kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/graphicswidgetsbindingsplugin.cpp.webkit kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/graphicswidgetsbindingsplugin.cpp +--- kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/graphicswidgetsbindingsplugin.cpp.webkit 2012-09-28 02:16:15.000000000 +0200 ++++ kde-runtime-4.9.2/plasma/declarativeimports/graphicswidgets/graphicswidgetsbindingsplugin.cpp 2012-10-11 15:30:57.913033942 +0200 +@@ -47,8 +47,9 @@ + #include + #include + #include ++#ifndef PLASMA_NO_KDEWEBKIT + #include +- ++#endif + #include "declarativetabbar.h" + + SignalPlotter::SignalPlotter(QGraphicsItem *parent) +@@ -99,7 +100,9 @@ void GraphicsWidgetsBindingsPlugin::regi + qmlRegisterType(uri, 0, 1, "ToolButton"); + qmlRegisterType(uri, 0, 1, "TreeView"); + qmlRegisterType(uri, 0, 1, "VideoWidget"); ++#ifndef PLASMA_NO_KDEWEBKIT + qmlRegisterType(uri, 0, 1, "WebView"); ++#endif + } + + +diff -up kde-runtime-4.9.2/plasma/scriptengines/javascript/CMakeLists.txt.webkit kde-runtime-4.9.2/plasma/scriptengines/javascript/CMakeLists.txt +--- kde-runtime-4.9.2/plasma/scriptengines/javascript/CMakeLists.txt.webkit 2012-09-28 02:16:15.000000000 +0200 ++++ kde-runtime-4.9.2/plasma/scriptengines/javascript/CMakeLists.txt 2012-10-11 15:28:21.062908056 +0200 +@@ -7,6 +7,9 @@ if(KDE_PLATFORM_FEATURE_BINARY_COMPATIBL + set(PLASMA_NO_KIO TRUE) + endif(KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION) + ++set (PLASMA_NO_KDEWEBKIT TRUE) ++add_definitions(-DPLASMA_NO_KDEWEBKIT) ++ + set(simple_javascript_engine_SRCS + common/extension_launchapp.cpp + common/extension_io.cpp +diff -up kde-runtime-4.9.2/plasma/scriptengines/javascript/simplebindings/uiloader.cpp.webkit kde-runtime-4.9.2/plasma/scriptengines/javascript/simplebindings/uiloader.cpp +--- kde-runtime-4.9.2/plasma/scriptengines/javascript/simplebindings/uiloader.cpp.webkit 2012-09-28 02:16:15.000000000 +0200 ++++ kde-runtime-4.9.2/plasma/scriptengines/javascript/simplebindings/uiloader.cpp 2012-10-11 15:28:21.063908019 +0200 +@@ -49,7 +49,9 @@ + #include + #include + #include ++#ifndef PLASMA_NO_KDEWEBKIT + #include ++#endif + #include + + +@@ -78,7 +80,9 @@ QGraphicsWidget *createTextEdit(QGraphic + QGraphicsWidget *createToolButton(QGraphicsWidget *parent) { return new Plasma::ToolButton(parent); } + QGraphicsWidget *createTreeView(QGraphicsWidget *parent) { return new Plasma::TreeView(parent); } + QGraphicsWidget *createVideoWidget(QGraphicsWidget *parent) { return new Plasma::VideoWidget(parent); } ++#ifndef PLASMA_NO_KDEWEBKIT + QGraphicsWidget *createWebView(QGraphicsWidget *parent) { return new Plasma::WebView(parent); } ++#endif + QGraphicsWidget *createGraphicsWidget(QGraphicsWidget *parent) { return new QGraphicsWidget(parent); } + + UiLoader::UiLoader() +@@ -108,8 +112,10 @@ UiLoader::UiLoader() + m_widgetCtors.insert("ToolButton", createToolButton); + m_widgetCtors.insert("TreeView", createTreeView); + m_widgetCtors.insert("VideoWidget", createVideoWidget); ++#ifndef PLASMA_NO_KDEWEBKIT + m_widgetCtors.insert("WebView", createWebView); + m_widgetCtors.insert("GraphicsWidget", createWebView); ++#endif + } + + UiLoader::~UiLoader() diff --git a/SOURCES/kde-runtime-4.9.98-kde#310486.patch b/SOURCES/kde-runtime-4.9.98-kde#310486.patch new file mode 100644 index 0000000..6b3df11 --- /dev/null +++ b/SOURCES/kde-runtime-4.9.98-kde#310486.patch @@ -0,0 +1,75 @@ +diff -ur kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/CMakeLists.txt kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/CMakeLists.txt +--- kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/CMakeLists.txt 2012-12-17 15:24:58.000000000 +0100 ++++ kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/CMakeLists.txt 2013-01-27 20:01:31.000000000 +0100 +@@ -21,7 +21,7 @@ + + + add_library(plasmacomponentsplugin SHARED ${plasmacomponents_SRCS}) +-target_link_libraries(plasmacomponentsplugin ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBRARY} ${KDECLARATIVE_LIBRARIES} ${KDE4_PLASMA_LIBS}) ++target_link_libraries(plasmacomponentsplugin ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBRARY} ${KDE4_PLASMA_LIBS}) + + install(TARGETS plasmacomponentsplugin DESTINATION ${IMPORTS_INSTALL_DIR}/org/kde/plasma/components) + +diff -ur kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/fullscreenwindow.cpp kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/fullscreenwindow.cpp +--- kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/fullscreenwindow.cpp 2012-12-17 15:24:58.000000000 +0100 ++++ kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/fullscreenwindow.cpp 2013-01-27 22:47:38.000000000 +0100 +@@ -35,8 +35,8 @@ + + #include + #include +- +-#include ++#include ++#include + + #include + #include +@@ -124,9 +124,14 @@ + } + + //Try to figure out the path of the dialog component +- const QString target = KDeclarative::componentsTarget(); ++ QString target = getenv("KDE_PLASMA_COMPONENTS_PLATFORM"); ++ if (target.isEmpty()) { ++ KConfigGroup cg(KSharedConfig::openConfig("kdeclarativerc"), "Components-platform"); ++ target = cg.readEntry("name", "desktop"); ++ } ++ + QString filePath; +- if (target != KDeclarative::defaultComponentsTarget()) { ++ if (target != "desktop") { + const QString file = "platformimports/" % target % "/org/kde/plasma/components/" % componentName % ".qml"; + filePath = KStandardDirs::locate("module", file); + } +diff -ur kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/plasmacomponentsplugin.cpp kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/plasmacomponentsplugin.cpp +--- kde-runtime-4.9.98/plasma/declarativeimports/plasmacomponents/plasmacomponentsplugin.cpp 2012-12-17 15:24:58.000000000 +0100 ++++ kde-runtime-4.9.98-kde#310486/plasma/declarativeimports/plasmacomponents/plasmacomponentsplugin.cpp 2013-01-27 22:47:47.000000000 +0100 +@@ -27,11 +27,10 @@ + #include "qrangemodel.h" + + #include ++#include + #include + #include + +-#include +- + #include "enums.h" + #include "qmenu.h" + #include "qmenuitem.h" +@@ -91,8 +90,13 @@ + Q_ASSERT(uri == QLatin1String("org.kde.plasma.components")); + + //platform specific c++ components +- const QString target = KDeclarative::componentsTarget(); +- if (target == KDeclarative::defaultComponentsTarget()) { ++ QString target = getenv("KDE_PLASMA_COMPONENTS_PLATFORM"); ++ if (target.isEmpty()) { ++ KConfigGroup cg(KSharedConfig::openConfig("kdeclarativerc"), "Components-platform"); ++ target = cg.readEntry("name", "desktop"); ++ } ++ ++ if (target == "desktop") { + qmlRegisterType(uri, 0, 1, "Menu"); + qmlRegisterType(uri, 0, 1, "MenuItem"); + } else { diff --git a/SOURCES/kde-runtime-mouseeventlistener.patch b/SOURCES/kde-runtime-mouseeventlistener.patch new file mode 100644 index 0000000..32125d1 --- /dev/null +++ b/SOURCES/kde-runtime-mouseeventlistener.patch @@ -0,0 +1,14 @@ +diff -Naur kde-runtime-4.10.3.orig/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp kde-runtime-4.10.3/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp +--- kde-runtime-4.10.3.orig/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp 2013-06-10 23:26:05.000000000 +0200 ++++ kde-runtime-4.10.3/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp 2013-06-12 00:19:53.000000000 +0200 +@@ -160,6 +160,10 @@ + return false; + } + ++ if (m_lastEvent == event) { ++ return QDeclarativeItem::sceneEventFilter(item, event); ++ } ++ + m_lastEvent = event; + + switch (event->type()) { diff --git a/SOURCES/kde-runtime-solid-device-automounter.patch b/SOURCES/kde-runtime-solid-device-automounter.patch new file mode 100644 index 0000000..8744906 --- /dev/null +++ b/SOURCES/kde-runtime-solid-device-automounter.patch @@ -0,0 +1,47 @@ +diff --git a/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp b/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp +index 42fbfae..80f6d28 100644 +--- a/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp ++++ b/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp +@@ -57,6 +57,7 @@ DeviceAutomounterKCM::DeviceAutomounterKCM(QWidget *parent, const QVariantList & + + m_devices = new DeviceModel(this); + deviceView->setModel(m_devices); ++ deviceView->setEnabled(true); + + connect(automountOnLogin, SIGNAL(stateChanged(int)), this, SLOT(emitChanged())); + connect(automountOnPlugin, SIGNAL(stateChanged(int)), this, SLOT(emitChanged())); +@@ -112,12 +113,10 @@ DeviceAutomounterKCM::enabledChanged() + automountOnLogin->setEnabled(false); + automountOnPlugin->setEnabled(false); + automountUnknownDevices->setEnabled(false); +- deviceView->setEnabled(false); + } else { + automountOnLogin->setEnabled(true); + automountOnPlugin->setEnabled(true); + automountUnknownDevices->setEnabled(true); +- deviceView->setEnabled(true); + } + } + +diff --git a/solid-device-automounter/kcm/DeviceModel.cpp b/solid-device-automounter/kcm/DeviceModel.cpp +index 9469cb6..7ab6eb4 100644 +--- a/solid-device-automounter/kcm/DeviceModel.cpp ++++ b/solid-device-automounter/kcm/DeviceModel.cpp +@@ -60,7 +60,8 @@ void + DeviceModel::deviceAttached(const QString &udi) + { + Solid::Device dev(udi); +- if (dev.is()) { ++ Solid::StorageVolume *volume = dev.as(); ++ if (volume && !volume->isIgnored()) { + if (m_disconnected.contains(udi)) { + emit layoutAboutToBeChanged(); + beginRemoveRows(index(1, 0), m_disconnected.indexOf(udi), m_disconnected.indexOf(udi)); +@@ -81,7 +82,6 @@ DeviceModel::deviceRemoved(const QString &udi) + m_attached.removeOne(udi); + endRemoveRows(); + emit layoutChanged(); +- addNewDevice(udi); + } + } + diff --git a/SOURCES/kdebase-runtime-4.1.x-searchproviders-shortcuts.patch b/SOURCES/kdebase-runtime-4.1.x-searchproviders-shortcuts.patch new file mode 100644 index 0000000..c5fd0d4 --- /dev/null +++ b/SOURCES/kdebase-runtime-4.1.x-searchproviders-shortcuts.patch @@ -0,0 +1,22 @@ +diff -up kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/bugzilla.desktop.orig kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/bugzilla.desktop +--- kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/bugzilla.desktop.orig 2008-06-05 13:19:46.000000000 +0200 ++++ kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/bugzilla.desktop 2008-06-05 13:21:39.000000000 +0200 +@@ -0,0 +1,7 @@ ++[Desktop Entry] ++Hidden=false ++Type=Service ++Name=Red Hat bug tracking system ++ServiceTypes=SearchProvider ++Keys=rhbug,bz ++Query=http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=\\1 +diff -up kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/fedora.desktop.orig kdebase-runtime-4.0.5/kurifilter-plugins/ikws/searchproviders/fedora.desktop +--- kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/fedora.desktop.orig 2008-06-05 13:20:19.000000000 +0200 ++++ kdebase-runtime-4.0.80/kurifilter-plugins/ikws/searchproviders/fedora.desktop 2008-06-05 13:20:47.000000000 +0200 +@@ -0,0 +1,7 @@ ++[Desktop Entry] ++Hidden=false ++Keys=fp,fedora ++Name=fedoraproject ++Query=http://fedoraproject.org/wiki/?action=fullsearch&context=180&value=\\{@}&titlesearch=Titles ++ServiceTypes=SearchProvider ++Type=Service diff --git a/SOURCES/kdebase-runtime-4.3.3-home_onlyshowin_kde.patch b/SOURCES/kdebase-runtime-4.3.3-home_onlyshowin_kde.patch new file mode 100644 index 0000000..f82250f --- /dev/null +++ b/SOURCES/kdebase-runtime-4.3.3-home_onlyshowin_kde.patch @@ -0,0 +1,9 @@ +diff -up kdebase-runtime-4.3.3/kioslave/desktop/Home.desktop.home_onlyshowin_kde kdebase-runtime-4.3.3/kioslave/desktop/Home.desktop +--- kdebase-runtime-4.3.3/kioslave/desktop/Home.desktop.home_onlyshowin_kde 2009-10-02 03:18:57.000000000 -0500 ++++ kdebase-runtime-4.3.3/kioslave/desktop/Home.desktop 2009-11-05 08:16:19.637144099 -0600 +@@ -174,4 +174,4 @@ GenericName[zh_TW]=個人檔案 + URL[$e]=$HOME + Icon=user-home + Type=Link +- ++OnlyShowIn=KDE; diff --git a/SOURCES/kdebase-runtime-4.3.4-man-overrides.patch b/SOURCES/kdebase-runtime-4.3.4-man-overrides.patch new file mode 100644 index 0000000..45ee918 --- /dev/null +++ b/SOURCES/kdebase-runtime-4.3.4-man-overrides.patch @@ -0,0 +1,11 @@ +diff -up kdebase-runtime-4.3.4/kioslave/man/kio_man.cpp.manpath kdebase-runtime-4.3.4/kioslave/man/kio_man.cpp +--- kdebase-runtime-4.3.4/kioslave/man/kio_man.cpp.manpath 2011-02-03 18:30:23.000000000 +0100 ++++ kdebase-runtime-4.3.4/kioslave/man/kio_man.cpp 2011-02-03 18:27:09.000000000 +0100 +@@ -902,6 +902,7 @@ void MANProtocol::constructPath(QStringL + + // Default paths + static const char * const manpaths[] = { ++ "/usr/share/man/overrides", + "/usr/X11/man", + "/usr/X11R6/man", + "/usr/man", diff --git a/SOURCES/kdebase-runtime-4.5.3-htsearch.patch b/SOURCES/kdebase-runtime-4.5.3-htsearch.patch new file mode 100644 index 0000000..ceb89d2 --- /dev/null +++ b/SOURCES/kdebase-runtime-4.5.3-htsearch.patch @@ -0,0 +1,12 @@ +diff -up kdebase-runtime-4.5.3/khelpcenter/searchhandlers/khc_htsearch.pl.htsearch kdebase-runtime-4.5.3/khelpcenter/searchhandlers/khc_htsearch.pl +--- kdebase-runtime-4.5.3/khelpcenter/searchhandlers/khc_htsearch.pl.htsearch 2009-09-23 14:21:09.000000000 -0500 ++++ kdebase-runtime-4.5.3/khelpcenter/searchhandlers/khc_htsearch.pl 2010-11-12 09:22:04.000000000 -0600 +@@ -8,7 +8,7 @@ use Getopt::Long; + use open IO => ':utf8'; + use open ':std'; + +-my $htsearchpath="/srv/www/cgi-bin/htsearch"; ++my $htsearchpath="/usr/bin/htsearch"; + my $config; + my $format; + my $method; diff --git a/SOURCES/kdebase-runtime-4.5.95-compiz.patch b/SOURCES/kdebase-runtime-4.5.95-compiz.patch new file mode 100644 index 0000000..eb7cfd2 --- /dev/null +++ b/SOURCES/kdebase-runtime-4.5.95-compiz.patch @@ -0,0 +1,13 @@ +diff -ur kdebase-runtime-4.5.95/kcontrol/componentchooser/windowmanagers/compiz.desktop kdebase-runtime-4.5.95-compiz/kcontrol/componentchooser/windowmanagers/compiz.desktop +--- kdebase-runtime-4.5.95/kcontrol/componentchooser/windowmanagers/compiz.desktop 2010-11-05 10:46:36.000000000 +0000 ++++ kdebase-runtime-4.5.95-compiz/kcontrol/componentchooser/windowmanagers/compiz.desktop 2011-01-20 09:57:24.134453897 +0000 +@@ -78,7 +78,7 @@ + Name[x-test]=xxCompizxx + Name[zh_CN]=Compiz + Name[zh_TW]=Compiz +-Exec=compiz ccp ++Exec=compiz-manager + TryExec=compiz +-X-KDE-WindowManagerConfigure=simple-ccsm ++X-KDE-WindowManagerConfigure=ccsm + X-KDE-WindowManagerRestartArgument=--replace diff --git a/SOURCES/kwalletd-new.patch b/SOURCES/kwalletd-new.patch new file mode 100644 index 0000000..608b197 --- /dev/null +++ b/SOURCES/kwalletd-new.patch @@ -0,0 +1,3677 @@ +diff -Nur kwalletd.than/backend/backendpersisthandler.cpp kwalletd/backend/backendpersisthandler.cpp +--- kwalletd.than/backend/backendpersisthandler.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/backend/backendpersisthandler.cpp 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,731 @@ ++/** ++ * This file is part of the KDE project ++ * Copyright (C) 2013 Valentin Rusu ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License version 2 as published by the Free Software Foundation. ++ * ++ * 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public License ++ * along with this library; see the file COPYING.LIB. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef HAVE_QGPGME ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++#include "backendpersisthandler.h" ++#include "kwalletbackend.h" ++#include "blowfish.h" ++#include "sha1.h" ++#include "cbc.h" ++ ++#ifdef Q_OS_WIN ++#include ++#include ++#endif ++ ++#define KWALLET_CIPHER_BLOWFISH_CBC 0 ++#define KWALLET_CIPHER_3DES_CBC 1 // unsupported ++#define KWALLET_CIPHER_GPG 2 ++ ++#define KWALLET_HASH_SHA1 0 ++#define KWALLET_HASH_MD5 1 // unsupported ++ ++namespace KWallet { ++ ++static int getRandomBlock(QByteArray& randBlock) { ++ ++#ifdef Q_OS_WIN //krazy:exclude=cpp ++ ++ // Use windows crypto API to get randomness on win32 ++ // HACK: this should be done using qca ++ HCRYPTPROV hProv; ++ ++ if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, ++ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) return -1; // couldn't get random data ++ ++ if (!CryptGenRandom(hProv, static_cast(randBlock.size()), ++ (BYTE*)randBlock.data())) { ++ return -3; // read error ++ } ++ ++ // release the crypto context ++ CryptReleaseContext(hProv, 0); ++ ++ return randBlock.size(); ++ ++#else ++ ++ // First try /dev/urandom ++ if (QFile::exists("/dev/urandom")) { ++ QFile devrand("/dev/urandom"); ++ if (devrand.open(QIODevice::ReadOnly)) { ++ int rc = devrand.read(randBlock.data(), randBlock.size()); ++ ++ if (rc != randBlock.size()) { ++ return -3; // not enough data read ++ } ++ ++ return 0; ++ } ++ } ++ ++ // If that failed, try /dev/random ++ // FIXME: open in noblocking mode! ++ if (QFile::exists("/dev/random")) { ++ QFile devrand("/dev/random"); ++ if (devrand.open(QIODevice::ReadOnly)) { ++ int rc = 0; ++ int cnt = 0; ++ ++ do { ++ int rc2 = devrand.read(randBlock.data() + rc, randBlock.size()); ++ ++ if (rc2 < 0) { ++ return -3; // read error ++ } ++ ++ rc += rc2; ++ cnt++; ++ if (cnt > randBlock.size()) { ++ return -4; // reading forever?! ++ } ++ } while(rc < randBlock.size()); ++ ++ return 0; ++ } ++ } ++ ++ // EGD method ++ QString randFilename = QString::fromLocal8Bit(qgetenv("RANDFILE")); ++ if (!randFilename.isEmpty()) { ++ if (QFile::exists(randFilename)) { ++ QFile devrand(randFilename); ++ if (devrand.open(QIODevice::ReadOnly)) { ++ int rc = devrand.read(randBlock.data(), randBlock.size()); ++ if (rc != randBlock.size()) { ++ return -3; // not enough data read ++ } ++ return 0; ++ } ++ } ++ } ++ ++ // Couldn't get any random data!! ++ return -1; ++ ++#endif ++} ++ ++ ++ ++static BlowfishPersistHandler *blowfishHandler =0; ++#ifdef HAVE_QGPGME ++static GpgPersistHandler *gpgHandler =0; ++#endif // HAVE_QGPGME ++ ++BackendPersistHandler *BackendPersistHandler::getPersistHandler(BackendCipherType cipherType) ++{ ++ switch (cipherType){ ++ case BACKEND_CIPHER_BLOWFISH: ++ if (0 == blowfishHandler) ++ blowfishHandler = new BlowfishPersistHandler; ++ return blowfishHandler; ++#ifdef HAVE_QGPGME ++ case BACKEND_CIPHER_GPG: ++ if (0 == gpgHandler) ++ gpgHandler = new GpgPersistHandler; ++ return gpgHandler; ++#endif // HAVE_QGPGME ++ default: ++ Q_ASSERT(0); ++ return 0; ++ } ++} ++ ++BackendPersistHandler *BackendPersistHandler::getPersistHandler(char magicBuf[12]) ++{ ++ if (magicBuf[2] == KWALLET_CIPHER_BLOWFISH_CBC && ++ magicBuf[3] == KWALLET_HASH_SHA1) { ++ if (0 == blowfishHandler) ++ blowfishHandler = new BlowfishPersistHandler; ++ return blowfishHandler; ++ } ++#ifdef HAVE_QGPGME ++ if (magicBuf[2] == KWALLET_CIPHER_GPG && ++ magicBuf[3] == 0) { ++ if (0 == gpgHandler) ++ gpgHandler = new GpgPersistHandler; ++ return gpgHandler; ++ } ++#endif // HAVE_QGPGME ++ return 0; // unknown cipher or hash ++} ++ ++int BlowfishPersistHandler::write(Backend* wb, KSaveFile& sf, QByteArray& version, WId) ++{ ++ assert(wb->_cipherType == BACKEND_CIPHER_BLOWFISH); ++ ++ version[2] = KWALLET_CIPHER_BLOWFISH_CBC; ++ version[3] = KWALLET_HASH_SHA1; ++ if (sf.write(version, 4) != 4) { ++ sf.abort(); ++ return -4; // write error ++ } ++ ++ // Holds the hashes we write out ++ QByteArray hashes; ++ QDataStream hashStream(&hashes, QIODevice::WriteOnly); ++ KMD5 md5; ++ hashStream << static_cast(wb->_entries.count()); ++ ++ // Holds decrypted data prior to encryption ++ QByteArray decrypted; ++ ++ // FIXME: we should estimate the amount of data we will write in each ++ // buffer and resize them approximately in order to avoid extra ++ // resizes. ++ ++ // populate decrypted ++ QDataStream dStream(&decrypted, QIODevice::WriteOnly); ++ for (Backend::FolderMap::ConstIterator i = wb->_entries.constBegin(); i != wb->_entries.constEnd(); ++i) { ++ dStream << i.key(); ++ dStream << static_cast(i.value().count()); ++ ++ md5.reset(); ++ md5.update(i.key().toUtf8()); ++ hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); ++ hashStream << static_cast(i.value().count()); ++ ++ for (Backend::EntryMap::ConstIterator j = i.value().constBegin(); j != i.value().constEnd(); ++j) { ++ dStream << j.key(); ++ dStream << static_cast(j.value()->type()); ++ dStream << j.value()->value(); ++ ++ md5.reset(); ++ md5.update(j.key().toUtf8()); ++ hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); ++ } ++ } ++ ++ if (sf.write(hashes, hashes.size()) != hashes.size()) { ++ sf.abort(); ++ return -4; // write error ++ } ++ ++ // calculate the hash of the file ++ SHA1 sha; ++ BlowFish _bf; ++ CipherBlockChain bf(&_bf); ++ ++ sha.process(decrypted.data(), decrypted.size()); ++ ++ // prepend and append the random data ++ QByteArray wholeFile; ++ long blksz = bf.blockSize(); ++ long newsize = decrypted.size() + ++ blksz + // encrypted block ++ 4 + // file size ++ 20; // size of the SHA hash ++ ++ int delta = (blksz - (newsize % blksz)); ++ newsize += delta; ++ wholeFile.resize(newsize); ++ ++ QByteArray randBlock; ++ randBlock.resize(blksz+delta); ++ if (getRandomBlock(randBlock) < 0) { ++ sha.reset(); ++ decrypted.fill(0); ++ sf.abort(); ++ return -3; // Fatal error: can't get random ++ } ++ ++ for (int i = 0; i < blksz; i++) { ++ wholeFile[i] = randBlock[i]; ++ } ++ ++ for (int i = 0; i < 4; i++) { ++ wholeFile[(int)(i+blksz)] = (decrypted.size() >> 8*(3-i))&0xff; ++ } ++ ++ for (int i = 0; i < decrypted.size(); i++) { ++ wholeFile[(int)(i+blksz+4)] = decrypted[i]; ++ } ++ ++ for (int i = 0; i < delta; i++) { ++ wholeFile[(int)(i+blksz+4+decrypted.size())] = randBlock[(int)(i+blksz)]; ++ } ++ ++ const char *hash = (const char *)sha.hash(); ++ for (int i = 0; i < 20; i++) { ++ wholeFile[(int)(newsize - 20 + i)] = hash[i]; ++ } ++ ++ sha.reset(); ++ decrypted.fill(0); ++ ++ // encrypt the data ++ if (!bf.setKey(wb->_passhash.data(), wb->_passhash.size() * 8)) { ++ wholeFile.fill(0); ++ sf.abort(); ++ return -2; // encrypt error ++ } ++ ++ int rc = bf.encrypt(wholeFile.data(), wholeFile.size()); ++ if (rc < 0) { ++ wholeFile.fill(0); ++ sf.abort(); ++ return -2; // encrypt error ++ } ++ ++ // write the file ++ if (sf.write(wholeFile, wholeFile.size()) != wholeFile.size()) { ++ wholeFile.fill(0); ++ sf.abort(); ++ return -4; // write error ++ } ++ if (!sf.finalize()) { ++ kDebug() << "WARNING: wallet sync to disk failed! KSaveFile status was " << sf.errorString(); ++ wholeFile.fill(0); ++ return -4; // write error ++ } ++ ++ wholeFile.fill(0); ++ ++ return 0; ++} ++ ++ ++int BlowfishPersistHandler::read(Backend* wb, QFile& db, WId) ++{ ++ wb->_cipherType = BACKEND_CIPHER_BLOWFISH; ++ wb->_hashes.clear(); ++ // Read in the hashes ++ QDataStream hds(&db); ++ quint32 n; ++ hds >> n; ++ if (n > 0xffff) { // sanity check ++ return -43; ++ } ++ ++ for (size_t i = 0; i < n; ++i) { ++ KMD5::Digest d, d2; // judgment day ++ MD5Digest ba; ++ QMap >::iterator it; ++ quint32 fsz; ++ if (hds.atEnd()) return -43; ++ hds.readRawData(reinterpret_cast(d), 16); ++ hds >> fsz; ++ ba = MD5Digest(reinterpret_cast(d)); ++ it = wb->_hashes.insert(ba, QList()); ++ for (size_t j = 0; j < fsz; ++j) { ++ hds.readRawData(reinterpret_cast(d2), 16); ++ ba = MD5Digest(reinterpret_cast(d2)); ++ (*it).append(ba); ++ } ++ } ++ ++ // Read in the rest of the file. ++ QByteArray encrypted = db.readAll(); ++ assert(encrypted.size() < db.size()); ++ ++ BlowFish _bf; ++ CipherBlockChain bf(&_bf); ++ int blksz = bf.blockSize(); ++ if ((encrypted.size() % blksz) != 0) { ++ return -5; // invalid file structure ++ } ++ ++ bf.setKey((void *)wb->_passhash.data(), wb->_passhash.size()*8); ++ ++ if (!encrypted.data()) { ++ wb->_passhash.fill(0); ++ encrypted.fill(0); ++ return -7; // file structure error ++ } ++ ++ int rc = bf.decrypt(encrypted.data(), encrypted.size()); ++ if (rc < 0) { ++ wb->_passhash.fill(0); ++ encrypted.fill(0); ++ return -6; // decrypt error ++ } ++ ++ const char *t = encrypted.data(); ++ ++ // strip the leading data ++ t += blksz; // one block of random data ++ ++ // strip the file size off ++ long fsize = 0; ++ ++ fsize |= (long(*t) << 24) & 0xff000000; ++ t++; ++ fsize |= (long(*t) << 16) & 0x00ff0000; ++ t++; ++ fsize |= (long(*t) << 8) & 0x0000ff00; ++ t++; ++ fsize |= long(*t) & 0x000000ff; ++ t++; ++ ++ if (fsize < 0 || fsize > long(encrypted.size()) - blksz - 4) { ++ //kDebug() << "fsize: " << fsize << " encrypted.size(): " << encrypted.size() << " blksz: " << blksz; ++ encrypted.fill(0); ++ return -9; // file structure error. ++ } ++ ++ // compute the hash ourself ++ SHA1 sha; ++ sha.process(t, fsize); ++ const char *testhash = (const char *)sha.hash(); ++ ++ // compare hashes ++ int sz = encrypted.size(); ++ for (int i = 0; i < 20; i++) { ++ if (testhash[i] != encrypted[sz - 20 + i]) { ++ encrypted.fill(0); ++ sha.reset(); ++ return -8; // hash error. ++ } ++ } ++ ++ sha.reset(); ++ ++ // chop off the leading blksz+4 bytes ++ QByteArray tmpenc(encrypted.data()+blksz+4, fsize); ++ encrypted = tmpenc; ++ tmpenc.fill(0); ++ ++ // Load the data structures up ++ QDataStream eStream(encrypted); ++ ++ while (!eStream.atEnd()) { ++ QString folder; ++ quint32 n; ++ ++ eStream >> folder; ++ eStream >> n; ++ ++ // Force initialisation ++ wb->_entries[folder].clear(); ++ ++ for (size_t i = 0; i < n; ++i) { ++ QString key; ++ KWallet::Wallet::EntryType et = KWallet::Wallet::Unknown; ++ Entry *e = new Entry; ++ eStream >> key; ++ qint32 x = 0; // necessary to read properly ++ eStream >> x; ++ et = static_cast(x); ++ ++ switch (et) { ++ case KWallet::Wallet::Password: ++ case KWallet::Wallet::Stream: ++ case KWallet::Wallet::Map: ++ break; ++ default: // Unknown entry ++ delete e; ++ continue; ++ } ++ ++ QByteArray a; ++ eStream >> a; ++ e->setValue(a); ++ e->setType(et); ++ e->setKey(key); ++ wb->_entries[folder][key] = e; ++ } ++ } ++ ++ wb->_open = true; ++ encrypted.fill(0); ++ return 0; ++} ++ ++#ifdef HAVE_QGPGME ++GpgME::Error initGpgME() ++{ ++ GpgME::Error err; ++ static bool alreadyInitialized = false; ++ if (!alreadyInitialized) { ++ GpgME::initializeLibrary(); ++ err = GpgME::checkEngine(GpgME::OpenPGP); ++ if (err){ ++ kDebug() << "OpenPGP not supported!"; ++ } ++ alreadyInitialized = true; ++ } ++ return err; ++} ++ ++int GpgPersistHandler::write(Backend* wb, KSaveFile& sf, QByteArray& version, WId w) ++{ ++ version[2] = KWALLET_CIPHER_GPG; ++ version[3] = 0; ++ if (sf.write(version, 4) != 4) { ++ sf.abort(); ++ return -4; // write error ++ } ++ ++ GpgME::Error err = initGpgME(); ++ if (err) { ++ kDebug() << "initGpgME returned " << err.code(); ++ KMessageBox::errorWId( w, i18n("Error when attempting to initialize OpenPGP while attempting to save the wallet %1. Error code is %2. Please fix your system configuration, then try again!", Qt::escape(wb->_name), err.code())); ++ sf.abort(); ++ return -5; ++ } ++ ++ boost::shared_ptr< GpgME::Context > ctx( GpgME::Context::createForProtocol(GpgME::OpenPGP) ); ++ if (0 == ctx) { ++ kDebug() << "Cannot setup OpenPGP context!"; ++ KMessageBox::errorWId(w, i18n("Error when attempting to initialize OpenPGP while attempting to save the wallet %1. Please fix your system configuration, then try again!"), Qt::escape(wb->_name)); ++ return -6; ++ } ++ ++ assert(wb->_cipherType == BACKEND_CIPHER_GPG); ++ ++ QByteArray hashes; ++ QDataStream hashStream(&hashes, QIODevice::WriteOnly); ++ KMD5 md5; ++ hashStream << static_cast(wb->_entries.count()); ++ ++ QByteArray values; ++ QDataStream valueStream(&values, QIODevice::WriteOnly); ++ Backend::FolderMap::ConstIterator i = wb->_entries.constBegin(); ++ Backend::FolderMap::ConstIterator ie = wb->_entries.constEnd(); ++ for ( ; i != ie; ++i) { ++ valueStream << i.key(); ++ valueStream << static_cast(i.value().count()); ++ ++ md5.reset(); ++ md5.update(i.key().toUtf8()); ++ hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); ++ hashStream << static_cast(i.value().count()); ++ ++ Backend::EntryMap::ConstIterator j = i.value().constBegin(); ++ Backend::EntryMap::ConstIterator je = i.value().constEnd(); ++ for (; j != je; ++j) { ++ valueStream << j.key(); ++ valueStream << static_cast(j.value()->type()); ++ valueStream << j.value()->value(); ++ ++ md5.reset(); ++ md5.update(j.key().toUtf8()); ++ hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); ++ } ++ } ++ ++ QByteArray dataBuffer; ++ QDataStream dataStream(&dataBuffer, QIODevice::WriteOnly); ++ QString keyID(wb->_gpgKey.keyID()); ++ dataStream << keyID; ++ dataStream << hashes; ++ dataStream << values; ++ ++ GpgME::Data decryptedData(dataBuffer.data(), dataBuffer.size(), false); ++ GpgME::Data encryptedData; ++ std::vector< GpgME::Key > keys; ++ keys.push_back(wb->_gpgKey); ++ GpgME::EncryptionResult res = ctx->encrypt(keys, decryptedData, encryptedData, GpgME::Context::None); ++ if (res.error()){ ++ int gpgerr = res.error().code(); ++ KMessageBox::errorWId( w, i18n("Encryption error while attempting to save the wallet %1. Error code is %2 (%3). Please fix your system configuration, then try again!", ++ Qt::escape(wb->_name), gpgerr, gpgme_strerror(gpgerr))); ++ kDebug() << "GpgME encryption error: " << res.error().code(); ++ sf.abort(); ++ return -7; ++ } ++ ++ char buffer[4096]; ++ ssize_t bytes =0; ++ encryptedData.seek(0, SEEK_SET); ++ while (bytes = encryptedData.read(buffer, sizeof(buffer)/sizeof(buffer[0]))){ ++ if (sf.write(buffer, bytes) != bytes){ ++ KMessageBox::errorWId( w, i18n("File handling error while attempting to save the wallet %1. Error was %2. Please fix your system configuration, then try again!", Qt::escape(wb->_name), sf.errorString())); ++ sf.abort(); ++ return -4; // write error ++ } ++ } ++ ++ return 0; ++} ++ ++int GpgPersistHandler::read(Backend* wb, QFile& sf, WId w) ++{ ++ GpgME::Error err = initGpgME(); ++ if (err){ ++ KMessageBox::errorWId( w, i18n("Error when attempting to initialize OpenPGP while attempting to open the wallet %1. Error code is %2. Please fix your system configuration, then try again!", Qt::escape(wb->_name), err.code())); ++ return -1; ++ } ++ ++ wb->_cipherType = BACKEND_CIPHER_GPG; ++ wb->_hashes.clear(); ++ ++ // the remainder of the file is GPG encrypted. Let's decrypt it ++ GpgME::Data encryptedData; ++ char buffer[4096]; ++ ssize_t bytes = 0; ++ while (bytes = sf.read(buffer, sizeof(buffer)/sizeof(buffer[0]))){ ++ encryptedData.write(buffer, bytes); ++ } ++ ++ retry_label: ++ boost::shared_ptr< GpgME::Context > ctx( GpgME::Context::createForProtocol(GpgME::OpenPGP) ); ++ if (0 == ctx) { ++ KMessageBox::errorWId(w, i18n("Error when attempting to initialize OpenPGP while attempting to open the wallet %1. Please fix your system configuration, then try again!", Qt::escape(wb->_name))); ++ kDebug() << "Cannot setup OpenPGP context!"; ++ return -1; ++ } ++ ++ GpgME::Data decryptedData; ++ encryptedData.seek(0, SEEK_SET); ++ GpgME::DecryptionResult res = ctx->decrypt(encryptedData, decryptedData); ++ if (res.error()){ ++ kDebug() << "Error decrypting message: " << res.error().asString() << ", code " << res.error().code() << ", source " << res.error().source(); ++ KGuiItem btnRetry(i18n("Retry")); ++ // FIXME the logic here should be a little more elaborate; a dialog box should be used with "retry", "cancel", but also "troubleshoot" with options to show card status and to kill scdaemon ++ int userChoice = KMessageBox::warningYesNoWId(w, i18n("Error when attempting to decrypt the wallet %1 using GPG. If you're using a SmartCard, please ensure it's inserted then try again.

GPG error was %2
", Qt::escape(wb->_name), res.error().asString()), ++ i18n("kwalletd GPG backend"), btnRetry, KStandardGuiItem::cancel()); ++ if (userChoice == KMessageBox::Yes) { ++ decryptedData.seek(0, SEEK_SET); ++ goto retry_label; ++ } ++ return -1; ++ } ++ ++ decryptedData.seek(0, SEEK_SET); ++ QByteArray dataBuffer; ++ while (bytes = decryptedData.read(buffer, sizeof(buffer)/sizeof(buffer[0]))){ ++ dataBuffer.append(buffer, bytes); ++ } ++ ++ // load the wallet from the decrypted data ++ QDataStream dataStream(dataBuffer); ++ QString keyID; ++ QByteArray hashes; ++ QByteArray values; ++ dataStream >> keyID; ++ dataStream >> hashes; ++ dataStream >> values; ++ ++ // locate the GPG key having the ID found inside the file. This will be needed later, when writing changes to disk. ++ QDataStream fileStream(&sf); ++ fileStream.unsetDevice(); ++ kDebug() << "This wallet was encrypted using GPG key with ID " << keyID; ++ ++ ctx->setKeyListMode(GPGME_KEYLIST_MODE_LOCAL); ++ std::vector< GpgME::Key > keys; ++ int row =0; ++ err = ctx->startKeyListing(); ++ while (!err) { ++ GpgME::Key k = ctx->nextKey(err); ++ if (err) ++ break; ++ if (keyID == k.keyID()){ ++ kDebug() << "The key was found."; ++ wb->_gpgKey = k; ++ break; ++ } ++ } ++ ctx->endKeyListing(); ++ if (wb->_gpgKey.isNull()){ ++ KMessageBox::errorWId(w, i18n("Error when attempting to open the wallet %1. The wallet was encrypted using the GPG Key ID %2 but this key was not found on your system.", Qt::escape(wb->_name), keyID)); ++ return -1; ++ } ++ ++ ++ QDataStream hashStream(hashes); ++ QDataStream valueStream(values); ++ ++ quint32 hashCount; ++ hashStream >> hashCount; ++ if (hashCount > 0xFFFF) { ++ return -43; ++ } ++ ++ quint32 folderCount = hashCount; ++ while (hashCount--){ ++ KMD5::Digest d; ++ hashStream.readRawData(reinterpret_cast(d), 16); ++ ++ quint32 folderSize; ++ hashStream >> folderSize; ++ ++ MD5Digest ba = MD5Digest(reinterpret_cast(d)); ++ QMap >::iterator it = wb->_hashes.insert(ba, QList()); ++ while (folderSize--){ ++ KMD5::Digest d2; ++ hashStream.readRawData(reinterpret_cast(d2), 16); ++ ba = MD5Digest(reinterpret_cast(d2)); ++ (*it).append(ba); ++ } ++ } ++ ++ while (folderCount--){ ++ QString folder; ++ valueStream >> folder; ++ ++ quint32 entryCount; ++ valueStream >> entryCount; ++ ++ wb->_entries[folder].clear(); ++ ++ while (entryCount--){ ++ KWallet::Wallet::EntryType et = KWallet::Wallet::Unknown; ++ Entry *e = new Entry; ++ ++ QString key; ++ valueStream >> key; ++ ++ qint32 x =0; // necessary to read properly ++ valueStream >> x; ++ et = static_cast(x); ++ ++ switch (et) { ++ case KWallet::Wallet::Password: ++ case KWallet::Wallet::Stream: ++ case KWallet::Wallet::Map: ++ break; ++ default: // Unknown entry ++ delete e; ++ continue; ++ } ++ ++ QByteArray a; ++ valueStream >> a; ++ e->setValue(a); ++ e->setType(et); ++ e->setKey(key); ++ wb->_entries[folder][key] = e; ++ } ++ } ++ ++ wb->_open = true; ++ ++ return 0; ++} ++#endif // HAVE_QGPGME ++ ++} // namespace +diff -Nur kwalletd.than/backend/backendpersisthandler.h kwalletd/backend/backendpersisthandler.h +--- kwalletd.than/backend/backendpersisthandler.h 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/backend/backendpersisthandler.h 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,83 @@ ++/** ++ * This file is part of the KDE project ++ * Copyright (C) 2013 Valentin Rusu ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License version 2 as published by the Free Software Foundation. ++ * ++ * 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public License ++ * along with this library; see the file COPYING.LIB. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++#ifndef BACKENDPERSISTHANDLER_H ++#define BACKENDPERSISTHANDLER_H ++ ++#define KWMAGIC_LEN 12 ++ ++#include ++ ++class QFile; ++class KSaveFile; ++namespace KWallet { ++ ++class Backend; ++ ++enum BackendCipherType { ++ BACKEND_CIPHER_UNKNOWN, /// this is used by freshly allocated wallets ++ BACKEND_CIPHER_BLOWFISH, /// use the legacy blowfish cipher type ++#ifdef HAVE_QGPGME ++ BACKEND_CIPHER_GPG /// use GPG backend to encrypt wallet contents ++#endif // HAVE_QGPGME ++}; ++ ++ ++class BackendPersistHandler { ++protected: ++ BackendPersistHandler() {} ++public: ++ virtual ~BackendPersistHandler() {} ++ /** ++ * This is a factory method used to get an instance of the backend suitable ++ * for reading/writing using the given cipher type ++ * ++ * @param cypherType indication of the backend that should be returned ++ * @return a pointer to an instance of the requested handler type. No need to delete this pointer, it's lifetime is taken care of by this factory ++ */ ++ static BackendPersistHandler *getPersistHandler(BackendCipherType cipherType); ++ static BackendPersistHandler *getPersistHandler(char magicBuf[KWMAGIC_LEN]); ++ ++ virtual int write(Backend* wb, KSaveFile& sf, QByteArray& version, WId w) =0; ++ virtual int read(Backend* wb, QFile& sf, WId w) =0; ++}; ++ ++ ++class BlowfishPersistHandler : public BackendPersistHandler { ++public: ++ BlowfishPersistHandler() {} ++ virtual ~BlowfishPersistHandler() {} ++ ++ virtual int write(Backend* wb, KSaveFile& sf, QByteArray& version, WId w); ++ virtual int read(Backend* wb, QFile& sf, WId w); ++}; ++ ++#ifdef HAVE_QGPGME ++class GpgPersistHandler : public BackendPersistHandler { ++public: ++ GpgPersistHandler() {} ++ virtual ~GpgPersistHandler() {} ++ ++ virtual int write(Backend* wb, KSaveFile& sf, QByteArray& version, WId w); ++ virtual int read(Backend* wb, QFile& sf, WId w); ++}; ++#endif // HAVE_QGPGME ++ ++} // namespace ++ ++#endif // BACKENDPERSISTHANDLER_H +diff -Nur kwalletd.than/backend/CMakeLists.txt kwalletd/backend/CMakeLists.txt +--- kwalletd.than/backend/CMakeLists.txt 2013-06-28 19:12:33.338802909 +0200 ++++ kwalletd/backend/CMakeLists.txt 2014-02-26 09:34:12.000000000 +0100 +@@ -2,6 +2,9 @@ + + check_include_files(stdint.h HAVE_STDINT_H) + check_include_files(sys/bitypes.h HAVE_SYS_BITYPES_H) ++if (QGPGME_FOUND) ++ add_definitions(-DHAVE_QGPGME) ++endif(QGPGME_FOUND) + + configure_file (config-kwalletbackend.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kwalletbackend.h ) + +@@ -14,11 +17,15 @@ + sha1.cc + kwalletentry.cc + kwalletbackend.cc ++ backendpersisthandler.cpp + ) + + kde4_add_library(kwalletbackend SHARED ${kwalletbackend_LIB_SRCS}) + + target_link_libraries(kwalletbackend ${KDE4_KDEUI_LIBS} ) ++if(QGPGME_FOUND) ++target_link_libraries(kwalletbackend ${QGPGME_LIBRARIES} ) ++endif(QGPGME_FOUND) + + # link with advapi32 on windows + if(WIN32 AND NOT WINCE) +diff -Nur kwalletd.than/backend/kwalletbackend.cc kwalletd/backend/kwalletbackend.cc +--- kwalletd.than/backend/kwalletbackend.cc 2013-06-28 19:12:33.339802869 +0200 ++++ kwalletd/backend/kwalletbackend.cc 2014-02-26 09:34:12.000000000 +0100 +@@ -28,6 +28,10 @@ + #include + #include + #include ++#ifdef HAVE_QGPGME ++#include ++#endif ++#include + + #include + #include +@@ -48,17 +52,10 @@ + #define KWALLET_VERSION_MAJOR 0 + #define KWALLET_VERSION_MINOR 0 + +-#define KWALLET_CIPHER_BLOWFISH_CBC 0 +-#define KWALLET_CIPHER_3DES_CBC 1 // unsupported +- +-#define KWALLET_HASH_SHA1 0 +-#define KWALLET_HASH_MD5 1 // unsupported +- + + using namespace KWallet; + + #define KWMAGIC "KWALLET\n\r\0\r\n" +-#define KWMAGIC_LEN 12 + + class Backend::BackendPrivate + { +@@ -69,7 +66,7 @@ + KGlobal::dirs()->addResourceType("kwallet", 0, "share/apps/kwallet"); + } + +-Backend::Backend(const QString& name, bool isPath) : d(0), _name(name), _ref(0) { ++Backend::Backend(const QString& name, bool isPath) : d(0), _name(name), _ref(0), _cipherType(KWallet::BACKEND_CIPHER_UNKNOWN) { + initKWalletDir(); + if (isPath) { + _path = name; +@@ -88,91 +85,13 @@ + delete d; + } + +-static int getRandomBlock(QByteArray& randBlock) { +- +-#ifdef Q_OS_WIN //krazy:exclude=cpp +- +- // Use windows crypto API to get randomness on win32 +- // HACK: this should be done using qca +- HCRYPTPROV hProv; +- +- if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, +- CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) return -1; // couldn't get random data +- +- if (!CryptGenRandom(hProv, static_cast(randBlock.size()), +- (BYTE*)randBlock.data())) { +- return -3; // read error +- } +- +- // release the crypto context +- CryptReleaseContext(hProv, 0); +- +- return randBlock.size(); +- +-#else +- +- // First try /dev/urandom +- if (QFile::exists("/dev/urandom")) { +- QFile devrand("/dev/urandom"); +- if (devrand.open(QIODevice::ReadOnly)) { +- int rc = devrand.read(randBlock.data(), randBlock.size()); +- +- if (rc != randBlock.size()) { +- return -3; // not enough data read +- } +- +- return 0; +- } +- } +- +- // If that failed, try /dev/random +- // FIXME: open in noblocking mode! +- if (QFile::exists("/dev/random")) { +- QFile devrand("/dev/random"); +- if (devrand.open(QIODevice::ReadOnly)) { +- int rc = 0; +- int cnt = 0; +- +- do { +- int rc2 = devrand.read(randBlock.data() + rc, randBlock.size()); +- +- if (rc2 < 0) { +- return -3; // read error +- } +- +- rc += rc2; +- cnt++; +- if (cnt > randBlock.size()) { +- return -4; // reading forever?! +- } +- } while(rc < randBlock.size()); +- +- return 0; +- } +- } +- +- // EGD method +- QString randFilename = QString::fromLocal8Bit(qgetenv("RANDFILE")); +- if (!randFilename.isEmpty()) { +- if (QFile::exists(randFilename)) { +- QFile devrand(randFilename); +- if (devrand.open(QIODevice::ReadOnly)) { +- int rc = devrand.read(randBlock.data(), randBlock.size()); +- if (rc != randBlock.size()) { +- return -3; // not enough data read +- } +- return 0; +- } +- } +- } +- +- // Couldn't get any random data!! +- return -1; +- +-#endif ++void Backend::setCipherType(BackendCipherType ct) ++{ ++ // changing cipher type on already initialed wallets is not permitted ++ assert(_cipherType == KWallet::BACKEND_CIPHER_UNKNOWN); ++ _cipherType = ct; + } + +- + // this should be SHA-512 for release probably + static int password2hash(const QByteArray& password, QByteArray& hash) { + SHA1 sha; +@@ -309,15 +228,26 @@ + } + + +-int Backend::open(const QByteArray& password) { ++int Backend::open(const QByteArray& password, WId w) { + if (_open) { + return -255; // already open + } + + setPassword(password); +- return openInternal(); ++ return openInternal(w); + } + ++#ifdef HAVE_QGPGME ++int Backend::open(const GpgME::Key& key) ++{ ++ if (_open) { ++ return -255; // already open ++ } ++ _gpgKey = key; ++ return openInternal(); ++} ++#endif // HAVE_QGPGME ++ + int Backend::openPreHashed(const QByteArray &passwordHash) + { + if (_open) { +@@ -334,7 +264,7 @@ + return openInternal(); + } + +-int Backend::openInternal() ++int Backend::openInternal(WId w) + { + // No wallet existed. Let's create it. + // Note: 60 bytes is presently the minimum size of a wallet file. +@@ -346,8 +276,11 @@ + } + newfile.close(); + _open = true; +- sync(); +- return 1; // new file opened, but OK ++ if (sync(w)) { ++ return -2; ++ } else { ++ return 1; // new file opened, but OK ++ } + } + + QFile db(_path); +@@ -373,159 +306,15 @@ + return -4; // unknown version + } + +- if (magicBuf[2] != KWALLET_CIPHER_BLOWFISH_CBC) { +- return -42; // unknown cipher +- } +- +- if (magicBuf[3] != KWALLET_HASH_SHA1) { +- return -42; // unknown hash +- } +- +- _hashes.clear(); +- // Read in the hashes +- QDataStream hds(&db); +- quint32 n; +- hds >> n; +- if (n > 0xffff) { // sanity check +- return -43; +- } +- +- for (size_t i = 0; i < n; ++i) { +- KMD5::Digest d, d2; // judgment day +- MD5Digest ba; +- QMap >::iterator it; +- quint32 fsz; +- if (hds.atEnd()) return -43; +- hds.readRawData(reinterpret_cast(d), 16); +- hds >> fsz; +- ba = MD5Digest(reinterpret_cast(d)); +- it = _hashes.insert(ba, QList()); +- for (size_t j = 0; j < fsz; ++j) { +- hds.readRawData(reinterpret_cast(d2), 16); +- ba = MD5Digest(reinterpret_cast(d2)); +- (*it).append(ba); +- } +- } +- +- // Read in the rest of the file. +- QByteArray encrypted = db.readAll(); +- assert(encrypted.size() < db.size()); +- +- BlowFish _bf; +- CipherBlockChain bf(&_bf); +- int blksz = bf.blockSize(); +- if ((encrypted.size() % blksz) != 0) { +- return -5; // invalid file structure +- } +- +- bf.setKey((void *)_passhash.data(), _passhash.size()*8); +- +- if (!encrypted.data()) { +- _passhash.fill(0); +- encrypted.fill(0); +- return -7; // file structure error +- } +- +- int rc = bf.decrypt(encrypted.data(), encrypted.size()); +- if (rc < 0) { +- _passhash.fill(0); +- encrypted.fill(0); +- return -6; // decrypt error +- } +- +- const char *t = encrypted.data(); +- +- // strip the leading data +- t += blksz; // one block of random data +- +- // strip the file size off +- long fsize = 0; +- +- fsize |= (long(*t) << 24) & 0xff000000; +- t++; +- fsize |= (long(*t) << 16) & 0x00ff0000; +- t++; +- fsize |= (long(*t) << 8) & 0x0000ff00; +- t++; +- fsize |= long(*t) & 0x000000ff; +- t++; +- +- if (fsize < 0 || fsize > long(encrypted.size()) - blksz - 4) { +- //kDebug() << "fsize: " << fsize << " encrypted.size(): " << encrypted.size() << " blksz: " << blksz; +- encrypted.fill(0); +- return -9; // file structure error. +- } +- +- // compute the hash ourself +- SHA1 sha; +- sha.process(t, fsize); +- const char *testhash = (const char *)sha.hash(); +- +- // compare hashes +- int sz = encrypted.size(); +- for (int i = 0; i < 20; i++) { +- if (testhash[i] != encrypted[sz - 20 + i]) { +- encrypted.fill(0); +- sha.reset(); +- return -8; // hash error. +- } +- } +- +- sha.reset(); +- +- // chop off the leading blksz+4 bytes +- QByteArray tmpenc(encrypted.data()+blksz+4, fsize); +- encrypted = tmpenc; +- tmpenc.fill(0); +- +- // Load the data structures up +- QDataStream eStream(encrypted); +- +- while (!eStream.atEnd()) { +- QString folder; +- quint32 n; +- +- eStream >> folder; +- eStream >> n; +- +- // Force initialisation +- _entries[folder].clear(); +- +- for (size_t i = 0; i < n; ++i) { +- QString key; +- KWallet::Wallet::EntryType et = KWallet::Wallet::Unknown; +- Entry *e = new Entry; +- eStream >> key; +- qint32 x = 0; // necessary to read properly +- eStream >> x; +- et = static_cast(x); +- +- switch (et) { +- case KWallet::Wallet::Password: +- case KWallet::Wallet::Stream: +- case KWallet::Wallet::Map: +- break; +- default: // Unknown entry +- delete e; +- continue; +- } +- +- QByteArray a; +- eStream >> a; +- e->setValue(a); +- e->setType(et); +- e->setKey(key); +- _entries[folder][key] = e; +- } +- } +- +- _open = true; +- encrypted.fill(0); +- return 0; ++ BackendPersistHandler *phandler = BackendPersistHandler::getPersistHandler(magicBuf); ++ if (0 == phandler){ ++ return 42; // unknown cipher or hash ++ } ++ return phandler->read(this, db, w); + } + + +-int Backend::sync() { ++int Backend::sync(WId w) { + if (!_open) { + return -255; // not open yet + } +@@ -546,140 +335,27 @@ + QByteArray version(4, 0); + version[0] = KWALLET_VERSION_MAJOR; + version[1] = KWALLET_VERSION_MINOR; +- version[2] = KWALLET_CIPHER_BLOWFISH_CBC; +- version[3] = KWALLET_HASH_SHA1; +- if (sf.write(version, 4) != 4) { +- sf.abort(); +- return -4; // write error +- } +- +- // Holds the hashes we write out +- QByteArray hashes; +- QDataStream hashStream(&hashes, QIODevice::WriteOnly); +- KMD5 md5; +- hashStream << static_cast(_entries.count()); +- +- // Holds decrypted data prior to encryption +- QByteArray decrypted; +- +- // FIXME: we should estimate the amount of data we will write in each +- // buffer and resize them approximately in order to avoid extra +- // resizes. +- +- // populate decrypted +- QDataStream dStream(&decrypted, QIODevice::WriteOnly); +- for (FolderMap::ConstIterator i = _entries.constBegin(); i != _entries.constEnd(); ++i) { +- dStream << i.key(); +- dStream << static_cast(i.value().count()); +- +- md5.reset(); +- md5.update(i.key().toUtf8()); +- hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); +- hashStream << static_cast(i.value().count()); +- +- for (EntryMap::ConstIterator j = i.value().constBegin(); j != i.value().constEnd(); ++j) { +- dStream << j.key(); +- dStream << static_cast(j.value()->type()); +- dStream << j.value()->value(); +- +- md5.reset(); +- md5.update(j.key().toUtf8()); +- hashStream.writeRawData(reinterpret_cast(&(md5.rawDigest()[0])), 16); +- } +- } +- +- if (sf.write(hashes, hashes.size()) != hashes.size()) { +- sf.abort(); +- return -4; // write error +- } +- +- // calculate the hash of the file +- SHA1 sha; +- BlowFish _bf; +- CipherBlockChain bf(&_bf); + +- sha.process(decrypted.data(), decrypted.size()); +- +- // prepend and append the random data +- QByteArray wholeFile; +- long blksz = bf.blockSize(); +- long newsize = decrypted.size() + +- blksz + // encrypted block +- 4 + // file size +- 20; // size of the SHA hash +- +- int delta = (blksz - (newsize % blksz)); +- newsize += delta; +- wholeFile.resize(newsize); +- +- QByteArray randBlock; +- randBlock.resize(blksz+delta); +- if (getRandomBlock(randBlock) < 0) { +- sha.reset(); +- decrypted.fill(0); +- sf.abort(); +- return -3; // Fatal error: can't get random +- } +- +- for (int i = 0; i < blksz; i++) { +- wholeFile[i] = randBlock[i]; +- } +- +- for (int i = 0; i < 4; i++) { +- wholeFile[(int)(i+blksz)] = (decrypted.size() >> 8*(3-i))&0xff; +- } +- +- for (int i = 0; i < decrypted.size(); i++) { +- wholeFile[(int)(i+blksz+4)] = decrypted[i]; +- } +- +- for (int i = 0; i < delta; i++) { +- wholeFile[(int)(i+blksz+4+decrypted.size())] = randBlock[(int)(i+blksz)]; +- } +- +- const char *hash = (const char *)sha.hash(); +- for (int i = 0; i < 20; i++) { +- wholeFile[(int)(newsize - 20 + i)] = hash[i]; +- } +- +- sha.reset(); +- decrypted.fill(0); +- +- // encrypt the data +- if (!bf.setKey(_passhash.data(), _passhash.size() * 8)) { +- wholeFile.fill(0); +- sf.abort(); +- return -2; // encrypt error +- } +- +- int rc = bf.encrypt(wholeFile.data(), wholeFile.size()); +- if (rc < 0) { +- wholeFile.fill(0); +- sf.abort(); +- return -2; // encrypt error +- } +- +- // write the file +- if (sf.write(wholeFile, wholeFile.size()) != wholeFile.size()) { +- wholeFile.fill(0); +- sf.abort(); +- return -4; // write error +- } +- if (!sf.finalize()) { +- wholeFile.fill(0); +- return -4; // write error +- } +- +- wholeFile.fill(0); +- +- return 0; ++ BackendPersistHandler *phandler = BackendPersistHandler::getPersistHandler(_cipherType); ++ if (0 == phandler) { ++ return -4; // write error ++ } ++ int rc = phandler->write(this, sf, version, w); ++ if (rc<0) { ++ // Oops! wallet file sync filed! Display a notification about that ++ // TODO: change kwalletd status flags, when status flags will be implemented ++ KNotification *notification = new KNotification( "syncFailed" ); ++ notification->setText( i18n("Failed to sync wallet %1 to disk. Error codes are:\nRC %2\nSF %3. Please file a BUG report using this information to bugs.kde.org").arg(_name).arg(rc).arg(sf.errorString()) ); ++ notification->sendEvent(); ++ } ++ return rc; + } + + + int Backend::close(bool save) { + // save if requested + if (save) { +- int rc = sync(); ++ int rc = sync(0); + if (rc != 0) { + return rc; + } +@@ -902,3 +578,8 @@ + password2hash(password, _passhash); + } + ++#ifdef HAVE_QGPGME ++const GpgME::Key &Backend::gpgKey() const { ++ return _gpgKey; ++} ++#endif +diff -Nur kwalletd.than/backend/kwalletbackend.h kwalletd/backend/kwalletbackend.h +--- kwalletd.than/backend/kwalletbackend.h 2013-06-28 19:12:33.339802869 +0200 ++++ kwalletd/backend/kwalletbackend.h 2014-02-26 09:34:12.000000000 +0100 +@@ -28,7 +28,11 @@ + #include + #include + #include "kwalletentry.h" ++#include "backendpersisthandler.h" + ++#ifdef HAVE_QGPGME ++#include ++#endif // HAVE_QGPGME + + namespace KWallet { + +@@ -70,7 +74,10 @@ + // Open and unlock the wallet. + // If opening succeeds, the password's hash will be remembered. + // If opening fails, the password's hash will be cleared. +- int open(const QByteArray& password); ++ int open(const QByteArray& password, WId w=0); ++#ifdef HAVE_QGPGME ++ int open(const GpgME::Key& key); ++#endif + + // Open and unlock the wallet using a pre-hashed password. + // If opening succeeds, the password's hash will be remembered. +@@ -82,7 +89,7 @@ + int close(bool save = false); + + // Write the wallet to disk +- int sync(); ++ int sync(WId w); + + // Returns true if the current wallet is open. + bool isOpen() const; +@@ -148,6 +155,12 @@ + + static QString openRCToString(int rc); + ++ void setCipherType(BackendCipherType ct); ++ BackendCipherType cipherType() const { return _cipherType; } ++#ifdef HAVE_QGPGME ++ const GpgME::Key &gpgKey() const; ++#endif ++ + private: + Q_DISABLE_COPY( Backend ) + class BackendPrivate; +@@ -163,11 +176,18 @@ + FolderMap _entries; + typedef QMap > HashMap; + HashMap _hashes; +- QByteArray _passhash; // password hash used for saving the wallet ++ QByteArray _passhash; // password hash used for saving the wallet ++ BackendCipherType _cipherType; // the kind of encryption used for this wallet ++#ifdef HAVE_QGPGME ++ GpgME::Key _gpgKey; ++#endif ++ friend class BlowfishPersistHandler; ++ friend class GpgPersistHandler; + + // open the wallet with the password already set. This is + // called internally by both open and openPreHashed. +- int openInternal(); ++ int openInternal(WId w=0); ++ + }; + + } +diff -Nur kwalletd.than/CMakeLists.txt kwalletd/CMakeLists.txt +--- kwalletd.than/CMakeLists.txt 2013-06-28 19:12:33.338802909 +0200 ++++ kwalletd/CMakeLists.txt 2014-02-26 09:34:12.000000000 +0100 +@@ -1,5 +1,17 @@ + project(kwalletd) + ++########### find needed packages ###### ++find_package(Gpgme) # Called by FindQGpgme, but since we call some gpgme ++ # functions ourselves we need to link against it directly. ++find_package(QGpgme) # provided by kdepimlibs ++ ++if (GPGME_FOUND AND QGPGME_FOUND) ++ add_definitions(-DHAVE_QGPGME) ++ include_directories(${GPGME_INCLUDES} ${QGPGME_INCLUDE_DIR}) ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}") ++endif(GPGME_FOUND AND QGPGME_FOUND) ++ ++########### build backends ######### + add_subdirectory(backend) + + ########### kwalletd ############### +@@ -12,13 +24,11 @@ + main.cpp + kbetterthankdialog.cpp + kwalletd.cpp +- kwalletopenloop.cpp + kwalletwizard.cpp + ktimeout.cpp + kwalletsessionstore.cpp + ) + +- + kde4_add_ui_files(kwalletd_KDEINIT_SRCS + kbetterthankdialogbase.ui + kwalletwizardpageexplanation.ui +@@ -27,13 +37,30 @@ + kwalletwizardpagepassword.ui + ) + ++if (GPGME_FOUND AND QGPGME_FOUND) ++ set(kwalletd_KDEINIT_SRCS ++ ${kwalletd_KDEINIT_SRCS} ++ knewwalletdialog.cpp ++ ) ++ kde4_add_ui_files(kwalletd_KDEINIT_SRCS ++ kwalletwizardpagepasswordgpg.ui ++ kwalletwizardpagegpgkey.ui ++ knewwalletdialogintro.ui ++ knewwalletdialoggpg.ui ++ ) ++endif(GPGME_FOUND AND QGPGME_FOUND) ++ + find_file(kwallet_xml org.kde.KWallet.xml HINTS ${KDE4_DBUS_INTERFACES_DIR} ) + + qt4_add_dbus_adaptor( kwalletd_KDEINIT_SRCS ${kwallet_xml} kwalletd.h KWalletD ) + + kde4_add_kdeinit_executable( kwalletd NOGUI ${kwalletd_KDEINIT_SRCS} ) + +-target_link_libraries(kdeinit_kwalletd ${KDE4_KDEUI_LIBS} kwalletbackend ) ++target_link_libraries(kdeinit_kwalletd ${KDE4_KDEUI_LIBS} kwalletbackend ) ++if (GPGME_FOUND AND QGPGME_FOUND) ++ target_link_libraries(kdeinit_kwalletd ${QGPGME_LIBRARIES} ) ++endif(GPGME_FOUND AND QGPGME_FOUND) ++ + install(TARGETS kdeinit_kwalletd ${INSTALL_TARGETS_DEFAULT_ARGS}) + + target_link_libraries(kwalletd kdeinit_kwalletd) +@@ -45,3 +72,4 @@ + install( FILES kwalletd.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kwalletd ) + + add_subdirectory(tests) ++ +diff -Nur kwalletd.than/knewwalletdialog.cpp kwalletd/knewwalletdialog.cpp +--- kwalletd.than/knewwalletdialog.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/knewwalletdialog.cpp 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,186 @@ ++/** ++ * This file is part of the KDE project ++ * Copyright (C) 2013 Valentin Rusu ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License version 2 as published by the Free Software Foundation. ++ * ++ * 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public License ++ * along with this library; see the file COPYING.LIB. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#include "knewwalletdialog.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++Q_DECLARE_METATYPE(GpgME::Key) ++ ++namespace KWallet { ++ ++KNewWalletDialog::KNewWalletDialog(const QString &appName, const QString &walletName, QWidget* parent): ++ QWizard(parent), _intro(0), _introId(0), _gpg(0), _gpgId(0) ++{ ++ setOption(HaveFinishButtonOnEarlyPages); ++ _intro = new KNewWalletDialogIntro(appName, walletName, this); ++ _introId = addPage(_intro); ++ ++ _gpg = new KNewWalletDialogGpg(appName, walletName, this); ++ _gpgId = addPage(_gpg); ++} ++ ++bool KNewWalletDialog::isBlowfish() const ++{ ++ return _intro->isBlowfish(); ++} ++ ++GpgME::Key KNewWalletDialog::gpgKey() const ++{ ++ QVariant varKey = field("key"); ++ return varKey.value< GpgME::Key >(); ++} ++ ++KNewWalletDialogIntro::KNewWalletDialogIntro(const QString& appName, const QString& walletName, QWidget* parent): QWizardPage(parent) ++{ ++ _ui.setupUi(this); ++ if (appName.isEmpty()){ ++ _ui.labelIntro->setText(i18n("KDE has requested to create a new wallet named '%1'. This is used to store sensitive data in a secure fashion. Please choose the new wallet's type below or click cancel to deny the application's request.", Qt::escape(walletName))); ++ } else { ++ _ui.labelIntro->setText(i18n("The application '%1' has requested to create a new wallet named '%2'. This is used to store sensitive data in a secure fashion. Please choose the new wallet's type below or click cancel to deny the application's request.", Qt::escape(appName), Qt::escape(walletName))); ++ } ++} ++ ++void KNewWalletDialogIntro::onBlowfishToggled(bool blowfish) ++{ ++ setFinalPage(blowfish); ++} ++ ++ ++bool KNewWalletDialogIntro::isBlowfish() const ++{ ++ return _ui.radioBlowfish->isChecked(); ++} ++ ++int KNewWalletDialogIntro::nextId() const ++{ ++ if (isBlowfish()){ ++ return -1; ++ } else { ++ return qobject_cast< const KNewWalletDialog* >(wizard())->gpgId(); ++ } ++} ++ ++KNewWalletDialogGpg::KNewWalletDialogGpg(const QString& appName, const QString& walletName, QWidget* parent): ++ QWizardPage(parent), _alreadyInitialized(false), _complete(false) ++{ ++ _ui.setupUi(this); ++} ++ ++struct AddKeyToList { ++ QTableWidget *_list; ++ int _row; ++ AddKeyToList(QTableWidget *list) : _list(list), _row(0) {} ++ void operator()( const GpgME::Key &k) { ++ GpgME::UserID uid = k.userID(0); ++ QString name(uid.name()); ++ if (uid.comment()){ ++ name = QString("%1 (%2)").arg(name).arg(uid.comment()); ++ } ++ _list->setItem(_row, 0, new QTableWidgetItem(name)); ++ _list->setItem(_row, 1, new QTableWidgetItem(uid.email())); ++ _list->setItem(_row, 2, new QTableWidgetItem(k.shortKeyID())); ++ QVariant varKey; ++ varKey.setValue(k); ++ _list->item(_row, 0)->setData(Qt::UserRole, varKey); ++ ++_row; ++ } ++}; ++ ++void KNewWalletDialogGpg::initializePage() ++{ ++ if (_alreadyInitialized) ++ return; ++ ++ registerField("key", this); ++ ++ GpgME::initializeLibrary(); ++ GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP); ++ if (err){ ++ kDebug() << "OpenPGP not supported on your system!"; ++ KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); ++ emit completeChanged(); ++ return; ++ } ++ boost::shared_ptr< GpgME::Context > _ctx( GpgME::Context::createForProtocol(GpgME::OpenPGP) ); ++ if (0 == _ctx) { ++ KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); ++ emit completeChanged(); ++ return; ++ } ++ _ctx->setKeyListMode(GpgME::Local); ++ ++ std::vector< GpgME::Key > keys; ++ int row =0; ++ err = _ctx->startKeyListing(); ++ while (!err) { ++ GpgME::Key k = _ctx->nextKey(err); ++ if (err) ++ break; ++ if (!k.isInvalid() && k.canEncrypt()) { ++ keys.push_back(k); ++ } ++ } ++ _ctx->endKeyListing(); ++ ++ if (keys.size() == 0) { ++ KMessageBox::error(this, i18n("Seems that your system has no keys suitable for encryption. Please set-up at least an encryption key, then try again.")); ++ emit completeChanged(); ++ return; ++ } ++ ++ _ui.listCertificates->setRowCount(keys.size()); ++ std::for_each(keys.begin(), keys.end(), AddKeyToList(_ui.listCertificates)); ++ _ui.listCertificates->resizeColumnsToContents(); ++ _ui.listCertificates->setCurrentCell(0, 0); ++ ++ _alreadyInitialized = true; ++} ++ ++void KNewWalletDialogGpg::onItemSelectionChanged() ++{ ++ _complete = _ui.listCertificates->currentRow() >= 0; ++ QVariant varKey = _ui.listCertificates->item(_ui.listCertificates->currentRow(), 0)->data(Qt::UserRole); ++ setField("key", varKey); ++ emit completeChanged(); ++} ++ ++bool KNewWalletDialogGpg::isComplete() const ++{ ++ return _complete; ++} ++ ++bool KNewWalletDialogGpg::validateCurrentPage() ++{ ++ return false; ++} ++ ++ ++} // namespace ++#include "moc_knewwalletdialog.cpp" +diff -Nur kwalletd.than/knewwalletdialoggpg.ui kwalletd/knewwalletdialoggpg.ui +--- kwalletd.than/knewwalletdialoggpg.ui 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/knewwalletdialoggpg.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,91 @@ ++ ++ ++ KNewWalletDialogGpg ++ ++ ++ ++ 0 ++ 0 ++ 400 ++ 300 ++ ++ ++ ++ ++ ++ ++ Please select the signing key from the list below: ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ false ++ ++ ++ QAbstractItemView::SelectRows ++ ++ ++ false ++ ++ ++ 3 ++ ++ ++ true ++ ++ ++ true ++ ++ ++ false ++ ++ ++ false ++ ++ ++ ++ Name ++ ++ ++ ++ ++ E-Mail ++ ++ ++ ++ ++ Key-ID ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ listCertificates ++ itemSelectionChanged() ++ KNewWalletDialogGpg ++ onItemSelectionChanged() ++ ++ ++ 48 ++ 89 ++ ++ ++ 0 ++ 81 ++ ++ ++ ++ ++ ++ onItemSelectionChanged() ++ ++ +diff -Nur kwalletd.than/knewwalletdialog.h kwalletd/knewwalletdialog.h +--- kwalletd.than/knewwalletdialog.h 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/knewwalletdialog.h 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,81 @@ ++/** ++ * This file is part of the KDE project ++ * Copyright (C) 2013 Valentin Rusu ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License version 2 as published by the Free Software Foundation. ++ * ++ * 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public License ++ * along with this library; see the file COPYING.LIB. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++#ifndef KNEWWALLETDIALOG_H ++#define KNEWWALLETDIALOG_H ++ ++#include ++ ++#include "ui_knewwalletdialogintro.h" ++#include "ui_knewwalletdialoggpg.h" ++#include ++ ++namespace GpgME { ++class Key; ++} ++ ++namespace KWallet { ++ ++class KNewWalletDialogIntro; ++class KNewWalletDialogGpg; ++ ++class KNewWalletDialog : public QWizard { ++ Q_OBJECT ++public: ++ KNewWalletDialog(const QString &appName, const QString &walletName, QWidget* parent = 0); ++ ++ bool isBlowfish() const; ++ int gpgId() const { return _gpgId; } ++ GpgME::Key gpgKey() const; ++private: ++ KNewWalletDialogIntro *_intro; ++ int _introId; ++ KNewWalletDialogGpg *_gpg; ++ int _gpgId; ++}; ++ ++class KNewWalletDialogIntro : public QWizardPage { ++ Q_OBJECT ++public: ++ KNewWalletDialogIntro(const QString &appName, const QString &walletName, QWidget* parent = 0); ++ bool isBlowfish() const; ++ virtual int nextId() const; ++protected Q_SLOTS: ++ void onBlowfishToggled(bool); ++private: ++ Ui_KNewWalletDialogIntro _ui; ++}; ++ ++class KNewWalletDialogGpg : public QWizardPage { ++ Q_OBJECT ++public: ++ KNewWalletDialogGpg(const QString &appName, const QString &walletName, QWidget* parent = 0); ++ virtual void initializePage(); ++ virtual bool isComplete() const; ++ virtual bool validateCurrentPage(); ++protected Q_SLOTS: ++ void onItemSelectionChanged(); ++private: ++ bool _alreadyInitialized; ++ Ui_KNewWalletDialogGpg _ui; ++ bool _complete; ++}; ++ ++} // namespace ++ ++#endif // KNEWWALLETDIALOG_H +diff -Nur kwalletd.than/knewwalletdialogintro.ui kwalletd/knewwalletdialogintro.ui +--- kwalletd.than/knewwalletdialogintro.ui 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/knewwalletdialogintro.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,128 @@ ++ ++ ++ KNewWalletDialogIntro ++ ++ ++ ++ 0 ++ 0 ++ 341 ++ 190 ++ ++ ++ ++ ++ ++ ++ The KDE Wallet System ++ ++ ++ ++ ++ ++ ++ ++ 0 ++ 0 ++ ++ ++ ++ <html><head/><body><p>The application '<span style=" font-weight:600;">%1</span>' has requested to open the KDE wallet. This is used to store sensitive data in a secure fashion. Please choose the new wallet's type below or click cancel to deny the application's request.</p></body></html> ++ ++ ++ Qt::RichText ++ ++ ++ Qt::AlignVCenter ++ ++ ++ true ++ ++ ++ 12 ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::Horizontal ++ ++ ++ ++ 40 ++ 20 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Classic, blowfish encrypted file ++ ++ ++ ++ ++ ++ ++ Use GPG encryption, for better protection ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::Horizontal ++ ++ ++ ++ 40 ++ 20 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KTitleWidget ++ QWidget ++
ktitlewidget.h
++
++
++ ++ ++ ++ radioBlowfish ++ toggled(bool) ++ KNewWalletDialogIntro ++ onBlowfishToggled(bool) ++ ++ ++ 31 ++ 144 ++ ++ ++ 2 ++ 138 ++ ++ ++ ++ ++ ++ onBlowfishToggled(bool) ++ ++
+diff -Nur kwalletd.than/kwalletd.cpp kwalletd/kwalletd.cpp +--- kwalletd.than/kwalletd.cpp 2013-06-28 19:12:33.340802830 +0200 ++++ kwalletd/kwalletd.cpp 2014-02-26 09:34:12.000000000 +0100 +@@ -27,6 +27,10 @@ + #include "kbetterthankdialog.h" + #include "kwalletwizard.h" + ++#ifdef HAVE_QGPGME ++#include "knewwalletdialog.h" ++#endif ++ + #include + #include + #include +@@ -45,6 +49,9 @@ + #include + #include + #include ++#ifdef HAVE_QGPGME ++#include ++#endif + + #include + #include // Qt::escape +@@ -55,13 +62,12 @@ + #include + + #include "kwalletadaptor.h" +-#include "kwalletopenloop.h" + + class KWalletTransaction { + + public: +- KWalletTransaction() +- : tType(Unknown), cancelled(false), tId(nextTransactionId) ++ explicit KWalletTransaction(QDBusConnection conn) ++ : tType(Unknown), cancelled(false), tId(nextTransactionId), res(-1), connection(conn) + { + nextTransactionId++; + // make sure the id is never < 0 as that's used for the +@@ -90,6 +96,9 @@ + bool modal; + bool isPath; + int tId; // transaction id ++ int res; ++ QDBusMessage message; ++ QDBusConnection connection; + + private: + static int nextTransactionId; +@@ -98,7 +107,10 @@ + int KWalletTransaction::nextTransactionId = 0; + + KWalletD::KWalletD() +- : QObject(0), _failed(0), _syncTime(5000), _curtrans(0) { ++ : QObject(0), _failed(0), _syncTime(5000), _curtrans(0), _useGpg(false) { ++#ifdef HAVE_QGPGME ++ _useGpg = true; ++#endif + + srand(time(0)); + _showingFailureNotify = false; +@@ -113,7 +125,7 @@ + QDBusConnection::sessionBus().registerObject(QLatin1String("/modules/kwalletd"), this); + + #ifdef Q_WS_X11 +- screensaver = new QDBusInterface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver"); ++ screensaver = 0; + #endif + + reconfigure(); +@@ -138,6 +150,20 @@ + qDeleteAll(_transactions); + } + ++#ifdef Q_WS_X11 ++void KWalletD::connectToScreenSaver() ++{ ++ screensaver = new QDBusInterface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver"); ++ if (!screensaver->isValid()) { ++ kDebug() << "Service org.freedesktop.ScreenSaver not found. Retrying in 10 seconds..."; ++ // keep attempting every 10 seconds ++ QTimer::singleShot(10000, this, SLOT(connectToScreenSaver())); ++ } else { ++ connect(screensaver, SIGNAL(ActiveChanged(bool)), SLOT(screenSaverChanged(bool))); ++ kDebug() << "connected to screen saver service."; ++ } ++} ++#endif + + int KWalletD::generateHandle() { + int rc; +@@ -198,7 +224,7 @@ + } else if (_curtrans->cancelled) { + // the wallet opened successfully but the application + // opening exited/crashed while the dialog was still shown. +- KWalletTransaction *_xact = new KWalletTransaction(); ++ KWalletTransaction *_xact = new KWalletTransaction(_curtrans->connection); + _xact->tType = KWalletTransaction::CloseCancelled; + _xact->appid = _curtrans->appid; + _xact->wallet = _curtrans->wallet; +@@ -207,11 +233,13 @@ + } + + // emit the AsyncOpened signal as a reply ++ _curtrans->res = res; + emit walletAsyncOpened(_curtrans->tId, res); + break; + + case KWalletTransaction::OpenFail: + // emit the AsyncOpened signal with an invalid handle ++ _curtrans->res = -1; + emit walletAsyncOpened(_curtrans->tId, -1); + break; + +@@ -230,6 +258,15 @@ + break; + } + ++ // send delayed dbus message reply to the caller ++ if (_curtrans->message.type() != QDBusMessage::InvalidMessage) { ++ if (_curtrans->connection.isConnected()) { ++ QDBusMessage reply = _curtrans->message.createReply(); ++ reply << _curtrans->res; ++ _curtrans->connection.send(reply); ++ } ++ } ++ + delete _curtrans; + _curtrans = 0; + } +@@ -237,28 +274,45 @@ + _processing = false; + } + +- +- + int KWalletD::openPath(const QString& path, qlonglong wId, const QString& appid) { + int tId = openPathAsync(path, wId, appid, false); + if (tId < 0) { + return tId; + } + ++ // NOTE the real return value will be sent by the dbusmessage delayed reply ++ return 0; + // wait for the open-transaction to be processed +- KWalletOpenLoop loop(this); +- return loop.waitForAsyncOpen(tId); ++// KWalletOpenLoop loop(this); ++// return loop.waitForAsyncOpen(tId); + } + + int KWalletD::open(const QString& wallet, qlonglong wId, const QString& appid) { +- int tId = openAsync(wallet, wId, appid, false); +- if (tId < 0) { +- return tId; +- } +- +- // wait for the open-transaction to be processed +- KWalletOpenLoop loop(this); +- return loop.waitForAsyncOpen(tId); ++ if (!_enabled) { // guard ++ return -1; ++ } ++ ++ if (!QRegExp("^[\\w\\^\\&\\'\\@\\{\\}\\[\\]\\,\\$\\=\\!\\-\\#\\(\\)\\%\\.\\+\\_\\s]+$").exactMatch(wallet)) { ++ return -1; ++ } ++ ++ KWalletTransaction *xact = new KWalletTransaction(connection()); ++ _transactions.append(xact); ++ ++ message().setDelayedReply(true); ++ xact->message = message(); ++ ++ xact->appid = appid; ++ xact->wallet = wallet; ++ xact->wId = wId; ++ xact->modal = true; // mark dialogs as modal, the app has blocking wait ++ xact->tType = KWalletTransaction::Open; ++ xact->isPath = false; ++ ++ QTimer::singleShot(0, this, SLOT(processTransactions())); ++ checkActiveDialog(); ++ // NOTE the real return value will be sent by the dbusmessage delayed reply ++ return 0; + } + + int KWalletD::openAsync(const QString& wallet, qlonglong wId, const QString& appid, +@@ -271,8 +325,8 @@ + return -1; + } + +- KWalletTransaction *xact = new KWalletTransaction; +- _transactions.append(xact); ++ KWalletTransaction *xact = new KWalletTransaction(connection()); ++ _transactions.append(xact); + + xact->appid = appid; + xact->wallet = wallet; +@@ -298,8 +352,8 @@ + return -1; + } + +- KWalletTransaction *xact = new KWalletTransaction; +- _transactions.append(xact); ++ KWalletTransaction *xact = new KWalletTransaction(connection()); ++ _transactions.append(xact); + + xact->appid = appid; + xact->wallet = path; +@@ -365,6 +419,7 @@ + qlonglong wId, bool modal, const QString& service) { + if (_firstUse && !wallets().contains(KWallet::Wallet::LocalWallet()) && !isPath) { + // First use wizard ++ // TODO GPG adjust new smartcard options gathered by the wizard + QPointer wiz = new KWalletWizard(0); + wiz->setWindowTitle(i18n("KDE Wallet Service")); + setupDialog( wiz, (WId)wId, appid, modal ); +@@ -386,11 +441,23 @@ + } + + // Create the wallet ++ // TODO GPG select the correct wallet type upon cretion (GPG or blowfish based) + KWallet::Backend *b = new KWallet::Backend(KWallet::Wallet::LocalWallet()); +- QString pass = wiz->field("pass1").toString(); +- QByteArray p(pass.toUtf8(), pass.length()); +- b->open(p); +- p.fill(0); ++#ifdef HAVE_QGPGME ++ if (wiz->field("useBlowfish").toBool()) { ++ b->setCipherType(KWallet::BACKEND_CIPHER_BLOWFISH); ++#endif ++ QString pass = wiz->field("pass1").toString(); ++ QByteArray p(pass.toUtf8(), pass.length()); ++ b->open(p); ++ p.fill(0); ++#ifdef HAVE_QGPGME ++ } else { ++ assert(wiz->field("useGpg").toBool()); ++ b->setCipherType(KWallet::BACKEND_CIPHER_GPG); ++ b->open(wiz->gpgKey()); ++ } ++#endif + b->createFolder(KWallet::Wallet::PasswordFolder()); + b->createFolder(KWallet::Wallet::FormDataFolder()); + b->close(true); +@@ -439,7 +506,20 @@ + QString password; + bool emptyPass = false; + if ((isPath && QFile::exists(wallet)) || (!isPath && KWallet::Backend::exists(wallet))) { +- int pwless = b->open(QByteArray()); ++ // this open attempt will set wallet type from the file header, even if password is needed ++ int pwless = b->open(QByteArray(), w); ++#ifdef HAVE_QGPGME ++ assert(b->cipherType() != KWallet::BACKEND_CIPHER_UNKNOWN); ++ if (b->cipherType() == KWallet::BACKEND_CIPHER_GPG) { ++ // GPG based wallets do not prompt for password here. Instead, GPG should already have popped pinentry utility for wallet decryption ++ if (!b->isOpen()){ ++ // for some reason, GPG operation failed ++ delete b; ++ return -1; ++ } ++ emptyPass = true; ++ } else { ++#endif + if (0 != pwless || !b->isOpen()) { + if (pwless == 0) { + // release, start anew +@@ -500,7 +580,33 @@ + } else { + emptyPass = true; + } ++#ifdef HAVE_QGPGME ++ } ++#endif + } else { ++ brandNew = true; ++#ifdef HAVE_QGPGME ++ // prompt the user for the new wallet format here ++ KWallet::BackendCipherType newWalletType = KWallet::BACKEND_CIPHER_UNKNOWN; ++ ++ boost::shared_ptr newWalletDlg( new KWallet::KNewWalletDialog(appid, wallet, QWidget::find(w))); ++ GpgME::Key gpgKey; ++ setupDialog( newWalletDlg.get(), (WId)w, appid, true ); ++ if (newWalletDlg->exec() == QDialog::Accepted) { ++ newWalletType = newWalletDlg->isBlowfish() ? KWallet::BACKEND_CIPHER_BLOWFISH : KWallet::BACKEND_CIPHER_GPG; ++ gpgKey = newWalletDlg->gpgKey(); ++ } else { ++ // user cancelled the dialog box ++ delete b; ++ return -1; ++ } ++ ++ if (newWalletType == KWallet::BACKEND_CIPHER_GPG) { ++ b->setCipherType(newWalletType); ++ b->open(gpgKey); ++ } else if (newWalletType == KWallet::BACKEND_CIPHER_BLOWFISH) { ++#endif // HAVE_QGPGME ++ b->setCipherType(KWallet::BACKEND_CIPHER_BLOWFISH); + KNewPasswordDialog *kpd = new KNewPasswordDialog(); + if (wallet == KWallet::Wallet::LocalWallet() || + wallet == KWallet::Wallet::NetworkWallet()) +@@ -518,7 +624,6 @@ + kpd->setPrompt(i18n("The application '%1' has requested to create a new wallet named '%2'. Please choose a password for this wallet, or cancel to deny the application's request.", Qt::escape(appid), Qt::escape(wallet))); + } + } +- brandNew = true; + kpd->setCaption(i18n("KDE Wallet Service")); + kpd->setButtonGuiItem(KDialog::Ok,KGuiItem(i18n("C&reate"),"document-new")); + kpd->setPixmap(KIcon("kwalletmanager").pixmap(96, 96)); +@@ -535,16 +640,19 @@ + } + } + delete kpd; ++#ifdef HAVE_QGPGME ++ } ++#endif + } + +- +- +- if (!emptyPass && (password.isNull() || !b->isOpen())) { ++ ++ if ((b->cipherType() == KWallet::BACKEND_CIPHER_BLOWFISH) && ++ !emptyPass && (password.isNull() || !b->isOpen())) { + delete b; + return -1; + } + +- if (emptyPass && _openPrompt && !isAuthorizedApp(appid, wallet, w)) { ++ if (emptyPass && !isAuthorizedApp(appid, wallet, w)) { + delete b; + return -1; + } +@@ -598,6 +706,10 @@ + + + bool KWalletD::isAuthorizedApp(const QString& appid, const QString& wallet, WId w) { ++ if (!_openPrompt) { ++ return true; ++ } ++ + int response = 0; + + QString thisApp; +@@ -655,6 +767,7 @@ + + + int KWalletD::deleteWallet(const QString& wallet) { ++ int result = -1; + QString path = KGlobal::dirs()->saveLocation("kwallet") + QDir::separator() + wallet + ".kwl"; + + if (QFile::exists(path)) { +@@ -662,17 +775,27 @@ + internalClose(walletInfo.second, walletInfo.first, true); + QFile::remove(path); + emit walletDeleted(wallet); +- return 0; ++ // also delete access control entries ++ KConfigGroup cfgAllow = KSharedConfig::openConfig("kwalletrc")->group("Auto Allow"); ++ cfgAllow.deleteEntry(wallet); ++ ++ KConfigGroup cfgDeny = KSharedConfig::openConfig("kwalletrc")->group("Auto Deny"); ++ cfgDeny.deleteEntry(wallet); ++ ++ result = 0; + } + +- return -1; ++ return result; + } + + + void KWalletD::changePassword(const QString& wallet, qlonglong wId, const QString& appid) { +- KWalletTransaction *xact = new KWalletTransaction; ++ KWalletTransaction *xact = new KWalletTransaction(connection()); ++ ++ message().setDelayedReply(true); ++ xact->message = message(); ++ // TODO GPG this shouldn't be allowed on a GPG managed wallet; a warning should be displayed about this + +- //msg.setDelayedReply(true); + xact->appid = appid; + xact->wallet = wallet; + xact->wId = wId; +@@ -712,30 +835,40 @@ + + assert(w); + +- QPointer kpd = new KNewPasswordDialog(); +- kpd->setPrompt(i18n("Please choose a new password for the wallet '%1'.", Qt::escape(wallet))); +- kpd->setCaption(i18n("KDE Wallet Service")); +- kpd->setAllowEmptyPasswords(true); +- setupDialog( kpd, (WId)wId, appid, false ); +- if (kpd->exec() == KDialog::Accepted && kpd) { +- QString p = kpd->password(); +- if (!p.isNull()) { +- w->setPassword(p.toUtf8()); +- int rc = w->close(true); +- if (rc < 0) { +- KMessageBox::sorryWId((WId)wId, i18n("Error re-encrypting the wallet. Password was not changed."), i18n("KDE Wallet Service")); +- reclose = true; +- } else { +- rc = w->open(p.toUtf8()); +- if (rc < 0) { +- KMessageBox::sorryWId((WId)wId, i18n("Error reopening the wallet. Data may be lost."), i18n("KDE Wallet Service")); +- reclose = true; +- } +- } +- } +- } ++#ifdef HAVE_QGPGME ++ if (w->cipherType() == KWallet::BACKEND_CIPHER_GPG) { ++ QString keyID = w->gpgKey().shortKeyID(); ++ assert(!keyID.isNull()); ++ KMessageBox::errorWId((WId)wId, i18n("The %1 wallet is encrypted using GPG key %2. Please use GPG tools (such as kleopatra) to change the passphrase associated to that key.", Qt::escape(wallet), keyID)); ++ } else { ++#endif ++ QPointer kpd = new KNewPasswordDialog(); ++ kpd->setPrompt(i18n("Please choose a new password for the wallet '%1'.", Qt::escape(wallet))); ++ kpd->setCaption(i18n("KDE Wallet Service")); ++ kpd->setAllowEmptyPasswords(true); ++ setupDialog( kpd, (WId)wId, appid, false ); ++ if (kpd->exec() == KDialog::Accepted && kpd) { ++ QString p = kpd->password(); ++ if (!p.isNull()) { ++ w->setPassword(p.toUtf8()); ++ int rc = w->close(true); ++ if (rc < 0) { ++ KMessageBox::sorryWId((WId)wId, i18n("Error re-encrypting the wallet. Password was not changed."), i18n("KDE Wallet Service")); ++ reclose = true; ++ } else { ++ rc = w->open(p.toUtf8()); ++ if (rc < 0) { ++ KMessageBox::sorryWId((WId)wId, i18n("Error reopening the wallet. Data may be lost."), i18n("KDE Wallet Service")); ++ reclose = true; ++ } ++ } ++ } ++ } + +- delete kpd; ++ delete kpd; ++#ifdef HAVE_QGPGME ++ } ++#endif + + if (reclose) { + internalClose(w, handle, true); +@@ -842,14 +975,14 @@ + // get the wallet and check if we have a password for it (safety measure) + if ((b = getWallet(appid, handle))) { + QString wallet = b->walletName(); +- b->sync(); ++ b->sync(0); + } + } + + void KWalletD::timedOutSync(int handle) { + _syncTimers.removeTimer(handle); + if (_wallets.contains(handle) && _wallets[handle]) { +- _wallets[handle]->sync(); ++ _wallets[handle]->sync(0); + } + } + +@@ -1317,18 +1450,22 @@ + _leaveOpen = walletGroup.readEntry("Leave Open", false); + bool idleSave = _closeIdle; + _closeIdle = walletGroup.readEntry("Close When Idle", false); +- _openPrompt = walletGroup.readEntry("Prompt on Open", true); ++ _openPrompt = walletGroup.readEntry("Prompt on Open", false); + int timeSave = _idleTime; + // in minutes! + _idleTime = walletGroup.readEntry("Idle Timeout", 10) * 60 * 1000; + #ifdef Q_WS_X11 +- if ( screensaver->isValid() ) { +- if (walletGroup.readEntry("Close on Screensaver", false)) { +- connect(screensaver, SIGNAL(ActiveChanged(bool)), SLOT(screenSaverChanged(bool))); +- } else { +- screensaver->disconnect(SIGNAL(ActiveChanged(bool)), this, SLOT(screenSaverChanged(bool))); +- } +- } ++ if (walletGroup.readEntry("Close on Screensaver", false)) { ++ // BUG 254273 : if kwalletd starts before the screen saver, then the connection fails and kwalletd never receives it's notifications ++ // To fix this, we use a timer and perform periodic connection attempts until connection succeeds ++ QTimer::singleShot(0, this, SLOT(connectToScreenSaver())); ++ } else { ++ if (screensaver && screensaver->isValid()) { ++ screensaver->disconnect(SIGNAL(ActiveChanged(bool)), this, SLOT(screenSaverChanged(bool))); ++ delete screensaver; ++ screensaver = 0; ++ } ++ } + #endif + // Handle idle changes + if (_closeIdle) { +diff -Nur kwalletd.than/kwalletd.desktop kwalletd/kwalletd.desktop +--- kwalletd.than/kwalletd.desktop 2013-06-28 19:12:33.340802830 +0200 ++++ kwalletd/kwalletd.desktop 2014-02-26 09:34:12.000000000 +0100 +@@ -18,13 +18,13 @@ + Name[cs]=Server úschovny + Name[csb]=Serwera Wallet + Name[da]=Wallet-server +-Name[de]=Digitale Brieftasche ++Name[de]=Passwortspeicher-Server + Name[el]=Εξυπηρετητής πορτοφολιού + Name[en_GB]=Wallet Server + Name[eo]=Servilo de portilo + Name[es]=Servidor de carteras + Name[et]=Turvalaeka server +-Name[eu]=Zorro-zerbitzua ++Name[eu]=Zorro-zerbitzaria + Name[fa]=خادم کیف‌پول + Name[fi]=Lompakkopalvelin + Name[fr]=Serveur de portefeuilles +@@ -62,7 +62,7 @@ + Name[pa]=ਵਾਲਿਟ ਸਰਵਰ + Name[pl]=Serwer Portfela + Name[pt]=Servidor da Carteira +-Name[pt_BR]=Servidor da carteira ++Name[pt_BR]=Servidor de carteiras + Name[ro]=Server de portofel + Name[ru]=Wallet Server + Name[si]=පසුම්බි ධාරකය +@@ -98,13 +98,13 @@ + Comment[cs]=Server úschovny + Comment[csb]=Serwera Wallet + Comment[da]=Wallet-server +-Comment[de]=Dienst für die digitale Brieftasche ++Comment[de]=Passwortspeicher-Server + Comment[el]=Εξυπηρετητής πορτοφολιού + Comment[en_GB]=Wallet Server + Comment[eo]=Servilo de portilo + Comment[es]=Servidor de carteras + Comment[et]=Turvalaeka server +-Comment[eu]=Zorro-zerbitzua ++Comment[eu]=Zorro-zerbitzaria + Comment[fa]=خادم کیف‌پول + Comment[fi]=Lompakkopalvelin + Comment[fr]=Serveur de portefeuilles +@@ -142,7 +142,7 @@ + Comment[pa]=ਵਾਲਿਟ ਸਰਵਰ + Comment[pl]=Serwer Portfela + Comment[pt]=Servidor da Carteira +-Comment[pt_BR]=Servidor da carteira ++Comment[pt_BR]=Servidor de carteiras + Comment[ro]=Server de portofel + Comment[ru]=Служба бумажника + Comment[si]=පසුම්බි ධාරකය +diff -Nur kwalletd.than/kwalletd.h kwalletd/kwalletd.h +--- kwalletd.than/kwalletd.h 2013-06-28 19:12:33.340802830 +0200 ++++ kwalletd/kwalletd.h 2014-02-26 09:34:12.000000000 +0100 +@@ -42,7 +42,6 @@ + + // @Private + class KWalletTransaction; +-class KWalletSyncTimer; + class KWalletSessionStore; + + class KWalletD : public QObject, protected QDBusContext { +@@ -183,6 +182,9 @@ + void notifyFailures(); + void processTransactions(); + void activatePasswordDialog(); ++#ifdef Q_WS_X11 ++ void connectToScreenSaver(); ++#endif + + private: + // Internal - open a wallet +@@ -241,6 +243,8 @@ + // sessions + KWalletSessionStore _sessions; + QDBusServiceWatcher _serviceWatcher; ++ ++ bool _useGpg; + }; + + +diff -Nur kwalletd.than/kwalletd.notifyrc kwalletd/kwalletd.notifyrc +--- kwalletd.than/kwalletd.notifyrc 2013-06-28 19:12:33.555794274 +0200 ++++ kwalletd/kwalletd.notifyrc 2014-02-26 09:34:12.000000000 +0100 +@@ -10,7 +10,7 @@ + Comment[ca@valencia]=Cartera + Comment[cs]=Úschovna + Comment[da]=Tegnebog +-Comment[de]=Brieftasche ++Comment[de]=Passwortspeicher + Comment[el]=Πορτοφόλι + Comment[en_GB]=Wallet + Comment[eo]=Portilo +@@ -226,18 +226,20 @@ + Comment[cs]=Démon úschovny KDE požaduje heslo + Comment[csb]=Demóna KDE Wallet żądô parolë + Comment[da]=Dæmonen for KDE's tegnebog anmoder om en adgangskode +-Comment[de]=Die digitale Brieftasche benötigt ein Passwort ++Comment[de]=Der Passwortspeicher benötigt ein Passwort + Comment[el]=Ο δαίμονας πορτοφολιού του KDE απαιτεί έναν κωδικό πρόσβασης + Comment[en_GB]=The KDE Wallet Dæmon requests a password + Comment[eo]=la demono de portilo de KDE postulas pasvorton + Comment[es]=El demonio de la cartera de KDE requiere una contraseña + Comment[et]=KDE turvalaeka deemon nõuab parooli +-Comment[eu]=KDE diruzorroaren deabruak pasahitza eskatzen du ++Comment[eu]=KDEren zorroaren daemon-ak pasahitza eskatzen du ++Comment[fa]=شبح Wallte کی‌دی‌ای رمزعبوری را درخواست میکند + Comment[fi]=KDE:n Lompakkotaustaprosessi pyytää salasanaa + Comment[fr]=Le démon du portefeuille de KDE demande un mot de passe + Comment[fy]=The KDE slûf daemon fereasket in wachtwurd + Comment[ga]=Tá Deamhan Sparáin KDE ag iarraidh focal faire + Comment[gl]=O Daemon de carteiras de KDE pide un contrasinal ++Comment[gu]=KDE વોલેટ ડેમને પાસવર્ડની માંગ કરી છે + Comment[he]=תהליך הרקע של הארנק של KDE מבקש סיסמא + Comment[hi]=केडीई वॉलेट डेमॉन एक पासवर्ड का अनुरोध करता है + Comment[hr]=KDE-ov novčanik daemon zahtijeva zaporku +@@ -264,12 +266,12 @@ + Comment[pa]=KDE ਵਾਲਿਟ ਡੈਮਨ ਨੇ ਪਾਸਵਰਡ ਦੀ ਮੰਗ ਕੀਤੀ ਹੈ + Comment[pl]=Demon Portfela KDE wymaga hasła + Comment[pt]=O Servidor da Carteira do KDE está a pedir uma senha +-Comment[pt_BR]=O servidor da carteira do KDE está solicitando uma senha ++Comment[pt_BR]=O servidor de carteiras do KDE está solicitando uma senha + Comment[ro]=Demonul de portofel KDE cere o parolă + Comment[ru]=Бумажник KDE запрашивает пароль + Comment[si]=The KDE පසුම්බි ඩීමනය මුරපදයක් ඉල්ලයි + Comment[sk]=Démon KDE Wallet vyžaduje heslo +-Comment[sl]=Pritajeni program KDE-jeve Listnice zahteva geslo ++Comment[sl]=Ozadnji program KDE-jeve Listnice zahteva geslo + Comment[sr]=КДЕ‑ов демон новчаника захтева лозинку + Comment[sr@ijekavian]=КДЕ‑ов демон новчаника захтијева лозинку + Comment[sr@ijekavianlatin]=KDE‑ov demon novčanika zahtijeva lozinku +@@ -279,10 +281,93 @@ + Comment[th]=บริการกระเป๋าคุมข้อมูลของ KDE ร้องขอรหัสผ่าน + Comment[tr]=KDE Cüzdan Servisi bir parola ister + Comment[ug]=KDE ھەميان نازارەتچىسى ئىم سورايدۇ +-Comment[uk]=Фонова служба кишені KDE надіслала запит на пароль ++Comment[uk]=Фонова служба торбинок KDE надіслала запит на пароль + Comment[vi]=Trình nền Wallet KDE yêu cầu một mật khẩu + Comment[wa]=Li démon poite-manoye di KDE dimande on scret + Comment[x-test]=xxThe KDE Wallet Daemon requests a passwordxx + Comment[zh_CN]=KDE 钱包守护程序请求密码 + Comment[zh_TW]=KDE 錢包守護程式需要密碼 + Action=Popup ++ ++[Event/syncFailed] ++Name=Sync Failed ++Name[bs]=Sinhronizacija neuspjela ++Name[ca]=La sincronització ha fallat ++Name[ca@valencia]=La sincronització ha fallat ++Name[cs]=Synchronizace selhala ++Name[da]=Synkronisering mislykkedes ++Name[de]=Abgleich fehlgeschlagen ++Name[el]=Αποτυχία συγχρονισμού ++Name[es]=Sincronización fallida ++Name[eu]=Sinkronizatzeak huts egin du ++Name[fi]=Synkronointi epäonnistui ++Name[fr]=Échec de la synchronisation ++Name[gl]=Fallou a sincronización ++Name[hu]=A szinkronizálás meghiúsult ++Name[ia]=Il falleva synchronisar ++Name[id]=Sinkronisasi Gagal ++Name[is]=Samræming mistókst ++Name[it]=Sincronizzazione non riuscita ++Name[kk]=Қадамдастыру жаңылды ++Name[nb]=Synkronisering mislyktes ++Name[nds]=Synkroniseren is fehlslaan ++Name[nl]=Synchronisatie mislukt ++Name[nn]=Feil ved synkronisering ++Name[pa]=ਸਿੰਕ ਫੇਲ੍ਹ ਹੈ ++Name[pl]=Nieudana synchronizacja ++Name[pt]=A Sincronização Falhou ++Name[pt_BR]=Falha na sincronização ++Name[ro]=Sincronizare eșuată ++Name[ru]=Сбой записи ++Name[sk]=Synchronizácia zlyhala ++Name[sl]=Uskladitev spodletela ++Name[sr]=Синхронизација пропала ++Name[sr@ijekavian]=Синхронизација пропала ++Name[sr@ijekavianlatin]=Sinhronizacija propala ++Name[sr@latin]=Sinhronizacija propala ++Name[sv]=Synkronisering misslyckades ++Name[tr]=Eşitleme Başarısız ++Name[uk]=Спроба синхронізації зазнала невдачі ++Name[x-test]=xxSync Failedxx ++Name[zh_TW]=同步失敗 ++Comment=KDE Wallet System failed to sync a wallet file to disk ++Comment[bs]=KDE Wallet Sistem nije uspio da sinhronizuje datoteku novčanika na disk ++Comment[ca]=El sistema de cartera del KDE ha fallat en sincronitzar un fitxer de cartera al disc ++Comment[ca@valencia]=El sistema de cartera del KDE ha fallat en sincronitzar un fitxer de cartera al disc ++Comment[cs]=Systému úschovny pro KDE selhala synchronizace úschovny na disk ++Comment[da]=KDE's tegnebogsystem kunne ikke synkronisere en tegnebogsfil til disken ++Comment[de]=Abgleich des KDE-Passwortspeicher mit einer Passwortspeicherdatei auf der Festplatte ist fehlgeschlagen. ++Comment[el]=Το σύστημα πορτοφολιού του KDE απέτυχε να συγχρονίσει ενός πορτοφολιού στον δίσκο ++Comment[es]=El sistema de carteras de KDE ha fallado al sincronizar un archivo de cartera con el disco ++Comment[eu]=KDE zorro-sistemak ezin izan du zorro bat diskora sinkronizatu ++Comment[fi]=KDE:n lompakkojärjestelmä ei onnistunut tallentamaan lompakkotiedostoa levylle ++Comment[fr]=Le système du portefeuille de KDE n'a pas réussi à synchroniser un fichier de portefeuille sur le disque ++Comment[gl]=O sistema de carteiras de KDE non conseguiu sincronizar un ficheiro de carteira co disco ++Comment[hu]=A KDE jelszókezelő rendszer nem tudta szinkronizálni a jelszófájlt a lemezre ++Comment[ia]=Le sistema de portafolio de KDE (KDE Wallet System) falleva synchronisar un file de portafolio con le disco ++Comment[id]=Sistem Dompet KDE gagal sinkronisasi berkas dompet ke cakram ++Comment[is]=KDE veskjakerfinu (wallet system) mistókst að samstilla veskisskrá við disk ++Comment[it]=Il sistema di portafogli di KDE non è riuscito a sincronizzare il file del portafogli sul disco ++Comment[kk]=KDE әмиян жүйесінің дискідегі әмиян файлымен қадамдастыру жаңылысы ++Comment[nb]=KDE Wallet System klarte ikke å synkronisere en lommebokfil til disk ++Comment[nds]=Binnen KDE sien Knippsystem lett sik en Knipp nich mit de Datei op de Fastplaat synkroniseren ++Comment[nl]=Het lukte het KDE portefeuillesysteem niet om een portefeuillebestand naar schijf te synchroniseren ++Comment[nn]=Lommeboktenesta klarte ikkje synkronisera lommebokfila til disken ++Comment[pa]=KDE ਵਾਲਿਟ ਸਿਸਟਮ ਡਿਸਕ ਉੱਤੇ ਵਾਲਿਟ ਫਾਇਲ ਨਾਲ ਸਿੰਕ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ ++Comment[pl]=Nieudana synchronizacja pliku portfela przez System portfela KDE ++Comment[pt]=O sistema da Carteira do KDE não conseguiu sincronizar um ficheiro da carteira para o disco ++Comment[pt_BR]=O Sistema da Carteiras do KDE não conseguiu sincronizar um arquivo de carteira com o disco ++Comment[ro]=Sistemul de portofele KDE nu a putut sincroniza fișierul unui portofel cu discul ++Comment[ru]=Служба бумажника KDE не смогла записать файл бумажника на диск ++Comment[sk]=Systému KDE peňaženky sa nepodarilo synchronizovať súbor peňaženky na disk ++Comment[sl]=Sistem listnic za KDE ni uspel uskladiti datoteke z listnico na disku ++Comment[sr]=К‑новчаник не може да синхронизује фајл новчаника на диск ++Comment[sr@ijekavian]=К‑новчаник не може да синхронизује фајл новчаника на диск ++Comment[sr@ijekavianlatin]=K‑novčanik ne može da sinhronizuje fajl novčanika na disk ++Comment[sr@latin]=K‑novčanik ne može da sinhronizuje fajl novčanika na disk ++Comment[sv]=KDE:s plånbokssystem misslyckades synkronisera en plånboksfil till disk ++Comment[tr]=KDE Cüzdan Sistemi diske bir cüzdan dosyası eşitlerken başarısız oldu ++Comment[uk]=Система торбинок KDE не змогла синхронізувати дані файла торбинок з диском ++Comment[x-test]=xxKDE Wallet System failed to sync a wallet file to diskxx ++Comment[zh_TW]=KDE 錢包系統在將錢包檔同步到磁碟時失敗 ++Action=Popup +diff -Nur kwalletd.than/kwalletopenloop.cpp kwalletd/kwalletopenloop.cpp +--- kwalletd.than/kwalletopenloop.cpp 2013-06-28 19:12:33.340802830 +0200 ++++ kwalletd/kwalletopenloop.cpp 1970-01-01 01:00:00.000000000 +0100 +@@ -1,46 +0,0 @@ +-// -*- indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- +-/* +- This file is part of the KDE libraries +- +- Copyright (c) 2008 Michael Leupold +- +- This library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Library General Public +- License as published by the Free Software Foundation; either +- version 2 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 +- Library General Public License for more details. +- +- You should have received a copy of the GNU Library General Public License +- along with this library; see the file COPYING.LIB. If not, write to +- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. +- +-*/ +- +-#include "kwalletopenloop.h" +-#include "kwalletd.h" +- +-int KWalletOpenLoop::waitForAsyncOpen(int tId) +-{ +- transaction = tId; +- connect(wallet, SIGNAL(walletAsyncOpened(int, int)), +- SLOT(walletAsyncOpened(int, int))); +- exec(); +- disconnect(this, SLOT(walletAsyncOpened(int, int))); +- return result; +-} +- +-void KWalletOpenLoop::walletAsyncOpened(int tId, int handle) +-{ +- // if our transaction finished, stop waiting +- if (tId == transaction) { +- result = handle; +- quit(); +- } +-} +- +-#include "kwalletopenloop.moc" +diff -Nur kwalletd.than/kwalletopenloop.h kwalletd/kwalletopenloop.h +--- kwalletd.than/kwalletopenloop.h 2013-06-28 19:12:33.340802830 +0200 ++++ kwalletd/kwalletopenloop.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,50 +0,0 @@ +-// -*- indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- +-/* +- This file is part of the KDE libraries +- +- Copyright (c) 2008 Michael Leupold +- +- This library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Library General Public +- License as published by the Free Software Foundation; either +- version 2 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 +- Library General Public License for more details. +- +- You should have received a copy of the GNU Library General Public License +- along with this library; see the file COPYING.LIB. If not, write to +- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. +- +-*/ +- +-#ifndef KWALLETOPENLOOP_H +-#define KWALLETOPENLOOP_H +- +-#include +- +-class KWalletD; +- +-class KWalletOpenLoop : public QEventLoop { +- Q_OBJECT +- +- public: +- explicit KWalletOpenLoop(KWalletD* w, QObject* parent = 0) +- : QEventLoop(parent), wallet(w) {} +- +- // returns the open handle +- int waitForAsyncOpen(int tId); +- +- public slots: +- void walletAsyncOpened(int tId, int handle); +- +- private: +- KWalletD* wallet; +- int transaction; +- int result; +-}; +- +-#endif +diff -Nur kwalletd.than/kwalletwizard.cpp kwalletd/kwalletwizard.cpp +--- kwalletd.than/kwalletwizard.cpp 2013-06-28 19:12:33.341802790 +0200 ++++ kwalletd/kwalletwizard.cpp 2014-02-26 09:34:12.000000000 +0100 +@@ -23,11 +23,25 @@ + #include "ui_kwalletwizardpageintro.h" + #include "ui_kwalletwizardpageoptions.h" + #include "ui_kwalletwizardpagepassword.h" ++#ifdef HAVE_QGPGME ++#include "ui_kwalletwizardpagepasswordgpg.h" ++#include "ui_kwalletwizardpagegpgkey.h" ++#endif + + #include + + #include + ++#ifdef HAVE_QGPGME ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ + class PageIntro : public QWizardPage + { + public: +@@ -59,18 +73,23 @@ + Ui::KWalletWizardPageIntro ui; + }; + +- + class PagePassword : public QWizardPage + { + public: + PagePassword(QWidget *parent) + : QWizardPage(parent) + { ++ + ui.setupUi(this); + + registerField("useWallet", ui._useWallet); + registerField("pass1", ui._pass1); + registerField("pass2", ui._pass2); ++#ifdef HAVE_QGPGME ++ registerField("useGPG", ui._radioGpg); ++ registerField("useBlowfish", ui._radioBlowfish); ++ connect(ui._radioBlowfish, SIGNAL(toggled(bool)), parent, SLOT(passwordPageUpdate())); ++#endif + + connect(ui._useWallet, SIGNAL(clicked()), parent, SLOT(passwordPageUpdate())); + connect(ui._pass1, SIGNAL(textChanged(QString)), parent, SLOT(passwordPageUpdate())); +@@ -79,7 +98,20 @@ + + virtual int nextId() const + { ++#ifdef HAVE_QGPGME ++ int nextId = -1; ++ if (field("useWallet").toBool()) { ++ if (field("useBlowfish").toBool()) { ++ nextId = static_cast(wizard())->wizardType() == KWalletWizard::Basic ? -1 : KWalletWizard::PageOptionsId; // same as non QGPGME case ++ } else { ++ nextId = KWalletWizard::PageGpgKeyId; ++ } ++ } ++ ++ return nextId; ++#else + return static_cast(wizard())->wizardType() == KWalletWizard::Basic ? -1 : KWalletWizard::PageOptionsId; ++#endif + } + + void setMatchLabelText(const QString &text) +@@ -88,9 +120,96 @@ + } + + private: ++#ifdef HAVE_QGPGME ++ Ui::KWalletWizardPagePasswordGpg ui; ++#else + Ui::KWalletWizardPagePassword ui; ++#endif ++}; ++ ++#ifdef HAVE_QGPGME ++typedef std::vector< GpgME::Key > KeysVector; ++Q_DECLARE_METATYPE(GpgME::Key) ++ ++struct AddKeyToCombo { ++ QComboBox *_list; ++ AddKeyToCombo(QComboBox *list) : _list(list) {} ++ void operator()( const GpgME::Key &k) { ++ QString text = QString("%1 (%2)").arg(k.shortKeyID()).arg(k.userID(0).email()); ++ QVariant varKey; ++ varKey.setValue(k); ++ _list->addItem(text, varKey); ++ } + }; + ++class PageGpgKey : public QWizardPage ++{ ++public: ++ PageGpgKey(QWidget* parent) ++ : QWizardPage(parent) ++ , userHasGpgKeys(false) ++ { ++ ui.setupUi(this); ++ ++ registerField("gpgKey", ui._gpgKey); ++ ++ KeysVector keys; ++ GpgME::initializeLibrary(); ++ GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP); ++ if (err){ ++ kDebug() << "OpenPGP not supported on your system!"; ++ KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); ++ } else { ++ boost::shared_ptr< GpgME::Context > ctx( GpgME::Context::createForProtocol(GpgME::OpenPGP) ); ++ if (0 == ctx) { ++ KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); ++ } else { ++ ++ ctx->setKeyListMode(GPGME_KEYLIST_MODE_LOCAL); ++ int row =0; ++ err = ctx->startKeyListing(); ++ while (!err) { ++ GpgME::Key k = ctx->nextKey(err); ++ if (err) ++ break; ++ if (!k.isInvalid() && k.canEncrypt()) { ++ keys.push_back(k); ++ } ++ } ++ ctx->endKeyListing(); ++ } ++ } ++ std::for_each(keys.begin(), keys.end(), AddKeyToCombo(ui._gpgKey)); ++ ++ userHasGpgKeys = keys.size() >0; ++ if (userHasGpgKeys) { ++ ui.stackedWidget->setCurrentWidget(ui._pageWhenHasKeys); ++ } else { ++ ui.stackedWidget->setCurrentWidget(ui._pageNoKeys); ++ setFinalPage(true); ++ } ++ emit completeChanged(); ++ } ++ ++ virtual int nextId() const { ++ return static_cast(wizard())->wizardType() == KWalletWizard::Basic ? -1 : KWalletWizard::PageOptionsId; ++ } ++ ++ virtual bool isComplete() const { ++ return userHasGpgKeys; ++ } ++ ++ bool hasGpgKeys() const { return userHasGpgKeys; } ++ ++ GpgME::Key gpgKey() const { ++ QVariant varKey = ui._gpgKey->itemData(field("gpgKey").toInt()); ++ return varKey.value< GpgME::Key >(); ++ } ++private: ++ Ui::KWalletWizardPageGpgKey ui; ++ bool userHasGpgKeys; ++}; ++#endif + + class PageOptions : public QWizardPage + { +@@ -134,24 +253,42 @@ + setPage(PageIntroId, m_pageIntro); + m_pagePasswd = new PagePassword(this); + setPage(PagePasswordId, m_pagePasswd); ++#ifdef HAVE_QGPGME ++ m_pageGpgKey = new PageGpgKey(this); ++ setPage(PageGpgKeyId, m_pageGpgKey); ++#endif + setPage(PageOptionsId, new PageOptions(this)); + setPage(PageExplanationId, new PageExplanation(this)); ++ ++ resize(500, 420); + } + + void KWalletWizard::passwordPageUpdate() + { + bool complete = true; + if (field("useWallet").toBool()) { +- if (field("pass1").toString() == field("pass2").toString()) { +- if (field("pass1").toString().isEmpty()) { +- m_pagePasswd->setMatchLabelText(i18n("Password is empty. (WARNING: Insecure)")); ++#ifdef HAVE_QGPGME ++ if (field("useBlowfish").toBool()) { ++ m_pagePasswd->setFinalPage(wizardType() == Basic); ++ button(NextButton)->setVisible(wizardType() != Basic); ++#endif ++ if (field("pass1").toString() == field("pass2").toString()) { ++ if (field("pass1").toString().isEmpty()) { ++ m_pagePasswd->setMatchLabelText(i18n("Password is empty. (WARNING: Insecure)")); ++ } else { ++ m_pagePasswd->setMatchLabelText(i18n("Passwords match.")); ++ } + } else { +- m_pagePasswd->setMatchLabelText(i18n("Passwords match.")); ++ m_pagePasswd->setMatchLabelText(i18n("Passwords do not match.")); ++ complete = false; + } ++#ifdef HAVE_QGPGME + } else { +- m_pagePasswd->setMatchLabelText(i18n("Passwords do not match.")); +- complete = false; ++ m_pagePasswd->setFinalPage(false); ++ button(NextButton)->setEnabled(true); ++ return; + } ++#endif + } else { + m_pagePasswd->setMatchLabelText(QString()); + } +@@ -176,3 +313,8 @@ + } + } + ++#ifdef HAVE_QGPGME ++GpgME::Key KWalletWizard::gpgKey() const { ++ return m_pageGpgKey->gpgKey(); ++} ++#endif +diff -Nur kwalletd.than/kwalletwizard.h kwalletd/kwalletwizard.h +--- kwalletd.than/kwalletwizard.h 2013-06-28 19:12:33.341802790 +0200 ++++ kwalletd/kwalletwizard.h 2014-02-26 09:34:12.000000000 +0100 +@@ -20,9 +20,13 @@ + #define KWALLETWIZARD_H + + #include ++#ifdef HAVE_QGPGME ++#include ++#endif + +-class PageIntro; ++class PageGpgKey; + class PagePassword; ++class PageIntro; + + class KWalletWizard : public QWizard + { +@@ -37,13 +41,20 @@ + + static const int PageIntroId = 0; + static const int PagePasswordId = 1; +- static const int PageOptionsId = 2; +- static const int PageExplanationId = 3; ++#ifdef HAVE_QGPGME ++ static const int PageGpgKeyId =2; ++#endif ++ static const int PageOptionsId = 3; ++ static const int PageExplanationId = 4; + + KWalletWizard( QWidget *parent = 0 ); + + WizardType wizardType() const; + ++#ifdef HAVE_QGPGME ++ GpgME::Key gpgKey() const; ++#endif // HAVE_QGPGME ++ + protected: + virtual void initializePage(int id); + +@@ -53,6 +64,9 @@ + private: + PageIntro *m_pageIntro; + PagePassword *m_pagePasswd; ++#ifdef HAVE_QGPGME ++ PageGpgKey *m_pageGpgKey; ++#endif + }; + + #endif +diff -Nur kwalletd.than/kwalletwizardpageexplanation.ui kwalletd/kwalletwizardpageexplanation.ui +--- kwalletd.than/kwalletwizardpageexplanation.ui 2013-06-28 19:12:33.341802790 +0200 ++++ kwalletd/kwalletwizardpageexplanation.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -1,7 +1,8 @@ +- ++ ++ + KWalletWizardPageExplanation +- +- ++ ++ + + 0 + 0 +@@ -9,16 +10,16 @@ + 215 + + +- ++ + +- +- +- The KDE Wallet system stores your data in a <i>wallet</i> file on your local hard disk. The data is only written in encrypted form, presently using the blowfish algorithm with your password as the key. When a wallet is opened, the wallet manager application will launch and display an icon in the system tray. You can use this application to manage your wallets. It even permits you to drag wallets and wallet contents, allowing you to easily copy a wallet to a remote system. ++ ++ ++ <html><head/><body><p>The KDE Wallet system stores your data in a <span style=" font-style:italic;">wallet</span> file on your local hard disk. The data is only written in the encrypted form of your choice - blowfish algorithm with your password as the key or using a GPG encryption key. When a wallet is opened, the wallet manager application will launch and display an icon in the system tray. You can use this application to manage all of your wallets. It even permits you to drag wallets and wallet contents, allowing you to easily copy a wallet to a remote system.</p></body></html> + +- ++ + Qt::RichText + +- ++ + true + + +diff -Nur kwalletd.than/kwalletwizardpagegpgkey.ui kwalletd/kwalletwizardpagegpgkey.ui +--- kwalletd.than/kwalletwizardpagegpgkey.ui 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/kwalletwizardpagegpgkey.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,93 @@ ++ ++ ++ KWalletWizardPageGpgKey ++ ++ ++ ++ 0 ++ 0 ++ 436 ++ 309 ++ ++ ++ ++ ++ ++ ++ 0 ++ ++ ++ ++ ++ ++ ++ <html><head/><body><p>The GPG-based wallet use a GPG encryption key to securely encrypt data on disk. The key must be available when decrypting is needed or your wallet will not be accessible. For example, if you choose a SmartCard-based encryption key, the GPG system will prompt you to enter it and its associated PIN when attempting to open the wallet.</p></body></html> ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ true ++ ++ ++ Select encryption GPG key: ++ ++ ++ ++ ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::Vertical ++ ++ ++ ++ 20 ++ 173 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 0 ++ 0 ++ ++ ++ ++ Unable to locate at least one <b>encrypting GPG key</b>. KDE Wallet needs such <b>encrypting key</b> to securely store passwords or other sensitive data on disk. If you still want to setup a GPG-based wallet, then cancel this wizard, set-up an <b>encrypting GPG key</b>, then retry this assistant. Otherwise, you may still click back, then choose a classic, blowfish encrypted file format on the previous page. ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -Nur kwalletd.than/kwalletwizardpageintro.ui kwalletd/kwalletwizardpageintro.ui +--- kwalletd.than/kwalletwizardpageintro.ui 2013-06-28 19:12:33.341802790 +0200 ++++ kwalletd/kwalletwizardpageintro.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -6,8 +6,8 @@ + + 0 + 0 +- 275 +- 283 ++ 449 ++ 327 + + + +diff -Nur kwalletd.than/kwalletwizardpagepasswordgpg.ui kwalletd/kwalletwizardpagepasswordgpg.ui +--- kwalletd.than/kwalletwizardpagepasswordgpg.ui 1970-01-01 01:00:00.000000000 +0100 ++++ kwalletd/kwalletwizardpagepasswordgpg.ui 2014-02-26 09:34:12.000000000 +0100 +@@ -0,0 +1,350 @@ ++ ++ ++ KWalletWizardPagePasswordGpg ++ ++ ++ ++ 0 ++ 0 ++ 448 ++ 385 ++ ++ ++ ++ ++ ++ ++ <html><head/><body><p>Various applications may attempt to use the KDE wallet to store passwords or other information such as web form data and cookies. If you would like these applications to use the wallet, you must enable it now and choose method for its encryption.</p><p>GPG method is more secure, but you must have configured at least one encrypting key on your system.</p><p>If you choose the classic format, be warned that the password you choose <span style=" font-style:italic;">cannot</span> be recovered if it is lost, and will allow anyone who knows it to obtain all the information contained in the wallet.</p></body></html> ++ ++ ++ Qt::RichText ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ Yes, I wish to use the KDE wallet to store my personal information. ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ ++ 0 ++ 0 ++ ++ ++ ++ What kind of encryption do you wish? ++ ++ ++ ++ ++ ++ false ++ ++ ++ Use GPG encryption, for better protection ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ Classic, blowfish encrypted file ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::Horizontal ++ ++ ++ QSizePolicy::Expanding ++ ++ ++ ++ 28 ++ 28 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 6 ++ ++ ++ 0 ++ ++ ++ ++ ++ false ++ ++ ++ Enter a new password: ++ ++ ++ Qt::AlignAbsolute|Qt::AlignBottom|Qt::AlignCenter|Qt::AlignHCenter|Qt::AlignHorizontal_Mask|Qt::AlignJustify|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing|Qt::AlignVCenter|Qt::AlignVertical_Mask ++ ++ ++ _pass1 ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ Verify password: ++ ++ ++ Qt::AlignAbsolute|Qt::AlignBottom|Qt::AlignCenter|Qt::AlignHCenter|Qt::AlignHorizontal_Mask|Qt::AlignJustify|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing|Qt::AlignVCenter|Qt::AlignVertical_Mask ++ ++ ++ _pass2 ++ ++ ++ ++ ++ ++ ++ ++ ++ 6 ++ ++ ++ 0 ++ ++ ++ ++ ++ false ++ ++ ++ QLineEdit::Password ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ QLineEdit::Password ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::Horizontal ++ ++ ++ QSizePolicy::Expanding ++ ++ ++ ++ 98 ++ 18 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Qt::AlignAbsolute|Qt::AlignBottom|Qt::AlignCenter|Qt::AlignHCenter|Qt::AlignHorizontal_Mask|Qt::AlignJustify|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing|Qt::AlignVCenter|Qt::AlignVertical_Mask ++ ++ ++ ++ ++ ++ ++ Qt::Vertical ++ ++ ++ ++ 20 ++ 31 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KLineEdit ++ QLineEdit ++
klineedit.h
++
++
++ ++ ++ ++ _radioBlowfish ++ toggled(bool) ++ textLabel1_3 ++ setEnabled(bool) ++ ++ ++ 239 ++ 220 ++ ++ ++ 213 ++ 249 ++ ++ ++ ++ ++ _radioBlowfish ++ toggled(bool) ++ _pass1 ++ setEnabled(bool) ++ ++ ++ 239 ++ 220 ++ ++ ++ 331 ++ 249 ++ ++ ++ ++ ++ _radioBlowfish ++ toggled(bool) ++ textLabel2_3 ++ setEnabled(bool) ++ ++ ++ 239 ++ 220 ++ ++ ++ 142 ++ 277 ++ ++ ++ ++ ++ _radioBlowfish ++ toggled(bool) ++ _pass2 ++ setEnabled(bool) ++ ++ ++ 239 ++ 220 ++ ++ ++ 331 ++ 277 ++ ++ ++ ++ ++ _radioBlowfish ++ clicked() ++ _pass1 ++ setFocus() ++ ++ ++ 239 ++ 220 ++ ++ ++ 331 ++ 249 ++ ++ ++ ++ ++ _useWallet ++ toggled(bool) ++ _groupBox ++ setEnabled(bool) ++ ++ ++ 42 ++ 112 ++ ++ ++ 33 ++ 193 ++ ++ ++ ++ ++ _useWallet ++ toggled(bool) ++ _radioGpg ++ setEnabled(bool) ++ ++ ++ 50 ++ 112 ++ ++ ++ 63 ++ 166 ++ ++ ++ ++ ++ _useWallet ++ toggled(bool) ++ _radioBlowfish ++ setEnabled(bool) ++ ++ ++ 85 ++ 112 ++ ++ ++ 97 ++ 220 ++ ++ ++ ++ ++
+diff -Nur kwalletd.than/main.cpp kwalletd/main.cpp +--- kwalletd.than/main.cpp 2013-06-28 19:12:33.342802750 +0200 ++++ kwalletd/main.cpp 2014-02-26 09:34:12.000000000 +0100 +@@ -38,10 +38,11 @@ + { + KAboutData aboutdata("kwalletd", 0, ki18n("KDE Wallet Service"), + "0.2", ki18n("KDE Wallet Service"), +- KAboutData::License_LGPL, ki18n("(C) 2002-2008 George Staikos, Michael Leupold, Thiago Maceira")); ++ KAboutData::License_LGPL, ki18n("(C) 2002-2008 George Staikos, Michael Leupold, Thiago Maceira, Valentin Rusu")); + aboutdata.addAuthor(ki18n("Michael Leupold"),ki18n("Maintainer"),"lemma@confuego.org"); + aboutdata.addAuthor(ki18n("George Staikos"),ki18n("Former maintainer"),"staikos@kde.org"); + aboutdata.addAuthor(ki18n("Thiago Maceira"),ki18n("D-Bus Interface"),"thiago@kde.org"); ++ aboutdata.addAuthor(ki18n("Valentin Rusu"),ki18n("GPG backend support"),"kde@rusu.info"); + + aboutdata.setProgramIconName("kwalletmanager"); + +@@ -65,6 +66,7 @@ + return (0); + } + ++ kDebug() << "kwalletd started"; + KWalletD walletd; + return app.exec(); + } +diff -Nur kwalletd.than/tests/CMakeLists.txt kwalletd/tests/CMakeLists.txt +--- kwalletd.than/tests/CMakeLists.txt 2013-06-28 19:12:33.342802750 +0200 ++++ kwalletd/tests/CMakeLists.txt 2014-02-26 09:34:12.000000000 +0100 +@@ -14,10 +14,20 @@ + ../kwalletwizardpageintro.ui + ../kwalletwizardpageoptions.ui + ../kwalletwizardpagepassword.ui ++ ../kwalletwizardpagegpgkey.ui + ) + ++if (QGPGME_FOUND) ++ kde4_add_ui_files(kwalletwizardtest_SRCS ++ ../kwalletwizardpagepasswordgpg.ui) ++endif(QGPGME_FOUND) ++ + kde4_add_executable(kwalletwizardtest TEST ${kwalletwizardtest_SRCS}) + target_link_libraries(kwalletwizardtest ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY}) ++if (QGPGME_FOUND) ++ target_link_libraries(kwalletwizardtest ${QGPGME_LIBRARIES}) ++endif(QGPGME_FOUND) ++ + set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} ) + + include_directories( ${KDE4_KDEUI_INCLUDES} ) # for kwallet.h diff --git a/SPECS/kde-runtime.spec b/SPECS/kde-runtime.spec new file mode 100644 index 0000000..66b2afa --- /dev/null +++ b/SPECS/kde-runtime.spec @@ -0,0 +1,1272 @@ +%if 0%{?fedora} +%define flags 1 +%define webkit 1 +%endif + +Name: kde-runtime +Summary: KDE Runtime +Version: 4.10.5 +Release: 11%{?dist} + +# http://techbase.kde.org/Policies/Licensing_Policy +License: LGPLv2+ and GPLv2+ +URL: http://www.kde.org/ +%global revision %(echo %{version} | cut -d. -f3) +%if %{revision} >= 50 +%global stable unstable +%else +%global stable stable +%endif +Source0: http://download.kde.org/%{stable}/%{version}/src/kde-runtime-%{version}.tar.xz + +# add shortcuts for search provider +Patch1: kdebase-runtime-4.1.x-searchproviders-shortcuts.patch + +# add OnlyShowIn=KDE to Desktop/Home.desktop (like trash.desktop) +Patch6: kdebase-runtime-4.3.3-home_onlyshowin_kde.patch + +# correct path for htsearch +Patch7: kdebase-runtime-4.5.3-htsearch.patch + +# Launch compiz via compiz-manager so we get window decorations and +# other such decadent luxuries (AdamW 2011/01) +Patch8: kdebase-runtime-4.5.95-compiz.patch + +# add overrides in default manpath +Patch9: kdebase-runtime-4.3.4-man-overrides.patch + +# https://bugs.kde.org/show_bug.cgi?id=310486 +# revert the main part of: +# http://commits.kde.org/kde-runtime/deee161a42efda74965ca4aab7d79fb7fb375352 +# (Upstream doesn't like this workaround.) +Patch10: kde-runtime-4.9.98-kde#310486.patch + +# disable making files read only when moving them into trash +# (Upstream wouldn't accept this) +Patch11: kde-runtime-4.10.4-trash-readonly.patch + +## upstreamable patches +# make nepomuk menu items (with oxygen-only icons atm) OnlyShowIn=KDE; +Patch50: kde-runtime-4.7.90-nepomuk_onlyshowin_kde.patch + +# make installdbgsymbols.sh use pkexec instead of su +# increase some timeouts in an effort to see (some) errors before close +Patch51: kde-runtime-4.9.0-installdbgsymbols.patch + +# avoid X3 mouse events +# https://bugs.kde.org/show_bug.cgi?id=316546 +Patch52: kde-runtime-mouseeventlistener.patch + +# Make kdesu full RELRO +Patch53: kde-runtime-4.10.5-kdesu-fullrelro.patch + +# Bug 1084191 - In System Settings -> Removable Devices, adding duplicates of USB device +# Bug 1084497 - KDE cannot disable automount for removable media +Patch54: kde-runtime-solid-device-automounter.patch + +## upstream patches +# upstreamed patch for RHBZ#1018207 +Patch100: kde-runtime-4.10-kglobalaccel-crash.patch +Patch101: kwalletd-new.patch + +# rhel patches +Patch300: kde-runtime-4.9.2-webkit.patch + + +Obsoletes: kdebase-runtime < 4.7.97-10 +Provides: kdebase-runtime = %{version}-%{release} +Obsoletes: kdebase4-runtime < %{version}-%{release} +Provides: kdebase4-runtime = %{version}-%{release} + +Obsoletes: nepomukcontroller < 1:0.2 +Provides: nepomukcontroller = 1:0.2-1 + +# knotify4 provides dbus service org.freedesktop.Notifications too +Provides: desktop-notification-daemon + +%{?_kde4_macros_api:Requires: kde4-macros(api) = %{_kde4_macros_api} } +# http://bugzilla.redhat.com/794958 +Requires: dbus-x11 +%ifnarch s390 s390x +Requires: eject +%endif +Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: %{name}-drkonqi = %{version}-%{release} +%if 0%{?flags} +Requires: %{name}-flags = %{version}-%{release} +%endif +Requires: nepomuk-core >= %{version} +# Nepomuk requires pdftotext for indexing PDFs +Requires: poppler-utils +# needed by windowsexethumbnail +Requires: icoutils + +# ensure default/fallback icon theme present +# beware of bootstrapping, there be dragons +Requires: oxygen-icon-theme >= %{version} + +BuildRequires: gpgme-devel +BuildRequires: bzip2-devel +BuildRequires: chrpath +BuildRequires: clucene-core-devel +BuildRequires: desktop-file-utils +BuildRequires: kdelibs4-devel >= %{version} +BuildRequires: kdepimlibs-devel >= %{version} +BuildRequires: kactivities-devel >= %{version} +BuildRequires: nepomuk-core-devel >= %{version} +BuildRequires: libjpeg-devel +BuildRequires: pkgconfig +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(exiv2) +BuildRequires: pkgconfig(OpenEXR) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(polkit-qt-1) +BuildRequires: pkgconfig(libattica) +BuildRequires: pkgconfig(libcanberra) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(libstreamanalyzer) pkgconfig(libstreams) +BuildRequires: pkgconfig(liblzma) +BuildRequires: pkgconfig(NetworkManager) +BuildRequires: pkgconfig(qca2) +BuildRequires: pkgconfig(qimageblitz) +BuildRequires: pkgconfig(smbclient) +BuildRequires: pkgconfig(soprano) >= 2.6.50 +BuildRequires: pkgconfig(xproto) +BuildRequires: pkgconfig(xscrnsaver) +%if 0%{?webkit} +BuildRequires: pkgconfig(QtWebKit) +%endif +%if 0%{?fedora} +BuildRequires: openslp-devel +BuildRequires: libssh-devel +%endif +BuildRequires: xorg-x11-font-utils +BuildRequires: zlib-devel + +# some items moved -workspace -> -runtime +Conflicts: kdebase-workspace < 4.5.80 +# plasmapkg moved -workspace -> -runtime +Conflicts: kde-workspace < 4.9.60 + +%description +Core runtime for KDE 4. + +%package devel +Summary: Developer files for %{name} +Obsoletes: kdebase-runtime-devel < 4.7.97-10 +Provides: kdebase-runtime-devel = %{version}-%{release} +Requires: %{name}-libs%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +%description devel +%{summary}. + +%package drkonqi +Summary: DrKonqi KDE crash handler +Requires: %{name} = %{version}-%{release} +# drkonqi patch51 uses pkexec +Requires: polkit +%description drkonqi +%{summary}. + +%package libs +Summary: Runtime libraries for %{name} +Obsoletes: kdebase-runtime-libs < 4.7.97-10 +Provides: kdebase-runtime-libs = %{version}-%{release} +Requires: kdelibs4%{?_isa} >= %{version} +Requires: %{name} = %{version}-%{release} +%description libs +%{summary}. + +%package flags +Summary: Geopolitical flags +Obsoletes: kdebase-runtime-flags < 4.7.97-10 +Provides: kdebase-runtime-flags = %{version}-%{release} +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +%description flags +%{summary}. + +%package kio-smb +Summary: Samba KIO slave +# upgrade path +Obsoletes: kde-runtime < 4.9.2-5 +Requires: %{name} = %{version}-%{release} +%description kio-smb +%{summary}. + + +%prep +%setup -q -n kde-runtime-%{version} + +%patch1 -p1 -b .searchproviders-shortcuts +%patch6 -p1 -b .home_onlyshowin_kde +%patch7 -p1 -b .htsearch +%patch8 -p1 -b .config +%patch9 -p1 -b .man-overrides +%if 0%{?fedora} < 19 && 0%{?rhel} < 7 +%patch10 -p1 -b .kde310486 +%endif +%patch11 -p1 -b .trash-readonly +%patch50 -p1 -b .nepomuk_onlyshowin_kde +%patch51 -p1 -b .installdgbsymbols +%patch52 -p1 -b .mouseeventlistener +%patch53 -p1 -b .fullrelro +%patch54 -p1 -b .solid-device-automounter +%patch100 -p1 -b .kglobalaccel +%patch101 -p0 -b .kwalletd-new + +%if ! 0%{?webkit} +%patch300 -p1 -b .webkit +%global no_webkit -DKDERUNTIME_NO_WEBKIT:BOOL=ON -DPLASMA_NO_KDEWEBKIT:BOOL=ON +%endif + + +%build +mkdir -p %{_target_platform} +pushd %{_target_platform} +%{cmake_kde4} \ + %{?no_webkit} \ + .. +popd + +make %{?_smp_mflags} -C %{_target_platform} + + +%install +make install/fast DESTDIR=%{buildroot} -C %{_target_platform} + +# fix documentation multilib conflict in index.cache +for f in kioslave/nepomuksearch kcontrol/spellchecking kcontrol/performance \ + kcontrol/kcmnotify kcontrol/kcmcss kcontrol/ebrowsing; do + bunzip2 %{buildroot}%{_kde4_docdir}/HTML/en/$f/index.cache.bz2 + sed -i -e 's!name="id[a-z]*[0-9]*"!!g' %{buildroot}%{_kde4_docdir}/HTML/en/$f/index.cache + sed -i -e 's!#id[a-z]*[0-9]*"!!g' %{buildroot}%{_kde4_docdir}/HTML/en/$f/index.cache + sed -i -e 's!ftn.id[a-z]*[0-9]*"!ftn.id-123456!g' %{buildroot}%{_kde4_docdir}/HTML/en/$f/index.cache + bzip2 -9 %{buildroot}%{_kde4_docdir}/HTML/en/$f/index.cache +done + +# kdesu symlink +ln -s %{_kde4_libexecdir}/kdesu %{buildroot}%{_kde4_bindir}/kdesu + +# omit hicolor index.theme, use one from hicolor-icon-theme +rm -f %{buildroot}%{_kde4_iconsdir}/hicolor/index.theme + +# remove country flags because some people/countries forbid some other +# people/countries' flags :-( +%{!?flags:rm -f %{buildroot}%{_kde4_datadir}/locale/l10n/*/flag.png} + +# install this service for KDE 3 applications too +mkdir %{buildroot}%{_datadir}/services +ln -s %{_kde4_datadir}/kde4/services/khelpcenter.desktop \ + %{buildroot}%{_datadir}/services/khelpcenter.desktop + +# installdbgsymbols script +install -p -D -m755 drkonqi/doc/examples/installdbgsymbols_fedora.sh \ + %{buildroot}%{_kde4_libexecdir}/installdbgsymbols.sh + +# FIXME: -devel type files, omit for now +rm -vf %{buildroot}%{_kde4_libdir}/lib{kwalletbackend,molletnetwork}.so + +# rpaths +# use chrpath hammer for now, find better patching solutions later -- Rex +chrpath --list %{buildroot}%{_libdir}/kde4/plugins/phonon_platform/kde.so ||: +chrpath --delete %{buildroot}%{_libdir}/kde4/plugins/phonon_platform/kde.so + +%if 0%{?rhel} + rm -f %{buildroot}%{_kde4_datadir}/kde4/services/searchproviders/fedora.desktop +%endif + +%check +for f in %{buildroot}%{_kde4_datadir}/applications/kde4/*.desktop ; do + desktop-file-validate $f +done + + +%post +touch --no-create %{_kde4_iconsdir}/hicolor &> /dev/null || : + +%posttrans +gtk-update-icon-cache %{_kde4_iconsdir}/hicolor &> /dev/null || : +update-desktop-database -q &> /dev/null ||: +update-mime-database %{_kde4_datadir}/mime &> /dev/null + +%postun +if [ $1 -eq 0 ] ; then + touch --no-create %{_kde4_iconsdir}/hicolor &> /dev/null || : + gtk-update-icon-cache %{_kde4_iconsdir}/hicolor &> /dev/null || : + update-desktop-database -q &> /dev/null ||: + update-mime-database %{_kde4_datadir}/mime &> /dev/null +fi + +%files +%doc COPYING COPYING.LIB +%{_kde4_bindir}/* +%{_kde4_appsdir}/desktoptheme/ +%{_kde4_appsdir}/hardwarenotifications/ +%{_kde4_appsdir}/kcm_componentchooser/ +%{_kde4_appsdir}/kcmlocale/ +%{_kde4_appsdir}/kcm_phonon/ +%{_kde4_appsdir}/kconf_update/* +%{_kde4_appsdir}/kde/ +%{_kde4_appsdir}/kglobalaccel/ +%{_kde4_appsdir}/khelpcenter/ +%{_kde4_appsdir}/kio_bookmarks/ +%{_kde4_appsdir}/kio_desktop/ +%{_kde4_appsdir}/kio_docfilter/ +%{_kde4_appsdir}/kio_finger/ +%{_kde4_appsdir}/kio_info/ +%{_kde4_appsdir}/konqsidebartng/ +%{_kde4_appsdir}/ksmserver/ +%{_kde4_appsdir}/kwalletd/ +%{_kde4_appsdir}/libphonon/ +%{_kde4_appsdir}/phonon/ +%dir %{_kde4_appsdir}/remoteview/ +%{_kde4_appsdir}/remoteview/network.desktop +%{_kde4_configdir}/*.knsrc +%{_kde4_datadir}/config.kcfg/*.kcfg +%{_datadir}/dbus-1/interfaces/*.xml +%{_datadir}/dbus-1/services/*.service +%{_datadir}/dbus-1/system-services/*.service +%{_kde4_datadir}/autostart/nepomukcontroller.desktop +%{_kde4_datadir}/kde4/services/*.desktop +%{_kde4_datadir}/kde4/services/*.protocol +%{_kde4_datadir}/kde4/services/kded/ +%{_kde4_datadir}/kde4/services/searchproviders/ +%{_kde4_datadir}/kde4/servicetypes/* +%{_kde4_datadir}/mime/packages/network.xml +%{_kde4_datadir}/sounds/* +%{_kde4_iconsdir}/default.kde4 +%{_kde4_libdir}/kconf_update_bin/* +%{_kde4_libdir}/libkdeinit4_*.so +%{_kde4_libdir}/kde4/platformimports/ +%{_kde4_libdir}/kde4/kcm_*.so +%{_kde4_libdir}/kde4/kded_*.so +%{_kde4_libexecdir}/kcmremotewidgetshelper +%{_kde4_libexecdir}/kdeeject +%{_kde4_libexecdir}/kdesu +%attr(2755,root,nobody) %{_kde4_libexecdir}/kdesud +%{_kde4_libexecdir}/kdontchangethehostname +%{_kde4_libexecdir}/khc_docbookdig.pl +%{_kde4_libexecdir}/khc_htdig.pl +%{_kde4_libexecdir}/khc_htsearch.pl +%{_kde4_libexecdir}/khc_indexbuilder +%{_kde4_libexecdir}/khc_mansearch.pl +%{_kde4_libexecdir}/kioexec +%{_kde4_libexecdir}/knetattach +%{_mandir}/man1/* +%{_mandir}/man8/* +%{_kde4_iconsdir}/hicolor/*/*/* +%{_kde4_docdir}/HTML/en/* +%{_kde4_sysconfdir}/xdg/menus/kde-information.menu +%{_kde4_datadir}/applications/kde4/Help.desktop +%{_kde4_datadir}/applications/kde4/knetattach.desktop +%{_kde4_datadir}/applications/kde4/nepomukcontroller.desktop +%{_kde4_configdir}/kshorturifilterrc +%{_kde4_datadir}/desktop-directories/*.directory +%{_kde4_datadir}/emoticons/kde4/ +%{_kde4_datadir}/locale/l10n/ +%{_kde4_datadir}/locale/currency/ +%{?flags:%exclude %{_kde4_datadir}/locale/l10n/*/flag.png} +%{_datadir}/services/khelpcenter.desktop +%{_polkit_qt_policydir}/*.policy +%{_sysconfdir}/dbus-1/system.d/* +#exclude %{_kde4_datadir}/kde4/services/smb.protocol +#exclude %{_kde4_docdir}/HTML/en/kcontrol/smb/ +#exclude %{_kde4_docdir}/HTML/en/kioslave/smb/ + +#files kio-smb +%{_kde4_docdir}/HTML/en/kcontrol/smb/ +%{_kde4_docdir}/HTML/en/kioslave/smb/ +%dir %{_kde4_appsdir}/konqueror/dirtree/ +%dir %{_kde4_appsdir}/konqueror/dirtree/remote/ +%{_kde4_appsdir}/konqueror/dirtree/remote/smb-network.desktop +%dir %{_kde4_appsdir}/remoteview/ +%{_kde4_appsdir}/remoteview/smb-network.desktop +%{_kde4_datadir}/kde4/services/smb.protocol +# dup'd in -libs glob +#{_kde4_libdir}/kde4/kio_smb.so + +%files devel +%{_kde4_includedir}/* +%{_kde4_appsdir}/cmake/modules/*.cmake + +%if 0%{?fedora} > 16 || 0%{?rhel} > 6 +%post drkonqi +# make DrKonqi work by default by taming SELinux enough (suggested by dwalsh) +# if KDE_DEBUG is set, DrKonqi is disabled, so do nothing +# if it is unset (or empty), check if deny_ptrace is already disabled +# if not, disable it +if [ -z "$KDE_DEBUG" ] ; then + if [ "`getsebool deny_ptrace 2>/dev/null`" == 'deny_ptrace --> on' ] ; then + setsebool -P deny_ptrace off &> /dev/null || : + fi +fi +%endif + +%files drkonqi +%{_kde4_libexecdir}/drkonqi +%{_kde4_libexecdir}/installdbgsymbols.sh +%{_kde4_appsdir}/drkonqi/ + +%post libs -p /sbin/ldconfig +%postun libs -p /sbin/ldconfig + +%files libs +# unversioned plugin: +%{_kde4_libdir}/attica_kde.so +%{_kde4_libdir}/libknotifyplugin.so +%{_kde4_libdir}/libkwalletbackend.so.* +%{_kde4_libdir}/libmolletnetwork.so.* +%{_kde4_libdir}/kde4/*.so +%{_kde4_libdir}/kde4/imports/ +# FIXME: Is this a good idea? Won't multilib apps need KCMs, too? +%exclude %{_kde4_libdir}/kde4/kcm_*.so +%exclude %{_kde4_libdir}/kde4/kded_*.so +%{_kde4_libdir}/kde4/plugins/phonon_platform/ + +%if 0%{?flags} +%files flags +%{_kde4_datadir}/locale/l10n/*/flag.png +%endif + + +%changelog +* Thu Oct 05 2017 Jan Grulich - 4.10.5-10 +- Avoid duplicates in solid device automounter kcm + Resolves: bz#1084191 +- Enable automount overrides even when automatic mounting is disabled + Resolves: bz#1084497 + +* Wed Sep 06 2017 Jan Grulich - 4.10.5-8 +- fix multilib issue + +* Mon Mar 10 2014 Than Ngo - 4.10.5-7 +- add missing BR on gpgme-devel + +* Mon Mar 10 2014 Than Ngo - 4.10.5-6 +- backport new kwalletd + +* Fri Jan 24 2014 Daniel Mach - 4.10.5-5 +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 4.10.5-4 +- Mass rebuild 2013-12-27 + +* Tue Dec 10 2013 Jan Grulich - 4.10.5-3 +- Make kdesu full RELRO (#884056) + +* Wed Oct 30 2013 Daniel Vrátil - 4.10.5-2 +- fix: crash on invalid input on KGlobalAccel DBus interface (#1018207) + +* Sun Jun 30 2013 Than Ngo - 4.10.5-1 +- 4.10.5 + +* Tue Jun 18 2013 Rex Dieter - 4.10.4-3 +- avoid/workaround X3 plasma mouse scroll events (kde#316546) +- prune/fix changelog + +* Wed Jun 12 2013 Martin Briza - 4.10.4-2 +- Do not make deleted (moved to trash) files read only (thanks ltink for the patch) (#921735) + +* Sat Jun 01 2013 Rex Dieter - 4.10.4-1 +- 4.10.4 + +* Sat May 18 2013 Jan Grulich - 4.10.3-3 +- fix: phonon systemsettings module gets 'modified' without any changes + +* Mon May 13 2013 Than Ngo - 4.10.3-2 +- add mssing buildroot + +* Mon May 06 2013 Than Ngo - 4.10.3-1 +- 4.10.3 + +* Mon Apr 29 2013 Rex Dieter 4.10.2-3 +- move drkonqi-related scriptlet to -drkonqi subpkg + +* Mon Apr 29 2013 Than Ngo - 4.10.2-2 +- fix multilib issue + +* Sun Mar 31 2013 Rex Dieter - 4.10.2-1 +- 4.10.2 + +* Thu Mar 21 2013 Rex Dieter 4.10.1-3 +- Conflicts: kde-workspace < 4.9.60 (#924905) + +* Sun Mar 10 2013 Rex Dieter 4.10.1-2 +- rebuild (OpenEXR) + +* Sat Mar 02 2013 Rex Dieter 4.10.1-1 +- 4.10.1 + +* Thu Feb 21 2013 Rex Dieter 4.10.0-3 +- Requires: icoutils + +* Sat Feb 02 2013 Kevin Kofler - 4.10.0-2 +- ktimezoned: watch /etc/localtime if it doesn't exist yet (#906972) + +* Thu Jan 31 2013 Rex Dieter - 4.10.0-1 +- 4.10.0 + +* Mon Jan 28 2013 Rex Dieter 4.9.98-3 +- make upgrade hack apply on 4.9.98-2 +- Unable to logout after KDE upgrade (kde#310486) + +* Sun Jan 20 2013 Rex Dieter - 4.9.98-1 +- 4.9.98 + +* Fri Jan 18 2013 Adam Tkac - 4.9.97-2 +- rebuild due to "jpeg8-ABI" feature drop + +* Fri Jan 04 2013 Rex Dieter - 4.9.97-1 +- 4.9.97 + +* Thu Dec 20 2012 Rex Dieter - 4.9.95-1 +- 4.9.95 + +* Mon Dec 03 2012 Rex Dieter 4.9.90-1 +- 4.9.90 (4.10 beta2) + +* Mon Dec 03 2012 Than Ngo - 4.9.4-1 +- 4.9.4 + +* Mon Nov 19 2012 Than Ngo - 4.9.3-2 +- fedora/rhel condition + +* Fri Nov 02 2012 Rex Dieter 4.9.3-1 +- 4.9.3 +- drop -kio-smb subpkg + +* Mon Oct 29 2012 Rex Dieter 4.9.2-6 +- drop -desktoptheme subpkg, that one is a bad idea :( +- Requires: drkonqi + +* Mon Oct 29 2012 Rex Dieter - 4.9.2-5 +- -desktoptheme, -drkonqi, -kio-smb subpkgs (#855930) +- drop hard Requires: htdig (#855930) +- remove .spec cruft + +* Wed Oct 24 2012 Rex Dieter 4.9.2-4 +- rebuild (libjpeg-turbo v8) + +* Thu Oct 11 2012 Than Ngo - 4.9.2-3 +- update webkit patch + +* Tue Oct 02 2012 Rex Dieter 4.9.2-2 +- kde-runtime-4.9.2 is missing kio_smb (#862169) + +* Fri Sep 28 2012 Rex Dieter - 4.9.2-1 +- 4.9.2 + +* Mon Sep 03 2012 Than Ngo - 4.9.1-1 +- 4.9.1 + +* Tue Aug 07 2012 Rex Dieter 4.9.0-4 +- improve installdbgsymbols script + +* Sat Aug 04 2012 Than Ngo - 4.9.0-3 +- update webkit patch + +* Thu Aug 02 2012 Rex Dieter 4.9.0-2 +- respin + +* Thu Jul 26 2012 Lukas Tinkl - 4.9.0-1 +- 4.9.0 + +* Thu Jul 19 2012 Fedora Release Engineering - 4.8.97-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Jul 11 2012 Rex Dieter - 4.8.97-1 +- 4.8.97 + +* Wed Jun 27 2012 Jaroslav Reznik - 4.8.95-1 +- 4.8.95 + +* Wed Jun 20 2012 Rex Dieter 4.8.90-3 +- rebuild (attica) + +* Tue Jun 12 2012 Rex Dieter 4.8.90-2 +- BR: nepomuk-core-devel pkgconfig(NetworkManager) pkgconfig(qca2) + +* Sat Jun 09 2012 Rex Dieter - 4.8.90-1 +- 4.8.90 + +* Fri Jun 01 2012 Jaroslav Reznik - 4.8.80-2 +- respin + +* Sat May 26 2012 Jaroslav Reznik - 4.8.80-1 +- 4.8.80 +- add kactivities BR + +* Fri May 04 2012 Than Ngo - 4.8.3-3 +- add rhel/fedora condition + +* Wed May 02 2012 Rex Dieter - 4.8.3-2 +- rebuild (exiv2) + +* Mon Apr 30 2012 Jaroslav Reznik - 4.8.3-1 +- 4.8.3 + +* Fri Mar 30 2012 Jaroslav Reznik - 4.8.2-1 +- 4.8.2 + +* Thu Mar 08 2012 Rex Dieter 4.8.1-2 +- upstream listview margins patch + +* Mon Mar 05 2012 Jaroslav Reznik - 4.8.1-1 +- 4.8.1 +- fix libnepomukdatamanagement (-devel, -libs) + +* Tue Feb 28 2012 Fedora Release Engineering - 4.8.0-6 +- Rebuilt for c++ ABI breakage + +* Mon Feb 27 2012 Rex Dieter 4.8.0-5 +- Requires: dbus-x11 (#794958) + +* Wed Feb 08 2012 Kevin Kofler - 4.8.0-4 +- fix quoting in SELinux scriptlet (#788309) + +* Tue Feb 07 2012 Kevin Kofler - 4.8.0-3 +- add kconf_update script to migrate nepomukserverrc config group (#771053) + +* Mon Feb 06 2012 Kevin Kofler - 4.8.0-2 +- make DrKonqi work by default by taming SELinux enough (suggested by dwalsh) + +* Fri Jan 20 2012 Jaroslav Reznik - 4.8.0-1 +- 4.8.0 + +* Sat Jan 14 2012 Bruno Wolff III 4.7.97-12 +- Fix typo in kde-runtime-flags obsolete that prevents updates + +* Fri Jan 13 2012 Rex Dieter 4.7.97-11 +- %%check: desktop-file-validate +- %%doc COPYING COPYING.LIB + +* Wed Jan 04 2012 Rex Dieter 4.7.97-10 +- kdebase-runtime -> kde-runtime rename + +* Wed Jan 04 2012 Rex Dieter 4.7.97-1 +- 4.7.97 + +* Sat Dec 31 2011 Rex Dieter 4.7.95-2 +- rebuild (attica) + +* Wed Dec 21 2011 Radek Novacek - 4.7.95-1 +- 4.7.95 + +* Fri Dec 09 2011 Rex Dieter 4.7.90-2 +- make nepomuk menu items (with only oxygen icons) OnlyShowIn=KDE (#682055) + +* Sat Dec 03 2011 Rex Dieter 4.7.90-1 +- 4.7.90 + +* Fri Nov 18 2011 Jaroslav Reznik 4.7.80-1 +- 4.7.80 (beta 1) + +* Thu Nov 17 2011 Rex Dieter 4.7.3-12 +- active-development-4.7-diff.patch +- omit activitymanger unconditionally +- drop dep on libkactivities + +* Tue Nov 15 2011 Rex Dieter 4.7.3-11 +- BR: libjpeg-devel + +* Fri Nov 04 2011 Rex Dieter 4.7.3-10 +- no_activitymanager + +* Thu Nov 03 2011 Lukas Tinkl - 4.7.3-3 +- require poppler-utils for Nepomuk (PDF file indexing) + +* Mon Oct 31 2011 Rex Dieter 4.7.3-2 +- drop activitymanager/zeitgiest support + +* Sat Oct 29 2011 Rex Dieter 4.7.3-1 +- 4.7.3 +- drop QUrl hack/workaround + +* Wed Oct 26 2011 Rex Dieter 4.7.2-6 +- fix knotify, workaround Qt 4.8 QUrl.toLocalFile behavior change (#749213) + +* Tue Oct 25 2011 Rex Dieter 4.7.2-5 +- include toggle to omit activitymanager + +* Mon Oct 24 2011 Rex Dieter 4.7.2-4 +- pkgconfig-style deps + +* Fri Oct 14 2011 Rex Dieter - 4.7.2-3 +- rebuild (exiv2) + +* Wed Oct 05 2011 Rex Dieter 4.7.2-2 +- drop hard cagibi dep (add to comps instead) + +* Tue Oct 04 2011 Rex Dieter 4.7.2-1 +- 4.7.2 + +* Tue Sep 27 2011 Kevin Kofler 4.7.1-2 +- rebuild once again for fixed RPM dependency generators for Plasma + +* Fri Sep 02 2011 Than Ngo - 4.7.1-1 +- 4.7.1 + +* Sun Aug 21 2011 Kevin Kofler 4.7.0-5 +- rebuild again for the fixed RPM dependency generators for Plasma (#732271) + +* Sun Aug 21 2011 Kevin Kofler 4.7.0-4 +- rebuild for the RPM dependency generators for Plasma (GSoC 2011) + +* Tue Jul 26 2011 Jaroslav Reznik - 4.7.0-3 +- respin + +* Tue Jul 26 2011 Jaroslav Reznik 4.7.0-2 +- BR libqzeitgeist + +* Tue Jul 26 2011 Jaroslav Reznik 4.7.0-1 +- 4.7.0 +- Provides: kde-runtime (matching new upstream tarball) + +* Thu Jul 21 2011 Rex Dieter 4.6.95-2 +- rebuild (qt48) + +* Fri Jul 08 2011 Jaroslav Reznik 4.6.95-1 +- 4.6.95 (rc2) +- Nepomuk IndexCleaner throttling (kdebz#276593) + +* Tue Jun 28 2011 Rex Dieter 4.6.90-2 +- move oxygen-icons-theme dep (back) here from kdelibs + +* Mon Jun 27 2011 Than Ngo - 4.6.90-1 +- 4.6.90 (rc1) + +* Tue Jun 14 2011 Rex Dieter 4.6.80-2 +- drop xine support (f16+, #723933) +- drop references to crystalsvg icons + +* Fri May 27 2011 Jaroslav Reznik - 4.6.80-1 +- 4.6.80 (beta1) +- upstream tarball is now kde-runtime + +* Thu Apr 28 2011 Rex Dieter - 4.6.3-1 +- 4.6.3 + +* Wed Apr 06 2011 Than Ngo - 4.6.2-1 +- 4.6.2 + +* Thu Mar 24 2011 Kevin Kofler 4.6.1-3 +- rebuild in the main F15 buildroot now that NM 0.9 has been tagged into it + +* Wed Mar 23 2011 Rex Dieter 4.6.1-2 +- nm-0.9 support patch + +* Sat Feb 26 2011 Rex Dieter 4.6.1-1 +- 4.6.1 + +* Tue Feb 08 2011 Than Ngo - 4.6.0-2 +- add overrides in default manpath + +* Fri Jan 21 2011 Jaroslav Reznik - 4.6.0-1 +- 4.6.0 + +* Thu Jan 20 2011 Adam Williamson - 4.5.95-3 +- update compiz patch to launch ccsm for configuration, not simple-ccsm + (we don't package it) + +* Thu Jan 20 2011 Adam Williamson - 4.5.95-2 +- fix up compiz launching from systemsettings (by calling compiz-manager) + +* Wed Jan 05 2011 Jaroslav Reznik - 4.5.95-1 +- 4.5.95 (4.6rc2) + +* Sat Jan 01 2011 Rex Dieter - 4.5.90-2 +- rebuild (exiv2) + +* Wed Dec 22 2010 Rex Dieter 4.5.90-1 +- 4.5.90 (4.6rc) + +* Sat Dec 04 2010 Thomas Janssen 4.5.85-1 +- 4.5.85 (4.6beta2) + +* Tue Nov 23 2010 Rex Dieter 4.5.80-3 +- -libs: move libknotifyplugin.so here + +* Sun Nov 21 2010 Rex Dieter - 4.5.80-2 +- Conflicts: kdebase-workspace < 4.5.80 + +* Sat Nov 20 2010 Rex Dieter - 4.5.80-1 +- 4.5.80 (4.6beta1) + +* Fri Nov 12 2010 Rex Dieter - 4.5.4-4 +- fix build with newer phonon(4.4.3+) + +* Fri Nov 12 2010 Rex Dieter - 4.5.3-3 +- kdesu password-keeping does not work (#650630) +- htsearch patch + +* Thu Nov 11 2010 Rex Dieter - 4.5.3-2 +- Crash after visiting Phonon setting (#652409, kde#255736) + +* Fri Oct 29 2010 Than Ngo - 4.5.3-1 +- 4.5.3 + +* Fri Oct 15 2010 Rex Dieter - 4.5.2-3 +- pa speakersetup backport (courtesy of coling/mandriva) +- hammer rpath from phonon_platform/kde.so + +* Fri Oct 15 2010 Rex Dieter - 4.5.2-2 +- use kde4's copy of khelpcenter.desktop + +* Fri Oct 01 2010 Rex Dieter - 4.5.2-1 +- 4.5.2 + +* Fri Aug 27 2010 Jaroslav Reznik - 4.5.1-1 +- 4.5.1 + +* Tue Aug 10 2010 Than Ngo - 4.5.0-3 +- backport to fix the freeze of kded on first use of the network:/kio-slave + +* Fri Aug 06 2010 Jaroslav Reznik - 4.5.0-2 +- requires cagibi + +* Tue Aug 03 2010 Than Ngo - 4.5.0-1 +- 4.5.0 + +* Sun Jul 25 2010 Rex Dieter - 4.4.95-1 +- 4.5 RC3 (4.4.95) + +* Fri Jul 16 2010 Rex Dieter - 4.4.92-2 +- move oxygen-icon-theme (back) to kdelibs + +* Wed Jul 07 2010 Rex Dieter - 4.4.92-1 +- 4.5 RC2 (4.4.92) +- Requires: -flags +- drop virtuosoconverter patch + +* Fri Jun 25 2010 Jaroslav Reznik - 4.4.90-1 +- 4.5 RC1 (4.4.90) + +* Mon Jun 07 2010 Jaroslav Reznik - 4.4.85-1 +- 4.5 Beta 2 (4.4.85) +- added remote widgets service and policy (from kdelibs) + +* Mon May 31 2010 Rex Dieter - 4.4.80-2 +- rebuild (exiv2) + +* Fri May 21 2010 Jaroslav Reznik - 4.4.80-1 +- 4.5 Beta 1 (4.4.80) +- install dbus .service files + +* Fri Apr 30 2010 Jaroslav Reznik - 4.4.3-1 +- 4.4.3 + +* Wed Apr 21 2010 Rex Dieter - 4.4.2-3 +- kio_sftp does not work - "Error. Out of memory" (#582968) +- BR: libssh-devel >= 0.4.2 + +* Sat Apr 17 2010 Rex Dieter - 4.4.2-2 +- Requires: hal-storage-addon for f13 too (#579256) + +* Mon Mar 29 2010 Lukas Tinkl - 4.4.2-1 +- 4.4.2 + +* Tue Mar 16 2010 Rex Dieter - 4.4.1-2 +- Requires: hal-storage-addon (f14+) +- drop - 4.4.1-1 +- 4.4.1 + +* Mon Feb 08 2010 Than Ngo - 4.4.0-3 +- respin + +* Sun Feb 07 2010 Rex Dieter - 4.4.0-2 +- nepomuk_fulltextindex patch +- virtuosoconverter patch + +* Fri Feb 05 2010 Than Ngo - 4.4.0-1 +- 4.4.0 + +* Sun Jan 31 2010 Rex Dieter - 4.3.98-1 +- KDE 4.3.98 (4.4rc3) +- notifications for new global shortcuts should be silenced (#549784) + +* Wed Jan 20 2010 Lukas Tinkl - 4.3.95-1 +- KDE 4.3.95 (4.4rc2) + +* Tue Jan 19 2010 Kevin Kofler - 4.3.90-2 +- install installdbgsymbols_fedora.sh as %{_kde4_libexecdir}/installdbgsymbols.sh + +* Wed Jan 06 2010 Rex Dieter - 4.3.90-1 +- kde-4.3.85 (4.4rc1) + +* Sun Jan 03 2010 Rex Dieter - 4.3.85-3 +- rebuild (exiv2) + +* Sat Jan 02 2010 Rex Dieter - 4.3.85-2 +- Provides: desktop-notification-daemon + +* Fri Dec 18 2009 Rex Dieter - 4.3.85-1 +- kde-4.3.85 (4.4beta2) + +* Wed Dec 16 2009 Jaroslav Reznik - 4.3.80-4 +- Repositioning the KDE Brand (#547361) + +* Wed Dec 09 2009 Rex Dieter - 4.3.80-3 +- BR: attica-devel shared-desktop-ontologies-devel + +* Sat Dec 05 2009 Kevin Kofler - 4.3.80-2 +- BR exiv2-devel + +* Tue Dec 01 2009 Lukáš Tinkl - 4.3.80-1 +- KDE 4.4 beta1 (4.3.80) + +* Mon Nov 30 2009 Kevin Kofler - 4.3.75-0.2.svn1048496 +- BR libssh-devel >= 0.3.92 + +* Sat Nov 21 2009 Ben Boeckel - 4.3.75-0.1.svn1048496 +- update to 4.3.75 snapshot + +* Wed Nov 18 2009 Rex Dieter - 4.3.3-6 +- rebuild (qt-4.6.0-rc1, fc13+) + +* Sat Nov 14 2009 Rex Dieter - 4.3.3-5 +- disable manpath patch for now, does more harm than good (#532071) + +* Fri Nov 13 2009 Than Ngo - 4.3.3-4 +- rhel cleanup, fix conditional for RHEL + +* Wed Nov 11 2009 Than Ngo - 4.3.3-3 +- rhel cleanup, drop BR on openslp-devel + +* Thu Nov 05 2009 Rex Dieter 4.3.3-2 +- add OnlyShowIn=KDE to Desktop/Home.desktop (like trash.desktop) + +* Sat Oct 31 2009 Rex Dieter 4.3.3-1 +- 4.3.3 + +* Thu Oct 15 2009 Rex Dieter 4.3.2-4 +- Conflicts: kdebase4 < 4.3.0 instead + +* Wed Oct 14 2009 Rex Dieter 4.3.2-3 +- Conflicts: kdebase < 6:4.3.0 +- Requires: oxygen-icon-theme >= %%{version} + +* Tue Oct 06 2009 Rex Dieter 4.3.2-2 +- BR: bzip2-devel xz-devel +- -libs: move Requires: kdepimlibs... here + +* Sun Oct 04 2009 Than Ngo - 4.3.2-1 +- 4.3.2 + +* Wed Sep 30 2009 Nils Philippsen - 4.3.1-4 +- fix manpath patch (spotted by Kevin Kofler) + +* Wed Sep 30 2009 Nils Philippsen - 4.3.1-3 +- if available, use the "manpath" command in the man kioslave to determine man + page file locations + +* Tue Sep 15 2009 Rex Dieter - 4.3.1-2 +- restore some previously inadvertantly omitted nepomuk ontologies + +* Fri Aug 28 2009 Than Ngo - 4.3.1-1 +- 4.3.1 + +* Wed Aug 12 2009 Lukáš Tinkl - 4.3.0-4 +- unbreak fish kioslave protocol (#516416) + +* Mon Aug 10 2009 Lukáš Tinkl - 4.3.0-3 +- fix Oxygen comboboxes' text being garbled (drawn twice); fixes kdebug:202701 +- fix Locale control module crashing when dragging languages around (kdebug:201578) + +* Tue Aug 04 2009 Than Ngo - 4.3.0-2 +- respin + +* Thu Jul 30 2009 Than Ngo - 4.3.0-1 +- 4.3.0 + +* Fri Jul 24 2009 Fedora Release Engineering - 4.2.98-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 22 2009 Than Ngo - 4.2.98-1 +- 4.3rc3 + +* Thu Jul 16 2009 Rex Dieter - 4.2.96-2 +- respin (soprano-2.3.0) +- License: LGPLv2+ + +* Thu Jul 09 2009 Than Ngo - 4.2.96-1 +- 4.3rc2 + +* Thu Jul 02 2009 Rex Dieter 4.2.95-3 +- drop unneeded BR: ImageMagick (#509241) + +* Mon Jun 29 2009 Lukáš Tinkl - 4.2.95-2 +- don't start nepomuk server unconditionally (#487322) + +* Thu Jun 25 2009 Than Ngo - 4.2.95-1 +- 4.3rc1 + +* Wed Jun 03 2009 Rex Dieter - 4.2.90-1 +- KDE-4.3 beta2 (4.2.90) + +* Tue Jun 02 2009 Lorenzo Villani - 4.2.85-3 +- Drop old Fedora < 8 conditionals + +* Tue May 19 2009 Than Ngo - 4.2.85-2 +- file conflicts with kdepim + +* Wed May 13 2009 Lukáš Tinkl - 4.2.85-1 +- KDE 4.3 beta 1 + +* Thu Apr 16 2009 Rex Dieter - 4.2.2-4 +- fix persistent systray notifications (#485796) + +* Wed Apr 01 2009 Rex Dieter - 4.2.2-3 +- -flags subpkg +- koji/noarch hacks dropped + +* Wed Apr 01 2009 Than Ngo - 4.2.2-2 +- drop kdebase-runtime-4.2.1-pulseaudio-cmake.patch + +* Mon Mar 30 2009 Lukáš Tinkl - 4.2.2-1 +- KDE 4.2.2 + +* Fri Mar 27 2009 Rex Dieter - 4.2.1-3 +- flags subpkg (not enabled) +- optimize scriptlets + +* Tue Mar 3 2009 Lukáš Tinkl - 4.2.1-2 +- fix PulseAudio cmake detection + +* Fri Feb 27 2009 Than Ngo - 4.2.1-1 +- 4.2.1 + +* Wed Feb 25 2009 Fedora Release Engineering - 4.2.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Wed Feb 18 2009 Lukáš Tinkl - 4.2.0-7 +- #486059 - missing dependency on htdig + +* Thu Feb 12 2009 Rex Dieter - 4.2.0-6 +- -libs: include %%{_kde4_libdir}/libkwalletbackend.so.* here + +* Thu Feb 12 2009 Rex Dieter - 4.2.0-5 +- Req: %%{name}-libs%%{?_isa} for multilib sanity (#456926) + +* Mon Feb 02 2009 Rex Dieter - 4.2.0-4 +- own %%_kde4_datadir/locale/l10n/ + +* Mon Jan 26 2009 Rex Dieter - 4.2.0-3 +- respun tarball + +* Mon Jan 26 2009 Rex Dieter - 4.2.0-2 +- Files not trashed to the correct location in Dolphin/Konqueror + (#481598, kdebug#178479) +- omit --with-samba crud + +* Thu Jan 22 2009 Than Ngo - 4.2.0-1 +- 4.2.0 +- +BR: pulseaudio-libs-devel xine-lib-devel +- -BR: giflib-devel pcre-devel + +* Tue Jan 13 2009 Rex Dieter 4.1.96-2 +- tarball respin +- drop extraneous deps (that are in kdelibs) + +* Wed Jan 07 2009 Than Ngo - 4.1.96-1 +- 4.2rc1 + +* Mon Dec 22 2008 Rex Dieter 4.1.85-2 +- include %%_bindir/kdesu symlink + +* Thu Dec 11 2008 Than Ngo 4.1.85-1 +- 4.2beta2 + +* Mon Dec 01 2008 Kevin Kofler 4.1.80-5 +- don't ship libkwalletbackend.so devel symlink (conflicts with kdelibs3-devel, + and should be in a -devel package if it gets shipped) + +* Thu Nov 27 2008 Kevin Kofler 4.1.80-4 +- BR strigi-devel >= 0.5.11.1 because 0.5.11 is broken + +* Thu Nov 20 2008 Kevin Kofler 4.1.80-3 +- readd still relevant part of the Phonon PulseAudio patch (for the KCM) + +* Wed Nov 19 2008 Than Ngo 4.1.80-2 +- drop kdebase-runtime-4.0.72-pulseaudio.patch/icons, it's part of phonon + +* Wed Nov 19 2008 Lorenzo Villani - 4.1.80-1 +- 4.1.80 +- Drop upstreamed patch kdebase-runtime-4.1.2-kioexec.patch +- BR cmake >= 2.6.2 +- Use 'make install/fast' +- Drop subpkg phonon-backend-xine and related file entries: this has to be + part of phonon now that it moved there +- Drop xine-lib-devel BR +- Add libkwalletbackend to files list +- Drop _default_patch_fuzz 2 + +* Thu Nov 13 2008 Than Ngo 4.1.3-5 +- apply upstream patch to fix X crash when disabling compositing + +* Wed Nov 12 2008 Than Ngo 4.1.3-1 +- 4.1.3 + +* Tue Oct 14 2008 Than Ngo 4.1.2-5 +- apply upstream patch, kioexec processes never terminate + +* Tue Sep 30 2008 Than Ngo 4.1.2-4 +- fix broken audio-backend-jack.svgz + +* Tue Sep 30 2008 Than Ngo 4.1.2-3 +- add missing icons + +* Sun Sep 28 2008 Rex Dieter 4.1.2-2 +- make VERBOSE=1 +- respin against new(er) kde-filesystem +- grow -libs, kde4 styles are unavailable for i386 applications (#456826) + +* Fri Sep 26 2008 Rex Dieter 4.1.1-3 +- fix inherit issue in iconthemes, preview icons + do not show + +* Mon Sep 01 2008 Than Ngo 4.1.1-2 +- fix #460710, knetattach is kio_remote's wizard program, don't show + it in the menu. + +* Thu Aug 28 2008 Than Ngo 4.1.1-1 +- 4.1.1 + +* Wed Aug 13 2008 Kevin Kofler 4.1.0-3 +- fix PA not being default in the Xine backend (KCM part, see phonon-4.2.0-4) + +* Tue Aug 12 2008 Than Ngo 4.1.0-2 +- crash fix when stopping a service that is not yet initialized + +* Fri Jul 25 2008 Kevin Kofler 4.1.0-1.1 +- don't remove autostart directory on F8- (does not conflict, fixes build + failure due to nepomukserver.desktop listed in filelist but not found) + +* Wed Jul 23 2008 Than Ngo 4.1.0-1 +- 4.1.0 + +* Wed Jul 23 2008 Rex Dieter 4.0.99-2 +- phonon-backend-xine: drop Obsoletes/Requires upgrade hack + +* Fri Jul 18 2008 Rex Dieter 4.0.99-1 +- 4.0.99 + +* Mon Jul 14 2008 Rex Dieter 4.0.98-4 +- respin + +* Mon Jul 14 2008 Rex Dieter 4.0.98-3 +- -phonon-backend-xine: new subpkg + +* Thu Jul 10 2008 Rex Dieter 4.0.98-1 +- 4.0.98 + +* Sun Jul 06 2008 Rex Dieter 4.0.85-1 +- 4.0.85 + +* Fri Jun 27 2008 Rex Dieter 4.0.84-1 +- 4.0.84 + +* Thu Jun 19 2008 Than Ngo 4.0.83-1 +- 4.0.83 (beta2) + +* Sat Jun 14 2008 Rex Dieter 4.0.82-1 +- 4.0.82 + +* Thu Jun 05 2008 Than Ngo 4.0.80-2 +- add searchproviders-shortcuts for redhat bugzilla + +* Mon May 26 2008 Than Ngo 4.0.80-1 +- 4.1 beta 1 + +* Tue May 06 2008 Kevin Kofler 4.0.72-2 +- BR new minimum version of soprano-devel + +* Tue May 06 2008 Kevin Kofler 4.0.72-1 +- update to 4.0.72 (4.1 alpha 1) +- drop upstreamed deinterlace-crash patch +- drop khelpcenter patch (fixed upstream) +- update Phonon PulseAudio patch +- drop Fedora 7 support +- update file list + +* Mon Apr 28 2008 Rex Dieter 4.0.3-10.1 +- omit conflicting icons (kde3_desktop=1 case) + +* Thu Apr 17 2008 Rex Dieter 4.0.3-10 +- oxygen-icon-theme: build noarch + +* Thu Apr 17 2008 Rex Dieter 4.0.3-9 +- %%post/%%postun: hicolor icon theme scriptlets + +* Thu Apr 17 2008 Than Ngo 4.0.3-8 +- only omit hicolor index.theme (#439374) + +* Thu Apr 17 2008 Than Ngo 4.0.3-7 +- fix khelpcenter, search plugins/settings in correct path (#443016) + +* Tue Apr 15 2008 Rex Dieter 4.0.3-6 +- respin (at f13's request) + +* Mon Apr 07 2008 Rex Dieter 4.0.3-5 +- pulseaudio patch (use as default, if available) + +* Sat Apr 05 2008 Kevin Kofler 4.0.3-4 +- don't crash if we don't have deinterlacing support in xine-lib (#440299) + +* Thu Apr 03 2008 Kevin Kofler 4.0.3-3 +- rebuild for the new %%{_kde4_buildtype} + +* Mon Mar 31 2008 Kevin Kofler 4.0.3-2 +- update file list for _kde4_libexecdir + +* Fri Mar 28 2008 Than Ngo 4.0.3-1 +- 4.0.3 + +* Thu Mar 20 2008 Rex Dieter 4.0.2-5 +- don't own %%_kde4_docdir/HTML/en/ + +* Thu Mar 20 2008 Rex Dieter 4.0.2-4 +- oxygen-icon-theme, oxygen-icon-theme-scalable pkgs +- include noarch build hooks (not enabled) + +* Fri Mar 07 2008 Kevin Kofler 4.0.2-3 +- BR libxcb-devel everywhere (including F7) + +* Fri Mar 07 2008 Kevin Kofler 4.0.2-2 +- if building for a KDE 4 desktop, include the khelpcenter.desktop service + description for KDE 3 here so help works in KDE 3 apps + +* Fri Feb 29 2008 Than Ngo 4.0.2-1 +- 4.0.2 + +* Mon Feb 25 2008 Rex Dieter 4.0.1-3 +- %%files: don't own %%_kde4_libdir/kde4/plugins (thanks wolfy!) + +* Sat Feb 23 2008 Kevin Kofler 4.0.1-2 +- reenable kio_smb everywhere (including F9) now that we have a GPLv3 qt4 + (kio_smb itself is already GPLv2+) + +* Wed Jan 30 2008 Rex Dieter 4.0.1-1 +- 4.0.1 + +* Tue Jan 08 2008 Rex Dieter 4.0.0-2 +- respun tarball + +* Mon Jan 07 2008 Kevin Kofler 4.0.0-1 +- update to 4.0.0 +- update file list, don't remove renamed khotnewstuff.knsrc for KDE 3 desktop