Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: chrome/utility/importer/nss_decryptor.cc

Issue 427303004: Fix various bits of error-handling in NSSDecryptor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: isherman comment Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/utility/importer/firefox_importer_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/utility/importer/nss_decryptor.h" 5 #include "chrome/utility/importer/nss_decryptor.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 * the provisions above, a recipient may use your version of this file under 59 * the provisions above, a recipient may use your version of this file under
60 * the terms of any one of the MPL, the GPL or the LGPL. 60 * the terms of any one of the MPL, the GPL or the LGPL.
61 * 61 *
62 * ***** END LICENSE BLOCK ***** */ 62 * ***** END LICENSE BLOCK ***** */
63 63
64 base::string16 NSSDecryptor::Decrypt(const std::string& crypt) const { 64 base::string16 NSSDecryptor::Decrypt(const std::string& crypt) const {
65 // Do nothing if NSS is not loaded. 65 // Do nothing if NSS is not loaded.
66 if (!is_nss_initialized_) 66 if (!is_nss_initialized_)
67 return base::string16(); 67 return base::string16();
68 68
69 if (crypt.empty())
70 return base::string16();
71
69 // The old style password is encoded in base64. They are identified 72 // The old style password is encoded in base64. They are identified
70 // by a leading '~'. Otherwise, we should decrypt the text. 73 // by a leading '~'. Otherwise, we should decrypt the text.
71 std::string plain; 74 std::string plain;
72 if (crypt[0] != '~') { 75 if (crypt[0] != '~') {
73 std::string decoded_data; 76 std::string decoded_data;
74 base::Base64Decode(crypt, &decoded_data); 77 if (!base::Base64Decode(crypt, &decoded_data))
78 return base::string16();
75 PK11SlotInfo* slot = GetKeySlotForDB(); 79 PK11SlotInfo* slot = GetKeySlotForDB();
76 SECStatus result = PK11_Authenticate(slot, PR_TRUE, NULL); 80 SECStatus result = PK11_Authenticate(slot, PR_TRUE, NULL);
77 if (result != SECSuccess) { 81 if (result != SECSuccess) {
78 FreeSlot(slot); 82 FreeSlot(slot);
79 return base::string16(); 83 return base::string16();
80 } 84 }
81 85
82 SECItem request; 86 SECItem request;
83 request.data = reinterpret_cast<unsigned char*>( 87 request.data = reinterpret_cast<unsigned char*>(
84 const_cast<char*>(decoded_data.data())); 88 const_cast<char*>(decoded_data.data()));
85 request.len = static_cast<unsigned int>(decoded_data.size()); 89 request.len = static_cast<unsigned int>(decoded_data.size());
86 SECItem reply; 90 SECItem reply;
87 reply.data = NULL; 91 reply.data = NULL;
88 reply.len = 0; 92 reply.len = 0;
89 #if defined(USE_NSS) 93 #if defined(USE_NSS)
90 result = PK11SDR_DecryptWithSlot(slot, &request, &reply, NULL); 94 result = PK11SDR_DecryptWithSlot(slot, &request, &reply, NULL);
91 #else 95 #else
92 result = PK11SDR_Decrypt(&request, &reply, NULL); 96 result = PK11SDR_Decrypt(&request, &reply, NULL);
93 #endif // defined(USE_NSS) 97 #endif // defined(USE_NSS)
94 if (result == SECSuccess) 98 if (result == SECSuccess)
95 plain.assign(reinterpret_cast<char*>(reply.data), reply.len); 99 plain.assign(reinterpret_cast<char*>(reply.data), reply.len);
96 100
97 SECITEM_FreeItem(&reply, PR_FALSE); 101 SECITEM_FreeItem(&reply, PR_FALSE);
98 FreeSlot(slot); 102 FreeSlot(slot);
99 } else { 103 } else {
100 // Deletes the leading '~' before decoding. 104 // Deletes the leading '~' before decoding.
101 base::Base64Decode(crypt.substr(1), &plain); 105 if (!base::Base64Decode(crypt.substr(1), &plain))
106 return base::string16();
102 } 107 }
103 108
104 return base::UTF8ToUTF16(plain); 109 return base::UTF8ToUTF16(plain);
105 } 110 }
106 111
107 // There are three versions of password files. They store saved user 112 // There are three versions of password files. They store saved user
108 // names and passwords. 113 // names and passwords.
109 // References: 114 // References:
110 // http://kb.mozillazine.org/Signons.txt 115 // http://kb.mozillazine.org/Signons.txt
111 // http://kb.mozillazine.org/Signons2.txt 116 // http://kb.mozillazine.org/Signons2.txt
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // The user name, password and action. 300 // The user name, password and action.
296 form.username_element = s2.ColumnString16(3); 301 form.username_element = s2.ColumnString16(3);
297 form.username_value = Decrypt(s2.ColumnString(5)); 302 form.username_value = Decrypt(s2.ColumnString(5));
298 form.password_element = s2.ColumnString16(4); 303 form.password_element = s2.ColumnString16(4);
299 form.password_value = Decrypt(s2.ColumnString(6)); 304 form.password_value = Decrypt(s2.ColumnString(6));
300 form.action = GURL(s2.ColumnString(2)).ReplaceComponents(rep); 305 form.action = GURL(s2.ColumnString(2)).ReplaceComponents(rep);
301 forms->push_back(form); 306 forms->push_back(form);
302 } 307 }
303 return true; 308 return true;
304 } 309 }
OLDNEW
« no previous file with comments | « chrome/utility/importer/firefox_importer_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698