1
------------------------------------------------------------
2
------------------------------------------------------------
8
local lousy = require "lousy"
9
local capi = { luakit = luakit, soup = soup, sqlite3 = sqlite3, timer = timer }
10
local time, floor = luakit.time, math.floor
14
lousy.signal.setup(_M, true)
17
return floor(time() * 1e6)
22
local checktimer = capi.timer{ interval = 60e3 }
24
db = capi.sqlite3{ filename = capi.luakit.data_dir .. "/cookies.db" }
25
db:exec("PRAGMA synchronous = OFF; PRAGMA secure_delete = 1;")
28
CREATE TABLE IF NOT EXISTS moz_cookies (
29
id INTEGER PRIMARY KEY,
40
query_all_since = [[SELECT id, name, value, host AS domain, path,
41
expiry AS expires, isSecure AS secure, isHttpOnly AS http_only
43
WHERE lastAccessed >= %d;]]
45
query_insert = [[INSERT INTO moz_cookies
46
VALUES(NULL, %s, %s, %s, %s, %d, %d, %d, %d);]]
48
query_expire = [[UPDATE moz_cookies
49
SET expiry=0, lastAccessed=%d
50
WHERE host=%s AND name=%s AND path=%s;]]
52
query_delete = [[DELETE FROM moz_cookies
53
WHERE host=%s AND name=%s AND path=%s;]]
55
query_delete_expired = [[DELETE FROM moz_cookies
56
WHERE expiry == 0 AND lastAccessed < %d;]]
58
query_delete_session = [[DELETE FROM moz_cookies
63
function load_new_cookies(purge)
66
-- Delete all expired cookies older than 90 seconds
67
if purge ~= false then
68
db:exec(string.format(query_delete_expired, ctime - 90e6))
71
-- Get new cookies from the db
72
local cookies = db:exec(string.format(query_all_since, checktime))
74
-- Update checktime for next run
77
-- Convert query results into suitable cookie tables
78
for i, c in ipairs(cookies) do
79
c.secure = c.secure == "1"
80
c.http_only = c.http_only == "1"
83
-- Add new cookies to the cookiejar
85
capi.soup.add_cookies(cookies)
89
capi.soup.add_signal("cookie-changed", function (old, new)
90
local e = lousy.util.sql_escape
92
-- Delete all previous matching/expired cookies.
93
db:exec(string.format(query_delete,
94
e(new.domain), -- WHERE = host
95
e(new.name), -- WHERE = name
96
e(new.path))) -- WHERE = path
99
db:exec(string.format(query_insert,
101
e(new.value), -- value
102
e(new.domain), -- host
104
new.expires or -1, -- expiry
105
micro(), -- lastAccessed
106
new.secure and 1 or 0, -- isSecure
107
new.http_only and 1 or 0)) -- isHttpOnly
111
db:exec(string.format(query_expire,
112
micro(), -- lastAccessed
113
e(old.domain), -- WHERE = host
114
e(old.name), -- WHERE = name
115
e(old.path))) -- WHERE = path
119
capi.soup.add_signal("request-started", function (uri)
120
-- Load all new cookies since last update
121
load_new_cookies(false)
124
checktimer:add_signal("timeout", load_new_cookies)