From 7354614f60dd18885fe4e61fd553623a642d76ca Mon Sep 17 00:00:00 2001 From: Bionus Date: Fri, 6 Nov 2020 22:06:40 +0100 Subject: [PATCH] Add support for source login --- .../settings/SourceSettingsScreen.qml | 49 +++++++++++++++++++ src/gui-qml/src/main-screen.qml | 16 ++++++ src/gui-qml/src/main.cpp | 4 ++ .../src/models/qml-auth-setting-field.h | 31 ++++++++++++ src/gui-qml/src/models/qml-auth.h | 35 +++++++++++++ src/gui-qml/src/models/qml-site.h | 13 ++++- 6 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/gui-qml/src/models/qml-auth-setting-field.h create mode 100644 src/gui-qml/src/models/qml-auth.h diff --git a/src/gui-qml/src/components/settings/SourceSettingsScreen.qml b/src/gui-qml/src/components/settings/SourceSettingsScreen.qml index ac8f56208..7b8312248 100644 --- a/src/gui-qml/src/components/settings/SourceSettingsScreen.qml +++ b/src/gui-qml/src/components/settings/SourceSettingsScreen.qml @@ -58,6 +58,55 @@ Page { Layout.fillWidth: true } + SettingTitle { + Layout.fillWidth: true + text: qsTr("Login") + } + Setting { + id: loginTypeSetting + key: "login/type" + def: "url" + obj: root.site.settings + } + ComboSetting { + name: qsTr("Type") + options: root.site.authFields.map(f => globals.authTypes[f.type] || f.type) + values: root.site.authFields.map(f => f.type) + setting: loginTypeSetting + Layout.fillWidth: true + } + Repeater { + model: root.site.authFields + Layout.fillWidth: true + + delegate: Item { + height: 100 + width: parent.width + visible: modelData.type === loginTypeSetting.value + + Column { + spacing: 0 + width: parent.width + + Repeater { + model: modelData.fields + width: parent.width + + delegate: TextFieldSetting { + name: globals.authFieldLabels[modelData.id] || modelData.id + setting: Setting { + key: "auth/" + modelData.id + def: modelData.def + obj: root.site.settings + } + echoMode: modelData.isPassword ? TextInput.Password : TextInput.Normal + width: parent.width + } + } + } + } + } + SettingTitle { Layout.fillWidth: true text: qsTr("API order") diff --git a/src/gui-qml/src/main-screen.qml b/src/gui-qml/src/main-screen.qml index 2b776d664..8e8a31388 100644 --- a/src/gui-qml/src/main-screen.qml +++ b/src/gui-qml/src/main-screen.qml @@ -36,6 +36,22 @@ ApplicationWindow { property var apiTypes: ["XML", "JSON", "Regex", "RSS"] property var apiTypesKeys: ["xml", "json", "regex", "rss"] + + property var authTypes: { + "url": qsTr("Through URL"), + "http_basic": qsTr("HTTP Basic"), + "get": qsTr("GET"), + "post": qsTr("POST"), + "oauth1": qsTr("OAuth 1"), + "oauth2": qsTr("OAuth 2") + } + property var authFieldLabels: { + "pseudo": qsTr("Username"), + "userId": qsTr("User ID"), + "password": qsTr("Password"), + "salt": qsTr("Salt"), + "apiKey": qsTr("API key") + } } MainDrawer { diff --git a/src/gui-qml/src/main.cpp b/src/gui-qml/src/main.cpp index aa2caaa65..e60f225d0 100644 --- a/src/gui-qml/src/main.cpp +++ b/src/gui-qml/src/main.cpp @@ -8,6 +8,8 @@ #include "main-screen.h" #include "models/image.h" #include "models/profile.h" +#include "models/qml-auth.h" +#include "models/qml-auth-setting-field.h" #include "models/qml-image.h" #include "models/qml-site.h" #include "settings.h" @@ -51,6 +53,8 @@ int main(int argc, char *argv[]) qRegisterMetaType>("QList>QmlImage*>"); qRegisterMetaType("QmlSite*"); qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); // Copy settings files to writable directory const QStringList toCopy { "sites/", "themes/", "webservices/" }; diff --git a/src/gui-qml/src/models/qml-auth-setting-field.h b/src/gui-qml/src/models/qml-auth-setting-field.h new file mode 100644 index 000000000..c666aee64 --- /dev/null +++ b/src/gui-qml/src/models/qml-auth-setting-field.h @@ -0,0 +1,31 @@ +#ifndef QML_AUTH_SETTING_FIELD_H +#define QML_AUTH_SETTING_FIELD_H + +#include +#include +#include "auth/auth.h" + + +class QmlAuthSettingField : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString id READ id CONSTANT) + Q_PROPERTY(QString def READ def CONSTANT) + Q_PROPERTY(bool isPassword READ isPassword CONSTANT) + + public: + explicit QmlAuthSettingField(const AuthSettingField &field, QObject *parent = nullptr) + : QObject(parent), m_id(field.id), m_def(field.def), m_isPassword(field.isPassword) {} + + QString id() const { return m_id; } + QString def() const { return m_def; } + bool isPassword() const { return m_isPassword; } + + private: + QString m_id; + QString m_def; + bool m_isPassword; +}; + +#endif // QML_AUTH_SETTING_FIELD_H diff --git a/src/gui-qml/src/models/qml-auth.h b/src/gui-qml/src/models/qml-auth.h new file mode 100644 index 000000000..34f486ad8 --- /dev/null +++ b/src/gui-qml/src/models/qml-auth.h @@ -0,0 +1,35 @@ +#ifndef QML_AUTH_H +#define QML_AUTH_H + +#include +#include +#include +#include "auth/auth.h" +#include "models/qml-auth-setting-field.h" + + +class QmlAuth : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString type READ type CONSTANT) + Q_PROPERTY(QList fields READ fields CONSTANT) + + public: + explicit QmlAuth(Auth *auth, QObject *parent = nullptr) + : QObject(parent), m_type(auth->type()) + { + for (const auto &field : auth->settingFields()) { + m_fields.append(new QmlAuthSettingField(field, this)); + } + } + + QString type() const { return m_type; } + QList fields() const { return m_fields; } + + private: + QString m_type; + QList m_fields; +}; + +#endif // QML_AUTH_H diff --git a/src/gui-qml/src/models/qml-site.h b/src/gui-qml/src/models/qml-site.h index fbc332a8b..db97ccaf4 100644 --- a/src/gui-qml/src/models/qml-site.h +++ b/src/gui-qml/src/models/qml-site.h @@ -2,7 +2,9 @@ #define QML_SITE_H #include +#include "models/qml-auth.h" #include "models/site.h" +#include "models/source.h" #include "settings.h" @@ -13,18 +15,27 @@ class QmlSite : public QObject Q_PROPERTY(QString url READ url CONSTANT) Q_PROPERTY(QString name READ name CONSTANT) Q_PROPERTY(Settings* settings READ settings CONSTANT) + Q_PROPERTY(QList authFields READ authFields CONSTANT) public: explicit QmlSite(Site *site, QObject *parent = nullptr) - : QObject(parent), m_site(site), m_settings(new Settings(site->settings(), this)) {} + : QObject(parent), m_site(site), m_settings(new Settings(site->settings(), this)) + { + auto auths = m_site->getSource()->getAuths(); + for (auto it = auths.constBegin(); it != auths.constEnd(); ++it) { + m_fields.append(new QmlAuth(it.value(), this)); + } + } QString url() const { return m_site->url(); } QString name() const { return m_site->name(); } Settings *settings() const { return m_settings; } + QList authFields() const { return m_fields; } private: Site *m_site; Settings *m_settings; + QList m_fields; }; #endif // QML_SITE_H