From kde-core-devel Sun May 18 17:14:00 2008 From: nf2 Date: Sun, 18 May 2008 17:14:00 +0000 To: kde-core-devel Subject: Re: PATCH for review: KIO::AuthInfo, KPasswordDialog and KPasswdServer Message-Id: <483063D8.90808 () scheinwelt ! at> X-MARC-Message: https://marc.info/?l=kde-core-devel&m=121113088231857 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------060003050907020601060707" This is a multi-part message in MIME format. --------------060003050907020601060707 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit nf2 wrote: > This patch extends KIO::AuthInfo and KPasswordDialog: > > KIO::AuthInfo: > > * Extra fields (like "domain"), stored as a map of QVariants > * Anonymous login flag > * Flag to suppress password caching in KPasswdServer > > KPasswordDialog: > > * Optional domain field > * Optional "anonymous login" checkbox > > Additionally i did some refactoring of KPasswdServer > > * Renamed struct AuthInfo into struct AuthInfoContainer, for better > readability. > * KIO::AuthInfo inside this struct, instead of cloning all the fields > one by one. > > Regards, > Norbert > Here is an updated set of the patches for kdelibs and kdebase. I have streamlined the extensions of the KIO::AuthInfo API: * The flag to enable the anonymous login checkbox is stored as KIO::AuthInfo Extra-Field as well. * The flag to bypass KPasswdServers caching and Kwallet is a "hidden feature" for now (just set the extra-field "bypass-cache-and-kwallet" to true), because i'm not sure yet, where this flag should be set: An additional method in AuthInfo - or by overloading SlaveBase::openPasswordDialog()? Could someone please have a quick look at it - particularly the KIO::AuthInfo API changes? Because of the feature-freeze i'm afraid i have to commit it tonight. :-) Regards, Norbert --------------060003050907020601060707 Content-Type: text/x-diff; name="kdelibs_authinfo_2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kdelibs_authinfo_2.patch" Index: kio/kio/authinfo.cpp =================================================================== --- kio/kio/authinfo.cpp (revision 809180) +++ kio/kio/authinfo.cpp (working copy) @@ -41,19 +41,67 @@ using namespace KIO; -AuthInfo::AuthInfo() +////// + +class ExtraField { +public: + QString customTitle; // reserved for future use + AuthInfo::FieldFlags flags; + QVariant value; + + ExtraField() : flags(AuthInfo::ExtraFieldNoFlags) {} +}; + +QDataStream& operator<< (QDataStream& s, const ExtraField& extraField) +{ + s << extraField.customTitle; + s << (int)extraField.flags; + s << extraField.value; + return s; +} + +QDataStream& operator>> (QDataStream& s, ExtraField& extraField) +{ + s >> extraField.customTitle ; + int i; + s >> i; + extraField.flags = (AuthInfo::FieldFlags)i; + s >> extraField.value ; + return s; +} + + +class AuthInfoPrivate +{ +public: + AuthInfoPrivate() + {} + + QMap extraFields; +}; + + +////// + +AuthInfo::AuthInfo() : d(new AuthInfoPrivate()) +{ modified = false; readOnly = false; verifyPath = false; keepPassword = false; } -AuthInfo::AuthInfo( const AuthInfo& info ) +AuthInfo::AuthInfo( const AuthInfo& info ) : d(new AuthInfoPrivate()) { (*this) = info; } +AuthInfo::~AuthInfo() +{ + delete d; +} + AuthInfo& AuthInfo::operator= ( const AuthInfo& info ) { url = info.url; @@ -69,6 +117,7 @@ readOnly = info.readOnly; keepPassword = info.keepPassword; modified = info.modified; + d->extraFields = info.d->extraFields; return *this; } @@ -82,19 +131,50 @@ modified = flag; } +///// + +void AuthInfo::setExtraField(const QString &fieldName, const QVariant & value) +{ + d->extraFields[fieldName].value = value; +} + +void AuthInfo::setExtraFieldFlags(const QString &fieldName, const FieldFlags flags) +{ + d->extraFields[fieldName].flags = flags; +} + +QVariant AuthInfo::getExtraField(const QString &fieldName) const +{ + if (!d->extraFields.contains(fieldName)) return QVariant(); + return d->extraFields[fieldName].value; +} + +AuthInfo::FieldFlags AuthInfo::getExtraFieldFlags(const QString &fieldName) const +{ + if (!d->extraFields.contains(fieldName)) return AuthInfo::ExtraFieldNoFlags; + return d->extraFields[fieldName].flags; +} + +///// + QDataStream& KIO::operator<< (QDataStream& s, const AuthInfo& a) { - s << a.url << a.username << a.password << a.prompt << a.caption + s << (quint8)1 + << a.url << a.username << a.password << a.prompt << a.caption << a.comment << a.commentLabel << a.realmValue << a.digestInfo - << a.verifyPath << a.readOnly << a.keepPassword << a.modified; + << a.verifyPath << a.readOnly << a.keepPassword << a.modified + << a.d->extraFields; return s; } QDataStream& KIO::operator>> (QDataStream& s, AuthInfo& a) { - s >> a.url >> a.username >> a.password >> a.prompt >> a.caption + quint8 version; + s >> version + >> a.url >> a.username >> a.password >> a.prompt >> a.caption >> a.comment >> a.commentLabel >> a.realmValue >> a.digestInfo - >> a.verifyPath >> a.readOnly >> a.keepPassword >> a.modified; + >> a.verifyPath >> a.readOnly >> a.keepPassword >> a.modified + >> a.d->extraFields; return s; } Index: kio/kio/authinfo.h =================================================================== --- kio/kio/authinfo.h (revision 809180) +++ kio/kio/authinfo.h (working copy) @@ -28,6 +28,8 @@ #include #include +class AuthInfoPrivate; + namespace KIO { /** @@ -56,6 +58,7 @@ KIO_EXPORT friend QDataStream& operator>> (QDataStream& s, AuthInfo& a); public: + /** * Default constructor. */ @@ -65,8 +68,14 @@ * Copy constructor. */ AuthInfo( const AuthInfo& info ); - + /** + * Destructor + * @since 4.1 + */ + ~AuthInfo(); + + /** * Overloaded equal to operator. */ AuthInfo& operator=( const AuthInfo& info ); @@ -219,12 +228,54 @@ * cached password is deleted right after the application using * it has been closed. */ - bool keepPassword; - + bool keepPassword; + + /** + * Flags for extra fields + * @since 4.1 + */ + enum FieldFlags + { + ExtraFieldNoFlags = 0, + ExtraFieldReadOnly = 1<<1, + ExtraFieldMandatory = 1<<2 + }; + + /** + * Set Extra Field Value. + * Currently supported extra-fields: + * "domain" (QString), + * "anonymous" (bool) + * Setting it to an invalid QVariant() will disable the field. + * Extra Fields are disabled by default. + * @since 4.1 + */ + void setExtraField(const QString &fieldName, const QVariant & value); + + /** + * Set Extra Field Flags + * @since 4.1 + */ + void setExtraFieldFlags(const QString &fieldName, const FieldFlags flags); + + /** + * Get Extra Field Value + * Check QVariant::isValid() to find out if the field exists. + * @since 4.1 + */ + QVariant getExtraField(const QString &fieldName) const; + + /** + * Get Extra Field Flags + * @since 4.1 + */ + AuthInfo::FieldFlags getExtraFieldFlags(const QString &fieldName) const; + protected: bool modified; private: - class AuthInfoPrivate* d; + friend class AuthInfoPrivate; + AuthInfoPrivate * const d; }; KIO_EXPORT QDataStream& operator<< (QDataStream& s, const AuthInfo& a); Index: kdeui/dialogs/kpassworddialog.h =================================================================== --- kdeui/dialogs/kpassworddialog.h (revision 809180) +++ kdeui/dialogs/kpassworddialog.h (working copy) @@ -73,7 +73,22 @@ /** * If this flag is set, the login lineedit will be in read only mode. */ - UsernameReadOnly = 0x04 + UsernameReadOnly = 0x04, + /** + * If this flag is set, the Anonymous Login checkbox will be displayed + * @since 4.1 + */ + ShowAnonymousLoginCheckBox = 0x08, + /** + * If this flag is set, there will be an additional line to let the user enter the domain. + * @since 4.1 + */ + ShowDomainLine = 0x10, + /** + * If this flag is set, the domain lineedit will be in read only mode. + * @since 4.1 + */ + DomainReadOnly = 0x20 }; Q_DECLARE_FLAGS(KPasswordDialogFlags, KPasswordDialogFlag) @@ -85,7 +100,7 @@ * A problem with the user name as entered **/ UsernameError, - + /** * Incorrect password */ @@ -94,7 +109,13 @@ /** * Error preventing further attempts, will result in disabling most of the interface */ - FatalError + FatalError, + + /** + * A problem with the domain as entered + * @since 4.1 + **/ + DomainError }; /** @@ -172,6 +193,31 @@ QString username() const; /** + * set the default domain. + * @since 4.1 + */ + void setDomain(const QString&); + + /** + * Returns the domain entered by the user. + * @return the domain name + * @since 4.1 + */ + QString domain() const; + + /** + * set anonymous mode (all other fields will be greyed out) + * @since 4.1 + */ + void setAnonymousMode(bool anonymous); + + /** + * @return anonymous mode has been selected. + * @since 4.1 + */ + bool anonymousMode() const; + + /** * Determines whether supplied authorization should * persist even after the application has been closed. * @@ -250,6 +296,7 @@ private: Q_PRIVATE_SLOT(d, void actuallyAccept()) Q_PRIVATE_SLOT(d, void activated( const QString& userName )) + Q_PRIVATE_SLOT(d, void updateFields()) private: class KPasswordDialogPrivate; Index: kdeui/dialogs/kpassworddialog.ui =================================================================== --- kdeui/dialogs/kpassworddialog.ui (revision 809180) +++ kdeui/dialogs/kpassworddialog.ui (working copy) @@ -116,6 +116,23 @@ + + + Anonymous + + + + + + + Domain: + + + domainEdit + + + + Password: @@ -125,14 +142,14 @@ - + true - + Remember password @@ -142,6 +159,9 @@ + + + @@ -171,6 +191,8 @@ userEdit + anonymousCheckBox + domainEdit passEdit keepCheckBox Index: kdeui/dialogs/kpassworddialog.cpp =================================================================== --- kdeui/dialogs/kpassworddialog.cpp (revision 809180) +++ kdeui/dialogs/kpassworddialog.cpp (working copy) @@ -50,9 +50,11 @@ void actuallyAccept(); void activated( const QString& userName ); - void init( const KPasswordDialogFlags& flags ); + void updateFields(); + void init(); KPasswordDialog *q; + KPasswordDialogFlags m_flags; Ui_KPasswordDialog ui; QMap knownLogins; KComboBox* userEditCombo; @@ -69,7 +71,8 @@ setButtons( Ok | Cancel | otherButtons ); showButtonSeparator( true ); setDefaultButton( Ok ); - d->init ( flags ); + d->m_flags = flags; + d->init (); } KPasswordDialog::~KPasswordDialog() @@ -77,26 +80,61 @@ delete d; } -void KPasswordDialog::KPasswordDialogPrivate::init( const KPasswordDialogFlags& flags ) +void KPasswordDialog::KPasswordDialogPrivate::updateFields() { + if (q->anonymousMode()) + { + ui.userEdit->setEnabled( false ); + ui.domainEdit->setEnabled( false ); + ui.passEdit->setEnabled( false ); + } + else + { + ui.userEdit->setEnabled(!( m_flags & KPasswordDialog::UsernameReadOnly )); + ui.domainEdit->setEnabled(!( m_flags & KPasswordDialog::DomainReadOnly )); + ui.passEdit->setEnabled( true ); + } +} + +void KPasswordDialog::KPasswordDialogPrivate::init() +{ ui.setupUi( q->mainWidget() ); ui.errorMessage->setHidden(true); // Row 4: Username field - if ( flags & KPasswordDialog::ShowUsernameLine ) { + if ( m_flags & KPasswordDialog::ShowUsernameLine ) { ui.userEdit->setFocus(); QObject::connect( ui.userEdit, SIGNAL(returnPressed()), ui.passEdit, SLOT(setFocus()) ); } else { ui.userNameLabel->hide(); ui.userEdit->hide(); + ui.domainLabel->hide(); + ui.domainEdit->hide(); ui.passEdit->setFocus(); } - if ( !( flags & KPasswordDialog::ShowKeepPassword ) ) + if ( !( m_flags & KPasswordDialog::ShowAnonymousLoginCheckBox ) ) { + ui.anonymousCheckBox->hide(); + } + else + { + QObject::connect( ui.anonymousCheckBox, SIGNAL(stateChanged (int)), q, SLOT(updateFields()) ); + } + + if ( !( m_flags & KPasswordDialog::ShowDomainLine ) ) + { + ui.domainLabel->hide(); + ui.domainEdit->hide(); + } + + if ( !( m_flags & KPasswordDialog::ShowKeepPassword ) ) + { ui.keepCheckBox->hide(); } + updateFields(); + QRect desktop = KGlobalSettings::desktopGeometry(q->topLevelWidget()); q->setFixedWidth(qMin(1000, qMax(400, desktop.width() / 4))); q->setPixmap(KIcon("dialog-password").pixmap(KIconLoader::SizeHuge)); @@ -148,6 +186,27 @@ return d->ui.passEdit->text(); } +void KPasswordDialog::setDomain(const QString& domain) +{ + d->ui.domainEdit->setText(domain); +} + +QString KPasswordDialog::domain() const +{ + return d->ui.domainEdit->text(); +} + +void KPasswordDialog::setAnonymousMode(bool anonymous) +{ + d->ui.anonymousCheckBox->setChecked( anonymous ); +} + +bool KPasswordDialog::anonymousMode() const +{ + return d->ui.anonymousCheckBox->isChecked(); +} + + void KPasswordDialog::setKeepPassword( bool b ) { d->ui.keepCheckBox->setChecked( b ); @@ -173,9 +232,12 @@ ++d->commentRow; d->ui.gridLayout->addWidget(d->ui.userNameLabel, d->commentRow, 0); d->ui.gridLayout->addWidget(d->ui.userEdit, d->commentRow, 1); - d->ui.gridLayout->addWidget(d->ui.passwordLabel, d->commentRow + 1, 0); - d->ui.gridLayout->addWidget(d->ui.passEdit, d->commentRow + 1, 1); - d->ui.gridLayout->addWidget(d->ui.keepCheckBox, d->commentRow + 2, 1); + d->ui.gridLayout->addWidget(d->ui.anonymousCheckBox, d->commentRow + 1, 1); + d->ui.gridLayout->addWidget(d->ui.domainLabel, d->commentRow + 2, 0); + d->ui.gridLayout->addWidget(d->ui.domainEdit, d->commentRow + 2, 1); + d->ui.gridLayout->addWidget(d->ui.passwordLabel, d->commentRow + 3, 0); + d->ui.gridLayout->addWidget(d->ui.passEdit, d->commentRow + 3, 1); + d->ui.gridLayout->addWidget(d->ui.keepCheckBox, d->commentRow + 4, 1); // cycle through column 0 widgets and see the max width so we can set the minimum height of // column 2 wordwrapable labels @@ -213,8 +275,15 @@ { d->ui.userNameLabel->setFont( bold ); d->ui.userEdit->setFocus(); - break; } + break; + case DomainError: + if ( d->ui.domainEdit->isVisibleTo( this ) ) + { + d->ui.domainLabel->setFont( bold ); + d->ui.domainEdit->setFocus(); + } + break; case FatalError: d->ui.userNameLabel->setEnabled( false ); d->ui.userEdit->setEnabled( false ); --------------060003050907020601060707 Content-Type: text/x-diff; name="kdebase_kpasswdserver2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kdebase_kpasswdserver2.patch" Index: runtime/kpasswdserver/kpasswdserver.cpp =================================================================== --- runtime/kpasswdserver/kpasswdserver.cpp (revision 809205) +++ runtime/kpasswdserver/kpasswdserver.cpp (working copy) @@ -49,14 +49,18 @@ ) K_EXPORT_PLUGIN(KPasswdServerFactory("kpasswdserver")) +#define AUTHINFO_EXTRAFIELD_DOMAIN "domain" +#define AUTHINFO_EXTRAFIELD_ANONYMOUS "anonymous" +#define AUTHINFO_EXTRAFIELD_BYPASS_CACHE_AND_KWALLET "bypass-cache-and-kwallet" + int -KPasswdServer::AuthInfoList::compareItems(Q3PtrCollection::Item n1, Q3PtrCollection::Item n2) +KPasswdServer::AuthInfoContainerList::compareItems(Q3PtrCollection::Item n1, Q3PtrCollection::Item n2) { if (!n1 || !n2) return 0; - AuthInfo *i1 = (AuthInfo *) n1; - AuthInfo *i2 = (AuthInfo *) n2; + AuthInfoContainer *i1 = (AuthInfoContainer *) n1; + AuthInfoContainer *i2 = (AuthInfoContainer *) n2; int l1 = i1->directory.length(); int l2 = i2->directory.length(); @@ -214,7 +218,7 @@ return data; // return value will be ignored } - const AuthInfo *result = findAuthInfoItem(key, info); + const AuthInfoContainer *result = findAuthInfoItem(key, info); if (!result || result->isCanceled) { if (!result && @@ -332,12 +336,13 @@ return; KIO::AuthInfo &info = request->info; - + bool bypassCacheAndKWallet = info.getExtraField(AUTHINFO_EXTRAFIELD_BYPASS_CACHE_AND_KWALLET).toBool() == true; + kDebug(130) << "KPasswdServer::processRequest: User= " << info.username << ", Message= " << info.prompt << endl; - const AuthInfo *result = findAuthInfoItem(request->key, request->info); + const AuthInfoContainer *result = findAuthInfoItem(request->key, request->info); - if (result && (request->seqNr < result->seqNr)) + if (!bypassCacheAndKWallet && result && (request->seqNr < result->seqNr)) { kDebug(130) << "KPasswdServer::processRequest: auto retry!"; if (result->isCanceled) @@ -373,7 +378,8 @@ bool hasWalletData = false; QMap knownLogins; - if ( ( username.isEmpty() || password.isEmpty() ) + if ( !bypassCacheAndKWallet + && ( username.isEmpty() || password.isEmpty() ) && !KWallet::Wallet::keyDoesNotExist(KWallet::Wallet::NetworkWallet(), KWallet::Wallet::PasswordFolder(), makeWalletKey( request->key, info.realmValue )) ) { // no login+pass provided, check if kwallet has one @@ -381,7 +387,28 @@ hasWalletData = readFromWallet( m_wallet, request->key, info.realmValue, username, password, info.readOnly, knownLogins ); } - KPasswordDialog dlg( 0l, info.keepPassword ? ( KPasswordDialog::ShowUsernameLine | KPasswordDialog::ShowKeepPassword) : KPasswordDialog::ShowUsernameLine ) ; + // assemble dialog-flags + KPasswordDialog::KPasswordDialogFlags dialogFlags; + + if (info.getExtraField(AUTHINFO_EXTRAFIELD_DOMAIN).isValid()) + { + dialogFlags |= KPasswordDialog::ShowDomainLine; + if (info.getExtraFieldFlags(AUTHINFO_EXTRAFIELD_DOMAIN) & KIO::AuthInfo::ExtraFieldReadOnly) + { + dialogFlags |= KPasswordDialog::DomainReadOnly; + } + } + + if (info.getExtraField(AUTHINFO_EXTRAFIELD_ANONYMOUS).isValid()) + { + dialogFlags |= KPasswordDialog::ShowAnonymousLoginCheckBox; + } + + dialogFlags |= (info.keepPassword ? ( KPasswordDialog::ShowUsernameLine + | KPasswordDialog::ShowKeepPassword) : KPasswordDialog::ShowUsernameLine ); + + // instantiate dialog + KPasswordDialog dlg( 0l, dialogFlags) ; dlg.setPrompt(info.prompt); dlg.setUsername(username); if (info.caption.isEmpty()) @@ -403,6 +430,12 @@ if (hasWalletData) dlg.setKeepPassword( true ); + if (info.getExtraField(AUTHINFO_EXTRAFIELD_DOMAIN).isValid ()) + dlg.setDomain(info.getExtraField(AUTHINFO_EXTRAFIELD_DOMAIN).toString()); + + if (info.getExtraField(AUTHINFO_EXTRAFIELD_ANONYMOUS).isValid ()) + dlg.setAnonymousMode(info.getExtraField(AUTHINFO_EXTRAFIELD_ANONYMOUS).toBool()); + #ifdef Q_WS_X11 XSetTransientForHint( QX11Info::display(), dlg.winId(), request->windowId); #endif @@ -414,6 +447,11 @@ info.username = dlg.username(); info.password = dlg.password(); info.keepPassword = dlg.keepPassword(); + + if (info.getExtraField(AUTHINFO_EXTRAFIELD_DOMAIN).isValid ()) + info.setExtraField(AUTHINFO_EXTRAFIELD_DOMAIN, dlg.domain()); + if (info.getExtraField(AUTHINFO_EXTRAFIELD_ANONYMOUS).isValid ()) + info.setExtraField(AUTHINFO_EXTRAFIELD_ANONYMOUS, dlg.anonymousMode()); // When the user checks "keep password", that means: // * if the wallet is enabled, store it there for long-term, and in kpasswdserver @@ -430,12 +468,18 @@ } if ( dlgResult != QDialog::Accepted ) { - addAuthInfoItem(request->key, info, 0, m_seqNr, true); + if (!bypassCacheAndKWallet) + { + addAuthInfoItem(request->key, info, 0, m_seqNr, true); + } info.setModified( false ); } else { - addAuthInfoItem(request->key, info, request->windowId, m_seqNr, false); + if (!bypassCacheAndKWallet) + { + addAuthInfoItem(request->key, info, request->windowId, m_seqNr, false); + } info.setModified( true ); } } @@ -478,7 +522,7 @@ } else { - const AuthInfo *result = findAuthInfoItem(waitRequest->key, waitRequest->info); + const AuthInfoContainer *result = findAuthInfoItem(waitRequest->key, waitRequest->info); QByteArray replyData; QDataStream stream2(&replyData, QIODevice::WriteOnly); @@ -535,31 +579,26 @@ } KIO::AuthInfo -KPasswdServer::copyAuthInfo(const AuthInfo *i) +KPasswdServer::copyAuthInfo(const AuthInfoContainer *i) { - KIO::AuthInfo result; - result.url = i->url; - result.username = i->username; - result.password = i->password; - result.realmValue = i->realmValue; - result.digestInfo = i->digestInfo; + KIO::AuthInfo result = i->info; result.setModified(true); return result; } -const KPasswdServer::AuthInfo * +const KPasswdServer::AuthInfoContainer * KPasswdServer::findAuthInfoItem(const QString &key, const KIO::AuthInfo &info) { - AuthInfoList *authList = m_authDict.value(key); + AuthInfoContainerList *authList = m_authDict.value(key); if (!authList) return 0; QString path2 = info.url.directory(KUrl::AppendTrailingSlash|KUrl::ObeyTrailingSlash); - for(AuthInfo *current = authList->first(); + for(AuthInfoContainer *current = authList->first(); current; ) { - if ((current->expire == AuthInfo::expTime) && + if ((current->expire == AuthInfoContainer::expTime) && (difftime(time(0), current->expireTime) > 0)) { authList->remove(); @@ -571,13 +610,13 @@ { QString path1 = current->directory; if (path2.startsWith(path1) && - (info.username.isEmpty() || info.username == current->username)) + (info.username.isEmpty() || info.username == current->info.username)) return current; } else { - if (current->realmValue == info.realmValue && - (info.username.isEmpty() || info.username == current->username)) + if (current->info.realmValue == info.realmValue && + (info.username.isEmpty() || info.username == current->info.username)) return current; // TODO: Update directory info, } @@ -589,14 +628,14 @@ void KPasswdServer::removeAuthInfoItem(const QString &key, const KIO::AuthInfo &info) { - AuthInfoList *authList = m_authDict.value(key); + AuthInfoContainerList *authList = m_authDict.value(key); if (!authList) return; - for(AuthInfo *current = authList->first(); + for(AuthInfoContainer *current = authList->first(); current; ) { - if (current->realmValue == info.realmValue) + if (current->info.realmValue == info.realmValue) { authList->remove(); current = authList->current(); @@ -616,16 +655,16 @@ void KPasswdServer::addAuthInfoItem(const QString &key, const KIO::AuthInfo &info, qlonglong windowId, qlonglong seqNr, bool canceled) { - AuthInfoList *authList = m_authDict.value(key); + AuthInfoContainerList *authList = m_authDict.value(key); if (!authList) { - authList = new AuthInfoList; + authList = new AuthInfoContainerList; m_authDict.insert(key, authList); } - AuthInfo *current = authList->first(); + AuthInfoContainer *current = authList->first(); for(; current; current = authList->next()) { - if (current->realmValue == info.realmValue) + if (current->info.realmValue == info.realmValue) { authList->take(); break; @@ -634,21 +673,17 @@ if (!current) { - current = new AuthInfo; - current->expire = AuthInfo::expTime; - kDebug(130) << "Creating AuthInfo"; + current = new AuthInfoContainer; + current->expire = AuthInfoContainer::expTime; + kDebug(130) << "Creating AuthInfoContainer"; } else { - kDebug(130) << "Updating AuthInfo"; + kDebug(130) << "Updating AuthInfoContainer"; } - current->url = info.url; + current->info = info; current->directory = info.url.directory(KUrl::AppendTrailingSlash|KUrl::ObeyTrailingSlash); - current->username = info.username; - current->password = info.password; - current->realmValue = info.realmValue; - current->digestInfo = info.digestInfo; current->seqNr = seqNr; current->isCanceled = canceled; @@ -659,20 +694,20 @@ } void -KPasswdServer::updateAuthExpire(const QString &key, const AuthInfo *auth, qlonglong windowId, bool keep) +KPasswdServer::updateAuthExpire(const QString &key, const AuthInfoContainer *auth, qlonglong windowId, bool keep) { - AuthInfo *current = const_cast(auth); + AuthInfoContainer *current = const_cast(auth); if (keep) { - current->expire = AuthInfo::expNever; + current->expire = AuthInfoContainer::expNever; } - else if (windowId && (current->expire != AuthInfo::expNever)) + else if (windowId && (current->expire != AuthInfoContainer::expNever)) { - current->expire = AuthInfo::expWindowClose; + current->expire = AuthInfoContainer::expWindowClose; if (!current->windowList.contains(windowId)) current->windowList.append(windowId); } - else if (current->expire == AuthInfo::expTime) + else if (current->expire == AuthInfoContainer::expTime) { current->expireTime = time(0)+10; } @@ -701,14 +736,14 @@ it != keysChanged->end(); ++it) { QString key = *it; - AuthInfoList *authList = m_authDict.value(key); + AuthInfoContainerList *authList = m_authDict.value(key); if (!authList) continue; - AuthInfo *current = authList->first(); + AuthInfoContainer *current = authList->first(); for(; current; ) { - if (current->expire == AuthInfo::expWindowClose) + if (current->expire == AuthInfoContainer::expWindowClose) { if (current->windowList.removeAll(windowId) && current->windowList.isEmpty()) { Index: runtime/kpasswdserver/kpasswdserver.h =================================================================== --- runtime/kpasswdserver/kpasswdserver.h (revision 809205) +++ runtime/kpasswdserver/kpasswdserver.h (working copy) @@ -53,27 +53,23 @@ void removeAuthForWindowId(qlonglong windowId); protected: - struct AuthInfo; + struct AuthInfoContainer; QString createCacheKey( const KIO::AuthInfo &info ); - const AuthInfo *findAuthInfoItem(const QString &key, const KIO::AuthInfo &info); + const AuthInfoContainer *findAuthInfoItem(const QString &key, const KIO::AuthInfo &info); void removeAuthInfoItem(const QString &key, const KIO::AuthInfo &info); void addAuthInfoItem(const QString &key, const KIO::AuthInfo &info, qlonglong windowId, qlonglong seqNr, bool canceled); - KIO::AuthInfo copyAuthInfo(const AuthInfo *); - void updateAuthExpire(const QString &key, const AuthInfo *, qlonglong windowId, bool keep); + KIO::AuthInfo copyAuthInfo(const AuthInfoContainer *); + void updateAuthExpire(const QString &key, const AuthInfoContainer *, qlonglong windowId, bool keep); int findWalletEntry( const QMap& map, const QString& username ); bool openWallet( int windowId ); - struct AuthInfo { - AuthInfo() { expire = expNever; isCanceled = false; seqNr = 0; } + struct AuthInfoContainer { + AuthInfoContainer() { expire = expNever; isCanceled = false; seqNr = 0; } - KUrl url; + KIO::AuthInfo info; QString directory; - QString username; - QString password; - QString realmValue; - QString digestInfo; - + enum { expNever, expWindowClose, expTime } expire; QList windowList; qulonglong expireTime; @@ -82,14 +78,14 @@ bool isCanceled; }; - class AuthInfoList : public Q3PtrList + class AuthInfoContainerList : public Q3PtrList { public: - AuthInfoList() { setAutoDelete(true); } + AuthInfoContainerList() { setAutoDelete(true); } int compareItems(Q3PtrCollection::Item n1, Q3PtrCollection::Item n2); }; - QHash< QString, AuthInfoList* > m_authDict; + QHash< QString, AuthInfoContainerList* > m_authDict; struct Request { QDBusMessage transaction; --------------060003050907020601060707--