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/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 ++ 40 files changed, 4551 insertions(+), 4551 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 (limited to 'kio/misc') 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(); +} -- cgit v1.2.1