1 // Copyright 2013 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.
5 #include "cloud_print/gcp20/prototype/x_privet_token.h"
7 #include "base/base64.h"
8 #include "base/format_macros.h"
10 #include "base/logging.h"
11 #include "base/sha1.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/stringprintf.h"
17 const char kXPrivetTokenDelimeter = ':';
18 const uint64 kTimeExpiration = 24*60*60; // in seconds
19 const uint64 kTimeSecretRefresh = 24*60*60; // in seconds
24 using base::TimeDelta;
26 XPrivetToken::XPrivetToken() {
30 XPrivetToken::XPrivetToken(const std::string& secret,
31 const base::Time& gen_time)
33 last_gen_time_(gen_time) {
36 std::string XPrivetToken::GenerateXToken() {
37 if (Time::Now() > last_gen_time_ + TimeDelta::FromSeconds(kTimeSecretRefresh))
40 return GenerateXTokenWithTime(static_cast<uint64>(Time::Now().ToTimeT()));
43 bool XPrivetToken::CheckValidXToken(const std::string& token) const {
44 size_t delimeter_pos = token.find(kXPrivetTokenDelimeter);
45 if (delimeter_pos == std::string::npos)
48 std::string issue_time_str = token.substr(delimeter_pos + 1);
50 if (!base::StringToUint64(issue_time_str, &issue_time))
53 if (GenerateXTokenWithTime(issue_time) != token)
56 return Time::FromTimeT(issue_time) - last_gen_time_ <
57 TimeDelta::FromSeconds(kTimeExpiration);
60 std::string XPrivetToken::GenerateXTokenWithTime(uint64 issue_time) const {
62 std::string issue_time_str = base::StringPrintf("%"PRIu64, issue_time);
63 std::string hash = base::SHA1HashString(secret_ +
64 kXPrivetTokenDelimeter +
66 base::Base64Encode(hash, &result);
67 return result + kXPrivetTokenDelimeter + issue_time_str;
70 void XPrivetToken::UpdateSecret() {
71 secret_ = base::GenerateGUID();
72 last_gen_time_ = base::Time::Now();
73 VLOG(1) << "New Secret is Generated.";