[Pkg-owncloud-commits] [qtkeychain] 07/35: Added binary / text mode password support. Added binary password write function.
Sandro Knauß
hefee-guest at moszumanska.debian.org
Tue May 24 17:39:58 UTC 2016
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository qtkeychain.
commit 45725c79866d020a657a80a04ac698b7c7bb501b
Author: Armin Novak <armin.novak at thincast.com>
Date: Tue Jan 12 12:55:25 2016 +0100
Added binary / text mode password support.
Added binary password write function.
---
gnomekeyring.cpp | 31 +++++++++++++++++++++++--------
gnomekeyring_p.h | 10 +++++++---
keychain_unix.cpp | 43 ++++++++++++++++++++++++++++++++++++-------
testclient.cpp | 23 +++++++++++++++++++++++
4 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/gnomekeyring.cpp b/gnomekeyring.cpp
index 9cef00f..bf4741b 100644
--- a/gnomekeyring.cpp
+++ b/gnomekeyring.cpp
@@ -14,25 +14,39 @@ bool GnomeKeyring::isAvailable()
keyring.is_available();
}
-GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyring, const gchar* display_name,
- const gchar* user, const gchar* server, const gchar* password,
- OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data )
+GnomeKeyring::gpointer GnomeKeyring::store_network_password(
+ const gchar* keyring,
+ const gchar* display_name,
+ const gchar* user,
+ const gchar* server,
+ const gchar* type,
+ const gchar* password,
+ OperationDoneCallback callback,
+ gpointer data,
+ GDestroyNotify destroy_data )
{
if ( !isAvailable() )
return 0;
return instance().store_password( instance().NETWORK_PASSWORD,
- keyring, display_name, password, callback, data, destroy_data,
- "user", user, "server", server, static_cast<char*>(0) );
+ keyring, display_name, password, callback,
+ data, destroy_data,
+ "user", user,
+ "server", server,
+ "type", type,
+ static_cast<char*>(0) );
}
-GnomeKeyring::gpointer GnomeKeyring::find_network_password( const gchar* user, const gchar* server,
- OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data )
+GnomeKeyring::gpointer GnomeKeyring::find_network_password(
+ const gchar* user, const gchar* server, const gchar* type,
+ OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data )
{
if ( !isAvailable() )
return 0;
+
return instance().find_password( instance().NETWORK_PASSWORD,
callback, data, destroy_data,
- "user", user, "server", server, static_cast<char*>(0) );
+ "user", user, "server", server, "type", type,
+ static_cast<char*>(0) );
}
GnomeKeyring::gpointer GnomeKeyring::delete_network_password( const gchar* user,
@@ -55,6 +69,7 @@ GnomeKeyring::GnomeKeyring()
ITEM_NETWORK_PASSWORD,
{{ "user", ATTRIBUTE_TYPE_STRING },
{ "server", ATTRIBUTE_TYPE_STRING },
+ { "type", ATTRIBUTE_TYPE_STRING },
{ 0, static_cast<AttributeType>( 0 ) }}
};
diff --git a/gnomekeyring_p.h b/gnomekeyring_p.h
index 6d150ba..3f6869b 100644
--- a/gnomekeyring_p.h
+++ b/gnomekeyring_p.h
@@ -43,7 +43,8 @@ public:
} attributes[32];
} PasswordSchema;
- typedef void ( *OperationGetStringCallback )( Result result, const char* string, gpointer data );
+ typedef void ( *OperationGetStringCallback )( Result result, bool binary,
+ const char* string, gpointer data );
typedef void ( *OperationDoneCallback )( Result result, gpointer data );
typedef void ( *GDestroyNotify )( gpointer data );
@@ -52,11 +53,14 @@ public:
static bool isAvailable();
static gpointer store_network_password( const gchar* keyring, const gchar* display_name,
- const gchar* user, const gchar* server, const gchar* password,
+ const gchar* user, const gchar* server,
+ const gchar* type, const gchar* password,
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data );
static gpointer find_network_password( const gchar* user, const gchar* server,
- OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data );
+ const gchar* type,
+ OperationGetStringCallback callback,
+ gpointer data, GDestroyNotify destroy_data );
static gpointer delete_network_password( const gchar* user, const gchar* server,
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data );
diff --git a/keychain_unix.cpp b/keychain_unix.cpp
index 9fa9f24..e83f33f 100644
--- a/keychain_unix.cpp
+++ b/keychain_unix.cpp
@@ -134,7 +134,10 @@ static void kwalletReadPasswordScheduledStartImpl(const char * service, const ch
void ReadPasswordJobPrivate::scheduledStart() {
switch ( getKeyringBackend() ) {
case Backend_GnomeKeyring:
- if ( !GnomeKeyring::find_network_password( key.toUtf8().constData(), q->service().toUtf8().constData(),
+ this->mode = JobPrivate::Text;
+ if ( !GnomeKeyring::find_network_password( key.toUtf8().constData(),
+ q->service().toUtf8().constData(),
+ "plaintext",
reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &JobPrivate::gnomeKeyring_readCb ),
this, 0 ) )
q->emitFinishedWithError( OtherError, tr("Unknown error") );
@@ -192,11 +195,20 @@ static QPair<Error, QString> mapGnomeKeyringError( int result )
void JobPrivate::gnomeKeyring_readCb( int result, const char* string, JobPrivate* self )
{
if ( result == GnomeKeyring::RESULT_OK ) {
- if ( self->mode == JobPrivate::Text )
- self->data = string;
+ if (self->mode == JobPrivate::Text)
+ self->data = QByteArray(string);
else
- self->data = QByteArray::fromBase64( string );
+ self->data = QByteArray::fromBase64(string);
+
self->q->emitFinished();
+ } else if (self->mode == JobPrivate::Text) {
+ self->mode = JobPrivate::Binary;
+ if ( !GnomeKeyring::find_network_password( self->key.toUtf8().constData(),
+ self->q->service().toUtf8().constData(),
+ "base64",
+ reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &JobPrivate::gnomeKeyring_readCb ),
+ self, 0 ) )
+ self->q->emitFinishedWithError( OtherError, tr("Unknown error") );
} else {
const QPair<Error, QString> errorResult = mapGnomeKeyringError( result );
self->q->emitFinishedWithError( errorResult.first, errorResult.second );
@@ -350,10 +362,27 @@ static void kwalletWritePasswordScheduledStart( const char * service, const char
void WritePasswordJobPrivate::scheduledStart() {
switch ( getKeyringBackend() ) {
case Backend_GnomeKeyring: {
- QByteArray password = (mode == JobPrivate::Text) ? data : data.toBase64();
+ QString type;
+ QByteArray password;
+
+ switch(mode) {
+ case JobPrivate::Text:
+ type = "plaintext";
+ password = data;
+ break;
+ default:
+ type = "base64";
+ password = data.toBase64();
+ break;
+ }
+
QByteArray service = q->service().toUtf8();
- if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT, service.constData(),
- key.toUtf8().constData(), service.constData(), password.constData(),
+ if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT,
+ service.constData(),
+ key.toUtf8().constData(),
+ service.constData(),
+ type.toUtf8().constData(),
+ password.constData(),
reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &JobPrivate::gnomeKeyring_writeCb ),
this, 0 ) )
q->emitFinishedWithError( OtherError, tr("Unknown error") );
diff --git a/testclient.cpp b/testclient.cpp
index a9d9bad..94189cf 100644
--- a/testclient.cpp
+++ b/testclient.cpp
@@ -52,6 +52,29 @@ int main( int argc, char** argv ) {
return 1;
}
std::cout << "Password stored successfully" << std::endl;
+ } else if ( *it == QLatin1String("bstore") ) {
+ if ( ++it == args.constEnd() )
+ return printUsage();
+ const QString acc = *it;
+ if ( ++it == args.constEnd() )
+ return printUsage();
+ const QString pass = *it;
+ if ( ++it != args.constEnd() )
+ return printUsage();
+ WritePasswordJob job( QLatin1String("qtkeychain-testclient") );
+ job.setAutoDelete( false );
+ job.setKey( acc );
+ job.setBinaryData( pass.toUtf8() );
+ QEventLoop loop;
+ job.connect( &job, SIGNAL(finished(QKeychain::Job*)), &loop, SLOT(quit()) );
+ job.start();
+ loop.exec();
+ if ( job.error() ) {
+ std::cerr << "Storing binary password failed: "
+ << qPrintable(job.errorString()) << std::endl;
+ return 1;
+ }
+ std::cout << "Password stored successfully" << std::endl;
} else if ( *it == QLatin1String("restore") ) {
if ( ++it == args.constEnd() )
return printUsage();
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/qtkeychain.git
More information about the Pkg-owncloud-commits
mailing list