Android: Improve the Keystore and Certificate dialog.

- Display all information in one place.
- Checkbox to enable the certificate to use the same password as the
  Keystore.
- Display information when alias field is empty.
- Misc. layout changes.

Task-number: QTCREATORBUG-10061
Change-Id: I99a3e7019dfbf72bcd2374594f3ebe45c26680d2
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Reviewed-by: BogDan Vatra <bogdan@kde.org>
This commit is contained in:
Christian Strømme
2013-08-29 18:53:52 +02:00
committed by Christian Stromme
parent e90633a8fa
commit ba1d8e2c4d
3 changed files with 296 additions and 240 deletions

View File

@@ -46,6 +46,8 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare
connect(ui->keystoreRetypePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkKeystorePassword())); connect(ui->keystoreRetypePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkKeystorePassword()));
connect(ui->certificatePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCertificatePassword())); connect(ui->certificatePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCertificatePassword()));
connect(ui->certificateRetypePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCertificatePassword())); connect(ui->certificateRetypePassLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCertificatePassword()));
connect(ui->certificateAliasLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCertificateAlias()));
connect(ui->countryLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkCountryCode()));
} }
AndroidCreateKeystoreCertificate::~AndroidCreateKeystoreCertificate() AndroidCreateKeystoreCertificate::~AndroidCreateKeystoreCertificate()
@@ -65,42 +67,71 @@ QString AndroidCreateKeystoreCertificate::keystorePassword()
QString AndroidCreateKeystoreCertificate::certificateAlias() QString AndroidCreateKeystoreCertificate::certificateAlias()
{ {
return ui->aliasNameLineEdit->text(); return ui->certificateAliasLineEdit->text();
} }
QString AndroidCreateKeystoreCertificate::certificatePassword() QString AndroidCreateKeystoreCertificate::certificatePassword()
{ {
return ui->certificatePassLineEdit->text(); return (ui->samePasswordCheckBox->checkState() == Qt::Checked)
? keystorePassword()
: ui->certificatePassLineEdit->text();
} }
AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificate::checkKeystorePassword() AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificate::checkKeystorePassword()
{ {
if (ui->keystorePassLineEdit->text().length() < 6) { if (ui->keystorePassLineEdit->text().length() < 6) {
ui->keystorePassInfoLabel->setText(tr("<span style=\" color:#ff0000;\">Password is too short</span>")); ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Keystore password is too short</span>"));
return Invalid; return Invalid;
} }
if (ui->keystorePassLineEdit->text() != ui->keystoreRetypePassLineEdit->text()) { if (ui->keystorePassLineEdit->text() != ui->keystoreRetypePassLineEdit->text()) {
ui->keystorePassInfoLabel->setText(tr("<span style=\" color:#ff0000;\">Passwords don't match</span>")); ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Keystore passwords do not match</span>"));
return NoMatch; return NoMatch;
} }
ui->keystorePassInfoLabel->setText(tr("<span style=\" color:#00ff00;\">Password is ok</span>"));
ui->infoLabel->clear();
return Match; return Match;
} }
AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificate::checkCertificatePassword() AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificate::checkCertificatePassword()
{ {
if (ui->samePasswordCheckBox->checkState() == Qt::Checked)
return Match;
if (ui->certificatePassLineEdit->text().length() < 6) { if (ui->certificatePassLineEdit->text().length() < 6) {
ui->certificatePassInfoLabel->setText(tr("<span style=\" color:#ff0000;\">Password is too short</span>")); ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Certificate password is too short</span>"));
return Invalid; return Invalid;
} }
if (ui->certificatePassLineEdit->text() != ui->certificateRetypePassLineEdit->text()) { if (ui->certificatePassLineEdit->text() != ui->certificateRetypePassLineEdit->text()) {
ui->certificatePassInfoLabel->setText(tr("<span style=\" color:#ff0000;\">Passwords don't match</span>")); ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Certificate passwords do not match</span>"));
return NoMatch; return NoMatch;
} }
ui->certificatePassInfoLabel->setText(tr("<span style=\" color:#00ff00;\">Password is ok</span>"));
ui->infoLabel->clear();
return Match; return Match;
} }
bool AndroidCreateKeystoreCertificate::checkCertificateAlias()
{
if (ui->certificateAliasLineEdit->text().length() == 0) {
ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Certificate alias is missing</span>"));
return false;
}
ui->infoLabel->clear();
return true;
}
bool AndroidCreateKeystoreCertificate::checkCountryCode()
{
if (!ui->countryLineEdit->text().contains(QRegExp(QLatin1String("[A-Z]{2}")))) {
ui->infoLabel->setText(tr("<span style=\" color:#ff0000;\">Invalid country code</span>"));
return false;
}
ui->infoLabel->clear();
return true;
}
void AndroidCreateKeystoreCertificate::on_keystoreShowPassCheckBox_stateChanged(int state) void AndroidCreateKeystoreCertificate::on_keystoreShowPassCheckBox_stateChanged(int state)
{ {
ui->keystorePassLineEdit->setEchoMode(state == Qt::Checked ? QLineEdit::Normal : QLineEdit::Password); ui->keystorePassLineEdit->setEchoMode(state == Qt::Checked ? QLineEdit::Normal : QLineEdit::Password);
@@ -115,44 +146,8 @@ void AndroidCreateKeystoreCertificate::on_certificateShowPassCheckBox_stateChang
void AndroidCreateKeystoreCertificate::on_buttonBox_accepted() void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
{ {
switch (checkKeystorePassword()) { if (!validateUserInput())
case Invalid:
ui->keystorePassLineEdit->setFocus();
return; return;
case NoMatch:
ui->keystoreRetypePassLineEdit->setFocus();
return;
default:
break;
}
switch (checkCertificatePassword()) {
case Invalid:
ui->certificatePassLineEdit->setFocus();
return;
case NoMatch:
ui->certificateRetypePassLineEdit->setFocus();
return;
default:
break;
}
if (!ui->aliasNameLineEdit->text().length()) {
ui->aliasNameLineEdit->setFocus();
return;
}
if (!ui->commonNameLineEdit->text().length())
ui->commonNameLineEdit->setFocus();
if (!ui->organizationNameLineEdit->text().length())
ui->organizationNameLineEdit->setFocus();
if (!ui->localityNameLineEdit->text().length())
ui->localityNameLineEdit->setFocus();
if (!ui->countryLineEdit->text().length())
ui->countryLineEdit->setFocus();
m_keystoreFilePath = Utils::FileName::fromString(QFileDialog::getSaveFileName(this, tr("Keystore file name"), m_keystoreFilePath = Utils::FileName::fromString(QFileDialog::getSaveFileName(this, tr("Keystore file name"),
QDir::homePath() + QLatin1String("/android_release.keystore"), QDir::homePath() + QLatin1String("/android_release.keystore"),
@@ -174,11 +169,11 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
QStringList params; QStringList params;
params << QLatin1String("-genkey") << QLatin1String("-keyalg") << QLatin1String("RSA") params << QLatin1String("-genkey") << QLatin1String("-keyalg") << QLatin1String("RSA")
<< QLatin1String("-keystore") << m_keystoreFilePath.toString() << QLatin1String("-keystore") << m_keystoreFilePath.toString()
<< QLatin1String("-storepass") << ui->keystorePassLineEdit->text() << QLatin1String("-storepass") << keystorePassword()
<< QLatin1String("-alias") << ui->aliasNameLineEdit->text() << QLatin1String("-alias") << certificateAlias()
<< QLatin1String("-keysize") << ui->keySizeSpinBox->text() << QLatin1String("-keysize") << ui->keySizeSpinBox->text()
<< QLatin1String("-validity") << ui->validitySpinBox->text() << QLatin1String("-validity") << ui->validitySpinBox->text()
<< QLatin1String("-keypass") << ui->certificatePassLineEdit->text() << QLatin1String("-keypass") << certificatePassword()
<< QLatin1String("-dname") << distinguishedNames; << QLatin1String("-dname") << distinguishedNames;
QProcess genKeyCertProc; QProcess genKeyCertProc;
@@ -195,3 +190,57 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
} }
accept(); accept();
} }
void AndroidCreateKeystoreCertificate::on_samePasswordCheckBox_stateChanged(int state)
{
if (state == Qt::Checked) {
ui->certificatePassLineEdit->setDisabled(true);
ui->certificateRetypePassLineEdit->setDisabled(true);
ui->certificateShowPassCheckBox->setDisabled(true);
}
if (state == Qt::Unchecked) {
ui->certificatePassLineEdit->setEnabled(true);
ui->certificateRetypePassLineEdit->setEnabled(true);
ui->certificateShowPassCheckBox->setEnabled(true);
}
validateUserInput();
}
bool AndroidCreateKeystoreCertificate::validateUserInput()
{
switch (checkKeystorePassword()) {
case Invalid:
ui->keystorePassLineEdit->setFocus();
return false;
case NoMatch:
ui->keystoreRetypePassLineEdit->setFocus();
return false;
default:
break;
}
if (!checkCertificateAlias()) {
ui->certificateAliasLineEdit->setFocus();
return false;
}
switch (checkCertificatePassword()) {
case Invalid:
ui->certificatePassLineEdit->setFocus();
return false;
case NoMatch:
ui->certificateRetypePassLineEdit->setFocus();
return false;
default:
break;
}
if (!checkCountryCode()) {
ui->countryLineEdit->setFocus();
return false;
}
return true;
}

View File

@@ -62,11 +62,15 @@ public:
private slots: private slots:
PasswordStatus checkKeystorePassword(); PasswordStatus checkKeystorePassword();
PasswordStatus checkCertificatePassword(); PasswordStatus checkCertificatePassword();
bool checkCertificateAlias();
bool checkCountryCode();
void on_keystoreShowPassCheckBox_stateChanged(int state); void on_keystoreShowPassCheckBox_stateChanged(int state);
void on_certificateShowPassCheckBox_stateChanged(int state); void on_certificateShowPassCheckBox_stateChanged(int state);
void on_buttonBox_accepted(); void on_buttonBox_accepted();
void on_samePasswordCheckBox_stateChanged(int state);
private: private:
bool validateUserInput();
Ui::AndroidCreateKeystoreCertificate *ui; Ui::AndroidCreateKeystoreCertificate *ui;
Utils::FileName m_keystoreFilePath; Utils::FileName m_keystoreFilePath;
}; };

View File

@@ -7,200 +7,14 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>638</width> <width>638</width>
<height>429</height> <height>473</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Create a keystore and a certificate</string> <string>Create a keystore and a certificate</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0"> <item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Keystore</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="keystorePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Retype password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="keystoreRetypePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="keystoreShowPassCheckBox">
<property name="text">
<string>Show password</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="keystorePassInfoLabel">
<property name="text">
<string>&lt;span style=&quot; color:#ff0000;&quot;&gt;Password is too short&lt;/span&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Certificate</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Alias name:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="aliasNameLineEdit">
<property name="inputMask">
<string>Aaaaaaaa; </string>
</property>
<property name="maxLength">
<number>8</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Keysize:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="keySizeSpinBox">
<property name="minimum">
<number>2048</number>
</property>
<property name="maximum">
<number>2097152</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Validity (days):</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="validitySpinBox">
<property name="minimum">
<number>10000</number>
</property>
<property name="maximum">
<number>100000</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="certificatePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Retype password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="certificateRetypePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="certificateShowPassCheckBox">
<property name="text">
<string>Show password</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="certificatePassInfoLabel">
<property name="text">
<string>&lt;span style=&quot; color:#ff0000;&quot;&gt;Password is too short&lt;/span&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>Certificate Distinguished Names</string> <string>Certificate Distinguished Names</string>
@@ -284,7 +98,7 @@
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLineEdit" name="countryLineEdit"> <widget class="QLineEdit" name="countryLineEdit">
<property name="inputMask"> <property name="inputMask">
<string>&gt;AA; </string> <string/>
</property> </property>
<property name="maxLength"> <property name="maxLength">
<number>2</number> <number>2</number>
@@ -294,7 +108,187 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="2"> <item row="1" column="1">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Certificate</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="4" column="1">
<widget class="QLineEdit" name="certificateRetypePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="certificateShowPassCheckBox">
<property name="text">
<string>Show password</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="validitySpinBox">
<property name="minimum">
<number>10000</number>
</property>
<property name="maximum">
<number>100000</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Validity (days):</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Alias name:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="certificateAliasLineEdit">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="maxLength">
<number>8</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Keysize:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="certificatePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="keySizeSpinBox">
<property name="minimum">
<number>2048</number>
</property>
<property name="maximum">
<number>2097152</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Retype password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="samePasswordCheckBox">
<property name="text">
<string>Use Keystore password</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Keystore</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QLineEdit" name="keystorePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="keystoreRetypePassLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="keystoreShowPassCheckBox">
<property name="text">
<string>Show password</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Retype password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@@ -304,12 +298,22 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<widget class="QLabel" name="infoLabel">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<tabstops> <tabstops>
<tabstop>keystorePassLineEdit</tabstop> <tabstop>keystorePassLineEdit</tabstop>
<tabstop>keystoreRetypePassLineEdit</tabstop> <tabstop>keystoreRetypePassLineEdit</tabstop>
<tabstop>aliasNameLineEdit</tabstop> <tabstop>certificateAliasLineEdit</tabstop>
<tabstop>keySizeSpinBox</tabstop> <tabstop>keySizeSpinBox</tabstop>
<tabstop>validitySpinBox</tabstop> <tabstop>validitySpinBox</tabstop>
<tabstop>certificatePassLineEdit</tabstop> <tabstop>certificatePassLineEdit</tabstop>
@@ -321,7 +325,6 @@
<tabstop>stateNameLineEdit</tabstop> <tabstop>stateNameLineEdit</tabstop>
<tabstop>countryLineEdit</tabstop> <tabstop>countryLineEdit</tabstop>
<tabstop>keystoreShowPassCheckBox</tabstop> <tabstop>keystoreShowPassCheckBox</tabstop>
<tabstop>certificateShowPassCheckBox</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>