1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef REMOTING_HOST_THIRD_PARTY_AUTH_CONFIG_H_
6 #define REMOTING_HOST_THIRD_PARTY_AUTH_CONFIG_H_
7 
8 #include <ostream>
9 #include <string>
10 
11 #include "base/gtest_prod_util.h"
12 #include "url/gurl.h"
13 
14 namespace base {
15 class DictionaryValue;
16 }  // namespace base
17 
18 namespace remoting {
19 
20 struct ThirdPartyAuthConfig {
21   GURL token_url;
22   GURL token_validation_url;
23   std::string token_validation_cert_issuer;
24 
is_nullThirdPartyAuthConfig25   inline bool is_null() const {
26     return token_url.is_empty() && token_validation_url.is_empty();
27   }
28 
29   // Status of Parse method call.
30   enum ParseStatus {
31     // |policy_dict| contains invalid entries (i.e. malformed urls).
32     // |result| has not been modified.
33     InvalidPolicy,
34 
35     // |policy_dict| doesn't contain any ThirdPartyAuthConfig-related entries.
36     // |result| has not been modified.
37     NoPolicy,
38 
39     // |policy_dict| contains valid entries that have been stored into |result|.
40     ParsingSuccess,
41   };
42   static ParseStatus Parse(const base::DictionaryValue& policy_dict,
43                            ThirdPartyAuthConfig* result);
44 
45  private:
46   // Returns false and doesn't modify |result| if parsing fails (i.e. some input
47   // values are invalid).
48   static bool ParseStrings(const std::string& token_url,
49                            const std::string& token_validation_url,
50                            const std::string& token_validation_cert_issuer,
51                            ThirdPartyAuthConfig* result);
52   FRIEND_TEST_ALL_PREFIXES(InvalidUrlTest, ParseInvalidUrl);
53   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ParseEmpty);
54   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ParseValidAll);
55   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ParseValidNoCert);
56   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ParseInvalidCombination);
57   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ParseHttp);
58 
59   // Extracts raw (raw = as strings) policy values from |policy_dict|.
60   // Missing policy values are set to an empty string.
61   // Returns false if no ThirdPartyAuthConfig-related policies were present.
62   static bool ExtractStrings(const base::DictionaryValue& policy_dict,
63                              std::string* token_url,
64                              std::string* token_validation_url,
65                              std::string* token_validation_cert_issuer);
66   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ExtractEmpty);
67   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ExtractUnknown);
68   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ExtractAll);
69   FRIEND_TEST_ALL_PREFIXES(ThirdPartyAuthConfig, ExtractPartial);
70 };
71 
72 std::ostream& operator<<(std::ostream& os, const ThirdPartyAuthConfig& cfg);
73 
74 }  // namespace remoting
75 
76 #endif  // REMOTING_HOST_THIRD_PARTY_AUTH_CONFIG_H_
77