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.h58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/auth_flow.h b/src/auth_flow.h
index 942e1aa..4a89673 100644
--- a/src/auth_flow.h
+++ b/src/auth_flow.h
@@ -1,51 +1,57 @@
#pragma once
#include <QString>
+#include <QLineEdit>
-#include "aoapplication.h"
#include "ext_packet.h"
#include "keyring.h"
+#include "saved_auth.h"
class KeySelectDialog : public QDialog
{
Q_OBJECT
public:
- explicit KeySelectDialog(KeyringModel *model, QStringView username, QWidget *parent = nullptr);
+ explicit KeySelectDialog(KeyringModel *model, QStringView username, QStringView hostname, QWidget *parent = nullptr);
private:
KeyringModel *m_model;
signals:
- void key_selected(QByteArrayView key_id, QStringView key_name);
+ void key_selected(KeyringKey key);
};
-class KeyPassphraseDialog : public QDialog
+class KeyActivationDialog : public QDialog
{
Q_OBJECT
public:
- explicit KeyPassphraseDialog(QStringView key_name, QWidget *parent = nullptr);
+ enum class Mode {
+ none,
+ passphrase,
+ pin,
+ };
+ explicit KeyActivationDialog(Mode mode, QStringView key_name, QWidget *parent = nullptr);
void display_error(ResponseResult error) const;
private:
QLabel *m_err_lbl;
- QLineEdit *m_pw_line;
+ QLineEdit *m_line;
signals:
- void passphrase_submitted(QByteArrayView passphrase);
+ void input_submitted(QByteArrayView input);
};
-// 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.
+// The only reason this inherits QObject is signals.
class AuthFlow : public QObject
{
Q_OBJECT
public:
- explicit AuthFlow(AOApplication *ao_app, const AuthChallenge &challenge, QWidget *parent = nullptr);
+ void initialize(KeyringModel *model);
+ void start(QString user, QString host);
+ bool awaiting_challenge(void) const;
+ void respond(const AuthChallenge &challenge);
private:
enum class FlowMode
@@ -54,13 +60,29 @@ private:
Saved
};
+ enum class AuthPhase {
+ none,
+ requested,
+ };
+
+ QString m_username;
+ QString m_hostname;
FlowMode m_mode;
- AOApplication *m_ao_app;
AuthChallenge m_challenge;
- KeySelectDialog *m_key_dlg;
- KeyPassphraseDialog *m_pwd_dlg;
+ KeySelectDialog *m_key_dlg = nullptr;
+ KeyActivationDialog *m_input_dlg = nullptr;
+ AuthPhase m_phase = AuthPhase::none;
+ SavedAuth m_saved_auth;
+ KeyringKey m_key;
+ KeyringModel *m_model;
- void on_key_selected(QByteArrayView key_id, QStringView key_name);
-};
+ void on_key_selected(KeyringKey key);
+ void call_input_dialog(KeyActivationDialog::Mode mode);
+ void authenticate(QByteArrayView input);
+ void reject_and_select_new_key(void);
+ void reset(void);
-void start_auth_flow(AOApplication *ao_app, QString username);
+signals:
+ void request_ready(AuthRequest req);
+ void response_ready(AuthResponse response);
+};