[PATCH] webactivity: seed the XS cookie at startup
martin.langhoff at gmail.com
martin.langhoff at gmail.com
Thu Feb 12 00:47:20 EST 2009
From: Martin Langhoff <martin at laptop.org>
When starting up, call seed_xs_cookie() to
try to add a cookie for the XS with
- the hashed pubkey of the XO - the sha1 hash
is much smaller than the whole pubkey
- the XO colors
---
webactivity.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/webactivity.py b/webactivity.py
index e17d3b2..f3bc87a 100644
--- a/webactivity.py
+++ b/webactivity.py
@@ -26,6 +26,8 @@ import sha
import base64
import time
import shutil
+import sqlite3
+import cjson
from sugar.activity import activity
from sugar.graphics import style
@@ -98,6 +100,10 @@ class WebActivity(activity.Activity):
self._browser = Browser()
+ # call after browser init
+ # to ensure the storage dir exists
+ self.seed_xs_cookie()
+
temp_path = os.path.join(self.get_activity_root(), 'instance')
downloadmanager.init(self._browser, self, temp_path)
sessionhistory.init(self._browser)
@@ -482,3 +488,72 @@ class WebActivity(activity.Activity):
downloadmanager.remove_all_downloads()
self.close(force=True)
+ def seed_xs_cookie(self):
+
+ _logger.debug('seed_xs_cookie')
+ db_path = os.path.join(_profile_path, 'cookies.sqlite')
+
+ # have we registered with the XS?
+ prof = profile.get_profile()
+ # profile.jabber_registered is old and buggy
+ # - check for jabber_server instead
+ if not prof.jabber_server:
+ _logger.debug('seed_xs_cookie: not registered yet')
+ return
+
+ xs_fqdn = prof.jabber_server
+
+ # the XS wants a unique identifier - it has
+ # the SN and the pubkey. The pubkey is a bit
+ # less widely known than the SN. Hash it to
+ # make it shorter (590 chars to 40).
+ cookie_data = { 'color': prof.color.to_string(),
+ 'pkey_hash': sha.new(prof.pubkey).hexdigest() }
+
+ # gecko creates the DB at startup
+ # so we seed it after Browse() is invoked
+ _logger.debug('cookies file:' + db_path)
+
+ try:
+ jar_db = sqlite3.connect(db_path)
+ c = jar_db.cursor()
+ _logger.debug('opened file')
+
+ # gecko delays creating the table
+ # until it gets a cookie...
+ c.execute('''CREATE TABLE IF NOT EXISTS
+ moz_cookies
+ (id INTEGER PRIMARY KEY,
+ name TEXT,
+ value TEXT,
+ host TEXT,
+ path TEXT,
+ expiry INTEGER,
+ lastAccessed INTEGER,
+ isSecure INTEGER,
+ isHttpOnly INTEGER);''')
+
+ c.execute('''SELECT id
+ FROM moz_cookies
+ WHERE name=? AND host=? AND path=?''',
+ ('xoid', xs_fqdn, '/'))
+
+ # the row exists, we're done
+ if c.fetchone():
+ _logger.debug('cookie exists')
+ return
+
+ expire = int(time.time()) + 10*365*24*60*60
+ c.execute('''INSERT INTO moz_cookies (name, value, host,
+ path, expiry, lastAccessed,
+ isSecure, isHttpOnly)
+ VALUES(?,?,?,?,?,?,?,?)''',
+ ( 'xoid', cjson.encode(cookie_data), xs_fqdn,
+ '/', expire, 0,
+ 0, 0 ))
+ jar_db.commit()
+ jar_db.close()
+ _logger.debug('updated cookies successfully')
+ except:
+ _logger.error('error seeding cookies file')
+
--
1.5.6.6
More information about the Devel
mailing list