#pragma once #include #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);