From dfe289850f068f19ba4a83ab4e7e22a7e09c13c9 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 26 Jan 2013 13:17:21 -0600 Subject: Rename a number of libraries and executables to avoid conflicts with KDE4 --- kio/CMakeLists.txt | 4 +- kio/Makefile.am | 4 +- kio/kfile/ChangeLog | 2 +- kio/kfile/kfiledetailview.cpp | 2 +- kio/kfile/kfileiconview.cpp | 2 +- kio/kfile/kfiletreeview.cpp | 2 +- kio/kfile/kopenwith.cpp | 2 +- kio/kfile/kpropertiesdialog.cpp | 4 +- kio/kfile/kurlrequester.cpp | 2 +- kio/kio/CMakeLists.txt | 4 +- kio/kio/Makefile.am | 6 +- kio/kio/kdatatool.cpp | 2 +- kio/kio/kfilemetainfo.cpp | 2 +- kio/kio/kimageio.cpp | 4 +- kio/kio/kimageiofactory.h | 2 +- kio/kio/kmimetype.cpp | 6 +- kio/kio/kmimetype.h | 2 +- kio/kio/kmimetypechooser.cpp | 2 +- kio/kio/kprotocolinfo.h | 4 +- kio/kio/kservice.cpp | 8 +- kio/kio/kservice.h | 2 +- kio/kio/kservicefactory.cpp | 6 +- kio/kio/kservicefactory.h | 2 +- kio/kio/kservicegroup.cpp | 2 +- kio/kio/kservicegroup.h | 6 +- kio/kio/kservicegroupfactory.cpp | 6 +- kio/kio/kservicegroupfactory.h | 2 +- kio/kio/kservicetype.cpp | 4 +- kio/kio/kservicetype.h | 2 +- kio/kio/kservicetypefactory.cpp | 6 +- kio/kio/kservicetypefactory.h | 2 +- kio/kio/ktrader.h | 2 +- kio/kio/kurifilter.cpp | 2 +- kio/kio/kuserprofile.cpp | 2 +- kio/kio/metainfojob.cpp | 2 +- kio/kioexec/Makefile.am | 2 +- kio/kpasswdserver/CMakeLists.txt | 2 +- kio/kpasswdserver/Makefile.am | 4 +- kio/kpasswdserver/kpasswdserver.cpp | 4 +- kio/kssl/CMakeLists.txt | 2 +- kio/kssl/Makefile.am | 2 +- kio/kssl/ksslkeygen.cc | 2 +- kio/misc/CMakeLists.txt | 4 +- kio/misc/Makefile.am | 6 +- kio/misc/kfile/Makefile.am | 2 +- kio/misc/kntlm/CMakeLists.txt | 43 - kio/misc/kntlm/Makefile.am | 12 - kio/misc/kntlm/des.cpp | 513 -------- kio/misc/kntlm/des.h | 19 - kio/misc/kntlm/kntlm.cpp | 389 ------ kio/misc/kntlm/kntlm.h | 233 ---- kio/misc/kntlm/kswap.h | 428 ------- kio/misc/ksendbugmail/Makefile.am | 2 +- kio/misc/kwalletd/CMakeLists.txt | 49 - kio/misc/kwalletd/Makefile.am | 35 - kio/misc/kwalletd/kbetterthankdialogbase.ui | 154 --- kio/misc/kwalletd/kbetterthankdialogbase.ui.h | 50 - kio/misc/kwalletd/ktimeout.cpp | 84 -- kio/misc/kwalletd/ktimeout.h | 52 - kio/misc/kwalletd/kwalletd.cpp | 1514 ----------------------- kio/misc/kwalletd/kwalletd.desktop | 151 --- kio/misc/kwalletd/kwalletd.h | 199 --- kio/misc/kwalletd/kwalletwizard.ui | 545 -------- kio/misc/kwalletd/kwalletwizard.ui.h | 74 -- kio/misc/tdentlm/CMakeLists.txt | 43 + kio/misc/tdentlm/Makefile.am | 12 + kio/misc/tdentlm/des.cpp | 513 ++++++++ kio/misc/tdentlm/des.h | 19 + kio/misc/tdentlm/kswap.h | 428 +++++++ kio/misc/tdentlm/tdentlm.cpp | 389 ++++++ kio/misc/tdentlm/tdentlm.h | 233 ++++ kio/misc/tdewalletd/CMakeLists.txt | 49 + kio/misc/tdewalletd/Makefile.am | 35 + kio/misc/tdewalletd/kbetterthankdialogbase.ui | 154 +++ kio/misc/tdewalletd/kbetterthankdialogbase.ui.h | 50 + kio/misc/tdewalletd/ktimeout.cpp | 84 ++ kio/misc/tdewalletd/ktimeout.h | 52 + kio/misc/tdewalletd/tdewalletd.cpp | 1514 +++++++++++++++++++++++ kio/misc/tdewalletd/tdewalletd.desktop | 151 +++ kio/misc/tdewalletd/tdewalletd.h | 199 +++ kio/misc/tdewalletd/tdewalletwizard.ui | 545 ++++++++ kio/misc/tdewalletd/tdewalletwizard.ui.h | 74 ++ kio/tests/Makefile.am | 18 +- kio/tests/kdirwatchunittest.cpp | 2 +- kio/tests/kdirwatchunittest.h | 4 +- kio/tests/ksycocatest.cpp | 360 ------ kio/tests/ksycocaupdatetest.cpp | 11 - kio/tests/kurifiltertest.cpp | 2 +- kio/tests/tdesycocatest.cpp | 360 ++++++ kio/tests/tdesycocaupdatetest.cpp | 11 + 90 files changed, 5001 insertions(+), 5001 deletions(-) delete mode 100644 kio/misc/kntlm/CMakeLists.txt delete mode 100644 kio/misc/kntlm/Makefile.am delete mode 100644 kio/misc/kntlm/des.cpp delete mode 100644 kio/misc/kntlm/des.h delete mode 100644 kio/misc/kntlm/kntlm.cpp delete mode 100644 kio/misc/kntlm/kntlm.h delete mode 100644 kio/misc/kntlm/kswap.h delete mode 100644 kio/misc/kwalletd/CMakeLists.txt delete mode 100644 kio/misc/kwalletd/Makefile.am delete mode 100644 kio/misc/kwalletd/kbetterthankdialogbase.ui delete mode 100644 kio/misc/kwalletd/kbetterthankdialogbase.ui.h delete mode 100644 kio/misc/kwalletd/ktimeout.cpp delete mode 100644 kio/misc/kwalletd/ktimeout.h delete mode 100644 kio/misc/kwalletd/kwalletd.cpp delete mode 100644 kio/misc/kwalletd/kwalletd.desktop delete mode 100644 kio/misc/kwalletd/kwalletd.h delete mode 100644 kio/misc/kwalletd/kwalletwizard.ui delete mode 100644 kio/misc/kwalletd/kwalletwizard.ui.h create mode 100644 kio/misc/tdentlm/CMakeLists.txt create mode 100644 kio/misc/tdentlm/Makefile.am create mode 100644 kio/misc/tdentlm/des.cpp create mode 100644 kio/misc/tdentlm/des.h create mode 100644 kio/misc/tdentlm/kswap.h create mode 100644 kio/misc/tdentlm/tdentlm.cpp create mode 100644 kio/misc/tdentlm/tdentlm.h create mode 100644 kio/misc/tdewalletd/CMakeLists.txt create mode 100644 kio/misc/tdewalletd/Makefile.am create mode 100644 kio/misc/tdewalletd/kbetterthankdialogbase.ui create mode 100644 kio/misc/tdewalletd/kbetterthankdialogbase.ui.h create mode 100644 kio/misc/tdewalletd/ktimeout.cpp create mode 100644 kio/misc/tdewalletd/ktimeout.h create mode 100644 kio/misc/tdewalletd/tdewalletd.cpp create mode 100644 kio/misc/tdewalletd/tdewalletd.desktop create mode 100644 kio/misc/tdewalletd/tdewalletd.h create mode 100644 kio/misc/tdewalletd/tdewalletwizard.ui create mode 100644 kio/misc/tdewalletd/tdewalletwizard.ui.h delete mode 100644 kio/tests/ksycocatest.cpp delete mode 100644 kio/tests/ksycocaupdatetest.cpp create mode 100644 kio/tests/tdesycocatest.cpp create mode 100644 kio/tests/tdesycocaupdatetest.cpp (limited to 'kio') diff --git a/kio/CMakeLists.txt b/kio/CMakeLists.txt index 3bd4ba8b7..cd2dfd80e 100644 --- a/kio/CMakeLists.txt +++ b/kio/CMakeLists.txt @@ -65,7 +65,7 @@ configure_file( ${CMAKE_SOURCE_DIR}/cmake/modules/template_dummy_cpp.cmake dummy tde_add_library( ${target} SHARED SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp VERSION 4.2.0 - EMBED kssl-static kiocore-static ksycoca-static kbookmarks-static kfile-static ${ELFICON_STATIC_LIB} - LINK ltdlc-static tdeui-shared tdesu-shared kwalletclient-shared ${LIBR_LIBRARIES} + EMBED kssl-static kiocore-static tdesycoca-static kbookmarks-static kfile-static ${ELFICON_STATIC_LIB} + LINK ltdlc-static tdeui-shared tdesu-shared tdewalletclient-shared ${LIBR_LIBRARIES} DESTINATION ${LIB_INSTALL_DIR} ) diff --git a/kio/Makefile.am b/kio/Makefile.am index b639d43df..fbe0d75dc 100644 --- a/kio/Makefile.am +++ b/kio/Makefile.am @@ -29,9 +29,9 @@ libkio_la_SOURCES = dummy.cpp libkio_la_LDFLAGS = -version-info 6:0:2 -no-undefined $(all_libraries) \ $(KDE_MT_LDFLAGS) libkio_la_LIBADD = kssl/libkssl.la kio/libkiocore.la \ - kio/libksycoca.la bookmarks/libkbookmarks.la kfile/libkfile.la \ + kio/libtdesycoca.la bookmarks/libkbookmarks.la kfile/libkfile.la \ ../tdeui/libtdeui.la ../tdesu/libtdesu.la \ - ../kwallet/client/libkwalletclient.la \ + ../tdewallet/client/libtdewalletclient.la \ $(LIBZ) $(LIBFAM) $(LIBVOLMGT) $(ACL_LIBS) $(LIB_QT) $(LIB_TDECORE) $(top_builddir)/dcop/libDCOP.la $(LIB_X11) kde_mime_DATA = magic diff --git a/kio/kfile/ChangeLog b/kio/kfile/ChangeLog index ac05c86d0..2c9651390 100644 --- a/kio/kfile/ChangeLog +++ b/kio/kfile/ChangeLog @@ -622,7 +622,7 @@ Mon Mar 16 11:36:07 1998 Daniel Grana a mkdir method to kdir in near future Mon Mar 16 20:04:00 1998 Martin Jones - * Added booktoken.* to remove dependancy on khtmlw and jscript + * Added booktoken.* to remove dependancy on tdehtmlw and jscript Thu Mar 12 09:32:06 1998 Daniel Grana * worked on the dir and file completion, should do both now, diff --git a/kio/kfile/kfiledetailview.cpp b/kio/kfile/kfiledetailview.cpp index 099a7cee5..da61d0a9f 100644 --- a/kio/kfile/kfiledetailview.cpp +++ b/kio/kfile/kfiledetailview.cpp @@ -543,7 +543,7 @@ TQDragObject *KFileDetailView::dragObject() } TQPixmap pixmap; if( urls.count() > 1 ) - pixmap = DesktopIcon( "kmultiple", KIcon::SizeSmall ); + pixmap = DesktopIcon( "tdemultiple", KIcon::SizeSmall ); if( pixmap.isNull() ) pixmap = currentFileItem()->pixmap( KIcon::SizeSmall ); diff --git a/kio/kfile/kfileiconview.cpp b/kio/kfile/kfileiconview.cpp index 5d9977de6..f0ef11bfe 100644 --- a/kio/kfile/kfileiconview.cpp +++ b/kio/kfile/kfileiconview.cpp @@ -817,7 +817,7 @@ TQDragObject *KFileIconView::dragObject() } TQPixmap pixmap; if( urls.count() > 1 ) - pixmap = DesktopIcon( "kmultiple", iconSize() ); + pixmap = DesktopIcon( "tdemultiple", iconSize() ); if( pixmap.isNull() ) pixmap = currentFileItem()->pixmap( iconSize() ); diff --git a/kio/kfile/kfiletreeview.cpp b/kio/kfile/kfiletreeview.cpp index e8451077d..0b8504fd6 100644 --- a/kio/kfile/kfiletreeview.cpp +++ b/kio/kfile/kfiletreeview.cpp @@ -262,7 +262,7 @@ TQDragObject * KFileTreeView::dragObject() TQPoint hotspot; TQPixmap pixmap; if( urls.count() > 1 ){ - pixmap = DesktopIcon( "kmultiple", 16 ); + pixmap = DesktopIcon( "tdemultiple", 16 ); } if( pixmap.isNull() ) pixmap = currentKFileTreeViewItem()->fileItem()->pixmap( 16 ); diff --git a/kio/kfile/kopenwith.cpp b/kio/kfile/kopenwith.cpp index efeaa1f02..691487730 100644 --- a/kio/kfile/kopenwith.cpp +++ b/kio/kfile/kopenwith.cpp @@ -54,7 +54,7 @@ #include #include #include -#include +#include #include #include "kopenwith.h" diff --git a/kio/kfile/kpropertiesdialog.cpp b/kio/kfile/kpropertiesdialog.cpp index e9296ca90..0b1f6c05b 100644 --- a/kio/kfile/kpropertiesdialog.cpp +++ b/kio/kfile/kpropertiesdialog.cpp @@ -117,7 +117,7 @@ extern "C" { #include #include #include -#include +#include #include #include #include @@ -818,7 +818,7 @@ KFilePropsPlugin::KFilePropsPlugin( KPropertiesDialog *_props ) if ( (*it)->mode() != mode ) mode = (mode_t)0; if ( KMimeType::iconForURL(url, mode) != iconStr ) - iconStr = "kmultiple"; + iconStr = "tdemultiple"; if ( url.directory() != directory ) directory = TQString::null; if ( url.protocol() != protocol ) diff --git a/kio/kfile/kurlrequester.cpp b/kio/kfile/kurlrequester.cpp index 5d1495127..99e6e96f0 100644 --- a/kio/kfile/kurlrequester.cpp +++ b/kio/kfile/kurlrequester.cpp @@ -389,7 +389,7 @@ bool KURLRequester::eventFilter( TQObject *obj, TQEvent *ev ) if ( ( TQT_BASE_OBJECT(d->edit) == TQT_BASE_OBJECT(obj) ) || ( TQT_BASE_OBJECT(d->combo) == TQT_BASE_OBJECT(obj) ) ) { if (( ev->type() == TQEvent::FocusIn ) || ( ev->type() == TQEvent::FocusOut )) - // Forward focusin/focusout events to the urlrequester; needed by file form element in khtml + // Forward focusin/focusout events to the urlrequester; needed by file form element in tdehtml TQApplication::sendEvent( this, ev ); } return TQWidget::eventFilter( obj, ev ); diff --git a/kio/kio/CMakeLists.txt b/kio/kio/CMakeLists.txt index 25d4fad83..1a2c3a263 100644 --- a/kio/kio/CMakeLists.txt +++ b/kio/kio/CMakeLists.txt @@ -90,9 +90,9 @@ tde_add_library( ${target} STATIC_PIC AUTOMOC ) -##### ksycoca ################################### +##### tdesycoca ################################### -set( target ksycoca ) +set( target tdesycoca ) set( ${target}_SRCS kdirwatch.cpp kfileshare.cpp ksambashare.cpp diff --git a/kio/kio/Makefile.am b/kio/kio/Makefile.am index 2034a33b6..63d5fc5d8 100644 --- a/kio/kio/Makefile.am +++ b/kio/kio/Makefile.am @@ -20,11 +20,11 @@ AM_CPPFLAGS = -D_LARGEFILE64_SOURCE INCLUDES= -I$(top_srcdir) -I$(srcdir)/.. -I$(top_srcdir)/tdecore/network -I$(srcdir)/../kssl -I../kssl -I$(srcdir)/../../interfaces $(all_includes) $(SSL_INCLUDES) -noinst_LTLIBRARIES = libkiocore.la libksycoca.la +noinst_LTLIBRARIES = libkiocore.la libtdesycoca.la # convenience lib - no LDFLAGS or LIBADD ! -libksycoca_la_SOURCES = \ +libtdesycoca_la_SOURCES = \ kdirwatch.cpp \ kfileshare.cpp ksambashare.cpp knfsshare.cpp \ ktrader.cpp ktraderparse.cpp ktraderparsetree.cpp \ @@ -43,7 +43,7 @@ libksycoca_la_SOURCES = \ kfilemetainfo.cpp kdcopservicestarter.cpp \ dataslave.cpp dataprotocol.cpp #if USE_POSIX_ACL - libksycoca_la_SOURCES += kacl.cpp posixacladdons.cpp + libtdesycoca_la_SOURCES += kacl.cpp posixacladdons.cpp #endif include_HEADERS = \ diff --git a/kio/kio/kdatatool.cpp b/kio/kio/kdatatool.cpp index 17a220541..08630d110 100644 --- a/kio/kio/kdatatool.cpp +++ b/kio/kio/kdatatool.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include diff --git a/kio/kio/kfilemetainfo.cpp b/kio/kio/kfilemetainfo.cpp index 85fb1a37f..a5d34fa07 100644 --- a/kio/kio/kfilemetainfo.cpp +++ b/kio/kio/kfilemetainfo.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include diff --git a/kio/kio/kimageio.cpp b/kio/kio/kimageio.cpp index cdbaa8ea3..e983cb945 100644 --- a/kio/kio/kimageio.cpp +++ b/kio/kio/kimageio.cpp @@ -24,8 +24,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/kio/kio/kimageiofactory.h b/kio/kio/kimageiofactory.h index 603ef2c0e..6d2d15940 100644 --- a/kio/kio/kimageiofactory.h +++ b/kio/kio/kimageiofactory.h @@ -8,7 +8,7 @@ #ifndef SSK_KIMGIOFACTORY_H #define SSK_KIMGIOFACTORY_H -#include "ksycocafactory.h" +#include "tdesycocafactory.h" #include "kimageio.h" class KImageIOFormat; diff --git a/kio/kio/kmimetype.cpp b/kio/kio/kmimetype.cpp index 397fbc9e9..c6f879a73 100644 --- a/kio/kio/kmimetype.cpp +++ b/kio/kio/kmimetype.cpp @@ -56,7 +56,7 @@ #include #include #include -#include +#include #include template class KSharedPtr; @@ -144,7 +144,7 @@ KMimeType::Ptr KMimeType::mimeType( const TQString& _name ) if ( !mime || !mime->isType( KST_KMimeType ) ) { - // When building ksycoca, findServiceTypeByName doesn't create an object + // When building tdesycoca, findServiceTypeByName doesn't create an object // but returns one from a dict. if ( !KSycoca::self()->isBuilding() ) delete mime; @@ -426,7 +426,7 @@ void KMimeType::save( TQDataStream& _str ) { KServiceType::save( _str ); // Warning adding/removing fields here involves a binary incompatible change - update version - // number in ksycoca.h + // number in tdesycoca.h _str << m_lstPatterns; } diff --git a/kio/kio/kmimetype.h b/kio/kio/kmimetype.h index 8302fa8da..19a846b46 100644 --- a/kio/kio/kmimetype.h +++ b/kio/kio/kmimetype.h @@ -29,7 +29,7 @@ #include #include -#include +#include #include class KSimpleConfig; diff --git a/kio/kio/kmimetypechooser.cpp b/kio/kio/kmimetypechooser.cpp index b22bbd8dc..8ab3a69ee 100644 --- a/kio/kio/kmimetypechooser.cpp +++ b/kio/kio/kmimetypechooser.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include diff --git a/kio/kio/kprotocolinfo.h b/kio/kio/kprotocolinfo.h index 8ce7ce500..10addc610 100644 --- a/kio/kio/kprotocolinfo.h +++ b/kio/kio/kprotocolinfo.h @@ -24,8 +24,8 @@ #include #include -#include -#include +#include +#include /** * Information about I/O (Internet, etc.) protocols supported by KDE. diff --git a/kio/kio/kservice.cpp b/kio/kio/kservice.cpp index a5216981f..547df4651 100644 --- a/kio/kio/kservice.cpp +++ b/kio/kio/kservice.cpp @@ -51,7 +51,7 @@ #include "kservicetypefactory.h" #include "kservicetype.h" #include "kuserprofile.h" -#include "ksycoca.h" +#include "tdesycoca.h" class KService::KServicePrivate { @@ -336,7 +336,7 @@ void KService::load( TQDataStream& s ) // WARNING: IN KDE 3.x THIS NEEDS TO REMAIN COMPATIBLE WITH KDE 2.x! // !! This data structure should remain binary compatible at all times !! // You may add new fields at the end. Make sure to update the version - // number in ksycoca.h + // number in tdesycoca.h s >> m_strType >> m_strName >> m_strExec >> m_strIcon >> term >> m_strTerminalOptions >> m_strPath >> m_strComment >> m_lstServiceTypes >> def >> m_mapProps @@ -369,7 +369,7 @@ void KService::save( TQDataStream& s ) // WARNING: IN KDE 3.x THIS NEEDS TO REMAIN COMPATIBLE WITH KDE 2.x! // !! This data structure should remain binary compatible at all times !! // You may add new fields at the end. Make sure to update the version - // number in ksycoca.h + // number in tdesycoca.h s << m_strType << m_strName << m_strExec << m_strIcon << term << m_strTerminalOptions << m_strPath << m_strComment << m_lstServiceTypes << def << m_mapProps @@ -879,7 +879,7 @@ void KService::virtual_hook( int id, void* data ) void KService::rebuildKSycoca(TQWidget *parent) { - KServiceProgressDialog dlg(parent, "ksycoca_progress", + KServiceProgressDialog dlg(parent, "tdesycoca_progress", i18n("Updating System Configuration"), i18n("Updating system configuration.")); diff --git a/kio/kio/kservice.h b/kio/kio/kservice.h index 800bacf11..4db478ba6 100644 --- a/kio/kio/kservice.h +++ b/kio/kio/kservice.h @@ -25,7 +25,7 @@ #include #include -#include "ksycocaentry.h" +#include "tdesycocaentry.h" class TQDataStream; class KDesktopFile; diff --git a/kio/kio/kservicefactory.cpp b/kio/kio/kservicefactory.cpp index c5784e65a..f4646fa75 100644 --- a/kio/kio/kservicefactory.cpp +++ b/kio/kio/kservicefactory.cpp @@ -17,9 +17,9 @@ **/ #include "kservicefactory.h" -#include "ksycoca.h" -#include "ksycocatype.h" -#include "ksycocadict.h" +#include "tdesycoca.h" +#include "tdesycocatype.h" +#include "tdesycocadict.h" #include "kservice.h" #include diff --git a/kio/kio/kservicefactory.h b/kio/kio/kservicefactory.h index 2fd9dd822..4e6df6534 100644 --- a/kio/kio/kservicefactory.h +++ b/kio/kio/kservicefactory.h @@ -23,7 +23,7 @@ #include #include "kservice.h" -#include "ksycocafactory.h" +#include "tdesycocafactory.h" #include class KSycoca; diff --git a/kio/kio/kservicegroup.cpp b/kio/kio/kservicegroup.cpp index e85991f82..2e27c99b0 100644 --- a/kio/kio/kservicegroup.cpp +++ b/kio/kio/kservicegroup.cpp @@ -29,7 +29,7 @@ #include "kservicegroupfactory.h" #include "kservicegroup.h" #include "kservice.h" -#include "ksycoca.h" +#include "tdesycoca.h" class KServiceGroup::Private { diff --git a/kio/kio/kservicegroup.h b/kio/kio/kservicegroup.h index 8e2fa42e6..f2cd5a09f 100644 --- a/kio/kio/kservicegroup.h +++ b/kio/kio/kservicegroup.h @@ -28,8 +28,8 @@ #include #include -#include "ksycocaentry.h" -#include "ksycocatype.h" +#include "tdesycocaentry.h" +#include "tdesycocatype.h" #include "kservice.h" class KBuildServiceGroupFactory; @@ -144,7 +144,7 @@ public: /** * Returns true if the NoDisplay flag was set, i.e. if this - * group should be hidden from menus, while still being in ksycoca. + * group should be hidden from menus, while still being in tdesycoca. * @return true to hide this service group, false to display it * @since 3.1 */ diff --git a/kio/kio/kservicegroupfactory.cpp b/kio/kio/kservicegroupfactory.cpp index d27fab3e2..56ec0c07f 100644 --- a/kio/kio/kservicegroupfactory.cpp +++ b/kio/kio/kservicegroupfactory.cpp @@ -17,9 +17,9 @@ **/ #include "kservicegroupfactory.h" -#include "ksycoca.h" -#include "ksycocatype.h" -#include "ksycocadict.h" +#include "tdesycoca.h" +#include "tdesycocatype.h" +#include "tdesycocadict.h" #include "kservice.h" #include diff --git a/kio/kio/kservicegroupfactory.h b/kio/kio/kservicegroupfactory.h index 5fad77ce6..77bc7c042 100644 --- a/kio/kio/kservicegroupfactory.h +++ b/kio/kio/kservicegroupfactory.h @@ -22,7 +22,7 @@ #include #include "kservicegroup.h" -#include "ksycocafactory.h" +#include "tdesycocafactory.h" #include class KSycoca; diff --git a/kio/kio/kservicetype.cpp b/kio/kio/kservicetype.cpp index 994495921..8565029ee 100644 --- a/kio/kio/kservicetype.cpp +++ b/kio/kio/kservicetype.cpp @@ -18,7 +18,7 @@ **/ #include "kservice.h" -#include "ksycoca.h" +#include "tdesycoca.h" #include "kservicetype.h" #include "kservicetypefactory.h" #include "kservicefactory.h" @@ -138,7 +138,7 @@ KServiceType::save( TQDataStream& _str ) KSycocaEntry::save( _str ); // !! This data structure should remain binary compatible at all times !! // You may add new fields at the end. Make sure to update the version - // number in ksycoca.h + // number in tdesycoca.h _str << m_strName << m_strIcon << m_strComment << m_mapProps << m_mapPropDefs << (TQ_INT8)m_bValid; } diff --git a/kio/kio/kservicetype.h b/kio/kio/kservicetype.h index f17eb0394..b1cad7284 100644 --- a/kio/kio/kservicetype.h +++ b/kio/kio/kservicetype.h @@ -21,7 +21,7 @@ #ifndef __kservicetype_h__ #define __kservicetype_h__ -#include "ksycocaentry.h" +#include "tdesycocaentry.h" #include "kservice.h" #include diff --git a/kio/kio/kservicetypefactory.cpp b/kio/kio/kservicetypefactory.cpp index f7c0f5969..ecf527384 100644 --- a/kio/kio/kservicetypefactory.cpp +++ b/kio/kio/kservicetypefactory.cpp @@ -17,9 +17,9 @@ **/ #include "kservicetypefactory.h" -#include "ksycoca.h" -#include "ksycocatype.h" -#include "ksycocadict.h" +#include "tdesycoca.h" +#include "tdesycocatype.h" +#include "tdesycocadict.h" #include "kservicetype.h" #include "kmimetype.h" #include "kuserprofile.h" diff --git a/kio/kio/kservicetypefactory.h b/kio/kio/kservicetypefactory.h index b1a3c5dab..e18630b2c 100644 --- a/kio/kio/kservicetypefactory.h +++ b/kio/kio/kservicetypefactory.h @@ -25,7 +25,7 @@ #include #include -#include "ksycocafactory.h" +#include "tdesycocafactory.h" #include "kmimetype.h" class KSycoca; diff --git a/kio/kio/ktrader.h b/kio/kio/ktrader.h index 772f0be3a..98891b48d 100644 --- a/kio/kio/ktrader.h +++ b/kio/kio/ktrader.h @@ -36,7 +36,7 @@ * A few examples will make this a lot more clear. * * Say you have an application that will display HTML. In this - * example, you don't want to link to khtml... and furthermore, you + * example, you don't want to link to tdehtml... and furthermore, you * really don't care if the HTML browser is ours or not, as long as * it works. The way that you formulate your query as well as the way * that you execute the browser depends on whether or not you want the diff --git a/kio/kio/kurifilter.cpp b/kio/kio/kurifilter.cpp index d1425e9eb..5c50f4fa9 100644 --- a/kio/kio/kurifilter.cpp +++ b/kio/kio/kurifilter.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #ifdef HAVE_ELFICON #include diff --git a/kio/kio/kuserprofile.cpp b/kio/kio/kuserprofile.cpp index efc4cbae3..b413b3cd5 100644 --- a/kio/kio/kuserprofile.cpp +++ b/kio/kio/kuserprofile.cpp @@ -98,7 +98,7 @@ void KServiceTypeProfile::initStatic() //static void KServiceTypeProfile::clear() { - // HACK ksycoca may open the dummy db, in such case the first call to ksycoca + // HACK tdesycoca may open the dummy db, in such case the first call to tdesycoca // in initStatic() leads to closing the dummy db and clear() being called // in the middle of it, making s_lstProfiles be NULL if( s_lstProfiles == NULL || s_lstProfiles->count() == 0 ) diff --git a/kio/kio/metainfojob.cpp b/kio/kio/metainfojob.cpp index 3787fac80..d28914f20 100644 --- a/kio/kio/metainfojob.cpp +++ b/kio/kio/metainfojob.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include diff --git a/kio/kioexec/Makefile.am b/kio/kioexec/Makefile.am index 277a62974..5325ce875 100644 --- a/kio/kioexec/Makefile.am +++ b/kio/kioexec/Makefile.am @@ -3,7 +3,7 @@ AM_CPPFLAGS = $(all_includes) bin_PROGRAMS = kioexec kioexec_SOURCES = main.cpp -kioexec_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +kioexec_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor kioexec_LDADD = $(LIB_KIO) noinst_HEADERS = main.h diff --git a/kio/kpasswdserver/CMakeLists.txt b/kio/kpasswdserver/CMakeLists.txt index a02d3b50a..5209e53c9 100644 --- a/kio/kpasswdserver/CMakeLists.txt +++ b/kio/kpasswdserver/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/dcop ${CMAKE_SOURCE_DIR}/tdecore ${CMAKE_SOURCE_DIR}/tdeui - ${CMAKE_SOURCE_DIR}/kwallet/client + ${CMAKE_SOURCE_DIR}/tdewallet/client ${CMAKE_SOURCE_DIR}/kio ) diff --git a/kio/kpasswdserver/Makefile.am b/kio/kpasswdserver/Makefile.am index 694718de4..9ba393ef3 100644 --- a/kio/kpasswdserver/Makefile.am +++ b/kio/kpasswdserver/Makefile.am @@ -1,7 +1,7 @@ # $Id$ # Makefile.am of tdebase/kioslave/http -INCLUDES= -I$(top_srcdir)/kwallet/client $(all_includes) +INCLUDES= -I$(top_srcdir)/tdewallet/client $(all_includes) ####### Files @@ -10,6 +10,6 @@ kde_module_LTLIBRARIES = kded_kpasswdserver.la kded_kpasswdserver_la_SOURCES = kpasswdserver.cpp kpasswdserver.skel kded_kpasswdserver_la_METASOURCES = AUTO kded_kpasswdserver_la_LDFLAGS = $(all_libraries) -module -avoid-version -kded_kpasswdserver_la_LIBADD = $(top_builddir)/kwallet/client/libkwalletclient.la $(LIB_KIO) $(LIB_KDED) $(LIB_QT) $(LIB_TDEUI) $(LIB_TDECORE) $(top_builddir)/dcop/libDCOP.la $(LIB_X11) +kded_kpasswdserver_la_LIBADD = $(top_builddir)/tdewallet/client/libtdewalletclient.la $(LIB_KIO) $(LIB_KDED) $(LIB_QT) $(LIB_TDEUI) $(LIB_TDECORE) $(top_builddir)/dcop/libDCOP.la $(LIB_X11) include $(top_srcdir)/admin/Doxyfile.am diff --git a/kio/kpasswdserver/kpasswdserver.cpp b/kio/kpasswdserver/kpasswdserver.cpp index 7b140c467..b6a9aa696 100644 --- a/kio/kpasswdserver/kpasswdserver.cpp +++ b/kio/kpasswdserver/kpasswdserver.cpp @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include "config.h" #ifdef Q_WS_X11 @@ -361,7 +361,7 @@ KPasswdServer::processRequest() if ( ( username.isEmpty() || password.isEmpty() ) && !KWallet::Wallet::keyDoesNotExist(KWallet::Wallet::NetworkWallet(), KWallet::Wallet::PasswordFolder(), makeWalletKey( request->key, info.realmValue )) ) { - // no login+pass provided, check if kwallet has one + // no login+pass provided, check if tdewallet has one if ( openWallet( request->windowId ) ) hasWalletData = readFromWallet( m_wallet, request->key, info.realmValue, username, password, info.readOnly, knownLogins ); } diff --git a/kio/kssl/CMakeLists.txt b/kio/kssl/CMakeLists.txt index 377cd9d01..a2c9f00d6 100644 --- a/kio/kssl/CMakeLists.txt +++ b/kio/kssl/CMakeLists.txt @@ -21,7 +21,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/tdecore ${CMAKE_SOURCE_DIR}/tdecore/network ${CMAKE_SOURCE_DIR}/tdeui - ${CMAKE_SOURCE_DIR}/kwallet/client + ${CMAKE_SOURCE_DIR}/tdewallet/client ) diff --git a/kio/kssl/Makefile.am b/kio/kssl/Makefile.am index 54f2fc6f5..5d57ab7ab 100644 --- a/kio/kssl/Makefile.am +++ b/kio/kssl/Makefile.am @@ -3,7 +3,7 @@ # somewhere else. Another option for the future (needs testing) would be to # change SSL_INCLUDES to .../include/openssl and make the source use #include # instead of #include -INCLUDES=-I$(top_srcdir)/tdecore/network -I$(top_srcdir)/kwallet/client $(all_includes) $(SSL_INCLUDES) +INCLUDES=-I$(top_srcdir)/tdecore/network -I$(top_srcdir)/tdewallet/client $(all_includes) $(SSL_INCLUDES) noinst_LTLIBRARIES = libkssl.la KSSLVERSION= 3.0.0 diff --git a/kio/kssl/ksslkeygen.cc b/kio/kssl/ksslkeygen.cc index a34773989..403632b3a 100644 --- a/kio/kssl/ksslkeygen.cc +++ b/kio/kssl/ksslkeygen.cc @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include diff --git a/kio/misc/CMakeLists.txt b/kio/misc/CMakeLists.txt index 52aa2207a..5212444a2 100644 --- a/kio/misc/CMakeLists.txt +++ b/kio/misc/CMakeLists.txt @@ -14,8 +14,8 @@ add_subdirectory( kpac ) add_subdirectory( tdesasl ) add_subdirectory( kssld ) add_subdirectory( kfile ) -add_subdirectory( kwalletd ) -add_subdirectory( kntlm ) +add_subdirectory( tdewalletd ) +add_subdirectory( tdentlm ) add_definitions( -D_LARGEFILE64_SOURCE diff --git a/kio/misc/Makefile.am b/kio/misc/Makefile.am index cfa5a4c3e..0bafce0f5 100644 --- a/kio/misc/Makefile.am +++ b/kio/misc/Makefile.am @@ -20,7 +20,7 @@ AM_CPPFLAGS = -D_LARGEFILE64_SOURCE INCLUDES= -I$(srcdir)/.. -I$(top_srcdir) -I$(srcdir)/../kssl -I../kssl $(all_includes) $(SSL_INCLUDES) -SUBDIRS = . ksendbugmail kpac tdesasl kssld kfile kwalletd kntlm +SUBDIRS = . ksendbugmail kpac tdesasl kssld kfile tdewalletd tdentlm lib_LTLIBRARIES = tdeinit_LTLIBRARIES = kio_uiserver.la @@ -38,11 +38,11 @@ kde_services_DATA = kio_uiserver.desktop kmailservice_SOURCES = kmailservice.cpp kmailservice_LDADD = $(LIB_TDECORE) -kmailservice_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +kmailservice_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor ktelnetservice_SOURCES = ktelnetservice.cpp ktelnetservice_LDADD = $(LIB_TDEUI) -ktelnetservice_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +ktelnetservice_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor protocol_DATA = kmailservice.protocol telnet.protocol rlogin.protocol rtsp.protocol ssh.protocol \ mms.protocol mmst.protocol mmsu.protocol pnm.protocol rtspt.protocol rtspu.protocol diff --git a/kio/misc/kfile/Makefile.am b/kio/misc/kfile/Makefile.am index ad5a377a2..605fef7d3 100644 --- a/kio/misc/kfile/Makefile.am +++ b/kio/misc/kfile/Makefile.am @@ -5,6 +5,6 @@ INCLUDES= -I$(top_srcdir) -I$(top_srcdir)/kio/kio $(all_includes) bin_PROGRAMS = kfile kfile_SOURCES = fileprops.cpp -kfile_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +kfile_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor kfile_LDADD = $(LIB_KIO) diff --git a/kio/misc/kntlm/CMakeLists.txt b/kio/misc/kntlm/CMakeLists.txt deleted file mode 100644 index 0952f4535..000000000 --- a/kio/misc/kntlm/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -################################################# -# -# (C) 2010 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${TQT_INCLUDE_DIRS} - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}/tdecore - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/tdecore -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### headers ################################### - -install(FILES kntlm.h DESTINATION ${INCLUDE_INSTALL_DIR}/kio ) - - -##### kntlm ################################### - -set( target kntlm ) - -set( ${target}_SRCS - kntlm.cpp des.cpp -) - -tde_add_library( ${target} SHARED - SOURCES ${${target}_SRCS} - VERSION 0.0.0 - LINK tdecore-shared - DESTINATION ${LIB_INSTALL_DIR} -) diff --git a/kio/misc/kntlm/Makefile.am b/kio/misc/kntlm/Makefile.am deleted file mode 100644 index 91efaf40f..000000000 --- a/kio/misc/kntlm/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -INCLUDES=$(all_includes) - -lib_LTLIBRARIES = libkntlm.la -METASOURCES = AUTO - -kntlmincludedir = $(includedir)/kio -kntlminclude_HEADERS = kntlm.h - -libkntlm_la_SOURCES = kntlm.cpp des.cpp -libkntlm_la_LDFLAGS = $(all_libraries) -version-info 0:0:0 -no-undefined -libkntlm_la_LIBADD = $(LIB_TDECORE) $(LIB_QT) - diff --git a/kio/misc/kntlm/des.cpp b/kio/misc/kntlm/des.cpp deleted file mode 100644 index bb4fab88b..000000000 --- a/kio/misc/kntlm/des.cpp +++ /dev/null @@ -1,513 +0,0 @@ - -/* Sofware DES functions - * written 12 Dec 1986 by Phil Karn, KA9Q; large sections adapted from - * the 1977 public-domain program by Jim Gillogly - * Modified for additional speed - 6 December 1988 Phil Karn - * Modified for parameterized key schedules - Jan 1991 Phil Karn - * Callers now allocate a key schedule as follows: - * kn = (char (*)[8])malloc(sizeof(char) * 8 * 16); - * or - * char kn[16][8]; - */ - -/* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos - * All modifications are placed under the license of libmcrypt. - */ - -/* $Id$ */ - -#include -#include -#include "des.h" - -static void permute_ip (unsigned char *inblock, DES_KEY * key, unsigned char *outblock); -static void permute_fp (unsigned char *inblock, DES_KEY * key, unsigned char *outblock); -static void perminit_ip (DES_KEY * key); -static void spinit (DES_KEY * key); -static void perminit_fp (DES_KEY * key); -static TQ_UINT32 f (DES_KEY * key, TQ_UINT32 r, char *subkey); - - -/* Tables defined in the Data Encryption Standard documents */ - -/* initial permutation IP */ -static const char ip[] = { - 58, 50, 42, 34, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, - 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, - 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, - 63, 55, 47, 39, 31, 23, 15, 7 -}; - -/* final permutation IP^-1 */ -static const char fp[] = { - 40, 8, 48, 16, 56, 24, 64, 32, - 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25 -}; - -/* expansion operation matrix - * This is for reference only; it is unused in the code - * as the f() function performs it implicitly for speed - */ -#ifdef notdef -static const char ei[] = { - 32, 1, 2, 3, 4, 5, - 4, 5, 6, 7, 8, 9, - 8, 9, 10, 11, 12, 13, - 12, 13, 14, 15, 16, 17, - 16, 17, 18, 19, 20, 21, - 20, 21, 22, 23, 24, 25, - 24, 25, 26, 27, 28, 29, - 28, 29, 30, 31, 32, 1 -}; -#endif - -/* permuted choice table (key) */ -static const char pc1[] = { - 57, 49, 41, 33, 25, 17, 9, - 1, 58, 50, 42, 34, 26, 18, - 10, 2, 59, 51, 43, 35, 27, - 19, 11, 3, 60, 52, 44, 36, - - 63, 55, 47, 39, 31, 23, 15, - 7, 62, 54, 46, 38, 30, 22, - 14, 6, 61, 53, 45, 37, 29, - 21, 13, 5, 28, 20, 12, 4 -}; - -/* number left rotations of pc1 */ -static const char totrot[] = { - 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 -}; - -/* permuted choice key (table) */ -static const char pc2[] = { - 14, 17, 11, 24, 1, 5, - 3, 28, 15, 6, 21, 10, - 23, 19, 12, 4, 26, 8, - 16, 7, 27, 20, 13, 2, - 41, 52, 31, 37, 47, 55, - 30, 40, 51, 45, 33, 48, - 44, 49, 39, 56, 34, 53, - 46, 42, 50, 36, 29, 32 -}; - -/* The (in)famous S-boxes */ -static const char si[8][64] = { - /* S1 */ - {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, - 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, - 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, - 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, - - /* S2 */ - {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, - 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, - 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, - 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, - - /* S3 */ - {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, - 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, - 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, - 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}, - - /* S4 */ - {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, - 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, - 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, - 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}, - - /* S5 */ - {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, - 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, - 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, - 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}, - - /* S6 */ - {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, - 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, - 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, - 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}, - - /* S7 */ - {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, - 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, - 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, - 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}, - - /* S8 */ - {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, - 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, - 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, - 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}, - -}; - -/* 32-bit permutation function P used on the output of the S-boxes */ -static const char p32i[] = { - 16, 7, 20, 21, - 29, 12, 28, 17, - 1, 15, 23, 26, - 5, 18, 31, 10, - 2, 8, 24, 14, - 32, 27, 3, 9, - 19, 13, 30, 6, - 22, 11, 4, 25 -}; - -/* End of DES-defined tables */ - -/* Lookup tables initialized once only at startup by desinit() */ - -/* bit 0 is left-most in byte */ -static const int bytebit[] = { - 0200, 0100, 040, 020, 010, 04, 02, 01 -}; - -static const int nibblebit[] = { - 010, 04, 02, 01 -}; - -/* Allocate space and initialize DES lookup arrays - * mode == 0: standard Data Encryption Algorithm - */ -static int -desinit (DES_KEY * key) -{ - - spinit (key); - perminit_ip (key); - perminit_fp (key); - - return 0; -} - - -/* Set key (initialize key schedule array) */ -int -ntlm_des_set_key (DES_KEY * dkey, char *user_key, int /*len*/) -{ - char pc1m[56]; /* place to modify pc1 into */ - char pcr[56]; /* place to rotate pc1 into */ - int i, j, l; - int m; - - memset(dkey, 0, sizeof (DES_KEY)); - desinit (dkey); - - /* Clear key schedule */ - - - for (j = 0; j < 56; j++) - { /* convert pc1 to bits of key */ - l = pc1[j] - 1; /* integer bit location */ - m = l & 07; /* find bit */ - pc1m[j] = (user_key[l >> 3] & /* find which key byte l is in */ - bytebit[m]) /* and which bit of that byte */ - ? 1 : 0; /* and store 1-bit result */ - - } - for (i = 0; i < 16; i++) - { /* key chunk for each iteration */ - for (j = 0; j < 56; j++) /* rotate pc1 the right amount */ - pcr[j] = pc1m[(l = j + totrot[i]) < (j < 28 ? 28 : 56) ? l : l - 28]; - /* rotate left and right halves independently */ - for (j = 0; j < 48; j++) - { /* select bits individually */ - /* check bit that goes to kn[j] */ - if (pcr[pc2[j] - 1]) - { - /* mask it in if it's there */ - l = j % 6; - dkey->kn[i][j / 6] |= bytebit[l] >> 2; - } - } - } - return 0; -} - -/* In-place encryption of 64-bit block */ -static void -ntlm_des_encrypt (DES_KEY * key, unsigned char *block) -{ - TQ_UINT32 left, right; - char *knp; - TQ_UINT32 work[2]; /* Working data storage */ - - permute_ip (block, key, (unsigned char *) work); /* Initial Permutation */ - left = KFromToBigEndian(work[0]); - right = KFromToBigEndian(work[1]); - - /* Do the 16 rounds. - * The rounds are numbered from 0 to 15. On even rounds - * the right half is fed to f() and the result exclusive-ORs - * the left half; on odd rounds the reverse is done. - */ - knp = &key->kn[0][0]; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - knp += 8; - left ^= f (key, right, knp); - knp += 8; - right ^= f (key, left, knp); - - /* Left/right half swap, plus byte swap if little-endian */ - work[1] = KFromToBigEndian( left ); - work[0] = KFromToBigEndian( right ); - - permute_fp ((unsigned char *) work, key, block); /* Inverse initial permutation */ -} - -/* Permute inblock with perm */ -static void -permute_ip (unsigned char *inblock, DES_KEY * key, unsigned char *outblock) -{ - unsigned char *ib, *ob; /* ptr to input or output block */ - char *p, *q; - int j; - - /* Clear output block */ - memset(outblock, 0, 8); - - ib = inblock; - for (j = 0; j < 16; j += 2, ib++) - { /* for each input nibble */ - ob = outblock; - p = key->iperm[j][(*ib >> 4) & 0xf]; - q = key->iperm[j + 1][*ib & 0xf]; - /* and each output byte, OR the masks together */ - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - } -} - -/* Permute inblock with perm */ -static void -permute_fp (unsigned char *inblock, DES_KEY * key, unsigned char *outblock) -{ - unsigned char *ib, *ob; /* ptr to input or output block */ - char *p, *q; - int j; - - /* Clear output block */ - memset(outblock, 0, 8); - - ib = inblock; - for (j = 0; j < 16; j += 2, ib++) - { /* for each input nibble */ - ob = outblock; - p = key->fperm[j][(*ib >> 4) & 0xf]; - q = key->fperm[j + 1][*ib & 0xf]; - /* and each output byte, OR the masks together */ - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - *ob++ |= *p++ | *q++; - } -} - -/* The nonlinear function f(r,k), the heart of DES */ -static TQ_UINT32 -f (DES_KEY * key, TQ_UINT32 r, char *subkey) -{ - TQ_UINT32 *spp; - TQ_UINT32 rval, rt; - int er; - -#ifdef TRACE - printf ("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ", - r, - subkey[0], subkey[1], subkey[2], - subkey[3], subkey[4], subkey[5], subkey[6], subkey[7]); -#endif - /* Run E(R) ^ K through the combined S & P boxes. - * This code takes advantage of a convenient regularity in - * E, namely that each group of 6 bits in E(R) feeding - * a single S-box is a contiguous segment of R. - */ - subkey += 7; - - /* Compute E(R) for each block of 6 bits, and run thru boxes */ - er = ((int) r << 1) | ((r & 0x80000000) ? 1 : 0); - spp = &key->sp[7][0]; - rval = spp[(er ^ *subkey--) & 0x3f]; - spp -= 64; - rt = (TQ_UINT32) r >> 3; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rval |= spp[((int) rt ^ *subkey--) & 0x3f]; - spp -= 64; - rt >>= 4; - rt |= (r & 1) << 5; - rval |= spp[((int) rt ^ *subkey) & 0x3f]; -#ifdef TRACE - printf (" %08lx\n", rval); -#endif - return rval; -} - -/* initialize a perm array */ -static void -perminit_ip (DES_KEY * key) -{ - int l, j, k; - int i, m; - - /* Clear the permutation array */ - memset(key->iperm, 0, 16 * 16 * 8); - - for (i = 0; i < 16; i++) /* each input nibble position */ - for (j = 0; j < 16; j++) /* each possible input nibble */ - for (k = 0; k < 64; k++) - { /* each output bit position */ - l = ip[k] - 1; /* where does this bit come from */ - if ((l >> 2) != i) /* does it come from input posn? */ - continue; /* if not, bit k is 0 */ - if (!(j & nibblebit[l & 3])) - continue; /* any such bit in input? */ - m = k & 07; /* which bit is this in the byte */ - key->iperm[i][j][k >> 3] |= bytebit[m]; - } -} - -static void -perminit_fp (DES_KEY * key) -{ - int l, j, k; - int i, m; - - /* Clear the permutation array */ - memset(key->fperm, 0, 16 * 16 * 8); - - for (i = 0; i < 16; i++) /* each input nibble position */ - for (j = 0; j < 16; j++) /* each possible input nibble */ - for (k = 0; k < 64; k++) - { /* each output bit position */ - l = fp[k] - 1; /* where does this bit come from */ - if ((l >> 2) != i) /* does it come from input posn? */ - continue; /* if not, bit k is 0 */ - if (!(j & nibblebit[l & 3])) - continue; /* any such bit in input? */ - m = k & 07; /* which bit is this in the byte */ - key->fperm[i][j][k >> 3] |= bytebit[m]; - } -} - -/* Initialize the lookup table for the combined S and P boxes */ -static void -spinit (DES_KEY * key) -{ - char pbox[32]; - int p, i, s, j, rowcol; - TQ_UINT32 val; - - /* Compute pbox, the inverse of p32i. - * This is easier to work with - */ - for (p = 0; p < 32; p++) - { - for (i = 0; i < 32; i++) - { - if (p32i[i] - 1 == p) - { - pbox[p] = i; - break; - } - } - } - for (s = 0; s < 8; s++) - { /* For each S-box */ - for (i = 0; i < 64; i++) - { /* For each possible input */ - val = 0; - /* The row number is formed from the first and last - * bits; the column number is from the middle 4 - */ - rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf); - for (j = 0; j < 4; j++) - { /* For each output bit */ - if (si[s][rowcol] & (8 >> j)) - { - val |= 1L << (31 - pbox[4 * s + j]); - } - } - key->sp[s][i] = val; - } - } -} - -int -ntlm_des_ecb_encrypt (const void *plaintext, int len, DES_KEY * akey, - unsigned char output[8]) -{ - int j; - const unsigned char *plain = (const unsigned char *) plaintext; - - for (j = 0; j < len / 8; j++) - { - memcpy (&output[j * 8], &plain[j * 8], 8); - ntlm_des_encrypt (akey, &output[j * 8]); - } - - if (j == 0 && len != 0) - return -1; /* no blocks were encrypted */ - return 0; -} diff --git a/kio/misc/kntlm/des.h b/kio/misc/kntlm/des.h deleted file mode 100644 index 0f6f59dc9..000000000 --- a/kio/misc/kntlm/des.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef KNTLM_DES_H -#define KNTLM_DES_H - -#include - -typedef struct des_key -{ - char kn[16][8]; - TQ_UINT32 sp[8][64]; - char iperm[16][16][8]; - char fperm[16][16][8]; -} DES_KEY; - -int -ntlm_des_ecb_encrypt (const void *plaintext, int len, DES_KEY * akey, unsigned char output[8]); -int -ntlm_des_set_key (DES_KEY * dkey, char *user_key, int len); - -#endif /* KNTLM_DES_H */ diff --git a/kio/misc/kntlm/kntlm.cpp b/kio/misc/kntlm/kntlm.cpp deleted file mode 100644 index dd9cd33ec..000000000 --- a/kio/misc/kntlm/kntlm.cpp +++ /dev/null @@ -1,389 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (c) 2004 Szombathelyi Gy�gy - - The implementation is based on the documentation and sample code - at http://davenport.sourceforge.net/ntlm.html - The DES encryption functions are from libntlm - at http://josefsson.org/libntlm/ - - 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 "des.h" -#include "kntlm.h" - -TQString KNTLM::getString( const TQByteArray &buf, const SecBuf &secbuf, bool unicode ) -{ - //watch for buffer overflows - TQ_UINT32 offset; - TQ_UINT16 len; - offset = KFromToLittleEndian((TQ_UINT32)secbuf.offset); - len = KFromToLittleEndian(secbuf.len); - if ( offset > buf.size() || - offset + len > buf.size() ) return TQString::null; - - TQString str; - const char *c = buf.data() + offset; - - if ( unicode ) { - str = UnicodeLE2TQString( (TQChar*) c, len >> 1 ); - } else { - str = TQString::fromLatin1( c, len ); - } - return str; -} - -TQByteArray KNTLM::getBuf( const TQByteArray &buf, const SecBuf &secbuf ) -{ - TQByteArray ret; - TQ_UINT32 offset; - TQ_UINT16 len; - offset = KFromToLittleEndian((TQ_UINT32)secbuf.offset); - len = KFromToLittleEndian(secbuf.len); - //watch for buffer overflows - if ( offset > buf.size() || - offset + len > buf.size() ) return ret; - ret.duplicate( buf.data() + offset, buf.size() ); - return ret; -} - -void KNTLM::addString( TQByteArray &buf, SecBuf &secbuf, const TQString &str, bool unicode ) -{ - TQByteArray tmp; - - if ( unicode ) { - tmp = QString2UnicodeLE( str ); - addBuf( buf, secbuf, tmp ); - } else { - const char *c; - c = str.latin1(); - tmp.setRawData( c, str.length() ); - addBuf( buf, secbuf, tmp ); - tmp.resetRawData( c, str.length() ); - } -} - -void KNTLM::addBuf( TQByteArray &buf, SecBuf &secbuf, TQByteArray &data ) -{ - TQ_UINT32 offset; - TQ_UINT16 len, maxlen; - offset = (buf.size() + 1) & 0xfffffffe; - len = data.size(); - maxlen = data.size(); - - secbuf.offset = KFromToLittleEndian((TQ_UINT32)offset); - secbuf.len = KFromToLittleEndian(len); - secbuf.maxlen = KFromToLittleEndian(maxlen); - buf.resize( offset + len ); - memcpy( buf.data() + offset, data.data(), data.size() ); -} - -bool KNTLM::getNegotiate( TQByteArray &negotiate, const TQString &domain, const TQString &workstation, TQ_UINT32 flags ) -{ - TQByteArray rbuf( sizeof(Negotiate) ); - - rbuf.fill( 0 ); - memcpy( rbuf.data(), "NTLMSSP", 8 ); - ((Negotiate*) rbuf.data())->msgType = KFromToLittleEndian( (TQ_UINT32)1 ); - if ( !domain.isEmpty() ) { - flags |= Negotiate_Domain_Supplied; - addString( rbuf, ((Negotiate*) rbuf.data())->domain, domain ); - } - if ( !workstation.isEmpty() ) { - flags |= Negotiate_WS_Supplied; - addString( rbuf, ((Negotiate*) rbuf.data())->domain, workstation ); - } - ((Negotiate*) rbuf.data())->flags = KFromToLittleEndian( flags ); - negotiate = rbuf; - return true; -} - -bool KNTLM::getAuth( TQByteArray &auth, const TQByteArray &challenge, const TQString &user, - const TQString &password, const TQString &domain, const TQString &workstation, - bool forceNTLM, bool forceNTLMv2 ) -{ - TQByteArray rbuf( sizeof(Auth) ); - Challenge *ch = (Challenge *) challenge.data(); - TQByteArray response; - uint chsize = challenge.size(); - bool unicode = false; - TQString dom; - - //challenge structure too small - if ( chsize < 32 ) return false; - - unicode = KFromToLittleEndian(ch->flags) & Negotiate_Unicode; - if ( domain.isEmpty() ) - dom = getString( challenge, ch->targetName, unicode ); - else - dom = domain; - - rbuf.fill( 0 ); - memcpy( rbuf.data(), "NTLMSSP", 8 ); - ((Auth*) rbuf.data())->msgType = KFromToLittleEndian( (TQ_UINT32)3 ); - ((Auth*) rbuf.data())->flags = ch->flags; - TQByteArray targetInfo = getBuf( challenge, ch->targetInfo ); - -// if ( forceNTLMv2 || (!targetInfo.isEmpty() && (KFromToLittleEndian(ch->flags) & Negotiate_Target_Info)) /* may support NTLMv2 */ ) { -// if ( KFromToLittleEndian(ch->flags) & Negotiate_NTLM ) { -// if ( targetInfo.isEmpty() ) return false; -// response = getNTLMv2Response( dom, user, password, targetInfo, ch->challengeData ); -// addBuf( rbuf, ((Auth*) rbuf.data())->ntResponse, response ); -// } else { -// if ( !forceNTLM ) { -// response = getLMv2Response( dom, user, password, ch->challengeData ); -// addBuf( rbuf, ((Auth*) rbuf.data())->lmResponse, response ); -// } else -// return false; -// } -// } else { //if no targetinfo structure and NTLMv2 or LMv2 not forced, try the older methods - - response = getNTLMResponse( password, ch->challengeData ); - addBuf( rbuf, ((Auth*) rbuf.data())->ntResponse, response ); - response = getLMResponse( password, ch->challengeData ); - addBuf( rbuf, ((Auth*) rbuf.data())->lmResponse, response ); -// } - if ( !dom.isEmpty() ) - addString( rbuf, ((Auth*) rbuf.data())->domain, dom, unicode ); - addString( rbuf, ((Auth*) rbuf.data())->user, user, unicode ); - if ( !workstation.isEmpty() ) - addString( rbuf, ((Auth*) rbuf.data())->workstation, workstation, unicode ); - - auth = rbuf; - - return true; -} - -TQByteArray KNTLM::getLMResponse( const TQString &password, const unsigned char *challenge ) -{ - TQByteArray hash, answer; - - hash = lmHash( password ); - hash.resize( 21 ); - memset( hash.data() + 16, 0, 5 ); - answer = lmResponse( hash, challenge ); - hash.fill( 0 ); - return answer; -} - -TQByteArray KNTLM::lmHash( const TQString &password ) -{ - TQByteArray keyBytes( 14 ); - TQByteArray hash( 16 ); - DES_KEY ks; - const char *magic = "KGS!@#$%"; - - keyBytes.fill( 0 ); - strncpy( keyBytes.data(), password.upper().latin1(), 14 ); - - convertKey( (unsigned char*) keyBytes.data(), &ks ); - ntlm_des_ecb_encrypt( magic, 8, &ks, (unsigned char*) hash.data() ); - - convertKey( (unsigned char*) keyBytes.data() + 7, &ks ); - ntlm_des_ecb_encrypt( magic, 8, &ks, (unsigned char*) hash.data() + 8 ); - - keyBytes.fill( 0 ); - memset( &ks, 0, sizeof (ks) ); - - return hash; -} - -TQByteArray KNTLM::lmResponse( const TQByteArray &hash, const unsigned char *challenge ) -{ - DES_KEY ks; - TQByteArray answer( 24 ); - - convertKey( (unsigned char*) hash.data(), &ks ); - ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() ); - - convertKey( (unsigned char*) hash.data() + 7, &ks ); - ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() + 8 ); - - convertKey( (unsigned char*) hash.data() + 14, &ks ); - ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() + 16 ); - - memset( &ks, 0, sizeof (ks) ); - return answer; -} - -TQByteArray KNTLM::getNTLMResponse( const TQString &password, const unsigned char *challenge ) -{ - TQByteArray hash, answer; - - hash = ntlmHash( password ); - hash.resize( 21 ); - memset( hash.data() + 16, 0, 5 ); - answer = lmResponse( hash, challenge ); - hash.fill( 0 ); - return answer; -} - -TQByteArray KNTLM::ntlmHash( const TQString &password ) -{ - KMD4::Digest digest; - TQByteArray ret, unicode; - unicode = QString2UnicodeLE( password ); - - KMD4 md4( unicode ); - md4.rawDigest( digest ); - ret.duplicate( (const char*) digest, sizeof( digest ) ); - return ret; -} - -TQByteArray KNTLM::getNTLMv2Response( const TQString &target, const TQString &user, - const TQString &password, const TQByteArray &targetInformation, - const unsigned char *challenge ) -{ - TQByteArray hash = ntlmv2Hash( target, user, password ); - TQByteArray blob = createBlob( targetInformation ); - return lmv2Response( hash, blob, challenge ); -} - -TQByteArray KNTLM::getLMv2Response( const TQString &target, const TQString &user, - const TQString &password, const unsigned char *challenge ) -{ - TQByteArray hash = ntlmv2Hash( target, user, password ); - TQByteArray clientChallenge( 8 ); - for ( uint i = 0; i<8; i++ ) { - clientChallenge.data()[i] = TDEApplication::random() % 0xff; - } - return lmv2Response( hash, clientChallenge, challenge ); -} - -TQByteArray KNTLM::ntlmv2Hash( const TQString &target, const TQString &user, const TQString &password ) -{ - TQByteArray hash1 = ntlmHash( password ); - TQByteArray key, ret; - TQString id = user.upper() + target.upper(); - key = QString2UnicodeLE( id ); - ret = hmacMD5( key, hash1 ); - return ret; -} - -TQByteArray KNTLM::lmv2Response( const TQByteArray &hash, - const TQByteArray &clientData, const unsigned char *challenge ) -{ - TQByteArray data( 8 + clientData.size() ); - memcpy( data.data(), challenge, 8 ); - memcpy( data.data() + 8, clientData.data(), clientData.size() ); - TQByteArray mac = hmacMD5( data, hash ); - mac.resize( 16 + clientData.size() ); - memcpy( mac.data() + 16, clientData.data(), clientData.size() ); - return mac; -} - -TQByteArray KNTLM::createBlob( const TQByteArray &targetinfo ) -{ - TQByteArray blob( sizeof(Blob) + 4 + targetinfo.size() ); - blob.fill( 0 ); - - Blob *bl = (Blob *) blob.data(); - bl->signature = KFromToBigEndian( (TQ_UINT32) 0x01010000 ); - TQ_UINT64 now = TQDateTime::currentDateTime().toTime_t(); - now += (TQ_UINT64)3600*(TQ_UINT64)24*(TQ_UINT64)134774; - now *= (TQ_UINT64)10000000; - bl->timestamp = KFromToLittleEndian( now ); - for ( uint i = 0; i<8; i++ ) { - bl->challenge[i] = TDEApplication::random() % 0xff; - } - memcpy( blob.data() + sizeof(Blob), targetinfo.data(), targetinfo.size() ); - return blob; -} - -TQByteArray KNTLM::hmacMD5( const TQByteArray &data, const TQByteArray &key ) -{ - TQ_UINT8 ipad[64], opad[64]; - KMD5::Digest digest; - TQByteArray ret; - - memset( ipad, 0x36, sizeof(ipad) ); - memset( opad, 0x5c, sizeof(opad) ); - for ( int i = key.size()-1; i >= 0; i-- ) { - ipad[i] ^= key[i]; - opad[i] ^= key[i]; - } - - TQByteArray content( data.size()+64 ); - memcpy( content.data(), ipad, 64 ); - memcpy( content.data() + 64, data.data(), data.size() ); - KMD5 md5( content ); - md5.rawDigest( digest ); - content.resize( sizeof(digest) + 64 ); - memcpy( content.data(), opad, 64 ); - memcpy( content.data() + 64, digest, sizeof(digest) ); - md5.reset(); - md5.update( content ); - md5.rawDigest( digest ); - - ret.duplicate( (const char*) digest, sizeof( digest ) ); - return ret; -} - -/* -* turns a 56 bit key into the 64 bit, odd parity key and sets the key. -* The key schedule ks is also set. -*/ -void KNTLM::convertKey( unsigned char *key_56, void* ks ) -{ - unsigned char key[8]; - - key[0] = key_56[0]; - key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); - key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); - key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); - key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); - key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); - key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); - key[7] = (key_56[6] << 1) & 0xFF; - - for ( uint i=0; i<8; i++ ) { - unsigned char b = key[i]; - bool needsParity = (((b>>7) ^ (b>>6) ^ (b>>5) ^ (b>>4) ^ (b>>3) ^ (b>>2) ^ (b>>1)) & 0x01) == 0; - if ( needsParity ) - key[i] |= 0x01; - else - key[i] &= 0xfe; - } - - ntlm_des_set_key ( (DES_KEY*) ks, (char*) &key, sizeof (key)); - - memset (&key, 0, sizeof (key)); -} - -TQByteArray KNTLM::QString2UnicodeLE( const TQString &target ) -{ - TQByteArray unicode( target.length() * 2 ); - for ( uint i = 0; i < target.length(); i++ ) { - ((TQ_UINT16*)unicode.data())[ i ] = KFromToLittleEndian( target[i].unicode() ); - } - return unicode; -} - -TQString KNTLM::UnicodeLE2TQString( const TQChar* data, uint len ) -{ - TQString ret; - for ( uint i = 0; i < len; i++ ) { - ret += KFromToLittleEndian( data[ i ].unicode() ); - } - return ret; -} diff --git a/kio/misc/kntlm/kntlm.h b/kio/misc/kntlm/kntlm.h deleted file mode 100644 index 06b8febab..000000000 --- a/kio/misc/kntlm/kntlm.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - This file is part of the KDE libraries. - Copyright (c) 2004 Szombathelyi Gyrgy - - 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 KNTLM_H -#define KNTLM_H - -#include -#include -#include - -#include - -/** - * @short KNTLM class implements the NTLM authentication protocol. - * - * The KNTLM class is useful for creating the authentication structures which - * can be used for various servers which implements NTLM type authentication. - * A comprehensive description of the NTLM authentication protocol can be found - * at http://davenport.sourceforge.net/ntlm.html - * The class also contains methods to create the LanManager and NT (MD4) hashes - * of a password. - * This class doesn't maintain any state information, so all methods are static. - */ - -class TDEIO_EXPORT KNTLM { -public: - - enum Flags { - Negotiate_Unicode = 0x00000001, - Negotiate_OEM = 0x00000002, - Request_Target = 0x00000004, - Negotiate_Sign = 0x00000010, - Negotiate_Seal = 0x00000020, - Negotiate_Datagram_Style = 0x00000040, - Negotiate_LM_Key = 0x00000080, - Negotiate_Netware = 0x00000100, - Negotiate_NTLM = 0x00000200, - Negotiate_Domain_Supplied = 0x00001000, - Negotiate_WS_Supplied = 0x00002000, - Negotiate_Local_Call = 0x00004000, - Negotiate_Always_Sign = 0x00008000, - Target_Type_Domain = 0x00010000, - Target_Type_Server = 0x00020000, - Target_Type_Share = 0x00040000, - Negotiate_NTLM2_Key = 0x00080000, - Request_Init_Response = 0x00100000, - Request_Accept_Response = 0x00200000, - Request_NonNT_Key = 0x00400000, - Negotiate_Target_Info = 0x00800000, - Negotiate_128 = 0x20000000, - Negotiate_Key_Exchange = 0x40000000, - Negotiate_56 = 0x80000000 - }; - - typedef struct - { - TQ_UINT16 len; - TQ_UINT16 maxlen; - TQ_UINT32 offset; - } SecBuf; - - /** - * The NTLM Type 1 structure - */ - typedef struct - { - char signature[8]; /* "NTLMSSP\0" */ - TQ_UINT32 msgType; /* 1 */ - TQ_UINT32 flags; - SecBuf domain; - SecBuf workstation; - } Negotiate; - - /** - * The NTLM Type 2 structure - */ - typedef struct - { - char signature[8]; - TQ_UINT32 msgType; /* 2 */ - SecBuf targetName; - TQ_UINT32 flags; - TQ_UINT8 challengeData[8]; - TQ_UINT32 context[2]; - SecBuf targetInfo; - } Challenge; - - /** - * The NTLM Type 3 structure - */ - typedef struct - { - char signature[8]; - TQ_UINT32 msgType; /* 3 */ - SecBuf lmResponse; - SecBuf ntResponse; - SecBuf domain; - SecBuf user; - SecBuf workstation; - SecBuf sessionKey; - TQ_UINT32 flags; - } Auth; - - typedef struct - { - TQ_UINT32 signature; - TQ_UINT32 reserved; - TQ_UINT64 timestamp; - TQ_UINT8 challenge[8]; - TQ_UINT8 unknown[4]; - //Target info block - variable length - } Blob; - - /** - * Creates the initial message (type 1) which should be sent to the server. - * - * @param negotiate - a buffer where the Type 1 message will returned. - * @param domain - the domain name which should be send with the message. - * @param workstation - the workstation name which should be send with the message. - * @param flags - various flags, in most cases the defaults will good. - * - * @return true if creating the structure succeeds, false otherwise. - */ - static bool getNegotiate( TQByteArray &negotiate, const TQString &domain = TQString::null, - const TQString &workstation = TQString::null, - TQ_UINT32 flags = Negotiate_Unicode | Request_Target | Negotiate_NTLM ); - /** - * Creates the type 3 message which should be sent to the server after - * the challenge (type 2) received. - * - * @param auth - a buffer where the Type 3 message will returned. - * @param challenge - the Type 2 message returned by the server. - * @param user - user's name. - * @param password - user's password. - * @param domain - the target domain. If left empty, it will be extracted - * from the challenge. - * @param workstation - the user's workstation. - * @param forceNTLM - force the use of NTLM authentication (either v1 or v2). - * @param forceNTLMv2 - force the use of NTLMv2 or LMv2 authentication. If false, NTLMv2 - * support is autodetected from the challenge. - * - * @return true if auth filled with the Type 3 message, false if an error occured - * (challenge data invalid, or NTLM authentication forced, but the challenge data says - * no NTLM supported). - */ - static bool getAuth( TQByteArray &auth, const TQByteArray &challenge, const TQString &user, - const TQString &password, const TQString &domain = TQString::null, - const TQString &workstation = TQString::null, bool forceNTLM = false, bool forceNTLMv2 = false ); - - /** - * Returns the LanManager response from the password and the server challenge. - */ - static TQByteArray getLMResponse( const TQString &password, const unsigned char *challenge ); - /** - * Calculates the LanManager hash of the specified password. - */ - static TQByteArray lmHash( const TQString &password ); - /** - * Calculates the LanManager response from the LanManager hash and the server challenge. - */ - static TQByteArray lmResponse( const TQByteArray &hash, const unsigned char *challenge ); - - /** - * Returns the NTLM response from the password and the server challenge. - */ - static TQByteArray getNTLMResponse( const TQString &password, const unsigned char *challenge ); - /** - * Returns the NTLM hash (MD4) from the password. - */ - static TQByteArray ntlmHash( const TQString &password ); - - /** - * Calculates the NTLMv2 response. - */ - static TQByteArray getNTLMv2Response( const TQString &target, const TQString &user, - const TQString &password, const TQByteArray &targetInformation, - const unsigned char *challenge ); - - /** - * Calculates the LMv2 response. - */ - static TQByteArray getLMv2Response( const TQString &target, const TQString &user, - const TQString &password, const unsigned char *challenge ); - - /** - * Returns the NTLMv2 hash. - */ - static TQByteArray ntlmv2Hash( const TQString &target, const TQString &user, const TQString &password ); - - /** - * Calculates the LMv2 response. - */ - static TQByteArray lmv2Response( const TQByteArray &hash, - const TQByteArray &clientData, const unsigned char *challenge ); - - /** - * Extracts a string field from an NTLM structure. - */ - static TQString getString( const TQByteArray &buf, const SecBuf &secbuf, bool unicode ); - /** - * Extracts a byte array from an NTLM structure. - */ - static TQByteArray getBuf( const TQByteArray &buf, const SecBuf &secbuf ); - - static TQByteArray createBlob( const TQByteArray &targetinfo ); - - static TQByteArray hmacMD5( const TQByteArray &data, const TQByteArray &key ); -private: - static TQByteArray QString2UnicodeLE( const TQString &target ); - static TQString UnicodeLE2TQString( const TQChar* data, uint len ); - - static void addBuf( TQByteArray &buf, SecBuf &secbuf, TQByteArray &data ); - static void addString( TQByteArray &buf, SecBuf &secbuf, const TQString &str, bool unicode = false ); - static void convertKey( unsigned char *key_56, void* ks ); -}; - -#endif /* KNTLM_H */ diff --git a/kio/misc/kntlm/kswap.h b/kio/misc/kntlm/kswap.h deleted file mode 100644 index 9eca243de..000000000 --- a/kio/misc/kntlm/kswap.h +++ /dev/null @@ -1,428 +0,0 @@ -/* - This file is part of the KDE libraries. - Copyright (c) 2004 Szombathelyi Gyrgy - - 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 KSWAP_H -#define KSWAP_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -/** - * \defgroup KSWAP Byte-swapping functions - * kswap.h contains functions that will help converting - * 16, 32 and 64 bit length data between little-endian and - * big-endian representations. - * - * The KSWAP_16, KSWAP_32 and KSWAP_64 functions are always - * swaps the byte order of the supplied argument (which should be - * 16, 32 or 64 bit wide). These functions are inline, and tries to - * use the most optimized function of the underlying system - * (bswap_xx functions from byteswap.h in GLIBC, or ntohs and ntohl - * on little-endian machines, and if neither are applicable, some fast - * custom code). - * - * The KFromTo{Little|Big}Endian functions are for converting big-endian and - * little-endian data to and from the machine endianness. - */ - -#ifdef HAVE_BYTESWAP_H -#include - - inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) { return bswap_16( b ); } - inline TQ_INT16 KSWAP_16( TQ_INT16 b ) { return bswap_16( (TQ_UINT16)b ); } - inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) { return bswap_32( b ); } - inline TQ_INT32 KSWAP_32( TQ_INT32 b ) { return bswap_32( (TQ_UINT32)b ); } - inline TQ_UINT64 KSWAP_64( TQ_UINT64 b ) { return bswap_64( b ); } - inline TQ_INT64 KSWAP_64( TQ_INT64 b ) { return bswap_64( (TQ_UINT64)b ); } - -#else /* HAVE_BYTESWAP_H */ -#ifdef WORDS_BIGENDIAN - inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) - { - return (((b) & 0x00ff) << 8 | ((b) & 0xff00) >> 8); - } - - inline TQ_INT16 KSWAP_16( TQ_INT16 b ) - { - return ((((TQ_UINT16)b) & 0x00ff) << 8 | (((TQ_UINT16)b) & 0xff00) >> 8); - } - - inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) - { - return - ((((b) & 0xff000000) >> 24) | (((b) & 0x00ff0000) >> 8) | \ - (((b) & 0x0000ff00) << 8) | (((b) & 0x000000ff) << 24)); - } - - inline TQ_INT32 KSWAP_32( TQ_INT32 b ) - { - return - (((((TQ_UINT32)b) & 0xff000000) >> 24) | ((((TQ_UINT32)b) & 0x00ff0000) >> 8) | \ - ((((TQ_UINT32)b) & 0x0000ff00) << 8) | ((((TQ_UINT32)b) & 0x000000ff) << 24)); - } -#else /* WORDS_BIGENDIAN */ -#include -#include - - inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) { return htons(b); } - inline TQ_INT16 KSWAP_16( TQ_INT16 b ) { return htons((TQ_UINT16)b); } - inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) { return htonl(b); } - inline TQ_INT32 KSWAP_32( TQ_INT32 b ) { return htonl((TQ_UINT32)b); } -#endif - inline TQ_UINT64 KSWAP_64( TQ_UINT64 b ) - { - union { - TQ_UINT64 ll; - TQ_UINT32 l[2]; - } w, r; - w.ll = b; - r.l[0] = KSWAP_32( w.l[1] ); - r.l[1] = KSWAP_32( w.l[0] ); - return r.ll; - } - - inline TQ_INT64 KSWAP_64( TQ_INT64 b ) - { - union { - TQ_UINT64 ll; - TQ_UINT32 l[2]; - } w, r; - w.ll = (TQ_UINT64) b; - r.l[0] = KSWAP_32( w.l[1] ); - r.l[1] = KSWAP_32( w.l[0] ); - return r.ll; - } -#endif /* !HAVE_BYTESWAP_H */ - -/** - * \ingroup KSWAP - * Converts a 16 bit unsigned value from/to big-endian byte order to/from the machine order. - */ -inline TQ_UINT16 KFromToBigEndian( TQ_UINT16 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_16(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit unsigned array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_UINT16 *out, TQ_UINT16 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<1 ) ; -#else - while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit unsigned value from/to big-endian byte order to/from the machine order. - */ -inline TQ_UINT32 KFromToBigEndian( TQ_UINT32 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_32(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit unsigned array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_UINT32 *out, TQ_UINT32 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<2 ) ; -#else - while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit unsigned value from/to big-endian byte order to/from the machine order. - */ -inline TQ_UINT64 KFromToBigEndian( TQ_UINT64 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_64(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit unsigned array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_UINT64 *out, TQ_UINT64 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<3 ) ; -#else - while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit signed value from/to big-endian byte order to/from the machine order. - */ -inline TQ_INT16 KFromToBigEndian( TQ_INT16 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_16(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit signed array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_INT16 *out, TQ_INT16 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<1 ) ; -#else - while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit signed value from/to big-endian byte order to/from the machine order. - */ -inline TQ_INT32 KFromToBigEndian( TQ_INT32 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_32(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit signed array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_INT32 *out, TQ_INT32 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<2 ) ; -#else - while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit signed value from/to big-endian byte order to/from the machine order. - */ -inline TQ_INT64 KFromToBigEndian( TQ_INT64 b ) -{ -#ifdef WORDS_BIGENDIAN - return b; -#else - return KSWAP_64(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit signed array from/to big-endian byte order to/from the machine order. - */ -inline void KFromToBigEndian( TQ_INT64 *out, TQ_INT64 *in, uint len ) -{ -#ifdef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<3 ) ; -#else - while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit unsigned value from/to little-endian byte order to/from the machine order. - */ -inline TQ_UINT16 KFromToLittleEndian( TQ_UINT16 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_16(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit unsigned array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_UINT16 *out, TQ_UINT16 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<1 ) ; -#else - while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit unsigned value from/to little-endian byte order to/from the machine order. - */ -inline TQ_UINT32 KFromToLittleEndian( TQ_UINT32 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_32(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit unsigned array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_UINT32 *out, TQ_UINT32 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<2 ) ; -#else - while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit unsigned value from/to little-endian byte order to/from the machine order. - */ -inline TQ_UINT64 KFromToLittleEndian( TQ_UINT64 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_64(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit unsigned array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_UINT64 *out, TQ_UINT64 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<3 ) ; -#else - while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit signed value from/to little-endian byte order to/from the machine order. - */ -inline TQ_INT16 KFromToLittleEndian( TQ_INT16 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_16(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 16 bit signed array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_INT16 *out, TQ_INT16 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<1 ) ; -#else - while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit signed value from/to little-endian byte order to/from the machine order. - */ -inline TQ_INT32 KFromToLittleEndian( TQ_INT32 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_32(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 32 bit signed array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_INT32 *out, TQ_INT32 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<2 ) ; -#else - while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit signed value from/to little-endian byte order to/from the machine order. - */ -inline TQ_INT64 KFromToLittleEndian( TQ_INT64 b ) -{ -#ifndef WORDS_BIGENDIAN - return b; -#else - return KSWAP_64(b); -#endif -} - -/** - * \ingroup KSWAP - * Converts a 64 bit signed array from/to little-endian byte order to/from the machine order. - */ -inline void KFromToLittleEndian( TQ_INT64 *out, TQ_INT64 *in, uint len ) -{ -#ifndef WORDS_BIGENDIAN - if ( out != in ) memcpy( out, in, len<<3 ) ; -#else - while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } -#endif -} - -#endif /* KSWAP_H */ diff --git a/kio/misc/ksendbugmail/Makefile.am b/kio/misc/ksendbugmail/Makefile.am index f3efb2b2c..b24e36a26 100644 --- a/kio/misc/ksendbugmail/Makefile.am +++ b/kio/misc/ksendbugmail/Makefile.am @@ -20,7 +20,7 @@ bin_PROGRAMS = ksendbugmail INCLUDES= -I$(srcdir)/.. $(all_includes) ksendbugmail_SOURCES = main.cpp smtp.cpp -ksendbugmail_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +ksendbugmail_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor ksendbugmail_LDADD = ../../libkio.la METASOURCES = AUTO diff --git a/kio/misc/kwalletd/CMakeLists.txt b/kio/misc/kwalletd/CMakeLists.txt deleted file mode 100644 index db4f56cb1..000000000 --- a/kio/misc/kwalletd/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -################################################# -# -# (C) 2010 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${TQT_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR}/tdecore - ${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/dcop - ${CMAKE_SOURCE_DIR}/tdecore - ${CMAKE_SOURCE_DIR}/tdeui - ${CMAKE_SOURCE_DIR}/kwallet/client - ${CMAKE_SOURCE_DIR}/kwallet/backend - ${CMAKE_SOURCE_DIR}/kio/kio -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### other data ################################ - -install(FILES kwalletd.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kded ) - - -#### kded_kwalletd ############################## - -set( target kded_kwalletd ) - -set( ${target}_SRCS - kwalletd.cpp kwalletd.skel ktimeout.cpp kwalletwizard.ui - kbetterthankdialogbase.ui -) - -tde_add_kpart( ${target} AUTOMOC - SOURCES ${${target}_SRCS} - LINK tdeinit_kded-shared kwalletbackend-shared - DEPENDENCIES dcopidl - DESTINATION ${PLUGIN_INSTALL_DIR} -) diff --git a/kio/misc/kwalletd/Makefile.am b/kio/misc/kwalletd/Makefile.am deleted file mode 100644 index 1d5b1313c..000000000 --- a/kio/misc/kwalletd/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -# This file is part of the KDE libraries -# Copyright (C) 2002 George Staikos - -# 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. - -INCLUDES= -I$(srcdir)/.. -I$(top_srcdir) -I$(top_srcdir)/kwallet/backend -I$(top_builddir)/kwallet/backend -I$(top_srcdir)/kwallet/client -I$(top_builddir)/kwallet/client $(all_includes) - -kde_module_LTLIBRARIES = kded_kwalletd.la - -kded_kwalletd_la_LDFLAGS = $(all_libraries) -module -avoid-version -kded_kwalletd_la_LIBADD = $(LIB_KIO) ../../../kwallet/backend/libkwalletbackend.la ../../../kwallet/client/libkwalletclient.la $(LIB_KDED) $(LIB_QT) $(top_builddir)/dcop/libDCOP.la $(LIB_TDECORE) $(LIB_TDEUI) -kded_kwalletd_la_SOURCES = kwalletd.cpp kwalletd.skel ktimeout.cpp kwalletwizard.ui kbetterthankdialogbase.ui - -METASOURCES = AUTO - -noinst_HEADERS = kwalletd.h ktimeout.h kwalletwizard.ui.h - -services_DATA = kwalletd.desktop -servicesdir = $(kde_servicesdir)/kded - -kwalletwizard.lo: kwalletwizard.ui kwalletwizard.ui.h -kbetterthankdialogbase.lo: kbetterthankdialogbase.ui kbetterthankdialogbase.ui.h diff --git a/kio/misc/kwalletd/kbetterthankdialogbase.ui b/kio/misc/kwalletd/kbetterthankdialogbase.ui deleted file mode 100644 index a02d5def7..000000000 --- a/kio/misc/kwalletd/kbetterthankdialogbase.ui +++ /dev/null @@ -1,154 +0,0 @@ - -KBetterThanKDialogBase - - - KBetterThanKDialogBase - - - - 0 - 0 - 479 - 109 - - - - - - - - unnamed - - - Fixed - - - - _label - - - - - spacer1 - - - Horizontal - - - Expanding - - - - 41 - 21 - - - - - - layout1 - - - - unnamed - - - - _allowOnce - - - Allow &Once - - - true - - - - - _allowAlways - - - Allow &Always - - - - - _deny - - - &Deny - - - - - _denyForever - - - Deny &Forever - - - - - - - spacer2 - - - Horizontal - - - Expanding - - - - 61 - 21 - - - - - - - - - - _allowOnce - clicked() - KBetterThanKDialogBase - clicked() - - - _allowAlways - clicked() - KBetterThanKDialogBase - clicked() - - - _deny - clicked() - KBetterThanKDialogBase - clicked() - - - _denyForever - clicked() - KBetterThanKDialogBase - clicked() - - - - kactivelabel.h - kbetterthankdialogbase.ui.h - - - clicked() - setLabel( const TQString & label ) - init() - accept() - reject() - - - - kactivelabel.h - - diff --git a/kio/misc/kwalletd/kbetterthankdialogbase.ui.h b/kio/misc/kwalletd/kbetterthankdialogbase.ui.h deleted file mode 100644 index 2b3e16b0d..000000000 --- a/kio/misc/kwalletd/kbetterthankdialogbase.ui.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** ui.h extension file, included from the uic-generated form implementation. -** -** If you want to add, delete, or rename functions or slots, use -** Qt Designer to update this file, preserving your code. -** -** You should not define a constructor or destructor in this file. -** Instead, write your code in functions called init() and destroy(). -** These will automatically be called by the form's constructor and -** destructor. -*****************************************************************************/ - - -void KBetterThanKDialogBase::clicked() -{ - if (sender() == _allowOnce) { - done(0); - } else if (sender() == _allowAlways) { - done(1); - } else if (sender() == _deny) { - done(2); - } else if (sender() == _denyForever) { - done(3); - } -} - - -void KBetterThanKDialogBase::setLabel( const TQString & label ) -{ - _label->setText(label); -} - - -void KBetterThanKDialogBase::init() -{ - _allowOnce->setFocus(); -} - - -void KBetterThanKDialogBase::accept() -{ - setResult(0); -} - - -void KBetterThanKDialogBase::reject() -{ - TQDialog::reject(); - setResult(2); -} diff --git a/kio/misc/kwalletd/ktimeout.cpp b/kio/misc/kwalletd/ktimeout.cpp deleted file mode 100644 index c431ecf69..000000000 --- a/kio/misc/kwalletd/ktimeout.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (c) 2003 George Staikos - - 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 "ktimeout.h" - -KTimeout::KTimeout(int size) -: TQObject(), _timers(size) { - _timers.setAutoDelete(true); -} - - -KTimeout::~KTimeout() { - clear(); -} - - -void KTimeout::clear() { - _timers.clear(); -} - - -void KTimeout::removeTimer(int id) { - TQTimer *t = _timers.find(id); - if (t != 0L) { - _timers.remove(id); // autodeletes - } -} - - -void KTimeout::addTimer(int id, int timeout) { - if (_timers.find(id) != 0L) { - return; - } - - TQTimer *t = new TQTimer; - connect(t, TQT_SIGNAL(timeout()), this, TQT_SLOT(timeout())); - t->start(timeout); - _timers.insert(id, t); -} - - -void KTimeout::resetTimer(int id, int timeout) { - TQTimer *t = _timers.find(id); - if (t) { - t->changeInterval(timeout); - } -} - - -void KTimeout::timeout() { - const TQTimer *t = static_cast(sender()); - if (t) { - TQIntDictIterator it(_timers); - for (; it.current(); ++it) { - if (it.current() == t) { - emit timedOut(it.currentKey()); - return; - } - } - } -} - - -#include "ktimeout.moc" - diff --git a/kio/misc/kwalletd/ktimeout.h b/kio/misc/kwalletd/ktimeout.h deleted file mode 100644 index 441e4ed77..000000000 --- a/kio/misc/kwalletd/ktimeout.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (c) 2003 George Staikos - - 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 _KTIMEOUT_H_ -#define _KTIMEOUT_H_ - -#include -#include -#include - -// @internal -class KTimeout : public TQObject { - Q_OBJECT - public: - KTimeout(int size = 29); - virtual ~KTimeout(); - - signals: - void timedOut(int id); - - public slots: - void resetTimer(int id, int timeout); - void addTimer(int id, int timeout); - void removeTimer(int id); - void clear(); - - private slots: - void timeout(); - - private: - TQIntDict _timers; -}; - -#endif diff --git a/kio/misc/kwalletd/kwalletd.cpp b/kio/misc/kwalletd/kwalletd.cpp deleted file mode 100644 index afa634c64..000000000 --- a/kio/misc/kwalletd/kwalletd.cpp +++ /dev/null @@ -1,1514 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (c) 2002-2004 George Staikos - - 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 "kbetterthankdialogbase.h" -#include "kwalletwizard.h" -#include "kwalletd.h" -#include "ktimeout.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -extern "C" { - KDE_EXPORT KDEDModule *create_kwalletd(const TQCString &name) { - return new KWalletD(name); - } -} - - -class KWalletTransaction { - public: - KWalletTransaction() { - tType = Unknown; - transaction = 0L; - client = 0L; - modal = false; - } - - ~KWalletTransaction() { - // Don't delete these! - transaction = 0L; - client = 0L; - } - - enum Type { Unknown, Open, ChangePassword, OpenFail }; - DCOPClient *client; - DCOPClientTransaction *transaction; - Type tType; - TQCString rawappid, returnObject; - TQCString appid; - uint wId; - TQString wallet; - bool modal; -}; - - -KWalletD::KWalletD(const TQCString &name) -: KDEDModule(name), _failed(0) { - srand(time(0)); - _showingFailureNotify = false; - _transactions.setAutoDelete(true); - _timeouts = new KTimeout(17); - _closeIdle = false; - _idleTime = 0; - connect(_timeouts, TQT_SIGNAL(timedOut(int)), this, TQT_SLOT(timedOut(int))); - reconfigure(); - TDEGlobal::dirs()->addResourceType("kwallet", "share/apps/kwallet"); - connect(TDEApplication::dcopClient(), - TQT_SIGNAL(applicationRemoved(const TQCString&)), - this, - TQT_SLOT(slotAppUnregistered(const TQCString&))); - _dw = new KDirWatch(this, "KWallet Directory Watcher"); - _dw->addDir(TDEGlobal::dirs()->saveLocation("kwallet")); - _dw->startScan(true); - connect(_dw, TQT_SIGNAL(dirty(const TQString&)), this, TQT_SLOT(emitWalletListDirty())); -} - - -KWalletD::~KWalletD() { - delete _timeouts; - _timeouts = 0; - - closeAllWallets(); - _transactions.clear(); -} - - -int KWalletD::generateHandle() { - int rc; - - // ASSUMPTION: RAND_MAX is fairly large. - do { - rc = rand(); - } while (_wallets.find(rc) || rc == 0); - - return rc; -} - - -void KWalletD::processTransactions() { - static bool processing = false; - - if (processing) { - return; - } - - processing = true; - - // Process remaining transactions - KWalletTransaction *xact; - while (!_transactions.isEmpty()) { - xact = _transactions.first(); - TQCString replyType; - int res; - - assert(xact->tType != KWalletTransaction::Unknown); - - switch (xact->tType) { - case KWalletTransaction::Open: - res = doTransactionOpen(xact->appid, xact->wallet, xact->wId, xact->modal); - replyType = "int"; - if (!xact->returnObject.isEmpty()) { - DCOPRef(xact->rawappid, xact->returnObject).send("walletOpenResult", res); - } - - // multiple requests from the same client - // should not produce multiple password - // dialogs on a failure - if (res < 0) { - TQPtrListIterator it(_transactions); - KWalletTransaction *x; - while ((x = it.current()) && x != xact) { - ++it; - } - if (x) { - ++it; - } - while ((x = it.current())) { - if (xact->appid == x->appid && x->tType == KWalletTransaction::Open && x->wallet == xact->wallet && x->wId == xact->wId) { - x->tType = KWalletTransaction::OpenFail; - } - ++it; - } - } - break; - case KWalletTransaction::OpenFail: - res = -1; - replyType = "int"; - if (!xact->returnObject.isEmpty()) { - DCOPRef(xact->rawappid, xact->returnObject).send("walletOpenResult", res); - } - break; - case KWalletTransaction::ChangePassword: - doTransactionChangePassword(xact->appid, xact->wallet, xact->wId); - // fall through - no return - default: - _transactions.removeRef(xact); - continue; - } - - if (xact->returnObject.isEmpty() && xact->tType != KWalletTransaction::ChangePassword) { - TQByteArray replyData; - TQDataStream stream(replyData, IO_WriteOnly); - stream << res; - xact->client->endTransaction(xact->transaction, replyType, replyData); - } - _transactions.removeRef(xact); - } - - processing = false; -} - - -void KWalletD::openAsynchronous(const TQString& wallet, const TQCString& returnObject, uint wId) { - DCOPClient *dc = callingDcopClient(); - if (!dc) { - return; - } - - TQCString appid = dc->senderId(); - if (!_enabled || - !TQRegExp("^[A-Za-z0-9]+[A-Za-z0-9\\s\\-_]*$").exactMatch(wallet)) { - DCOPRef(appid, returnObject).send("walletOpenResult", -1); - return; - } - - TQCString peerName = friendlyDCOPPeerName(); - - KWalletTransaction *xact = new KWalletTransaction; - - xact->appid = peerName; - xact->rawappid = appid; - xact->client = callingDcopClient(); - xact->wallet = wallet; - xact->wId = wId; - xact->tType = KWalletTransaction::Open; - xact->returnObject = returnObject; - _transactions.append(xact); - - DCOPRef(appid, returnObject).send("walletOpenResult", 0); - - TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); - checkActiveDialog(); -} - - -int KWalletD::openPath(const TQString& path, uint wId) { - if (!_enabled) { // guard - return -1; - } - - // FIXME: setup transaction - int rc = internalOpen(friendlyDCOPPeerName(), path, true, wId); - return rc; -} - - -int KWalletD::open(const TQString& wallet, uint wId) { - if (!_enabled) { // guard - return -1; - } - - if (!TQRegExp("^[A-Za-z0-9]+[A-Za-z0-9\\s\\-_]*$").exactMatch(wallet)) { - return -1; - } - - TQCString appid = friendlyDCOPPeerName(); - - KWalletTransaction *xact = new KWalletTransaction; - _transactions.append(xact); - - xact->appid = appid; - xact->client = callingDcopClient(); - xact->transaction = xact->client->beginTransaction(); - xact->wallet = wallet; - xact->wId = wId; - xact->tType = KWalletTransaction::Open; - xact->modal = true; // mark dialogs as modal, the app has blocking wait - TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); - checkActiveDialog(); - return 0; // process later -} - - -// Sets up a dialog that will be shown by kwallet. -void KWalletD::setupDialog( TQWidget* dialog, WId wId, const TQCString& appid, bool modal ) { - if( wId != 0 ) - KWin::setMainWindow( dialog, wId ); // correct, set dialog parent - else { - if( appid.isEmpty()) - kdWarning() << "Using kwallet without parent window!" << endl; - else - kdWarning() << "Application '" << appid << "' using kwallet without parent window!" << endl; - // allow dialog activation even if it interrupts, better than trying hacks - // with keeping the dialog on top or on all desktops - kapp->updateUserTimestamp(); - } - if( modal ) - KWin::setState( dialog->winId(), NET::Modal ); - else - KWin::clearState( dialog->winId(), NET::Modal ); - activeDialog = dialog; -} - -// If there's a dialog already open and another application tries some operation that'd lead to -// opening a dialog, that application will be blocked by this dialog. A proper solution would -// be to set the second application's window also as a parent for the active dialog, so that -// KWin properly handles focus changes and so on, but there's currently no support for multiple -// dialog parents. Hopefully to be done in KDE4, for now just use all kinds of bad hacks to make -// sure the user doesn't overlook the active dialog. -void KWalletD::checkActiveDialog() { - if( !activeDialog || !activeDialog->isShown()) - return; - kapp->updateUserTimestamp(); - KWin::setState( activeDialog->winId(), NET::KeepAbove ); - KWin::setOnAllDesktops( activeDialog->winId(), true ); - KWin::forceActiveWindow( activeDialog->winId()); -} - -int KWalletD::doTransactionOpen(const TQCString& appid, const TQString& wallet, uint wId, bool modal) { - if (_firstUse && !wallets().contains(KWallet::Wallet::LocalWallet())) { - // First use wizard - KWalletWizard *wiz = new KWalletWizard(0); - setupDialog( wiz, wId, appid, modal ); - int rc = wiz->exec(); - if (rc == TQDialog::Accepted) { - TDEConfig cfg("kwalletrc"); - cfg.setGroup("Wallet"); - cfg.writeEntry("First Use", false); - cfg.writeEntry("Enabled", wiz->_useWallet->isChecked()); - cfg.writeEntry("Close When Idle", wiz->_closeIdle->isChecked()); - cfg.writeEntry("Use One Wallet", !wiz->_networkWallet->isChecked()); - cfg.sync(); - reconfigure(); - - if (!wiz->_useWallet->isChecked()) { - delete wiz; - return -1; - } - - // Create the wallet - KWallet::Backend *b = new KWallet::Backend(KWallet::Wallet::LocalWallet()); - TQByteArray p; - p.duplicate(wiz->_pass1->text().utf8(), wiz->_pass1->text().length()); - b->open(p); - b->createFolder(KWallet::Wallet::PasswordFolder()); - b->createFolder(KWallet::Wallet::FormDataFolder()); - b->close(p); - p.fill(0); - delete b; - delete wiz; - } else { - delete wiz; - return -1; - } - } else if (_firstUse) { - TDEConfig cfg("kwalletrc"); - _firstUse = false; - cfg.setGroup("Wallet"); - cfg.writeEntry("First Use", false); - cfg.sync(); - } - - int rc = internalOpen(appid, wallet, false, wId, modal); - return rc; -} - -int KWalletD::tryOpen(const TQString& wallet, const TQCString& password) -{ - if (isOpen(wallet)) - return 0; - - if (_tryOpenBlocked.isActive()) { - kdDebug() << "tryOpen is active.." << endl; - return -1; - } - - if (!KWallet::Backend::exists(wallet)) - return -2; - - KWallet::Backend *b = new KWallet::Backend(wallet, false /*isPath*/); - int rc = b->open(TQByteArray().duplicate(password, strlen(password))); - if (rc == 0) { - _wallets.insert(rc = generateHandle(), b); - _passwords[wallet] = password; - b->ref(); - _tryOpenBlocked.stop(); - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << wallet; - emitDCOPSignal("walletOpened(TQString)", data); - } - else { - delete b; - // make sure that we're not bombed with a dictionary attack - _tryOpenBlocked.start (30 * 1000, true /*single shot*/); - if (++_failed > 5) { - _failed = 0; - TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); - } - - rc = -1; - } - return rc; -} - -int KWalletD::internalOpen(const TQCString& appid, const TQString& wallet, bool isPath, WId w, bool modal) { - int rc = -1; - bool brandNew = false; - - TQCString thisApp; - if (appid.isEmpty()) { - thisApp = "TDE System"; - } else { - thisApp = appid; - } - - if (implicitDeny(wallet, thisApp)) { - return -1; - } - - for (TQIntDictIterator i(_wallets); i.current(); ++i) { - if (i.current()->walletName() == wallet) { - rc = i.currentKey(); - break; - } - } - - if (rc == -1) { - if (_wallets.count() > 20) { - kdDebug() << "Too many wallets open." << endl; - return -1; - } - - KWallet::Backend *b = new KWallet::Backend(wallet, isPath); - KPasswordDialog *kpd = 0L; - bool emptyPass = false; - if ((isPath && TQFile::exists(wallet)) || (!isPath && KWallet::Backend::exists(wallet))) { - int pwless = b->open(TQByteArray()); - if (0 != pwless || !b->isOpen()) { - if (pwless == 0) { - // release, start anew - delete b; - b = new KWallet::Backend(wallet, isPath); - } - kpd = new KPasswordDialog(KPasswordDialog::Password, false, 0); - if (appid.isEmpty()) { - kpd->setPrompt(i18n("TDE has requested to open the wallet '%1'. Please enter the password for this wallet below.").arg(TQStyleSheet::escape(wallet))); - } else { - kpd->setPrompt(i18n("The application '%1' has requested to open the wallet '%2'. Please enter the password for this wallet below.").arg(TQStyleSheet::escape(appid)).arg(TQStyleSheet::escape(wallet))); - } - brandNew = false; - kpd->setButtonOK(KGuiItem(i18n("&Open"),"fileopen")); - } else { - emptyPass = true; - } - } else if (wallet == KWallet::Wallet::LocalWallet() || - wallet == KWallet::Wallet::NetworkWallet()) { - // Auto create these wallets. - kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); - if (appid.isEmpty()) { - kpd->setPrompt(i18n("TDE has requested to open the wallet. This is used to store sensitive data in a secure fashion. Please enter a password to use with this wallet or click cancel to deny the application's request.")); - } else { - kpd->setPrompt(i18n("The application '%1' has requested to open the TDE wallet. This is used to store sensitive data in a secure fashion. Please enter a password to use with this wallet or click cancel to deny the application's request.").arg(TQStyleSheet::escape(appid))); - } - brandNew = true; - kpd->setButtonOK(KGuiItem(i18n("&Open"),"fileopen")); - } else { - kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); - if (appid.length() == 0) { - kpd->setPrompt(i18n("TDE has requested to create a new wallet named '%1'. Please choose a password for this wallet, or cancel to deny the application's request.").arg(TQStyleSheet::escape(wallet))); - } else { - 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.").arg(TQStyleSheet::escape(appid)).arg(TQStyleSheet::escape(wallet))); - } - brandNew = true; - kpd->setButtonOK(KGuiItem(i18n("C&reate"),"filenew")); - } - - if (kpd) { - kpd->setCaption(i18n("TDE Wallet Service")); - kpd->setAllowEmptyPasswords(true); - } - - const char *p = 0L; - while (!b->isOpen()) { - assert(kpd); // kpd can't be null if isOpen() is false - setupDialog( kpd, w, appid, modal ); - if (kpd->exec() == KDialog::Accepted) { - p = kpd->password(); - int rc = b->open(TQByteArray().duplicate(p, strlen(p))); - if (!b->isOpen()) { - kpd->setPrompt(i18n("Error opening the wallet '%1'. Please try again.
(Error code %2: %3)").arg(TQStyleSheet::escape(wallet)).arg(rc).arg(KWallet::Backend::openRCToString(rc))); - kpd->clearPassword(); - } - } else { - break; - } - } - - if (!emptyPass && (!p || !b->isOpen())) { - delete b; - delete kpd; - return -1; - } - - if (emptyPass && _openPrompt && !isAuthorizedApp(appid, wallet, w)) { - delete b; - delete kpd; - return -1; - } - - _wallets.insert(rc = generateHandle(), b); - if (emptyPass) { - _passwords[wallet] = ""; - } else { - _passwords[wallet] = p; - } - _handles[appid].append(rc); - - delete kpd; // don't refactor this!! Argh I hate KPassDlg - - if (brandNew) { - createFolder(rc, KWallet::Wallet::PasswordFolder()); - createFolder(rc, KWallet::Wallet::FormDataFolder()); - } - - b->ref(); - if (_closeIdle && _timeouts) { - _timeouts->addTimer(rc, _idleTime); - } - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << wallet; - if (brandNew) { - emitDCOPSignal("walletCreated(TQString)", data); - } - emitDCOPSignal("walletOpened(TQString)", data); - if (_wallets.count() == 1 && _launchManager) { - TDEApplication::startServiceByDesktopName("kwalletmanager-kwalletd"); - } - } else { - if (!_handles[appid].contains(rc) && _openPrompt && !isAuthorizedApp(appid, wallet, w)) { - return -1; - } - _handles[appid].append(rc); - _wallets.find(rc)->ref(); - } - - return rc; -} - - -bool KWalletD::isAuthorizedApp(const TQCString& appid, const TQString& wallet, WId w) { - int response = 0; - - TQCString thisApp; - if (appid.isEmpty()) { - thisApp = "TDE System"; - } else { - thisApp = appid; - } - - if (!implicitAllow(wallet, thisApp)) { - KBetterThanKDialogBase *dialog = new KBetterThanKDialogBase; - if (appid.isEmpty()) { - dialog->setLabel(i18n("TDE has requested access to the open wallet '%1'.").arg(TQStyleSheet::escape(wallet))); - } else { - dialog->setLabel(i18n("The application '%1' has requested access to the open wallet '%2'.").arg(TQStyleSheet::escape(TQString(appid))).arg(TQStyleSheet::escape(wallet))); - } - setupDialog( dialog, w, appid, false ); - response = dialog->exec(); - delete dialog; - } - - if (response == 0 || response == 1) { - if (response == 1) { - TDEConfig cfg("kwalletrc"); - cfg.setGroup("Auto Allow"); - TQStringList apps = cfg.readListEntry(wallet); - if (!apps.contains(thisApp)) { - apps += thisApp; - _implicitAllowMap[wallet] += thisApp; - cfg.writeEntry(wallet, apps); - cfg.sync(); - } - } - } else if (response == 3) { - TDEConfig cfg("kwalletrc"); - cfg.setGroup("Auto Deny"); - TQStringList apps = cfg.readListEntry(wallet); - if (!apps.contains(thisApp)) { - apps += thisApp; - _implicitDenyMap[wallet] += thisApp; - cfg.writeEntry(wallet, apps); - cfg.sync(); - } - return false; - } else { - return false; - } - return true; -} - - -int KWalletD::deleteWallet(const TQString& wallet) { - TQString path = TDEGlobal::dirs()->saveLocation("kwallet") + TQDir::separator() + wallet + ".kwl"; - - if (TQFile::exists(path)) { - close(wallet, true); - TQFile::remove(path); - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << wallet; - emitDCOPSignal("walletDeleted(TQString)", data); - return 0; - } - - return -1; -} - - -void KWalletD::changePassword(const TQString& wallet, uint wId) { - TQCString appid = friendlyDCOPPeerName(); - - KWalletTransaction *xact = new KWalletTransaction; - - xact->appid = appid; - xact->client = callingDcopClient(); - xact->wallet = wallet; - xact->wId = wId; - xact->tType = KWalletTransaction::ChangePassword; - - _transactions.append(xact); - - TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); - checkActiveDialog(); -} - - -void KWalletD::doTransactionChangePassword(const TQCString& appid, const TQString& wallet, uint wId) { - TQIntDictIterator it(_wallets); - KWallet::Backend *w = 0L; - int handle = -1; - bool reclose = false; - - for (; it.current(); ++it) { - if (it.current()->walletName() == wallet) { - break; - } - } - - if (!it.current()) { - handle = doTransactionOpen(appid, wallet, wId,false); - if (-1 == handle) { - KMessageBox::sorryWId(wId, i18n("Unable to open wallet. The wallet must be opened in order to change the password."), i18n("TDE Wallet Service")); - return; - } - - w = _wallets.find(handle); - reclose = true; - } else { - handle = it.currentKey(); - w = it.current(); - } - - assert(w); - - KPasswordDialog *kpd; - kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); - kpd->setPrompt(i18n("Please choose a new password for the wallet '%1'.").arg(TQStyleSheet::escape(wallet))); - kpd->setCaption(i18n("TDE Wallet Service")); - kpd->setAllowEmptyPasswords(true); - setupDialog( kpd, wId, appid, false ); - if (kpd->exec() == KDialog::Accepted) { - const char *p = kpd->password(); - if (p) { - _passwords[wallet] = p; - TQByteArray pa; - pa.duplicate(p, strlen(p)); - int rc = w->close(pa); - if (rc < 0) { - KMessageBox::sorryWId(wId, i18n("Error re-encrypting the wallet. Password was not changed."), i18n("TDE Wallet Service")); - reclose = true; - } else { - rc = w->open(pa); - if (rc < 0) { - KMessageBox::sorryWId(wId, i18n("Error reopening the wallet. Data may be lost."), i18n("TDE Wallet Service")); - reclose = true; - } - } - } - } - - delete kpd; - - if (reclose) { - close(handle, true); - } -} - - -int KWalletD::close(const TQString& wallet, bool force) { - int handle = -1; - KWallet::Backend *w = 0L; - - for (TQIntDictIterator it(_wallets); - it.current(); - ++it) { - if (it.current()->walletName() == wallet) { - handle = it.currentKey(); - w = it.current(); - break; - } - } - - return closeWallet(w, handle, force); -} - - -int KWalletD::closeWallet(KWallet::Backend *w, int handle, bool force) { - if (w) { - const TQString& wallet = w->walletName(); - assert(_passwords.contains(wallet)); - if (w->refCount() == 0 || force) { - invalidateHandle(handle); - if (_closeIdle && _timeouts) { - _timeouts->removeTimer(handle); - } - _wallets.remove(handle); - if (_passwords.contains(wallet)) { - w->close(TQByteArray().duplicate(_passwords[wallet].data(), _passwords[wallet].length())); - _passwords[wallet].fill(0); - _passwords.remove(wallet); - } - doCloseSignals(handle, wallet); - delete w; - return 0; - } - return 1; - } - - return -1; -} - - -int KWalletD::close(int handle, bool force) { - TQCString appid = friendlyDCOPPeerName(); - KWallet::Backend *w = _wallets.find(handle); - bool contains = false; - - if (w) { // the handle is valid - if (_handles.contains(appid)) { // we know this app - if (_handles[appid].contains(handle)) { - // the app owns this handle - _handles[appid].remove(_handles[appid].find(handle)); - contains = true; - if (_handles[appid].isEmpty()) { - _handles.remove(appid); - } - } - } - - // watch the side effect of the deref() - if ((contains && w->deref() == 0 && !_leaveOpen) || force) { - if (_closeIdle && _timeouts) { - _timeouts->removeTimer(handle); - } - _wallets.remove(handle); - if (force) { - invalidateHandle(handle); - } - if (_passwords.contains(w->walletName())) { - w->close(TQByteArray().duplicate(_passwords[w->walletName()].data(), _passwords[w->walletName()].length())); - _passwords[w->walletName()].fill(0); - _passwords.remove(w->walletName()); - } - doCloseSignals(handle, w->walletName()); - delete w; - return 0; - } - return 1; // not closed - } - - return -1; // not open to begin with, or other error -} - - -bool KWalletD::isOpen(const TQString& wallet) const { - for (TQIntDictIterator it(_wallets); - it.current(); - ++it) { - if (it.current()->walletName() == wallet) { - return true; - } - } - return false; -} - - -bool KWalletD::isOpen(int handle) { - if (handle == 0) { - return false; - } - - KWallet::Backend *rc = _wallets.find(handle); - - if (rc == 0 && ++_failed > 5) { - _failed = 0; - TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); - } else if (rc != 0) { - _failed = 0; - } - - return rc != 0; -} - - -TQStringList KWalletD::wallets() const { - TQString path = TDEGlobal::dirs()->saveLocation("kwallet"); - TQDir dir(path, "*.kwl"); - TQStringList rc; - - dir.setFilter(TQDir::Files | TQDir::NoSymLinks); - - const TQFileInfoList *list = dir.entryInfoList(); - TQFileInfoListIterator it(*list); - TQFileInfo *fi; - while ((fi = it.current()) != 0L) { - TQString fn = fi->fileName(); - if (fn.endsWith(".kwl")) { - fn.truncate(fn.length()-4); - } - rc += fn; - ++it; - } - return rc; -} - - -void KWalletD::sync(int handle) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - } -} - - -TQStringList KWalletD::folderList(int handle) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - return b->folderList(); - } - - return TQStringList(); -} - - -bool KWalletD::hasFolder(int handle, const TQString& f) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - return b->hasFolder(f); - } - - return false; -} - - -bool KWalletD::removeFolder(int handle, const TQString& f) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - bool rc = b->removeFolder(f); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << b->walletName(); - emitDCOPSignal("folderListUpdated(TQString)", data); - return rc; - } - - return false; -} - - -bool KWalletD::createFolder(int handle, const TQString& f) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - bool rc = b->createFolder(f); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << b->walletName(); - emitDCOPSignal("folderListUpdated(TQString)", data); - return rc; - } - - return false; -} - - -TQByteArray KWalletD::readMap(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry *e = b->readEntry(key); - if (e && e->type() == KWallet::Wallet::Map) { - return e->map(); - } - } - - return TQByteArray(); -} - - -TQMap KWalletD::readMapList(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - TQPtrList e = b->readEntryList(key); - TQMap rc; - TQPtrListIterator it(e); - KWallet::Entry *entry; - while ((entry = it.current())) { - if (entry->type() == KWallet::Wallet::Map) { - rc.insert(entry->key(), entry->map()); - } - ++it; - } - return rc; - } - - return TQMap(); -} - - -TQByteArray KWalletD::readEntry(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry *e = b->readEntry(key); - if (e) { - return e->value(); - } - } - - return TQByteArray(); -} - - -TQMap KWalletD::readEntryList(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - TQPtrList e = b->readEntryList(key); - TQMap rc; - TQPtrListIterator it(e); - KWallet::Entry *entry; - while ((entry = it.current())) { - rc.insert(entry->key(), entry->value()); - ++it; - } - return rc; - } - - return TQMap(); -} - - -TQStringList KWalletD::entryList(int handle, const TQString& folder) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - return b->entryList(); - } - - return TQStringList(); -} - - -TQString KWalletD::readPassword(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry *e = b->readEntry(key); - if (e && e->type() == KWallet::Wallet::Password) { - return e->password(); - } - } - - return TQString::null; -} - - -TQMap KWalletD::readPasswordList(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - TQPtrList e = b->readEntryList(key); - TQMap rc; - TQPtrListIterator it(e); - KWallet::Entry *entry; - while ((entry = it.current())) { - if (entry->type() == KWallet::Wallet::Password) { - rc.insert(entry->key(), entry->password()); - } - ++it; - } - return rc; - } - - return TQMap(); -} - - -int KWalletD::writeMap(int handle, const TQString& folder, const TQString& key, const TQByteArray& value) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry e; - e.setKey(key); - e.setValue(value); - e.setType(KWallet::Wallet::Map); - b->writeEntry(&e); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return 0; - } - - return -1; -} - - -int KWalletD::writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value, int entryType) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry e; - e.setKey(key); - e.setValue(value); - e.setType(KWallet::Wallet::EntryType(entryType)); - b->writeEntry(&e); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return 0; - } - - return -1; -} - - -int KWalletD::writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry e; - e.setKey(key); - e.setValue(value); - e.setType(KWallet::Wallet::Stream); - b->writeEntry(&e); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return 0; - } - - return -1; -} - - -int KWalletD::writePassword(int handle, const TQString& folder, const TQString& key, const TQString& value) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - KWallet::Entry e; - e.setKey(key); - e.setValue(value); - e.setType(KWallet::Wallet::Password); - b->writeEntry(&e); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return 0; - } - - return -1; -} - - -int KWalletD::entryType(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - if (!b->hasFolder(folder)) { - return KWallet::Wallet::Unknown; - } - b->setFolder(folder); - if (b->hasEntry(key)) { - return b->readEntry(key)->type(); - } - } - - return KWallet::Wallet::Unknown; -} - - -bool KWalletD::hasEntry(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - if (!b->hasFolder(folder)) { - return false; - } - b->setFolder(folder); - return b->hasEntry(key); - } - - return false; -} - - -int KWalletD::removeEntry(int handle, const TQString& folder, const TQString& key) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - if (!b->hasFolder(folder)) { - return 0; - } - b->setFolder(folder); - bool rc = b->removeEntry(key); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return rc ? 0 : -3; - } - - return -1; -} - - -void KWalletD::slotAppUnregistered(const TQCString& app) { - if (_handles.contains(app)) { - TQValueList l = _handles[app]; - for (TQValueList::Iterator i = l.begin(); i != l.end(); ++i) { - _handles[app].remove(*i); - KWallet::Backend *w = _wallets.find(*i); - if (w && !_leaveOpen && 0 == w->deref()) { - close(w->walletName(), true); - } - } - _handles.remove(app); - } -} - - -void KWalletD::invalidateHandle(int handle) { - for (TQMap >::Iterator i = _handles.begin(); - i != _handles.end(); - ++i) { - i.data().remove(handle); - } -} - - -KWallet::Backend *KWalletD::getWallet(const TQCString& appid, int handle) { - if (handle == 0) { - return 0L; - } - - KWallet::Backend *w = _wallets.find(handle); - - if (w) { // the handle is valid - if (_handles.contains(appid)) { // we know this app - if (_handles[appid].contains(handle)) { - // the app owns this handle - _failed = 0; - if (_closeIdle && _timeouts) { - _timeouts->resetTimer(handle, _idleTime); - } - return w; - } - } - } - - if (++_failed > 5) { - _failed = 0; - TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); - } - - return 0L; -} - - -void KWalletD::notifyFailures() { - if (!_showingFailureNotify) { - _showingFailureNotify = true; - KMessageBox::information(0, i18n("There have been repeated failed attempts to gain access to a wallet. An application may be misbehaving."), i18n("TDE Wallet Service")); - _showingFailureNotify = false; - } -} - - -void KWalletD::doCloseSignals(int handle, const TQString& wallet) { - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << handle; - emitDCOPSignal("walletClosed(int)", data); - - TQByteArray data2; - TQDataStream ds2(data2, IO_WriteOnly); - ds2 << wallet; - emitDCOPSignal("walletClosed(TQString)", data2); - - if (_wallets.isEmpty()) { - emitDCOPSignal("allWalletsClosed()", TQByteArray()); - } -} - - -int KWalletD::renameEntry(int handle, const TQString& folder, const TQString& oldName, const TQString& newName) { - KWallet::Backend *b; - - if ((b = getWallet(friendlyDCOPPeerName(), handle))) { - b->setFolder(folder); - int rc = b->renameEntry(oldName, newName); - // write changes to disk immediately - TQByteArray p; - TQString wallet = b->walletName(); - p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); - b->sync(p); - p.fill(0); - emitFolderUpdated(b->walletName(), folder); - return rc; - } - - return -1; -} - - -TQStringList KWalletD::users(const TQString& wallet) const { - TQStringList rc; - - for (TQIntDictIterator it(_wallets); - it.current(); - ++it) { - if (it.current()->walletName() == wallet) { - for (TQMap >::ConstIterator hit = _handles.begin(); hit != _handles.end(); ++hit) { - if (hit.data().contains(it.currentKey())) { - rc += hit.key(); - } - } - break; - } - } - - return rc; -} - - -bool KWalletD::disconnectApplication(const TQString& wallet, const TQCString& application) { - for (TQIntDictIterator it(_wallets); - it.current(); - ++it) { - if (it.current()->walletName() == wallet) { - if (_handles[application].contains(it.currentKey())) { - _handles[application].remove(it.currentKey()); - - if (_handles[application].isEmpty()) { - _handles.remove(application); - } - - if (it.current()->deref() == 0) { - close(it.current()->walletName(), true); - } - - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << wallet; - ds << application; - emitDCOPSignal("applicationDisconnected(TQString,TQCString)", data); - - return true; - } - } - } - - return false; -} - - -void KWalletD::emitFolderUpdated(const TQString& wallet, const TQString& folder) { - TQByteArray data; - TQDataStream ds(data, IO_WriteOnly); - ds << wallet; - ds << folder; - emitDCOPSignal("folderUpdated(TQString,TQString)", data); -} - - -void KWalletD::emitWalletListDirty() { - emitDCOPSignal("walletListDirty()", TQByteArray()); -} - - -void KWalletD::reconfigure() { - TDEConfig cfg("kwalletrc"); - cfg.setGroup("Wallet"); - _firstUse = cfg.readBoolEntry("First Use", true); - _enabled = cfg.readBoolEntry("Enabled", true); - _launchManager = cfg.readBoolEntry("Launch Manager", true); - _leaveOpen = cfg.readBoolEntry("Leave Open", false); - bool idleSave = _closeIdle; - _closeIdle = cfg.readBoolEntry("Close When Idle", false); - _openPrompt = cfg.readBoolEntry("Prompt on Open", true); - int timeSave = _idleTime; - // in minutes! - _idleTime = cfg.readNumEntry("Idle Timeout", 10) * 60 * 1000; - - if (cfg.readBoolEntry("Close on Screensaver", false)) { - connectDCOPSignal("kdesktop", "KScreensaverIface", "KDE_start_screensaver()", "closeAllWallets()", false); - } else { - disconnectDCOPSignal("kdesktop", "KScreensaverIface", "KDE_start_screensaver()", "closeAllWallets()"); - } - - // Handle idle changes - if (_closeIdle) { - if (_idleTime != timeSave) { // Timer length changed - TQIntDictIterator it(_wallets); - for (; it.current(); ++it) { - _timeouts->resetTimer(it.currentKey(), _idleTime); - } - } - - if (!idleSave) { // add timers for all the wallets - TQIntDictIterator it(_wallets); - for (; it.current(); ++it) { - _timeouts->addTimer(it.currentKey(), _idleTime); - } - } - } else { - _timeouts->clear(); - } - - // Update the implicit allow stuff - _implicitAllowMap.clear(); - cfg.setGroup("Auto Allow"); - TQStringList entries = cfg.entryMap("Auto Allow").keys(); - for (TQStringList::Iterator i = entries.begin(); i != entries.end(); ++i) { - _implicitAllowMap[*i] = cfg.readListEntry(*i); - } - - // Update the implicit allow stuff - _implicitDenyMap.clear(); - cfg.setGroup("Auto Deny"); - entries = cfg.entryMap("Auto Deny").keys(); - for (TQStringList::Iterator i = entries.begin(); i != entries.end(); ++i) { - _implicitDenyMap[*i] = cfg.readListEntry(*i); - } - - // Update if wallet was enabled/disabled - if (!_enabled) { // close all wallets - while (!_wallets.isEmpty()) { - TQIntDictIterator it(_wallets); - if (!it.current()) { // necessary? - break; - } - closeWallet(it.current(), it.currentKey(), true); - } - } -} - - -bool KWalletD::isEnabled() const { - return _enabled; -} - - -bool KWalletD::folderDoesNotExist(const TQString& wallet, const TQString& folder) { - if (!wallets().contains(wallet)) { - return true; - } - - for (TQIntDictIterator it(_wallets); it.current(); ++it) { - if (it.current()->walletName() == wallet) { - return it.current()->folderDoesNotExist(folder); - } - } - - KWallet::Backend *b = new KWallet::Backend(wallet); - b->open(TQByteArray()); - bool rc = b->folderDoesNotExist(folder); - delete b; - return rc; -} - - -bool KWalletD::keyDoesNotExist(const TQString& wallet, const TQString& folder, const TQString& key) { - if (!wallets().contains(wallet)) { - return true; - } - - for (TQIntDictIterator it(_wallets); it.current(); ++it) { - if (it.current()->walletName() == wallet) { - return it.current()->entryDoesNotExist(folder, key); - } - } - - KWallet::Backend *b = new KWallet::Backend(wallet); - b->open(TQByteArray()); - bool rc = b->entryDoesNotExist(folder, key); - delete b; - return rc; -} - - -bool KWalletD::implicitAllow(const TQString& wallet, const TQCString& app) { - return _implicitAllowMap[wallet].contains(TQString::fromLocal8Bit(app)); -} - - -bool KWalletD::implicitDeny(const TQString& wallet, const TQCString& app) { - return _implicitDenyMap[wallet].contains(TQString::fromLocal8Bit(app)); -} - - -TQCString KWalletD::friendlyDCOPPeerName() { - DCOPClient *dc = callingDcopClient(); - if (!dc) { - return ""; - } - return dc->senderId().replace(TQRegExp("-[0-9]+$"), ""); -} - - -void KWalletD::timedOut(int id) { - KWallet::Backend *w = _wallets.find(id); - if (w) { - closeWallet(w, id, true); - } -} - - -void KWalletD::closeAllWallets() { - TQIntDict tw = _wallets; - - for (TQIntDictIterator it(tw); it.current(); ++it) { - closeWallet(it.current(), it.currentKey(), true); - } - - tw.clear(); - - // All of this should be basically noop. Let's just be safe. - _wallets.clear(); - - for (TQMap::Iterator it = _passwords.begin(); - it != _passwords.end(); - ++it) { - it.data().fill(0); - } - _passwords.clear(); -} - - -TQString KWalletD::networkWallet() { - return KWallet::Wallet::NetworkWallet(); -} - - -TQString KWalletD::localWallet() { - return KWallet::Wallet::LocalWallet(); -} - - -#include "kwalletd.moc" diff --git a/kio/misc/kwalletd/kwalletd.desktop b/kio/misc/kwalletd/kwalletd.desktop deleted file mode 100644 index 7f07fd079..000000000 --- a/kio/misc/kwalletd/kwalletd.desktop +++ /dev/null @@ -1,151 +0,0 @@ -[Desktop Entry] -Type=Service -ServiceTypes=KDEDModule -X-TDE-ModuleType=Library -X-TDE-Library=kwalletd -X-TDE-FactoryName=kwalletd -X-TDE-Kded-autoload=false -X-TDE-Kded-load-on-demand=true -Name=KWallet Daemon Module -Name[af]=KBeursie Bediener Module -Name[ar]=مراقب وحدة KWallet -Name[az]=KWallet Demon Modulu -Name[be]=Модуль сервіса KWallet -Name[bg]=Демон Портфейл -Name[bn]=কে-ওয়ালেট ডিমন মডিউল -Name[br]=Mollad an diaoul KWallet -Name[ca]=Mòdul del dimoni KWallet -Name[cs]=Modul démona KWallet -Name[csb]=Pòrtfel -Name[cy]=Modiwl Daemon KWaled -Name[da]=KWallet Dæmonmodul -Name[de]=Digitale Brieftasche -Name[el]=Άρθρωμα δαίμονα KWallet -Name[eo]=Sekreteja demono-modulo -Name[es]=Módulo de demonio KWallet -Name[et]=KWalleti deemoni moodul -Name[eu]=KWallet daemon modulua -Name[fa]=پیمانه شبح KWallet -Name[fi]=KWallet-palvelinmoduuli -Name[fr]=Module démon KWallet -Name[ga]=Modúl Deamhain KWallet -Name[gl]=Módulo do Demo KWallet -Name[he]=מודול תהליך הרקע של KWallet -Name[hi]=केवैलट डेमन मॉड्यूल -Name[hr]=Modul KWallet demona -Name[hu]=KWallet szolgáltatás -Name[id]=Modul Daemon KWallet -Name[is]=KWallet þjónseining -Name[it]=Modulo demone KWallet -Name[ja]=KWallet デーモンモジュール -Name[ka]=KWallet გუშაგის მოდული -Name[kk]=KWallet әмиян қызметтің модулі -Name[km]=ម៉ូឌុល Daemon KWallet -Name[ko]=K지갑 데몬 모듈 -Name[lb]=KWallet-Dämonmodul -Name[lt]=TDE slaptažodinių tarnybos modulis -Name[lv]=KWallet Dēmona Modulis -Name[mn]=KWallet Daemon Модул -Name[ms]=Modul Daemon KWallet -Name[nb]=KWallet nisseprogramtillegg -Name[nds]=KWallet-Dämoon -Name[ne]=KWallet डेइमन मोड्युल -Name[nl]=KWallet daemon-module -Name[nn]=KWallet-nissemodul -Name[pa]=KWallet ਪੇਸ਼ਕਾਰੀ ਮੈਡੀਊਲ -Name[pl]=Portfel -Name[pt]=Módulo do Servidor do KWallet -Name[pt_BR]=Módulo do Serviço do KWallet -Name[ro]=Modul demon KWallet -Name[ru]=Служба бумажника -Name[rw]=Igice Dayimoni KUruhago -Name[se]=KWallet-bálvámoduvla -Name[sk]=Modul démona KWallet -Name[sl]=Modul demona KListnica -Name[sq]=Demoni për Modulin KWallet -Name[sr]=KWallet демон модул -Name[sr@Latn]=KWallet demon modul -Name[sv]=Kwallet-demonmodul -Name[ta]=KWallet டெமான் பகுதி -Name[te]=కెవాలెట్ సూత్రధారి మాడ్యూల్ -Name[tg]=Модули Демон KWallet -Name[th]=โมดูลเดมอน KWallet -Name[tr]=KWallet Program Modülü -Name[tt]=KWallet Xezmäteneñ Modulı -Name[uk]=Модуль демону KWallet -Name[uz]=KWallet xizmatining moduli -Name[uz@cyrillic]=KWallet хизматининг модули -Name[vi]=Mô-đun trình nền KWallet -Name[zh_CN]=KWallet 守护进程模块 -Name[zh_HK]=KWAllet 伺服程式模組 -Name[zh_TW]=KWAllet 服務程式模組 -Comment=KWallet daemon module for KDED -Comment[af]=KBeursie bediener module vir KDED -Comment[be]=Модуль сервіса KWallet для KDED -Comment[bg]=Модул демон за системата Портфейл за KDED -Comment[bn]=KDED-র জন্য কে-ওয়ালেট ডিমন মডিউল -Comment[br]=Mollad an diaoul KWallet evit KDED -Comment[bs]=KWallet daemon modul za KDED -Comment[ca]=Mòdul del dimoni KWallet per a KDED -Comment[cs]=Modul démona KWallet pro KDED -Comment[csb]=Mòduł KWallet w KDED -Comment[da]=KWallet Dæmonmodul for KDED -Comment[de]=Unterstützung für die digitale Brieftasche "KWallet" -Comment[el]=Άρθρωμα δαίμονα KWallet για το KDED -Comment[eo]=Sekreteja demono-modulo por KDED -Comment[es]=Módulo de demonio KWallet para KDED -Comment[et]=KDED KWalleti deemoni moodul -Comment[eu]=KWallet daemon modulua KDEDrako -Comment[fa]=پیمانۀ شبح KWallet برای KDED -Comment[fi]=KWallet palvelinmoduuli KDED:lle -Comment[fr]=Module démon KWallet pour KDED -Comment[fy]=KWallet daemon module foar KDED -Comment[ga]=Modúl deamhain KWallet le haghaidh KDED -Comment[gl]=Demo de KWallet para KDED -Comment[he]=מודול תהליך רקע של KWallet עבור KDED -Comment[hi]=केडीईडी के लिए के-वॉलेट डेमन मॉड्यूल -Comment[hr]=KWallet demon modul za KDED -Comment[hu]=KWallet szolgáltatásmodul a KDED-hez -Comment[id]=Modul daemon KWallet untuk KDED -Comment[is]=KWallet þjónseining fyrir KDED -Comment[it]=Modulo demone KWallet per KDED -Comment[ja]=KDED 用の KWallet デーモンモジュール -Comment[ka]=KSSL მოდული TDE-სთვის -Comment[kk]=TDE KWallet әмиянін басқару қызметтің модулі -Comment[km]=ម៉ូឌុល daemon KWallet សម្រាប់ KDED -Comment[lb]=KWallet-Dämonmodul fir KDED -Comment[lt]=TDE slaptažodinių tarnybos modulis skirtas KDED -Comment[lv]=KWallet Dēmona Modulis priekš KDED -Comment[mk]=KWallet даемон модул за KDED -Comment[ms]=Modul Daemon KWallet untuk KDED -Comment[nb]=KWallet nissemodul for KDED -Comment[nds]=KWallet-Dämoonmoduul för KDED -Comment[ne]=KDED का लागि डेइमन मोड्युल KWallet -Comment[nl]=KWallet daemon-module voor KDED -Comment[nn]=KWallet-nissemodul for KDED -Comment[pa]=KDED ਲਈ KWallet ਪੇਸ਼ਕਾਰੀ ਮੈਡੀਊਲ -Comment[pl]=Moduł KWallet w KDED -Comment[pt]=Módulo servidor do KWallet para o KDED -Comment[pt_BR]=Módulo do serviço de carteira para o TDE -Comment[ro]=Modul demon KWallet pentru KDED -Comment[ru]=Управление бумажником TDE -Comment[rw]=Igice cya dayimoni KUruhago cya KDED -Comment[se]=KDED:a KWallet-bálvámoduvla -Comment[sk]=Modul démona KWallet pre KDED -Comment[sl]=Modul demona KListnica za KDED -Comment[sr]=KWallet демон модул за KDED -Comment[sr@Latn]=KWallet demon modul za KDED -Comment[sv]=Kwallet-demonmodul för KDED -Comment[ta]=KDEDக்கான KWallet Daemon தொகுதி -Comment[te]=కెడిఈడి కొరకు కెవాలెట్ సూత్రధారి మాడ్యూల్ -Comment[tg]=Модули Демон KWallet барои KDED -Comment[th]=โมดูลเดมอน KWallet สำหรับ KDED -Comment[tr]=KDED için KWallet program modülü -Comment[tt]=KDED öçen KWallet xezmäteneñ modulı -Comment[uk]=Модуль демону торбинок KWallet для KDED -Comment[uz]=KDED uchun KWallet xizmatining moduli -Comment[uz@cyrillic]=KDED учун KWallet хизматининг модули -Comment[vi]=Mô-đun trình nền KWallet cho KDED. -Comment[zh_CN]=KDED 的 KWallet 守护进程模块 -Comment[zh_HK]=KDED 的 KWallet 伺服程式模組 -Comment[zh_TW]=KDED 的 KWallet 服務程式模組 diff --git a/kio/misc/kwalletd/kwalletd.h b/kio/misc/kwalletd/kwalletd.h deleted file mode 100644 index 2aea371ba..000000000 --- a/kio/misc/kwalletd/kwalletd.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (c) 2002-2004 George Staikos - - 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 _KWALLETD_H_ -#define _KWALLETD_H_ - -#include -#include -#include -#include -#include -#include -#include "kwalletbackend.h" - -#include -#include - -class KDirWatch; -class KTimeout; - -// @Private -class KWalletTransaction; - -class KWalletD : public KDEDModule { - Q_OBJECT - K_DCOP - public: - KWalletD(const TQCString &name); - virtual ~KWalletD(); - - k_dcop: - // Is the wallet enabled? If not, all open() calls fail. - virtual bool isEnabled() const; - - // Open and unlock the wallet - virtual int open(const TQString& wallet, uint wId); - // Open and unlock the wallet - virtual int tryOpen(const TQString& wallet, const TQCString& passwd); - // Open and unlock the wallet with this path - - virtual int openPath(const TQString& path, uint wId); - - // Asynchronous open - must give the object to return the handle - // to. - virtual void openAsynchronous(const TQString& wallet, const TQCString& returnObject, uint wId); - - // Close and lock the wallet - // If force = true, will close it for all users. Behave. This - // can break applications, and is generally intended for use by - // the wallet manager app only. - virtual int close(const TQString& wallet, bool force); - virtual int close(int handle, bool force); - - // Save to disk but leave open - virtual ASYNC sync(int handle); - - // Physically deletes the wallet from disk. - virtual int deleteWallet(const TQString& wallet); - - // Returns true if the wallet is open - virtual bool isOpen(const TQString& wallet) const; - virtual bool isOpen(int handle); - - // List the users of this wallet - virtual TQStringList users(const TQString& wallet) const; - - // Change the password of this wallet - virtual void changePassword(const TQString& wallet, uint wId); - - // A list of all wallets - virtual TQStringList wallets() const; - - // A list of all folders in this wallet - virtual TQStringList folderList(int handle); - - // Does this wallet have this folder? - virtual bool hasFolder(int handle, const TQString& folder); - - // Create this folder - virtual bool createFolder(int handle, const TQString& folder); - - // Remove this folder - virtual bool removeFolder(int handle, const TQString& folder); - - // List of entries in this folder - virtual TQStringList entryList(int handle, const TQString& folder); - - // Read an entry. If the entry does not exist, it just - // returns an empty result. It is your responsibility to check - // hasEntry() first. - virtual TQByteArray readEntry(int handle, const TQString& folder, const TQString& key); - virtual TQByteArray readMap(int handle, const TQString& folder, const TQString& key); - virtual TQString readPassword(int handle, const TQString& folder, const TQString& key); - virtual TQMap readEntryList(int handle, const TQString& folder, const TQString& key); - virtual TQMap readMapList(int handle, const TQString& folder, const TQString& key); - virtual TQMap readPasswordList(int handle, const TQString& folder, const TQString& key); - - // Rename an entry. rc=0 on success. - virtual int renameEntry(int handle, const TQString& folder, const TQString& oldName, const TQString& newName); - - // Write an entry. rc=0 on success. - virtual int writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value, int entryType); - virtual int writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value); - virtual int writeMap(int handle, const TQString& folder, const TQString& key, const TQByteArray& value); - virtual int writePassword(int handle, const TQString& folder, const TQString& key, const TQString& value); - - // Does the entry exist? - virtual bool hasEntry(int handle, const TQString& folder, const TQString& key); - - // What type is the entry? - virtual int entryType(int handle, const TQString& folder, const TQString& key); - - // Remove an entry. rc=0 on success. - virtual int removeEntry(int handle, const TQString& folder, const TQString& key); - - // Disconnect an app from a wallet - virtual bool disconnectApplication(const TQString& wallet, const TQCString& application); - - virtual void reconfigure(); - - // Determine - virtual bool folderDoesNotExist(const TQString& wallet, const TQString& folder); - virtual bool keyDoesNotExist(const TQString& wallet, const TQString& folder, const TQString& key); - - virtual void closeAllWallets(); - - virtual TQString networkWallet(); - - virtual TQString localWallet(); - - private slots: - void slotAppUnregistered(const TQCString& app); - void emitWalletListDirty(); - void timedOut(int); - void notifyFailures(); - void processTransactions(); - - private: - int internalOpen(const TQCString& appid, const TQString& wallet, bool isPath = false, WId w = 0, bool modal = false); - bool isAuthorizedApp(const TQCString& appid, const TQString& wallet, WId w); - // This also validates the handle. May return NULL. - KWallet::Backend* getWallet(const TQCString& appid, int handle); - // Generate a new unique handle. - int generateHandle(); - // Invalidate a handle (remove it from the TQMap) - void invalidateHandle(int handle); - // Emit signals about closing wallets - void doCloseSignals(int,const TQString&); - void emitFolderUpdated(const TQString&, const TQString&); - // Internal - close this wallet. - int closeWallet(KWallet::Backend *w, int handle, bool force); - // Implicitly allow access for this application - bool implicitAllow(const TQString& wallet, const TQCString& app); - bool implicitDeny(const TQString& wallet, const TQCString& app); - TQCString friendlyDCOPPeerName(); - - void doTransactionChangePassword(const TQCString& appid, const TQString& wallet, uint wId); - int doTransactionOpen(const TQCString& appid, const TQString& wallet, uint wId, bool modal); - - void setupDialog( TQWidget* dialog, WId wId, const TQCString& appid, bool modal ); - void checkActiveDialog(); - - TQIntDict _wallets; - TQMap > _handles; - TQMap _passwords; - KDirWatch *_dw; - int _failed; - - bool _leaveOpen, _closeIdle, _launchManager, _enabled; - bool _openPrompt, _firstUse, _showingFailureNotify; - int _idleTime; - TQMap _implicitAllowMap, _implicitDenyMap; - KTimeout *_timeouts; - TQTimer _tryOpenBlocked; - - TQPtrList _transactions; - TQGuardedPtr< TQWidget > activeDialog; -}; - - -#endif diff --git a/kio/misc/kwalletd/kwalletwizard.ui b/kio/misc/kwalletd/kwalletwizard.ui deleted file mode 100644 index b79853549..000000000 --- a/kio/misc/kwalletd/kwalletwizard.ui +++ /dev/null @@ -1,545 +0,0 @@ - -KWalletWizard - - - KWalletWizard - - - - 0 - 0 - 556 - 385 - - - - KDE Wallet Wizard - - - - page1 - - - Introduction - - - - unnamed - - - - spacer3 - - - Vertical - - - Expanding - - - - 21 - 21 - - - - - - textLabel1 - - - - 20 - - - - <u>KWallet</u> - The KDE Wallet System - - - RichText - - - WordBreak|AlignCenter - - - - - textLabel2 - - - - 5 - 5 - 0 - 2 - - - - 26 - - - Welcome to KWallet, the KDE Wallet System. KWallet allows you to store your passwords and other personal information on disk in an encrypted file, preventing others from viewing the information. This wizard will tell you about KWallet and help you configure it for the first time. - - - RichText - - - WordBreak|AlignVCenter - - - - - buttonGroup1 - - - NoFrame - - - - - - - unnamed - - - 0 - - - - _basic - - - &Basic setup (recommended) - - - true - - - - - _advanced - - - &Advanced setup - - - - - - - spacer2 - - - Horizontal - - - Expanding - - - - 140 - 21 - - - - - - spacer1 - - - Horizontal - - - Expanding - - - - 140 - 31 - - - - - - - - page4 - - - Information - - - - unnamed - - - - textLabel2_3 - - - 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. - - - RichText - - - - - - - page2 - - - Password Selection - - - - unnamed - - - - textLabel3 - - - 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 a password. The password you choose <i>cannot</i> be recovered if it is lost, and will allow anyone who knows it to obtain all the information contained in the wallet. - - - RichText - - - - - layout7 - - - - unnamed - - - - layout5 - - - - unnamed - - - - textLabel1_2 - - - false - - - Enter a new password: - - - AlignVCenter|AlignRight - - - _pass1 - - - - - textLabel2_2 - - - false - - - Verify password: - - - AlignVCenter|AlignRight - - - _pass2 - - - - - - - layout4 - - - - unnamed - - - - _pass1 - - - false - - - Password - - - - - _pass2 - - - false - - - Password - - - - - - - - - _useWallet - - - Yes, I wish to use the KDE wallet to store my personal information. - - - - - spacer5 - - - Vertical - - - Expanding - - - - 21 - 51 - - - - - - spacer6 - - - Horizontal - - - Expanding - - - - 101 - 21 - - - - - - spacer7 - - - Horizontal - - - Expanding - - - - 111 - 31 - - - - - - spacer4 - - - Vertical - - - Expanding - - - - 21 - 70 - - - - - - _matchLabel - - - - - - WordBreak|AlignVCenter|AlignRight - - - - - - - page3 - - - Security Level - - - - unnamed - - - - textLabel1_3 - - - The KDE Wallet system allows you to control the level of security of your personal data. Some of these settings do impact usability. While the default settings are generally acceptable for most users, you may wish to change some of them. You may further tune these settings from the KWallet control module. - - - RichText - - - WordBreak|AlignVCenter - - - - - spacer8 - - - Vertical - - - Expanding - - - - 21 - 121 - - - - - - _networkWallet - - - Store network passwords and local passwords in separate wallet files - - - - - _closeIdle - - - Automatically close idle wallets - - - - - spacer9 - - - Vertical - - - Expanding - - - - 21 - 51 - - - - - - - - - _useWallet - toggled(bool) - textLabel1_2 - setEnabled(bool) - - - _useWallet - toggled(bool) - textLabel2_2 - setEnabled(bool) - - - _useWallet - toggled(bool) - _pass1 - setEnabled(bool) - - - _useWallet - toggled(bool) - _pass2 - setEnabled(bool) - - - _useWallet - clicked() - _pass1 - setFocus() - - - _useWallet - clicked() - KWalletWizard - passwordPageUpdate() - - - _pass1 - textChanged(const TQString&) - KWalletWizard - passwordPageUpdate() - - - _pass2 - textChanged(const TQString&) - KWalletWizard - passwordPageUpdate() - - - _advanced - clicked() - KWalletWizard - setAdvanced() - - - _basic - clicked() - KWalletWizard - setBasic() - - - - _basic - _advanced - _useWallet - _pass1 - _pass2 - - - tqcheckbox.h - klocale.h - kwalletwizard.ui.h - - - passwordPageUpdate() - init() - setAdvanced() - setBasic() - destroy() - - - diff --git a/kio/misc/kwalletd/kwalletwizard.ui.h b/kio/misc/kwalletd/kwalletwizard.ui.h deleted file mode 100644 index a42635e9b..000000000 --- a/kio/misc/kwalletd/kwalletwizard.ui.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** ui.h extension file, included from the uic-generated form implementation. -** -** If you wish to add, delete or rename functions or slots use -** Qt Designer which will update this file, preserving your code. Create an -** init() function in place of a constructor, and a destroy() function in -** place of a destructor. -*****************************************************************************/ - -void KWalletWizard::passwordPageUpdate() -{ - bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); - if (_basic->isChecked()) { - setFinishEnabled(page2, fe); - } else { - setNextEnabled(page2, fe); - setFinishEnabled(page3, fe); - } - - if (_useWallet->isChecked()) { - if (_pass1->text() == _pass2->text()) { - if (_pass1->text().isEmpty()) { - _matchLabel->setText(i18n("Password is empty. (WARNING: Insecure)")); - } else { - _matchLabel->setText(i18n("Passwords match.")); - } - } else { - _matchLabel->setText(i18n("Passwords do not match.")); - } - } else { - _matchLabel->setText(TQString::null); - } - -} - - -void KWalletWizard::init() -{ - setHelpEnabled(page1, false); - setHelpEnabled(page2, false); - setHelpEnabled(page3, false); - setHelpEnabled(page4, false); - setAppropriate(page3, false); - setAppropriate(page4, false); - setFinishEnabled(page2, true); -} - - -void KWalletWizard::setAdvanced() -{ - setAppropriate(page3, true); - setAppropriate(page4, true); - bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); - setFinishEnabled(page2, false); - setNextEnabled(page2, fe); - setFinishEnabled(page3, fe); -} - - -void KWalletWizard::setBasic() -{ - setAppropriate(page3, false); - setAppropriate(page4, false); - bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); - setFinishEnabled(page3, false); - setFinishEnabled(page2, fe); -} - - -void KWalletWizard::destroy() -{ - _pass1->clear(); - _pass2->clear(); -} diff --git a/kio/misc/tdentlm/CMakeLists.txt b/kio/misc/tdentlm/CMakeLists.txt new file mode 100644 index 000000000..a846d1dcc --- /dev/null +++ b/kio/misc/tdentlm/CMakeLists.txt @@ -0,0 +1,43 @@ +################################################# +# +# (C) 2010 Serghei Amelian +# serghei (DOT) amelian (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include_directories( + ${TQT_INCLUDE_DIRS} + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/tdecore + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/tdecore +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + + +##### headers ################################### + +install(FILES tdentlm.h DESTINATION ${INCLUDE_INSTALL_DIR}/kio ) + + +##### tdentlm ################################### + +set( target tdentlm ) + +set( ${target}_SRCS + tdentlm.cpp des.cpp +) + +tde_add_library( ${target} SHARED + SOURCES ${${target}_SRCS} + VERSION 0.0.0 + LINK tdecore-shared + DESTINATION ${LIB_INSTALL_DIR} +) diff --git a/kio/misc/tdentlm/Makefile.am b/kio/misc/tdentlm/Makefile.am new file mode 100644 index 000000000..689d0921d --- /dev/null +++ b/kio/misc/tdentlm/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES=$(all_includes) + +lib_LTLIBRARIES = libtdentlm.la +METASOURCES = AUTO + +tdentlmincludedir = $(includedir)/kio +tdentlminclude_HEADERS = tdentlm.h + +libtdentlm_la_SOURCES = tdentlm.cpp des.cpp +libtdentlm_la_LDFLAGS = $(all_libraries) -version-info 0:0:0 -no-undefined +libtdentlm_la_LIBADD = $(LIB_TDECORE) $(LIB_QT) + diff --git a/kio/misc/tdentlm/des.cpp b/kio/misc/tdentlm/des.cpp new file mode 100644 index 000000000..bb4fab88b --- /dev/null +++ b/kio/misc/tdentlm/des.cpp @@ -0,0 +1,513 @@ + +/* Sofware DES functions + * written 12 Dec 1986 by Phil Karn, KA9Q; large sections adapted from + * the 1977 public-domain program by Jim Gillogly + * Modified for additional speed - 6 December 1988 Phil Karn + * Modified for parameterized key schedules - Jan 1991 Phil Karn + * Callers now allocate a key schedule as follows: + * kn = (char (*)[8])malloc(sizeof(char) * 8 * 16); + * or + * char kn[16][8]; + */ + +/* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos + * All modifications are placed under the license of libmcrypt. + */ + +/* $Id$ */ + +#include +#include +#include "des.h" + +static void permute_ip (unsigned char *inblock, DES_KEY * key, unsigned char *outblock); +static void permute_fp (unsigned char *inblock, DES_KEY * key, unsigned char *outblock); +static void perminit_ip (DES_KEY * key); +static void spinit (DES_KEY * key); +static void perminit_fp (DES_KEY * key); +static TQ_UINT32 f (DES_KEY * key, TQ_UINT32 r, char *subkey); + + +/* Tables defined in the Data Encryption Standard documents */ + +/* initial permutation IP */ +static const char ip[] = { + 58, 50, 42, 34, 26, 18, 10, 2, + 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6, + 64, 56, 48, 40, 32, 24, 16, 8, + 57, 49, 41, 33, 25, 17, 9, 1, + 59, 51, 43, 35, 27, 19, 11, 3, + 61, 53, 45, 37, 29, 21, 13, 5, + 63, 55, 47, 39, 31, 23, 15, 7 +}; + +/* final permutation IP^-1 */ +static const char fp[] = { + 40, 8, 48, 16, 56, 24, 64, 32, + 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, + 37, 5, 45, 13, 53, 21, 61, 29, + 36, 4, 44, 12, 52, 20, 60, 28, + 35, 3, 43, 11, 51, 19, 59, 27, + 34, 2, 42, 10, 50, 18, 58, 26, + 33, 1, 41, 9, 49, 17, 57, 25 +}; + +/* expansion operation matrix + * This is for reference only; it is unused in the code + * as the f() function performs it implicitly for speed + */ +#ifdef notdef +static const char ei[] = { + 32, 1, 2, 3, 4, 5, + 4, 5, 6, 7, 8, 9, + 8, 9, 10, 11, 12, 13, + 12, 13, 14, 15, 16, 17, + 16, 17, 18, 19, 20, 21, + 20, 21, 22, 23, 24, 25, + 24, 25, 26, 27, 28, 29, + 28, 29, 30, 31, 32, 1 +}; +#endif + +/* permuted choice table (key) */ +static const char pc1[] = { + 57, 49, 41, 33, 25, 17, 9, + 1, 58, 50, 42, 34, 26, 18, + 10, 2, 59, 51, 43, 35, 27, + 19, 11, 3, 60, 52, 44, 36, + + 63, 55, 47, 39, 31, 23, 15, + 7, 62, 54, 46, 38, 30, 22, + 14, 6, 61, 53, 45, 37, 29, + 21, 13, 5, 28, 20, 12, 4 +}; + +/* number left rotations of pc1 */ +static const char totrot[] = { + 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 +}; + +/* permuted choice key (table) */ +static const char pc2[] = { + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 +}; + +/* The (in)famous S-boxes */ +static const char si[8][64] = { + /* S1 */ + {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, + 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, + 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, + 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, + + /* S2 */ + {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, + 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, + 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, + 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, + + /* S3 */ + {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, + 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, + 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, + 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}, + + /* S4 */ + {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, + 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, + 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, + 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}, + + /* S5 */ + {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, + 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, + 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, + 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}, + + /* S6 */ + {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, + 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, + 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, + 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}, + + /* S7 */ + {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, + 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, + 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, + 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}, + + /* S8 */ + {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, + 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, + 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, + 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}, + +}; + +/* 32-bit permutation function P used on the output of the S-boxes */ +static const char p32i[] = { + 16, 7, 20, 21, + 29, 12, 28, 17, + 1, 15, 23, 26, + 5, 18, 31, 10, + 2, 8, 24, 14, + 32, 27, 3, 9, + 19, 13, 30, 6, + 22, 11, 4, 25 +}; + +/* End of DES-defined tables */ + +/* Lookup tables initialized once only at startup by desinit() */ + +/* bit 0 is left-most in byte */ +static const int bytebit[] = { + 0200, 0100, 040, 020, 010, 04, 02, 01 +}; + +static const int nibblebit[] = { + 010, 04, 02, 01 +}; + +/* Allocate space and initialize DES lookup arrays + * mode == 0: standard Data Encryption Algorithm + */ +static int +desinit (DES_KEY * key) +{ + + spinit (key); + perminit_ip (key); + perminit_fp (key); + + return 0; +} + + +/* Set key (initialize key schedule array) */ +int +ntlm_des_set_key (DES_KEY * dkey, char *user_key, int /*len*/) +{ + char pc1m[56]; /* place to modify pc1 into */ + char pcr[56]; /* place to rotate pc1 into */ + int i, j, l; + int m; + + memset(dkey, 0, sizeof (DES_KEY)); + desinit (dkey); + + /* Clear key schedule */ + + + for (j = 0; j < 56; j++) + { /* convert pc1 to bits of key */ + l = pc1[j] - 1; /* integer bit location */ + m = l & 07; /* find bit */ + pc1m[j] = (user_key[l >> 3] & /* find which key byte l is in */ + bytebit[m]) /* and which bit of that byte */ + ? 1 : 0; /* and store 1-bit result */ + + } + for (i = 0; i < 16; i++) + { /* key chunk for each iteration */ + for (j = 0; j < 56; j++) /* rotate pc1 the right amount */ + pcr[j] = pc1m[(l = j + totrot[i]) < (j < 28 ? 28 : 56) ? l : l - 28]; + /* rotate left and right halves independently */ + for (j = 0; j < 48; j++) + { /* select bits individually */ + /* check bit that goes to kn[j] */ + if (pcr[pc2[j] - 1]) + { + /* mask it in if it's there */ + l = j % 6; + dkey->kn[i][j / 6] |= bytebit[l] >> 2; + } + } + } + return 0; +} + +/* In-place encryption of 64-bit block */ +static void +ntlm_des_encrypt (DES_KEY * key, unsigned char *block) +{ + TQ_UINT32 left, right; + char *knp; + TQ_UINT32 work[2]; /* Working data storage */ + + permute_ip (block, key, (unsigned char *) work); /* Initial Permutation */ + left = KFromToBigEndian(work[0]); + right = KFromToBigEndian(work[1]); + + /* Do the 16 rounds. + * The rounds are numbered from 0 to 15. On even rounds + * the right half is fed to f() and the result exclusive-ORs + * the left half; on odd rounds the reverse is done. + */ + knp = &key->kn[0][0]; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + knp += 8; + left ^= f (key, right, knp); + knp += 8; + right ^= f (key, left, knp); + + /* Left/right half swap, plus byte swap if little-endian */ + work[1] = KFromToBigEndian( left ); + work[0] = KFromToBigEndian( right ); + + permute_fp ((unsigned char *) work, key, block); /* Inverse initial permutation */ +} + +/* Permute inblock with perm */ +static void +permute_ip (unsigned char *inblock, DES_KEY * key, unsigned char *outblock) +{ + unsigned char *ib, *ob; /* ptr to input or output block */ + char *p, *q; + int j; + + /* Clear output block */ + memset(outblock, 0, 8); + + ib = inblock; + for (j = 0; j < 16; j += 2, ib++) + { /* for each input nibble */ + ob = outblock; + p = key->iperm[j][(*ib >> 4) & 0xf]; + q = key->iperm[j + 1][*ib & 0xf]; + /* and each output byte, OR the masks together */ + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + } +} + +/* Permute inblock with perm */ +static void +permute_fp (unsigned char *inblock, DES_KEY * key, unsigned char *outblock) +{ + unsigned char *ib, *ob; /* ptr to input or output block */ + char *p, *q; + int j; + + /* Clear output block */ + memset(outblock, 0, 8); + + ib = inblock; + for (j = 0; j < 16; j += 2, ib++) + { /* for each input nibble */ + ob = outblock; + p = key->fperm[j][(*ib >> 4) & 0xf]; + q = key->fperm[j + 1][*ib & 0xf]; + /* and each output byte, OR the masks together */ + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + *ob++ |= *p++ | *q++; + } +} + +/* The nonlinear function f(r,k), the heart of DES */ +static TQ_UINT32 +f (DES_KEY * key, TQ_UINT32 r, char *subkey) +{ + TQ_UINT32 *spp; + TQ_UINT32 rval, rt; + int er; + +#ifdef TRACE + printf ("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ", + r, + subkey[0], subkey[1], subkey[2], + subkey[3], subkey[4], subkey[5], subkey[6], subkey[7]); +#endif + /* Run E(R) ^ K through the combined S & P boxes. + * This code takes advantage of a convenient regularity in + * E, namely that each group of 6 bits in E(R) feeding + * a single S-box is a contiguous segment of R. + */ + subkey += 7; + + /* Compute E(R) for each block of 6 bits, and run thru boxes */ + er = ((int) r << 1) | ((r & 0x80000000) ? 1 : 0); + spp = &key->sp[7][0]; + rval = spp[(er ^ *subkey--) & 0x3f]; + spp -= 64; + rt = (TQ_UINT32) r >> 3; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rval |= spp[((int) rt ^ *subkey--) & 0x3f]; + spp -= 64; + rt >>= 4; + rt |= (r & 1) << 5; + rval |= spp[((int) rt ^ *subkey) & 0x3f]; +#ifdef TRACE + printf (" %08lx\n", rval); +#endif + return rval; +} + +/* initialize a perm array */ +static void +perminit_ip (DES_KEY * key) +{ + int l, j, k; + int i, m; + + /* Clear the permutation array */ + memset(key->iperm, 0, 16 * 16 * 8); + + for (i = 0; i < 16; i++) /* each input nibble position */ + for (j = 0; j < 16; j++) /* each possible input nibble */ + for (k = 0; k < 64; k++) + { /* each output bit position */ + l = ip[k] - 1; /* where does this bit come from */ + if ((l >> 2) != i) /* does it come from input posn? */ + continue; /* if not, bit k is 0 */ + if (!(j & nibblebit[l & 3])) + continue; /* any such bit in input? */ + m = k & 07; /* which bit is this in the byte */ + key->iperm[i][j][k >> 3] |= bytebit[m]; + } +} + +static void +perminit_fp (DES_KEY * key) +{ + int l, j, k; + int i, m; + + /* Clear the permutation array */ + memset(key->fperm, 0, 16 * 16 * 8); + + for (i = 0; i < 16; i++) /* each input nibble position */ + for (j = 0; j < 16; j++) /* each possible input nibble */ + for (k = 0; k < 64; k++) + { /* each output bit position */ + l = fp[k] - 1; /* where does this bit come from */ + if ((l >> 2) != i) /* does it come from input posn? */ + continue; /* if not, bit k is 0 */ + if (!(j & nibblebit[l & 3])) + continue; /* any such bit in input? */ + m = k & 07; /* which bit is this in the byte */ + key->fperm[i][j][k >> 3] |= bytebit[m]; + } +} + +/* Initialize the lookup table for the combined S and P boxes */ +static void +spinit (DES_KEY * key) +{ + char pbox[32]; + int p, i, s, j, rowcol; + TQ_UINT32 val; + + /* Compute pbox, the inverse of p32i. + * This is easier to work with + */ + for (p = 0; p < 32; p++) + { + for (i = 0; i < 32; i++) + { + if (p32i[i] - 1 == p) + { + pbox[p] = i; + break; + } + } + } + for (s = 0; s < 8; s++) + { /* For each S-box */ + for (i = 0; i < 64; i++) + { /* For each possible input */ + val = 0; + /* The row number is formed from the first and last + * bits; the column number is from the middle 4 + */ + rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf); + for (j = 0; j < 4; j++) + { /* For each output bit */ + if (si[s][rowcol] & (8 >> j)) + { + val |= 1L << (31 - pbox[4 * s + j]); + } + } + key->sp[s][i] = val; + } + } +} + +int +ntlm_des_ecb_encrypt (const void *plaintext, int len, DES_KEY * akey, + unsigned char output[8]) +{ + int j; + const unsigned char *plain = (const unsigned char *) plaintext; + + for (j = 0; j < len / 8; j++) + { + memcpy (&output[j * 8], &plain[j * 8], 8); + ntlm_des_encrypt (akey, &output[j * 8]); + } + + if (j == 0 && len != 0) + return -1; /* no blocks were encrypted */ + return 0; +} diff --git a/kio/misc/tdentlm/des.h b/kio/misc/tdentlm/des.h new file mode 100644 index 000000000..0f6f59dc9 --- /dev/null +++ b/kio/misc/tdentlm/des.h @@ -0,0 +1,19 @@ +#ifndef KNTLM_DES_H +#define KNTLM_DES_H + +#include + +typedef struct des_key +{ + char kn[16][8]; + TQ_UINT32 sp[8][64]; + char iperm[16][16][8]; + char fperm[16][16][8]; +} DES_KEY; + +int +ntlm_des_ecb_encrypt (const void *plaintext, int len, DES_KEY * akey, unsigned char output[8]); +int +ntlm_des_set_key (DES_KEY * dkey, char *user_key, int len); + +#endif /* KNTLM_DES_H */ diff --git a/kio/misc/tdentlm/kswap.h b/kio/misc/tdentlm/kswap.h new file mode 100644 index 000000000..9eca243de --- /dev/null +++ b/kio/misc/tdentlm/kswap.h @@ -0,0 +1,428 @@ +/* + This file is part of the KDE libraries. + Copyright (c) 2004 Szombathelyi Gyrgy + + 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 KSWAP_H +#define KSWAP_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +/** + * \defgroup KSWAP Byte-swapping functions + * kswap.h contains functions that will help converting + * 16, 32 and 64 bit length data between little-endian and + * big-endian representations. + * + * The KSWAP_16, KSWAP_32 and KSWAP_64 functions are always + * swaps the byte order of the supplied argument (which should be + * 16, 32 or 64 bit wide). These functions are inline, and tries to + * use the most optimized function of the underlying system + * (bswap_xx functions from byteswap.h in GLIBC, or ntohs and ntohl + * on little-endian machines, and if neither are applicable, some fast + * custom code). + * + * The KFromTo{Little|Big}Endian functions are for converting big-endian and + * little-endian data to and from the machine endianness. + */ + +#ifdef HAVE_BYTESWAP_H +#include + + inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) { return bswap_16( b ); } + inline TQ_INT16 KSWAP_16( TQ_INT16 b ) { return bswap_16( (TQ_UINT16)b ); } + inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) { return bswap_32( b ); } + inline TQ_INT32 KSWAP_32( TQ_INT32 b ) { return bswap_32( (TQ_UINT32)b ); } + inline TQ_UINT64 KSWAP_64( TQ_UINT64 b ) { return bswap_64( b ); } + inline TQ_INT64 KSWAP_64( TQ_INT64 b ) { return bswap_64( (TQ_UINT64)b ); } + +#else /* HAVE_BYTESWAP_H */ +#ifdef WORDS_BIGENDIAN + inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) + { + return (((b) & 0x00ff) << 8 | ((b) & 0xff00) >> 8); + } + + inline TQ_INT16 KSWAP_16( TQ_INT16 b ) + { + return ((((TQ_UINT16)b) & 0x00ff) << 8 | (((TQ_UINT16)b) & 0xff00) >> 8); + } + + inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) + { + return + ((((b) & 0xff000000) >> 24) | (((b) & 0x00ff0000) >> 8) | \ + (((b) & 0x0000ff00) << 8) | (((b) & 0x000000ff) << 24)); + } + + inline TQ_INT32 KSWAP_32( TQ_INT32 b ) + { + return + (((((TQ_UINT32)b) & 0xff000000) >> 24) | ((((TQ_UINT32)b) & 0x00ff0000) >> 8) | \ + ((((TQ_UINT32)b) & 0x0000ff00) << 8) | ((((TQ_UINT32)b) & 0x000000ff) << 24)); + } +#else /* WORDS_BIGENDIAN */ +#include +#include + + inline TQ_UINT16 KSWAP_16( TQ_UINT16 b ) { return htons(b); } + inline TQ_INT16 KSWAP_16( TQ_INT16 b ) { return htons((TQ_UINT16)b); } + inline TQ_UINT32 KSWAP_32( TQ_UINT32 b ) { return htonl(b); } + inline TQ_INT32 KSWAP_32( TQ_INT32 b ) { return htonl((TQ_UINT32)b); } +#endif + inline TQ_UINT64 KSWAP_64( TQ_UINT64 b ) + { + union { + TQ_UINT64 ll; + TQ_UINT32 l[2]; + } w, r; + w.ll = b; + r.l[0] = KSWAP_32( w.l[1] ); + r.l[1] = KSWAP_32( w.l[0] ); + return r.ll; + } + + inline TQ_INT64 KSWAP_64( TQ_INT64 b ) + { + union { + TQ_UINT64 ll; + TQ_UINT32 l[2]; + } w, r; + w.ll = (TQ_UINT64) b; + r.l[0] = KSWAP_32( w.l[1] ); + r.l[1] = KSWAP_32( w.l[0] ); + return r.ll; + } +#endif /* !HAVE_BYTESWAP_H */ + +/** + * \ingroup KSWAP + * Converts a 16 bit unsigned value from/to big-endian byte order to/from the machine order. + */ +inline TQ_UINT16 KFromToBigEndian( TQ_UINT16 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_16(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit unsigned array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_UINT16 *out, TQ_UINT16 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<1 ) ; +#else + while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit unsigned value from/to big-endian byte order to/from the machine order. + */ +inline TQ_UINT32 KFromToBigEndian( TQ_UINT32 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_32(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit unsigned array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_UINT32 *out, TQ_UINT32 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<2 ) ; +#else + while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit unsigned value from/to big-endian byte order to/from the machine order. + */ +inline TQ_UINT64 KFromToBigEndian( TQ_UINT64 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_64(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit unsigned array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_UINT64 *out, TQ_UINT64 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<3 ) ; +#else + while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit signed value from/to big-endian byte order to/from the machine order. + */ +inline TQ_INT16 KFromToBigEndian( TQ_INT16 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_16(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit signed array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_INT16 *out, TQ_INT16 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<1 ) ; +#else + while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit signed value from/to big-endian byte order to/from the machine order. + */ +inline TQ_INT32 KFromToBigEndian( TQ_INT32 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_32(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit signed array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_INT32 *out, TQ_INT32 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<2 ) ; +#else + while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit signed value from/to big-endian byte order to/from the machine order. + */ +inline TQ_INT64 KFromToBigEndian( TQ_INT64 b ) +{ +#ifdef WORDS_BIGENDIAN + return b; +#else + return KSWAP_64(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit signed array from/to big-endian byte order to/from the machine order. + */ +inline void KFromToBigEndian( TQ_INT64 *out, TQ_INT64 *in, uint len ) +{ +#ifdef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<3 ) ; +#else + while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit unsigned value from/to little-endian byte order to/from the machine order. + */ +inline TQ_UINT16 KFromToLittleEndian( TQ_UINT16 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_16(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit unsigned array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_UINT16 *out, TQ_UINT16 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<1 ) ; +#else + while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit unsigned value from/to little-endian byte order to/from the machine order. + */ +inline TQ_UINT32 KFromToLittleEndian( TQ_UINT32 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_32(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit unsigned array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_UINT32 *out, TQ_UINT32 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<2 ) ; +#else + while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit unsigned value from/to little-endian byte order to/from the machine order. + */ +inline TQ_UINT64 KFromToLittleEndian( TQ_UINT64 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_64(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit unsigned array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_UINT64 *out, TQ_UINT64 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<3 ) ; +#else + while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit signed value from/to little-endian byte order to/from the machine order. + */ +inline TQ_INT16 KFromToLittleEndian( TQ_INT16 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_16(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 16 bit signed array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_INT16 *out, TQ_INT16 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<1 ) ; +#else + while ( len>0 ) { *out = KSWAP_16( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit signed value from/to little-endian byte order to/from the machine order. + */ +inline TQ_INT32 KFromToLittleEndian( TQ_INT32 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_32(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 32 bit signed array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_INT32 *out, TQ_INT32 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<2 ) ; +#else + while ( len>0 ) { *out = KSWAP_32( *in ); out++; in++; len--; } +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit signed value from/to little-endian byte order to/from the machine order. + */ +inline TQ_INT64 KFromToLittleEndian( TQ_INT64 b ) +{ +#ifndef WORDS_BIGENDIAN + return b; +#else + return KSWAP_64(b); +#endif +} + +/** + * \ingroup KSWAP + * Converts a 64 bit signed array from/to little-endian byte order to/from the machine order. + */ +inline void KFromToLittleEndian( TQ_INT64 *out, TQ_INT64 *in, uint len ) +{ +#ifndef WORDS_BIGENDIAN + if ( out != in ) memcpy( out, in, len<<3 ) ; +#else + while ( len>0 ) { *out = KSWAP_64( *in ); out++; in++; len--; } +#endif +} + +#endif /* KSWAP_H */ diff --git a/kio/misc/tdentlm/tdentlm.cpp b/kio/misc/tdentlm/tdentlm.cpp new file mode 100644 index 000000000..2ef5d1cb6 --- /dev/null +++ b/kio/misc/tdentlm/tdentlm.cpp @@ -0,0 +1,389 @@ +/* This file is part of the KDE libraries + Copyright (c) 2004 Szombathelyi Gy�gy + + The implementation is based on the documentation and sample code + at http://davenport.sourceforge.net/ntlm.html + The DES encryption functions are from libntlm + at http://josefsson.org/libntlm/ + + 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 "des.h" +#include "tdentlm.h" + +TQString KNTLM::getString( const TQByteArray &buf, const SecBuf &secbuf, bool unicode ) +{ + //watch for buffer overflows + TQ_UINT32 offset; + TQ_UINT16 len; + offset = KFromToLittleEndian((TQ_UINT32)secbuf.offset); + len = KFromToLittleEndian(secbuf.len); + if ( offset > buf.size() || + offset + len > buf.size() ) return TQString::null; + + TQString str; + const char *c = buf.data() + offset; + + if ( unicode ) { + str = UnicodeLE2TQString( (TQChar*) c, len >> 1 ); + } else { + str = TQString::fromLatin1( c, len ); + } + return str; +} + +TQByteArray KNTLM::getBuf( const TQByteArray &buf, const SecBuf &secbuf ) +{ + TQByteArray ret; + TQ_UINT32 offset; + TQ_UINT16 len; + offset = KFromToLittleEndian((TQ_UINT32)secbuf.offset); + len = KFromToLittleEndian(secbuf.len); + //watch for buffer overflows + if ( offset > buf.size() || + offset + len > buf.size() ) return ret; + ret.duplicate( buf.data() + offset, buf.size() ); + return ret; +} + +void KNTLM::addString( TQByteArray &buf, SecBuf &secbuf, const TQString &str, bool unicode ) +{ + TQByteArray tmp; + + if ( unicode ) { + tmp = QString2UnicodeLE( str ); + addBuf( buf, secbuf, tmp ); + } else { + const char *c; + c = str.latin1(); + tmp.setRawData( c, str.length() ); + addBuf( buf, secbuf, tmp ); + tmp.resetRawData( c, str.length() ); + } +} + +void KNTLM::addBuf( TQByteArray &buf, SecBuf &secbuf, TQByteArray &data ) +{ + TQ_UINT32 offset; + TQ_UINT16 len, maxlen; + offset = (buf.size() + 1) & 0xfffffffe; + len = data.size(); + maxlen = data.size(); + + secbuf.offset = KFromToLittleEndian((TQ_UINT32)offset); + secbuf.len = KFromToLittleEndian(len); + secbuf.maxlen = KFromToLittleEndian(maxlen); + buf.resize( offset + len ); + memcpy( buf.data() + offset, data.data(), data.size() ); +} + +bool KNTLM::getNegotiate( TQByteArray &negotiate, const TQString &domain, const TQString &workstation, TQ_UINT32 flags ) +{ + TQByteArray rbuf( sizeof(Negotiate) ); + + rbuf.fill( 0 ); + memcpy( rbuf.data(), "NTLMSSP", 8 ); + ((Negotiate*) rbuf.data())->msgType = KFromToLittleEndian( (TQ_UINT32)1 ); + if ( !domain.isEmpty() ) { + flags |= Negotiate_Domain_Supplied; + addString( rbuf, ((Negotiate*) rbuf.data())->domain, domain ); + } + if ( !workstation.isEmpty() ) { + flags |= Negotiate_WS_Supplied; + addString( rbuf, ((Negotiate*) rbuf.data())->domain, workstation ); + } + ((Negotiate*) rbuf.data())->flags = KFromToLittleEndian( flags ); + negotiate = rbuf; + return true; +} + +bool KNTLM::getAuth( TQByteArray &auth, const TQByteArray &challenge, const TQString &user, + const TQString &password, const TQString &domain, const TQString &workstation, + bool forceNTLM, bool forceNTLMv2 ) +{ + TQByteArray rbuf( sizeof(Auth) ); + Challenge *ch = (Challenge *) challenge.data(); + TQByteArray response; + uint chsize = challenge.size(); + bool unicode = false; + TQString dom; + + //challenge structure too small + if ( chsize < 32 ) return false; + + unicode = KFromToLittleEndian(ch->flags) & Negotiate_Unicode; + if ( domain.isEmpty() ) + dom = getString( challenge, ch->targetName, unicode ); + else + dom = domain; + + rbuf.fill( 0 ); + memcpy( rbuf.data(), "NTLMSSP", 8 ); + ((Auth*) rbuf.data())->msgType = KFromToLittleEndian( (TQ_UINT32)3 ); + ((Auth*) rbuf.data())->flags = ch->flags; + TQByteArray targetInfo = getBuf( challenge, ch->targetInfo ); + +// if ( forceNTLMv2 || (!targetInfo.isEmpty() && (KFromToLittleEndian(ch->flags) & Negotiate_Target_Info)) /* may support NTLMv2 */ ) { +// if ( KFromToLittleEndian(ch->flags) & Negotiate_NTLM ) { +// if ( targetInfo.isEmpty() ) return false; +// response = getNTLMv2Response( dom, user, password, targetInfo, ch->challengeData ); +// addBuf( rbuf, ((Auth*) rbuf.data())->ntResponse, response ); +// } else { +// if ( !forceNTLM ) { +// response = getLMv2Response( dom, user, password, ch->challengeData ); +// addBuf( rbuf, ((Auth*) rbuf.data())->lmResponse, response ); +// } else +// return false; +// } +// } else { //if no targetinfo structure and NTLMv2 or LMv2 not forced, try the older methods + + response = getNTLMResponse( password, ch->challengeData ); + addBuf( rbuf, ((Auth*) rbuf.data())->ntResponse, response ); + response = getLMResponse( password, ch->challengeData ); + addBuf( rbuf, ((Auth*) rbuf.data())->lmResponse, response ); +// } + if ( !dom.isEmpty() ) + addString( rbuf, ((Auth*) rbuf.data())->domain, dom, unicode ); + addString( rbuf, ((Auth*) rbuf.data())->user, user, unicode ); + if ( !workstation.isEmpty() ) + addString( rbuf, ((Auth*) rbuf.data())->workstation, workstation, unicode ); + + auth = rbuf; + + return true; +} + +TQByteArray KNTLM::getLMResponse( const TQString &password, const unsigned char *challenge ) +{ + TQByteArray hash, answer; + + hash = lmHash( password ); + hash.resize( 21 ); + memset( hash.data() + 16, 0, 5 ); + answer = lmResponse( hash, challenge ); + hash.fill( 0 ); + return answer; +} + +TQByteArray KNTLM::lmHash( const TQString &password ) +{ + TQByteArray keyBytes( 14 ); + TQByteArray hash( 16 ); + DES_KEY ks; + const char *magic = "KGS!@#$%"; + + keyBytes.fill( 0 ); + strncpy( keyBytes.data(), password.upper().latin1(), 14 ); + + convertKey( (unsigned char*) keyBytes.data(), &ks ); + ntlm_des_ecb_encrypt( magic, 8, &ks, (unsigned char*) hash.data() ); + + convertKey( (unsigned char*) keyBytes.data() + 7, &ks ); + ntlm_des_ecb_encrypt( magic, 8, &ks, (unsigned char*) hash.data() + 8 ); + + keyBytes.fill( 0 ); + memset( &ks, 0, sizeof (ks) ); + + return hash; +} + +TQByteArray KNTLM::lmResponse( const TQByteArray &hash, const unsigned char *challenge ) +{ + DES_KEY ks; + TQByteArray answer( 24 ); + + convertKey( (unsigned char*) hash.data(), &ks ); + ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() ); + + convertKey( (unsigned char*) hash.data() + 7, &ks ); + ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() + 8 ); + + convertKey( (unsigned char*) hash.data() + 14, &ks ); + ntlm_des_ecb_encrypt( challenge, 8, &ks, (unsigned char*) answer.data() + 16 ); + + memset( &ks, 0, sizeof (ks) ); + return answer; +} + +TQByteArray KNTLM::getNTLMResponse( const TQString &password, const unsigned char *challenge ) +{ + TQByteArray hash, answer; + + hash = ntlmHash( password ); + hash.resize( 21 ); + memset( hash.data() + 16, 0, 5 ); + answer = lmResponse( hash, challenge ); + hash.fill( 0 ); + return answer; +} + +TQByteArray KNTLM::ntlmHash( const TQString &password ) +{ + KMD4::Digest digest; + TQByteArray ret, unicode; + unicode = QString2UnicodeLE( password ); + + KMD4 md4( unicode ); + md4.rawDigest( digest ); + ret.duplicate( (const char*) digest, sizeof( digest ) ); + return ret; +} + +TQByteArray KNTLM::getNTLMv2Response( const TQString &target, const TQString &user, + const TQString &password, const TQByteArray &targetInformation, + const unsigned char *challenge ) +{ + TQByteArray hash = ntlmv2Hash( target, user, password ); + TQByteArray blob = createBlob( targetInformation ); + return lmv2Response( hash, blob, challenge ); +} + +TQByteArray KNTLM::getLMv2Response( const TQString &target, const TQString &user, + const TQString &password, const unsigned char *challenge ) +{ + TQByteArray hash = ntlmv2Hash( target, user, password ); + TQByteArray clientChallenge( 8 ); + for ( uint i = 0; i<8; i++ ) { + clientChallenge.data()[i] = TDEApplication::random() % 0xff; + } + return lmv2Response( hash, clientChallenge, challenge ); +} + +TQByteArray KNTLM::ntlmv2Hash( const TQString &target, const TQString &user, const TQString &password ) +{ + TQByteArray hash1 = ntlmHash( password ); + TQByteArray key, ret; + TQString id = user.upper() + target.upper(); + key = QString2UnicodeLE( id ); + ret = hmacMD5( key, hash1 ); + return ret; +} + +TQByteArray KNTLM::lmv2Response( const TQByteArray &hash, + const TQByteArray &clientData, const unsigned char *challenge ) +{ + TQByteArray data( 8 + clientData.size() ); + memcpy( data.data(), challenge, 8 ); + memcpy( data.data() + 8, clientData.data(), clientData.size() ); + TQByteArray mac = hmacMD5( data, hash ); + mac.resize( 16 + clientData.size() ); + memcpy( mac.data() + 16, clientData.data(), clientData.size() ); + return mac; +} + +TQByteArray KNTLM::createBlob( const TQByteArray &targetinfo ) +{ + TQByteArray blob( sizeof(Blob) + 4 + targetinfo.size() ); + blob.fill( 0 ); + + Blob *bl = (Blob *) blob.data(); + bl->signature = KFromToBigEndian( (TQ_UINT32) 0x01010000 ); + TQ_UINT64 now = TQDateTime::currentDateTime().toTime_t(); + now += (TQ_UINT64)3600*(TQ_UINT64)24*(TQ_UINT64)134774; + now *= (TQ_UINT64)10000000; + bl->timestamp = KFromToLittleEndian( now ); + for ( uint i = 0; i<8; i++ ) { + bl->challenge[i] = TDEApplication::random() % 0xff; + } + memcpy( blob.data() + sizeof(Blob), targetinfo.data(), targetinfo.size() ); + return blob; +} + +TQByteArray KNTLM::hmacMD5( const TQByteArray &data, const TQByteArray &key ) +{ + TQ_UINT8 ipad[64], opad[64]; + KMD5::Digest digest; + TQByteArray ret; + + memset( ipad, 0x36, sizeof(ipad) ); + memset( opad, 0x5c, sizeof(opad) ); + for ( int i = key.size()-1; i >= 0; i-- ) { + ipad[i] ^= key[i]; + opad[i] ^= key[i]; + } + + TQByteArray content( data.size()+64 ); + memcpy( content.data(), ipad, 64 ); + memcpy( content.data() + 64, data.data(), data.size() ); + KMD5 md5( content ); + md5.rawDigest( digest ); + content.resize( sizeof(digest) + 64 ); + memcpy( content.data(), opad, 64 ); + memcpy( content.data() + 64, digest, sizeof(digest) ); + md5.reset(); + md5.update( content ); + md5.rawDigest( digest ); + + ret.duplicate( (const char*) digest, sizeof( digest ) ); + return ret; +} + +/* +* turns a 56 bit key into the 64 bit, odd parity key and sets the key. +* The key schedule ks is also set. +*/ +void KNTLM::convertKey( unsigned char *key_56, void* ks ) +{ + unsigned char key[8]; + + key[0] = key_56[0]; + key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); + key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); + key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); + key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); + key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); + key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); + key[7] = (key_56[6] << 1) & 0xFF; + + for ( uint i=0; i<8; i++ ) { + unsigned char b = key[i]; + bool needsParity = (((b>>7) ^ (b>>6) ^ (b>>5) ^ (b>>4) ^ (b>>3) ^ (b>>2) ^ (b>>1)) & 0x01) == 0; + if ( needsParity ) + key[i] |= 0x01; + else + key[i] &= 0xfe; + } + + ntlm_des_set_key ( (DES_KEY*) ks, (char*) &key, sizeof (key)); + + memset (&key, 0, sizeof (key)); +} + +TQByteArray KNTLM::QString2UnicodeLE( const TQString &target ) +{ + TQByteArray unicode( target.length() * 2 ); + for ( uint i = 0; i < target.length(); i++ ) { + ((TQ_UINT16*)unicode.data())[ i ] = KFromToLittleEndian( target[i].unicode() ); + } + return unicode; +} + +TQString KNTLM::UnicodeLE2TQString( const TQChar* data, uint len ) +{ + TQString ret; + for ( uint i = 0; i < len; i++ ) { + ret += KFromToLittleEndian( data[ i ].unicode() ); + } + return ret; +} diff --git a/kio/misc/tdentlm/tdentlm.h b/kio/misc/tdentlm/tdentlm.h new file mode 100644 index 000000000..06b8febab --- /dev/null +++ b/kio/misc/tdentlm/tdentlm.h @@ -0,0 +1,233 @@ +/* + This file is part of the KDE libraries. + Copyright (c) 2004 Szombathelyi Gyrgy + + 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 KNTLM_H +#define KNTLM_H + +#include +#include +#include + +#include + +/** + * @short KNTLM class implements the NTLM authentication protocol. + * + * The KNTLM class is useful for creating the authentication structures which + * can be used for various servers which implements NTLM type authentication. + * A comprehensive description of the NTLM authentication protocol can be found + * at http://davenport.sourceforge.net/ntlm.html + * The class also contains methods to create the LanManager and NT (MD4) hashes + * of a password. + * This class doesn't maintain any state information, so all methods are static. + */ + +class TDEIO_EXPORT KNTLM { +public: + + enum Flags { + Negotiate_Unicode = 0x00000001, + Negotiate_OEM = 0x00000002, + Request_Target = 0x00000004, + Negotiate_Sign = 0x00000010, + Negotiate_Seal = 0x00000020, + Negotiate_Datagram_Style = 0x00000040, + Negotiate_LM_Key = 0x00000080, + Negotiate_Netware = 0x00000100, + Negotiate_NTLM = 0x00000200, + Negotiate_Domain_Supplied = 0x00001000, + Negotiate_WS_Supplied = 0x00002000, + Negotiate_Local_Call = 0x00004000, + Negotiate_Always_Sign = 0x00008000, + Target_Type_Domain = 0x00010000, + Target_Type_Server = 0x00020000, + Target_Type_Share = 0x00040000, + Negotiate_NTLM2_Key = 0x00080000, + Request_Init_Response = 0x00100000, + Request_Accept_Response = 0x00200000, + Request_NonNT_Key = 0x00400000, + Negotiate_Target_Info = 0x00800000, + Negotiate_128 = 0x20000000, + Negotiate_Key_Exchange = 0x40000000, + Negotiate_56 = 0x80000000 + }; + + typedef struct + { + TQ_UINT16 len; + TQ_UINT16 maxlen; + TQ_UINT32 offset; + } SecBuf; + + /** + * The NTLM Type 1 structure + */ + typedef struct + { + char signature[8]; /* "NTLMSSP\0" */ + TQ_UINT32 msgType; /* 1 */ + TQ_UINT32 flags; + SecBuf domain; + SecBuf workstation; + } Negotiate; + + /** + * The NTLM Type 2 structure + */ + typedef struct + { + char signature[8]; + TQ_UINT32 msgType; /* 2 */ + SecBuf targetName; + TQ_UINT32 flags; + TQ_UINT8 challengeData[8]; + TQ_UINT32 context[2]; + SecBuf targetInfo; + } Challenge; + + /** + * The NTLM Type 3 structure + */ + typedef struct + { + char signature[8]; + TQ_UINT32 msgType; /* 3 */ + SecBuf lmResponse; + SecBuf ntResponse; + SecBuf domain; + SecBuf user; + SecBuf workstation; + SecBuf sessionKey; + TQ_UINT32 flags; + } Auth; + + typedef struct + { + TQ_UINT32 signature; + TQ_UINT32 reserved; + TQ_UINT64 timestamp; + TQ_UINT8 challenge[8]; + TQ_UINT8 unknown[4]; + //Target info block - variable length + } Blob; + + /** + * Creates the initial message (type 1) which should be sent to the server. + * + * @param negotiate - a buffer where the Type 1 message will returned. + * @param domain - the domain name which should be send with the message. + * @param workstation - the workstation name which should be send with the message. + * @param flags - various flags, in most cases the defaults will good. + * + * @return true if creating the structure succeeds, false otherwise. + */ + static bool getNegotiate( TQByteArray &negotiate, const TQString &domain = TQString::null, + const TQString &workstation = TQString::null, + TQ_UINT32 flags = Negotiate_Unicode | Request_Target | Negotiate_NTLM ); + /** + * Creates the type 3 message which should be sent to the server after + * the challenge (type 2) received. + * + * @param auth - a buffer where the Type 3 message will returned. + * @param challenge - the Type 2 message returned by the server. + * @param user - user's name. + * @param password - user's password. + * @param domain - the target domain. If left empty, it will be extracted + * from the challenge. + * @param workstation - the user's workstation. + * @param forceNTLM - force the use of NTLM authentication (either v1 or v2). + * @param forceNTLMv2 - force the use of NTLMv2 or LMv2 authentication. If false, NTLMv2 + * support is autodetected from the challenge. + * + * @return true if auth filled with the Type 3 message, false if an error occured + * (challenge data invalid, or NTLM authentication forced, but the challenge data says + * no NTLM supported). + */ + static bool getAuth( TQByteArray &auth, const TQByteArray &challenge, const TQString &user, + const TQString &password, const TQString &domain = TQString::null, + const TQString &workstation = TQString::null, bool forceNTLM = false, bool forceNTLMv2 = false ); + + /** + * Returns the LanManager response from the password and the server challenge. + */ + static TQByteArray getLMResponse( const TQString &password, const unsigned char *challenge ); + /** + * Calculates the LanManager hash of the specified password. + */ + static TQByteArray lmHash( const TQString &password ); + /** + * Calculates the LanManager response from the LanManager hash and the server challenge. + */ + static TQByteArray lmResponse( const TQByteArray &hash, const unsigned char *challenge ); + + /** + * Returns the NTLM response from the password and the server challenge. + */ + static TQByteArray getNTLMResponse( const TQString &password, const unsigned char *challenge ); + /** + * Returns the NTLM hash (MD4) from the password. + */ + static TQByteArray ntlmHash( const TQString &password ); + + /** + * Calculates the NTLMv2 response. + */ + static TQByteArray getNTLMv2Response( const TQString &target, const TQString &user, + const TQString &password, const TQByteArray &targetInformation, + const unsigned char *challenge ); + + /** + * Calculates the LMv2 response. + */ + static TQByteArray getLMv2Response( const TQString &target, const TQString &user, + const TQString &password, const unsigned char *challenge ); + + /** + * Returns the NTLMv2 hash. + */ + static TQByteArray ntlmv2Hash( const TQString &target, const TQString &user, const TQString &password ); + + /** + * Calculates the LMv2 response. + */ + static TQByteArray lmv2Response( const TQByteArray &hash, + const TQByteArray &clientData, const unsigned char *challenge ); + + /** + * Extracts a string field from an NTLM structure. + */ + static TQString getString( const TQByteArray &buf, const SecBuf &secbuf, bool unicode ); + /** + * Extracts a byte array from an NTLM structure. + */ + static TQByteArray getBuf( const TQByteArray &buf, const SecBuf &secbuf ); + + static TQByteArray createBlob( const TQByteArray &targetinfo ); + + static TQByteArray hmacMD5( const TQByteArray &data, const TQByteArray &key ); +private: + static TQByteArray QString2UnicodeLE( const TQString &target ); + static TQString UnicodeLE2TQString( const TQChar* data, uint len ); + + static void addBuf( TQByteArray &buf, SecBuf &secbuf, TQByteArray &data ); + static void addString( TQByteArray &buf, SecBuf &secbuf, const TQString &str, bool unicode = false ); + static void convertKey( unsigned char *key_56, void* ks ); +}; + +#endif /* KNTLM_H */ diff --git a/kio/misc/tdewalletd/CMakeLists.txt b/kio/misc/tdewalletd/CMakeLists.txt new file mode 100644 index 000000000..4aaa332aa --- /dev/null +++ b/kio/misc/tdewalletd/CMakeLists.txt @@ -0,0 +1,49 @@ +################################################# +# +# (C) 2010 Serghei Amelian +# serghei (DOT) amelian (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include_directories( + ${TQT_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_BINARY_DIR}/tdecore + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/dcop + ${CMAKE_SOURCE_DIR}/tdecore + ${CMAKE_SOURCE_DIR}/tdeui + ${CMAKE_SOURCE_DIR}/tdewallet/client + ${CMAKE_SOURCE_DIR}/tdewallet/backend + ${CMAKE_SOURCE_DIR}/kio/kio +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + + +##### other data ################################ + +install(FILES tdewalletd.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kded ) + + +#### kded_tdewalletd ############################## + +set( target kded_tdewalletd ) + +set( ${target}_SRCS + tdewalletd.cpp tdewalletd.skel ktimeout.cpp tdewalletwizard.ui + kbetterthankdialogbase.ui +) + +tde_add_kpart( ${target} AUTOMOC + SOURCES ${${target}_SRCS} + LINK tdeinit_kded-shared tdewalletbackend-shared + DEPENDENCIES dcopidl + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/kio/misc/tdewalletd/Makefile.am b/kio/misc/tdewalletd/Makefile.am new file mode 100644 index 000000000..5d52fa810 --- /dev/null +++ b/kio/misc/tdewalletd/Makefile.am @@ -0,0 +1,35 @@ +# This file is part of the KDE libraries +# Copyright (C) 2002 George Staikos + +# 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. + +INCLUDES= -I$(srcdir)/.. -I$(top_srcdir) -I$(top_srcdir)/tdewallet/backend -I$(top_builddir)/tdewallet/backend -I$(top_srcdir)/tdewallet/client -I$(top_builddir)/tdewallet/client $(all_includes) + +kde_module_LTLIBRARIES = kded_tdewalletd.la + +kded_tdewalletd_la_LDFLAGS = $(all_libraries) -module -avoid-version +kded_tdewalletd_la_LIBADD = $(LIB_KIO) ../../../tdewallet/backend/libtdewalletbackend.la ../../../tdewallet/client/libtdewalletclient.la $(LIB_KDED) $(LIB_QT) $(top_builddir)/dcop/libDCOP.la $(LIB_TDECORE) $(LIB_TDEUI) +kded_tdewalletd_la_SOURCES = tdewalletd.cpp tdewalletd.skel ktimeout.cpp tdewalletwizard.ui kbetterthankdialogbase.ui + +METASOURCES = AUTO + +noinst_HEADERS = tdewalletd.h ktimeout.h tdewalletwizard.ui.h + +services_DATA = tdewalletd.desktop +servicesdir = $(kde_servicesdir)/kded + +tdewalletwizard.lo: tdewalletwizard.ui tdewalletwizard.ui.h +kbetterthankdialogbase.lo: kbetterthankdialogbase.ui kbetterthankdialogbase.ui.h diff --git a/kio/misc/tdewalletd/kbetterthankdialogbase.ui b/kio/misc/tdewalletd/kbetterthankdialogbase.ui new file mode 100644 index 000000000..a02d5def7 --- /dev/null +++ b/kio/misc/tdewalletd/kbetterthankdialogbase.ui @@ -0,0 +1,154 @@ + +KBetterThanKDialogBase + + + KBetterThanKDialogBase + + + + 0 + 0 + 479 + 109 + + + + + + + + unnamed + + + Fixed + + + + _label + + + + + spacer1 + + + Horizontal + + + Expanding + + + + 41 + 21 + + + + + + layout1 + + + + unnamed + + + + _allowOnce + + + Allow &Once + + + true + + + + + _allowAlways + + + Allow &Always + + + + + _deny + + + &Deny + + + + + _denyForever + + + Deny &Forever + + + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 61 + 21 + + + + + + + + + + _allowOnce + clicked() + KBetterThanKDialogBase + clicked() + + + _allowAlways + clicked() + KBetterThanKDialogBase + clicked() + + + _deny + clicked() + KBetterThanKDialogBase + clicked() + + + _denyForever + clicked() + KBetterThanKDialogBase + clicked() + + + + kactivelabel.h + kbetterthankdialogbase.ui.h + + + clicked() + setLabel( const TQString & label ) + init() + accept() + reject() + + + + kactivelabel.h + + diff --git a/kio/misc/tdewalletd/kbetterthankdialogbase.ui.h b/kio/misc/tdewalletd/kbetterthankdialogbase.ui.h new file mode 100644 index 000000000..2b3e16b0d --- /dev/null +++ b/kio/misc/tdewalletd/kbetterthankdialogbase.ui.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + + +void KBetterThanKDialogBase::clicked() +{ + if (sender() == _allowOnce) { + done(0); + } else if (sender() == _allowAlways) { + done(1); + } else if (sender() == _deny) { + done(2); + } else if (sender() == _denyForever) { + done(3); + } +} + + +void KBetterThanKDialogBase::setLabel( const TQString & label ) +{ + _label->setText(label); +} + + +void KBetterThanKDialogBase::init() +{ + _allowOnce->setFocus(); +} + + +void KBetterThanKDialogBase::accept() +{ + setResult(0); +} + + +void KBetterThanKDialogBase::reject() +{ + TQDialog::reject(); + setResult(2); +} diff --git a/kio/misc/tdewalletd/ktimeout.cpp b/kio/misc/tdewalletd/ktimeout.cpp new file mode 100644 index 000000000..c431ecf69 --- /dev/null +++ b/kio/misc/tdewalletd/ktimeout.cpp @@ -0,0 +1,84 @@ +/* + This file is part of the KDE libraries + + Copyright (c) 2003 George Staikos + + 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 "ktimeout.h" + +KTimeout::KTimeout(int size) +: TQObject(), _timers(size) { + _timers.setAutoDelete(true); +} + + +KTimeout::~KTimeout() { + clear(); +} + + +void KTimeout::clear() { + _timers.clear(); +} + + +void KTimeout::removeTimer(int id) { + TQTimer *t = _timers.find(id); + if (t != 0L) { + _timers.remove(id); // autodeletes + } +} + + +void KTimeout::addTimer(int id, int timeout) { + if (_timers.find(id) != 0L) { + return; + } + + TQTimer *t = new TQTimer; + connect(t, TQT_SIGNAL(timeout()), this, TQT_SLOT(timeout())); + t->start(timeout); + _timers.insert(id, t); +} + + +void KTimeout::resetTimer(int id, int timeout) { + TQTimer *t = _timers.find(id); + if (t) { + t->changeInterval(timeout); + } +} + + +void KTimeout::timeout() { + const TQTimer *t = static_cast(sender()); + if (t) { + TQIntDictIterator it(_timers); + for (; it.current(); ++it) { + if (it.current() == t) { + emit timedOut(it.currentKey()); + return; + } + } + } +} + + +#include "ktimeout.moc" + diff --git a/kio/misc/tdewalletd/ktimeout.h b/kio/misc/tdewalletd/ktimeout.h new file mode 100644 index 000000000..441e4ed77 --- /dev/null +++ b/kio/misc/tdewalletd/ktimeout.h @@ -0,0 +1,52 @@ +/* + This file is part of the KDE libraries + + Copyright (c) 2003 George Staikos + + 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 _KTIMEOUT_H_ +#define _KTIMEOUT_H_ + +#include +#include +#include + +// @internal +class KTimeout : public TQObject { + Q_OBJECT + public: + KTimeout(int size = 29); + virtual ~KTimeout(); + + signals: + void timedOut(int id); + + public slots: + void resetTimer(int id, int timeout); + void addTimer(int id, int timeout); + void removeTimer(int id); + void clear(); + + private slots: + void timeout(); + + private: + TQIntDict _timers; +}; + +#endif diff --git a/kio/misc/tdewalletd/tdewalletd.cpp b/kio/misc/tdewalletd/tdewalletd.cpp new file mode 100644 index 000000000..3f59f4e91 --- /dev/null +++ b/kio/misc/tdewalletd/tdewalletd.cpp @@ -0,0 +1,1514 @@ +/* + This file is part of the KDE libraries + + Copyright (c) 2002-2004 George Staikos + + 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 "kbetterthankdialogbase.h" +#include "tdewalletwizard.h" +#include "tdewalletd.h" +#include "ktimeout.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +extern "C" { + KDE_EXPORT KDEDModule *create_tdewalletd(const TQCString &name) { + return new KWalletD(name); + } +} + + +class KWalletTransaction { + public: + KWalletTransaction() { + tType = Unknown; + transaction = 0L; + client = 0L; + modal = false; + } + + ~KWalletTransaction() { + // Don't delete these! + transaction = 0L; + client = 0L; + } + + enum Type { Unknown, Open, ChangePassword, OpenFail }; + DCOPClient *client; + DCOPClientTransaction *transaction; + Type tType; + TQCString rawappid, returnObject; + TQCString appid; + uint wId; + TQString wallet; + bool modal; +}; + + +KWalletD::KWalletD(const TQCString &name) +: KDEDModule(name), _failed(0) { + srand(time(0)); + _showingFailureNotify = false; + _transactions.setAutoDelete(true); + _timeouts = new KTimeout(17); + _closeIdle = false; + _idleTime = 0; + connect(_timeouts, TQT_SIGNAL(timedOut(int)), this, TQT_SLOT(timedOut(int))); + reconfigure(); + TDEGlobal::dirs()->addResourceType("tdewallet", "share/apps/tdewallet"); + connect(TDEApplication::dcopClient(), + TQT_SIGNAL(applicationRemoved(const TQCString&)), + this, + TQT_SLOT(slotAppUnregistered(const TQCString&))); + _dw = new KDirWatch(this, "KWallet Directory Watcher"); + _dw->addDir(TDEGlobal::dirs()->saveLocation("tdewallet")); + _dw->startScan(true); + connect(_dw, TQT_SIGNAL(dirty(const TQString&)), this, TQT_SLOT(emitWalletListDirty())); +} + + +KWalletD::~KWalletD() { + delete _timeouts; + _timeouts = 0; + + closeAllWallets(); + _transactions.clear(); +} + + +int KWalletD::generateHandle() { + int rc; + + // ASSUMPTION: RAND_MAX is fairly large. + do { + rc = rand(); + } while (_wallets.find(rc) || rc == 0); + + return rc; +} + + +void KWalletD::processTransactions() { + static bool processing = false; + + if (processing) { + return; + } + + processing = true; + + // Process remaining transactions + KWalletTransaction *xact; + while (!_transactions.isEmpty()) { + xact = _transactions.first(); + TQCString replyType; + int res; + + assert(xact->tType != KWalletTransaction::Unknown); + + switch (xact->tType) { + case KWalletTransaction::Open: + res = doTransactionOpen(xact->appid, xact->wallet, xact->wId, xact->modal); + replyType = "int"; + if (!xact->returnObject.isEmpty()) { + DCOPRef(xact->rawappid, xact->returnObject).send("walletOpenResult", res); + } + + // multiple requests from the same client + // should not produce multiple password + // dialogs on a failure + if (res < 0) { + TQPtrListIterator it(_transactions); + KWalletTransaction *x; + while ((x = it.current()) && x != xact) { + ++it; + } + if (x) { + ++it; + } + while ((x = it.current())) { + if (xact->appid == x->appid && x->tType == KWalletTransaction::Open && x->wallet == xact->wallet && x->wId == xact->wId) { + x->tType = KWalletTransaction::OpenFail; + } + ++it; + } + } + break; + case KWalletTransaction::OpenFail: + res = -1; + replyType = "int"; + if (!xact->returnObject.isEmpty()) { + DCOPRef(xact->rawappid, xact->returnObject).send("walletOpenResult", res); + } + break; + case KWalletTransaction::ChangePassword: + doTransactionChangePassword(xact->appid, xact->wallet, xact->wId); + // fall through - no return + default: + _transactions.removeRef(xact); + continue; + } + + if (xact->returnObject.isEmpty() && xact->tType != KWalletTransaction::ChangePassword) { + TQByteArray replyData; + TQDataStream stream(replyData, IO_WriteOnly); + stream << res; + xact->client->endTransaction(xact->transaction, replyType, replyData); + } + _transactions.removeRef(xact); + } + + processing = false; +} + + +void KWalletD::openAsynchronous(const TQString& wallet, const TQCString& returnObject, uint wId) { + DCOPClient *dc = callingDcopClient(); + if (!dc) { + return; + } + + TQCString appid = dc->senderId(); + if (!_enabled || + !TQRegExp("^[A-Za-z0-9]+[A-Za-z0-9\\s\\-_]*$").exactMatch(wallet)) { + DCOPRef(appid, returnObject).send("walletOpenResult", -1); + return; + } + + TQCString peerName = friendlyDCOPPeerName(); + + KWalletTransaction *xact = new KWalletTransaction; + + xact->appid = peerName; + xact->rawappid = appid; + xact->client = callingDcopClient(); + xact->wallet = wallet; + xact->wId = wId; + xact->tType = KWalletTransaction::Open; + xact->returnObject = returnObject; + _transactions.append(xact); + + DCOPRef(appid, returnObject).send("walletOpenResult", 0); + + TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); + checkActiveDialog(); +} + + +int KWalletD::openPath(const TQString& path, uint wId) { + if (!_enabled) { // guard + return -1; + } + + // FIXME: setup transaction + int rc = internalOpen(friendlyDCOPPeerName(), path, true, wId); + return rc; +} + + +int KWalletD::open(const TQString& wallet, uint wId) { + if (!_enabled) { // guard + return -1; + } + + if (!TQRegExp("^[A-Za-z0-9]+[A-Za-z0-9\\s\\-_]*$").exactMatch(wallet)) { + return -1; + } + + TQCString appid = friendlyDCOPPeerName(); + + KWalletTransaction *xact = new KWalletTransaction; + _transactions.append(xact); + + xact->appid = appid; + xact->client = callingDcopClient(); + xact->transaction = xact->client->beginTransaction(); + xact->wallet = wallet; + xact->wId = wId; + xact->tType = KWalletTransaction::Open; + xact->modal = true; // mark dialogs as modal, the app has blocking wait + TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); + checkActiveDialog(); + return 0; // process later +} + + +// Sets up a dialog that will be shown by tdewallet. +void KWalletD::setupDialog( TQWidget* dialog, WId wId, const TQCString& appid, bool modal ) { + if( wId != 0 ) + KWin::setMainWindow( dialog, wId ); // correct, set dialog parent + else { + if( appid.isEmpty()) + kdWarning() << "Using tdewallet without parent window!" << endl; + else + kdWarning() << "Application '" << appid << "' using tdewallet without parent window!" << endl; + // allow dialog activation even if it interrupts, better than trying hacks + // with keeping the dialog on top or on all desktops + kapp->updateUserTimestamp(); + } + if( modal ) + KWin::setState( dialog->winId(), NET::Modal ); + else + KWin::clearState( dialog->winId(), NET::Modal ); + activeDialog = dialog; +} + +// If there's a dialog already open and another application tries some operation that'd lead to +// opening a dialog, that application will be blocked by this dialog. A proper solution would +// be to set the second application's window also as a parent for the active dialog, so that +// KWin properly handles focus changes and so on, but there's currently no support for multiple +// dialog parents. Hopefully to be done in KDE4, for now just use all kinds of bad hacks to make +// sure the user doesn't overlook the active dialog. +void KWalletD::checkActiveDialog() { + if( !activeDialog || !activeDialog->isShown()) + return; + kapp->updateUserTimestamp(); + KWin::setState( activeDialog->winId(), NET::KeepAbove ); + KWin::setOnAllDesktops( activeDialog->winId(), true ); + KWin::forceActiveWindow( activeDialog->winId()); +} + +int KWalletD::doTransactionOpen(const TQCString& appid, const TQString& wallet, uint wId, bool modal) { + if (_firstUse && !wallets().contains(KWallet::Wallet::LocalWallet())) { + // First use wizard + KWalletWizard *wiz = new KWalletWizard(0); + setupDialog( wiz, wId, appid, modal ); + int rc = wiz->exec(); + if (rc == TQDialog::Accepted) { + TDEConfig cfg("tdewalletrc"); + cfg.setGroup("Wallet"); + cfg.writeEntry("First Use", false); + cfg.writeEntry("Enabled", wiz->_useWallet->isChecked()); + cfg.writeEntry("Close When Idle", wiz->_closeIdle->isChecked()); + cfg.writeEntry("Use One Wallet", !wiz->_networkWallet->isChecked()); + cfg.sync(); + reconfigure(); + + if (!wiz->_useWallet->isChecked()) { + delete wiz; + return -1; + } + + // Create the wallet + KWallet::Backend *b = new KWallet::Backend(KWallet::Wallet::LocalWallet()); + TQByteArray p; + p.duplicate(wiz->_pass1->text().utf8(), wiz->_pass1->text().length()); + b->open(p); + b->createFolder(KWallet::Wallet::PasswordFolder()); + b->createFolder(KWallet::Wallet::FormDataFolder()); + b->close(p); + p.fill(0); + delete b; + delete wiz; + } else { + delete wiz; + return -1; + } + } else if (_firstUse) { + TDEConfig cfg("tdewalletrc"); + _firstUse = false; + cfg.setGroup("Wallet"); + cfg.writeEntry("First Use", false); + cfg.sync(); + } + + int rc = internalOpen(appid, wallet, false, wId, modal); + return rc; +} + +int KWalletD::tryOpen(const TQString& wallet, const TQCString& password) +{ + if (isOpen(wallet)) + return 0; + + if (_tryOpenBlocked.isActive()) { + kdDebug() << "tryOpen is active.." << endl; + return -1; + } + + if (!KWallet::Backend::exists(wallet)) + return -2; + + KWallet::Backend *b = new KWallet::Backend(wallet, false /*isPath*/); + int rc = b->open(TQByteArray().duplicate(password, strlen(password))); + if (rc == 0) { + _wallets.insert(rc = generateHandle(), b); + _passwords[wallet] = password; + b->ref(); + _tryOpenBlocked.stop(); + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << wallet; + emitDCOPSignal("walletOpened(TQString)", data); + } + else { + delete b; + // make sure that we're not bombed with a dictionary attack + _tryOpenBlocked.start (30 * 1000, true /*single shot*/); + if (++_failed > 5) { + _failed = 0; + TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); + } + + rc = -1; + } + return rc; +} + +int KWalletD::internalOpen(const TQCString& appid, const TQString& wallet, bool isPath, WId w, bool modal) { + int rc = -1; + bool brandNew = false; + + TQCString thisApp; + if (appid.isEmpty()) { + thisApp = "TDE System"; + } else { + thisApp = appid; + } + + if (implicitDeny(wallet, thisApp)) { + return -1; + } + + for (TQIntDictIterator i(_wallets); i.current(); ++i) { + if (i.current()->walletName() == wallet) { + rc = i.currentKey(); + break; + } + } + + if (rc == -1) { + if (_wallets.count() > 20) { + kdDebug() << "Too many wallets open." << endl; + return -1; + } + + KWallet::Backend *b = new KWallet::Backend(wallet, isPath); + KPasswordDialog *kpd = 0L; + bool emptyPass = false; + if ((isPath && TQFile::exists(wallet)) || (!isPath && KWallet::Backend::exists(wallet))) { + int pwless = b->open(TQByteArray()); + if (0 != pwless || !b->isOpen()) { + if (pwless == 0) { + // release, start anew + delete b; + b = new KWallet::Backend(wallet, isPath); + } + kpd = new KPasswordDialog(KPasswordDialog::Password, false, 0); + if (appid.isEmpty()) { + kpd->setPrompt(i18n("TDE has requested to open the wallet '%1'. Please enter the password for this wallet below.").arg(TQStyleSheet::escape(wallet))); + } else { + kpd->setPrompt(i18n("The application '%1' has requested to open the wallet '%2'. Please enter the password for this wallet below.").arg(TQStyleSheet::escape(appid)).arg(TQStyleSheet::escape(wallet))); + } + brandNew = false; + kpd->setButtonOK(KGuiItem(i18n("&Open"),"fileopen")); + } else { + emptyPass = true; + } + } else if (wallet == KWallet::Wallet::LocalWallet() || + wallet == KWallet::Wallet::NetworkWallet()) { + // Auto create these wallets. + kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); + if (appid.isEmpty()) { + kpd->setPrompt(i18n("TDE has requested to open the wallet. This is used to store sensitive data in a secure fashion. Please enter a password to use with this wallet or click cancel to deny the application's request.")); + } else { + kpd->setPrompt(i18n("The application '%1' has requested to open the TDE wallet. This is used to store sensitive data in a secure fashion. Please enter a password to use with this wallet or click cancel to deny the application's request.").arg(TQStyleSheet::escape(appid))); + } + brandNew = true; + kpd->setButtonOK(KGuiItem(i18n("&Open"),"fileopen")); + } else { + kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); + if (appid.length() == 0) { + kpd->setPrompt(i18n("TDE has requested to create a new wallet named '%1'. Please choose a password for this wallet, or cancel to deny the application's request.").arg(TQStyleSheet::escape(wallet))); + } else { + 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.").arg(TQStyleSheet::escape(appid)).arg(TQStyleSheet::escape(wallet))); + } + brandNew = true; + kpd->setButtonOK(KGuiItem(i18n("C&reate"),"filenew")); + } + + if (kpd) { + kpd->setCaption(i18n("TDE Wallet Service")); + kpd->setAllowEmptyPasswords(true); + } + + const char *p = 0L; + while (!b->isOpen()) { + assert(kpd); // kpd can't be null if isOpen() is false + setupDialog( kpd, w, appid, modal ); + if (kpd->exec() == KDialog::Accepted) { + p = kpd->password(); + int rc = b->open(TQByteArray().duplicate(p, strlen(p))); + if (!b->isOpen()) { + kpd->setPrompt(i18n("Error opening the wallet '%1'. Please try again.
(Error code %2: %3)").arg(TQStyleSheet::escape(wallet)).arg(rc).arg(KWallet::Backend::openRCToString(rc))); + kpd->clearPassword(); + } + } else { + break; + } + } + + if (!emptyPass && (!p || !b->isOpen())) { + delete b; + delete kpd; + return -1; + } + + if (emptyPass && _openPrompt && !isAuthorizedApp(appid, wallet, w)) { + delete b; + delete kpd; + return -1; + } + + _wallets.insert(rc = generateHandle(), b); + if (emptyPass) { + _passwords[wallet] = ""; + } else { + _passwords[wallet] = p; + } + _handles[appid].append(rc); + + delete kpd; // don't refactor this!! Argh I hate KPassDlg + + if (brandNew) { + createFolder(rc, KWallet::Wallet::PasswordFolder()); + createFolder(rc, KWallet::Wallet::FormDataFolder()); + } + + b->ref(); + if (_closeIdle && _timeouts) { + _timeouts->addTimer(rc, _idleTime); + } + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << wallet; + if (brandNew) { + emitDCOPSignal("walletCreated(TQString)", data); + } + emitDCOPSignal("walletOpened(TQString)", data); + if (_wallets.count() == 1 && _launchManager) { + TDEApplication::startServiceByDesktopName("tdewalletmanager-tdewalletd"); + } + } else { + if (!_handles[appid].contains(rc) && _openPrompt && !isAuthorizedApp(appid, wallet, w)) { + return -1; + } + _handles[appid].append(rc); + _wallets.find(rc)->ref(); + } + + return rc; +} + + +bool KWalletD::isAuthorizedApp(const TQCString& appid, const TQString& wallet, WId w) { + int response = 0; + + TQCString thisApp; + if (appid.isEmpty()) { + thisApp = "TDE System"; + } else { + thisApp = appid; + } + + if (!implicitAllow(wallet, thisApp)) { + KBetterThanKDialogBase *dialog = new KBetterThanKDialogBase; + if (appid.isEmpty()) { + dialog->setLabel(i18n("TDE has requested access to the open wallet '%1'.").arg(TQStyleSheet::escape(wallet))); + } else { + dialog->setLabel(i18n("The application '%1' has requested access to the open wallet '%2'.").arg(TQStyleSheet::escape(TQString(appid))).arg(TQStyleSheet::escape(wallet))); + } + setupDialog( dialog, w, appid, false ); + response = dialog->exec(); + delete dialog; + } + + if (response == 0 || response == 1) { + if (response == 1) { + TDEConfig cfg("tdewalletrc"); + cfg.setGroup("Auto Allow"); + TQStringList apps = cfg.readListEntry(wallet); + if (!apps.contains(thisApp)) { + apps += thisApp; + _implicitAllowMap[wallet] += thisApp; + cfg.writeEntry(wallet, apps); + cfg.sync(); + } + } + } else if (response == 3) { + TDEConfig cfg("tdewalletrc"); + cfg.setGroup("Auto Deny"); + TQStringList apps = cfg.readListEntry(wallet); + if (!apps.contains(thisApp)) { + apps += thisApp; + _implicitDenyMap[wallet] += thisApp; + cfg.writeEntry(wallet, apps); + cfg.sync(); + } + return false; + } else { + return false; + } + return true; +} + + +int KWalletD::deleteWallet(const TQString& wallet) { + TQString path = TDEGlobal::dirs()->saveLocation("tdewallet") + TQDir::separator() + wallet + ".kwl"; + + if (TQFile::exists(path)) { + close(wallet, true); + TQFile::remove(path); + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << wallet; + emitDCOPSignal("walletDeleted(TQString)", data); + return 0; + } + + return -1; +} + + +void KWalletD::changePassword(const TQString& wallet, uint wId) { + TQCString appid = friendlyDCOPPeerName(); + + KWalletTransaction *xact = new KWalletTransaction; + + xact->appid = appid; + xact->client = callingDcopClient(); + xact->wallet = wallet; + xact->wId = wId; + xact->tType = KWalletTransaction::ChangePassword; + + _transactions.append(xact); + + TQTimer::singleShot(0, this, TQT_SLOT(processTransactions())); + checkActiveDialog(); +} + + +void KWalletD::doTransactionChangePassword(const TQCString& appid, const TQString& wallet, uint wId) { + TQIntDictIterator it(_wallets); + KWallet::Backend *w = 0L; + int handle = -1; + bool reclose = false; + + for (; it.current(); ++it) { + if (it.current()->walletName() == wallet) { + break; + } + } + + if (!it.current()) { + handle = doTransactionOpen(appid, wallet, wId,false); + if (-1 == handle) { + KMessageBox::sorryWId(wId, i18n("Unable to open wallet. The wallet must be opened in order to change the password."), i18n("TDE Wallet Service")); + return; + } + + w = _wallets.find(handle); + reclose = true; + } else { + handle = it.currentKey(); + w = it.current(); + } + + assert(w); + + KPasswordDialog *kpd; + kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0); + kpd->setPrompt(i18n("Please choose a new password for the wallet '%1'.").arg(TQStyleSheet::escape(wallet))); + kpd->setCaption(i18n("TDE Wallet Service")); + kpd->setAllowEmptyPasswords(true); + setupDialog( kpd, wId, appid, false ); + if (kpd->exec() == KDialog::Accepted) { + const char *p = kpd->password(); + if (p) { + _passwords[wallet] = p; + TQByteArray pa; + pa.duplicate(p, strlen(p)); + int rc = w->close(pa); + if (rc < 0) { + KMessageBox::sorryWId(wId, i18n("Error re-encrypting the wallet. Password was not changed."), i18n("TDE Wallet Service")); + reclose = true; + } else { + rc = w->open(pa); + if (rc < 0) { + KMessageBox::sorryWId(wId, i18n("Error reopening the wallet. Data may be lost."), i18n("TDE Wallet Service")); + reclose = true; + } + } + } + } + + delete kpd; + + if (reclose) { + close(handle, true); + } +} + + +int KWalletD::close(const TQString& wallet, bool force) { + int handle = -1; + KWallet::Backend *w = 0L; + + for (TQIntDictIterator it(_wallets); + it.current(); + ++it) { + if (it.current()->walletName() == wallet) { + handle = it.currentKey(); + w = it.current(); + break; + } + } + + return closeWallet(w, handle, force); +} + + +int KWalletD::closeWallet(KWallet::Backend *w, int handle, bool force) { + if (w) { + const TQString& wallet = w->walletName(); + assert(_passwords.contains(wallet)); + if (w->refCount() == 0 || force) { + invalidateHandle(handle); + if (_closeIdle && _timeouts) { + _timeouts->removeTimer(handle); + } + _wallets.remove(handle); + if (_passwords.contains(wallet)) { + w->close(TQByteArray().duplicate(_passwords[wallet].data(), _passwords[wallet].length())); + _passwords[wallet].fill(0); + _passwords.remove(wallet); + } + doCloseSignals(handle, wallet); + delete w; + return 0; + } + return 1; + } + + return -1; +} + + +int KWalletD::close(int handle, bool force) { + TQCString appid = friendlyDCOPPeerName(); + KWallet::Backend *w = _wallets.find(handle); + bool contains = false; + + if (w) { // the handle is valid + if (_handles.contains(appid)) { // we know this app + if (_handles[appid].contains(handle)) { + // the app owns this handle + _handles[appid].remove(_handles[appid].find(handle)); + contains = true; + if (_handles[appid].isEmpty()) { + _handles.remove(appid); + } + } + } + + // watch the side effect of the deref() + if ((contains && w->deref() == 0 && !_leaveOpen) || force) { + if (_closeIdle && _timeouts) { + _timeouts->removeTimer(handle); + } + _wallets.remove(handle); + if (force) { + invalidateHandle(handle); + } + if (_passwords.contains(w->walletName())) { + w->close(TQByteArray().duplicate(_passwords[w->walletName()].data(), _passwords[w->walletName()].length())); + _passwords[w->walletName()].fill(0); + _passwords.remove(w->walletName()); + } + doCloseSignals(handle, w->walletName()); + delete w; + return 0; + } + return 1; // not closed + } + + return -1; // not open to begin with, or other error +} + + +bool KWalletD::isOpen(const TQString& wallet) const { + for (TQIntDictIterator it(_wallets); + it.current(); + ++it) { + if (it.current()->walletName() == wallet) { + return true; + } + } + return false; +} + + +bool KWalletD::isOpen(int handle) { + if (handle == 0) { + return false; + } + + KWallet::Backend *rc = _wallets.find(handle); + + if (rc == 0 && ++_failed > 5) { + _failed = 0; + TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); + } else if (rc != 0) { + _failed = 0; + } + + return rc != 0; +} + + +TQStringList KWalletD::wallets() const { + TQString path = TDEGlobal::dirs()->saveLocation("tdewallet"); + TQDir dir(path, "*.kwl"); + TQStringList rc; + + dir.setFilter(TQDir::Files | TQDir::NoSymLinks); + + const TQFileInfoList *list = dir.entryInfoList(); + TQFileInfoListIterator it(*list); + TQFileInfo *fi; + while ((fi = it.current()) != 0L) { + TQString fn = fi->fileName(); + if (fn.endsWith(".kwl")) { + fn.truncate(fn.length()-4); + } + rc += fn; + ++it; + } + return rc; +} + + +void KWalletD::sync(int handle) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + } +} + + +TQStringList KWalletD::folderList(int handle) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + return b->folderList(); + } + + return TQStringList(); +} + + +bool KWalletD::hasFolder(int handle, const TQString& f) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + return b->hasFolder(f); + } + + return false; +} + + +bool KWalletD::removeFolder(int handle, const TQString& f) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + bool rc = b->removeFolder(f); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << b->walletName(); + emitDCOPSignal("folderListUpdated(TQString)", data); + return rc; + } + + return false; +} + + +bool KWalletD::createFolder(int handle, const TQString& f) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + bool rc = b->createFolder(f); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << b->walletName(); + emitDCOPSignal("folderListUpdated(TQString)", data); + return rc; + } + + return false; +} + + +TQByteArray KWalletD::readMap(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry *e = b->readEntry(key); + if (e && e->type() == KWallet::Wallet::Map) { + return e->map(); + } + } + + return TQByteArray(); +} + + +TQMap KWalletD::readMapList(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + TQPtrList e = b->readEntryList(key); + TQMap rc; + TQPtrListIterator it(e); + KWallet::Entry *entry; + while ((entry = it.current())) { + if (entry->type() == KWallet::Wallet::Map) { + rc.insert(entry->key(), entry->map()); + } + ++it; + } + return rc; + } + + return TQMap(); +} + + +TQByteArray KWalletD::readEntry(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry *e = b->readEntry(key); + if (e) { + return e->value(); + } + } + + return TQByteArray(); +} + + +TQMap KWalletD::readEntryList(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + TQPtrList e = b->readEntryList(key); + TQMap rc; + TQPtrListIterator it(e); + KWallet::Entry *entry; + while ((entry = it.current())) { + rc.insert(entry->key(), entry->value()); + ++it; + } + return rc; + } + + return TQMap(); +} + + +TQStringList KWalletD::entryList(int handle, const TQString& folder) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + return b->entryList(); + } + + return TQStringList(); +} + + +TQString KWalletD::readPassword(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry *e = b->readEntry(key); + if (e && e->type() == KWallet::Wallet::Password) { + return e->password(); + } + } + + return TQString::null; +} + + +TQMap KWalletD::readPasswordList(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + TQPtrList e = b->readEntryList(key); + TQMap rc; + TQPtrListIterator it(e); + KWallet::Entry *entry; + while ((entry = it.current())) { + if (entry->type() == KWallet::Wallet::Password) { + rc.insert(entry->key(), entry->password()); + } + ++it; + } + return rc; + } + + return TQMap(); +} + + +int KWalletD::writeMap(int handle, const TQString& folder, const TQString& key, const TQByteArray& value) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry e; + e.setKey(key); + e.setValue(value); + e.setType(KWallet::Wallet::Map); + b->writeEntry(&e); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return 0; + } + + return -1; +} + + +int KWalletD::writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value, int entryType) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry e; + e.setKey(key); + e.setValue(value); + e.setType(KWallet::Wallet::EntryType(entryType)); + b->writeEntry(&e); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return 0; + } + + return -1; +} + + +int KWalletD::writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry e; + e.setKey(key); + e.setValue(value); + e.setType(KWallet::Wallet::Stream); + b->writeEntry(&e); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return 0; + } + + return -1; +} + + +int KWalletD::writePassword(int handle, const TQString& folder, const TQString& key, const TQString& value) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + KWallet::Entry e; + e.setKey(key); + e.setValue(value); + e.setType(KWallet::Wallet::Password); + b->writeEntry(&e); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return 0; + } + + return -1; +} + + +int KWalletD::entryType(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + if (!b->hasFolder(folder)) { + return KWallet::Wallet::Unknown; + } + b->setFolder(folder); + if (b->hasEntry(key)) { + return b->readEntry(key)->type(); + } + } + + return KWallet::Wallet::Unknown; +} + + +bool KWalletD::hasEntry(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + if (!b->hasFolder(folder)) { + return false; + } + b->setFolder(folder); + return b->hasEntry(key); + } + + return false; +} + + +int KWalletD::removeEntry(int handle, const TQString& folder, const TQString& key) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + if (!b->hasFolder(folder)) { + return 0; + } + b->setFolder(folder); + bool rc = b->removeEntry(key); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return rc ? 0 : -3; + } + + return -1; +} + + +void KWalletD::slotAppUnregistered(const TQCString& app) { + if (_handles.contains(app)) { + TQValueList l = _handles[app]; + for (TQValueList::Iterator i = l.begin(); i != l.end(); ++i) { + _handles[app].remove(*i); + KWallet::Backend *w = _wallets.find(*i); + if (w && !_leaveOpen && 0 == w->deref()) { + close(w->walletName(), true); + } + } + _handles.remove(app); + } +} + + +void KWalletD::invalidateHandle(int handle) { + for (TQMap >::Iterator i = _handles.begin(); + i != _handles.end(); + ++i) { + i.data().remove(handle); + } +} + + +KWallet::Backend *KWalletD::getWallet(const TQCString& appid, int handle) { + if (handle == 0) { + return 0L; + } + + KWallet::Backend *w = _wallets.find(handle); + + if (w) { // the handle is valid + if (_handles.contains(appid)) { // we know this app + if (_handles[appid].contains(handle)) { + // the app owns this handle + _failed = 0; + if (_closeIdle && _timeouts) { + _timeouts->resetTimer(handle, _idleTime); + } + return w; + } + } + } + + if (++_failed > 5) { + _failed = 0; + TQTimer::singleShot(0, this, TQT_SLOT(notifyFailures())); + } + + return 0L; +} + + +void KWalletD::notifyFailures() { + if (!_showingFailureNotify) { + _showingFailureNotify = true; + KMessageBox::information(0, i18n("There have been repeated failed attempts to gain access to a wallet. An application may be misbehaving."), i18n("TDE Wallet Service")); + _showingFailureNotify = false; + } +} + + +void KWalletD::doCloseSignals(int handle, const TQString& wallet) { + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << handle; + emitDCOPSignal("walletClosed(int)", data); + + TQByteArray data2; + TQDataStream ds2(data2, IO_WriteOnly); + ds2 << wallet; + emitDCOPSignal("walletClosed(TQString)", data2); + + if (_wallets.isEmpty()) { + emitDCOPSignal("allWalletsClosed()", TQByteArray()); + } +} + + +int KWalletD::renameEntry(int handle, const TQString& folder, const TQString& oldName, const TQString& newName) { + KWallet::Backend *b; + + if ((b = getWallet(friendlyDCOPPeerName(), handle))) { + b->setFolder(folder); + int rc = b->renameEntry(oldName, newName); + // write changes to disk immediately + TQByteArray p; + TQString wallet = b->walletName(); + p.duplicate(_passwords[wallet].data(), _passwords[wallet].length()); + b->sync(p); + p.fill(0); + emitFolderUpdated(b->walletName(), folder); + return rc; + } + + return -1; +} + + +TQStringList KWalletD::users(const TQString& wallet) const { + TQStringList rc; + + for (TQIntDictIterator it(_wallets); + it.current(); + ++it) { + if (it.current()->walletName() == wallet) { + for (TQMap >::ConstIterator hit = _handles.begin(); hit != _handles.end(); ++hit) { + if (hit.data().contains(it.currentKey())) { + rc += hit.key(); + } + } + break; + } + } + + return rc; +} + + +bool KWalletD::disconnectApplication(const TQString& wallet, const TQCString& application) { + for (TQIntDictIterator it(_wallets); + it.current(); + ++it) { + if (it.current()->walletName() == wallet) { + if (_handles[application].contains(it.currentKey())) { + _handles[application].remove(it.currentKey()); + + if (_handles[application].isEmpty()) { + _handles.remove(application); + } + + if (it.current()->deref() == 0) { + close(it.current()->walletName(), true); + } + + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << wallet; + ds << application; + emitDCOPSignal("applicationDisconnected(TQString,TQCString)", data); + + return true; + } + } + } + + return false; +} + + +void KWalletD::emitFolderUpdated(const TQString& wallet, const TQString& folder) { + TQByteArray data; + TQDataStream ds(data, IO_WriteOnly); + ds << wallet; + ds << folder; + emitDCOPSignal("folderUpdated(TQString,TQString)", data); +} + + +void KWalletD::emitWalletListDirty() { + emitDCOPSignal("walletListDirty()", TQByteArray()); +} + + +void KWalletD::reconfigure() { + TDEConfig cfg("tdewalletrc"); + cfg.setGroup("Wallet"); + _firstUse = cfg.readBoolEntry("First Use", true); + _enabled = cfg.readBoolEntry("Enabled", true); + _launchManager = cfg.readBoolEntry("Launch Manager", true); + _leaveOpen = cfg.readBoolEntry("Leave Open", false); + bool idleSave = _closeIdle; + _closeIdle = cfg.readBoolEntry("Close When Idle", false); + _openPrompt = cfg.readBoolEntry("Prompt on Open", true); + int timeSave = _idleTime; + // in minutes! + _idleTime = cfg.readNumEntry("Idle Timeout", 10) * 60 * 1000; + + if (cfg.readBoolEntry("Close on Screensaver", false)) { + connectDCOPSignal("kdesktop", "KScreensaverIface", "KDE_start_screensaver()", "closeAllWallets()", false); + } else { + disconnectDCOPSignal("kdesktop", "KScreensaverIface", "KDE_start_screensaver()", "closeAllWallets()"); + } + + // Handle idle changes + if (_closeIdle) { + if (_idleTime != timeSave) { // Timer length changed + TQIntDictIterator it(_wallets); + for (; it.current(); ++it) { + _timeouts->resetTimer(it.currentKey(), _idleTime); + } + } + + if (!idleSave) { // add timers for all the wallets + TQIntDictIterator it(_wallets); + for (; it.current(); ++it) { + _timeouts->addTimer(it.currentKey(), _idleTime); + } + } + } else { + _timeouts->clear(); + } + + // Update the implicit allow stuff + _implicitAllowMap.clear(); + cfg.setGroup("Auto Allow"); + TQStringList entries = cfg.entryMap("Auto Allow").keys(); + for (TQStringList::Iterator i = entries.begin(); i != entries.end(); ++i) { + _implicitAllowMap[*i] = cfg.readListEntry(*i); + } + + // Update the implicit allow stuff + _implicitDenyMap.clear(); + cfg.setGroup("Auto Deny"); + entries = cfg.entryMap("Auto Deny").keys(); + for (TQStringList::Iterator i = entries.begin(); i != entries.end(); ++i) { + _implicitDenyMap[*i] = cfg.readListEntry(*i); + } + + // Update if wallet was enabled/disabled + if (!_enabled) { // close all wallets + while (!_wallets.isEmpty()) { + TQIntDictIterator it(_wallets); + if (!it.current()) { // necessary? + break; + } + closeWallet(it.current(), it.currentKey(), true); + } + } +} + + +bool KWalletD::isEnabled() const { + return _enabled; +} + + +bool KWalletD::folderDoesNotExist(const TQString& wallet, const TQString& folder) { + if (!wallets().contains(wallet)) { + return true; + } + + for (TQIntDictIterator it(_wallets); it.current(); ++it) { + if (it.current()->walletName() == wallet) { + return it.current()->folderDoesNotExist(folder); + } + } + + KWallet::Backend *b = new KWallet::Backend(wallet); + b->open(TQByteArray()); + bool rc = b->folderDoesNotExist(folder); + delete b; + return rc; +} + + +bool KWalletD::keyDoesNotExist(const TQString& wallet, const TQString& folder, const TQString& key) { + if (!wallets().contains(wallet)) { + return true; + } + + for (TQIntDictIterator it(_wallets); it.current(); ++it) { + if (it.current()->walletName() == wallet) { + return it.current()->entryDoesNotExist(folder, key); + } + } + + KWallet::Backend *b = new KWallet::Backend(wallet); + b->open(TQByteArray()); + bool rc = b->entryDoesNotExist(folder, key); + delete b; + return rc; +} + + +bool KWalletD::implicitAllow(const TQString& wallet, const TQCString& app) { + return _implicitAllowMap[wallet].contains(TQString::fromLocal8Bit(app)); +} + + +bool KWalletD::implicitDeny(const TQString& wallet, const TQCString& app) { + return _implicitDenyMap[wallet].contains(TQString::fromLocal8Bit(app)); +} + + +TQCString KWalletD::friendlyDCOPPeerName() { + DCOPClient *dc = callingDcopClient(); + if (!dc) { + return ""; + } + return dc->senderId().replace(TQRegExp("-[0-9]+$"), ""); +} + + +void KWalletD::timedOut(int id) { + KWallet::Backend *w = _wallets.find(id); + if (w) { + closeWallet(w, id, true); + } +} + + +void KWalletD::closeAllWallets() { + TQIntDict tw = _wallets; + + for (TQIntDictIterator it(tw); it.current(); ++it) { + closeWallet(it.current(), it.currentKey(), true); + } + + tw.clear(); + + // All of this should be basically noop. Let's just be safe. + _wallets.clear(); + + for (TQMap::Iterator it = _passwords.begin(); + it != _passwords.end(); + ++it) { + it.data().fill(0); + } + _passwords.clear(); +} + + +TQString KWalletD::networkWallet() { + return KWallet::Wallet::NetworkWallet(); +} + + +TQString KWalletD::localWallet() { + return KWallet::Wallet::LocalWallet(); +} + + +#include "tdewalletd.moc" diff --git a/kio/misc/tdewalletd/tdewalletd.desktop b/kio/misc/tdewalletd/tdewalletd.desktop new file mode 100644 index 000000000..1e65fe0df --- /dev/null +++ b/kio/misc/tdewalletd/tdewalletd.desktop @@ -0,0 +1,151 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KDEDModule +X-TDE-ModuleType=Library +X-TDE-Library=tdewalletd +X-TDE-FactoryName=tdewalletd +X-TDE-Kded-autoload=false +X-TDE-Kded-load-on-demand=true +Name=KWallet Daemon Module +Name[af]=KBeursie Bediener Module +Name[ar]=مراقب وحدة KWallet +Name[az]=KWallet Demon Modulu +Name[be]=Модуль сервіса KWallet +Name[bg]=Демон Портфейл +Name[bn]=কে-ওয়ালেট ডিমন মডিউল +Name[br]=Mollad an diaoul KWallet +Name[ca]=Mòdul del dimoni KWallet +Name[cs]=Modul démona KWallet +Name[csb]=Pòrtfel +Name[cy]=Modiwl Daemon KWaled +Name[da]=KWallet Dæmonmodul +Name[de]=Digitale Brieftasche +Name[el]=Άρθρωμα δαίμονα KWallet +Name[eo]=Sekreteja demono-modulo +Name[es]=Módulo de demonio KWallet +Name[et]=KWalleti deemoni moodul +Name[eu]=KWallet daemon modulua +Name[fa]=پیمانه شبح KWallet +Name[fi]=KWallet-palvelinmoduuli +Name[fr]=Module démon KWallet +Name[ga]=Modúl Deamhain KWallet +Name[gl]=Módulo do Demo KWallet +Name[he]=מודול תהליך הרקע של KWallet +Name[hi]=केवैलट डेमन मॉड्यूल +Name[hr]=Modul KWallet demona +Name[hu]=KWallet szolgáltatás +Name[id]=Modul Daemon KWallet +Name[is]=KWallet þjónseining +Name[it]=Modulo demone KWallet +Name[ja]=KWallet デーモンモジュール +Name[ka]=KWallet გუშაგის მოდული +Name[kk]=KWallet әмиян қызметтің модулі +Name[km]=ម៉ូឌុល Daemon KWallet +Name[ko]=K지갑 데몬 모듈 +Name[lb]=KWallet-Dämonmodul +Name[lt]=TDE slaptažodinių tarnybos modulis +Name[lv]=KWallet Dēmona Modulis +Name[mn]=KWallet Daemon Модул +Name[ms]=Modul Daemon KWallet +Name[nb]=KWallet nisseprogramtillegg +Name[nds]=KWallet-Dämoon +Name[ne]=KWallet डेइमन मोड्युल +Name[nl]=KWallet daemon-module +Name[nn]=KWallet-nissemodul +Name[pa]=KWallet ਪੇਸ਼ਕਾਰੀ ਮੈਡੀਊਲ +Name[pl]=Portfel +Name[pt]=Módulo do Servidor do KWallet +Name[pt_BR]=Módulo do Serviço do KWallet +Name[ro]=Modul demon KWallet +Name[ru]=Служба бумажника +Name[rw]=Igice Dayimoni KUruhago +Name[se]=KWallet-bálvámoduvla +Name[sk]=Modul démona KWallet +Name[sl]=Modul demona KListnica +Name[sq]=Demoni për Modulin KWallet +Name[sr]=KWallet демон модул +Name[sr@Latn]=KWallet demon modul +Name[sv]=Kwallet-demonmodul +Name[ta]=KWallet டெமான் பகுதி +Name[te]=కెవాలెట్ సూత్రధారి మాడ్యూల్ +Name[tg]=Модули Демон KWallet +Name[th]=โมดูลเดมอน KWallet +Name[tr]=KWallet Program Modülü +Name[tt]=KWallet Xezmäteneñ Modulı +Name[uk]=Модуль демону KWallet +Name[uz]=KWallet xizmatining moduli +Name[uz@cyrillic]=KWallet хизматининг модули +Name[vi]=Mô-đun trình nền KWallet +Name[zh_CN]=KWallet 守护进程模块 +Name[zh_HK]=KWAllet 伺服程式模組 +Name[zh_TW]=KWAllet 服務程式模組 +Comment=KWallet daemon module for KDED +Comment[af]=KBeursie bediener module vir KDED +Comment[be]=Модуль сервіса KWallet для KDED +Comment[bg]=Модул демон за системата Портфейл за KDED +Comment[bn]=KDED-র জন্য কে-ওয়ালেট ডিমন মডিউল +Comment[br]=Mollad an diaoul KWallet evit KDED +Comment[bs]=KWallet daemon modul za KDED +Comment[ca]=Mòdul del dimoni KWallet per a KDED +Comment[cs]=Modul démona KWallet pro KDED +Comment[csb]=Mòduł KWallet w KDED +Comment[da]=KWallet Dæmonmodul for KDED +Comment[de]=Unterstützung für die digitale Brieftasche "KWallet" +Comment[el]=Άρθρωμα δαίμονα KWallet για το KDED +Comment[eo]=Sekreteja demono-modulo por KDED +Comment[es]=Módulo de demonio KWallet para KDED +Comment[et]=KDED KWalleti deemoni moodul +Comment[eu]=KWallet daemon modulua KDEDrako +Comment[fa]=پیمانۀ شبح KWallet برای KDED +Comment[fi]=KWallet palvelinmoduuli KDED:lle +Comment[fr]=Module démon KWallet pour KDED +Comment[fy]=KWallet daemon module foar KDED +Comment[ga]=Modúl deamhain KWallet le haghaidh KDED +Comment[gl]=Demo de KWallet para KDED +Comment[he]=מודול תהליך רקע של KWallet עבור KDED +Comment[hi]=केडीईडी के लिए के-वॉलेट डेमन मॉड्यूल +Comment[hr]=KWallet demon modul za KDED +Comment[hu]=KWallet szolgáltatásmodul a KDED-hez +Comment[id]=Modul daemon KWallet untuk KDED +Comment[is]=KWallet þjónseining fyrir KDED +Comment[it]=Modulo demone KWallet per KDED +Comment[ja]=KDED 用の KWallet デーモンモジュール +Comment[ka]=KSSL მოდული TDE-სთვის +Comment[kk]=TDE KWallet әмиянін басқару қызметтің модулі +Comment[km]=ម៉ូឌុល daemon KWallet សម្រាប់ KDED +Comment[lb]=KWallet-Dämonmodul fir KDED +Comment[lt]=TDE slaptažodinių tarnybos modulis skirtas KDED +Comment[lv]=KWallet Dēmona Modulis priekš KDED +Comment[mk]=KWallet даемон модул за KDED +Comment[ms]=Modul Daemon KWallet untuk KDED +Comment[nb]=KWallet nissemodul for KDED +Comment[nds]=KWallet-Dämoonmoduul för KDED +Comment[ne]=KDED का लागि डेइमन मोड्युल KWallet +Comment[nl]=KWallet daemon-module voor KDED +Comment[nn]=KWallet-nissemodul for KDED +Comment[pa]=KDED ਲਈ KWallet ਪੇਸ਼ਕਾਰੀ ਮੈਡੀਊਲ +Comment[pl]=Moduł KWallet w KDED +Comment[pt]=Módulo servidor do KWallet para o KDED +Comment[pt_BR]=Módulo do serviço de carteira para o TDE +Comment[ro]=Modul demon KWallet pentru KDED +Comment[ru]=Управление бумажником TDE +Comment[rw]=Igice cya dayimoni KUruhago cya KDED +Comment[se]=KDED:a KWallet-bálvámoduvla +Comment[sk]=Modul démona KWallet pre KDED +Comment[sl]=Modul demona KListnica za KDED +Comment[sr]=KWallet демон модул за KDED +Comment[sr@Latn]=KWallet demon modul za KDED +Comment[sv]=Kwallet-demonmodul för KDED +Comment[ta]=KDEDக்கான KWallet Daemon தொகுதி +Comment[te]=కెడిఈడి కొరకు కెవాలెట్ సూత్రధారి మాడ్యూల్ +Comment[tg]=Модули Демон KWallet барои KDED +Comment[th]=โมดูลเดมอน KWallet สำหรับ KDED +Comment[tr]=KDED için KWallet program modülü +Comment[tt]=KDED öçen KWallet xezmäteneñ modulı +Comment[uk]=Модуль демону торбинок KWallet для KDED +Comment[uz]=KDED uchun KWallet xizmatining moduli +Comment[uz@cyrillic]=KDED учун KWallet хизматининг модули +Comment[vi]=Mô-đun trình nền KWallet cho KDED. +Comment[zh_CN]=KDED 的 KWallet 守护进程模块 +Comment[zh_HK]=KDED 的 KWallet 伺服程式模組 +Comment[zh_TW]=KDED 的 KWallet 服務程式模組 diff --git a/kio/misc/tdewalletd/tdewalletd.h b/kio/misc/tdewalletd/tdewalletd.h new file mode 100644 index 000000000..b3a315413 --- /dev/null +++ b/kio/misc/tdewalletd/tdewalletd.h @@ -0,0 +1,199 @@ +/* + This file is part of the KDE libraries + + Copyright (c) 2002-2004 George Staikos + + 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 _KWALLETD_H_ +#define _KWALLETD_H_ + +#include +#include +#include +#include +#include +#include +#include "tdewalletbackend.h" + +#include +#include + +class KDirWatch; +class KTimeout; + +// @Private +class KWalletTransaction; + +class KWalletD : public KDEDModule { + Q_OBJECT + K_DCOP + public: + KWalletD(const TQCString &name); + virtual ~KWalletD(); + + k_dcop: + // Is the wallet enabled? If not, all open() calls fail. + virtual bool isEnabled() const; + + // Open and unlock the wallet + virtual int open(const TQString& wallet, uint wId); + // Open and unlock the wallet + virtual int tryOpen(const TQString& wallet, const TQCString& passwd); + // Open and unlock the wallet with this path + + virtual int openPath(const TQString& path, uint wId); + + // Asynchronous open - must give the object to return the handle + // to. + virtual void openAsynchronous(const TQString& wallet, const TQCString& returnObject, uint wId); + + // Close and lock the wallet + // If force = true, will close it for all users. Behave. This + // can break applications, and is generally intended for use by + // the wallet manager app only. + virtual int close(const TQString& wallet, bool force); + virtual int close(int handle, bool force); + + // Save to disk but leave open + virtual ASYNC sync(int handle); + + // Physically deletes the wallet from disk. + virtual int deleteWallet(const TQString& wallet); + + // Returns true if the wallet is open + virtual bool isOpen(const TQString& wallet) const; + virtual bool isOpen(int handle); + + // List the users of this wallet + virtual TQStringList users(const TQString& wallet) const; + + // Change the password of this wallet + virtual void changePassword(const TQString& wallet, uint wId); + + // A list of all wallets + virtual TQStringList wallets() const; + + // A list of all folders in this wallet + virtual TQStringList folderList(int handle); + + // Does this wallet have this folder? + virtual bool hasFolder(int handle, const TQString& folder); + + // Create this folder + virtual bool createFolder(int handle, const TQString& folder); + + // Remove this folder + virtual bool removeFolder(int handle, const TQString& folder); + + // List of entries in this folder + virtual TQStringList entryList(int handle, const TQString& folder); + + // Read an entry. If the entry does not exist, it just + // returns an empty result. It is your responsibility to check + // hasEntry() first. + virtual TQByteArray readEntry(int handle, const TQString& folder, const TQString& key); + virtual TQByteArray readMap(int handle, const TQString& folder, const TQString& key); + virtual TQString readPassword(int handle, const TQString& folder, const TQString& key); + virtual TQMap readEntryList(int handle, const TQString& folder, const TQString& key); + virtual TQMap readMapList(int handle, const TQString& folder, const TQString& key); + virtual TQMap readPasswordList(int handle, const TQString& folder, const TQString& key); + + // Rename an entry. rc=0 on success. + virtual int renameEntry(int handle, const TQString& folder, const TQString& oldName, const TQString& newName); + + // Write an entry. rc=0 on success. + virtual int writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value, int entryType); + virtual int writeEntry(int handle, const TQString& folder, const TQString& key, const TQByteArray& value); + virtual int writeMap(int handle, const TQString& folder, const TQString& key, const TQByteArray& value); + virtual int writePassword(int handle, const TQString& folder, const TQString& key, const TQString& value); + + // Does the entry exist? + virtual bool hasEntry(int handle, const TQString& folder, const TQString& key); + + // What type is the entry? + virtual int entryType(int handle, const TQString& folder, const TQString& key); + + // Remove an entry. rc=0 on success. + virtual int removeEntry(int handle, const TQString& folder, const TQString& key); + + // Disconnect an app from a wallet + virtual bool disconnectApplication(const TQString& wallet, const TQCString& application); + + virtual void reconfigure(); + + // Determine + virtual bool folderDoesNotExist(const TQString& wallet, const TQString& folder); + virtual bool keyDoesNotExist(const TQString& wallet, const TQString& folder, const TQString& key); + + virtual void closeAllWallets(); + + virtual TQString networkWallet(); + + virtual TQString localWallet(); + + private slots: + void slotAppUnregistered(const TQCString& app); + void emitWalletListDirty(); + void timedOut(int); + void notifyFailures(); + void processTransactions(); + + private: + int internalOpen(const TQCString& appid, const TQString& wallet, bool isPath = false, WId w = 0, bool modal = false); + bool isAuthorizedApp(const TQCString& appid, const TQString& wallet, WId w); + // This also validates the handle. May return NULL. + KWallet::Backend* getWallet(const TQCString& appid, int handle); + // Generate a new unique handle. + int generateHandle(); + // Invalidate a handle (remove it from the TQMap) + void invalidateHandle(int handle); + // Emit signals about closing wallets + void doCloseSignals(int,const TQString&); + void emitFolderUpdated(const TQString&, const TQString&); + // Internal - close this wallet. + int closeWallet(KWallet::Backend *w, int handle, bool force); + // Implicitly allow access for this application + bool implicitAllow(const TQString& wallet, const TQCString& app); + bool implicitDeny(const TQString& wallet, const TQCString& app); + TQCString friendlyDCOPPeerName(); + + void doTransactionChangePassword(const TQCString& appid, const TQString& wallet, uint wId); + int doTransactionOpen(const TQCString& appid, const TQString& wallet, uint wId, bool modal); + + void setupDialog( TQWidget* dialog, WId wId, const TQCString& appid, bool modal ); + void checkActiveDialog(); + + TQIntDict _wallets; + TQMap > _handles; + TQMap _passwords; + KDirWatch *_dw; + int _failed; + + bool _leaveOpen, _closeIdle, _launchManager, _enabled; + bool _openPrompt, _firstUse, _showingFailureNotify; + int _idleTime; + TQMap _implicitAllowMap, _implicitDenyMap; + KTimeout *_timeouts; + TQTimer _tryOpenBlocked; + + TQPtrList _transactions; + TQGuardedPtr< TQWidget > activeDialog; +}; + + +#endif diff --git a/kio/misc/tdewalletd/tdewalletwizard.ui b/kio/misc/tdewalletd/tdewalletwizard.ui new file mode 100644 index 000000000..aa3a1c09d --- /dev/null +++ b/kio/misc/tdewalletd/tdewalletwizard.ui @@ -0,0 +1,545 @@ + +KWalletWizard + + + KWalletWizard + + + + 0 + 0 + 556 + 385 + + + + KDE Wallet Wizard + + + + page1 + + + Introduction + + + + unnamed + + + + spacer3 + + + Vertical + + + Expanding + + + + 21 + 21 + + + + + + textLabel1 + + + + 20 + + + + <u>KWallet</u> - The KDE Wallet System + + + RichText + + + WordBreak|AlignCenter + + + + + textLabel2 + + + + 5 + 5 + 0 + 2 + + + + 26 + + + Welcome to KWallet, the KDE Wallet System. KWallet allows you to store your passwords and other personal information on disk in an encrypted file, preventing others from viewing the information. This wizard will tell you about KWallet and help you configure it for the first time. + + + RichText + + + WordBreak|AlignVCenter + + + + + buttonGroup1 + + + NoFrame + + + + + + + unnamed + + + 0 + + + + _basic + + + &Basic setup (recommended) + + + true + + + + + _advanced + + + &Advanced setup + + + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 140 + 21 + + + + + + spacer1 + + + Horizontal + + + Expanding + + + + 140 + 31 + + + + + + + + page4 + + + Information + + + + unnamed + + + + textLabel2_3 + + + 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. + + + RichText + + + + + + + page2 + + + Password Selection + + + + unnamed + + + + textLabel3 + + + 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 a password. The password you choose <i>cannot</i> be recovered if it is lost, and will allow anyone who knows it to obtain all the information contained in the wallet. + + + RichText + + + + + layout7 + + + + unnamed + + + + layout5 + + + + unnamed + + + + textLabel1_2 + + + false + + + Enter a new password: + + + AlignVCenter|AlignRight + + + _pass1 + + + + + textLabel2_2 + + + false + + + Verify password: + + + AlignVCenter|AlignRight + + + _pass2 + + + + + + + layout4 + + + + unnamed + + + + _pass1 + + + false + + + Password + + + + + _pass2 + + + false + + + Password + + + + + + + + + _useWallet + + + Yes, I wish to use the KDE wallet to store my personal information. + + + + + spacer5 + + + Vertical + + + Expanding + + + + 21 + 51 + + + + + + spacer6 + + + Horizontal + + + Expanding + + + + 101 + 21 + + + + + + spacer7 + + + Horizontal + + + Expanding + + + + 111 + 31 + + + + + + spacer4 + + + Vertical + + + Expanding + + + + 21 + 70 + + + + + + _matchLabel + + + + + + WordBreak|AlignVCenter|AlignRight + + + + + + + page3 + + + Security Level + + + + unnamed + + + + textLabel1_3 + + + The KDE Wallet system allows you to control the level of security of your personal data. Some of these settings do impact usability. While the default settings are generally acceptable for most users, you may wish to change some of them. You may further tune these settings from the KWallet control module. + + + RichText + + + WordBreak|AlignVCenter + + + + + spacer8 + + + Vertical + + + Expanding + + + + 21 + 121 + + + + + + _networkWallet + + + Store network passwords and local passwords in separate wallet files + + + + + _closeIdle + + + Automatically close idle wallets + + + + + spacer9 + + + Vertical + + + Expanding + + + + 21 + 51 + + + + + + + + + _useWallet + toggled(bool) + textLabel1_2 + setEnabled(bool) + + + _useWallet + toggled(bool) + textLabel2_2 + setEnabled(bool) + + + _useWallet + toggled(bool) + _pass1 + setEnabled(bool) + + + _useWallet + toggled(bool) + _pass2 + setEnabled(bool) + + + _useWallet + clicked() + _pass1 + setFocus() + + + _useWallet + clicked() + KWalletWizard + passwordPageUpdate() + + + _pass1 + textChanged(const TQString&) + KWalletWizard + passwordPageUpdate() + + + _pass2 + textChanged(const TQString&) + KWalletWizard + passwordPageUpdate() + + + _advanced + clicked() + KWalletWizard + setAdvanced() + + + _basic + clicked() + KWalletWizard + setBasic() + + + + _basic + _advanced + _useWallet + _pass1 + _pass2 + + + tqcheckbox.h + klocale.h + tdewalletwizard.ui.h + + + passwordPageUpdate() + init() + setAdvanced() + setBasic() + destroy() + + + diff --git a/kio/misc/tdewalletd/tdewalletwizard.ui.h b/kio/misc/tdewalletd/tdewalletwizard.ui.h new file mode 100644 index 000000000..a42635e9b --- /dev/null +++ b/kio/misc/tdewalletd/tdewalletwizard.ui.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + +void KWalletWizard::passwordPageUpdate() +{ + bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); + if (_basic->isChecked()) { + setFinishEnabled(page2, fe); + } else { + setNextEnabled(page2, fe); + setFinishEnabled(page3, fe); + } + + if (_useWallet->isChecked()) { + if (_pass1->text() == _pass2->text()) { + if (_pass1->text().isEmpty()) { + _matchLabel->setText(i18n("Password is empty. (WARNING: Insecure)")); + } else { + _matchLabel->setText(i18n("Passwords match.")); + } + } else { + _matchLabel->setText(i18n("Passwords do not match.")); + } + } else { + _matchLabel->setText(TQString::null); + } + +} + + +void KWalletWizard::init() +{ + setHelpEnabled(page1, false); + setHelpEnabled(page2, false); + setHelpEnabled(page3, false); + setHelpEnabled(page4, false); + setAppropriate(page3, false); + setAppropriate(page4, false); + setFinishEnabled(page2, true); +} + + +void KWalletWizard::setAdvanced() +{ + setAppropriate(page3, true); + setAppropriate(page4, true); + bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); + setFinishEnabled(page2, false); + setNextEnabled(page2, fe); + setFinishEnabled(page3, fe); +} + + +void KWalletWizard::setBasic() +{ + setAppropriate(page3, false); + setAppropriate(page4, false); + bool fe = !_useWallet->isChecked() || _pass1->text() == _pass2->text(); + setFinishEnabled(page3, false); + setFinishEnabled(page2, fe); +} + + +void KWalletWizard::destroy() +{ + _pass1->clear(); + _pass2->clear(); +} diff --git a/kio/tests/Makefile.am b/kio/tests/Makefile.am index fe0b6d7ca..3a81dfc57 100644 --- a/kio/tests/Makefile.am +++ b/kio/tests/Makefile.am @@ -18,15 +18,15 @@ INCLUDES= -I$(top_srcdir) -I$(top_srcdir)/kio $(all_includes) LDADD = $(LIB_KIO) -AM_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor +AM_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -ltdetexteditor -check_PROGRAMS = ksycocatest getalltest kruntest ktartest kziptest\ +check_PROGRAMS = tdesycocatest getalltest kruntest ktartest kziptest\ kioslavetest kdirwatchtest kshredtest speed kurifiltertest \ kdefaultprogresstest kmimemagictest \ kfiltertest kiopassdlgtest kscantest kdirlistertest \ previewtest kionetrctest kdcopcheck metatest \ kmimefromext kpropsdlgtest kmfitest dataprotocoltest \ - kprotocolinfotest ksycocaupdatetest netaccesstest jobtest \ + kprotocolinfotest tdesycocaupdatetest netaccesstest jobtest \ kurlcompletiontest kmimetypetest kacltest # Unfortunately some tests depend on the network settings, it seems @@ -48,7 +48,7 @@ kdefaultprogresstest_SOURCES = kdefaultprogresstest.cpp kionetrctest_SOURCES = kionetrctest.cpp kiopassdlgtest_SOURCES = kiopassdlgtest.cpp kurifiltertest_SOURCES = kurifiltertest.cpp -ksycocatest_SOURCES = ksycocatest.cpp +tdesycocatest_SOURCES = tdesycocatest.cpp kdcopcheck_SOURCES = kdcopcheck.cpp getalltest_SOURCES = getalltest.cpp kruntest_SOURCES = kruntest.cpp @@ -67,7 +67,7 @@ kpropsdlgtest_SOURCES = kpropsdlgtest.cpp kmfitest_SOURCES = kmfitest.cpp dataprotocoltest_SOURCES = dataprotocoltest.cpp kprotocolinfotest_SOURCES = kprotocolinfotest.cpp -ksycocaupdatetest_SOURCES = ksycocaupdatetest.cpp +tdesycocaupdatetest_SOURCES = tdesycocaupdatetest.cpp netaccesstest_SOURCES = netaccesstest.cpp jobtest_SOURCES = jobtest.cpp kurlcompletiontest_SOURCES = kurlcompletiontest.cpp @@ -75,10 +75,10 @@ kmimetypetest_SOURCES = kmimetypetest.cpp kacltest_SOURCES = kacltest.cpp -check_LTLIBRARIES = kunittest_kdirwatch.la -kunittest_kdirwatch_la_SOURCES = kdirwatchunittest.cpp -kunittest_kdirwatch_la_LIBADD = $(LIB_KUNITTEST) $(LIB_KIO) -kunittest_kdirwatch_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) +check_LTLIBRARIES = tdeunittest_kdirwatch.la +tdeunittest_kdirwatch_la_SOURCES = kdirwatchunittest.cpp +tdeunittest_kdirwatch_la_LIBADD = $(LIB_KUNITTEST) $(LIB_KIO) +tdeunittest_kdirwatch_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) # kfile meta stuff. Comment this in, if you want a small # metadata plugin test and "make install". diff --git a/kio/tests/kdirwatchunittest.cpp b/kio/tests/kdirwatchunittest.cpp index 870b85de9..3d7505a3f 100644 --- a/kio/tests/kdirwatchunittest.cpp +++ b/kio/tests/kdirwatchunittest.cpp @@ -106,7 +106,7 @@ void KDirWatchTest::rename_file(const TQString& from, const TQString& to) ::rename(TQFile::encodeName(from), TQFile::encodeName(to)); } -KUNITTEST_MODULE ( kunittest_kdirwatch, "KDirWatchTest" ) +KUNITTEST_MODULE ( tdeunittest_kdirwatch, "KDirWatchTest" ) KUNITTEST_MODULE_REGISTER_TESTER (KDirWatchTest) #define SLEEP() TQApplication::processEvents(); diff --git a/kio/tests/kdirwatchunittest.h b/kio/tests/kdirwatchunittest.h index 053ab2882..42222a787 100644 --- a/kio/tests/kdirwatchunittest.h +++ b/kio/tests/kdirwatchunittest.h @@ -19,8 +19,8 @@ #include "kdirwatch.h" #include "kapplication.h" -#include -#include +#include +#include class KDirWatchTest : public KUnitTest::Tester { diff --git a/kio/tests/ksycocatest.cpp b/kio/tests/ksycocatest.cpp deleted file mode 100644 index 45f94ac3c..000000000 --- a/kio/tests/ksycocatest.cpp +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (C) 2002, 2003 David Faure - * - * 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 -#include -#include -#include - -#include - -#include -#include - -bool check(TQString txt, TQString a, TQString b) -{ - if (a.isEmpty()) - a = TQString::null; - if (b.isEmpty()) - b = TQString::null; - if (a == b) { - kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; - } - else { - kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl -; - exit(1); - } - return true; -} - -void debug(TQString txt) -{ - fprintf(stderr, "%s\n", txt.ascii()); -} - -void debug(const char *txt) -{ - fprintf(stderr, "%s\n", txt); -} -void debug(const char *format, const char *txt) -{ - fprintf(stderr, format, txt); - fprintf(stderr, "\n"); -} - -int main(int argc, char *argv[]) -{ - TDEApplication k(argc,argv,"whatever",false/*noGUI*/); // KMessageBox needs KApp for makeStdCaption - - TQCString instname = "kword"; - TQString desktopPath = TQString::fromLatin1( "Office/%1.desktop" ).arg( instname ); - tqDebug( "Looking for %s", desktopPath.latin1() ); - KService::Ptr service = KService::serviceByDesktopPath( desktopPath ); - if ( service ) - tqDebug( "found: %s", service->desktopEntryPath().latin1() ); - else - tqDebug( "not found" ); - - tqDebug( "Looking for desktop name = %s", instname.data() ); - service = KService::serviceByDesktopName( instname ); - if ( service ) - tqDebug( "found: %s", service->desktopEntryPath().latin1() ); - else - tqDebug( "not found" ); - - debug("Trying to look for text/plain"); - KMimeType::Ptr s1 = KMimeType::mimeType("text/plain"); - if ( s1 ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(s1->comment(KURL(),false))); - } - else - { - debug("Not found !"); - exit(1); - } - - debug("Trying to look for application/x-zerosize"); - KMimeType::Ptr s0 = KMimeType::mimeType("application/x-zerosize"); - if ( s0 ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(s0->comment(KURL(),false))); - } - else - { - debug("Not found !"); - exit(1); - } - - debug("Trying to look for Desktop Pager"); - KService::Ptr se = KService::serviceByName("Desktop Pager"); - if ( se ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(se->comment())); - } - else - { - debug("Not found !"); - } - - debug("Trying to look for kpager"); - se = KService::serviceByDesktopName("kpager"); - if ( se ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(se->comment())); - TQVariant qv = se->property("DocPath"); - debug(TQString("Property type is %1").arg(qv.typeName())); - debug(TQString("Property value is %1").arg(qv.toString())); - } - else - { - debug("Not found !"); - } - - debug("Trying to look for System/kpager.desktop"); - se = KService::serviceByDesktopPath("System/kpager.desktop"); - if ( se ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(se->comment())); - } - else - { - debug("Not found !"); - } - - debug("Trying to look for System/fake-entry.desktop"); - se = KService::serviceByDesktopPath("System/fake-entry.desktop"); - if ( se ) - { - debug("Found it !"); - debug(TQString("Comment is %1").arg(se->comment())); - } - else - { - debug("Not found !"); - } - -#if 1 - debug("Querying userprofile for services associated with text/plain"); - KServiceTypeProfile::OfferList offers = KServiceTypeProfile::offers("text/plain"); - debug(TQString("got %1 offers").arg(offers.count())); - KServiceTypeProfile::OfferList::Iterator it = offers.begin(); - for ( ; it != offers.end() ; it++ ) - { - debug((*it).service()->name()); - } - - debug("Querying userprofile for services associated with KOfficeFilter"); - offers = KServiceTypeProfile::offers("KOfficeFilter"); - debug(TQString("got %1 offers").arg(offers.count())); - it = offers.begin(); - for ( ; it != offers.end() ; it++ ) - { - debug((*it).service()->name()); - } - - debug("Querying trader for Konqueror/Plugin"); - KTrader::OfferList traderoffers = KTrader::self()->query("Konqueror/Plugin"); - debug(TQString("got %1 offers").arg(traderoffers.count())); - KTrader::OfferList::Iterator trit = traderoffers.begin(); - for ( ; trit != traderoffers.end() ; trit++ ) - { - debug((*trit)->name()); - } -#endif - - - // - debug("\nTrying findByURL for $TDEDIR/bin/kdesktop"); - KMimeType::Ptr mf = KMimeType::findByURL( KStandardDirs::findExe( "kdesktop" ), 0, - true, false ); - assert( mf ); - check( "A binary's mimetype", mf->name(), "application/x-executable" ); - - // - debug("\nTrying findByURL for folder_home.png"); - TQString fh; - (void)k.iconLoader()->loadIcon("folder_home.png",KIcon::Desktop,0,KIcon::DefaultState,&fh); - mf = KMimeType::findByURL( fh, 0, true, false ); - assert( mf ); - check( "A PNG's mimetype", mf->name(), "image/png" ); - - // - //debug("\nTrying findByURL for Makefile.am"); - //mf = KMimeType::findByURL( KURL("/tmp/Makefile.am"), 0, true, false ); - //assert( mf ); - //debug(TQString("Name is %1").arg(mf->name())); - //debug(TQString("Comment is %1").arg(mf->comment(KURL(),false))); - - debug("\nTrying findByURL for man:/ls"); - mf = KMimeType::findByURL( KURL("man:/ls") ); - assert( mf ); - check( "man:/ls", mf->name(), "text/html" ); - check( "man:/ls/", mf->name(), "text/html" ); - - mf = KMimeType::findByURL( KURL("http://foo/bar.png") ); - check( "HTTP URL", mf->name(), "application/octet-stream" ); // HTTP can't know before downloading - -#if 1 - KMimeType::List mtl; - - mtl = KMimeType::allMimeTypes( ); - assert( mtl.count() ); - debug(TQString("Found %1 mime types.").arg(mtl.count())); - for(int i = 0; i < (int)mtl.count(); i++) - { - debug(TQString("Mime type %1: %2.").arg(i).arg(mtl[i]->name())); - } - - KService::List sl; - - sl = KService::allServices( ); - assert( sl.count() ); - debug(TQString("Found %1 services.").arg(sl.count())); - - KServiceGroup::Ptr root = KServiceGroup::root(); - KServiceGroup::List list = root->entries(); - //KServiceGroup::Ptr topGroup = KServiceGroup::childGroup( "kview" ); - //Q_ASSERT( topGroup ); - //KServiceGroup::List list = topGroup->entries(); - - KServiceGroup::Ptr first; - - debug(TQString("Found %1 entries").arg(list.count())); - for( KServiceGroup::List::ConstIterator it = list.begin(); - it != list.end(); it++) - { - KSycocaEntry *p = (*it); - if (p->isType(KST_KService)) - { - KService *service = static_cast(p); - debug(service->name()); - debug(service->desktopEntryPath()); - } - else if (p->isType(KST_KServiceGroup)) - { - KServiceGroup *serviceGroup = static_cast(p); - debug(TQString(" %1 -->").arg(serviceGroup->caption())); - if (!first) first = serviceGroup; - } - else - { - debug("KServiceGroup: Unexpected object in list!"); - } - } - - if (first) - { - list = first->entries(); - debug(TQString("Found %1 entries").arg(list.count())); - for( KServiceGroup::List::ConstIterator it = list.begin(); - it != list.end(); it++) - { - KSycocaEntry *p = (*it); - if (p->isType(KST_KService)) - { - KService *service = static_cast(p); - debug(TQString(" %1").arg(service->name())); - } - else if (p->isType(KST_KServiceGroup)) - { - KServiceGroup *serviceGroup = static_cast(p); - debug(TQString(" %1 -->").arg(serviceGroup->caption())); - } - else - { - debug("KServiceGroup: Unexpected object in list!"); - } - } - } - - debug("--services that require initialisation--"); - sl = KService::allInitServices(); - for( KService::List::ConstIterator it = sl.begin(); - it != sl.end(); it++) - { - KService *service = static_cast(*it); - debug(service->name()); - } - debug("--End of list--"); - - debug("--protocols--"); - TQStringList stringL = KProtocolInfo::protocols(); - for( TQStringList::ConstIterator it = stringL.begin(); - it != stringL.end(); it++) - { - debug((*it).ascii()); - } - debug("--End of list--"); -#endif - -#if 0 - KImageIO::registerFormats(); - - TQStringList types; - types = KImageIO::types(KImageIO::Reading); - debug("Can read:"); - for(TQStringList::ConstIterator it = types.begin(); - it != types.end(); ++it) - debug(TQString(" %1").arg((*it))); - - types = KImageIO::types(KImageIO::Writing); - debug("Can write:"); - for(TQStringList::ConstIterator it = types.begin(); - it != types.end(); ++it) - debug(TQString(" %1").arg((*it))); - - - TQString rPattern = KImageIO::pattern( KImageIO::Reading ); - debug("Read pattern:\n%s", rPattern.ascii()); - - TQString wPattern = KImageIO::pattern( KImageIO::Writing ); - debug("Write pattern:\n%s", wPattern.ascii()); - - TQString suffix = KImageIO::suffix("JPEG"); - debug("Standard suffix for JPEG: %s", suffix.ascii()); - - types = KImageIO::mimeTypes(KImageIO::Reading); - debug("Can read (mimetypes):"); - for(TQStringList::ConstIterator it = types.begin(); - it != types.end(); ++it) - debug(" %s", (*it).ascii()); - - types = KImageIO::mimeTypes(KImageIO::Writing); - debug("Can write (mimetypes):"); - for(TQStringList::ConstIterator it = types.begin(); - it != types.end(); ++it) - debug(" %s", (*it).ascii()); - - debug("done"); -#endif - return 0; -} diff --git a/kio/tests/ksycocaupdatetest.cpp b/kio/tests/ksycocaupdatetest.cpp deleted file mode 100644 index e7778e056..000000000 --- a/kio/tests/ksycocaupdatetest.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include - -int main(int argc, char *argv[]) -{ - TDEApplication k(argc,argv,"whatever"); // KMessageBox needs KApp for makeStdCaption - - KService::rebuildKSycoca(0); - return 0; -} diff --git a/kio/tests/kurifiltertest.cpp b/kio/tests/kurifiltertest.cpp index a5ed8da9d..820f97403 100644 --- a/kio/tests/kurifiltertest.cpp +++ b/kio/tests/kurifiltertest.cpp @@ -154,7 +154,7 @@ static const KCmdLineOptions options[] = int main(int argc, char **argv) { // Ensure that user configuration doesn't change the results of those tests - // TDEHOME needs to be writable though, for a ksycoca database + // TDEHOME needs to be writable though, for a tdesycoca database setenv( "TDEHOME", TQFile::encodeName( TQDir::homeDirPath() + "/.tde-kurifiltertest" ), true ); setenv( "TDE_FORK_SLAVES", "yes", true ); // simpler, for the final cleanup diff --git a/kio/tests/tdesycocatest.cpp b/kio/tests/tdesycocatest.cpp new file mode 100644 index 000000000..45f94ac3c --- /dev/null +++ b/kio/tests/tdesycocatest.cpp @@ -0,0 +1,360 @@ +/* + * Copyright (C) 2002, 2003 David Faure + * + * 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 +#include +#include +#include + +#include + +#include +#include + +bool check(TQString txt, TQString a, TQString b) +{ + if (a.isEmpty()) + a = TQString::null; + if (b.isEmpty()) + b = TQString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl +; + exit(1); + } + return true; +} + +void debug(TQString txt) +{ + fprintf(stderr, "%s\n", txt.ascii()); +} + +void debug(const char *txt) +{ + fprintf(stderr, "%s\n", txt); +} +void debug(const char *format, const char *txt) +{ + fprintf(stderr, format, txt); + fprintf(stderr, "\n"); +} + +int main(int argc, char *argv[]) +{ + TDEApplication k(argc,argv,"whatever",false/*noGUI*/); // KMessageBox needs KApp for makeStdCaption + + TQCString instname = "kword"; + TQString desktopPath = TQString::fromLatin1( "Office/%1.desktop" ).arg( instname ); + tqDebug( "Looking for %s", desktopPath.latin1() ); + KService::Ptr service = KService::serviceByDesktopPath( desktopPath ); + if ( service ) + tqDebug( "found: %s", service->desktopEntryPath().latin1() ); + else + tqDebug( "not found" ); + + tqDebug( "Looking for desktop name = %s", instname.data() ); + service = KService::serviceByDesktopName( instname ); + if ( service ) + tqDebug( "found: %s", service->desktopEntryPath().latin1() ); + else + tqDebug( "not found" ); + + debug("Trying to look for text/plain"); + KMimeType::Ptr s1 = KMimeType::mimeType("text/plain"); + if ( s1 ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(s1->comment(KURL(),false))); + } + else + { + debug("Not found !"); + exit(1); + } + + debug("Trying to look for application/x-zerosize"); + KMimeType::Ptr s0 = KMimeType::mimeType("application/x-zerosize"); + if ( s0 ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(s0->comment(KURL(),false))); + } + else + { + debug("Not found !"); + exit(1); + } + + debug("Trying to look for Desktop Pager"); + KService::Ptr se = KService::serviceByName("Desktop Pager"); + if ( se ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(se->comment())); + } + else + { + debug("Not found !"); + } + + debug("Trying to look for kpager"); + se = KService::serviceByDesktopName("kpager"); + if ( se ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(se->comment())); + TQVariant qv = se->property("DocPath"); + debug(TQString("Property type is %1").arg(qv.typeName())); + debug(TQString("Property value is %1").arg(qv.toString())); + } + else + { + debug("Not found !"); + } + + debug("Trying to look for System/kpager.desktop"); + se = KService::serviceByDesktopPath("System/kpager.desktop"); + if ( se ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(se->comment())); + } + else + { + debug("Not found !"); + } + + debug("Trying to look for System/fake-entry.desktop"); + se = KService::serviceByDesktopPath("System/fake-entry.desktop"); + if ( se ) + { + debug("Found it !"); + debug(TQString("Comment is %1").arg(se->comment())); + } + else + { + debug("Not found !"); + } + +#if 1 + debug("Querying userprofile for services associated with text/plain"); + KServiceTypeProfile::OfferList offers = KServiceTypeProfile::offers("text/plain"); + debug(TQString("got %1 offers").arg(offers.count())); + KServiceTypeProfile::OfferList::Iterator it = offers.begin(); + for ( ; it != offers.end() ; it++ ) + { + debug((*it).service()->name()); + } + + debug("Querying userprofile for services associated with KOfficeFilter"); + offers = KServiceTypeProfile::offers("KOfficeFilter"); + debug(TQString("got %1 offers").arg(offers.count())); + it = offers.begin(); + for ( ; it != offers.end() ; it++ ) + { + debug((*it).service()->name()); + } + + debug("Querying trader for Konqueror/Plugin"); + KTrader::OfferList traderoffers = KTrader::self()->query("Konqueror/Plugin"); + debug(TQString("got %1 offers").arg(traderoffers.count())); + KTrader::OfferList::Iterator trit = traderoffers.begin(); + for ( ; trit != traderoffers.end() ; trit++ ) + { + debug((*trit)->name()); + } +#endif + + + // + debug("\nTrying findByURL for $TDEDIR/bin/kdesktop"); + KMimeType::Ptr mf = KMimeType::findByURL( KStandardDirs::findExe( "kdesktop" ), 0, + true, false ); + assert( mf ); + check( "A binary's mimetype", mf->name(), "application/x-executable" ); + + // + debug("\nTrying findByURL for folder_home.png"); + TQString fh; + (void)k.iconLoader()->loadIcon("folder_home.png",KIcon::Desktop,0,KIcon::DefaultState,&fh); + mf = KMimeType::findByURL( fh, 0, true, false ); + assert( mf ); + check( "A PNG's mimetype", mf->name(), "image/png" ); + + // + //debug("\nTrying findByURL for Makefile.am"); + //mf = KMimeType::findByURL( KURL("/tmp/Makefile.am"), 0, true, false ); + //assert( mf ); + //debug(TQString("Name is %1").arg(mf->name())); + //debug(TQString("Comment is %1").arg(mf->comment(KURL(),false))); + + debug("\nTrying findByURL for man:/ls"); + mf = KMimeType::findByURL( KURL("man:/ls") ); + assert( mf ); + check( "man:/ls", mf->name(), "text/html" ); + check( "man:/ls/", mf->name(), "text/html" ); + + mf = KMimeType::findByURL( KURL("http://foo/bar.png") ); + check( "HTTP URL", mf->name(), "application/octet-stream" ); // HTTP can't know before downloading + +#if 1 + KMimeType::List mtl; + + mtl = KMimeType::allMimeTypes( ); + assert( mtl.count() ); + debug(TQString("Found %1 mime types.").arg(mtl.count())); + for(int i = 0; i < (int)mtl.count(); i++) + { + debug(TQString("Mime type %1: %2.").arg(i).arg(mtl[i]->name())); + } + + KService::List sl; + + sl = KService::allServices( ); + assert( sl.count() ); + debug(TQString("Found %1 services.").arg(sl.count())); + + KServiceGroup::Ptr root = KServiceGroup::root(); + KServiceGroup::List list = root->entries(); + //KServiceGroup::Ptr topGroup = KServiceGroup::childGroup( "kview" ); + //Q_ASSERT( topGroup ); + //KServiceGroup::List list = topGroup->entries(); + + KServiceGroup::Ptr first; + + debug(TQString("Found %1 entries").arg(list.count())); + for( KServiceGroup::List::ConstIterator it = list.begin(); + it != list.end(); it++) + { + KSycocaEntry *p = (*it); + if (p->isType(KST_KService)) + { + KService *service = static_cast(p); + debug(service->name()); + debug(service->desktopEntryPath()); + } + else if (p->isType(KST_KServiceGroup)) + { + KServiceGroup *serviceGroup = static_cast(p); + debug(TQString(" %1 -->").arg(serviceGroup->caption())); + if (!first) first = serviceGroup; + } + else + { + debug("KServiceGroup: Unexpected object in list!"); + } + } + + if (first) + { + list = first->entries(); + debug(TQString("Found %1 entries").arg(list.count())); + for( KServiceGroup::List::ConstIterator it = list.begin(); + it != list.end(); it++) + { + KSycocaEntry *p = (*it); + if (p->isType(KST_KService)) + { + KService *service = static_cast(p); + debug(TQString(" %1").arg(service->name())); + } + else if (p->isType(KST_KServiceGroup)) + { + KServiceGroup *serviceGroup = static_cast(p); + debug(TQString(" %1 -->").arg(serviceGroup->caption())); + } + else + { + debug("KServiceGroup: Unexpected object in list!"); + } + } + } + + debug("--services that require initialisation--"); + sl = KService::allInitServices(); + for( KService::List::ConstIterator it = sl.begin(); + it != sl.end(); it++) + { + KService *service = static_cast(*it); + debug(service->name()); + } + debug("--End of list--"); + + debug("--protocols--"); + TQStringList stringL = KProtocolInfo::protocols(); + for( TQStringList::ConstIterator it = stringL.begin(); + it != stringL.end(); it++) + { + debug((*it).ascii()); + } + debug("--End of list--"); +#endif + +#if 0 + KImageIO::registerFormats(); + + TQStringList types; + types = KImageIO::types(KImageIO::Reading); + debug("Can read:"); + for(TQStringList::ConstIterator it = types.begin(); + it != types.end(); ++it) + debug(TQString(" %1").arg((*it))); + + types = KImageIO::types(KImageIO::Writing); + debug("Can write:"); + for(TQStringList::ConstIterator it = types.begin(); + it != types.end(); ++it) + debug(TQString(" %1").arg((*it))); + + + TQString rPattern = KImageIO::pattern( KImageIO::Reading ); + debug("Read pattern:\n%s", rPattern.ascii()); + + TQString wPattern = KImageIO::pattern( KImageIO::Writing ); + debug("Write pattern:\n%s", wPattern.ascii()); + + TQString suffix = KImageIO::suffix("JPEG"); + debug("Standard suffix for JPEG: %s", suffix.ascii()); + + types = KImageIO::mimeTypes(KImageIO::Reading); + debug("Can read (mimetypes):"); + for(TQStringList::ConstIterator it = types.begin(); + it != types.end(); ++it) + debug(" %s", (*it).ascii()); + + types = KImageIO::mimeTypes(KImageIO::Writing); + debug("Can write (mimetypes):"); + for(TQStringList::ConstIterator it = types.begin(); + it != types.end(); ++it) + debug(" %s", (*it).ascii()); + + debug("done"); +#endif + return 0; +} diff --git a/kio/tests/tdesycocaupdatetest.cpp b/kio/tests/tdesycocaupdatetest.cpp new file mode 100644 index 000000000..e7778e056 --- /dev/null +++ b/kio/tests/tdesycocaupdatetest.cpp @@ -0,0 +1,11 @@ +#include + +#include + +int main(int argc, char *argv[]) +{ + TDEApplication k(argc,argv,"whatever"); // KMessageBox needs KApp for makeStdCaption + + KService::rebuildKSycoca(0); + return 0; +} -- cgit v1.2.1