sugar-toolkit-gtk3/src/sugar3/profile.py

225 lines
6.9 KiB
Python
Raw Normal View History

2007-06-24 14:57:57 +02:00
# Copyright (C) 2006-2007, Red Hat, Inc.
2006-10-15 01:24:45 +02:00
#
2007-06-24 14:57:57 +02:00
# 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.
2006-10-15 01:24:45 +02:00
#
2007-06-24 14:57:57 +02:00
# This library is distributed in the hope that it will be useful,
2006-10-15 01:24:45 +02:00
# but WITHOUT ANY WARRANTY; without even the implied warranty of
2007-06-24 14:57:57 +02:00
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
2006-10-15 01:24:45 +02:00
#
2007-06-24 14:57:57 +02:00
# 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.
2006-10-15 01:24:45 +02:00
"""User settings/configuration loading.
"""
2013-12-26 16:53:36 +01:00
from gi.repository import Gio
import os
2007-02-25 23:53:10 +01:00
import logging
from ConfigParser import ConfigParser
2006-08-12 23:35:52 +02:00
from sugar3 import env
from sugar3 import util
from sugar3.graphics.xocolor import XoColor
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
import getpass
2009-08-25 21:12:40 +02:00
_profile = None
2009-08-25 21:12:40 +02:00
class Profile(object):
"""Local user's current options/profile information
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
"""
2009-08-25 21:12:40 +02:00
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):
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
nick = get_nick_name()
color = get_color()
2008-10-11 18:28:40 +02:00
return nick is not '' and \
2013-05-18 04:33:36 +02:00
color is not '' and \
self.pubkey is not None and \
self.privkey_hash is not None
2007-02-25 23:53:10 +01:00
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
2007-02-25 23:53:10 +01:00
try:
f = open(key_path, 'r')
2007-02-25 23:53:10 +01:00
lines = f.readlines()
f.close()
2009-08-24 12:54:02 +02:00
except IOError:
logging.exception('Error reading public key')
return None
2007-02-25 23:53:10 +01:00
magic = 'ssh-dss '
2007-02-25 23:53:10 +01:00
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()
2009-08-24 12:54:02 +02:00
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
2008-08-11 00:50:29 +02:00
key_hash = util.sha_data(key)
return util.printable_hash(key_hash)
2008-10-11 18:28:40 +02:00
def convert_profile(self):
cp = ConfigParser()
path = os.path.join(env.get_profile_path(), 'config')
cp.read([path])
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs.user')
2008-10-11 18:28:40 +02:00
if cp.has_option('Buddy', 'NickName'):
name = cp.get('Buddy', 'NickName')
# decode nickname from ascii-safe chars to unicode
nick = name.decode('utf-8')
2013-12-26 16:53:36 +01:00
settings.set_string('nick', nick)
2008-10-11 18:28:40 +02:00
if cp.has_option('Buddy', 'Color'):
color = cp.get('Buddy', 'Color')
2013-12-26 16:53:36 +01:00
settings.set_string('color', color)
2008-10-11 18:28:40 +02:00
if cp.has_option('Jabber', 'Server'):
server = cp.get('Jabber', 'Server')
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs.collaboration')
settings.set_string('jabber-server', server)
2008-10-11 18:28:40 +02:00
if cp.has_option('Date', 'Timezone'):
timezone = cp.get('Date', 'Timezone')
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs.date')
settings.set_string('timezone', timezone)
settings = Gio.Settings('org.sugarlabs.frame')
2008-10-11 18:28:40 +02:00
if cp.has_option('Frame', 'HotCorners'):
delay = float(cp.get('Frame', 'HotCorners'))
2013-12-26 16:53:36 +01:00
settings.set_int('corner-delay', int(delay))
2008-10-11 18:28:40 +02:00
if cp.has_option('Frame', 'WarmEdges'):
delay = float(cp.get('Frame', 'WarmEdges'))
2013-12-26 16:53:36 +01:00
settings.set_int('edge-delay', int(delay))
2008-10-11 18:28:40 +02:00
if cp.has_option('Server', 'Backup1'):
backup1 = cp.get('Server', 'Backup1')
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs')
settings.set_string('backup-url', backup1)
2008-10-11 18:28:40 +02:00
if cp.has_option('Sound', 'Volume'):
2008-10-13 16:53:30 +02:00
volume = float(cp.get('Sound', 'Volume'))
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs.sound')
settings.set_int('volume', int(volume))
settings = Gio.Settings('org.sugarlabs.power')
2008-10-11 18:28:40 +02:00
if cp.has_option('Power', 'AutomaticPM'):
state = cp.get('Power', 'AutomaticPM')
if state.lower() == 'true':
2013-12-26 16:53:36 +01:00
settings.set_boolean('automatic', True)
2008-10-11 18:28:40 +02:00
if cp.has_option('Power', 'ExtremePM'):
state = cp.get('Power', 'ExtremePM')
if state.lower() == 'true':
2013-12-26 16:53:36 +01:00
settings.set_boolean('extreme', True)
2008-10-11 18:28:40 +02:00
if cp.has_option('Shell', 'FavoritesLayout'):
layout = cp.get('Shell', 'FavoritesLayout')
2013-12-26 16:53:36 +01:00
settings = Gio.Settings('org.sugarlabs.desktop')
settings.set_string('favorites-layout', layout)
2008-10-11 18:28:40 +02:00
del cp
try:
os.unlink(path)
except OSError:
logging.error('Error removing old profile.')
2009-08-25 21:12:40 +02:00
def get_profile():
global _profile
if not _profile:
path = os.path.join(env.get_profile_path(), 'config')
_profile = Profile(path)
return _profile
2009-08-25 21:12:40 +02:00
def get_nick_name():
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
if 'org.sugarlabs.user' in Gio.Settings.list_schemas():
settings = Gio.Settings('org.sugarlabs.user')
return settings.get_string('nick')
else:
return getpass.getuser()
2009-08-25 21:12:40 +02:00
def get_color():
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
if 'org.sugarlabs.user' in Gio.Settings.list_schemas():
settings = Gio.Settings('org.sugarlabs.user')
color = settings.get_string('color')
return XoColor(color)
else:
return XoColor()
2009-08-25 21:12:40 +02:00
def get_pubkey():
return get_profile().pubkey