comparison ui/createcertlistdialog.cpp @ 466:0d71ce440bcc

Factor out list creation to make it more testable
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 23 Apr 2014 15:48:08 +0000
parents 88dfe16a0bb9
children 9cd28df2c4ce
comparison
equal deleted inserted replaced
465:88dfe16a0bb9 466:0d71ce440bcc
182 delete mPk; 182 delete mPk;
183 mPk = NULL; 183 mPk = NULL;
184 } 184 }
185 } 185 }
186 186
187 void CreateCertListDialog::createList() 187 bool CreateCertListDialog::writeList(const QList<Certificate>& certs,
188 { 188 const QString& filePath,
189 if (!mPk) { 189 const QDateTime& listDate,
190 showErrorMessage(tr("Please select a valid rsa key.")); 190 pk_context *pk)
191 } 191 {
192 if (mSaveDir->text().isEmpty()) {
193 showErrorMessage(tr("Please select an output location first."));
194 }
195
196 QDateTime currentDateTimeUtc = QDateTime::currentDateTimeUtc();
197
198 /* Build up the list data */ 192 /* Build up the list data */
199 QByteArray listData("F:1\r\n"); 193 QByteArray listData("F:1\r\n");
200 listData.append(currentDateTimeUtc.toString(Qt::ISODate) + "\r\n"); 194 listData.append(listDate.toString(Qt::ISODate) + "\r\n");
201 195
202 foreach (const Certificate& cert, mAdminWindow->certificates()) { 196 foreach (const Certificate& cert, certs) {
203 listData.append(QString::fromLatin1("D:") + cert.base64Line() + "\r\n"); 197 listData.append(QString::fromLatin1("D:") + cert.base64Line() + "\r\n");
204 } 198 }
205 199
206 QByteArray signature = rsaSignSHA256Hash(sha256sum(listData), mPk); 200 QByteArray signature = rsaSignSHA256Hash(sha256sum(listData), pk);
201 if (signature.size() != 3072 / 8) {
202 qDebug() << "Signature creation returned signature of invalid size.";
203 return false;
204 }
207 listData.prepend("\r\n"); 205 listData.prepend("\r\n");
208 listData.prepend(signature.toBase64()); 206 listData.prepend(signature.toBase64());
209 listData.prepend("S:"); 207 listData.prepend("S:");
210 208
209 QFile outputFile(filePath);
210
211 if (!outputFile.open(QIODevice::WriteOnly)) {
212 qDebug() << "Failed to open output file: " << filePath;
213 return false;
214 }
215
216 if (outputFile.write(listData) != listData.size()) {
217 qDebug() << "Failed to write list: " << filePath;
218 outputFile.close();
219 return false;
220 }
221 outputFile.close();
222 return true;
223 }
224
225 void CreateCertListDialog::createList()
226 {
227 if (!mPk) {
228 showErrorMessage(tr("Please select a valid rsa key."));
229 }
230 if (mSaveDir->text().isEmpty()) {
231 showErrorMessage(tr("Please select an output location first."));
232 }
233
234 QDateTime currentDateTimeUtc = QDateTime::currentDateTimeUtc();
235
211 QString fileName = QString::fromLatin1("certificates-") 236 QString fileName = QString::fromLatin1("certificates-")
212 .append(currentDateTimeUtc.toString(("yyyyMMddHHmmss"))) 237 .append(currentDateTimeUtc.toString(("yyyyMMddHHmmss")))
213 .append(".txt"); 238 .append(".txt");
214 239
215 QString filePath = mSaveDir->text().append("/").append(fileName); 240 QString filePath = mSaveDir->text().append("/").append(fileName);
216 241
242 if (!writeList(mAdminWindow->certificates(), filePath,
243 currentDateTimeUtc, mPk)) {
244 showErrorMessage(tr("Failed to write list to: %1").arg(filePath));
245 }
246
217 QFile outputFile(filePath); 247 QFile outputFile(filePath);
218
219 if (!outputFile.open(QIODevice::WriteOnly)) {
220 showErrorMessage(tr("Failed to open output file %1").arg(filePath));
221 return;
222 }
223
224 if (outputFile.write(listData) != listData.size()) {
225 showErrorMessage(tr("Failed to write certificate list."));
226 return;
227 }
228 248
229 /* Archive the list */ 249 /* Archive the list */
230 QDir archiveDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); 250 QDir archiveDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
231 if (!archiveDir.mkpath(archiveDir.path())) { 251 if (!archiveDir.mkpath(archiveDir.path())) {
232 showErrorMessage(tr("Failed to create archive location.")); 252 showErrorMessage(tr("Failed to create archive location."));

http://wald.intevation.org/projects/trustbridge/