diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-05-31 22:11:27 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-05-31 22:35:50 -0700 |
commit | 5bbcc7f16ddb1315dbd4a7a43034cddf8c9f2a36 (patch) | |
tree | e445d47e14b8fbfeb3902b12d165db117bbe9f52 | |
parent | a6b667478034cee6efde4b0828ad4a263345355f (diff) | |
download | subsurface-5bbcc7f16ddb1315dbd4a7a43034cddf8c9f2a36.tar.gz |
Cloud storage: first stab at implementing cloud storage
So far there is no mechanism to actually create a repository on the
server, so this only works with the two test repositories.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | git-access.c | 19 | ||||
-rw-r--r-- | pref.h | 1 | ||||
-rw-r--r-- | qt-ui/mainwindow.cpp | 64 | ||||
-rw-r--r-- | qt-ui/mainwindow.h | 2 | ||||
-rw-r--r-- | qt-ui/mainwindow.ui | 16 |
5 files changed, 98 insertions, 4 deletions
diff --git a/git-access.c b/git-access.c index 9189ae08d..521d552e9 100644 --- a/git-access.c +++ b/git-access.c @@ -87,7 +87,7 @@ int credential_https_cb(git_cred **out, unsigned int allowed_types, void *payload) { - const char *username = "ssrftest"; + const char *username = prefs.cloud_storage_email_encoded; const char *password = prefs.cloud_storage_password ? strdup(prefs.cloud_storage_password) : strdup(""); return git_cred_userpass_plaintext_new(out, username, password); } @@ -202,7 +202,7 @@ static struct git_repository *get_remote_repo(const char *localdir, const char * * https://host/repo[branch] * file://repo[branch] */ -static struct git_repository *is_remote_git_repository(const char *remote, const char *branch) +static struct git_repository *is_remote_git_repository(char *remote, const char *branch) { char c, *localdir; const char *p = remote; @@ -241,6 +241,21 @@ static struct git_repository *is_remote_git_repository(const char *remote, const * caches will sadly force that to split into multiple * individual repositories. */ + + /* + * next we need to make sure that any encoded username + * has been extracted from an https:// based URL + */ + if (!strncmp(remote, "https://", 8)) { + char *at = strchr(remote, '@'); + if (at) { + /* grab the part between "https://" and "@" as encoded email address + * (that's our username) and move the rest of the URL forward, remembering + * to copy the closing NUL as well */ + prefs.cloud_storage_email_encoded = strndup(remote + 8, at - remote - 8); + memmove(remote + 8, at + 1, strlen(at + 1) + 1); + } + } localdir = get_local_dir(remote, branch); if (!localdir) return NULL; @@ -92,6 +92,7 @@ struct preferences { facebook_prefs_t facebook; char *cloud_storage_password; char *cloud_storage_email; + char *cloud_storage_email_encoded; bool save_password_local; }; enum unit_system_values { diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 2848e26b7..b039af9bb 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -305,6 +305,70 @@ void MainWindow::on_actionSaveAs_triggered() file_save_as(); } +static int getCloudURL(QString &filename) +{ + QString email = QString(prefs.cloud_storage_email); + email.replace("@", "_at_"); + email.replace(QRegularExpression("[^a-zA-Z0-9._+-]"), ""); + if (email.isEmpty() || same_string(prefs.cloud_storage_password, "")) + return report_error("Please configure Cloud storage email and password in the preferences"); + if (email != prefs.cloud_storage_email_encoded) { + free(prefs.cloud_storage_email_encoded); + prefs.cloud_storage_email_encoded = strdup(qPrintable(email)); + } + filename = QString("https://cloud.subsurface-divelog.org/git/%1[%1]").arg(email); + return 0; +} + +void MainWindow::on_actionCloudstorageopen_triggered() +{ + if (!okToClose(tr("Please save or cancel the current dive edit before opening a new file."))) + return; + + QString filename; + if (getCloudURL(filename)) { + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + return; + } + qDebug() << filename; + + closeCurrentFile(); + + int error; + + QByteArray fileNamePtr = QFile::encodeName(filename); + error = parse_file(fileNamePtr.data()); + if (!error) { + set_filename(fileNamePtr.data(), true); + setTitle(MWTF_FILENAME); + } + getNotificationWidget()->hideNotification(); + process_dives(false, false); + refreshDisplay(); + ui.actionAutoGroup->setChecked(autogroup); +} + +void MainWindow::on_actionCloudstoragesave_triggered() +{ + QString filename; + if (getCloudURL(filename)) { + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + return; + } + qDebug() << filename; + if (information()->isEditing()) + information()->acceptChanges(); + + if (save_dives(filename.toUtf8().data())) { + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + return; + } + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + set_filename(filename.toUtf8().data(), true); + setTitle(MWTF_FILENAME); + mark_divelist_changed(false); +} + void learnImageDirs(QStringList dirnames) { QList<QFuture<void> > futures; diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index f963330cc..a9686dcd9 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -103,6 +103,8 @@ slots: void on_actionSave_triggered(); void on_actionSaveAs_triggered(); void on_actionClose_triggered(); + void on_actionCloudstorageopen_triggered(); + void on_actionCloudstoragesave_triggered(); void on_actionPrint_triggered(); void on_actionPreferences_triggered(); void on_actionQuit_triggered(); diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui index c7367bc66..e097b6bb9 100644 --- a/qt-ui/mainwindow.ui +++ b/qt-ui/mainwindow.ui @@ -62,7 +62,7 @@ <x>0</x> <y>0</y> <width>861</width> - <height>22</height> + <height>29</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -74,6 +74,9 @@ <addaction name="actionSave"/> <addaction name="actionSaveAs"/> <addaction name="separator"/> + <addaction name="actionCloudstorageopen"/> + <addaction name="actionCloudstoragesave"/> + <addaction name="separator"/> <addaction name="actionClose"/> <addaction name="actionExport"/> <addaction name="actionPrint"/> @@ -81,7 +84,6 @@ <addaction name="separator"/> <addaction name="actionHash_images"/> <addaction name="actionConfigure_Dive_Computer"/> - <addaction name="separator"/> <addaction name="actionRecent1"/> <addaction name="actionRecent2"/> <addaction name="actionRecent3"/> @@ -714,6 +716,16 @@ <string>&Find moved images</string> </property> </action> + <action name="actionCloudstorageopen"> + <property name="text"> + <string>Cloud storage open</string> + </property> + </action> + <action name="actionCloudstoragesave"> + <property name="text"> + <string>Cloud storage save</string> + </property> + </action> </widget> <customwidgets> <customwidget> |