File: authorization_zones_manager.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (145 lines) | stat: -rw-r--r-- 7,197 bytes parent folder | download | duplicates (6)
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_PRINTING_OAUTH2_AUTHORIZATION_ZONES_MANAGER_H_
#define CHROME_BROWSER_ASH_PRINTING_OAUTH2_AUTHORIZATION_ZONES_MANAGER_H_

#include <memory>
#include <string>

#include "base/functional/callback.h"
#include "chrome/browser/ash/printing/oauth2/status_code.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/sync/model/data_type_store.h"
#include "components/sync/model/data_type_sync_bridge.h"

class GURL;
class Profile;

namespace chromeos {
class Uri;
}  // namespace chromeos

namespace syncer {
class DataTypeLocalChangeProcessor;
}  // namespace syncer

namespace ash::printing::oauth2 {

class AuthorizationZone;
class ClientIdsDatabase;

// This class is responsible for managing OAuth2 sessions required to get access
// to some printers. In the API provided by the class, printers are referred to
// as IPP Endpoints. IPP Endpoints that require OAuth2 token report the
// following IPP attributes in the response for Get-Printer-Attributes request:
//   * oauth-authorization-server-uri - the URL of the Authorization Server;
//   * oauth-authorization-scope - optional, if missing use an empty string.
// These two values correspond to the parameters `auth_server` and `scope` in
// the API below.
//
// How to use:
//  * SaveAuthorizationServerAsTrusted() - this must be called once for each
//    Authorization Server to mark it as trusted. The list of trusted
//    Authorization Servers is saved in user's profile. All API calls for any
//    Authorization Server not included in the trusted list will fail with the
//    error StatusCode::kUntrustedAuthorizationServer.
//  * InitAuthorization() - the callback returns a URL that must be opened in an
//    internet browser to allow a user to go through an authorization procedure.
//  * FinishAuthorization() - this method finalizes the authorization procedure
//    started by InitAuthorization(). The authorization procedure in the
//    internet browser is completed when the browser receives a response with
//    the HTTP 302 status code. The value of the "Location" attribute from the
//    HTTP header must be passed to this method to finalize the process and
//    open an OAuth2 session with the Authorization Server.
//  * GetEndpointAccessToken() - the callback returns an endpoint access token
//    for given IPP Endpoint. You can call this method as the first one and
//    then fallback to InitAuthorization()/FinishAuthorization() when it
//    returns the status StatusCode::kAuthorizationNeeded. This method can
//    be called repeatedly and will return the same token for the same
//    parameters until the method MarkEndpointAccessTokenAsExpired() is called.
//  * MarkEndpointAccessTokenAsExpired() - call this method to mark the
//    endpoint access token as expired. Then the following call to
//    GetEndpointAccessToken() will try to obtain a new endpoint access token
//    or returns StatusCode::kAuthorizationNeeded when a new authorization
//    procedure is needed (i.e. a new call to InitAuthorization() and
//    FinishAuthorization() is required).
//
// Results and errors are returned by StatusCallback passed as the last
// parameter. See chrome/browser/ash/printing/oauth2/status_code.h for more
// details.
class AuthorizationZonesManager : public KeyedService {
 public:
  using CreateAuthZoneCallback =
      base::RepeatingCallback<std::unique_ptr<AuthorizationZone>(
          const GURL& url,
          ClientIdsDatabase* client_ids_database)>;

  // `profile` must not be nullptr.
  static std::unique_ptr<AuthorizationZonesManager> Create(Profile* profile);
  static std::unique_ptr<AuthorizationZonesManager> CreateForTesting(
      Profile* profile,
      CreateAuthZoneCallback auth_zone_creator,
      std::unique_ptr<ClientIdsDatabase> client_ids_database,
      std::unique_ptr<syncer::DataTypeLocalChangeProcessor> change_processor,
      syncer::OnceDataTypeStoreFactory store_factory);

  ~AuthorizationZonesManager() override;
  virtual syncer::DataTypeSyncBridge* GetDataTypeSyncBridge() = 0;

  // Marks `auth_server` as trusted.
  virtual StatusCode SaveAuthorizationServerAsTrusted(
      const GURL& auth_server) = 0;

  // Starts authorization process. If successful, the `callback` is called
  // with StatusCode::kOK and with an authorization URL that must be opened in
  // an internet browser to enable the user to complete the authorization
  // process. Before calling this method the caller should make sure that
  // creating a new session is necessary by calling the method
  // GetEndpointAccessToken() first.
  virtual void InitAuthorization(const GURL& auth_server,
                                 const std::string& scope,
                                 StatusCallback callback) = 0;

  // Finalizes authorization process. As an parameter this method takes an URL
  // that the internet browser was redirected to at the end of the authorization
  // procedure completed by the user. The return code StatusCode::kOK means
  // that a new OAuth2 session was created and the caller can now use the method
  // GetEndpointAccessToken() to get an endpoint access token.
  virtual void FinishAuthorization(const GURL& auth_server,
                                   const GURL& redirect_url,
                                   StatusCallback callback) = 0;

  // Obtains an endpoint access token to use with the given IPP Endpoint. If
  // succeeded `callback` returns StatusCode::kOK and endpoint access token as
  // `data`. StatusCode::kAuthorizationNeeded means that the caller must call
  // methods InitAuthorization() and FinishAuthorization() first to open OAuth2
  // session. The parameter `scope` is used only when an endpoint access token
  // for the given IPP endpoint does not exists yet (the parameter has no
  // effects when the endpoint access token already exists).
  virtual void GetEndpointAccessToken(const GURL& auth_server,
                                      const chromeos::Uri& ipp_endpoint,
                                      const std::string& scope,
                                      StatusCallback callback) = 0;

  // This method marks the `endpoint_access_token` issued for `ipp_endpoint` as
  // expired. The next call to GetEndpointAccessToken() will start internally a
  // procedure to obtain a new endpoint access token. This method should be
  // called when the IPP Endpoint rejects a request with `endpoint_access_token`
  // by sending back a response with the HTTP 401 status code. If the HTTP
  // header of that response contains "error" attribute, you should check if it
  // equals "invalid_token" before calling this method. See RFC 6750 for more
  // details.
  virtual void MarkEndpointAccessTokenAsExpired(
      const GURL& auth_server,
      const chromeos::Uri& ipp_endpoint,
      const std::string& endpoint_access_token) = 0;

 protected:
  AuthorizationZonesManager();
};

}  // namespace ash::printing::oauth2

#endif  // CHROME_BROWSER_ASH_PRINTING_OAUTH2_AUTHORIZATION_ZONES_MANAGER_H_