debianmemberportfolio/debianmemberportfolio/model/urlbuilder.py
Jan Dittberner fe0a8c7851 Replace gnupg and PGP with OpenPGP
This commit replaces the tool names gnupg and PGP with the standard RFC term
OpenPGP. Thanks to Guillem Jover for the inspiration.
2022-09-24 14:16:52 +02:00

114 lines
4.3 KiB
Python

# -*- python -*-
# -*- coding: utf8 -*-
#
# Debian Member Portfolio Service url builder
#
# Copyright © 2009-2022 Jan Dittberner <jan@dittberner.info>
#
# This file is part of the Debian Member Portfolio Service.
#
# Debian Member Portfolio Service is free software: you can redistribute it
# and/or modify it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the License,
# or (at your option) any later version.
#
# Debian Member Portfolio Service 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 Affero
# General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
"""
This module provides the function build_urls to build personalized
URLs using the given information and the URL patterns defined in
portfolio.ini.
"""
from configparser import ConfigParser, InterpolationMissingOptionError
from encodings.utf_8 import StreamReader as UTF8StreamReader
import pkg_resources
from debianmemberportfolio.model import keyfinder
from urllib.parse import quote_plus
from flask_babel import gettext as _, lazy_gettext as N_
my_config = ConfigParser()
my_config.read_file(UTF8StreamReader(
pkg_resources.resource_stream(__name__, 'portfolio.ini')))
_FIELDNAMES_MAP = {
'email': N_('Email address'),
'name': N_('Name'),
'openpgpfp': N_('OpenPGP fingerprint'),
'username': N_('Debian user name'),
'nonddemail': N_('Non Debian email address'),
'salsausername': N_('Salsa user name'),
}
class DDPortfolioEntry(object):
def __init__(self, config, section, key):
self.name = key
self.optional = config.has_option(section, key + '.optional') and \
config.getboolean(section, key + '.optional') or False
if config.has_option(section, key + '.type'):
self.type = config.get(section, key + '.type')
else:
self.type = 'url'
def _build_quoted_fields(fields):
"""
Take a dictionary of raw field values and quote the values if required.
"""
qfields = {}
for key, value in fields.items():
if value is not None:
if isinstance(value, str):
qfields[key] = quote_plus(value.encode('utf8'))
elif isinstance(value, str):
qfields[key] = quote_plus(value)
else:
qfields[key] = value
qfields[key] = str(qfields[key]).replace('%', '%%')
if 'openpgpfp' not in qfields:
fpr = keyfinder.getFingerprintByEmail(fields['email'].encode('utf8'))
if fpr:
qfields['openpgpfp'] = fpr[0]
qfields['firstchar'] = fields['email'][0].encode('utf8')
qfields['emailnoq'] = fields['email'].encode('utf8')
return qfields
def build_urls(fields):
"""Build personalized URLs using the developer information in
fields."""
data = []
qfields = _build_quoted_fields(fields)
for section in [section.strip() for section in
my_config.get('DEFAULT',
'urlbuilder.sections').split(',')]:
data.append(['section', section])
if my_config.has_option(section, 'urls'):
for entry in ([
DDPortfolioEntry(my_config, section, url) for url in
my_config.get(section, 'urls').split(',')]):
try:
data.append(
['url', section, entry,
my_config.get(section, entry.name + '.pattern',
raw=False, vars=qfields)])
except InterpolationMissingOptionError as e:
if not entry.optional:
if e.reference in _FIELDNAMES_MAP:
data.append(['error', section, entry,
_('Missing input: %s') %
_(_FIELDNAMES_MAP[e.reference])])
else:
data.append(['error', section, entry,
_('Missing input: %s') % e.reference])
return data