prefs.cc revision 08fce04e5341c99f308ee7462b1f351f5232eacd
1480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
23003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov// Use of this source code is governed by a BSD-style license that can be
33003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov// found in the LICENSE file.
43003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
53003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov#include "update_engine/prefs.h"
63003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
7362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov#include <base/file_util.h>
8362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov#include <base/logging.h>
9362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov#include <base/string_number_conversions.h>
10362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov#include <base/string_util.h>
11362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov
123003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov#include "update_engine/utils.h"
133003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
143003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovusing std::string;
153003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
163003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovnamespace chromeos_update_engine {
173003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
187f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rochaconst char kPrefsCertificateReportToSendDownload[] =
197f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha    "certificate-report-to-send-download";
207f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rochaconst char kPrefsCertificateReportToSendUpdate[] =
217f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha    "certificate-report-to-send-update";
22362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkovconst char kPrefsDeltaUpdateFailures[] = "delta-update-failures";
231cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovconst char kPrefsLastActivePingDay[] = "last-active-ping-day";
241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovconst char kPrefsLastRollCallPingDay[] = "last-roll-call-ping-day";
2573058b421f91e04cc605c2a113e0010009a63594Darin Petkovconst char kPrefsManifestMetadataSize[] = "manifest-metadata-size";
2695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkovconst char kPrefsPreviousVersion[] = "previous-version";
2761426148f598f5a60aea5d1fca031d4e8efec0c5Darin Petkovconst char kPrefsResumedUpdateFailures[] = "resumed-update-failures";
2873058b421f91e04cc605c2a113e0010009a63594Darin Petkovconst char kPrefsUpdateCheckResponseHash[] = "update-check-response-hash";
297f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rochaconst char kPrefsUpdateServerCertificate[] = "update-server-cert";
3073058b421f91e04cc605c2a113e0010009a63594Darin Petkovconst char kPrefsUpdateStateNextDataOffset[] = "update-state-next-data-offset";
3173058b421f91e04cc605c2a113e0010009a63594Darin Petkovconst char kPrefsUpdateStateNextOperation[] = "update-state-next-operation";
32437adc42c20d783547b5de3342e505c1799d9563Darin Petkovconst char kPrefsUpdateStateSHA256Context[] = "update-state-sha-256-context";
334f0a07bc1bc46c3c1ac36ba57d693c61a71227ceDarin Petkovconst char kPrefsUpdateStateSignatureBlob[] = "update-state-signature-blob";
3473058b421f91e04cc605c2a113e0010009a63594Darin Petkovconst char kPrefsUpdateStateSignedSHA256Context[] =
3573058b421f91e04cc605c2a113e0010009a63594Darin Petkov    "update-state-signed-sha-256-context";
36480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanconst char kPrefsUpdateCheckCount[] = "update-check-count";
37480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanconst char kPrefsWallClockWaitPeriod[] = "wall-clock-wait-period";
381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
393003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::Init(const FilePath& prefs_dir) {
403003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  prefs_dir_ = prefs_dir;
413003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
423003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
433003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
443003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::GetString(const string& key, string* value) {
453003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  FilePath filename;
463003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
4734e41a1b50ccd06f5b3dad7a1ab1d467c7e8e00eAndrew de los Reyes  if (!file_util::ReadFileToString(filename, value)) {
4808fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan    LOG(INFO) << key << " not present in " << prefs_dir_.value();
4934e41a1b50ccd06f5b3dad7a1ab1d467c7e8e00eAndrew de los Reyes    return false;
5034e41a1b50ccd06f5b3dad7a1ab1d467c7e8e00eAndrew de los Reyes  }
513003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
523003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
533003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
543003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::SetString(const std::string& key, const std::string& value) {
553003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  FilePath filename;
563003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
573003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(file_util::CreateDirectory(filename.DirName()));
583003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(
593003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov      file_util::WriteFile(filename, value.data(), value.size()) ==
603003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov      static_cast<int>(value.size()));
613003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
623003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
633003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
643003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::GetInt64(const string& key, int64_t* value) {
653003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  string str_value;
6608fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  if (!GetString(key, &str_value))
6708fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan    return false;
683003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TrimWhitespaceASCII(str_value, TRIM_ALL, &str_value);
69790e62e2d8114647b0785574bea361cf931c482bChris Masone  TEST_AND_RETURN_FALSE(base::StringToInt64(str_value, value));
703003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
713003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
723003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
733003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::SetInt64(const string& key, const int64_t value) {
74790e62e2d8114647b0785574bea361cf931c482bChris Masone  return SetString(key, base::Int64ToString(value));
753003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
763003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
77480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool Prefs::Exists(const string& key) {
78480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  FilePath filename;
79480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
80480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  return file_util::PathExists(filename);
81480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
82480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
83480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool Prefs::Delete(const string& key) {
84480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  FilePath filename;
85480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
86480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  return file_util::Delete(filename, false);
87480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
88480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
893003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::GetFileNameForKey(const std::string& key, FilePath* filename) {
903003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  // Allows only non-empty keys containing [A-Za-z0-9_-].
913003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(!key.empty());
923003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  for (size_t i = 0; i < key.size(); ++i) {
933003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov    char c = key.at(i);
943003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov    TEST_AND_RETURN_FALSE(IsAsciiAlpha(c) || IsAsciiDigit(c) ||
953003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov                          c == '_' || c == '-');
963003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  }
973003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  *filename = prefs_dir_.Append(key);
983003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
993003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
1003003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
1013003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}  // namespace chromeos_update_engine
102