/usr/share/pyshared/sugar3/profile.py is in python-sugar3 0.98.7-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 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.
"""
from gi.repository import GConf
import os
import logging
from ConfigParser import ConfigParser
from sugar3 import env
from sugar3 import util
from sugar3.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
|