diff --git a/agkyra/gui.py b/agkyra/gui.py index 89ad4d917d53f4ff351e28e361ea1871461a9a5b..5e0068bc0a193eb5ffcec41c818e29fdb41f92bc 100644 --- a/agkyra/gui.py +++ b/agkyra/gui.py @@ -44,7 +44,8 @@ class GUI(WebSocketBaseClient): '/home/saxtouri/node-webkit-v0.11.6-linux-x64/nw', # self.gui_exec_path, abspath('gui/gui.nw'), - fp.name]) + fp.name, + '--data-path', abspath('~/.agkyra')]) LOG.debug('GUI process closed, remove temp file') os.remove(fp.name) diff --git a/agkyra/gui/menu.html b/agkyra/gui/menu.html index 1b76a8a7792a8ec0694af53f92be2d21ae6a01c9..7ba6e4f50e46a70ec5870b37a55a64c05eb61a50 100644 --- a/agkyra/gui/menu.html +++ b/agkyra/gui/menu.html @@ -112,9 +112,9 @@ menu.append(new gui.MenuItem({ label: 'Launch Pithos+ page', icon: 'images/pithos.png', click: function () { - var pithos_url = globals['settings']['pithos_url']; - console.log('Visit ' + pithos_url); - gui.Shell.openExternal(pithos_url); + var pithos_ui = globals['settings']['pithos_ui']; + console.log('Visit ' + pithos_ui); + gui.Shell.openExternal(pithos_ui); } })); diff --git a/agkyra/gui/package.json b/agkyra/gui/package.json index edf1c1a7f8d32ba91dc69c2a0603e8800d2adfeb..e6731e994cffd6d4643e76541c2af3380fad8624 100644 --- a/agkyra/gui/package.json +++ b/agkyra/gui/package.json @@ -12,5 +12,6 @@ "name": "Synnefo Development Team", "web": "http://www.synnefo.org" }], - "licences": [{"type": "GPLv3"}] + "licences": [{"type": "GPLv3"}], + "chromium-args": "--incognito" } diff --git a/agkyra/gui/protocol.js b/agkyra/gui/protocol.js index 7ace28f72afb23d73afe0031732a9cce7a751e6d..44f79a25ee36993c2c7dafd63a513e66152aac23 100644 --- a/agkyra/gui/protocol.js +++ b/agkyra/gui/protocol.js @@ -16,8 +16,7 @@ var globals = { 'url': null, 'container': null, 'directory': null, - 'pithos_url': null, - 'weblogin': null, + 'pithos_ui': null, 'exclude': null }, 'status': {"progress": null, "paused": null} diff --git a/agkyra/gui/settings.html b/agkyra/gui/settings.html index d248440b1e93841d9eac0e953a1c4b007d71189e..adf0661b388360d5984a8dcf5dcaff6c552af405 100644 --- a/agkyra/gui/settings.html +++ b/agkyra/gui/settings.html @@ -21,9 +21,8 @@ exclude = get_setting('exclude'); if (exclude) $('#exclude').val( fs.readFileSync(exclude, encoding='utf-8')); - var weblogin = get_setting('weblogin'); - var pithos_url = get_setting('pithos_url'); - if (weblogin && pithos_url) { + var pithos_ui = get_setting('pithos_ui'); + if (pithos_ui) { $('#get_creds').show(); } else { console.log('No pithos view, remove credential button'); @@ -49,17 +48,13 @@ var gui = require('nw.gui'); function extract_cookie(url) { var cookie_name = '_pithos2_a'; - var w = gui.Window.open(url, { - focus: true, width: 520, height: 841 + var logout_url = 'https://accounts.okeanos.grnet.gr/ui/logout' + var w = gui.Window.open(logout_url, { + focus: false, width: 20, height: 20 }); - w.cookies.getAll({name: cookie_name}, function(cookies) { - if (cookies.length) { - console.log('Already logged in'); - extract_credentials(cookies[0]); - w.close(); - } else { - console.log('Not logged in'); - } + w.close(); + var w = gui.Window.open(logout_url, { + focus: true, width: 520, height: 920 }); w.cookies.onChanged.addListener(function(info) { if (info.cookie.name === cookie_name) { @@ -71,9 +66,8 @@ } function get_credentials() { - var weblogin = get_setting('weblogin') - var pithos_url = get_setting('url'); - extract_cookie(weblogin + '?next=' + pithos_url); + var pithos_ui = get_setting('pithos_ui'); + extract_cookie(pithos_ui); } </script> </head> diff --git a/agkyra/protocol.py b/agkyra/protocol.py index 60a836463518025b10d220403a833e342f8d1d32..8ed1f2089321b0d5e13bbcb0eb746ef2ee1b6734 100644 --- a/agkyra/protocol.py +++ b/agkyra/protocol.py @@ -3,6 +3,9 @@ import json import logging from os.path import abspath from titanic import syncer +from config import AgkyraConfig +from kamaki.clients.astakos import AstakosClient +from kamaki.clients.pithos import PithosClient LOG = logging.getLogger(__name__) @@ -61,15 +64,54 @@ class WebSocketProtocol(WebSocket): gui_id = None accepted = False settings = dict( - token='token', - url='https://accounts.okeanos.grnet.gr/identity/v2.0', - container='pithos', - directory='/tmp/.', - exclude=abspath('exclude.cnf'), - pithos_url='https://pithos.okeanos.grnet.gr/ui/', - weblogin='https://accounts.okeanos.grnet.gr/ui') + token=None, url=None, + container=None, directory=None, + exclude=None, pithos_ui=None) status = dict(progress=0, paused=True) file_syncer = None + cnf = AgkyraConfig() + + def _load_settings(self): + sync = self.cnf.get('global', 'default_sync') + cloud = self.cnf.get_sync(sync, 'cloud') + + url = self.cnf.get_cloud(cloud, 'url') + token = self.cnf.get_cloud(cloud, 'token') + + astakos = AstakosClient(url, token) + self.settings['url'], self.settings['token'] = url, token + + try: + endpoints = astakos.get_endpoints()['access']['serviceCatalog'] + for endpoint in endpoints: + if endpoint['type'] == PithosClient.service_type: + pithos_ui = endpoint['endpoints'][0]['SNF:uiURL'] + self.settings['pithos_ui'] = pithos_ui + break + except Exception as e: + LOG.debug('Failed to retrieve pithos_ui: %s' % e) + + for option in ('container', 'directory', 'exclude'): + self.settings[option] = self.cnf.get_sync(sync, option) + + def _dump_settings(self): + sync = self.cnf.get('global', 'default_sync') + cloud = self.cnf.get_sync(sync, 'cloud') + + old_url = self.cnf.get_cloud(cloud, 'url') + while old_url != self.settings['url']: + cloud = '%s_%s' % (cloud, sync) + try: + self.cnf.get_cloud(cloud, 'url') + except KeyError: + break + + self.cnf.set_cloud(cloud, 'url', self.settings['url']) + self.cnf.set_cloud(cloud, 'token', self.settings['token']) + self.cnf.set_sync(sync, 'cloud', cloud) + + for option in ('directory', 'container', 'exclude'): + self.cnf.set_sync(sync, option, self.settings[option]) # Syncer-related methods def get_status(self): @@ -79,10 +121,12 @@ class WebSocketProtocol(WebSocket): return self.status def get_settings(self): + self._load_settings() return self.settings def set_settings(self, new_settings): self.settings = new_settings + self._dump_settings() def pause_sync(self): self.status['paused'] = True @@ -93,6 +137,7 @@ class WebSocketProtocol(WebSocket): # WebSocket connection methods def opened(self): LOG.debug('Helper: connection established') + self._load_settings() def closed(self, *args): LOG.debug('Helper: connection closed')