[auth] Add widget for editing an authcfg within a data source URI

This commit is contained in:
Larry Shaffer 2015-09-26 01:34:43 -06:00
parent 2f8e6846ab
commit c74ddf1eec
5 changed files with 518 additions and 33 deletions

View File

@ -9,5 +9,38 @@ class QgsAuthConfigSelect : QWidget
~QgsAuthConfigSelect(); ~QgsAuthConfigSelect();
void setConfigId( const QString& authcfg ); void setConfigId( const QString& authcfg );
const QString configId() const; const QString configId() const;
void setDataProviderKey( const QString &key );
signals:
void selectedConfigIdChanged( const QString& authcfg );
void selectedConfigIdRemoved( const QString& authcfg );
public slots:
void showMessage( const QString &msg );
void clearMessage();
};
class QgsAuthConfigUriEdit : QDialog
{
%TypeHeaderCode
#include <qgsauthconfigselect.h>
%End
public:
explicit QgsAuthConfigUriEdit( QWidget *parent /TransferThis/ = 0,
const QString &datauri = QString(),
const QString &dataprovider = QString() );
~QgsAuthConfigUriEdit();
void setDataSourceUri( const QString &datauri );
QString dataSourceUri();
static bool hasConfigID( const QString &txt );
}; };

View File

