| https://svn.collab.net/viewvc/svn?view=revision&revision=38004 |
| https://svn.collab.net/viewvc/svn?view=revision&revision=38014 |
| https://svn.collab.net/viewvc/svn?view=revision&revision=38028 |
| https://svn.collab.net/viewvc/svn?view=revision&revision=38122 |
| |
| --- subversion/libsvn_auth_kwallet/kwallet.cpp |
| +++ subversion/libsvn_auth_kwallet/kwallet.cpp |
| @@ -22,6 +22,7 @@ |
| |
| /*** Includes. ***/ |
| |
| +#include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| @@ -30,6 +31,9 @@ |
| #include "svn_auth.h" |
| #include "svn_config.h" |
| #include "svn_error.h" |
| +#include "svn_io.h" |
| +#include "svn_pools.h" |
| +#include "svn_string.h" |
| #include "svn_version.h" |
| |
| #include "private/svn_auth_private.h" |
| @@ -38,13 +42,20 @@ |
| |
| #include <dbus/dbus.h> |
| #include <QtCore/QCoreApplication> |
| +#include <QtCore/QList> |
| +#include <QtCore/QMap> |
| #include <QtCore/QString> |
| +#include <QtGui/QApplication> |
| +#include <QtGui/QX11Info> |
| |
| #include <kaboutdata.h> |
| #include <kcmdlineargs.h> |
| #include <kcomponentdata.h> |
| #include <klocalizedstring.h> |
| #include <kwallet.h> |
| +#include <kwindowsystem.h> |
| +#include <netwm.h> |
| +#include <netwm_def.h> |
| |
| |
| /*-----------------------------------------------------------------------*/ |
| @@ -52,6 +63,28 @@ |
| /*-----------------------------------------------------------------------*/ |
| |
| |
| +#define INITIALIZE_APPLICATION \ |
| + if (apr_hash_get(parameters, \ |
| + "svn:auth:qapplication-safe", \ |
| + APR_HASH_KEY_STRING)) \ |
| + { \ |
| + QApplication *app; \ |
| + if (! qApp) \ |
| + { \ |
| + int argc = 1; \ |
| + app = new QApplication(argc, (char *[1]) {(char *) "svn"}); \ |
| + } \ |
| + } \ |
| + else \ |
| + { \ |
| + QCoreApplication *app; \ |
| + if (! qApp) \ |
| + { \ |
| + int argc = 1; \ |
| + app = new QCoreApplication(argc, (char *[1]) {(char *) "svn"}); \ |
| + } \ |
| + } |
| + |
| static const char * |
| get_application_name(apr_hash_t *parameters, |
| apr_pool_t *pool) |
| @@ -69,8 +102,7 @@ |
| const char *svn_application_name; |
| if (svn_application_name_with_pid) |
| { |
| - long pid = getpid(); |
| - svn_application_name = apr_psprintf(pool, "Subversion [%ld]", pid); |
| + svn_application_name = apr_psprintf(pool, "Subversion [%ld]", long(getpid())); |
| } |
| else |
| { |
| @@ -102,9 +134,108 @@ |
| } |
| } |
| |
| +static pid_t |
| +get_parent_pid(pid_t pid, |
| + apr_pool_t *pool) |
| +{ |
| + pid_t parent_pid = 0; |
| + |
| +#ifdef __linux__ |
| + svn_stream_t *stat_file_stream; |
| + svn_string_t *stat_file_string; |
| + const char *preceeding_space, *following_space, *parent_pid_string; |
| + |
| + const char *path = apr_psprintf(pool, "/proc/%ld/stat", long(pid)); |
| + svn_error_t *err = svn_stream_open_readonly(&stat_file_stream, path, pool, pool); |
| + if (err == SVN_NO_ERROR) |
| + { |
| + err = svn_string_from_stream(&stat_file_string, stat_file_stream, pool, pool); |
| + if (err == SVN_NO_ERROR) |
| + { |
| + if ((preceeding_space = strchr(stat_file_string->data, ' '))) |
| + { |
| + if ((preceeding_space = strchr(preceeding_space + 1, ' '))) |
| + { |
| + if ((preceeding_space = strchr(preceeding_space + 1, ' '))) |
| + { |
| + if ((following_space = strchr(preceeding_space + 1, ' '))) |
| + { |
| + parent_pid_string = apr_pstrndup(pool, |
| + preceeding_space + 1, |
| + following_space - preceeding_space); |
| + parent_pid = atol(parent_pid_string); |
| + } |
| + } |
| + } |
| + } |
| + } |
| + } |
| + |
| + if (err) |
| + { |
| + svn_error_clear(err); |
| + } |
| +#endif |
| + |
| + return parent_pid; |
| +} |
| + |
| +static WId |
| +get_wid(apr_hash_t *parameters, |
| + apr_pool_t *pool) |
| +{ |
| + WId wid = 1; |
| + |
| + if (apr_hash_get(parameters, |
| + "svn:auth:qapplication-safe", |
| + APR_HASH_KEY_STRING)) |
| + { |
| + QMap<pid_t, WId> process_info_list; |
| + QList<WId> windows(KWindowSystem::windows()); |
| + QList<WId>::const_iterator i; |
| + for (i = windows.begin(); i != windows.end(); i++) |
| + { |
| + process_info_list[NETWinInfo(QX11Info::display(), |
| + *i, |
| + QX11Info::appRootWindow(), |
| + NET::WMPid).pid()] = *i; |
| + } |
| + |
| + apr_pool_t *iterpool = svn_pool_create(pool); |
| + pid_t pid = getpid(); |
| + while (pid != 0) |
| + { |
| + svn_pool_clear(iterpool); |
| + if (process_info_list.contains(pid)) |
| + { |
| + wid = process_info_list[pid]; |
| + break; |
| + } |
| + pid = get_parent_pid(pid, iterpool); |
| + } |
| + svn_pool_destroy(iterpool); |
| + } |
| + |
| + if (wid == 1) |
| + { |
| + const char *wid_env_string = getenv("WINDOWID"); |
| + if (wid_env_string) |
| + { |
| + long wid_env = atol(wid_env_string); |
| + if (wid_env != 0) |
| + { |
| + wid = wid_env; |
| + } |
| + } |
| + } |
| + |
| + return wid; |
| +} |
| + |
| static KWallet::Wallet * |
| get_wallet(QString wallet_name, |
| - apr_hash_t *parameters) |
| + apr_hash_t *parameters, |
| + apr_pool_t *pool) |
| { |
| KWallet::Wallet *wallet = |
| static_cast<KWallet::Wallet *> (apr_hash_get(parameters, |
| @@ -115,7 +246,7 @@ |
| APR_HASH_KEY_STRING)) |
| { |
| wallet = KWallet::Wallet::openWallet(wallet_name, |
| - -1, |
| + pool ? get_wid(parameters, pool) : 1, |
| KWallet::Wallet::Synchronous); |
| } |
| if (wallet) |
| @@ -141,7 +272,7 @@ |
| apr_hash_t *parameters = static_cast<apr_hash_t *> (data); |
| if (apr_hash_get(parameters, "kwallet-initialized", APR_HASH_KEY_STRING)) |
| { |
| - KWallet::Wallet *wallet = get_wallet(NULL, parameters); |
| + KWallet::Wallet *wallet = get_wallet(NULL, parameters, NULL); |
| delete wallet; |
| apr_hash_set(parameters, |
| "kwallet-initialized", |
| @@ -172,12 +303,7 @@ |
| return FALSE; |
| } |
| |
| - QCoreApplication *app; |
| - if (! qApp) |
| - { |
| - int argc = 1; |
| - app = new QCoreApplication(argc, (char *[1]) {(char *) "svn"}); |
| - } |
| + INITIALIZE_APPLICATION |
| |
| KCmdLineArgs::init(1, |
| (char *[1]) {(char *) "svn"}, |
| @@ -195,7 +321,7 @@ |
| QString::fromUtf8(username) + "@" + QString::fromUtf8(realmstring); |
| if (! KWallet::Wallet::keyDoesNotExist(wallet_name, folder, key)) |
| { |
| - KWallet::Wallet *wallet = get_wallet(wallet_name, parameters); |
| + KWallet::Wallet *wallet = get_wallet(wallet_name, parameters, pool); |
| if (wallet) |
| { |
| apr_hash_set(parameters, |
| @@ -242,12 +368,7 @@ |
| return FALSE; |
| } |
| |
| - QCoreApplication *app; |
| - if (! qApp) |
| - { |
| - int argc = 1; |
| - app = new QCoreApplication(argc, (char *[1]) {(char *) "svn"}); |
| - } |
| + INITIALIZE_APPLICATION |
| |
| KCmdLineArgs::init(1, |
| (char *[1]) {(char *) "svn"}, |
| @@ -262,7 +383,7 @@ |
| QString q_password = QString::fromUtf8(password); |
| QString wallet_name = get_wallet_name(parameters); |
| QString folder = QString::fromUtf8("Subversion"); |
| - KWallet::Wallet *wallet = get_wallet(wallet_name, parameters); |
| + KWallet::Wallet *wallet = get_wallet(wallet_name, parameters, pool); |
| if (wallet) |
| { |
| apr_hash_set(parameters, |
| --- subversion/svn/main.c |
| +++ subversion/svn/main.c |
| @@ -2067,6 +2067,9 @@ |
| pool))) |
| svn_handle_error2(err, stderr, TRUE, "svn: "); |
| |
| + /* svn can safely create instance of QApplication class. */ |
| + svn_auth_set_parameter(ab, "svn:auth:qapplication-safe", "1"); |
| + |
| ctx->auth_baton = ab; |
| |
| /* Set up conflict resolution callback. */ |
| --- subversion/svnsync/main.c |
| +++ subversion/svnsync/main.c |
| @@ -1,6 +1,6 @@ |
| /* |
| * ==================================================================== |
| - * Copyright (c) 2005-2008 CollabNet. All rights reserved. |
| + * Copyright (c) 2005-2009 CollabNet. All rights reserved. |
| * |
| * This software is licensed as described in the file COPYING, which |
| * you should have received as part of this distribution. The terms |
| @@ -2362,7 +2362,15 @@ |
| check_cancel, NULL, |
| pool); |
| if (! err) |
| - err = (*subcommand->cmd_func)(os, &opt_baton, pool); |
| + { |
| + /* svnsync can safely create instance of QApplication class. */ |
| + svn_auth_set_parameter(opt_baton.source_auth_baton, |
| + "svn:auth:qapplication-safe", "1"); |
| + svn_auth_set_parameter(opt_baton.sync_auth_baton, |
| + "svn:auth:qapplication-safe", "1"); |
| + |
| + err = (*subcommand->cmd_func)(os, &opt_baton, pool); |
| + } |
| if (err) |
| { |
| /* For argument-related problems, suggest using the 'help' |