Commit 8868adce authored by Josh Nohle's avatar Josh Nohle Committed by Commit Bot

Expand ResultCodes and overload <<

Expand CryptAuthEnrollmentResult::ResultCode enum to accommodate more
fine-grained error codes as well as error codes relevant to the
enrollment manager, such as kErrorGcmRegistrationFailed and
kErrorClientAppMetadataFetchFailed.

We also overload the << operator for ResultCode printing.

Bug: 899080
Change-Id: I69a3e97e6987d4e3e54444febdecde3ef40137c9
Reviewed-on: https://chromium-review.googlesource.com/c/1488116
Commit-Queue: Josh Nohle <nohle@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635592}
parent 77b87b71
......@@ -8,33 +8,6 @@ namespace chromeos {
namespace device_sync {
// static
CryptAuthEnrollmentResult::ResultCode
CryptAuthEnrollmentResult::NetworkRequestErrorToResultCode(
NetworkRequestError error) {
switch (error) {
case NetworkRequestError::kOffline:
return CryptAuthEnrollmentResult::ResultCode::kNetworkRequestErrorOffline;
case NetworkRequestError::kEndpointNotFound:
return CryptAuthEnrollmentResult::ResultCode::
kNetworkRequestErrorEndpointNotFound;
case NetworkRequestError::kAuthenticationError:
return CryptAuthEnrollmentResult::ResultCode::
kNetworkRequestErrorAuthenticationError;
case NetworkRequestError::kBadRequest:
return CryptAuthEnrollmentResult::ResultCode::
kNetworkRequestErrorBadRequest;
case NetworkRequestError::kResponseMalformed:
return CryptAuthEnrollmentResult::ResultCode::
kNetworkRequestErrorResponseMalformed;
case NetworkRequestError::kInternalServerError:
return CryptAuthEnrollmentResult::ResultCode::
kNetworkRequestErrorInternalServerError;
case NetworkRequestError::kUnknown:
return CryptAuthEnrollmentResult::ResultCode::kNetworkRequestErrorUnknown;
}
}
CryptAuthEnrollmentResult::CryptAuthEnrollmentResult(
ResultCode result_code,
const base::Optional<cryptauthv2::ClientDirective>& client_directive)
......@@ -50,6 +23,129 @@ bool CryptAuthEnrollmentResult::IsSuccess() const {
result_code_ == ResultCode::kSuccessNoNewKeysNeeded;
}
bool CryptAuthEnrollmentResult::operator==(
const CryptAuthEnrollmentResult& other) const {
return result_code_ == other.result_code_ &&
client_directive_.has_value() == other.client_directive_.has_value() &&
(!client_directive_ ||
client_directive_->SerializeAsString() ==
other.client_directive_->SerializeAsString());
}
bool CryptAuthEnrollmentResult::operator!=(
const CryptAuthEnrollmentResult& other) const {
return !(*this == other);
}
std::ostream& operator<<(
std::ostream& stream,
const CryptAuthEnrollmentResult::ResultCode result_code) {
using ResultCode = CryptAuthEnrollmentResult::ResultCode;
switch (result_code) {
case ResultCode::kSuccessNoNewKeysNeeded:
stream << "[Success: No new keys needed]";
break;
case ResultCode::kSuccessNewKeysEnrolled:
stream << "[Success: New keys enrolled]";
break;
case ResultCode::kErrorSyncKeysApiCallOffline:
stream << "[SyncKeys API call failed: Offline]";
break;
case ResultCode::kErrorSyncKeysApiCallEndpointNotFound:
stream << "[SyncKeys API call failed: Endpoint not found]";
break;
case ResultCode::kErrorSyncKeysApiCallAuthenticationError:
stream << "[SyncKeys API call failed: Authentication error]";
break;
case ResultCode::kErrorSyncKeysApiCallBadRequest:
stream << "[SyncKeys API call failed: Bad request]";
break;
case ResultCode::kErrorSyncKeysApiCallResponseMalformed:
stream << "[SyncKeys API call failed: Response malformed]";
break;
case ResultCode::kErrorSyncKeysApiCallInternalServerError:
stream << "[SyncKeys API call failed: Internal server error]";
break;
case ResultCode::kErrorSyncKeysApiCallUnknownError:
stream << "[SyncKeys API call failed: Unknown error]";
break;
case ResultCode::kErrorEnrollKeysApiCallOffline:
stream << "[EnrollKeys API call failed: Offline]";
break;
case ResultCode::kErrorEnrollKeysApiCallEndpointNotFound:
stream << "[EnrollKeys API call failed: Endpoint not found]";
break;
case ResultCode::kErrorEnrollKeysApiCallAuthenticationError:
stream << "[EnrollKeys API call failed: Authentication error]";
break;
case ResultCode::kErrorEnrollKeysApiCallBadRequest:
stream << "[EnrollKeys API call failed: Bad request]";
break;
case ResultCode::kErrorEnrollKeysApiCallResponseMalformed:
stream << "[EnrollKeys API call failed: Response malformed]";
break;
case ResultCode::kErrorEnrollKeysApiCallInternalServerError:
stream << "[EnrollKeys API call failed: Internal server error]";
break;
case ResultCode::kErrorEnrollKeysApiCallUnknownError:
stream << "[EnrollKeys API call failed: Unknown error]";
break;
case ResultCode::kErrorCryptAuthServerOverloaded:
stream << "[Error: CryptAuth server overloaded]";
break;
case ResultCode::kErrorSyncKeysResponseMissingRandomSessionId:
stream << "[Error: SyncKeysResponse missing session ID]";
break;
case ResultCode::kErrorSyncKeysResponseInvalidClientDirective:
stream << "[Error: Missing/invalid ClientDirective in SyncKeysResponse]";
break;
case ResultCode::kErrorWrongNumberOfSyncSingleKeyResponses:
stream << "[Error: Wrong number of SyncSingleKeyResponses]";
break;
case ResultCode::kErrorWrongNumberOfKeyActions:
stream << "[Error: Wrong number of key actions]";
break;
case ResultCode::kErrorInvalidKeyActionEnumValue:
stream << "[Error: Invalid KeyAction enum value]";
break;
case ResultCode::kErrorKeyActionsSpecifyMultipleActiveKeys:
stream << "[Error: KeyActions specify multiple active keys]";
break;
case ResultCode::kErrorKeyActionsDoNotSpecifyAnActiveKey:
stream << "[Error: KeyActions do not specify an active key]";
break;
case ResultCode::kErrorKeyCreationKeyTypeNotSupported:
stream << "[Error: KeyCreation instructions specify unsupported KeyType]";
break;
case ResultCode::kErrorSymmetricKeyCreationMissingServerDiffieHellman:
stream << "[Error: Cannot create symmetric key; missing server "
<< "Diffie-Hellman key]";
break;
case ResultCode::kErrorTimeoutWaitingForSyncKeysResponse:
stream << "[Error: Timeout waiting for SyncKeys response]";
break;
case ResultCode::kErrorTimeoutWaitingForKeyCreation:
stream << "[Error: Timeout waiting for key creation]";
break;
case ResultCode::kErrorTimeoutWaitingForKeyProofComputation:
stream << "[Error: Timeout waiting for key proof computation]";
break;
case ResultCode::kErrorTimeoutWaitingForEnrollKeysResponse:
stream << "[Error: Timeout waiting for EnrollKeys response]";
break;
case ResultCode::kErrorGcmRegistrationFailed:
stream << "[Error: GCM registration failed]";
break;
case ResultCode::kErrorClientAppMetadataFetchFailed:
stream << "[Error: Could not retrieve ClientAppMetadata from "
<< "ClientAppMetadataProvider]";
break;
}
return stream;
}
} // namespace device_sync
} // namespace chromeos
......@@ -5,8 +5,9 @@
#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_ENROLLMENT_RESULT_H_
#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_ENROLLMENT_RESULT_H_
#include <ostream>
#include "base/optional.h"
#include "chromeos/services/device_sync/network_request_error.h"
#include "chromeos/services/device_sync/proto/cryptauth_directive.pb.h"
namespace chromeos {
......@@ -23,31 +24,79 @@ class CryptAuthEnrollmentResult {
kSuccessNoNewKeysNeeded,
// Successfully synced and enrolled new key(s) with CryptAuth.
kSuccessNewKeysEnrolled,
// Request could not be completed because the device is offline or has
// issues sending the HTTP request.
kNetworkRequestErrorOffline,
// Server endpoint could not be found.
kNetworkRequestErrorEndpointNotFound,
// Authentication error contacting back-end.
kNetworkRequestErrorAuthenticationError,
// Network request was invalid.
kNetworkRequestErrorBadRequest,
// The server responded, but the response was not formatted correctly.
kNetworkRequestErrorResponseMalformed,
// Internal server error.
kNetworkRequestErrorInternalServerError,
// Unknown network request error.
kNetworkRequestErrorUnknown,
// During SyncKeys API call, request could not be completed because the
// device is offline or has issues sending the HTTP request.
kErrorSyncKeysApiCallOffline,
// During SyncKeys API call, server endpoint could not be found.
kErrorSyncKeysApiCallEndpointNotFound,
// During SyncKeys API call, authentication error contacting back-end.
kErrorSyncKeysApiCallAuthenticationError,
// During SyncKeys API call, network request was invalid.
kErrorSyncKeysApiCallBadRequest,
// During SyncKeys API call, the server responded but the response was not
// formatted correctly.
kErrorSyncKeysApiCallResponseMalformed,
// During SyncKeys API call, internal server error.
kErrorSyncKeysApiCallInternalServerError,
// During SyncKeys API call, unknown network request error.
kErrorSyncKeysApiCallUnknownError,
// During EnrollKeys API call, request could not be completed because the
// device is offline or has issues sending the HTTP request.
kErrorEnrollKeysApiCallOffline,
// During EnrollKeys API call, server endpoint could not be found.
kErrorEnrollKeysApiCallEndpointNotFound,
// During EnrollKeys API call, authentication error contacting back-end.
kErrorEnrollKeysApiCallAuthenticationError,
// During EnrollKeys API call, network request was invalid.
kErrorEnrollKeysApiCallBadRequest,
// During EnrollKeys API call, the server responded but the response was not
// formatted correctly.
kErrorEnrollKeysApiCallResponseMalformed,
// During EnrollKeys API call, internal server error.
kErrorEnrollKeysApiCallInternalServerError,
// During EnrollKeys API call, unknown network request error.
kErrorEnrollKeysApiCallUnknownError,
// The CryptAuth server indicated via SyncKeysResponse::server_status that
// it was overloaded and did not process the SyncKeysRequest.
kErrorCryptAuthServerOverloaded,
// The data sent in the SyncKeysResponse is not self-consistent or is not
// consistent with the SyncKeysRequest data.
kErrorSyncKeysResponseMalformed,
// The SyncKeysResponse from CryptAuth is missing a random_session_id.
kErrorSyncKeysResponseMissingRandomSessionId,
// The SyncKeysResponse from CryptAuth is missing a client_directive or the
// parameters are invalid.
kErrorSyncKeysResponseInvalidClientDirective,
// The number of SyncSingleKeyResponses does not agree with the number of
// SyncSingleKeyRequests.
kErrorWrongNumberOfSyncSingleKeyResponses,
// The size of a SyncSingleKeyResponse::key_actions list does not agree with
// the size of the corresponding SyncSingleKeyRequest::key_handles.
kErrorWrongNumberOfKeyActions,
// An integer provided in SyncSingleKeyResponse::key_actions does not
// correspond to a known KeyAction enum value.
kErrorInvalidKeyActionEnumValue,
// The SyncSingleKeyResponse::key_actions denote more than one active key.
kErrorKeyActionsSpecifyMultipleActiveKeys,
// The SyncSingleKeyResponse::key_actions fail to specify an active key.
kErrorKeyActionsDoNotSpecifyAnActiveKey,
// KeyCreation instructions specify an unsupported KeyType.
kErrorKeyCreationKeyTypeNotSupported,
// Cannot create a symmetric key without the server's Diffie-Hellman key.
kErrorSymmetricKeyCreationMissingServerDiffieHellman,
// The enroller timed out waiting for response from the SyncKeys API call.
kErrorTimeoutWaitingForSyncKeysResponse,
// The enroller timed out waiting for new keys to be created.
kErrorTimeoutWaitingForKeyCreation,
// The enroller timed out waiting for key proofs to be computed.
kErrorTimeoutWaitingForKeyProofComputation,
// The enroller timed out waiting for response from the EnrollKeys API call.
kErrorTimeoutWaitingForEnrollKeysResponse,
// Failed to register local device with GCM. This registration is required
// in order for CryptAuth to send GCM messages to the local device,
// requesting it to re-enroll or re-sync.
kErrorGcmRegistrationFailed,
// Could not retrieve ClientAppMetadata from ClientAppMetadataProvider.
kErrorClientAppMetadataFetchFailed
};
static ResultCode NetworkRequestErrorToResultCode(NetworkRequestError error);
CryptAuthEnrollmentResult(
ResultCode result_code,
const base::Optional<cryptauthv2::ClientDirective>& client_directive);
......@@ -63,11 +112,18 @@ class CryptAuthEnrollmentResult {
bool IsSuccess() const;
bool operator==(const CryptAuthEnrollmentResult& other) const;
bool operator!=(const CryptAuthEnrollmentResult& other) const;
private:
ResultCode result_code_;
base::Optional<cryptauthv2::ClientDirective> client_directive_;
};
std::ostream& operator<<(
std::ostream& stream,
const CryptAuthEnrollmentResult::ResultCode result_code);
} // namespace device_sync
} // namespace chromeos
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment