1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 #include "config.h" 26 #include "Credential.h" 27 28 namespace WebCore { 29 30 // Need to enforce empty, non-null strings due to the pickiness of the String == String operator 31 // combined with the semantics of the String(NSString*) constructor 32 Credential::Credential() 33 : m_user("") 34 , m_password("") 35 , m_persistence(CredentialPersistenceNone) 36 #if CERTIFICATE_CREDENTIALS_SUPPORTED 37 , m_type(CredentialTypePassword) 38 #endif 39 { 40 } 41 42 // Need to enforce empty, non-null strings due to the pickiness of the String == String operator 43 // combined with the semantics of the String(NSString*) constructor 44 Credential::Credential(const String& user, const String& password, CredentialPersistence persistence) 45 : m_user(user.length() ? user : "") 46 , m_password(password.length() ? password : "") 47 , m_persistence(persistence) 48 #if CERTIFICATE_CREDENTIALS_SUPPORTED 49 , m_type(CredentialTypePassword) 50 #endif 51 { 52 } 53 54 Credential::Credential(const Credential& original, CredentialPersistence persistence) 55 : m_user(original.user()) 56 , m_password(original.password()) 57 , m_persistence(persistence) 58 #if CERTIFICATE_CREDENTIALS_SUPPORTED 59 , m_identity(original.identity()) 60 , m_certificates(original.certificates()) 61 , m_type(original.type()) 62 #endif 63 { 64 } 65 66 bool Credential::isEmpty() const 67 { 68 #if CERTIFICATE_CREDENTIALS_SUPPORTED 69 if (m_type == CredentialTypeClientCertificate && (m_identity || m_certificates)) 70 return false; 71 #endif 72 73 return m_user.isEmpty() && m_password.isEmpty(); 74 } 75 76 const String& Credential::user() const 77 { 78 return m_user; 79 } 80 81 const String& Credential::password() const 82 { 83 return m_password; 84 } 85 86 bool Credential::hasPassword() const 87 { 88 return !m_password.isEmpty(); 89 } 90 91 CredentialPersistence Credential::persistence() const 92 { 93 return m_persistence; 94 } 95 96 #if CERTIFICATE_CREDENTIALS_SUPPORTED 97 Credential::Credential(SecIdentityRef identity, CFArrayRef certificates, CredentialPersistence persistence) 98 : m_user("") 99 , m_password("") 100 , m_persistence(persistence) 101 , m_identity(identity) 102 , m_certificates(certificates) 103 , m_type(CredentialTypeClientCertificate) 104 { 105 } 106 107 SecIdentityRef Credential::identity() const 108 { 109 return m_identity.get(); 110 } 111 112 CFArrayRef Credential::certificates() const 113 { 114 return m_certificates.get(); 115 } 116 117 CredentialType Credential::type() const 118 { 119 return m_type; 120 } 121 #endif 122 123 bool operator==(const Credential& a, const Credential& b) 124 { 125 // Check persistence first since all credential types 126 // have the persistence property. 127 if (a.persistence() != b.persistence()) 128 return false; 129 130 #if CERTIFICATE_CREDENTIALS_SUPPORTED 131 CredentialType aType = a.type(); 132 if (aType != b.type()) 133 return false; 134 135 // Comparing identity and certificate chain pointers is valid only 136 // for client certificate type credentials. 137 // 138 // FIXME: Is pointer comparison of the identity and certificates properties sufficient? 139 if (aType == CredentialTypeClientCertificate) { 140 if (a.identity() != b.identity()) 141 return false; 142 if (a.certificates() != b.certificates()) 143 return false; 144 145 // We only need to check identity and certificates to compare 146 // client certificate based credentials. 147 return true; 148 } 149 150 ASSERT(a.type() == CredentialTypePassword && b.type() == CredentialTypePassword); 151 #endif 152 153 if (a.user() != b.user()) 154 return false; 155 if (a.password() != b.password()) 156 return false; 157 158 return true; 159 } 160 161 } 162 163