diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-21 09:59:42 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-21 09:59:42 +0000 |
commit | 91835ca82c6ff7f1aeb68e314a3842da1aca6841 (patch) | |
tree | c7e8119bd0fb2a8e1d6910c969e1d3f62dbff1f8 /sync/internal_api/syncapi_internal.cc | |
parent | 7983f3bae6ab9c86aea81816e6bb1bd15ab114fe (diff) | |
download | chromium_src-91835ca82c6ff7f1aeb68e314a3842da1aca6841.zip chromium_src-91835ca82c6ff7f1aeb68e314a3842da1aca6841.tar.gz chromium_src-91835ca82c6ff7f1aeb68e314a3842da1aca6841.tar.bz2 |
[Sync] Move 'syncapi_core' and 'sync_unit_tests' targets to sync/
Also move related test files.
Lock down deps for sync/internal_api.
Clean up some deps on chrome/browser/sync.
BUG=117585
TEST=
Review URL: https://chromiumcodereview.appspot.com/10147003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133349 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/internal_api/syncapi_internal.cc')
-rw-r--r-- | sync/internal_api/syncapi_internal.cc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/sync/internal_api/syncapi_internal.cc b/sync/internal_api/syncapi_internal.cc new file mode 100644 index 0000000..0f7a27a --- /dev/null +++ b/sync/internal_api/syncapi_internal.cc @@ -0,0 +1,87 @@ +// Copyright (c) 2012 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 "sync/internal_api/syncapi_internal.h" + +#include "base/memory/scoped_ptr.h" +#include "sync/protocol/password_specifics.pb.h" +#include "sync/protocol/sync.pb.h" +#include "sync/util/cryptographer.h" + +using browser_sync::Cryptographer; + +namespace sync_api { + +sync_pb::PasswordSpecificsData* DecryptPasswordSpecifics( + const sync_pb::EntitySpecifics& specifics, Cryptographer* crypto) { + if (!specifics.has_password()) + return NULL; + const sync_pb::PasswordSpecifics& password_specifics = specifics.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[] = { "", ".", ".." }; + +// When taking a name from the syncapi, append a space if it matches the +// pattern of a server-illegal name followed by zero or more spaces. +void SyncAPINameToServerName(const std::string& sync_api_name, + std::string* out) { + *out = sync_api_name; + if (IsNameServerIllegalAfterTrimming(*out)) + out->append(" "); +} + +// 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 |