Chromium Code Reviews| 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..b11bba5c03dee30fdd9e64b0555d9484215bdbf3 |
| --- /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/internal_api/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 |
|
Nicolas Zea
2011/08/16 19:39:07
FIXME...->TODO(rlarocque): move this
rlarocque
2011/08/16 22:19:19
Deleted. (I already moved the file and should hav
|
| +sync_pb::PasswordSpecificsData* DecryptPasswordSpecifics( |
|
Nicolas Zea
2011/08/16 19:39:07
I think all three of these methods can actually be
rlarocque
2011/08/16 22:19:19
Sadly, no.
* DecryptPasswordSpecifics is used in
|
| + 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, |
|
Nicolas Zea
2011/08/16 19:39:07
fix indent
rlarocque
2011/08/16 22:19:19
Done.
|
| + 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 |