summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/minecraft/auth/steps/Step.hpp
blob: 7afb7159cb5be74ca59a3dc4867d90a9d8743083 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// SPDX-License-Identifier: GPL-3.0-only
// SPDX-FileCopyrightText: 2026 Project Tick
// SPDX-FileContributor: Project Tick Team
/*
 *  ProjT Launcher - Minecraft Launcher
 *  Copyright (C) 2026 Project Tick
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, version 3.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, write to the Free Software Foundation,
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#pragma once

#include <QNetworkReply>
#include <QObject>
#include <QString>

#include "QObjectPtr.h"

namespace projt::minecraft::auth
{

	/**
	 * Result state for authentication pipeline steps.
	 * Each step emits one of these states upon completion.
	 */
	enum class StepResult
	{
		Continue,	 ///< Step succeeded, proceed to next step
		Succeeded,	 ///< Final success - authentication complete
		Offline,	 ///< Network unavailable - soft failure, can retry
		SoftFailure, ///< Recoverable error - partial auth, can retry
		HardFailure, ///< Unrecoverable error - tokens invalid
		Disabled,	 ///< Account disabled (e.g., client ID changed)
		Gone		 ///< Account no longer exists
	};

	// Forward declaration
	struct Credentials;

	/**
	 * Abstract base class for authentication pipeline steps.
	 *
	 * Each step performs a discrete authentication action (e.g., OAuth exchange,
	 * token validation, profile fetch) and emits `completed` when done.
	 *
	 * Steps are designed to be stateless between runs - all persistent data
	 * is stored in the Credentials object passed at construction.
	 */
	class Step : public QObject
	{
		Q_OBJECT

	  public:
		using Ptr = shared_qobject_ptr<Step>;

		/**
		 * Construct a step with a reference to the credential store.
		 * @param credentials Mutable reference to authentication data.
		 */
		explicit Step(Credentials& credentials) noexcept : QObject(nullptr), m_credentials(credentials)
		{}

		~Step() noexcept override = default;

		// Rule of Zero - no copy/move (QObject constraint)
		Step(const Step&)			 = delete;
		Step& operator=(const Step&) = delete;
		Step(Step&&)				 = delete;
		Step& operator=(Step&&)		 = delete;

		/**
		 * Human-readable description of what this step does.
		 * Used for progress display and logging.
		 */
		[[nodiscard]] virtual QString description() const = 0;

	  public slots:
		/**
		 * Execute this authentication step.
		 * Implementations must emit `completed` when done (success or failure).
		 */
		virtual void execute() = 0;

		/**
		 * Request cancellation of an in-progress step.
		 * Default implementation does nothing. Override for cancellable steps.
		 */
		virtual void cancel() noexcept
		{}

	  signals:
		/**
		 * Emitted when the step completes (successfully or with error).
		 * @param result The outcome of this step.
		 * @param message Human-readable status message.
		 */
		void completed(StepResult result, QString message);

		/**
		 * Emitted by OAuth steps when browser authorization is required.
		 * @param url The URL to open in the user's browser.
		 */
		void browserAuthRequired(const QUrl& url);

		/**
		 * Emitted by device code flow steps when user action is required.
		 * @param verificationUrl URL to visit for authentication.
		 * @param userCode        Code to enter at the URL.
		 * @param expiresInSecs   Seconds until the code expires.
		 */
		void deviceCodeReady(QString verificationUrl, QString userCode, int expiresInSecs);

	  protected:
		Credentials& m_credentials;
	};

} // namespace projt::minecraft::auth