1/*
2 * Copyright (C) 2013 Samsung Electronics Inc. All rights reserved.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#include "config.h"
21#include "WebKitCredential.h"
22
23#include "WebCredential.h"
24#include "WebKitCredentialPrivate.h"
25#include <wtf/text/CString.h>
26
27using namespace WebKit;
28
29struct _WebKitCredential {
30    _WebKitCredential(const WebCore::Credential& coreCredential)
31        : credential(coreCredential)
32    {
33    }
34
35    WebCore::Credential credential;
36    CString username;
37    CString password;
38};
39
40G_DEFINE_BOXED_TYPE(WebKitCredential, webkit_credential, webkit_credential_copy, webkit_credential_free)
41
42static inline WebKitCredentialPersistence toWebKitCredentialPersistence(WebCore::CredentialPersistence corePersistence)
43{
44    switch (corePersistence) {
45    case WebCore::CredentialPersistenceNone:
46        return WEBKIT_CREDENTIAL_PERSISTENCE_NONE;
47    case WebCore::CredentialPersistenceForSession:
48        return WEBKIT_CREDENTIAL_PERSISTENCE_FOR_SESSION;
49    case WebCore::CredentialPersistencePermanent:
50        return WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT;
51    default:
52        ASSERT_NOT_REACHED();
53        return WEBKIT_CREDENTIAL_PERSISTENCE_NONE;
54    }
55}
56
57static inline WebCore::CredentialPersistence toWebCoreCredentialPersistence(WebKitCredentialPersistence kitPersistence)
58{
59    switch (kitPersistence) {
60    case WEBKIT_CREDENTIAL_PERSISTENCE_NONE:
61        return WebCore::CredentialPersistenceNone;
62    case WEBKIT_CREDENTIAL_PERSISTENCE_FOR_SESSION:
63        return WebCore::CredentialPersistenceForSession;
64    case WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT:
65        return WebCore::CredentialPersistencePermanent;
66    default:
67        ASSERT_NOT_REACHED();
68        return WebCore::CredentialPersistenceNone;
69    }
70}
71
72WebKitCredential* webkitCredentialCreate(const WebCore::Credential& coreCredential)
73{
74    WebKitCredential* credential = g_slice_new(WebKitCredential);
75    new (credential) WebKitCredential(coreCredential);
76    return credential;
77}
78
79const WebCore::Credential& webkitCredentialGetCredential(WebKitCredential* credential)
80{
81    ASSERT(credential);
82    return credential->credential;
83}
84
85/**
86 * webkit_credential_new:
87 * @username: The username for the new credential
88 * @password: The password for the new credential
89 * @persistence: The #WebKitCredentialPersistence of the new credential
90 *
91 * Create a new credential from the provided username, password and persistence mode.
92 *
93 * Returns: (transfer full): A #WebKitCredential.
94 *
95 * Since: 2.2
96 */
97WebKitCredential* webkit_credential_new(const gchar* username, const gchar* password, WebKitCredentialPersistence persistence)
98{
99    g_return_val_if_fail(username, 0);
100    g_return_val_if_fail(password, 0);
101
102    return webkitCredentialCreate(WebCore::Credential(String::fromUTF8(username), String::fromUTF8(password), toWebCoreCredentialPersistence(persistence)));
103}
104
105/**
106 * webkit_credential_copy:
107 * @credential: a #WebKitCredential
108 *
109 * Make a copy of the #WebKitCredential.
110 *
111 * Returns: (transfer full): A copy of passed in #WebKitCredential
112 *
113 * Since: 2.2
114 */
115WebKitCredential* webkit_credential_copy(WebKitCredential* credential)
116{
117    g_return_val_if_fail(credential, 0);
118
119    return webkitCredentialCreate(credential->credential);
120}
121
122/**
123 * webkit_credential_free:
124 * @credential: A #WebKitCredential
125 *
126 * Free the #WebKitCredential.
127 *
128 * Since: 2.2
129 */
130void webkit_credential_free(WebKitCredential* credential)
131{
132    g_return_if_fail(credential);
133
134    credential->~WebKitCredential();
135    g_slice_free(WebKitCredential, credential);
136}
137
138/**
139 * webkit_credential_get_username:
140 * @credential: a #WebKitCredential
141 *
142 * Get the username currently held by this #WebKitCredential.
143 *
144 * Returns: The username stored in the #WebKitCredential.
145 *
146 * Since: 2.2
147 */
148const gchar* webkit_credential_get_username(WebKitCredential* credential)
149{
150    g_return_val_if_fail(credential, 0);
151
152    if (credential->username.isNull())
153        credential->username = credential->credential.user().utf8();
154    return credential->username.data();
155}
156
157/**
158 * webkit_credential_get_password:
159 * @credential: a #WebKitCredential
160 *
161 * Get the password currently held by this #WebKitCredential.
162 *
163 * Returns: The password stored in the #WebKitCredential.
164 *
165 * Since: 2.2
166 */
167const gchar* webkit_credential_get_password(WebKitCredential* credential)
168{
169    g_return_val_if_fail(credential, 0);
170
171    if (credential->password.isNull())
172        credential->password = credential->credential.password().utf8();
173    return credential->password.data();
174}
175
176/**
177 * webkit_credential_has_password:
178 * @credential: a #WebKitCredential
179 *
180 * Determine whether this credential has a password stored.
181 *
182 * Returns: %TRUE if the credential has a password or %FALSE otherwise.
183 *
184 * Since: 2.2
185 */
186gboolean webkit_credential_has_password(WebKitCredential* credential)
187{
188    g_return_val_if_fail(credential, FALSE);
189
190    return credential->credential.hasPassword();
191}
192
193/**
194 * webkit_credential_get_persistence:
195 * @credential: a #WebKitCredential
196 *
197 * Get the persistence mode currently held by this #WebKitCredential.
198 *
199 * Returns: The #WebKitCredentialPersistence stored in the #WebKitCredential.
200 *
201 * Since: 2.2
202 */
203WebKitCredentialPersistence webkit_credential_get_persistence(WebKitCredential* credential)
204{
205    g_return_val_if_fail(credential, WEBKIT_CREDENTIAL_PERSISTENCE_NONE);
206
207    return toWebKitCredentialPersistence(credential->credential.persistence());
208}
209