@ -19,10 +19,13 @@
#include <QHash> #include <QHash>
#include <QMessageBox> #include <QMessageBox>
#include <QTimer>
#include "qgsauthconfig.h" #include "qgsauthconfig.h"
#include "qgsauthguiutils.h"
#include "qgsauthmanager.h" #include "qgsauthmanager.h"
#include "qgsauthconfigedit.h" #include "qgsauthconfigedit.h"
#include "qgslogger.h"
QgsAuthConfigSelect::QgsAuthConfigSelect( QWidget *parent, const QString &dataprovider ) QgsAuthConfigSelect::QgsAuthConfigSelect( QWidget *parent, const QString &dataprovider )
@ -44,7 +47,11 @@ QgsAuthConfigSelect::QgsAuthConfigSelect( QWidget *parent, const QString &datapr
{ {
setupUi( this ); setupUi( this );
leConfigMsg->setStyleSheet( QString( "QLineEdit{background-color: %1}" )
.arg( QgsAuthGuiUtils::yellowColor().name() ) );
clearConfig(); clearConfig();
clearMessage();
populateConfigSelector(); populateConfigSelector();
} }
} }
@ -63,12 +70,20 @@ void QgsAuthConfigSelect::setConfigId( const QString& authcfg )
else else
{ {
if ( mAuthCfg != authcfg ) if ( mAuthCfg != authcfg )
{
mAuthCfg = authcfg; mAuthCfg = authcfg;
}
populateConfigSelector(); populateConfigSelector();
loadConfig(); loadConfig();
} }
} }
void QgsAuthConfigSelect::setDataProviderKey( const QString &key )
{
mDataProvider = key;
populateConfigSelector();
}
void QgsAuthConfigSelect::loadConfig() void QgsAuthConfigSelect::loadConfig()
{ {
clearConfig(); clearConfig();
@ -87,6 +102,7 @@ void QgsAuthConfigSelect::loadConfig()
btnConfigEdit->setEnabled( true ); btnConfigEdit->setEnabled( true );
btnConfigRemove->setEnabled( true ); btnConfigRemove->setEnabled( true );
} }
emit selectedConfigIdChanged( mAuthCfg );
} }
void QgsAuthConfigSelect::clearConfig() void QgsAuthConfigSelect::clearConfig()
@ -101,6 +117,7 @@ void QgsAuthConfigSelect::validateConfig()
{ {
if ( !mAuthCfg.isEmpty() && !mConfigs.contains( mAuthCfg ) ) if ( !mAuthCfg.isEmpty() && !mConfigs.contains( mAuthCfg ) )
{ {
showMessage( tr( "Configuration '%1' not in database" ).arg( mAuthCfg ) );
mAuthCfg.clear(); mAuthCfg.clear();
} }
} }
@ -137,6 +154,18 @@ void QgsAuthConfigSelect::populateConfigSelector()
cmbConfigSelect->setCurrentIndex( indx > 0 ? indx : 0 ); cmbConfigSelect->setCurrentIndex( indx > 0 ? indx : 0 );
} }
void QgsAuthConfigSelect::showMessage( const QString &msg )
{
leConfigMsg->setText( msg );
frConfigMsg->setVisible( true );
}
void QgsAuthConfigSelect::clearMessage()
{
leConfigMsg->clear();
frConfigMsg->setVisible( false );
}
void QgsAuthConfigSelect::loadAvailableConfigs() void QgsAuthConfigSelect::loadAvailableConfigs()
{ {
mConfigs.clear(); mConfigs.clear();
@ -173,7 +202,7 @@ void QgsAuthConfigSelect::on_btnConfigEdit_clicked()
ace->setWindowModality( Qt::WindowModal ); ace->setWindowModality( Qt::WindowModal );
if ( ace->exec() ) if ( ace->exec() )
{ {
qDebug( "Edit returned config Id: %s", ace->configId().toAscii().constData() ); //qDebug( "Edit returned config Id: %s", ace->configId().toAscii().constData() );
setConfigId( ace->configId() ); setConfigId( ace->configId() );
} }
ace->deleteLater(); ace->deleteLater();
@ -192,6 +221,188 @@ void QgsAuthConfigSelect::on_btnConfigRemove_clicked()
if ( QgsAuthManager::instance()->removeAuthenticationConfig( mAuthCfg ) ) if ( QgsAuthManager::instance()->removeAuthenticationConfig( mAuthCfg ) )
{ {
emit selectedConfigIdRemoved( mAuthCfg );
setConfigId( QString() ); setConfigId( QString() );
} }
} }
void QgsAuthConfigSelect::on_btnConfigMsgClear_clicked()
{
clearMessage();
}
//////////////// Embed in dialog ///////////////////
#include <QPushButton>
QgsAuthConfigUriEdit::QgsAuthConfigUriEdit( QWidget *parent, const QString &datauri, const QString &dataprovider )
: QDialog( parent )
, mAuthCfg( QString() )
, mDataUri( QString() )
, mDataUriOrig( QString() )
{
setupUi( this );
setWindowTitle( tr( "Authentication Config ID String Editor" ) );
buttonBox->button( QDialogButtonBox::Close )->setDefault( true );
connect( buttonBox, SIGNAL( rejected() ), this, SLOT( close() ) );
connect( buttonBox, SIGNAL( accepted() ), this, SLOT( saveChanges() ) );
connect( buttonBox->button( QDialogButtonBox::Reset ), SIGNAL( clicked() ), this, SLOT( resetChanges() ) );
connect( wdgtAuthSelect, SIGNAL( selectedConfigIdChanged( QString ) ), this , SLOT( authCfgUpdated( QString ) ) );
connect( wdgtAuthSelect, SIGNAL( selectedConfigIdRemoved( QString ) ), this , SLOT( authCfgRemoved( QString ) ) );
wdgtAuthSelect->setDataProviderKey( dataprovider );
setDataSourceUri( datauri );
}
QgsAuthConfigUriEdit::~QgsAuthConfigUriEdit()
{
}
void QgsAuthConfigUriEdit::setDataSourceUri( const QString &datauri )
{
if ( datauri.isEmpty() )
return;
mDataUri = mDataUriOrig = datauri;
teDataUri->setPlainText( mDataUri );
if ( authCfgIndex() == -1 )
{
wdgtAuthSelect->showMessage( tr( "No authcfg in Data Source URI" ) );
return;
}
selectAuthCfgInUri();
mAuthCfg = authCfgFromUri();
QgsDebugMsg( QString( "Parsed authcfg ID: %1" ).arg( mAuthCfg ) );
wdgtAuthSelect->blockSignals( true );
wdgtAuthSelect->setConfigId( mAuthCfg );
wdgtAuthSelect->blockSignals( false );
}
QString QgsAuthConfigUriEdit::dataSourceUri()
{
return mDataUri;
}
bool QgsAuthConfigUriEdit::hasConfigID( const QString &txt )
{
return QgsAuthManager::instance()->hasConfigId( txt );
}
void QgsAuthConfigUriEdit::saveChanges()
{
this->accept();
}
void QgsAuthConfigUriEdit::resetChanges()
{
wdgtAuthSelect->clearMessage();
setDataSourceUri( mDataUriOrig );
}
void QgsAuthConfigUriEdit::authCfgUpdated( const QString &authcfg )
{
mAuthCfg = authcfg;
if ( mAuthCfg.size() != 7 )
{
mAuthCfg.clear();
removeAuthCfgFromUri();
}
else
{
updateUriWithAuthCfg();
}
teDataUri->clear();
teDataUri->setPlainText( mDataUri );
selectAuthCfgInUri();
}
void QgsAuthConfigUriEdit::authCfgRemoved( const QString &authcfg )
{
if ( authCfgFromUri() == authcfg )
{
removeAuthCfgFromUri();
}
}
int QgsAuthConfigUriEdit::authCfgIndex()
{
QRegExp rx( QgsAuthManager::instance()->configIdRegex() );
return rx.indexIn( mDataUri );
}
QString QgsAuthConfigUriEdit::authCfgFromUri()
{
int startindex = authCfgIndex();
if ( startindex == -1 )
return QString();
return mDataUri.mid( startindex + 8, 7 );
}
void QgsAuthConfigUriEdit::selectAuthCfgInUri()
{
int startindex = authCfgIndex();
if ( startindex == -1 )
return;
// authcfg=.{7} will always be 15 chars
QTextCursor tc = teDataUri->textCursor();
tc.setPosition( startindex );
tc.setPosition( startindex + 15, QTextCursor::KeepAnchor );
teDataUri->setTextCursor( tc );
teDataUri->setFocus();
}
void QgsAuthConfigUriEdit::updateUriWithAuthCfg()
{
int startindex = authCfgIndex();
if ( startindex == -1 )
{
if ( mAuthCfg.size() == 7 )
{
wdgtAuthSelect->showMessage( tr( "Adding authcfg to URI not supported" ) );
}
return;
}
mDataUri = mDataUri.replace( startindex + 8, 7, mAuthCfg );
}
void QgsAuthConfigUriEdit::removeAuthCfgFromUri()
{
int startindex = authCfgIndex();
if ( startindex == -1 )
return;
// add any preceding space so two spaces will not result after removal
int rmvlen = 15;
if ( startindex - 1 >= 0
&& ( mDataUri.at( startindex - 1 ).isSpace()
|| mDataUri.at( startindex - 1 ) == QChar( '&' ) ) )
{
startindex -= 1;
rmvlen += 1;
}
// trim any leftover spaces or & from ends
mDataUri = mDataUri.remove( startindex, rmvlen ).trimmed();
if ( mDataUri.at( 0 ) == QChar( '&' ) )
mDataUri = mDataUri.remove( 0, 1 );
// trim any & from
mAuthCfg.clear();
}

