From eaef567cabc5c0dda9706faa0e17e20909131ade Mon Sep 17 00:00:00 2001 From: simpoir Date: Fri, 30 Jan 2009 04:14:48 +0000 Subject: ajout initial du tree jhbuild [jhbuild base] --- (limited to 'src/sugar/profile.py') diff --git a/src/sugar/profile.py b/src/sugar/profile.py new file mode 100644 index 0000000..cce45a7 --- /dev/null +++ b/src/sugar/profile.py @@ -0,0 +1,216 @@ +# Copyright (C) 2006-2007, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +"""User settings/configuration loading. + +DEPRECATED. We are using GConf now to store preferences. +""" + +import gconf +import os +import logging +from ConfigParser import ConfigParser + +from sugar import env +from sugar import util +from sugar.graphics.xocolor import XoColor + +_profile = None + +class Profile(object): + """Local user's current options/profile information + + User settings were previously stored in an INI-style + configuration file. We moved to gconf now. The deprected + API is kept around to not break activities still using it. + + The profile is also responsible for loading the user's + public and private ssh keys from disk. + + Attributes: + + pubkey -- public ssh key + privkey_hash -- SHA has of the child's public key + """ + def __init__(self, path): + self._pubkey = None + self._privkey_hash = None + + def is_valid(self): + client = gconf.client_get_default() + nick = client.get_string("/desktop/sugar/user/nick") + color = client.get_string("/desktop/sugar/user/color") + + return nick is not '' and \ + color is not '' and \ + self.pubkey is not None and \ + self.privkey_hash is not None + + def _load_pubkey(self): + key_path = os.path.join(env.get_profile_path(), 'owner.key.pub') + try: + f = open(key_path, "r") + lines = f.readlines() + f.close() + except IOError, e: + logging.error("Error reading public key: %s" % e) + return None + + magic = "ssh-dss " + for l in lines: + l = l.strip() + if not l.startswith(magic): + continue + return l[len(magic):] + else: + logging.error("Error parsing public key.") + return None + + def _get_pubkey(self): + # load on-demand. + if not self._pubkey: + self._pubkey = self._load_pubkey() + return self._pubkey + + def _hash_private_key(self): + key_path = os.path.join(env.get_profile_path(), 'owner.key') + try: + f = open(key_path, "r") + lines = f.readlines() + f.close() + except IOError, e: + logging.error("Error reading private key: %s" % e) + return None + + key = "" + for l in lines: + l = l.strip() + if l.startswith("-----BEGIN DSA PRIVATE KEY-----"): + continue + if l.startswith("-----END DSA PRIVATE KEY-----"): + continue + key += l + if not len(key): + logging.error("Error parsing public key.") + return None + + # hash it + key_hash = util.sha_data(key) + return util.printable_hash(key_hash) + + def _get_privkey_hash(self): + # load on-demand. + if not self._privkey_hash: + self._privkey_hash = self._hash_private_key() + return self._privkey_hash + + privkey_hash = property(_get_privkey_hash) + pubkey = property(_get_pubkey) + + def convert_profile(self): + cp = ConfigParser() + path = os.path.join(env.get_profile_path(), 'config') + cp.read([path]) + + client = gconf.client_get_default() + + if cp.has_option('Buddy', 'NickName'): + name = cp.get('Buddy', 'NickName') + # decode nickname from ascii-safe chars to unicode + nick = name.decode("utf-8") + client.set_string("/desktop/sugar/user/nick", nick) + if cp.has_option('Buddy', 'Color'): + color = cp.get('Buddy', 'Color') + client.set_string("/desktop/sugar/user/color", color) + if cp.has_option('Jabber', 'Server'): + server = cp.get('Jabber', 'Server') + client.set_string("/desktop/sugar/collaboration/jabber_server", + server) + if cp.has_option('Date', 'Timezone'): + timezone = cp.get('Date', 'Timezone') + client.set_string("/desktop/sugar/date/timezone", timezone) + if cp.has_option('Frame', 'HotCorners'): + delay = float(cp.get('Frame', 'HotCorners')) + client.set_int("/desktop/sugar/frame/corner_delay", int(delay)) + if cp.has_option('Frame', 'WarmEdges'): + delay = float(cp.get('Frame', 'WarmEdges')) + client.set_int("/desktop/sugar/frame/edge_delay", int(delay)) + if cp.has_option('Server', 'Backup1'): + backup1 = cp.get('Server', 'Backup1') + client.set_string("/desktop/sugar/backup_url", backup1) + if cp.has_option('Sound', 'Volume'): + volume = float(cp.get('Sound', 'Volume')) + client.set_int("/desktop/sugar/sound/volume", int(volume)) + if cp.has_option('Power', 'AutomaticPM'): + state = cp.get('Power', 'AutomaticPM') + if state.lower() == "true": + client.set_bool("/desktop/sugar/power/automatic", True) + if cp.has_option('Power', 'ExtremePM'): + state = cp.get('Power', 'ExtremePM') + if state.lower() == "true": + client.set_bool("/desktop/sugar/power/extreme", True) + if cp.has_option('Shell', 'FavoritesLayout'): + layout = cp.get('Shell', 'FavoritesLayout') + client.set_string("/desktop/sugar/desktop/favorites_layout", + layout) + del cp + try: + os.unlink(path) + except OSError: + logging.error('Error removing old profile.') + + def create_debug_file(self): + path = os.path.join(os.path.expanduser('~/.sugar'), 'debug') + fd = open(path, 'w') + text = '# Uncomment the following lines to turn on many' \ + 'sugar debugging\n'\ + '# log files and features\n'\ + '#export LM_DEBUG=net\n' \ + '#export GABBLE_DEBUG=all\n' \ + '#export' \ + 'GABBLE_LOGFILE=~/.sugar/default/logs/telepathy-gabble.log\n' \ + '#export SALUT_DEBUG=all\n' \ + '#export' \ + 'SALUT_LOGFILE=~/.sugar/default/logs/telepathy-salut.log\n' \ + '#export GIBBER_DEBUG=all\n' \ + '#export PRESENCESERVICE_DEBUG=1\n' \ + '#export SUGAR_LOGGER_LEVEL=debug\n\n' \ + '# Uncomment the following line to enable core dumps\n' \ + '#ulimit -c unlimited\n' + fd.write(text) + fd.close() + +def get_profile(): + global _profile + + if not _profile: + path = os.path.join(env.get_profile_path(), 'config') + _profile = Profile(path) + + return _profile + +def get_nick_name(): + client = gconf.client_get_default() + return client.get_string("/desktop/sugar/user/nick") + +def get_color(): + client = gconf.client_get_default() + color = client.get_string("/desktop/sugar/user/color") + return XoColor(color) + +def get_pubkey(): + return get_profile().pubkey -- cgit v0.9.1