173 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""User settings/configuration loading"""
 | 
						|
# Copyright (C) 2006-2007 Red Hat, Inc.
 | 
						|
#
 | 
						|
# This program is free software; you can redistribute it and/or modify
 | 
						|
# it under the terms of the GNU General Public License as published by
 | 
						|
# the Free Software Foundation; either version 2 of the License, or
 | 
						|
# (at your option) any later version.
 | 
						|
#
 | 
						|
# This program 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 General Public License for more details.
 | 
						|
#
 | 
						|
# You should have received a copy of the GNU General Public License
 | 
						|
# along with this program; if not, write to the Free Software
 | 
						|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
						|
 | 
						|
import os
 | 
						|
import logging
 | 
						|
from ConfigParser import ConfigParser
 | 
						|
 | 
						|
from sugar import env
 | 
						|
from sugar import util
 | 
						|
from sugar.graphics.xocolor import XoColor
 | 
						|
 | 
						|
class _Profile(object):
 | 
						|
    """Local user's current options/profile information
 | 
						|
    
 | 
						|
    User settings are stored in an INI-style configuration
 | 
						|
    file.  This object uses the ConfigParser module to load 
 | 
						|
    the settings.  At the moment the only storage mechanism
 | 
						|
    is in the set_server_registered method, which loads the 
 | 
						|
    file directly from disk, then dumps it back out again 
 | 
						|
    immediately, rather than using the class.
 | 
						|
    
 | 
						|
    The profile is also responsible for loading the user's
 | 
						|
    public and private ssh keys from disk.
 | 
						|
    
 | 
						|
    Attributes:
 | 
						|
    
 | 
						|
        name -- child's name 
 | 
						|
        color -- XoColor for the child's icon
 | 
						|
        server -- school server with which the child is 
 | 
						|
            associated 
 | 
						|
        server_registered -- whether the child has registered 
 | 
						|
            with the school server or not
 | 
						|
        
 | 
						|
        pubkey -- public ssh key
 | 
						|
        privkey_hash -- SHA has of the child's public key 
 | 
						|
    """
 | 
						|
    def __init__(self):
 | 
						|
        self.name = None
 | 
						|
        self.color = None
 | 
						|
        self.pubkey = None
 | 
						|
        self.privkey_hash = None
 | 
						|
        self.server = None
 | 
						|
        self.server_registered = False
 | 
						|
        self._load()
 | 
						|
 | 
						|
    def update(self):
 | 
						|
        self._load()
 | 
						|
 | 
						|
    def _load(self):
 | 
						|
        cp = ConfigParser()
 | 
						|
        config_path = os.path.join(env.get_profile_path(), 'config')
 | 
						|
        parsed = cp.read([config_path])
 | 
						|
 | 
						|
        if cp.has_option('Buddy', 'NickName'):
 | 
						|
            name = cp.get('Buddy', 'NickName')
 | 
						|
            # decode nickname from ascii-safe chars to unicode
 | 
						|
            self.name = name.decode("utf-8")
 | 
						|
 | 
						|
        if cp.has_option('Buddy', 'Color'):
 | 
						|
            self.color = XoColor(cp.get('Buddy', 'Color'))
 | 
						|
 | 
						|
        if cp.has_option('Server', 'Server'):
 | 
						|
            self.server = cp.get('Server', 'Server')
 | 
						|
 | 
						|
        if cp.has_option('Server', 'Registered'):
 | 
						|
            registered = cp.get('Server', 'Registered')
 | 
						|
            if registered.lower() == "true":
 | 
						|
                self.server_registered = True
 | 
						|
 | 
						|
        del cp
 | 
						|
 | 
						|
        self._load_pubkey()
 | 
						|
        self._hash_private_key()
 | 
						|
 | 
						|
    def _load_pubkey(self):
 | 
						|
        self.pubkey = None
 | 
						|
 | 
						|
        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
 | 
						|
 | 
						|
        magic = "ssh-dss "
 | 
						|
        for l in lines:
 | 
						|
            l = l.strip()
 | 
						|
            if not l.startswith(magic):
 | 
						|
                continue
 | 
						|
            self.pubkey = l[len(magic):]
 | 
						|
            break
 | 
						|
        if not self.pubkey:
 | 
						|
            logging.error("Error parsing public key.")
 | 
						|
 | 
						|
    def _hash_private_key(self):
 | 
						|
        self.privkey_hash = None
 | 
						|
        
 | 
						|
        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
 | 
						|
 | 
						|
        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.")
 | 
						|
 | 
						|
        # hash it
 | 
						|
        key_hash = util._sha_data(key)
 | 
						|
        self.privkey_hash = util.printable_hash(key_hash)
 | 
						|
 | 
						|
def get_nick_name():
 | 
						|
    return _profile.name
 | 
						|
 | 
						|
def get_color():
 | 
						|
    return _profile.color
 | 
						|
 | 
						|
def get_pubkey():
 | 
						|
    return _profile.pubkey
 | 
						|
 | 
						|
def get_private_key_hash():
 | 
						|
    return _profile.privkey_hash
 | 
						|
 | 
						|
def get_server():
 | 
						|
    return _profile.server
 | 
						|
 | 
						|
def get_server_registered():
 | 
						|
    return _profile.server_registered
 | 
						|
 | 
						|
def set_server_registered():
 | 
						|
    _profile.server_registered = True
 | 
						|
 | 
						|
    cp = ConfigParser()
 | 
						|
 | 
						|
    config_path = os.path.join(env.get_profile_path(), 'config')
 | 
						|
    cp.read([config_path])
 | 
						|
 | 
						|
    if not cp.has_section('Server'):
 | 
						|
        cp.add_section('Server')
 | 
						|
    cp.set('Server', 'Registered', True)
 | 
						|
    cp.write(open(config_path, 'w'))
 | 
						|
 | 
						|
def update():
 | 
						|
    _profile.update()
 | 
						|
 | 
						|
_profile = _Profile()
 |