blob: 4093ccb297db301766bf61992ea77ed9dd16c6a6 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cloud_print/gcp20/prototype/x_privet_token.h"
#include "base/base64.h"
#include "base/format_macros.h"
#include "base/guid.h"
#include "base/logging.h"
#include "base/sha1.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
namespace {
const char kXPrivetTokenDelimeter = ':';
const uint64 kTimeExpiration = 24*60*60; // in seconds
const uint64 kTimeSecretRefresh = 24*60*60; // in seconds
} // namespace
using base::Time;
using base::TimeDelta;
XPrivetToken::XPrivetToken() {
UpdateSecret();
}
XPrivetToken::XPrivetToken(const std::string& secret,
const base::Time& gen_time)
: secret_(secret),
last_gen_time_(gen_time) {
}
std::string XPrivetToken::GenerateXToken() {
if (Time::Now() > last_gen_time_ + TimeDelta::FromSeconds(kTimeSecretRefresh))
UpdateSecret();
return GenerateXTokenWithTime(static_cast<uint64>(Time::Now().ToTimeT()));
}
bool XPrivetToken::CheckValidXToken(const std::string& token) const {
size_t delimeter_pos = token.find(kXPrivetTokenDelimeter);
if (delimeter_pos == std::string::npos)
return false;
std::string issue_time_str = token.substr(delimeter_pos + 1);
uint64 issue_time;
if (!base::StringToUint64(issue_time_str, &issue_time))
return false;
if (GenerateXTokenWithTime(issue_time) != token)
return false;
return Time::FromTimeT(issue_time) - last_gen_time_ <
TimeDelta::FromSeconds(kTimeExpiration);
}
std::string XPrivetToken::GenerateXTokenWithTime(uint64 issue_time) const {
std::string result;
std::string issue_time_str = base::StringPrintf("%" PRIu64, issue_time);
std::string hash = base::SHA1HashString(secret_ +
kXPrivetTokenDelimeter +
issue_time_str);
base::Base64Encode(hash, &result);
return result + kXPrivetTokenDelimeter + issue_time_str;
}
void XPrivetToken::UpdateSecret() {
secret_ = base::GenerateGUID();
last_gen_time_ = base::Time::Now();
VLOG(1) << "New Secret is Generated.";
}