[Curl] Use SQLite database in cookie jar implementation for Curl port
[WebKit-https.git] / Source / WebCore / platform / network / curl / CookieJarCurlDatabase.cpp
1 /*
2  * Copyright (C) 2018 Sony Interactive Entertainment Inc.
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 INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #pragma once
26
27 #include "config.h"
28 #include "CookieJarCurlDatabase.h"
29
30 #if USE(CURL)
31 #include "Cookie.h"
32 #include "CookieJarDB.h"
33 #include "NetworkStorageSession.h"
34 #include "NotImplemented.h"
35 #include "URL.h"
36
37 #include <wtf/Optional.h>
38 #include <wtf/text/StringBuilder.h>
39 #include <wtf/text/WTFString.h>
40
41 namespace WebCore {
42
43 static String cookiesForSession(const NetworkStorageSession& session, const URL&, const URL& url, bool httponly)
44 {
45     StringBuilder cookies;
46
47     CookieJarDB& cookieJarDB = session.cookieDatabase();
48     auto isHttpOnly = (httponly ? std::nullopt : std::optional<bool> {false});
49     auto secure = url.protocolIs("https") ? std::nullopt : std::optional<bool> {false};
50
51     Vector<Cookie> results;
52     if (cookieJarDB.searchCookies(url.string(), isHttpOnly, secure, std::nullopt, results)) {
53         for (auto result : results) {
54             if (!cookies.isEmpty())
55                 cookies.append("; ");
56             cookies.append(result.name);
57             cookies.append("=");
58             cookies.append(result.value);
59         }
60     }
61     return cookies.toString();
62 }
63
64 void CookieJarCurlDatabase::setCookiesFromDOM(const NetworkStorageSession& session, const URL& firstParty, const URL& url, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID, const String& value) const
65 {
66     UNUSED_PARAM(frameID);
67     UNUSED_PARAM(pageID);
68
69     CookieJarDB& cookieJarDB = session.cookieDatabase();
70     cookieJarDB.setCookie(url.string(), value, true);
71 }
72
73 void CookieJarCurlDatabase::setCookiesFromHTTPResponse(const NetworkStorageSession& session, const URL& url, const String& value) const
74 {
75     CookieJarDB& cookieJarDB = session.cookieDatabase();
76     cookieJarDB.setCookie(url.string(), value, false);
77 }
78
79 std::pair<String, bool> CookieJarCurlDatabase::cookiesForDOM(const NetworkStorageSession& session, const URL& firstParty, const URL& url, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID, IncludeSecureCookies) const
80 {
81     UNUSED_PARAM(frameID);
82     UNUSED_PARAM(pageID);
83
84     // FIXME: This should filter secure cookies out if the caller requests it.
85     return { cookiesForSession(session, firstParty, url, false), false };
86 }
87
88 std::pair<String, bool> CookieJarCurlDatabase::cookieRequestHeaderFieldValue(const NetworkStorageSession& session, const URL& firstParty, const URL& url, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID, IncludeSecureCookies) const
89 {
90     UNUSED_PARAM(frameID);
91     UNUSED_PARAM(pageID);
92
93     // FIXME: This should filter secure cookies out if the caller requests it.
94     return { cookiesForSession(session, firstParty, url, true), false };
95 }
96
97 bool CookieJarCurlDatabase::cookiesEnabled(const NetworkStorageSession& session) const
98 {
99     return true;
100 }
101
102 bool CookieJarCurlDatabase::getRawCookies(const NetworkStorageSession& session, const URL& firstParty, const URL&, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID, Vector<Cookie>& rawCookies) const
103 {
104     UNUSED_PARAM(frameID);
105     UNUSED_PARAM(pageID);
106
107     CookieJarDB& cookieJarDB = session.cookieDatabase();
108     return cookieJarDB.searchCookies(firstParty.string(), std::nullopt, std::nullopt, std::nullopt, rawCookies);
109 }
110
111 void CookieJarCurlDatabase::deleteCookie(const NetworkStorageSession&, const URL& url, const String& cookieName) const
112 {
113     // FIXME: Not yet implemented
114 }
115
116 void CookieJarCurlDatabase::getHostnamesWithCookies(const NetworkStorageSession&, HashSet<String>& hostnames) const
117 {
118     // FIXME: Not yet implemented
119 }
120
121 void CookieJarCurlDatabase::deleteCookiesForHostnames(const NetworkStorageSession&, const Vector<String>& cookieHostNames) const
122 {
123     // FIXME: Not yet implemented
124 }
125
126 void CookieJarCurlDatabase::deleteAllCookies(const NetworkStorageSession&) const
127 {
128     // FIXME: Not yet implemented
129 }
130
131 void CookieJarCurlDatabase::deleteAllCookiesModifiedSince(const NetworkStorageSession&, WallTime) const
132 {
133     // FIXME: Not yet implemented
134 }
135
136 } // namespace WebCore
137
138 #endif // USE(CURL)