#pragma once #include #include #include "ext_packet.h" #include "keyring.h" #include "saved_auth.h" class KeySelectDialog : public QDialog { Q_OBJECT public: explicit KeySelectDialog(KeyringModel *model, QStringView username, QStringView hostname, QWidget *parent = nullptr); private: KeyringModel *m_model; signals: void key_selected(KeyringKey key); }; class KeyActivationDialog : public QDialog { Q_OBJECT public: 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_line; signals: void input_submitted(QByteArrayView input); }; // The only reason this inherits QObject is signals. class AuthFlow : public QObject { Q_OBJECT public: void initialize(KeyringModel *model); void start(QString user, QString host); bool awaiting_challenge(void) const; void respond(const AuthChallenge &challenge); private: enum class FlowMode { Default, Saved }; enum class AuthPhase { none, requested, }; QString m_username; QString m_hostname; FlowMode m_mode; AuthChallenge m_challenge; 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(KeyringKey key); void call_input_dialog(KeyActivationDialog::Mode mode); void authenticate(QByteArrayView input); void reject_and_select_new_key(void); void reset(void); signals: void request_ready(AuthRequest req); void response_ready(AuthResponse response); };