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
|
#
#-*- coding:utf-8 -*-
"""
Gentoo-keys - config.py
Holds configuration keys and values
@copyright: 2012-2015 by Brian Dolbec <dol-sen@gentoo.org>
@license: GNU GNU GPL2, see COPYING for details.
"""
import os
from collections import OrderedDict
from pyGPG.config import GPGConfig
from gkeys.SaneConfigParser import SaneConfigParser
from gkeys.utils import path
# establish the eprefix, initially set so eprefixify can
# set it on install
EPREFIX = "@GENTOO_PORTAGE_EPREFIX@"
# check and set it if it wasn't
if "GENTOO_PORTAGE_EPREFIX" in EPREFIX:
EPREFIX = ''
class GKeysConfig(GPGConfig):
""" Configuration superclass which holds our gentoo-keys
config settings for pygpg """
def __init__(self, config=None, root=None, read_configfile=False):
""" Class initialiser """
GPGConfig.__init__(self)
self.logger = None
self.root = root or ''
self.defaults = OrderedDict(self.defaults)
if config:
self.defaults['config'] = config
self.defaults['configdir'] = os.path.dirname(config)
else:
self._set_default_config()
self.configparser = None
self._add_gkey_defaults()
if read_configfile:
self.read_config()
def _set_default_config(self):
self.defaults['homedir'] = os.path.expanduser('~')
self.defaults['userconfigdir'] = os.path.join(
self.defaults['homedir'], '.config', 'gkeys')
self.defaults['configdir'] = self.defaults['userconfigdir']
self.defaults['config']= os.path.join(
self.defaults['userconfigdir'], 'gkeys.conf')
self.defaults['template_path'] = '/usr/share/gkeys/templates'
if not os.path.exists(self.defaults['config']):
self.defaults['configdir'] = path([self.root, EPREFIX, '/etc/gkeys'])
self.defaults['config'] = '%(configdir)s/gkeys.conf'
def _add_gkey_defaults(self):
self.defaults['gkeysdir'] = path([self.root, EPREFIX, '/var/lib/gentoo/gkeys'])
self.defaults['keyring'] = '%(gkeysdir)s/keyrings'
self.defaults['sign-keydir'] = '%(gkeysdir)s/sign',
self.defaults['logdir'] = '/var/log/gkeys'
# local directory to scan for seed files installed via ebuild, layman
# or manual install.
self.defaults['seedsdir'] = '%(gkeysdir)s/seeds'
self.defaults['seeds'] = {}
self.defaults['keyserver'] = 'pool.sks-keyservers.net'
# NOTE: files is umask mode in octal, directories is chmod mode in octal
self.defaults['permissions'] = {'files': '0o002', 'directories': '0o775',}
self.defaults['seedurls'] = {}
self.defaults['sign'] = {
'key': 'fingerprint',
'keydir': '~/.gkeys',
'keyring': None,
'type': 'clearsign',
}
self.defaults['verify-keyring'] = 'gentoo'
self.defaults['verify-nick'] = 'gkeys'
self.defaults['verify-seeds'] = {}
self.defaults['days_limit'] = 30
def read_config(self, filename=None):
'''Reads the config file into memory
'''
if "%(configdir)s" in self.defaults['config']:
# fix the config path
self.defaults['config'] = self.defaults['config'] \
% {'configdir': self.defaults['configdir']}
for key in self.defaults:
self.defaults[key] = self._sub_(self.defaults[key])
defaults = OrderedDict()
# Add only the defaults we want in the configparser
for key in ['userconfigdir', 'gkeysdir', 'homedir', 'keyring', 'sign-keydir', 'logdir',
'seedsdir', 'keyserver']:
defaults[key] = self.defaults[key]
if filename == None:
filename = self.defaults['config']
if "foo-bar'd" in filename:
print("Config: read_config(); Configuration ERROR: filename: %s, access: %s"
% (filename, os.access(filename, os.R_OK)))
self.configparser = SaneConfigParser(defaults)
self.configparser.read(filename)
if self.configparser.has_section('base'):
# I consider this hacky, but due to shortcomings of ConfigParser
# we need to reset the defaults redefined in the 'base' section
for key in self.configparser.options('base'):
self.defaults[key] = self.configparser.get('base', key)
defaults[key] = self.defaults[key]
self.configparser._defaults = defaults
for section in self.configparser.sections():
if section == 'base':
continue
for key in self.configparser.options(section):
if section not in self.defaults:
self.defaults[section] = {}
self.defaults[section][key] = self.configparser.get(section, key)
def get_key(self, key, subkey=None):
return self._get_(key, subkey)
def _get_(self, key, subkey=None):
if subkey:
if key in self.options and subkey in self.options[key]:
return self._sub_(self.options[key][subkey])
elif key in self.defaults and subkey in self.defaults[key]:
return self._sub_(self.defaults[key][subkey])
else:
return super(GKeysConfig, self)._get_(key, subkey)
else:
return super(GKeysConfig, self)._get_(key, subkey)
|