Add AuthType enum with string mapping

BUG=25768507

Change-Id: I3d1b928407b3fa8e285b1c8bc1385e031f6abfba
Reviewed-on: https://weave-review.googlesource.com/2048
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/src/privet/privet_handler.cc b/src/privet/privet_handler.cc
index 0af431b..b55053d 100644
--- a/src/privet/privet_handler.cc
+++ b/src/privet/privet_handler.cc
@@ -79,9 +79,6 @@
 const char kPairingFingerprintKey[] = "certFingerprint";
 const char kPairingSignatureKey[] = "certSignature";
 
-const char kAuthTypeAnonymousValue[] = "anonymous";
-const char kAuthTypePairingValue[] = "pairing";
-
 const char kAuthModeKey[] = "mode";
 const char kAuthCodeKey[] = "authCode";
 const char kAuthRequestedScopeKey[] = "requestedScope";
@@ -266,8 +263,8 @@
   auth->Set(kPairingKey, pairing_types.release());
 
   std::unique_ptr<base::ListValue> auth_types(new base::ListValue());
-  auth_types->AppendString(kAuthTypeAnonymousValue);
-  auth_types->AppendString(kAuthTypePairingValue);
+  auth_types->AppendString(EnumToString(AuthType::kAnonymous));
+  auth_types->AppendString(EnumToString(AuthType::kPairing));
 
   // TODO(vitalybuka): Implement cloud auth.
   // if (cloud.GetConnectionState().IsStatusEqual(ConnectionState::kOnline)) {
@@ -513,7 +510,7 @@
     return ReturnError(*error, callback);
   }
   UserInfo user_info;
-  if (token != kAuthTypeAnonymousValue) {
+  if (token != EnumToString(AuthType::kAnonymous)) {
     if (!security_->ParseAccessToken(token, &user_info, &error))
       return ReturnError(*error, callback);
   }
@@ -678,27 +675,37 @@
   ErrorPtr error;
 
   std::string auth_code_type;
-  input.GetString(kAuthModeKey, &auth_code_type);
+  AuthType auth_type{};
+  if (!input.GetString(kAuthModeKey, &auth_code_type) ||
+      !StringToEnum(auth_code_type, &auth_type)) {
+    Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
+                       errors::kInvalidAuthMode, kInvalidParamValueFormat,
+                       kAuthModeKey, auth_code_type.c_str());
+    return ReturnError(*error, callback);
+  }
 
   std::string auth_code;
   input.GetString(kAuthCodeKey, &auth_code);
 
   AuthScope max_auth_scope = AuthScope::kNone;
-  if (auth_code_type == kAuthTypeAnonymousValue) {
-    max_auth_scope = GetAnonymousMaxScope(*cloud_, wifi_);
-  } else if (auth_code_type == kAuthTypePairingValue) {
-    if (!security_->IsValidPairingCode(auth_code)) {
+  switch (auth_type) {
+    case AuthType::kAnonymous:
+      max_auth_scope = GetAnonymousMaxScope(*cloud_, wifi_);
+      break;
+    case AuthType::kPairing:
+      if (!security_->IsValidPairingCode(auth_code)) {
+        Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
+                           errors::kInvalidAuthCode, kInvalidParamValueFormat,
+                           kAuthCodeKey, auth_code.c_str());
+        return ReturnError(*error, callback);
+      }
+      max_auth_scope = AuthScope::kOwner;
+      break;
+    default:
       Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
-                         errors::kInvalidAuthCode, kInvalidParamValueFormat,
-                         kAuthCodeKey, auth_code.c_str());
+                         errors::kInvalidAuthMode, kInvalidParamValueFormat,
+                         kAuthModeKey, auth_code_type.c_str());
       return ReturnError(*error, callback);
-    }
-    max_auth_scope = AuthScope::kOwner;
-  } else {
-    Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
-                       errors::kInvalidAuthMode, kInvalidParamValueFormat,
-                       kAuthModeKey, auth_code_type.c_str());
-    return ReturnError(*error, callback);
   }
 
   std::string requested_scope;
diff --git a/src/privet/privet_types.cc b/src/privet/privet_types.cc
index 7c85937..dd291b3 100644
--- a/src/privet/privet_types.cc
+++ b/src/privet/privet_types.cc
@@ -14,6 +14,7 @@
 
 namespace {
 
+using privet::AuthType;
 using privet::ConnectionState;
 using privet::CryptoType;
 using privet::SetupState;
@@ -25,6 +26,12 @@
     {PairingType::kEmbeddedCode, "embeddedCode"},
 };
 
+const EnumToStringMap<AuthType>::Map kAuthTypeMap[] = {
+    {AuthType::kAnonymous, "anonymous"},
+    {AuthType::kPairing, "pairing"},
+    {AuthType::kLocal, "local"},
+};
+
 const EnumToStringMap<ConnectionState::Status>::Map kConnectionStateMap[] = {
     {ConnectionState::kDisabled, "disabled"},
     {ConnectionState::kUnconfigured, "unconfigured"},
@@ -71,6 +78,10 @@
     : EnumToStringMap(kPairingTypeMap) {}
 
 template <>
+LIBWEAVE_EXPORT EnumToStringMap<AuthType>::EnumToStringMap()
+    : EnumToStringMap(kAuthTypeMap) {}
+
+template <>
 LIBWEAVE_EXPORT EnumToStringMap<ConnectionState::Status>::EnumToStringMap()
     : EnumToStringMap(kConnectionStateMap) {}
 
diff --git a/src/privet/privet_types.h b/src/privet/privet_types.h
index bc8e400..536fb89 100644
--- a/src/privet/privet_types.h
+++ b/src/privet/privet_types.h
@@ -19,6 +19,12 @@
   kSpake_p224,
 };
 
+enum class AuthType {
+  kAnonymous,
+  kPairing,
+  kLocal,
+};
+
 enum class WifiType {
   kWifi24,
   kWifi50,