aboutsummaryrefslogtreecommitdiff
path: root/src/auth_flow.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/auth_flow.h')
-rw-r--r--src/auth_flow.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/auth_flow.h b/src/auth_flow.h
new file mode 100644
index 0000000..942e1aa
--- /dev/null
+++ b/src/auth_flow.h
@@ -0,0 +1,66 @@
+#pragma once
+
+#include <QString>
+
+#include "aoapplication.h"
+#include "ext_packet.h"
+#include "keyring.h"
+
+class KeySelectDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit KeySelectDialog(KeyringModel *model, QStringView username, QWidget *parent = nullptr);
+
+private:
+ KeyringModel *m_model;
+
+signals:
+ void key_selected(QByteArrayView key_id, QStringView key_name);
+};
+
+class KeyPassphraseDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit KeyPassphraseDialog(QStringView key_name, QWidget *parent = nullptr);
+ void display_error(ResponseResult error) const;
+
+private:
+ QLabel *m_err_lbl;
+ QLineEdit *m_pw_line;
+
+signals:
+ void passphrase_submitted(QByteArrayView passphrase);
+};
+
+// The only reason this inherits QObject is so I can call deleteLater()
+// when the authentication finishes. Auth flow involves coordinating two
+// asynchronous dialogs emitting signals, so I'd rather let Qt's event loop
+// clean everything up to be safe.
+class AuthFlow : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit AuthFlow(AOApplication *ao_app, const AuthChallenge &challenge, QWidget *parent = nullptr);
+
+private:
+ enum class FlowMode
+ {
+ Default,
+ Saved
+ };
+
+ FlowMode m_mode;
+ AOApplication *m_ao_app;
+ AuthChallenge m_challenge;
+ KeySelectDialog *m_key_dlg;
+ KeyPassphraseDialog *m_pwd_dlg;
+
+ void on_key_selected(QByteArrayView key_id, QStringView key_name);
+};
+
+void start_auth_flow(AOApplication *ao_app, QString username);