Home | History | Annotate | Download | only in password_manager
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/string_util.h"
      6 #include "base/utf_string_conversions.h"
      7 #include "chrome/browser/password_manager/password_form_data.h"
      8 
      9 using webkit_glue::PasswordForm;
     10 
     11 PasswordForm* CreatePasswordFormFromData(
     12     const PasswordFormData& form_data) {
     13   PasswordForm* form = new PasswordForm();
     14   form->scheme = form_data.scheme;
     15   form->preferred = form_data.preferred;
     16   form->ssl_valid = form_data.ssl_valid;
     17   form->date_created = base::Time::FromDoubleT(form_data.creation_time);
     18   if (form_data.signon_realm)
     19     form->signon_realm = std::string(form_data.signon_realm);
     20   if (form_data.origin)
     21     form->origin = GURL(form_data.origin);
     22   if (form_data.action)
     23     form->action = GURL(form_data.action);
     24   if (form_data.submit_element)
     25     form->submit_element = WideToUTF16(form_data.submit_element);
     26   if (form_data.username_element)
     27     form->username_element = WideToUTF16(form_data.username_element);
     28   if (form_data.password_element)
     29     form->password_element = WideToUTF16(form_data.password_element);
     30   if (form_data.username_value) {
     31     form->username_value = WideToUTF16(form_data.username_value);
     32     if (form_data.password_value)
     33       form->password_value = WideToUTF16(form_data.password_value);
     34   } else {
     35     form->blacklisted_by_user = true;
     36   }
     37   return form;
     38 }
     39 
     40 bool operator==(const PasswordForm& lhs, const PasswordForm& rhs) {
     41   return (lhs.scheme == rhs.scheme &&
     42           lhs.signon_realm == rhs.signon_realm &&
     43           lhs.origin == rhs.origin &&
     44           lhs.action == rhs.action &&
     45           lhs.submit_element == rhs.submit_element &&
     46           lhs.username_element == rhs.username_element &&
     47           lhs.password_element == rhs.password_element &&
     48           lhs.username_value == rhs.username_value &&
     49           lhs.password_value == rhs.password_value &&
     50           lhs.blacklisted_by_user == rhs.blacklisted_by_user &&
     51           lhs.preferred == rhs.preferred &&
     52           lhs.ssl_valid == rhs.ssl_valid &&
     53           lhs.date_created == rhs.date_created);
     54 }
     55 
     56 std::ostream& operator<<(std::ostream& os, const PasswordForm& form) {
     57   return os << "scheme: " << form.scheme << std::endl
     58             << "signon_realm: " << form.signon_realm << std::endl
     59             << "origin: " << form.origin << std::endl
     60             << "action: " << form.action << std::endl
     61             << "submit_element: " << form.submit_element << std::endl
     62             << "username_elem: " << form.username_element << std::endl
     63             << "password_elem: " << form.password_element << std::endl
     64             << "username_value: " << form.username_value << std::endl
     65             << "password_value: " << form.password_value << std::endl
     66             << "blacklisted: " << form.blacklisted_by_user << std::endl
     67             << "preferred: " << form.preferred << std::endl
     68             << "ssl_valid: " << form.ssl_valid << std::endl
     69             << "date_created: " << form.date_created.ToDoubleT();
     70 }
     71 
     72 typedef std::set<const webkit_glue::PasswordForm*> SetOfForms;
     73 
     74 bool ContainsSamePasswordFormsPtr(
     75     const std::vector<PasswordForm*>& first,
     76     const std::vector<PasswordForm*>& second) {
     77   if (first.size() != second.size())
     78     return false;
     79   SetOfForms expectations(first.begin(), first.end());
     80   for (unsigned int i = 0; i < second.size(); ++i) {
     81     const PasswordForm* actual = second[i];
     82     bool found_match = false;
     83     for (SetOfForms::iterator it = expectations.begin();
     84          it != expectations.end(); ++it) {
     85       const PasswordForm* expected = *it;
     86       if (*expected == *actual) {
     87         found_match = true;
     88         expectations.erase(it);
     89         break;
     90       }
     91     }
     92     if (!found_match) {
     93       LOG(ERROR) << "No match for:" << std::endl << *actual;
     94       return false;
     95     }
     96   }
     97   return true;
     98 }
     99 
    100 bool ContainsSamePasswordForms(
    101     std::vector<webkit_glue::PasswordForm>& first,
    102     std::vector<webkit_glue::PasswordForm>& second) {
    103   std::vector<PasswordForm*> first_ptr;
    104   for (unsigned int i = 0; i < first.size(); ++i) {
    105     first_ptr.push_back(&first[i]);
    106   }
    107   std::vector<PasswordForm*> second_ptr;
    108   for (unsigned int i = 0; i < second.size(); ++i) {
    109     second_ptr.push_back(&second[i]);
    110   }
    111   return ContainsSamePasswordFormsPtr(first_ptr, second_ptr);
    112 }
    113