Index: chrome/browser/autofill/password_generator.cc |
diff --git a/chrome/browser/autofill/password_generator.cc b/chrome/browser/autofill/password_generator.cc |
index 3361fb47d1dc4df19cc243c45dcd5fe97c3f1b2d..5a8f2c5902a7a19f915bea084a9e6b6a34bb68af 100644 |
--- a/chrome/browser/autofill/password_generator.cc |
+++ b/chrome/browser/autofill/password_generator.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/autofill/password_generator.h" |
+#include "base/logging.h" |
#include "base/rand_util.h" |
const int kMinChar = 33; // First printable character '!' |
@@ -15,10 +16,61 @@ namespace autofill { |
PasswordGenerator::PasswordGenerator() {} |
PasswordGenerator::~PasswordGenerator() {} |
-std::string PasswordGenerator::Generate() { |
+std::string PasswordGenerator::Generate(int max_length) { |
std::string ret; |
- for (int i = 0; i < kPasswordLength; i++) { |
- ret.push_back(static_cast<char>(base::RandInt(kMinChar, kMaxChar))); |
+ int length = max_length > 3 ? max_length : kPasswordLength; |
Ilya Sherman
2012/05/30 00:04:32
nit: The header does not give any indication that
Garrett Casto
2012/05/30 00:46:35
If maxLength isn't set on an element, it looks lik
zysxqn
2012/05/31 21:54:08
Done.
zysxqn
2012/05/31 21:54:08
Use separate kMinPasswordLength, kMaxPasswordLengt
|
+ // First, randomly select 4 places to hold one upper case letter, |
+ // one lower case letter, one digit, and one other symbol respectively, |
+ // to make sure at least one of each category of characters will be |
+ // included in the password. |
+ // |
+ // There is a classific algorithm for this and one description can be |
Ilya Sherman
2012/05/30 00:04:32
nit: "classific" -> "classic"
Garrett Casto
2012/05/30 00:46:35
classific?
zysxqn
2012/05/31 21:54:08
Done.
zysxqn
2012/05/31 21:54:08
Done.
|
+ // found at: "http://stackoverflow.com/questions/48087/select-a-random-n-" |
+ // "elements-from-listt-in-c-sharp/48089#48089" |
Ilya Sherman
2012/05/30 00:04:32
nit: This comment and the block implementing it sh
Ilya Sherman
2012/05/30 00:04:32
nit: URLs should not be broken across multiple lin
zysxqn
2012/05/31 21:54:08
Done.
zysxqn
2012/05/31 21:54:08
Done.
|
+ int number_left = length; |
+ int number_needed = 4; |
+ int position[4]; |
Ilya Sherman
2012/05/30 00:04:32
nit: "positions" (plural)?
zysxqn
2012/05/31 21:54:08
Done.
|
+ for (int i = 0; i < length; i++) { |
+ if (number_needed == 0) { |
+ break; |
+ } |
Ilya Sherman
2012/05/30 00:04:32
nit: No need for curly braces, since this is a one
zysxqn
2012/05/31 21:54:08
Done.
|
+ // we have prob = number_needed / number_left to select this position. |
+ int prob = base::RandInt(0, number_left - 1); |
Ilya Sherman
2012/05/30 00:04:32
nit: "prob" -> "probability" (per the style guide,
zysxqn
2012/05/31 21:54:08
Done.
|
+ if (prob < number_needed) { |
+ position[4 - number_needed--] = i; |
Ilya Sherman
2012/05/30 00:04:32
nit: Please avoid using the "--" operator nested w
Garrett Casto
2012/05/30 00:46:35
Seconded.
zysxqn
2012/05/31 21:54:08
Done.
zysxqn
2012/05/31 21:54:08
Done.
|
+ } |
+ --number_left; |
+ } |
+ CHECK(number_needed == 0); |
Ilya Sherman
2012/05/30 00:04:32
nit: DCHECK_EQ(0, number_needed)
zysxqn
2012/05/31 21:54:08
Done.
|
+ |
+ // Next, generate each character of the password. |
+ for (int i = 0; i < length; i++) { |
+ if (i == position[0]) { |
+ // Generate random upper case letter. |
Ilya Sherman
2012/05/30 00:04:32
This approach guarantees that the upper-case lette
zysxqn
2012/05/31 21:54:08
This is true. For solving this ideally we can rand
|
+ ret.push_back(static_cast<char>(base::RandInt(65, 90))); |
Ilya Sherman
2012/05/30 00:04:32
Please use named constants rather than raw numeric
zysxqn
2012/05/31 21:54:08
Done.
|
+ } else if (i == position[1]) { |
+ // Generate random lower case letter. |
+ ret.push_back(static_cast<char>(base::RandInt(97, 122))); |
+ } else if (i == position[2]) { |
+ // Generate random digit. |
+ ret.push_back(static_cast<char>(base::RandInt(48, 57))); |
+ } else if (i == position[3]) { |
+ // Generate random other symbol. |
+ // There are 32 such characters from 4 intervals in ascii. |
Ilya Sherman
2012/05/30 00:04:32
It might be clearer to just write out an array inc
Garrett Casto
2012/05/30 00:46:35
I was actually going to suggest that all of these
zysxqn
2012/05/31 21:54:08
Done.
zysxqn
2012/05/31 21:54:08
Done.
|
+ int index = base::RandInt(0, 31); |
+ if (index < 15) { |
+ ret.push_back(static_cast<char>(index + 33)); |
+ } else if (index < 22) { |
+ ret.push_back(static_cast<char>(index + 43)); |
+ } else if (index < 28) { |
+ ret.push_back(static_cast<char>(index + 69)); |
+ } else { |
+ ret.push_back(static_cast<char>(index + 95)); |
+ } |
+ } else { |
+ // Generate random character from all categories. |
+ ret.push_back(static_cast<char>(base::RandInt(kMinChar, kMaxChar))); |
+ } |
} |
return ret; |
} |