ORE Studio 0.0.4
Loading...
Searching...
No Matches
authorization_protocol.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2025 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_IAM_MESSAGING_AUTHORIZATION_PROTOCOL_HPP
21#define ORES_IAM_MESSAGING_AUTHORIZATION_PROTOCOL_HPP
22
23#include <span>
24#include <iosfwd>
25#include <vector>
26#include <optional>
27#include <expected>
28#include <boost/uuid/uuid.hpp>
29#include "ores.comms/messaging/message_types.hpp"
30#include "ores.comms/messaging/message_traits.hpp"
31#include "ores.iam/domain/role.hpp"
32#include "ores.iam/domain/permission.hpp"
33
34namespace ores::iam::messaging {
35
36// ============================================================================
37// List Roles
38// ============================================================================
39
43struct list_roles_request final {
49 std::vector<std::byte> serialize() const;
50
54 static std::expected<list_roles_request, ores::utility::serialization::error_code>
55 deserialize(std::span<const std::byte> data);
56};
57
58std::ostream& operator<<(std::ostream& s, const list_roles_request& v);
59
63struct list_roles_response final {
64 std::vector<domain::role> roles;
65
87 std::vector<std::byte> serialize() const;
88
92 static std::expected<list_roles_response, ores::utility::serialization::error_code>
93 deserialize(std::span<const std::byte> data);
94};
95
96std::ostream& operator<<(std::ostream& s, const list_roles_response& v);
97
98// ============================================================================
99// List Permissions
100// ============================================================================
101
111 std::vector<std::byte> serialize() const;
112
116 static std::expected<list_permissions_request, ores::utility::serialization::error_code>
117 deserialize(std::span<const std::byte> data);
118};
119
120std::ostream& operator<<(std::ostream& s, const list_permissions_request& v);
121
126 std::vector<domain::permission> permissions;
127
140 std::vector<std::byte> serialize() const;
141
145 static std::expected<list_permissions_response, ores::utility::serialization::error_code>
146 deserialize(std::span<const std::byte> data);
147};
148
149std::ostream& operator<<(std::ostream& s, const list_permissions_response& v);
150
151// ============================================================================
152// Assign Role
153// ============================================================================
154
161 boost::uuids::uuid account_id;
162 boost::uuids::uuid role_id;
163
171 std::vector<std::byte> serialize() const;
172
176 static std::expected<assign_role_request, ores::utility::serialization::error_code>
177 deserialize(std::span<const std::byte> data);
178};
179
180std::ostream& operator<<(std::ostream& s, const assign_role_request& v);
181
186 bool success = false;
187 std::string error_message;
188
197 std::vector<std::byte> serialize() const;
198
202 static std::expected<assign_role_response, ores::utility::serialization::error_code>
203 deserialize(std::span<const std::byte> data);
204};
205
206std::ostream& operator<<(std::ostream& s, const assign_role_response& v);
207
208// ============================================================================
209// Revoke Role
210// ============================================================================
211
218 boost::uuids::uuid account_id;
219 boost::uuids::uuid role_id;
220
228 std::vector<std::byte> serialize() const;
229
233 static std::expected<revoke_role_request, ores::utility::serialization::error_code>
234 deserialize(std::span<const std::byte> data);
235};
236
237std::ostream& operator<<(std::ostream& s, const revoke_role_request& v);
238
243 bool success = false;
244 std::string error_message;
245
254 std::vector<std::byte> serialize() const;
255
259 static std::expected<revoke_role_response, ores::utility::serialization::error_code>
260 deserialize(std::span<const std::byte> data);
261};
262
263std::ostream& operator<<(std::ostream& s, const revoke_role_response& v);
264
265// ============================================================================
266// Get Account Roles
267// ============================================================================
268
273 boost::uuids::uuid account_id;
274
281 std::vector<std::byte> serialize() const;
282
286 static std::expected<get_account_roles_request, ores::utility::serialization::error_code>
287 deserialize(std::span<const std::byte> data);
288};
289
290std::ostream& operator<<(std::ostream& s, const get_account_roles_request& v);
291
296 std::vector<domain::role> roles;
297
303 std::vector<std::byte> serialize() const;
304
308 static std::expected<get_account_roles_response, ores::utility::serialization::error_code>
309 deserialize(std::span<const std::byte> data);
310};
311
312std::ostream& operator<<(std::ostream& s, const get_account_roles_response& v);
313
314// ============================================================================
315// Get Account Permissions
316// ============================================================================
317
322 boost::uuids::uuid account_id;
323
330 std::vector<std::byte> serialize() const;
331
335 static std::expected<get_account_permissions_request, ores::utility::serialization::error_code>
336 deserialize(std::span<const std::byte> data);
337};
338
339std::ostream& operator<<(std::ostream& s, const get_account_permissions_request& v);
340
345 std::vector<std::string> permission_codes;
346
356 std::vector<std::byte> serialize() const;
357
361 static std::expected<get_account_permissions_response, ores::utility::serialization::error_code>
362 deserialize(std::span<const std::byte> data);
363};
364
365std::ostream& operator<<(std::ostream& s, const get_account_permissions_response& v);
366
367// ============================================================================
368// Get Role
369// ============================================================================
370
378struct get_role_request final {
379 std::string identifier;
380
388 std::vector<std::byte> serialize() const;
389
393 static std::expected<get_role_request, ores::utility::serialization::error_code>
394 deserialize(std::span<const std::byte> data);
395};
396
397std::ostream& operator<<(std::ostream& s, const get_role_request& v);
398
402struct get_role_response final {
403 bool found = false;
404 std::optional<domain::role> role;
405 std::string error_message;
406
418 std::vector<std::byte> serialize() const;
419
423 static std::expected<get_role_response, ores::utility::serialization::error_code>
424 deserialize(std::span<const std::byte> data);
425};
426
427std::ostream& operator<<(std::ostream& s, const get_role_response& v);
428
429}
430
431namespace ores::comms::messaging {
432
436template<>
437struct message_traits<iam::messaging::list_roles_request> {
440 static constexpr message_type request_message_type =
441 message_type::list_roles_request;
442};
443
447template<>
448struct message_traits<iam::messaging::list_permissions_request> {
451 static constexpr message_type request_message_type =
452 message_type::list_permissions_request;
453};
454
458template<>
459struct message_traits<iam::messaging::assign_role_request> {
462 static constexpr message_type request_message_type =
463 message_type::assign_role_request;
464};
465
469template<>
470struct message_traits<iam::messaging::revoke_role_request> {
473 static constexpr message_type request_message_type =
474 message_type::revoke_role_request;
475};
476
480template<>
481struct message_traits<iam::messaging::get_account_roles_request> {
484 static constexpr message_type request_message_type =
485 message_type::get_account_roles_request;
486};
487
491template<>
492struct message_traits<iam::messaging::get_account_permissions_request> {
495 static constexpr message_type request_message_type =
496 message_type::get_account_permissions_request;
497};
498
502template<>
503struct message_traits<iam::messaging::get_role_request> {
506 static constexpr message_type request_message_type =
507 message_type::get_role_request;
508};
509
510}
511
512#endif
Contains messaging related infrastructure in the comms library.
Definition assets_protocol.hpp:122
Network messaging infrastructure for the IAM module.
Definition account_history_protocol.hpp:33
Traits template for mapping request types to their response types and message type enum values.
Definition message_traits.hpp:66
Request to list all roles in the system.
Definition authorization_protocol.hpp:43
static std::expected< list_roles_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:137
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:132
Response containing all roles.
Definition authorization_protocol.hpp:63
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:146
static std::expected< list_roles_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:156
Request to list all permissions in the system.
Definition authorization_protocol.hpp:105
static std::expected< list_permissions_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:187
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:182
Response containing all permissions.
Definition authorization_protocol.hpp:125
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:196
static std::expected< list_permissions_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:208
Request to assign a role to an account.
Definition authorization_protocol.hpp:160
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:246
static std::expected< assign_role_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:254
Response indicating whether role assignment succeeded.
Definition authorization_protocol.hpp:185
static std::expected< assign_role_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:281
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:273
Request to revoke a role from an account.
Definition authorization_protocol.hpp:217
static std::expected< revoke_role_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:312
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:304
Response indicating whether role revocation succeeded.
Definition authorization_protocol.hpp:242
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:331
static std::expected< revoke_role_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:339
Request to get all roles assigned to an account.
Definition authorization_protocol.hpp:272
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:362
static std::expected< get_account_roles_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:369
Response containing roles assigned to an account.
Definition authorization_protocol.hpp:295
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:384
static std::expected< get_account_roles_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:394
Request to get effective permissions for an account.
Definition authorization_protocol.hpp:321
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:420
static std::expected< get_account_permissions_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:427
Response containing effective permissions for an account.
Definition authorization_protocol.hpp:344
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:442
static std::expected< get_account_permissions_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:453
Request to get a specific role by ID or name.
Definition authorization_protocol.hpp:378
std::vector< std::byte > serialize() const
Serialize request to bytes.
Definition authorization_protocol.cpp:479
static std::expected< get_role_request, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize request from bytes.
Definition authorization_protocol.cpp:486
Response containing the requested role.
Definition authorization_protocol.hpp:402
std::vector< std::byte > serialize() const
Serialize response to bytes.
Definition authorization_protocol.cpp:501
static std::expected< get_role_response, ores::utility::serialization::error_code > deserialize(std::span< const std::byte > data)
Deserialize response from bytes.
Definition authorization_protocol.cpp:513