logger.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2014 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. #include "components/cast_channel/logger.h"
  5. #include <stdint.h>
  6. #include <string>
  7. #include <utility>
  8. #include "base/strings/string_util.h"
  9. #include "components/cast_channel/cast_auth_util.h"
  10. #include "components/cast_channel/cast_socket.h"
  11. #include "net/base/net_errors.h"
  12. namespace cast_channel {
  13. using net::IPEndPoint;
  14. namespace {
  15. ChallengeReplyError AuthErrorToChallengeReplyError(
  16. AuthResult::ErrorType error_type) {
  17. switch (error_type) {
  18. case AuthResult::ERROR_NONE:
  19. return ChallengeReplyError::NONE;
  20. case AuthResult::ERROR_PEER_CERT_EMPTY:
  21. return ChallengeReplyError::PEER_CERT_EMPTY;
  22. case AuthResult::ERROR_WRONG_PAYLOAD_TYPE:
  23. return ChallengeReplyError::WRONG_PAYLOAD_TYPE;
  24. case AuthResult::ERROR_NO_PAYLOAD:
  25. return ChallengeReplyError::NO_PAYLOAD;
  26. case AuthResult::ERROR_PAYLOAD_PARSING_FAILED:
  27. return ChallengeReplyError::PAYLOAD_PARSING_FAILED;
  28. case AuthResult::ERROR_MESSAGE_ERROR:
  29. return ChallengeReplyError::MESSAGE_ERROR;
  30. case AuthResult::ERROR_NO_RESPONSE:
  31. return ChallengeReplyError::NO_RESPONSE;
  32. case AuthResult::ERROR_FINGERPRINT_NOT_FOUND:
  33. return ChallengeReplyError::FINGERPRINT_NOT_FOUND;
  34. case AuthResult::ERROR_CERT_PARSING_FAILED:
  35. return ChallengeReplyError::CERT_PARSING_FAILED;
  36. case AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA:
  37. return ChallengeReplyError::CERT_NOT_SIGNED_BY_TRUSTED_CA;
  38. case AuthResult::ERROR_CANNOT_EXTRACT_PUBLIC_KEY:
  39. return ChallengeReplyError::CANNOT_EXTRACT_PUBLIC_KEY;
  40. case AuthResult::ERROR_SIGNED_BLOBS_MISMATCH:
  41. return ChallengeReplyError::SIGNED_BLOBS_MISMATCH;
  42. case AuthResult::ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG:
  43. return ChallengeReplyError::TLS_CERT_VALIDITY_PERIOD_TOO_LONG;
  44. case AuthResult::ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE:
  45. return ChallengeReplyError::TLS_CERT_VALID_START_DATE_IN_FUTURE;
  46. case AuthResult::ERROR_TLS_CERT_EXPIRED:
  47. return ChallengeReplyError::TLS_CERT_EXPIRED;
  48. case AuthResult::ERROR_CRL_INVALID:
  49. return ChallengeReplyError::CRL_INVALID;
  50. case AuthResult::ERROR_CERT_REVOKED:
  51. return ChallengeReplyError::CERT_REVOKED;
  52. case AuthResult::ERROR_SENDER_NONCE_MISMATCH:
  53. return ChallengeReplyError::SENDER_NONCE_MISMATCH;
  54. case AuthResult::ERROR_SIGNATURE_EMPTY:
  55. return ChallengeReplyError::SIGNATURE_EMPTY;
  56. case AuthResult::ERROR_DIGEST_UNSUPPORTED:
  57. return ChallengeReplyError::DIGEST_UNSUPPORTED;
  58. default:
  59. NOTREACHED();
  60. return ChallengeReplyError::NONE;
  61. }
  62. }
  63. } // namespace
  64. LastError::LastError()
  65. : channel_event(ChannelEvent::UNKNOWN),
  66. challenge_reply_error(ChallengeReplyError::NONE),
  67. net_return_value(net::OK) {}
  68. LastError::~LastError() {}
  69. Logger::Logger() {
  70. // Logger may not be necessarily be created on the IO thread, but logging
  71. // happens exclusively there.
  72. DETACH_FROM_THREAD(thread_checker_);
  73. }
  74. Logger::~Logger() {}
  75. void Logger::LogSocketEventWithRv(int channel_id,
  76. ChannelEvent channel_event,
  77. int rv) {
  78. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  79. MaybeSetLastError(channel_id, channel_event, rv, ChallengeReplyError::NONE);
  80. }
  81. void Logger::LogSocketChallengeReplyEvent(int channel_id,
  82. const AuthResult& auth_result) {
  83. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  84. MaybeSetLastError(channel_id, ChannelEvent::AUTH_CHALLENGE_REPLY, net::OK,
  85. AuthErrorToChallengeReplyError(auth_result.error_type));
  86. }
  87. LastError Logger::GetLastError(int channel_id) const {
  88. const auto it = last_errors_.find(channel_id);
  89. return it != last_errors_.end() ? it->second : LastError();
  90. }
  91. void Logger::ClearLastError(int channel_id) {
  92. last_errors_.erase(channel_id);
  93. }
  94. void Logger::MaybeSetLastError(int channel_id,
  95. ChannelEvent channel_event,
  96. int rv,
  97. ChallengeReplyError challenge_reply_error) {
  98. auto it = last_errors_.find(channel_id);
  99. if (it == last_errors_.end())
  100. last_errors_[channel_id] = LastError();
  101. LastError* last_error = &last_errors_[channel_id];
  102. if (rv < net::ERR_IO_PENDING) {
  103. last_error->net_return_value = rv;
  104. last_error->channel_event = channel_event;
  105. }
  106. if (challenge_reply_error != ChallengeReplyError::NONE) {
  107. last_error->challenge_reply_error = challenge_reply_error;
  108. last_error->channel_event = channel_event;
  109. }
  110. }
  111. } // namespace cast_channel