View File

@ -46,6 +46,23 @@ class GUI_EXPORT QgsAuthConfigSelect : public QWidget, private Ui::QgsAuthConfig
/** Get the authentication config id for the resource */ /** Get the authentication config id for the resource */
const QString configId() const { return mAuthCfg; } const QString configId() const { return mAuthCfg; }
/** Set key of layer provider, if applicable */
void setDataProviderKey( const QString &key );
signals:
/** Emitted when authentication config is changed or missing */
void selectedConfigIdChanged( const QString& authcfg );
/** Emitted when authentication config is removed */
void selectedConfigIdRemoved( const QString& authcfg );
public slots:
/** Show a small message bar with a close button */
void showMessage( const QString &msg );
/** Clear and hide small message bar */
void clearMessage();
private slots: private slots:
void loadConfig(); void loadConfig();
void clearConfig(); void clearConfig();
@ -60,6 +77,8 @@ class GUI_EXPORT QgsAuthConfigSelect : public QWidget, private Ui::QgsAuthConfig
void on_btnConfigRemove_clicked(); void on_btnConfigRemove_clicked();
void on_btnConfigMsgClear_clicked();
private: private:
void loadAvailableConfigs(); void loadAvailableConfigs();
@ -71,4 +90,65 @@ class GUI_EXPORT QgsAuthConfigSelect : public QWidget, private Ui::QgsAuthConfig
QLabel *mAuthNotify; QLabel *mAuthNotify;
}; };
//////////////// Embed in dialog ///////////////////
#include "ui_qgsauthconfiguriedit.h"
class QPushButton;
/** \ingroup gui
* Dialog wrapper of select widget to edit an authcfg in a data source URI
*/
class GUI_EXPORT QgsAuthConfigUriEdit : public QDialog, private Ui::QgsAuthConfigUriEdit
{
Q_OBJECT
public:
/**
* Construct wrapper dialog for select widget to edit an authcfg in a data source URI
* @param parent Parent widget
* @param datauri URI QString with of without an authcfg=ID string
* @param dataprovider The key of the calling layer provider, if applicable
*/
explicit QgsAuthConfigUriEdit( QWidget *parent = 0,
const QString &datauri = QString(),
const QString &dataprovider = QString() );
~QgsAuthConfigUriEdit();
/** Set the data source URI to parse */
void setDataSourceUri( const QString &datauri );
/** The returned, possibly edited data source URI */
QString dataSourceUri();
/** Whether a string conatins an authcfg ID */
static bool hasConfigID( const QString &txt );
private slots:
void saveChanges();
void resetChanges();
void authCfgUpdated( const QString &authcfg );
void authCfgRemoved( const QString &authcfg );
private:
int authCfgIndex();
QString authCfgFromUri();
void selectAuthCfgInUri();
void updateUriWithAuthCfg();
void removeAuthCfgFromUri();
QString mAuthCfg;
QString mDataUri;
QString mDataUriOrig;
QPushButton *mResetButton;
};
#endif // QGSAUTHCONFIGSELECT_H #endif // QGSAUTHCONFIGSELECT_H

View File

@ -14,9 +14,31 @@
<string>Authentication Configuration</string> <string>Authentication Configuration</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QGridLayout" name="gridLayout">
<item> <property name="verticalSpacing">
<number>10</number>
</property>
<item row="1" column="1">
<widget class="QToolButton" name="btnConfigAdd">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="cmbConfigSelect"> <widget class="QComboBox" name="cmbConfigSelect">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
@ -32,43 +54,73 @@
</property> </property>
</widget> </widget>
</item> </item>
<item> <item row="0" column="0" colspan="2">
<spacer name="horizontalSpacer_2"> <widget class="QFrame" name="frConfigMsg">
<property name="orientation"> <property name="frameShape">
<enum>Qt::Horizontal</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
<property name="sizeType"> <property name="frameShadow">
<enum>QSizePolicy::MinimumExpanding</enum> <enum>QFrame::Raised</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnConfigAdd">
<property name="text">
<string>Add</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="leConfigMsg">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnConfigMsgClear">
<property name="minimumSize">
<size>
<width>26</width>
<height>22</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>26</width>
<height>22</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mIconClose.png</normaloff>:/images/themes/default/mIconClose.png</iconset>
</property>
<property name="iconSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QLineEdit" name="leConfigMethodDesc">
<property name="styleSheet">
<string notr="true">QLineEdit{color: rgb(128, 128, 128);}</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="styleSheet"> <property name="styleSheet">
@ -126,6 +178,16 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="1">
<widget class="QLineEdit" name="leConfigMethodDesc">
<property name="styleSheet">
<string notr="true">QLineEdit{color: rgb(128, 128, 128);}</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -143,6 +205,8 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources>
<include location="../../../images/images.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsAuthConfigUriEdit</class>
<widget class="QDialog" name="QgsAuthConfigUriEdit">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>449</width>
<height>449</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Edit authentication configuration ID</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<widget class="QPlainTextEdit" name="teDataUri">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>75</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QgsAuthConfigSelect" name="wdgtAuthSelect" native="true"/>
</item>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(128, 128, 128);</string>
</property>
<property name="text">
<string>Note: Button actions above affect authentication database</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close|QDialogButtonBox::Reset|QDialogButtonBox::Save</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsAuthConfigSelect</class>
<extends>QWidget</extends>
<header>qgsauthconfigselect.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>