Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar3/profile.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar3/profile.py')
-rw-r--r--src/sugar3/profile.py238
1 files changed, 238 insertions, 0 deletions
diff --git a/src/sugar3/profile.py b/src/sugar3/profile.py
new file mode 100644
index 0000000..c1dffd7
--- /dev/null
+++ b/src/sugar3/profile.py
@@ -0,0 +1,238 @@
+# 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 _get_pubkey(self):
+ if self._pubkey is None:
+ self._pubkey = self._load_pubkey()
+ return self._pubkey
+
+ pubkey = property(fget=_get_pubkey)
+
+ def _get_privkey_hash(self):
+ if self._privkey_hash is None:
+ self._privkey_hash = self._hash_private_key()
+ return self._privkey_hash
+
+ privkey_hash = property(fget=_get_privkey_hash)
+
+ 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')
+
+ if not os.path.exists(key_path):
+ return None
+
+ try:
+ f = open(key_path, 'r')
+ lines = f.readlines()
+ f.close()
+ except IOError:
+ logging.exception('Error reading public key')
+ 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 _hash_private_key(self):
+ key_path = os.path.join(env.get_profile_path(), 'owner.key')
+
+ if not os.path.exists(key_path):
+ return None
+
+ try:
+ f = open(key_path, 'r')
+ lines = f.readlines()
+ f.close()
+ except IOError:
+ logging.exception('Error reading private key')
+ return None
+
+ key = ""
+ begin_found = False
+ end_found = False
+ for l in lines:
+ l = l.strip()
+ if l.startswith('-----BEGIN DSA PRIVATE KEY-----'):
+ begin_found = True
+ continue
+ if l.startswith('-----END DSA PRIVATE KEY-----'):
+ end_found = True
+ continue
+ key += l
+ if not (len(key) and begin_found and end_found):
+ logging.error('Error parsing public key.')
+ return None
+
+ # hash it
+ key_hash = util.sha_data(key)
+ return util.printable_hash(key_hash)
+
+ 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=' \
+ '$HOME/.sugar/default/logs/telepathy-gabble.log\n' \
+ '#export SALUT_DEBUG=all\n' \
+ '#export SALUT_LOGFILE=' \
+ '$HOME/.sugar/default/logs/telepathy-salut.log\n' \
+ '#export GIBBER_DEBUG=all\n' \
+ '#export WOCKY_DEBUG=all\n' \
+ '#export MC_LOGFILE=' \
+ '$HOME/.sugar/default/logs/mission-control.log\n' \
+ '#export MC_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