| Index: chrome/browser/sync/engine/syncapi_internal.cc
|
| diff --git a/chrome/browser/sync/engine/syncapi_internal.cc b/chrome/browser/sync/engine/syncapi_internal.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4f734ebe11dc9a447c0799cd7ef9b188248c9bb3
|
| --- /dev/null
|
| +++ b/chrome/browser/sync/engine/syncapi_internal.cc
|
| @@ -0,0 +1,79 @@
|
| +// Copyright (c) 2011 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 "chrome/browser/sync/engine/syncapi_internal.h"
|
| +
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/sync/util/cryptographer.h"
|
| +#include "chrome/browser/sync/protocol/password_specifics.pb.h"
|
| +
|
| +using browser_sync::Cryptographer;
|
| +
|
| +namespace sync_api {
|
| +
|
| +// global helper function: FIXME move this
|
| +sync_pb::PasswordSpecificsData* DecryptPasswordSpecifics(
|
| + const sync_pb::EntitySpecifics& specifics, Cryptographer* crypto) {
|
| + if (!specifics.HasExtension(sync_pb::password))
|
| + return NULL;
|
| + const sync_pb::PasswordSpecifics& password_specifics =
|
| + specifics.GetExtension(sync_pb::password);
|
| + if (!password_specifics.has_encrypted())
|
| + return NULL;
|
| + const sync_pb::EncryptedData& encrypted = password_specifics.encrypted();
|
| + scoped_ptr<sync_pb::PasswordSpecificsData> data(
|
| + new sync_pb::PasswordSpecificsData);
|
| + if (!crypto->Decrypt(encrypted, data.get()))
|
| + return NULL;
|
| + return data.release();
|
| +}
|
| +
|
| +// The list of names which are reserved for use by the server.
|
| +static const char* kForbiddenServerNames[] = { "", ".", ".." };
|
| +
|
| +// Checks whether |name| is a server-illegal name followed by zero or more space
|
| +// characters. The three server-illegal names are the empty string, dot, and
|
| +// dot-dot. Very long names (>255 bytes in UTF-8 Normalization Form C) are
|
| +// also illegal, but are not considered here.
|
| +bool IsNameServerIllegalAfterTrimming(const std::string& name) {
|
| + size_t untrimmed_count = name.find_last_not_of(' ') + 1;
|
| + for (size_t i = 0; i < arraysize(kForbiddenServerNames); ++i) {
|
| + if (name.compare(0, untrimmed_count, kForbiddenServerNames[i]) == 0)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// Compare the values of two EntitySpecifics, accounting for encryption.
|
| +bool AreSpecificsEqual(const browser_sync::Cryptographer* cryptographer,
|
| + const sync_pb::EntitySpecifics& left,
|
| + const sync_pb::EntitySpecifics& right) {
|
| + // Note that we can't compare encrypted strings directly as they are seeded
|
| + // with a random value.
|
| + std::string left_plaintext, right_plaintext;
|
| + if (left.has_encrypted()) {
|
| + if (!cryptographer->CanDecrypt(left.encrypted())) {
|
| + NOTREACHED() << "Attempting to compare undecryptable data.";
|
| + return false;
|
| + }
|
| + left_plaintext = cryptographer->DecryptToString(left.encrypted());
|
| + } else {
|
| + left_plaintext = left.SerializeAsString();
|
| + }
|
| + if (right.has_encrypted()) {
|
| + if (!cryptographer->CanDecrypt(right.encrypted())) {
|
| + NOTREACHED() << "Attempting to compare undecryptable data.";
|
| + return false;
|
| + }
|
| + right_plaintext = cryptographer->DecryptToString(right.encrypted());
|
| + } else {
|
| + right_plaintext = right.SerializeAsString();
|
| + }
|
| + if (left_plaintext == right_plaintext) {
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +} // namespace sync_api
|
|
|