[Curl] Use SQLite database in cookie jar implementation for Curl port
[WebKit-https.git] / Source / WebCore / platform / network / curl / CookieJarDB.h
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 "Cookie.h"
28 #include "SQLiteDatabase.h"
29 #include "SQLiteStatement.h"
30 #include <wtf/HashMap.h>
31 #include <wtf/Noncopyable.h>
32 #include <wtf/Optional.h>
33 #include <wtf/Vector.h>
34 #include <wtf/text/StringHash.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38
39 class CookieJarDB {
40     WTF_MAKE_NONCOPYABLE(CookieJarDB);
41
42 public:
43     bool isEnabled();
44     void setEnabled(bool);
45
46     bool searchCookies(const String& requestUrl, const std::optional<bool>& httpOnly, const std::optional<bool>& secure, const std::optional<bool>& session, Vector<Cookie>& results);
47     int setCookie(const String& url, const String& cookie, bool fromJavaScript);
48     int setCookie(const Cookie&);
49
50     int deleteCookie(const String& url, const String& name);
51     int deleteCookies(const String& url);
52     int deleteAllCookies();
53
54     CookieJarDB(const String& databasePath);
55     ~CookieJarDB();
56
57 private:
58
59     bool m_cookieEnable {true};
60     String m_databasePath;
61
62     bool m_detectedDatabaseCorruption {false};
63
64     bool isOnMemory() const { return (m_databasePath == ":onmemory:"); };
65
66     bool openDatabase();
67     void closeDatabase();
68
69     bool checkSQLiteReturnCode(int actual, int expected);
70     void flagDatabaseCorruption();
71     bool checkDatabaseCorruptionAndRemoveIfNeeded();
72     String getCorruptionMarkerPath() const;
73
74     bool checkDatabaseValidity();
75     void deleteAllDatabaseFiles();
76
77     void createPrepareStatement(const char* sql);
78     SQLiteStatement* getPrepareStatement(const char* sql);
79     int executeSimpleSql(const char* sql, bool ignoreError = false);
80
81     int deleteCookieInternal(const String& name, const String& domain, const String& path);
82     bool hasHttpOnlyCookie(const String& name, const String& domain, const String& path);
83
84     SQLiteDatabase m_database;
85     HashMap<String, std::unique_ptr<SQLiteStatement>> m_statements;
86 };
87
88 } // namespace WebCore