From f6dd764abd7c160e6188757b8e61cd01062a92c6 Mon Sep 17 00:00:00 2001 From: Manuel QuiƱones Date: Thu, 19 Apr 2012 17:01:16 +0000 Subject: Store web session cookies in SQlite database, for SL #3456 There was code in Browse to create a SQlite database under data directory in the activity profile. This was for creating a cookie to authenticate the laptop with a schoolserver. Now we use the same database via the Soup library to store all cookies so they are persistent between sessions. A Soup cookie jar is being attached to the WebKit session, cookies are stored in a Mozilla compatible SQLite format. The schoolserver function has been changed to use the Soup API. The code is based in Epiphany, embed/ephy-embed-single.c . ------ v1->v2: let Soup take care of database creation, use Soup API in schoolserver cookie seed function v2->v3: use proper constructors for PyGI instead of new() Signed-off-by: Manuel QuiƱones Acked-by: Daniel Drake --- (limited to 'webactivity.py') diff --git a/webactivity.py b/webactivity.py index aadc29a..fe47fdc 100644 --- a/webactivity.py +++ b/webactivity.py @@ -28,6 +28,8 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import WebKit +from gi.repository import Soup +from gi.repository import SoupGNOME import base64 import time @@ -58,6 +60,7 @@ PROFILE_VERSION = 2 _profile_version = 0 _profile_path = os.path.join(activity.get_activity_root(), 'data/gecko') _version_file = os.path.join(_profile_path, 'version') +_cookies_db_path = os.path.join(_profile_path, 'cookies.sqlite') if os.path.exists(_version_file): f = open(_version_file) @@ -76,15 +79,27 @@ if _profile_version < PROFILE_VERSION: f.close() -def _seed_xs_cookie(): - ''' Create a HTTP Cookie to authenticate with the Schoolserver - ''' +def _seed_xs_cookie(cookie_jar): + """Create a HTTP Cookie to authenticate with the Schoolserver. + + Do nothing if the laptop is not registered with Schoolserver, or + if the cookie already exists. + + """ client = GConf.Client.get_default() backup_url = client.get_string('/desktop/sugar/backup_url') - if not backup_url: + if backup_url == '': _logger.debug('seed_xs_cookie: Not registered with Schoolserver') return + # Using new() here because the GObject constructor can't be used + # in this case. The code we need is locked up behind .new(). + soup_uri = Soup.URI.new(uri_string=backup_url) + xs_cookie = cookie_jar.get_cookies(soup_uri, for_http=False) + if xs_cookie is not None: + _logger.debug('seed_xs_cookie: Cookie exists already') + return + jabber_server = client.get_string( '/desktop/sugar/collaboration/jabber_server') @@ -92,45 +107,16 @@ def _seed_xs_cookie(): cookie_data = {'color': profile.get_color().to_string(), 'pkey_hash': sha1(pubkey).hexdigest()} - db_path = os.path.join(_profile_path, 'cookies.sqlite') - try: - cookies_db = sqlite3.connect(db_path) - c = cookies_db.cursor() - - 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', jabber_server, '/')) - - if c.fetchone(): - _logger.debug('seed_xs_cookie: Cookie exists already') - return + expire = int(time.time()) + 10 * 365 * 24 * 60 * 60 - 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', json.loads(cookie_data), jabber_server, - '/', expire, 0, 0, 0)) - cookies_db.commit() - cookies_db.close() - except sqlite3.Error: - _logger.exception('seed_xs_cookie: could not write cookie') - else: - _logger.debug('seed_xs_cookie: Updated cookie successfully') + xs_cookie = Soup.Cookie() + xs_cookie.set_name('xoid') + xs_cookie.set_value(json.loads(cookie_data)) + xs_cookie.set_domain(jabber_server) + xs_cookie.set_path('/') + xs_cookie.set_max_age(expire) + cookie_jar.add_cookie(xs_cookie) + _logger.debug('seed_xs_cookie: Updated cookie successfully') def _set_char_preference(name, value): @@ -170,6 +156,15 @@ class WebActivity(activity.Activity): session = WebKit.get_default_session() session.set_property('accept-language-auto', True) + # By default, cookies are not stored persistently, we have to + # add a cookie jar so that they get saved to disk. We use one + # with a SQlite database: + cookie_jar = SoupGNOME.CookieJarSqlite(filename=_cookies_db_path, + read_only=False) + session.add_feature(cookie_jar) + + _seed_xs_cookie(cookie_jar) + # FIXME # downloadmanager.remove_old_parts() @@ -177,8 +172,6 @@ class WebActivity(activity.Activity): self._tabbed_view = TabbedView() self._tabbed_view.connect('focus-url-entry', self._on_focus_url_entry) - _seed_xs_cookie() - # HACK # Currently, the multiple tabs feature crashes the Browse activity # on cairo versions 1.8.10 or later. The exact cause for this -- cgit v0.9.1