diff --git a/fas/.gitignore b/fas/.gitignore index dec3ed5..3021ee9 100644 --- a/fas/.gitignore +++ b/fas/.gitignore @@ -8,4 +8,5 @@ fas.log *.pyc *.pyo *.swp +*.mo fas.egg-info diff --git a/fas/README b/fas/README index 4ef21fc..66fe76e 100644 --- a/fas/README +++ b/fas/README @@ -27,7 +27,7 @@ Before you can get started, make sure to have the following packages installed yum install git-core postgresql-plpython postgresql-server postgresql-python \ python-TurboMail TurboGears pygpgme python-sqlalchemy python-genshi \ - python-psycopg2 + python-psycopg2 pytz # Note: on RHEL5 you need postgresql-pl instead of postgresql-plpython @@ -123,4 +123,5 @@ To test, look and see if your groups or users show up with getent. For example: getent passwd - getent group \ No newline at end of file + getent group + diff --git a/fas/client/fasClient.py b/fas/client/fasClient.py index db65ca3..bc1f33a 100755 --- a/fas/client/fasClient.py +++ b/fas/client/fasClient.py @@ -30,7 +30,7 @@ from optparse import OptionParser from shutil import move, rmtree from rhpl.translate import _ -FAS_URL = 'http://localhost:8080/fas/' +FAS_URL = 'http://localhost:8088/fas/' parser = OptionParser() @@ -78,20 +78,15 @@ class MakeShellAccounts(BaseClient): temp = None def mk_tempdir(self): - self.temp = tempfile.mkdtemp('-tmp', 'fas-') - os.chmod(self.temp, 00400) + self.temp = tempfile.mkdtemp('-tmp', 'fas-', '/var/db') def rm_tempdir(self): rmtree(self.temp) - def group_list(self, search='*'): - params = {'search' : search} - data = self.send_request('group/list', auth=True, input=params) - return data - def shadow_text(self, people=None): i = 0 file = open(self.temp + '/shadow.txt', 'w') + os.chmod(self.temp + '/shadow.txt', 00400) if not people: people = self.people_list() for person in people: @@ -103,8 +98,6 @@ class MakeShellAccounts(BaseClient): file.write(".%s %s:%s:99999:0:99999:7:::\n" % (username, username, password)) i = i + 1 file.close() - os.chmod(self.temp + '/shadow.txt', 00400) - def passwd_text(self, people=None): i = 0 @@ -136,10 +129,10 @@ class MakeShellAccounts(BaseClient): for person in people: uid = person['id'] username = person['username'] - usernames['%s' % uid] = username + usernames[uid] = username file.write("=%i %s:x:%i:\n" % (uid, username, uid)) - file.write( "0%i %s:x:%i:\n" % (i, username, uid)) - file.write( ".%s %s:x:%i:\n" % (username, username, uid)) + file.write("0%i %s:x:%i:\n" % (i, username, uid)) + file.write(".%s %s:x:%i:\n" % (username, username, uid)) i = i + 1 for group in groups['groups']: @@ -149,18 +142,23 @@ class MakeShellAccounts(BaseClient): try: ''' Shoot me now I know this isn't right ''' members = [] - for member in groups['memberships'][u'%s' % gid]: - members.append(usernames['%s' % member['person_id']]) + for member in groups['memberships'][name]: + members.append(usernames[member['person_id']]) memberships = ','.join(members) except KeyError: ''' No users exist in the group ''' pass - file.write( "=%i %s:x:%i:%s\n" % (gid, name, gid, memberships)) + file.write("=%i %s:x:%i:%s\n" % (gid, name, gid, memberships)) file.write("0%i %s:x:%i:%s\n" % (i, name, gid, memberships)) file.write(".%s %s:x:%i:%s\n" % (name, name, gid, memberships)) i = i + 1 file.close() + + def group_list(self, search='*'): + params = {'search' : search} + data = self.send_request('group/list', auth=True, input=params) + return data def people_list(self, search='*'): params = {'search' : search} @@ -205,14 +203,11 @@ def enable(): if line.startswith('passwd') or line.startswith('shadow') or line.startswith('group'): parts = line.split() if 'db' in parts: - new.write(line) print "%s already has db enabled" % parts[0].split(':')[0] else: - tmp = line.strip('\n') - tmp = tmp + ' db\n' - new.write(tmp) - else: - new.write(line) + line = line.strip('\n') + line += ' db\n' + new.write(line) new.close() try: move('/tmp/.fas.nsswitch.conf', '/etc/nsswitch.conf') @@ -226,13 +221,10 @@ def disable(): if line.startswith('passwd') or line.startswith('shadow') or line.startswith('group'): parts = line.split() if 'db' in parts: - tmp = line.replace(' db', '') - new.write(tmp) + line = line.replace(' db', '') else: print "%s already has db disabled" % parts[0].split(':')[0] - new.write(line) - else: - new.write(line) + new.write(line) new.close() try: move('/tmp/.fas.nsswitch.conf', '/etc/nsswitch.conf') @@ -240,13 +232,7 @@ def disable(): print "ERROR: Could not write nsswitch.conf - %s" % e if __name__ == '__main__': - if opts.enable: - enable() - sys.exit() - elif opts.disable: - disable() - sys.exit() - elif opts.install: + if opts.install: try: fas = MakeShellAccounts(FAS_URL, 'admin', 'admin', False) except AuthError, e: @@ -263,5 +249,9 @@ if __name__ == '__main__': if not opts.no_shadow: fas.install_shadow_db() fas.rm_tempdir() - else: + if opts.enable: + enable() + if opts.disable: + disable() + if not (opts.install or opts.enable or opts.disable): parser.print_help() diff --git a/fas/dev.cfg b/fas/dev.cfg index 8346e6f..e266447 100644 --- a/fas/dev.cfg +++ b/fas/dev.cfg @@ -7,6 +7,7 @@ #mail.server = 'bastion.fedora.phx.redhat.com' #base_url_filter.base_url = "http://192.168.2.101:8080" +fas.url = 'http://localhost:8088/fas/' mail.on = True mail.server = 'bastion.fedora.phx.redhat.com' mail.testmode = True diff --git a/fas/fas/config/app.cfg b/fas/fas/config/app.cfg index 2afa041..7bab914 100644 --- a/fas/fas/config/app.cfg +++ b/fas/fas/config/app.cfg @@ -59,6 +59,8 @@ genshi.encoding="utf-8" # i18n session_filter.on = True i18n.run_template_filter = True +i18n.domain = 'fas' +i18n.locale_dir = 'po' # VISIT TRACKING # Each visit to your application will be assigned a unique visit ID tracked via diff --git a/fas/fas/controllers.py b/fas/fas/controllers.py index c102188..35e67a6 100644 --- a/fas/fas/controllers.py +++ b/fas/fas/controllers.py @@ -5,6 +5,7 @@ from cherrypy import request, response from turbogears import exception_handler import turbogears +import cherrypy import time from fas.user import User @@ -24,6 +25,17 @@ def add_custom_stdvars(vars): turbogears.view.variable_providers.append(add_custom_stdvars) +def get_locale(locale=None): + if locale: + return locale + if turbogears.identity.current.user_name: + person = People.by_username(turbogears.identity.current.user_name) + return person.locale + else: + return turbogears.i18n.utils._get_locale() + +config.update({'i18n.get_locale': get_locale}) + # from fas import json # import logging # log = logging.getLogger("fas.controllers") @@ -38,7 +50,7 @@ class Root(controllers.RootController): cla = CLA() json = JsonRequest() help = Help() -# openid = OpenID() + #openid = OpenID() # TODO: Find a better place for this. os.environ['GNUPGHOME'] = config.get('gpghome') @@ -110,3 +122,11 @@ class Root(controllers.RootController): # is better. return dict(status=True) raise redirect(request.headers.get("Referer", "/")) + + @expose() + def language(self, locale): + locale_key = config.get("i18n.session_key", "locale") + cherrypy.session[locale_key] = locale + raise redirect(request.headers.get("Referer", "/")) + + diff --git a/fas/fas/fasLDAP.py b/fas/fas/fasLDAP.py deleted file mode 100644 index 0398046..0000000 --- a/fas/fas/fasLDAP.py +++ /dev/null @@ -1,553 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright © 2007 Red Hat, Inc. All rights reserved. -# -# This copyrighted material is made available to anyone wishing to use, modify, -# copy, or redistribute it subject to the terms and conditions of the GNU -# General Public License v.2. This program is distributed in the hope that it -# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the -# implied warranties 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 Street, -# Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat trademarks that are -# incorporated in the source code or documentation are not subject to the GNU -# General Public License and may only be used or replicated with the express -# permission of Red Hat, Inc. -# -# Author(s): Mike McGrath -# Toshio Kuratomi -# Ricky Zhou -# - -''' -python-fedora, python module to interact with Fedora Infrastructure Services -''' - -import ldap -from ldap import modlist -import time -from random import Random -import sha -from base64 import b64encode -import sys -import os - -dbName = 'fastest' - -class AuthError(Exception): - pass - -def retrieve_db_info(dbKey): - '''Retrieve information to connect to the db from the filesystem. - - Arguments: - :dbKey: The string identifying the database entry in the config file. - - Returns: A dictionary containing the values to use in connecting to the - database. - - Exceptions: - :IOError: Returned if the config file is not on the system. - :AuthError: Returned if there is no record found for dbKey in the - config file. - ''' - # Open a filehandle to the config file - if os.environ.has_key('HOME') and os.path.isfile( - os.path.join(os.environ.get('HOME'), '.fedora-db-access')): - fh = file(os.path.join( - os.environ.get('HOME'), '.fedora-db-access'), 'r') - elif os.path.isfile('/etc/sysconfig/fedora-db-access'): - fh = file('/etc/sysconfig/fedora-db-access', 'r') - else: - raise IOError, 'fedora-db-access file does not exist.' - - # Read the file until we get the information for the requested db - dbInfo = None - for line in fh.readlines(): - if not line: - break - line = line.strip() - if not line or line[0] == '#': - continue - pieces = line.split(None, 1) - if len(pieces) < 2: - continue - if pieces[0] == dbKey: - dbInfo = eval(pieces[1]) - break - - if fh: - fh.close() - if not dbInfo: - raise AuthError, 'Authentication source "%s" not configured' % (dbKey,) - return dbInfo - -class Server(object): - def __init__(self, server=None, who=None, password=None): - pass - #try: - #dbInfo = retrieve_db_info(dbName) - #except IOError: - #raise AuthError, 'Authentication config file fedora-db-access is' \ - #' not available' - #server = server or dbInfo['host'] or 'localhost' - #who = 'cn=%s' % (who or dbInfo['user']) - ## Some db connections have no password - #password = password or dbInfo.get('password') - - #self.ldapConn = ldap.open(server) - #self.ldapConn.simple_bind_s(who, password) - - def add(self, base, attributes): - ''' Add a new group record to LDAP instance ''' - self.ldapConn.add_s(base, attributes.items()) - - def delete(self, base): - ''' Delete target base ''' - self.ldapConn.delete_s(base) - - def modify(self, base, attribute, new, old=None): - ''' Modify an attribute, requires write access ''' - if new is None: - return None - new = unicode(new).encode('utf-8') - if new == old: - return None - - #o = { attribute : old } - #n = { attribute : new } - - ldif = [] - ldif.append((ldap.MOD_DELETE,attribute,None)) - ldif.append((ldap.MOD_ADD,attribute,new)) - - #ldif = ldap.modlist.modifyModlist(o, n, ignore_oldexistent=1) - # commit - self.ldapConn.modify_s(base, ldif) - - def search(self, base, ldapFilter, attributes=None): - ''' Basic search function ''' - scope = ldap.SCOPE_SUBTREE - count = 0 - timeout = 2 - result_set = [] - try: - result_id = self.ldapConn.search(base, scope, ldapFilter, attributes) - while True: - result_type, result_data = self.ldapConn.result(result_id, timeout) - if (result_data == []): - break - else: - if result_type == ldap.RES_SEARCH_ENTRY: - result_set.append(result_data) - if len(result_set) == 0: - return - except ldap.LDAPError, e: - raise - - return result_set - -############################################################################### -# Group - Contains information about a specific group, 'sysadmin' would be -# an example of a Group -############################################################################### - -class Group(object): - ''' Group abstraction class ''' - - __server = Server() - __base = 'ou=FedoraGroups,dc=fedoraproject,dc=org' - - def __init__(self, cn, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupType, fedoraGroupNeedsSponsor, fedoraGroupUserCanRemove, fedoraGroupRequires, fedoraGroupJoinMsg): - self.cn = cn - self.fedoraGroupDesc = fedoraGroupDesc - self.fedoraGroupOwner = fedoraGroupOwner - self.fedoraGroupType = fedoraGroupType - self.fedoraGroupNeedsSponsor = fedoraGroupNeedsSponsor - self.fedoraGroupUserCanRemove = fedoraGroupUserCanRemove - self.fedoraGroupRequires = fedoraGroupRequires - self.fedoraGroupJoinMsg = fedoraGroupJoinMsg - - def __json__(self): - return {'cn': self.cn, - 'fedoraGroupDesc': self.fedoraGroupDesc, - 'fedoraGroupOwner': self.fedoraGroupOwner, - 'fedoraGroupType': self.fedoraGroupType, - 'fedoraGroupNeedsSponsor': self.fedoraGroupNeedsSponsor, - 'fedoraGroupUserCanRemove': self.fedoraGroupUserCanRemove, - 'fedoraGroupRequires': self.fedoraGroupRequires, - 'fedoraGroupJoinMsg': self.fedoraGroupJoinMsg - } - - @classmethod - def newGroup(self, cn, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupType, fedoraGroupNeedsSponsor, fedoraGroupUserCanRemove, fedoraGroupRequires, fedoraGroupJoinMsg): - ''' Create a new group ''' - attributes = { 'cn' : cn.encode('utf-8'), - 'objectClass' : ('fedoraGroup'), - 'fedoraGroupDesc' : fedoraGroupDesc.encode('utf-8'), - 'fedoraGroupOwner' : fedoraGroupOwner.encode('utf-8'), - 'fedoraGroupType' : fedoraGroupType.encode('utf-8'), - 'fedoraGroupNeedsSponsor' : fedoraGroupNeedsSponsor.encode('utf-8'), - 'fedoraGroupUserCanRemove' : fedoraGroupUserCanRemove.encode('utf-8'), - 'fedoraGroupRequires' : fedoraGroupRequires.encode('utf-8'), - 'fedoraGroupJoinMsg' : fedoraGroupJoinMsg.encode('utf-8'), - } - - self.__server.add('cn=%s,%s' % (cn, self.__base), attributes) -# attributes = { -# 'objectClass' : ('organizationalUnit', 'top'), -# 'ou' : 'FedoraGroups' -# } -# self.__server.add('ou=FedoraGroups,cn=%s,%s' % (cn, self.__base), attributes) - return 0 - - -############################################################################### -# UserGroup - Determines information about a user in a group, when they joined -# who their sponsor is and their approval status are examples of -# things found in this group -############################################################################### -class UserGroup(object): - ''' Individual User->Group abstraction class ''' - def __init__(self, fedoraRoleApprovalDate=None, fedoraRoleSponsor=None, cn=None, fedoraRoleCreationDate=None, objectClass=None, fedoraRoleType=None, fedoraRoleStatus='Not a Member', fedoraRoleDomain=None): - self.fedoraRoleApprovalDate = fedoraRoleApprovalDate - self.fedoraRoleSponsor = fedoraRoleSponsor - self.cn = cn - self.fedoraRoleCreationDate = fedoraRoleCreationDate - self.objectClass = objectClass - self.fedoraRoleType = fedoraRoleType - self.fedoraRoleStatus = fedoraRoleStatus - self.fedoraRoleDomain = fedoraRoleDomain - - -############################################################################### -# Groups - Returns actual information in a group. This class actual queries -# the LDAP database. -############################################################################### -class Groups(object): - ''' Class contains group information ''' - __server = Server() - - def __init__(self): - ### FIXME: I don't think the username should be used this way. - self.__userName = None - - @classmethod - def byUserName(self, cn, includeUnapproved=None, unapprovedOnly=None): - ''' Return list of groups a certain user is in. Default excludes all non-approved groups''' - groups = {} - if includeUnapproved: - ldapFilter = 'objectClass=FedoraRole' - elif unapprovedOnly: - ldapFilter = '(&(!(fedoraRoleStatus=approved)) (objectClass=fedoraRole))' - else: - ldapFilter = '(&(fedoraRoleStatus=approved)(objectClass=FedoraRole))' - - base = 'ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % cn - try: - groupsDict = self.__server.search(base, ldapFilter) - except ldap.NO_SUCH_OBJECT: - return dict() - if not groupsDict: - groupsDict = [] - for group in groupsDict: - cn = group[0][1]['cn'][0] - groups[cn] = UserGroup( - fedoraRoleApprovalDate = group[0][1]['fedoraRoleApprovalDate'][0].decode('utf8'), - fedoraRoleSponsor = group[0][1]['fedoraRoleSponsor'][0].decode('utf8'), - cn = group[0][1]['cn'][0].decode('utf8'), - fedoraRoleCreationDate = group[0][1]['fedoraRoleCreationDate'][0].decode('utf8'), - objectClass = group[0][1]['objectClass'][0].decode('utf8'), - fedoraRoleType = group[0][1]['fedoraRoleType'][0].decode('utf8'), - fedoraRoleStatus = group[0][1]['fedoraRoleStatus'][0].decode('utf8'), - fedoraRoleDomain = group[0][1]['fedoraRoleDomain'][0].decode('utf8'), - ) - ### FIXME: userName shouldn't be shared this way - self.__userName = cn - return groups - - @classmethod - def groups(self, searchExpression='*', attributes=[]): - ''' Return a list of available groups ''' - groups = {} - ldapFilter = 'cn=%s' % (searchExpression) - base = 'ou=FedoraGroups,dc=fedoraproject,dc=org' - groupsDict = self.__server.search(base, ldapFilter, attributes) - if groupsDict: - for group in groupsDict: - name = group[0][1]['cn'][0].decode('utf8') - groups[name] = Group( - cn = group[0][1]['cn'][0].decode('utf8'), - fedoraGroupDesc = group[0][1]['fedoraGroupDesc'][0].decode('utf8'), - fedoraGroupOwner = group[0][1]['fedoraGroupOwner'][0].decode('utf8'), - fedoraGroupType = group[0][1]['fedoraGroupType'][0].decode('utf8'), - fedoraGroupNeedsSponsor = group[0][1]['fedoraGroupNeedsSponsor'][0].decode('utf8'), - fedoraGroupUserCanRemove = group[0][1]['fedoraGroupUserCanRemove'][0].decode('utf8'), - fedoraGroupRequires = group[0][1]['fedoraGroupRequires'][0].decode('utf8'), - fedoraGroupJoinMsg = group[0][1]['fedoraGroupJoinMsg'][0].decode('utf8')) - else: - return None - return groups - - @classmethod - def remove(self, groupName, userName=None): - ''' Remove user from a group ''' - ### FIXME: Should require the userName instead of sharing it this way - if not userName: - userName = self.__userName - try: - g = self.byUserName(userName, includeUnapproved=True)[groupName] - except: - raise TypeError, 'User not in group %s' % groupName - try: - self.__server.delete('cn=%s+fedoraRoleType=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (g.cn, g.fedoraRoleType, userName)) - except ldap.NO_SUCH_OBJECT: - self.__server.delete('cn=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (g.cn, userName)) - except: - raise TypeError, 'Could Not delete %s from %s' % (userName, g.cn) - - @classmethod - def apply(self, groupName, userName=None): - ''' Apply for a group ''' - - if not userName: - userName = self.__userName - - if groupName in self.byUserName(userName): - # Probably shouldn't be 'TypeError' - raise TypeError, 'Already in that group' - try: - self.byGroupName(groupName) - except TypeError: - raise TypeError, 'Group "%s" does not exist' % groupName - - now = time.time() - - attributes = { 'cn' : groupName.encode('utf-8'), - 'fedoraRoleApprovaldate' : 'None', - 'fedoraRoleCreationDate' : str(now), - 'fedoraRoleDomain' : 'None', - 'fedoraRoleSponsor' : 'None', - 'fedoraRoleStatus' : 'unapproved', - 'fedoraRoleType' : 'user', - 'objectClass' : ('fedoraRole')} - self.__server.add('cn=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (groupName, userName), attributes) - - - @classmethod - def byGroupName(cls, cn, includeUnapproved=None, unapprovedOnly=None): - ''' List users in a group. Default does not show unapproved ''' - self = cls() - users = {} - if includeUnapproved: - ldapFilter = 'cn=%s' % cn - elif unapprovedOnly: - ldapFilter = '(&(cn=%s) (objectClass=fedoraRole) (!(fedoraRoleStatus=approved)))' % cn - else: - ldapFilter = '(&(cn=%s) (objectClass=fedoraRole) (fedoraRoleStatus=approved))' % cn - base = 'ou=People,dc=fedoraproject,dc=org' - attributes = ['cn'] - usersDict = self.__server.search(base, ldapFilter) - try: - for user in usersDict: - userName = user[0][0].split(',')[2].split('=')[1] - - users[userName] = UserGroup( - fedoraRoleApprovalDate = user[0][1]['fedoraRoleApprovalDate'][0].decode('utf8'), - fedoraRoleSponsor = user[0][1]['fedoraRoleSponsor'][0].decode('utf8'), - cn = user[0][1]['cn'][0].decode('utf8'), - fedoraRoleCreationDate = user[0][1]['fedoraRoleCreationDate'][0].decode('utf8'), - objectClass = user[0][1]['objectClass'][0].decode('utf8'), - fedoraRoleType = user[0][1]['fedoraRoleType'][0].decode('utf8'), - fedoraRoleStatus = user[0][1]['fedoraRoleStatus'][0].decode('utf8'), - fedoraRoleDomain = user[0][1]['fedoraRoleDomain'][0].decode('utf8'), - ) - except TypeError: - users = {} - return users - -class Person(object): - '''Information and attributes about users ''' - __base = 'ou=People,dc=fedoraproject,dc=org' - __server = Server() - def __init__(self): - ### FIXME: Not sure what this is used for. It might be able to go - # away. It might need to be made a public attribute. - self.__filter = '' - - @classmethod - def newPerson(self, cn, givenName, mail, telephoneNumber, postalAddress): - ''' Create a new user ''' - now = time.time() - attributes = { 'cn' : cn.encode('utf-8'), - 'objectClass' : ('fedoraPerson', 'inetOrgPerson', 'organizationalPerson', 'person', 'top'), - 'displayName' : cn.encode('utf-8'), - 'sn' : cn.encode('utf-8'), - 'cn' : cn.encode('utf-8'), - 'fedoraPersonSshKey' : '', - 'facsimileTelephoneNumber' : '', - 'fedoraPersonApprovalStatus' : 'approved', - 'givenName' : givenName.encode('utf-8'), - 'mail' : mail.encode('utf-8'), - 'fedoraPersonKeyId' : '', - 'fedoraPersonCertSerial' : '-1', - 'description' : '', - 'fedoraPersonCreationDate' : str(now), - 'telephoneNumber' : telephoneNumber.encode('utf-8'), - 'fedoraPersonBugzillaMail' : mail.encode('utf-8'), - 'postalAddress' : postalAddress.encode('utf-8'), - 'fedoraPersonIrcNick' : '', - 'userPassword' : 'Disabled', - 'fedoraPersonTimeZone' : 'UTC', - } - self.__server.add('cn=%s,%s' % (cn, self.__base), attributes) - attributes = { - 'objectClass' : ('organizationalUnit', 'top'), - 'ou' : 'Roles' - } - self.__server.add('ou=Roles,cn=%s,%s' % (cn, self.__base), attributes) - return 0 - - ### FIXME: Overriding __getattr__ and __setattr__ can be tricky and have - # performance penalties. If that's okay, you may also want to consider - # inheriting from dict as that might be a better access method. - def __getattr__(self, attr): - if attr == '__filter': - return self.__filter - if attr == 'userName': - attr = 'cn' - try: - attributes = [] - attributes.append(attr) - return self.__server.search(self.__base, self.__filter, attributes)[0][0][1][attr][0].decode('utf8') - except: - # Should probably raise here. - return None - - def __setattr__(self, attr, value): - if attr.startswith('_'): - #return setattr(self.__class__, attr, value) - self.__dict__[attr] = value - return - base = 'cn=%s,ou=People,dc=fedoraproject,dc=org' % self.__getattr__('cn') - - if self.__getattr__(attr): - self.__server.modify(base, attr, value, self.__getattr__(attr)) - else: - try: - self.__server.modify(base, attr, value) - except: - self.__server.modify(base, attr, value, self.__getattr__(attr)) - - @classmethod - def users(self, searchExpression='*', findAttr='cn'): - ''' Returns a list of users ''' - users = [] - ldapFilter = '(&(objectClass=top)(%s=%s))' % (findAttr, searchExpression) - attributes = ['cn'] - usersDict = self.__server.search(self.__base, ldapFilter, attributes) - if usersDict: - for user in usersDict: - users.append(user[0][1]['cn'][0].decode('utf8')) - else: - return None - return users - - @classmethod - def byFilter(cls, ldapFilter): - ''' Returns only the first result in the search ''' - self = cls() - self.__filter = ldapFilter - return self - - @classmethod - def byUserName(self, cn): - '''Wrapper for byFilter - search by cn''' - return self.byFilter('cn=%s' % cn) - - @classmethod - def auth(self, who, password, ldapServer=None): - ''' Basic Authentication Module ''' - if not password: - raise AuthError - if not ldapServer: - s = Server() - ldapServer = s.ldapConn - who = 'cn=%s,ou=People,dc=fedoraproject,dc=org' % who - try: - ldapServer.simple_bind_s(who, password) - except: - raise AuthError - - def upgrade(self, group): - ''' Upgrade user in group ''' - base = 'cn=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (group, self.cn) - g = Groups.byGroupName(group, includeUnapproved=True)[self.cn] - if not g.fedoraRoleStatus.lower() == 'approved': - '''User not approved or sponsored''' - raise TypeError, 'User is not approved' - if g.fedoraRoleType.lower() == 'administrator': - raise TypeError, 'User cannot be upgraded beyond administrator' - elif g.fedoraRoleType.lower() == 'sponsor': - self.__server.modify(base, 'fedoraRoleType', 'administrator', g.fedoraRoleType) - elif g.fedoraRoleType.lower() == 'user': - self.__server.modify(base, 'fedoraRoleType', 'sponsor', g.fedoraRoleType) - - def downgrade(self, group): - ''' Downgrade user in group ''' - base = 'cn=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (group, self.cn) - g = Groups.byGroupName(group, includeUnapproved=True)[self.cn] - if not g.fedoraRoleStatus.lower() == 'approved': - '''User not approved or sponsored''' - raise TypeError, 'User is not approved' - if g.fedoraRoleType.lower() == 'user': - raise TypeError, 'User cannot be downgraded below user, did you mean remove?' - elif g.fedoraRoleType.lower() == 'sponsor': - self.__server.modify(base, 'fedoraRoleType', 'user', g.fedoraRoleType) - elif g.fedoraRoleType.lower() == 'administrator': - self.__server.modify(base, 'fedoraRoleType', 'sponsor', g.fedoraRoleType) - - def sponsor(self, groupName, sponsor): - ''' Sponsor current user ''' - base = 'cn=%s,ou=Roles,cn=%s,ou=People,dc=fedoraproject,dc=org' % (groupName, self.cn) - g = Groups.byGroupName(groupName, includeUnapproved=True)[self.cn] - group = Groups.groups(groupName)[groupName] - now = time.time() - self.__server.modify(base, 'fedoraRoleApprovalDate', now) - if group.fedoraGroupNeedsSponsor.lower() == 'true': - self.__server.modify(base, 'fedoraRoleSponsor', sponsor) - else: - self.__server.modify(base, 'fedoraRoleSponsor', 'None') - self.__server.modify(base, 'fedoraRoleStatus', 'approved') - - def generatePassword(self,password=None,length=14,salt=''): - ''' Generate Password ''' - secret = {} # contains both hash and password - - if not password: - rand = Random() - password = '' - # Exclude 0,O and l,1 - righthand = '23456qwertasdfgzxcvbQWERTASDFGZXCVB' - lefthand = '789yuiophjknmYUIPHJKLNM' - for i in range(length): - if i%2: - password = password + rand.choice(lefthand) - else: - password = password + rand.choice(righthand) - - ctx = sha.new(password) - ctx.update(salt) - secret['hash'] = "{SSHA}%s" % b64encode(ctx.digest() + salt) - secret['pass'] = password - - return secret - - -class UserAccount: - def __init__(self): - self.realName = '' - self.userName = '' - self.primaryEmail = '' - self.groups = [] diff --git a/fas/fas/group.py b/fas/fas/group.py index eb0b32d..8fc685b 100644 --- a/fas/fas/group.py +++ b/fas/fas/group.py @@ -8,8 +8,6 @@ from fas.auth import * from fas.user import KnownUser -from textwrap import dedent - import re class KnownGroup(validators.FancyValidator): @@ -152,7 +150,7 @@ class Group(controllers.Controller): @expose(template="fas.templates.group.new") def create(self, name, display_name, owner, group_type, needs_sponsor=0, user_can_remove=1, prerequisite='', joinmsg=''): '''Create a group''' - + groupname = name person = People.by_username(turbogears.identity.current.user_name) person_owner = People.by_username(owner) @@ -247,14 +245,16 @@ class Group(controllers.Controller): username = turbogears.identity.current.user_name person = People.by_username(username) - re_search = re.sub(r'\*', r'%', search).lower() - groups = Groups.query.filter(Groups.name.like(re_search)).order_by('name') - groups = filter(lambda group: canViewGroup(person, group), groups) - if len(groups) <= 0: - turbogears.flash(_("No Groups found matching '%s'") % search) memberships = {} - for group in groups: - memberships[group.id] = group.approved_roles + groups = [] + re_search = re.sub(r'\*', r'%', search).lower() + results = Groups.query.filter(Groups.name.like(re_search)).order_by('name').all() + for group in results: + if canViewGroup(person, group): + groups.append(group) + memberships[group.name] = group.approved_roles + if not len(groups): + turbogears.flash(_("No Groups found matching '%s'") % search) return dict(groups=groups, search=search, memberships=memberships) @identity.require(turbogears.identity.not_anonymous()) @@ -284,18 +284,19 @@ class Group(controllers.Controller): {'user': target.username, 'group': group.name}) else: import turbomail - + + # TODO: How do we handle gettext calls for these kinds of emails? # TODO: CC to right place, put a bit more thought into how to most elegantly do this message = turbomail.Message(config.get('accounts_mail'), '%s-sponsors@fedoraproject.org' % group.name, \ "Fedora '%(group)s' sponsor needed for %(user)s" % {'user': target.username, 'group': group.name}) url = config.get('base_url_filter.base_url') + turbogears.url('/group/edit/%s' % groupname) - message.plain = dedent(''' - Fedora user %(user)s, aka %(name)s <%(email)s> has requested - membership for %(applicant)s (%(applicant_name)s) in the %(group)s group and needs a sponsor. - - Please go to %(url)s to take action. - ''' % {'user': person.username, 'name': person.human_name, 'applicant': target.username, 'applicant_name': target.human_name, 'email': person.emails['primary'].email, 'url': url, 'group': group.name} ) + message.plain = _(''' +Fedora user %(user)s, aka %(name)s <%(email)s> has requested +membership for %(applicant)s (%(applicant_name)s) in the %(group)s group and needs a sponsor. + +Please go to %(url)s to take action. +''') % {'user': person.username, 'name': person.human_name, 'applicant': target.username, 'applicant_name': target.human_name, 'email': person.emails['primary'].email, 'url': url, 'group': group.name} turbomail.enqueue(message) turbogears.flash(_('%(user)s has applied to %(group)s!') % \ {'user': target.username, 'group': group.name}) @@ -326,13 +327,13 @@ class Group(controllers.Controller): else: import turbomail message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'].email, "Your Fedora '%s' membership has been sponsored" % group.name) - message.plain = dedent(''' - %(name)s <%(email)s> has sponsored you for membership in the %(group)s - group of the Fedora account system. If applicable, this change should - propagate into the e-mail aliases and CVS repository within an hour. + message.plain = _(''' +%(name)s <%(email)s> has sponsored you for membership in the %(group)s +group of the Fedora account system. If applicable, this change should +propagate into the e-mail aliases and CVS repository within an hour. - %(joinmsg)s - ''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'joinmsg': group.joinmsg} +%(joinmsg)s +''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'joinmsg': group.joinmsg} turbomail.enqueue(message) turbogears.flash(_("'%s' has been sponsored!") % person.human_name) turbogears.redirect('/group/view/%s' % group.name) @@ -364,12 +365,12 @@ class Group(controllers.Controller): else: import turbomail message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'].email, "Your Fedora '%s' membership has been removed" % group.name) - message.plain = dedent(''' - %(name)s <%(email)s> has removed you from the '%(group)s' - group of the Fedora Accounts System This change is effective - immediately for new operations, and should propagate into the e-mail - aliases within an hour. - ''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email} + message.plain = _(''' +%(name)s <%(email)s> has removed you from the '%(group)s' +group of the Fedora Accounts System This change is effective +immediately for new operations, and should propagate into the e-mail +aliases within an hour. +''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email} turbomail.enqueue(message) turbogears.flash(_('%(name)s has been removed from %(group)s!') % \ {'name': target.username, 'group': group.name}) @@ -406,12 +407,12 @@ class Group(controllers.Controller): # Should we make person.upgrade return this? role = PersonRoles.query.filter_by(group=group, member=target).one() status = role.role_type - message.plain = dedent(''' - %(name)s <%(email)s> has upgraded you to %(status)s status in the - '%(group)s' group of the Fedora Accounts System This change is - effective immediately for new operations, and should propagate - into the e-mail aliases within an hour. - ''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'status': status} + message.plain = _(''' +%(name)s <%(email)s> has upgraded you to %(status)s status in the +'%(group)s' group of the Fedora Accounts System This change is +effective immediately for new operations, and should propagate +into the e-mail aliases within an hour. +''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'status': status} turbomail.enqueue(message) turbogears.flash(_('%s has been upgraded!') % target.username) turbogears.redirect('/group/view/%s' % group.name) @@ -443,12 +444,12 @@ class Group(controllers.Controller): message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'].email, "Your Fedora '%s' membership has been downgraded" % group.name) role = PersonRoles.query.filter_by(group=group, member=target).one() status = role.role_type - message.plain = dedent(''' - %(name)s <%(email)s> has downgraded you to %(status)s status in the - '%(group)s' group of the Fedora Accounts System This change is - effective immediately for new operations, and should propagate - into the e-mail aliases within an hour. - ''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'status': status} + message.plain = _(''' +%(name)s <%(email)s> has downgraded you to %(status)s status in the +'%(group)s' group of the Fedora Accounts System This change is +effective immediately for new operations, and should propagate +into the e-mail aliases within an hour. +''') % {'group': group.name, 'name': person.human_name, 'email': person.emails['primary'].email, 'status': status} turbomail.enqueue(message) turbogears.flash(_('%s has been downgraded!') % target.username) turbogears.redirect('/group/view/%s' % group.name) @@ -493,22 +494,22 @@ class Group(controllers.Controller): if isApproved(person, group): message = turbomail.Message(person.emails['primary'].email, target, _('Come join The Fedora Project!')) - message.plain = _(dedent(''' - %(name)s <%(email)s> has invited you to join the Fedora - Project! We are a community of users and developers who produce a - complete operating system from entirely free and open source software - (FOSS). %(name)s thinks that you have knowledge and skills - that make you a great fit for the Fedora community, and that you might - be interested in contributing. + message.plain = _(''' +%(name)s <%(email)s> has invited you to join the Fedora +Project! We are a community of users and developers who produce a +complete operating system from entirely free and open source software +(FOSS). %(name)s thinks that you have knowledge and skills +that make you a great fit for the Fedora community, and that you might +be interested in contributing. - How could you team up with the Fedora community to use and develop your - skills? Check out http://fedoraproject.org/join-fedora for some ideas. - Our community is more than just software developers -- we also have a - place for you whether you're an artist, a web site builder, a writer, or - a people person. You'll grow and learn as you work on a team with other - very smart and talented people. +How could you team up with the Fedora community to use and develop your +skills? Check out http://fedoraproject.org/join-fedora for some ideas. +Our community is more than just software developers -- we also have a +place for you whether you're an artist, a web site builder, a writer, or +a people person. You'll grow and learn as you work on a team with other +very smart and talented people. - Fedora and FOSS are changing the world -- come be a part of it!''')) % {'name': person.human_name, 'email': person.emails['primary'].email} +Fedora and FOSS are changing the world -- come be a part of it!''') % {'name': person.human_name, 'email': person.emails['primary'].email} turbomail.enqueue(message) turbogears.flash(_('Message sent to: %s') % target) turbogears.redirect('/group/view/%s' % group.name) diff --git a/fas/fas/help.py b/fas/fas/help.py index d01fdbe..23dd5d6 100644 --- a/fas/fas/help.py +++ b/fas/fas/help.py @@ -9,8 +9,13 @@ class Help(controllers.Controller): 'user_ircnick' : ['IRC Nick (Optional)', '

IRC Nick is used to identify yourself on irc.freenode.net. Please register your nick on irc.freenode.net first, then fill this in so people can find you online when they need to

'], 'user_primary_email' : ['Primary Email (Required)', '

This email address should be your prefered email contact and will be used to send various official emails to. This is also where your @fedoraproject.org email will get forwarded

'], 'user_human_name' : ['Full Name (Required)', '

Your Human Name or "real life" name

'], - 'user_gpg_keyid' : ['GPG Key', '

Only required for users signing the CLA. It is generally used to prove that a message or email came from you or to encrypt information so that only the recipients can read it. See http://fedoraproject.org/wiki/Infrastructure/AccountSystem/CLAHowTo for more information

'], - 'user_telephone' : ['Telephone', '

Only required for users signing the CLA. Sometimes during a time of emergency someone from the Fedora Project may need to contact you. For more information see our Privacy Policy

'], + 'user_gpg_keyid' : ['GPG Key', '

Only required for users signing the CLA. It is generally used to prove that a message or email came from you or to encrypt information so that only the recipients can read it. See the CLAHowTo for more information

'], + 'user_telephone' : ['Telephone', '

Only required for users signing the CLA. Sometimes during a time of emergency someone from the Fedora Project may need to contact you. For more information see our Privacy Policy

'], + 'user_postal_address': ['Postal Address', '

Only required for users signing the CLA. This should be a mailing address where you can be contacted. See our Privacy Policy about any concerns.

'], + 'user_timezone': ['Timezone (Optional)', '

Please specify the time zone you are in.

'], + 'user_comments': ['Comments (Optional)', '

Misc comments about yourself.

'], + 'user_account_status': ['Account Status', '

Shows account status, possible values include

  • Valid
  • Disabled
  • Expired

'], + 'user_cla' : ['CLA', '

In order to become a full Fedora contributor you must sign a Contributor License Agreement. This license is a legal agreement between you and Red Hat. Full status allows people to contribute content and code and is recommended for anyone interested in getting involved in the Fedora Project. To find out more, see the CLAHowTo.

'], } def __init__(self): diff --git a/fas/fas/model.py b/fas/fas/model.py index 3a7e6db..bd02b6b 100644 --- a/fas/fas/model.py +++ b/fas/fas/model.py @@ -22,6 +22,7 @@ Model for the Fedora Account System ''' from datetime import datetime +import pytz from turbogears.database import metadata, mapper, get_engine # import some basic SQLAlchemy classes for declaring the data model # (see http://www.sqlalchemy.org/docs/04/ormtutorial.html) @@ -80,7 +81,7 @@ UnApprovedRolesSelect = PersonRolesTable.select(and_( visits_table = Table('visit', metadata, Column('visit_key', String(40), primary_key=True), - Column('created', DateTime, nullable=False, default=datetime.now), + Column('created', DateTime, nullable=False, default=datetime.now(pytz.utc)), Column('expiry', DateTime) ) @@ -173,7 +174,7 @@ class People(SABase): role = PersonRoles.query.filter_by(member=cls, group=group).one() role.role_status = 'approved' role.sponsor_id = requester.id - role.approval = datetime.now() + role.approval = datetime.now(pytz.utc) def remove(cls, group, requester): role = PersonRoles.query.filter_by(member=cls, group=group).one() diff --git a/fas/fas/openid_fas.py b/fas/fas/openid_fas.py index 2b5e43e..e3d6635 100644 --- a/fas/fas/openid_fas.py +++ b/fas/fas/openid_fas.py @@ -11,7 +11,10 @@ from openid.store.filestore import FileOpenIDStore from fas.auth import * -from fas.user import knownUser, userNameExists +from fas.user import KnownUser + +class UserID(validators.Schema): + targetname = KnownUser class OpenID(controllers.Controller): @@ -28,8 +31,8 @@ class OpenID(controllers.Controller): @expose(template="fas.templates.openid.about") def about(self): '''Display an explanatory message about the OpenID service''' - userName = turbogears.identity.current.user_name - return dict(userName=userName) + username = turbogears.identity.current.user_name + return dict(username=username) @expose(template="genshi-text:fas.templates.openid.auth", format="text", content_type='text/plain; charset=utf-8') def server(self, **query): @@ -58,10 +61,10 @@ class OpenID(controllers.Controller): else: openid_response = None if openid_request.mode in BROWSER_REQUEST_MODES: - userName = turbogears.identity.current.user_name; + username = turbogears.identity.current.user_name; url = None - if userName is not None: - url = config.get('base_url') + turbogears.url('/openid/id/%s' % userName) + if username is not None: + url = config.get('base_url') + turbogears.url('/openid/id/%s' % username) if openid_request.identity == url: if openid_request.trust_root in session['openid_trusted']: openid_response = openid_request.answer(True) @@ -95,16 +98,15 @@ class OpenID(controllers.Controller): @expose() def login(self): '''This exists only to make the user login and then redirect to /openid/server''' - userName = turbogears.identity.current.user_name; turbogears.redirect('/openid/server') return dict() @expose(template="fas.templates.openid.id") - @validate(validators=userNameExists()) - def id(self, userName): + @validate(validators=UserID()) + def id(self, username): '''The "real" OpenID URL''' - user = Person.byUserName(userName) + person = Person.by_username(username) server = config.get('base_url') + turbogears.url('/openid/server') - return dict(user=user, server=server) + return dict(person=person, server=server) diff --git a/fas/fas/safasprovider.py b/fas/fas/safasprovider.py index c425096..ac0220e 100644 --- a/fas/fas/safasprovider.py +++ b/fas/fas/safasprovider.py @@ -126,10 +126,6 @@ class SaFasIdentityProvider(SqlAlchemyIdentityProvider): log.info(_("Loading: %(visitmod)s") % \ {'visitmod': visit_identity_class_path}) visit_identity_class = load_class(visit_identity_class_path) - # Default encryption algorithm is to use plain text passwords - algorithm = config.get("identity.saprovider.encryption_algorithm", None) - self.encrypt_password = lambda pw: \ - identity._encrypt_password(algorithm, pw) def create_provider_model(self): ''' @@ -190,7 +186,6 @@ class SaFasIdentityProvider(SqlAlchemyIdentityProvider): ''' return user.password == crypt.crypt(password, user.password) - return user.password == self.encrypt_password(password) def load_identity(self, visit_key): '''Lookup the principal represented by visit_key. diff --git a/fas/fas/static/css/style.css b/fas/fas/static/css/style.css index fa0f658..e861567 100644 --- a/fas/fas/static/css/style.css +++ b/fas/fas/static/css/style.css @@ -189,6 +189,21 @@ a background: #082C59; } +#language +{ + padding: 1ex; +} + +#language label +{ + color: #FFFFFF; +} + +#language input +{ + width: 4ex; +} + #content { margin-left: 22ex; diff --git a/fas/fas/templates/group/view.html b/fas/fas/templates/group/view.html index 85520f2..318eaa8 100644 --- a/fas/fas/templates/group/view.html +++ b/fas/fas/templates/group/view.html @@ -10,7 +10,9 @@

${group.display_name} (${group.name})

@@ -70,12 +72,8 @@ ${role.member.username} ${role.member.username} ${_('None')} - - ${role.creation} - ${role.approval} + ${role.creation.astimezone(timezone).strftime('%Y-%m-%d %H:%M:%S %Z')} + ${role.approval.astimezone(timezone).strftime('%Y-%m-%d %H:%M:%S %Z')} ${role.role_status} ${role.role_type} diff --git a/fas/fas/templates/master.html b/fas/fas/templates/master.html index 1aec2f0..421a82d 100644 --- a/fas/fas/templates/master.html +++ b/fas/fas/templates/master.html @@ -9,10 +9,10 @@ - - - - + + + + @@ -64,6 +64,13 @@
  • ${_('Apply For a new Group')}
  • ${_('News')}
  • +
    +
    + + + +
    +
    diff --git a/fas/fas/templates/openid/about.html b/fas/fas/templates/openid/about.html index 4ac41f7..2cbe67f 100644 --- a/fas/fas/templates/openid/about.html +++ b/fas/fas/templates/openid/about.html @@ -7,9 +7,9 @@ ${_('Fedora Accounts System')} -

    ${_{'Fedora Project OpenID Provider')}

    +

    ${_('Fedora Project OpenID Provider')}

    - ${Markup_('Description goes here, <a href="http://username.fedorapeople.org/">username.fedorapeople.org</a>'))} + ${Markup_('Description goes here, <a href="http://username.fedorapeople.org/">username.fedorapeople.org</a>')}

    diff --git a/fas/fas/templates/openid/id.html b/fas/fas/templates/openid/id.html index 6f585fc..01a5220 100644 --- a/fas/fas/templates/openid/id.html +++ b/fas/fas/templates/openid/id.html @@ -8,13 +8,13 @@ -

    ${_('User %s') % user.cn}

    +

    ${_('User %s') % person.username}

    ${_('Username:')}
    -
    ${user.cn}
    +
    ${person.username}
    ${_('Name:')}
    -
    ${user.givenName}
    +
    ${person.human_name}
    diff --git a/fas/fas/templates/openid/trusted.html b/fas/fas/templates/openid/trusted.html index 36d65cf..0affc19 100644 --- a/fas/fas/templates/openid/trusted.html +++ b/fas/fas/templates/openid/trusted.html @@ -13,7 +13,7 @@
    - +
    diff --git a/fas/fas/templates/user/edit.html b/fas/fas/templates/user/edit.html index f5ffb80..71bebdd 100644 --- a/fas/fas/templates/user/edit.html +++ b/fas/fas/templates/user/edit.html @@ -41,7 +41,8 @@
    - + +
    @@ -51,10 +52,22 @@ ?> + +
    +
    + + + +
    - + +
    diff --git a/fas/fas/templates/user/view.html b/fas/fas/templates/user/view.html index 697ab04..ced3f25 100644 --- a/fas/fas/templates/user/view.html +++ b/fas/fas/templates/user/view.html @@ -23,12 +23,14 @@
    ${_('Postal Address:')}
    ${person.postal_address} 
    ${_('Comments:')}
    ${person.comments} 
    ${_('Password:')}
    ${_('Valid')} (change)
    -
    ${_('Account Status:')}
    ${_('Valid')}
    +
    ${_('Account Status:')}
    ${_('Valid')} +
    ${_('CLA:')}
    ${_('Signed CLA')} ${_('Click-through CLA')}(${_('GPG Sign it!')}) - ${_('Not Done')} (${_('Sign it!')})
    + ${_('Not Done')} (${_('Sign it!')}) +

    ${_('Your Roles')}

    diff --git a/fas/fas/test.py b/fas/fas/test.py deleted file mode 100644 index 46bbdaa..0000000 --- a/fas/fas/test.py +++ /dev/null @@ -1,13 +0,0 @@ -from fasLDAP import add, Groups, delete - -attributes = { 'cn' : 'infrastructureTest', - 'fedoraRoleApprovaldate' : 'None', - 'fedoraRoleCreationDate' : 'None', - 'fedoraRoleDomain' : 'None', - 'fedoraRoleSponsor' : 'None', - 'fedoraRoleStatus' : 'unapproved', - 'fedoraRoleType' : 'user', - 'objectClass' : ('fedoraRole')} -print "add('cn=infrastructureTest,ou=Roles,cn=mmcgrath,ou=People,dc=fedoraproject,dc=org', attributes)" -print "delete('cn=infrastructureTest,ou=Roles,cn=mmcgrath,ou=People,dc=fedoraproject,dc=org')" - diff --git a/fas/fas/user.py b/fas/fas/user.py index 91fa937..fe023ee 100644 --- a/fas/fas/user.py +++ b/fas/fas/user.py @@ -17,8 +17,6 @@ from fas.model import Log from fas.auth import * -from textwrap import dedent - from random import Random import sha from base64 import b64encode @@ -53,9 +51,9 @@ class UnknownUser(validators.FancyValidator): return except: raise validators.Invalid(_("Error: Could not create - '%s'") % value, value, state) - + raise validators.Invalid(_("'%s' already exists.") % value, value, state) - + class ValidUsername(validators.FancyValidator): '''Make sure that a username isn't blacklisted''' def _to_python(self, value, state): @@ -75,7 +73,7 @@ class UserSave(validators.Schema): #fedoraPersonBugzillaMail = validators.Email(strip=True, max=128) #fedoraPersonKeyId- Save this one for later :) postal_address = validators.String(max=512) - + class UserCreate(validators.Schema): username = validators.All( UnknownUser, @@ -103,7 +101,7 @@ class UserView(validators.Schema): class UserEdit(validators.Schema): targetname = KnownUser - + def generate_password(password=None, length=14): ''' Generate Password ''' secret = {} # contains both hash and password @@ -114,7 +112,7 @@ def generate_password(password=None, length=14): password = '' for i in xrange(length): password += random.choice(chars) - + secret['hash'] = crypt.crypt(password, "$1$%s" % generate_salt(8)) secret['pass'] = password @@ -206,7 +204,7 @@ class User(controllers.Controller): @validate(validators=UserSave()) @error_handler(error) @expose(template='fas.templates.user.edit') - def save(self, targetname, human_name, telephone, postal_address, email, ircnick=None, gpg_keyid=None, comments='', timezone='UTC'): + def save(self, targetname, human_name, telephone, postal_address, email, ircnick=None, gpg_keyid=None, comments='', locale='en', timezone='UTC'): username = turbogears.identity.current.user_name target = targetname person = People.by_username(username) @@ -225,6 +223,7 @@ class User(controllers.Controller): target.telephone = telephone target.postal_address = postal_address target.comments = comments + target.locale = locale target.timezone = timezone except TypeError: turbogears.flash(_('Your account details could not be saved: %s' % e)) @@ -245,7 +244,7 @@ class User(controllers.Controller): if people.count() < 0: turbogears.flash(_("No users found matching '%s'") % search) return dict(people=people, search=search) - + @expose(template='fas.templates.user.new') def new(self): if turbogears.identity.not_anonymous(): @@ -257,7 +256,7 @@ class User(controllers.Controller): @error_handler(error) @expose(template='fas.templates.new') def create(self, username, human_name, email, telephone, postal_address): - # TODO: Ensure that e-mails are unique- this should probably be done in the LDAP schema. + # TODO: Ensure that e-mails are unique? # Also, perhaps implement a timeout- delete account # if the e-mail is not verified (i.e. the person changes # their password) withing X days. @@ -271,45 +270,44 @@ class User(controllers.Controller): person.emails['primary'] = PersonEmails(email=email, purpose='primary') newpass = generate_password() message = turbomail.Message(config.get('accounts_mail'), person.emails['primary'].email, _('Welcome to the Fedora Project!')) - message.plain = _(dedent(''' - You have created a new Fedora account! - Your new password is: %s + message.plain = _(''' +You have created a new Fedora account! +Your new password is: %s - Please go to https://admin.fedoraproject.org/fas/ to change it. +Please go to https://admin.fedoraproject.org/fas/ to change it. - Welcome to the Fedora Project. Now that you've signed up for an - account you're probably desperate to start contributing, and with that - in mind we hope this e-mail might guide you in the right direction to - make this process as easy as possible. - - Fedora is an exciting project with lots going on, and you can - contribute in a huge number of ways, using all sorts of different - skill sets. To find out about the different ways you can contribute to - Fedora, you can visit our join page which provides more information - about all the different roles we have available. - - http://fedoraproject.org/en/join-fedora - - If you already know how you want to contribute to Fedora, and have - found the group already working in the area you're interested in, then - there are a few more steps for you to get going. - - Foremost amongst these is to sign up for the team or project's mailing - list that you're interested in - and if you're interested in more than - one group's work, feel free to sign up for as many mailing lists as - you like! This is because mailing lists are where the majority of work - gets organised and tasks assigned, so to stay in the loop be sure to - keep up with the messages. - - Once this is done, it's probably wise to send a short introduction to - the list letting them know what experience you have and how you'd like - to help. From here, existing members of the team will help you to find - your feet as a Fedora contributor. - - And finally, from all of us here at the Fedora Project, we're looking - forward to working with you! +Welcome to the Fedora Project. Now that you've signed up for an +account you're probably desperate to start contributing, and with that +in mind we hope this e-mail might guide you in the right direction to +make this process as easy as possible. - ''') % newpass['pass']) +Fedora is an exciting project with lots going on, and you can +contribute in a huge number of ways, using all sorts of different +skill sets. To find out about the different ways you can contribute to +Fedora, you can visit our join page which provides more information +about all the different roles we have available. + +http://fedoraproject.org/en/join-fedora + +If you already know how you want to contribute to Fedora, and have +found the group already working in the area you're interested in, then +there are a few more steps for you to get going. + +Foremost amongst these is to sign up for the team or project's mailing +list that you're interested in - and if you're interested in more than +one group's work, feel free to sign up for as many mailing lists as +you like! This is because mailing lists are where the majority of work +gets organised and tasks assigned, so to stay in the loop be sure to +keep up with the messages. + +Once this is done, it's probably wise to send a short introduction to +the list letting them know what experience you have and how you'd like +to help. From here, existing members of the team will help you to find +your feet as a Fedora contributor. + +And finally, from all of us here at the Fedora Project, we're looking +forward to working with you! +''') % newpass['pass'] turbomail.enqueue(message) person.password = newpass['pass'] turbogears.flash(_('Your password has been emailed to you. Please log in with it and change your password')) @@ -352,7 +350,7 @@ class User(controllers.Controller): turbogears.flash(_('You are already logged in!')) turbogears.redirect('/user/view/%s' % turbogears.identity.current.user_name) return dict() - + @expose(template="fas.templates.user.resetpass") def sendpass(self, username, email, encrypted=False): import turbomail @@ -368,13 +366,17 @@ class User(controllers.Controller): return dict() newpass = generate_password() message = turbomail.Message(config.get('accounts_mail'), email, _('Fedora Project Password Reset')) - mail = _(dedent(''' - You have requested a password reset! - Your new password is: %s - - Please go to https://admin.fedoraproject.org/fas/ to change it. - ''')) % newpass['pass'] + mail = _(''' +You have requested a password reset! +Your new password is: %s + +Please go to https://admin.fedoraproject.org/fas/ to change it. +''') % newpass['pass'] if encrypted: + # TODO: Move this out to a single function (same as + # CLA one), think of how to make sure this doesn't get + # full of random keys (keep a clean Fedora keyring) + # TODO: MIME stuff? try: subprocess.check_call([config.get('gpgexec'), '--keyserver', config.get('gpg_keyserver'), '--recv-keys', person.gpg_keyid]) except subprocess.CalledProcessError: diff --git a/fas/fas2.sql b/fas/fas2.sql index 7d598f9..0674f57 100644 --- a/fas/fas2.sql +++ b/fas/fas2.sql @@ -51,13 +51,13 @@ CREATE TABLE people ( affiliation TEXT, certificate_serial INTEGER DEFAULT 1, -- tg_user::created - creation TIMESTAMP DEFAULT NOW(), + creation TIMESTAMP WITH TIME ZONE DEFAULT NOW(), --approval_status TEXT DEFAULT 'unapproved', internal_comments TEXT, ircnick TEXT, - last_seen TIMESTAMP DEFAULT NOW(), + last_seen TIMESTAMP WITH TIME ZONE DEFAULT NOW(), status TEXT, - status_change TIMESTAMP DEFAULT NOW(), + status_change TIMESTAMP WITH TIME ZONE DEFAULT NOW(), locale TEXT not null DEFAULT 'C', timezone TEXT null DEFAULT 'UTC', latitude numeric, @@ -123,7 +123,7 @@ CREATE TABLE groups ( prerequisite_id INTEGER REFERENCES groups(id), joinmsg TEXT NULL DEFAULT '', -- tg_group::created - creation TIMESTAMP DEFAULT NOW(), + creation TIMESTAMP WITH TIME ZONE DEFAULT NOW(), check (group_type in ('bugzilla','cvs', 'bzr', 'git', 'hg', 'mtn', 'svn', 'shell', 'torrent', 'tracker', 'tracking', 'user')) ); @@ -159,8 +159,8 @@ CREATE TABLE person_roles ( role_status text DEFAULT 'unapproved', internal_comments text, sponsor_id INTEGER REFERENCES people(id), - creation TIMESTAMP DEFAULT NOW(), - approval TIMESTAMP DEFAULT NULL, + creation TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + approval TIMESTAMP WITH TIME ZONE DEFAULT NULL, primary key (person_id, group_id), check (role_status in ('approved', 'unapproved')), check (role_type in ('user', 'administrator', 'sponsor')) @@ -180,8 +180,8 @@ CREATE TABLE group_roles ( role_status text DEFAULT 'unapproved', internal_comments text, sponsor_id INTEGER REFERENCES people(id), - creation TIMESTAMP DEFAULT NOW(), - approval TIMESTAMP DEFAULT NOW(), + creation TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + approval TIMESTAMP WITH TIME ZONE DEFAULT NOW(), primary key (member_id, group_id), check (role_status in ('approved', 'unapproved')), check (role_type in ('user', 'administrator', 'sponsor')) @@ -209,7 +209,7 @@ create table bugzilla_queue ( create table log ( id serial primary key, author_id INTEGER references people(id) not null, - changetime TIMESTAMP default NOW(), + changetime TIMESTAMP WITH TIME ZONE default NOW(), description TEXT ); @@ -233,7 +233,7 @@ create table requests ( hostname TEXT not null, ip TEXT not null, action TEXT not null default 'trust_all', - last_request TIMESTAMP default now() not null, + last_request TIMESTAMP WITH TIME ZONE default now() not null, approved boolean, unique (person_id, hostname, ip, action) ); @@ -249,8 +249,8 @@ cluster requests_last_request_idx on requests; -- create table visit ( visit_key CHAR(40) primary key, - created TIMESTAMP not null default now(), - expiry TIMESTAMP + created TIMESTAMP WITH TIME ZONE not null default now(), + expiry TIMESTAMP WITH TIME ZONE ); create index visit_expiry_idx on visit(expiry); diff --git a/fas/ldap/52fc-fedora-person.ldif b/fas/ldap/52fc-fedora-person.ldif deleted file mode 100644 index bc552a7..0000000 --- a/fas/ldap/52fc-fedora-person.ldif +++ /dev/null @@ -1,22 +0,0 @@ -#this is the fedoraPerson shema file for use with the Account system -#it is based on the inetOrgPerson shema, but has some spicific -#attribues added onto it for use by the Account system -#for now this is the contents -#sshkey bugzillaemail ircNick approvalStatus creationDate -dn: cn=schema -attributeTypes: ( 2.5.444.8 NAME 'fedoraPersonSshKey' DESC 'ssh key for this member' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE) -attributeTypes: ( 2.5.444.9 NAME 'fedoraPersonBugzillaMail' DESC 'members preferred bugzilla email address' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) -attributeTypes: ( 2.5.444.16 NAME 'fedoraPersonIrcNick' DESC 'irc nick of the user on freenode' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{100} ) -attributetypes: ( 2.5.444.17 NAME 'fedoraPersonCreationDate' DESC 'date entry was created' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) -attributeTypes: ( 2.5.444.18 NAME 'fedoraPersonApprovalStatus' DESC 'users approval status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.19 NAME 'fedoraPersonKeyId' DESC 'users GPG key ID' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.22 NAME 'fedoraPersonCertSerial' DESC 'users SSL cert serial' EQUALITY IntegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) -attributeTypes: ( 2.5.444.23 NAME 'fedoraPersonTimeZone' DESC 'time zone of the user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.24 NAME 'fedoraPersonEmailConfirm' DESC 'user email confirmation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.25 NAME 'fedoraPersonEmailCode' DESC 'user email code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - -# fedoraPerson -# The fedoraPerson represents people who are a member of the fedora project -# in some way. It is a structural class and inherits -# from the inetOrgPerson class -objectClasses: ( 2.5.555.1 NAME 'fedoraPerson' DESC 'A member of the fedoraproject group' SUP inetOrgPerson STRUCTURAL MUST ( fedoraPersonSshKey $ mail $ fedoraPersonCreationDate $ fedoraPersonTimeZone ) MAY (fedoraPersonIrcNick $ fedoraPersonApprovalStatus $ fedoraPersonBugzillaMail $ fedoraPersonKeyId $ fedoraPersonCertSerial ) ) diff --git a/fas/ldap/52fc-fedora-role.ldif b/fas/ldap/52fc-fedora-role.ldif deleted file mode 100644 index 43d34e1..0000000 --- a/fas/ldap/52fc-fedora-role.ldif +++ /dev/null @@ -1,28 +0,0 @@ -#this is the fedoraMembership shema file for use with the Account system -#check out http://www.openldap.org/doc/admin23/schema.html#Extending%20Schema -#for more information -#for now this is the contents -#role_type -#role_domain -#role_status -#internal_comments -#sponsor (points to the sponsor's DN) -#creation (date) -#approval (date) -#don't have a name use cn instead -#attributeType ( 2.5.444.1 NAME 'name' -# DESC 'group name' -# EQUALITY caseIgnoreMatch -# SUBSTR caseIgnoreSubstringsMatch -# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -dn: cn=schema -attributeTypes: ( 2.5.444.2 NAME 'fedoraRoleType' DESC 'the type of role' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{25} ) -attributeTypes: ( 2.5.444.15 NAME 'fedoraRoleDomain' DESC 'the domain of this role' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{15} ) -attributeTypes: ( 2.5.444.3 NAME 'fedoraRoleStatus' DESC 'the approval status of this role' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{15} ) -#attributeTypes: ( 2.5.444.4 NAME 'internalComments' -# DESC 'group membership comments' -# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1000} ) -attributeTypes: ( 2.5.444.5 NAME 'fedoraRoleSponsor' DESC 'role sponsor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{25} ) -attributeTypes: ( 2.5.444.6 NAME 'fedoraRoleCreationDate' DESC 'membership creation date' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) -attributeTypes: ( 2.5.444.7 NAME 'fedoraRoleApprovalDate' DESC 'membership approval date' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) -objectClasses: ( 2.5.555.2 NAME 'fedoraRole' DESC 'An object describing a persons roles with the fedora project' STRUCTURAL MUST ( cn ) MAY ( fedoraRoleApprovalDate $ fedoraRoleCreationDate $ fedoraRoleType $ fedoraRoleStatus $ fedoraRoleDomain $ fedoraRoleSponsor ) ) diff --git a/fas/ldap/53fc-fedora-group.ldif b/fas/ldap/53fc-fedora-group.ldif deleted file mode 100644 index 326d02b..0000000 --- a/fas/ldap/53fc-fedora-group.ldif +++ /dev/null @@ -1,17 +0,0 @@ -#this is the fedora group schema file for use with the accounts system2 -#it currently contains the following: -#owner (the owner's DN) -#group_type -#needs_sponsor -#user_can_remove (will be handled by ACLs, but we need to clue the interface about it) -#prerequisite_id (no idea what that is, so maybe not) -- not included yet -#joinmsg -dn: cn=schema -attributeTypes: ( 2.5.444.10 NAME 'fedoraGroupOwner' DESC 'group owner' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.11 NAME 'fedoraGroupType' DESC 'the type of group' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -attributeTypes: ( 2.5.444.12 NAME 'fedoraGroupNeedsSponsor' DESC 'boolean indicating whether or not the group needs a sponsor' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) -attributeTypes: ( 2.5.444.13 NAME 'fedoraGroupUserCanRemove' DESC 'boolean indicating whether or not the user can remove the group' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) -attributeTypes: ( 2.5.444.14 NAME 'fedoraGroupJoinMsg' DESC 'message received upon joining the group' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1000} ) -attributeTypes: ( 2.5.444.21 NAME 'fedoraGroupDesc' DESC 'group description' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{100} ) -attributeTypes: ( 2.5.444.20 NAME 'fedoraGroupRequires' DESC 'Requisites of this Group' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) -objectClasses: ( 2.5.555.3 NAME 'fedoraGroup' DESC 'A object describing a group entry' STRUCTURAL MUST ( cn $ fedoraGroupDesc $ fedoraGroupOwner ) MAY ( fedoraGroupJoinMsg $ fedoraGroupUsercanRemove $ fedoraGroupType $ fedoraGroupNeedsSponsor $ fedoraGroupRequires ) ) diff --git a/fas/ldap/PgToLDAP.py b/fas/ldap/PgToLDAP.py deleted file mode 100755 index 41a91f2..0000000 --- a/fas/ldap/PgToLDAP.py +++ /dev/null @@ -1,434 +0,0 @@ -#!/usr/bin/env python - -""" - PgToLDAP 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. - - PgToLDAP 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 PgToLDAP; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Id: $Id: PgToLDAP.py,v 1.5 2006/12/07 01:40:06 lyz Exp $ -""" - -import sys, time -import ldap, ldif, pgdb, ldap.modlist -from optparse import OptionParser -import sha -import base64 -from random import randrange - - -version = "0.112" - -def encode_SSHA_password ( password ): - p_ssha = sha.new( password ) - salt = '' - - for n in range(7): - salt += chr(randrange(256)) - - - p_ssha.update( salt ) - p_ssha_base64 = base64.encodestring(p_ssha.digest() + salt + '' ) - return '%s%s' %( '{SSHA}', p_ssha_base64 ) - - - -def parseArgs(): - parser = OptionParser(version="%prog " + version) - parser.add_option ("-v", "--verbose", dest="verbose", action="store_true", default=False, - help="Verbose output") - - parser.add_option ("--pgUser", dest="pgUser", default="postgres", - help="PostgreSQL User [default: %default]", metavar="USER") - parser.add_option ("--pgPassword", dest="pgPassword", - help="PostgreSQL Password", metavar="PASSWORD") - parser.add_option ("--pgHost", dest="pgHost", default="localhost", - help="PostgreSQL Host [default: %default]", metavar="HOST") - parser.add_option ("--pgPort", dest="pgPort", default="5432", - help="PostgreSQL Port [default: %default]", metavar="PORT") - parser.add_option ("--pgDb", dest="pgDB", - help="PostgreSQL Database", metavar="DATABASE") - - parser.add_option ("-o", "--output", dest="outType", default="file", - help="Output Type [file|ldap] [default: %default]") - parser.add_option ("-f", "--file", dest="outFile", default="out.ldif", - help="Output file [default: %default]", metavar="FILE") - - parser.add_option ("--ldapUser", dest="ldapUser", default="cn=Directory Manager", - help="LDAP User [default: %default]", metavar="USER") - parser.add_option ("--ldapPassword", dest="ldapPassword", - help="LDAP Password", metavar="PASSWORD") - parser.add_option ("--ldapHost", dest="ldapHost", default="localhost", - help="LDAP Host [default: %default]", metavar="HOST") - parser.add_option ("--ldapPort", dest="ldapPort", default="389", - help="LDAP Port [default: %default]", metavar="PORT") - parser.add_option ("--ldapOU", dest="ldapBaseOU", default="dc=fedoraproject, dc=org", - help="LDAP Base OU [default: %default]", ) - (options, args) = parser.parse_args() - if options.outType != "file" and options.outType != "ldap": - parser.error("Output type must be file or ldap") - return (options, args) - -def connPostgres(user, password, db, host, port): - """Tries to connect to the Postgres db server. - Will exit with exit code 1 it it fails.""" - global verbose - if verbose: - print "Connecting to postgres://%s@%s:%s" % (user, host, port) - try: - dbConn = pgdb.connect(user=user, - password=password, - database=db, - host='%s:%s' %(host, port)) - return dbConn - except: - print "Error connecting to Postgres server" - # TODO: Remove exit comment - sys.exit(1) - -def connLDAP(user, password, host, port): - """Tries to bind to the LDAP server. - Will exit with exit code 1 it it fails.""" - global verbose - if verbose: - print "Connecting to ldap://%s@%s:%s" % (user, host, port) - try: - ldapConn = ldap.open(host) - ldapConn.protocol_version = ldap.VERSION3 - ldapConn.simple_bind_s(user, password) - return ldapConn - except ldap.LDAPError, error_message: - print 'Error connecting to LDAP Server' - print error_message - sys.exit(1) - -def openLdifFile(filename): - """Tries to open the output file for writing. - Will exit with exit code 1 it it fails.""" - global verbose - if verbose: - print "Opening output file %s" % filename - try: - #ldifWriter = ldif.LDIFWriter(ldap.initialize('ldap://localhost:1390'),filename) - fileHandel = open (filename,'w') - - # | __init__(self, output_file, base64_attrs=None, cols=76, line_sep='\n') - # | output_file - # | file object for output - # | base64_attrs - # | list of attribute types to be base64-encoded in any case - # | cols - # | Specifies how many columns a line may have before it's - # | folded into many lines. - # | line_sep - # | String used as line separator - - - - ldifWriter = ldif.LDIFWriter(fileHandel,"None") - return ldifWriter - except ldap.LDAPError, error_message: - print "Error opening output file: %s" % (filename) - print error_message - sys.exit(1) - -def cleanLDAP(ldapConn, ldapBaseOU): - """Removes all existing entries under ou=People and ou=Groups for - the defined base OU. - Will exit with exit code 1 if an LDAP error is encountered.""" - global verbose - if verbose: - print "Deleting existing users from LDAP" - try: - timeout = 0 - result_id = ldapConn.search("ou=People, " + ldapBaseOU, - ldap.SCOPE_ONELEVEL, - "cn=*", - None) - while 1: - result_type, result_data = ldapConn.result(result_id, timeout) - if (result_data == []): - break - else: - if result_type == ldap.RES_SEARCH_ENTRY: - if verbose: - print "Deleting LDAP user: " + result_data[0][1]['cn'][0] - ldapConn.delete_s(result_data[0][0]) - except ldap.LDAPError, error_message: - print "Error deleting existing users from LDAP" - print error_message - sys.exit(1) - - if verbose: - print "Deleting existing groups from LDAP" - try: - timeout = 0 - result_id = ldapConn.search("ou=Groups, " + ldapBaseOU, - ldap.SCOPE_ONELEVEL, - "cn=*", - None) - while 1: - result_type, result_data = ldapConn.result(result_id, timeout) - if (result_data == []): - break - else: - if result_type == ldap.RES_SEARCH_ENTRY: - if verbose: - print "Deleting LDAP group: " + result_data[0][1]['cn'][0] - ldapConn.delete_s(result_data[0][0]) - except ldap.LDAPError, error_message: - print "Error deleting existing groups from LDAP" - print error_message - sys.exit(1) - -def main(): - global verbose - (options, cruft) = parseArgs() - verbose = options.verbose - - dbConn = connPostgres(options.pgUser, options.pgPassword, - options.pgDB, options.pgHost, options.pgPort) - - # Cleanup LDAP (if necessary) - if options.outType == "ldap": - ldapConn = connLDAP(options.ldapUser, options.ldapPassword, - options.ldapHost, options.ldapPort) - #cleanLDAP(ldapConn, options.ldapBaseOU) - else: - ldifWriter = openLdifFile(options.outFile) - - # Copy all users from db to ldap/ldif - # this will to queries and mappings - - try: - if verbose: - print "Selecting all users from Postgres Database" - userCursor = dbConn.cursor() - userCursor.execute ("SELECT * FROM person") - - #id, username, email 2, human_name 3, gpg_keyid 4, ssh_key 5, password 6, comments 7, postal_address 8, telephone 9, facsimile 10, affiliation 11, creation 12, approval_status 13, internal_comments 14, wiki_prefs 15, ircnick 16 - except: - print "Error selecting users from db" - raise - sys.exit(1) - while 1: - user = userCursor.fetchone() - if user == None: - break - - date = str(user[12]).split('.')[0] - timestamp = time.strftime('%s', time.strptime(date, "%Y-%m-%d %H:%M:%S")) - - # TODO: Create method createLdapUserEntry(user) - #(dn, entry) = createLdapUserEntry(user) - if options.outType == "ldif": - ldifWriter.unparse(dn, entry) - else: - - - print "Adding ldif info for " + user[3] + "." - - #userLdif = [["objectClass",["fedoraPerson","organizationalUnit"]] , [ "displayName",[ user[1] ] ] ] - userLdif = [["objectClass",["fedoraPerson"]] , [ "displayName",[ user[1] ] ] ] - userLdif.append(["mail",[str(user[2])]]) - userLdif.append(["sn",[str(user[1])]]) - userLdif.append(["fedoraPersonBugzillaMail",[str(user[2])]]) - userLdif.append(["cn",[str(user[1])]]) - userLdif.append(["givenName",[str(user[3])]]) - userLdif.append(["fedoraPersonKeyId",[str(user[4])]]) - userLdif.append(["fedoraPersonCertSerial",['-1']]) - userLdif.append(["fedoraPersonSshKey",[str(user[5])]]) - userLdif.append(["userPassword",[encode_SSHA_password(str(user[6]))]]) - userLdif.append(["postalAddress",[str(user[8])]]) - userLdif.append(["telephoneNumber",[str(user[9])]]) - userLdif.append(["fax",[str(user[10]) or "None"]]) - userLdif.append(["o",[str(user[11]) or "None" ]]) # affiliation is set to the o -- another stretch ?? - userLdif.append(["fedoraPersonCreationDate",[str(timestamp)]]) - userLdif.append(["fedoraPersonApprovalStatus",[str(user[13])]]) - userLdif.append(["description",[str(user[14])]]) #this one may be a streach -- original field was internal comments - userLdif.append(["fedoraPersonTimeZone",["UTC"]]) - userLdif.append(["fedoraPersonIrcNick",[str(user[16])]]) - #userLdif.append(["ou",["Roles"]]) Adding an OU instead - - print userLdif - #for userKey in userLdif.keys(): - #print "Key Name -> " + userKey - #print ":::Key Value::: " - #print userLdif[userKey] - #ldifWriter.unparse("dc=fedoraproject,dc=org cn=" + user[3] , { userKey : [str(userLdif[userKey])] } ) - - #print userLdif.keys() - #print userLdif.values() - ldifWriter.unparse("cn=" + str(user[1]) +",ou=People,dc=fedoraproject,dc=org" , userLdif ) - - roleOuLdif = [["objectClass",["organizationalUnit"]] , [ "ou",[ "Roles" ] ] ] - ldifWriter.unparse("ou=Roles,cn=" + str(user[1]) +",ou=People,dc=fedoraproject,dc=org" , roleOuLdif ) - - #ldifWriter.unparse("dc=fedoraproject,dc=org, cn=" + user[3] , [ ['ano',['domini']],['uances',['od']] ]) - - #time.sleep (2) - - - #ldapConn.add_s(dn, entry) - - userCursor.close() - - - - # Select all groups from the DB - - try: - if verbose: - print "Selecting all groups from Postgres Database" - groupCursor = dbConn.cursor() - groupCursor.execute ("SELECT * FROM project_group") - - - - except: - print "Error selecting groups from db" - raise - sys.exit(1) - while 1: - group = groupCursor.fetchone() - if group == None: - break - # TODO: Create method createLdapGroupEntry(group) - #(dn, entry) = createLdapGroupEntry(group) - if options.outType == "ldif": - ldifWriter.unparse(dn, entry) - else: - #ldapConn.add_s(dn, entry) - - print "Adding group info for %s." % group[7] - #id0, owner_id1, group_type2, needs_sponsor3, user_can_remove4, prerequisite_id5, joinmsg6, name7 - - uidLookupCursor = dbConn.cursor() - uidLookupCursor.execute ("SELECT username FROM person where id =" + str(group[1]) ) - owner = uidLookupCursor.fetchone() - if str(group[5]) != "None" : - uidLookupCursor.execute ("SELECT name FROM project_group where id =" + str(group[5]) ) - prereq = uidLookupCursor.fetchone() - print prereq - else: - prereq=["None"] - - print owner - - #id0, name1, owner_id2, group_type3, needs_sponsor4, user_can_remove5, prerequisite_id6, joinmsg7 - userLdif = [["objectClass",["fedoraGroup"]] ] - userLdif.append(["cn",[str(group[7])]]) - userLdif.append(["fedoraGroupOwner",owner]) # need to get a cn for this not just the id - #userLdif.append(["groupOwner",[str(group[2])]]) # need to get a cn for this not just the id - userLdif.append(["fedoraGroupType",[str(group[3]) or "None" ]]) - - #we're using the boolean type for these. This means they need to be converted to the TRUE and FALSE strings - - if str(group[3]) == "0" : - group[3]="FALSE" - else: - group[3]="TRUE" - - if str(group[4]) == "0" : - group[4]="FALSE" - else: - group[4]="TRUE" - - if group[5] == None: - group[5] = "" - - userLdif.append(["fedoraGroupNeedsSponsor",[str(group[3])]]) #need to convert to bool - userLdif.append(["fedoraGroupUserCanRemove",[str(group[4])]]) #need to convert to bool - userLdif.append(["fedoraGroupDesc",[str('Please fill out a Group Description')]]) #need to convert to bool - #userLdif.append(["groupPrerequisite",[str(group[5])]]) - userLdif.append(["fedoraGroupRequires",[str(group[5])]]) # <- Hope this is added properly - Ricky - #userLdif.append(["groupPrerequisite",prereq]) not currently in the schema - userLdif.append(["fedoraGroupJoinMsg",[str(group[6]) or "None" ]]) - ldifWriter.unparse("cn=" + str(group[7]) +",ou=FedoraGroups,dc=fedoraproject,dc=org" , userLdif ) - - - groupCursor.close() - - # Select all roles from the DB - - try: - if verbose: - print "Selecting all roles from Postgres Database" - roleCursor = dbConn.cursor() - roleCursor.execute ("SELECT * FROM role") - #person_id, project_group_id, role_type, role_domain, role_status, internal_comments, sponsor_id (Points to a person), creation (TIMESTAMP), approval (TIMESTAMP) - except: - print "Error selecting roles from db" - raise - sys.exit(1) - while 1: - role = roleCursor.fetchone() - if role == None: - break - date1 = str(role[7]).split('.')[0] - date2 = str(role[8]).split('.')[0] - try: - timestamp1 = time.strftime('%s', time.strptime(date1, "%Y-%m-%d %H:%M:%S")) - except: - timestamp1 = "None" - try: - timestamp2 = time.strftime('%s', time.strptime(date2, "%Y-%m-%d %H:%M:%S")) - except: - timestamp2 = "None" - # TODO: Create method createLdapRoleEntry(group) - #(dn, entry) = createLdapGroupRole(group) - if options.outType == "ldif": - ldifWriter.unparse(dn, entry) - else: - #ldapConn.add_s(dn, entry) - #person_id0, group_project_id1, role_type2, role_domain3, role_status4, internal_comments5, sponsor_id6, creation7, approval8 - - - uidRoleCursor = dbConn.cursor() - uidRoleCursor.execute ("SELECT username FROM person where id =" + str(role[0]) ) - username = uidRoleCursor.fetchone() - uidRoleCursor.execute ("SELECT name FROM project_group where id =" + str(role[1]) ) - group = uidRoleCursor.fetchone() - if str(role[6]) != "None" : - uidRoleCursor.execute ("SELECT username FROM person where id =" + str(role[6]) ) - sponsor = uidRoleCursor.fetchone() - else: - sponsor = ["None"] - - print "Adding " + str(role[4]) + " role info for " + group[0] + " for user " + username[0] + "." - #if str(group[6]) != "None" : - # uidLookupCursor.execute ("SELECT name FROM project_group where id =" + str(group[6]) ) - # prereq = uidLookupCursor.fetchone() - # print prereq - #else: - # prereq=["None"] - #print owner - - #person_id0, group_project_id1, role_type2, role_domain3, role_status4, internal_comments5, sponsor_id6, creation7, approval8 - - roleLdif = [["objectClass",["fedoraRole"]] ] - #roleLdif.append(["cn",[str(group[0]) + str(role[2])]]) #Fix me - roleLdif.append(["cn",[str(group[0])]]) #Fix me - roleLdif.append(["fedoraRoleType",[str(role[2])]]) - roleLdif.append(["fedoraRoleDomain",[str(role[3]) or "None" ]]) - roleLdif.append(["fedoraRoleStatus",[str(role[4])]]) - roleLdif.append(["fedoraRoleSponsor",sponsor]) - roleLdif.append(["fedoraRoleCreationDate",[str(timestamp1)]]) - roleLdif.append(["fedoraRoleApprovalDate",[str(timestamp2)]]) - - ldifWriter.unparse("cn=" + group[0] + ",ou=Roles,cn=" + username[0] + ",ou=People,dc=fedoraproject,dc=org" , roleLdif ) - - roleCursor.close() - - sys.exit(1) -if __name__ == "__main__": - main() diff --git a/fas/ldap/fedoraGroup.schema b/fas/ldap/fedoraGroup.schema deleted file mode 100644 index 90e06b3..0000000 --- a/fas/ldap/fedoraGroup.schema +++ /dev/null @@ -1,45 +0,0 @@ -#this is the fedora group schema file for use with the accounts system2 -#it currently contains the following: -#owner (the owner's DN) -#group_type -#needs_sponsor -#user_can_remove (will be handled by ACLs, but we need to clue the interface about it) -#prerequisite_id (no idea what that is, so maybe not) -- not included yet -#joinmsg - - -attributeType ( 2.5.444.10 NAME 'fedoraGroupOwner' - DESC 'group owner' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - - -attributeType ( 2.5.444.11 NAME 'fedoraGroupType' - DESC 'the type of group' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - -attributeType ( 2.5.444.12 NAME 'fedoraGroupNeedsSponsor' - DESC 'boolean indicating whether or not the group needs a sponsor' - EQUALITY booleanMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) - -attributeType ( 2.5.444.13 NAME 'fedoraGroupUserCanRemove' - DESC 'boolean indicating whether or not the user can remove the group' - EQUALITY booleanMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) - -attributeType ( 2.5.444.14 NAME 'fedoraGroupJoinMsg' - DESC 'message received upon joining the group' - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1000} ) - - -objectclass ( 2.5.555.3 - NAME 'fedoraGroup' - DESC 'A object describing a group entry' - STRUCTURAL - MAY ( fedoraGroupJoinMsg $ fedoraGroupUsercanRemove $ fedoraGroupType $ fedoraGroupNeedsSponsor $ fedoraGroupUserCanRemove ) - MUST ( cn $ fedoraGroupOwner ) - ) diff --git a/fas/ldap/fedoraPerson.schema b/fas/ldap/fedoraPerson.schema deleted file mode 100644 index d20fdef..0000000 --- a/fas/ldap/fedoraPerson.schema +++ /dev/null @@ -1,57 +0,0 @@ -#this is the fedoraPerson shema file for use with the Account system -#it is based on the inetOrgPerson shema, but has some spicific -#attribues added onto it for use by the Account system -#for now this is the contents -#sshkey bugzillaemail ircNick approvalStatus creationDate -attributeType ( 2.5.444.8 NAME 'fedoraPersonSshKey' - DESC 'ssh key for this member' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} - SINGLE-VALUE) - -attributeType ( 2.5.444.9 NAME 'fedoraPersonBugzillaMail' - DESC 'members preferred bugzilla email address' - EQUALITY caseIgnoreIA5Match - SUBSTR caseIgnoreIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) - -attributeType ( 2.5.444.16 NAME 'fedoraPersonIrcNick' - DESC 'irc nick of the user on freenode' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{100} ) - -attributetype ( 2.5.444.17 NAME 'fedoraPersonCreationDate' - DESC 'date entry was created' - EQUALITY caseIgnoreIA5Match - SUBSTR caseIgnoreIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 - SINGLE-VALUE ) - -attributeType ( 2.5.444.18 NAME 'fedoraPersonApprovalStatus' - DESC 'users approval status' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - - -attributeType ( 2.5.444.19 NAME 'fedoraPersonKeyId' - DESC 'users GPG key ID' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - - -# fedoraPerson -# The fedoraPerson represents people who are a member of the fedora project -# in some way. It is a structural class and inherits -# from the inetOrgPerson class -objectclass ( 2.5.555.1 - NAME 'fedoraPerson' - DESC 'A member of the fedoraproject group' - SUP inetOrgPerson - STRUCTURAL - MUST ( fedoraPersonSshKey $ mail $ fedoraPersonCreationDate ) - MAY (fedoraPersonIrcNick $ fedoraPersonApprovalStatus $ fedoraPersonBugzillaMail $ fedoraPersonKeyId ) - ) diff --git a/fas/ldap/fedoraRole.schema b/fas/ldap/fedoraRole.schema deleted file mode 100644 index 8dd6058..0000000 --- a/fas/ldap/fedoraRole.schema +++ /dev/null @@ -1,66 +0,0 @@ -#this is the fedoraMembership shema file for use with the Account system -#check out http://www.openldap.org/doc/admin23/schema.html#Extending%20Schema -#for more information -#for now this is the contents -#role_type -#role_domain -#role_status -#internal_comments -#sponsor (points to the sponsor's DN) -#creation (date) -#approval (date) -#don't have a name use cn instead -#attributeType ( 2.5.444.1 NAME 'name' -# DESC 'group name' -# EQUALITY caseIgnoreMatch -# SUBSTR caseIgnoreSubstringsMatch -# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{50} ) - -attributeType ( 2.5.444.2 NAME 'fedoraRoleType' - DESC 'the type of role' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{25} ) - - -attributeType ( 2.5.444.15 NAME 'fedoraRoleDomain' - DESC 'the domain of this role' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{15} ) - -attributeType ( 2.5.444.3 NAME 'fedoraRoleStatus' - DESC 'the approval status of this role' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{15} ) - - -#attributeType ( 2.5.444.4 NAME 'internalComments' -# DESC 'group membership comments' -# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1000} ) - - -attributeType ( 2.5.444.5 NAME 'fedoraRoleSponsor' - DESC 'role sponsor' - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{25} ) - -attributeType ( 2.5.444.6 NAME 'fedoraRoleCreationDate' - DESC 'membership creation date' - EQUALITY caseIgnoreIA5Match - SUBSTR caseIgnoreIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - -attributeType ( 2.5.444.7 NAME 'fedoraRoleApprovalDate' - DESC 'membership approval date' - EQUALITY caseIgnoreIA5Match - SUBSTR caseIgnoreIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - -objectclass ( 2.5.555.2 - NAME 'fedoraRole' - DESC 'An object describing a persons roles with the fedora project' - STRUCTURAL - MAY ( fedoraRoleApprovalDate $ fedoraRoleCreationDate $ fedoraRoleType $ fedoraRoleStatus $ fedoraRoleDomain $ fedoraRoleSponsor ) - MUST ( cn ) - ) diff --git a/fas/po/fas.pot b/fas/po/fas.pot new file mode 100644 index 0000000..e77ce5a --- /dev/null +++ b/fas/po/fas.pot @@ -0,0 +1,1240 @@ +# Translations template for PROJECT. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2008. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-03-03 00:46-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.1\n" + +#: client/fasClient.py:42 +msgid "Download and sync most recent content" +msgstr "" + +#: client/fasClient.py:47 +msgid "Do not sync group information" +msgstr "" + +#: client/fasClient.py:52 +msgid "Do not sync passwd information" +msgstr "" + +#: client/fasClient.py:57 +msgid "Do not sync shadow information" +msgstr "" + +#: client/fasClient.py:62 +#, python-format +msgid "Specify URL of fas server (default \"%default\")" +msgstr "" + +#: client/fasClient.py:67 +msgid "Enable FAS synced shell accounts" +msgstr "" + +#: client/fasClient.py:72 +msgid "Disable FAS synced shell accounts" +msgstr "" + +#: fas/auth.py:87 +msgid "cla_sign_group Does not exist! Please create it!" +msgstr "" + +#: fas/auth.py:101 +msgid "cla_click_group Does not exist! Please create it!" +msgstr "" + +#: fas/auth.py:168 fas/auth.py:176 +#, python-format +msgid "%s membership required before application to this group is allowed" +msgstr "" + +#: fas/cla.py:52 fas/cla.py:178 +msgid "" +"You have already signed the CLA, so it is unnecessary to complete the " +"Click-through CLA." +msgstr "" + +#: fas/cla.py:56 fas/cla.py:182 +msgid "You have already completed the Click-through CLA." +msgstr "" + +#: fas/cla.py:61 fas/cla.py:87 +msgid "You have already signed the CLA." +msgstr "" + +#: fas/cla.py:100 fas/user.py:380 +msgid "Your key could not be retrieved from subkeys.pgp.net" +msgstr "" + +#: fas/cla.py:107 +#, python-format +msgid "Your signature could not be verified: '%s'." +msgstr "" + +#: fas/cla.py:117 +msgid "" +"Your signature's fingerprint did not match the fingerprint registered in " +"FAS." +msgstr "" + +#: fas/cla.py:126 +msgid "Your key did not match your email." +msgstr "" + +#: fas/cla.py:131 +msgid "len(sigs) == 0" +msgstr "" + +#: fas/cla.py:137 +msgid "The GPG-signed part of the message did not contain a signed CLA." +msgstr "" + +#: fas/cla.py:142 +msgid "The text \"I agree\" was not found in the CLA." +msgstr "" + +#: fas/cla.py:156 fas/cla.py:194 +#, python-format +msgid "You could not be added to the '%s' group." +msgstr "" + +#: fas/cla.py:165 +#, python-format +msgid "You have successfully signed the CLA. You are now in the '%s' group." +msgstr "" + +#: fas/cla.py:198 +#, python-format +msgid "" +"You have successfully agreed to the click-through CLA. You are now in " +"the '%s' group." +msgstr "" + +#: fas/cla.py:202 +msgid "You have not agreed to the click-through CLA." +msgstr "" + +#: fas/controllers.py:84 +#, python-format +msgid "Welcome, %s" +msgstr "" + +#: fas/controllers.py:99 +msgid "" +"The credentials you supplied were not correct or did not grant access to " +"this resource." +msgstr "" + +#: fas/controllers.py:102 +msgid "You must provide your credentials before accessing this resource." +msgstr "" + +#: fas/controllers.py:105 +msgid "Please log in." +msgstr "" + +#: fas/controllers.py:116 +msgid "You have successfully logged out." +msgstr "" + +#: fas/group.py:21 +#, python-format +msgid "The group '%s' does not exist." +msgstr "" + +#: fas/group.py:33 +#, python-format +msgid "The group '%s' already exists." +msgstr "" + +#: fas/group.py:129 fas/group.py:467 +#, python-format +msgid "You cannot view '%s'" +msgstr "" + +#: fas/group.py:143 fas/group.py:159 +msgid "Only FAS adminstrators can create groups." +msgstr "" + +#: fas/group.py:177 +#, python-format +msgid "The group: '%s' could not be created." +msgstr "" + +#: fas/group.py:187 +#, python-format +msgid "" +"The group: '%(group)s' has been created, but '%(user)s' could not be " +"added as a group administrator." +msgstr "" + +#: fas/group.py:189 +#, python-format +msgid "The group: '%s' has been created." +msgstr "" + +#: fas/group.py:204 fas/group.py:219 +#, python-format +msgid "You cannot edit '%s'." +msgstr "" + +#: fas/group.py:236 +msgid "The group details could not be saved." +msgstr "" + +#: fas/group.py:238 +msgid "The group details have been saved." +msgstr "" + +#: fas/group.py:257 +#, python-format +msgid "No Groups found matching '%s'" +msgstr "" + +#: fas/group.py:283 +#, python-format +msgid "%(user)s has already applied to %(group)s!" +msgstr "" + +#: fas/group.py:293 +#, python-format +msgid "" +"\n" +"Fedora user %(user)s, aka %(name)s <%(email)s> has requested\n" +"membership for %(applicant)s (%(applicant_name)s) in the %(group)s group " +"and needs a sponsor.\n" +"\n" +"Please go to %(url)s to take action. \n" +msgstr "" + +#: fas/group.py:300 +#, python-format +msgid "%(user)s has applied to %(group)s!" +msgstr "" + +#: fas/group.py:317 +#, python-format +msgid "You cannot sponsor '%s'" +msgstr "" + +#: fas/group.py:324 +#, python-format +msgid "'%s' could not be sponsored!" +msgstr "" + +#: fas/group.py:329 +#, python-format +msgid "" +"\n" +"%(name)s <%(email)s> has sponsored you for membership in the %(group)s\n" +"group of the Fedora account system. If applicable, this change should\n" +"propagate into the e-mail aliases and CVS repository within an hour.\n" +"\n" +"%(joinmsg)s\n" +msgstr "" + +#: fas/group.py:337 +#, python-format +msgid "'%s' has been sponsored!" +msgstr "" + +#: fas/group.py:354 +#, python-format +msgid "You cannot remove '%s'." +msgstr "" + +#: fas/group.py:361 +#, python-format +msgid "%(name)s could not be removed from %(group)s!" +msgstr "" + +#: fas/group.py:367 +#, python-format +msgid "" +"\n" +"%(name)s <%(email)s> has removed you from the '%(group)s'\n" +"group of the Fedora Accounts System This change is effective\n" +"immediately for new operations, and should propagate into the e-mail\n" +"aliases within an hour.\n" +msgstr "" + +#: fas/group.py:374 +#, python-format +msgid "%(name)s has been removed from %(group)s!" +msgstr "" + +#: fas/group.py:391 +#, python-format +msgid "You cannot upgrade '%s'" +msgstr "" + +#: fas/group.py:401 +#, python-format +msgid "%(name)s could not be upgraded!" +msgstr "" + +#: fas/group.py:409 +#, python-format +msgid "" +"\n" +"%(name)s <%(email)s> has upgraded you to %(status)s status in the\n" +"'%(group)s' group of the Fedora Accounts System This change is\n" +"effective immediately for new operations, and should propagate\n" +"into the e-mail aliases within an hour.\n" +msgstr "" + +#: fas/group.py:416 +#, python-format +msgid "%s has been upgraded!" +msgstr "" + +#: fas/group.py:432 +#, python-format +msgid "You cannot downgrade '%s'" +msgstr "" + +#: fas/group.py:439 +#, python-format +msgid "%(username)s could not be downgraded!" +msgstr "" + +#: fas/group.py:446 +#, python-format +msgid "" +"\n" +"%(name)s <%(email)s> has downgraded you to %(status)s status in the\n" +"'%(group)s' group of the Fedora Accounts System This change is\n" +"effective immediately for new operations, and should propagate\n" +"into the e-mail aliases within an hour.\n" +msgstr "" + +#: fas/group.py:453 +#, python-format +msgid "%s has been downgraded!" +msgstr "" + +#: fas/group.py:495 +msgid "Come join The Fedora Project!" +msgstr "" + +#: fas/group.py:496 +#, python-format +msgid "" +"\n" +"%(name)s <%(email)s> has invited you to join the Fedora\n" +"Project! We are a community of users and developers who produce a\n" +"complete operating system from entirely free and open source software\n" +"(FOSS). %(name)s thinks that you have knowledge and skills\n" +"that make you a great fit for the Fedora community, and that you might\n" +"be interested in contributing.\n" +"\n" +"How could you team up with the Fedora community to use and develop your\n" +"skills? Check out http://fedoraproject.org/join-fedora for some ideas.\n" +"Our community is more than just software developers -- we also have a\n" +"place for you whether you're an artist, a web site builder, a writer, or\n" +"a people person. You'll grow and learn as you work on a team with other\n" +"very smart and talented people.\n" +"\n" +"Fedora and FOSS are changing the world -- come be a part of it!" +msgstr "" + +#: fas/group.py:513 +#, python-format +msgid "Message sent to: %s" +msgstr "" + +#: fas/group.py:516 +#, python-format +msgid "You are not in the '%s' group." +msgstr "" + +#: fas/openid_fas.py:55 +msgid "The OpenID request could not be decoded." +msgstr "" + +#: fas/safasprovider.py:126 +#, python-format +msgid "Loading: %(visitmod)s" +msgstr "" + +#: fas/user.py:33 +#, python-format +msgid "'%s' does not exist." +msgstr "" + +#: fas/user.py:41 +msgid "To prevent email loops, your email address cannot be @fedoraproject.org." +msgstr "" + +#: fas/user.py:53 +#, python-format +msgid "Error: Could not create - '%s'" +msgstr "" + +#: fas/user.py:55 +#, python-format +msgid "'%s' already exists." +msgstr "" + +#: fas/user.py:64 +#, python-format +msgid "'%s' is an illegal username." +msgstr "" + +#: fas/user.py:196 +#, python-format +msgid "You cannot edit %s" +msgstr "" + +#: fas/user.py:211 +#, python-format +msgid "You do not have permission to edit '%s'" +msgstr "" + +#: fas/user.py:226 +#, python-format +msgid "Your account details could not be saved: %s" +msgstr "" + +#: fas/user.py:228 +msgid "Your account details have been saved." +msgstr "" + +#: fas/user.py:242 +#, python-format +msgid "No users found matching '%s'" +msgstr "" + +#: fas/user.py:248 +msgid "No need to sign up, you have an account!" +msgstr "" + +#: fas/user.py:269 +msgid "Welcome to the Fedora Project!" +msgstr "" + +#: fas/user.py:270 +#, python-format +msgid "" +"\n" +"You have created a new Fedora account!\n" +"Your new password is: %s\n" +"\n" +"Please go to https://admin.fedoraproject.org/fas/ to change it.\n" +"\n" +"Welcome to the Fedora Project. Now that you've signed up for an\n" +"account you're probably desperate to start contributing, and with that\n" +"in mind we hope this e-mail might guide you in the right direction to\n" +"make this process as easy as possible.\n" +"\n" +"Fedora is an exciting project with lots going on, and you can\n" +"contribute in a huge number of ways, using all sorts of different\n" +"skill sets. To find out about the different ways you can contribute to\n" +"Fedora, you can visit our join page which provides more information\n" +"about all the different roles we have available.\n" +"\n" +"http://fedoraproject.org/en/join-fedora\n" +"\n" +"If you already know how you want to contribute to Fedora, and have\n" +"found the group already working in the area you're interested in, then\n" +"there are a few more steps for you to get going.\n" +"\n" +"Foremost amongst these is to sign up for the team or project's mailing\n" +"list that you're interested in - and if you're interested in more than\n" +"one group's work, feel free to sign up for as many mailing lists as\n" +"you like! This is because mailing lists are where the majority of work\n" +"gets organised and tasks assigned, so to stay in the loop be sure to\n" +"keep up with the messages.\n" +"\n" +"Once this is done, it's probably wise to send a short introduction to\n" +"the list letting them know what experience you have and how you'd like\n" +"to help. From here, existing members of the team will help you to find\n" +"your feet as a Fedora contributor.\n" +"\n" +"And finally, from all of us here at the Fedora Project, we're looking\n" +"forward to working with you!\n" +msgstr "" + +#: fas/user.py:310 +msgid "" +"Your password has been emailed to you. Please log in with it and change " +"your password" +msgstr "" + +#: fas/user.py:313 +#, python-format +msgid "The username '%s' already Exists. Please choose a different username." +msgstr "" + +#: fas/user.py:338 +msgid "Your password has been changed." +msgstr "" + +#: fas/user.py:341 +msgid "Your password could not be changed." +msgstr "" + +#: fas/user.py:347 +msgid "You are already logged in!" +msgstr "" + +#: fas/user.py:356 +msgid "You are already logged in." +msgstr "" + +#: fas/user.py:362 +msgid "username + email combo unknown." +msgstr "" + +#: fas/user.py:365 +msgid "Fedora Project Password Reset" +msgstr "" + +#: fas/user.py:366 +#, python-format +msgid "" +"\n" +"You have requested a password reset!\n" +"Your new password is: %s\n" +"\n" +"Please go to https://admin.fedoraproject.org/fas/ to change it.\n" +msgstr "" + +#: fas/user.py:399 +msgid "" +"Your password reset email could not be encrypted. Your password has not " +"been changed." +msgstr "" + +#: fas/user.py:406 +msgid "Your new password has been emailed to you." +msgstr "" + +#: fas/user.py:408 +msgid "Your password could not be reset." +msgstr "" + +#: fas/templates/error.html:7 fas/templates/home.html:7 +#: fas/templates/cla/click.html:7 fas/templates/cla/index.html:7 +#: fas/templates/cla/view.html:7 fas/templates/openid/about.html:7 +#: fas/templates/openid/id.html:7 fas/templates/openid/trusted.html:7 +msgid "Fedora Accounts System" +msgstr "" + +#: fas/templates/error.html:17 +msgid "Error!" +msgstr "" + +#: fas/templates/error.html:18 +msgid "The following error(s) have occured with your request:" +msgstr "" + +#: fas/templates/login.html:7 +msgid "Login to the Fedora Accounts System" +msgstr "" + +#: fas/templates/login.html:17 fas/templates/login.html:23 +msgid "Login" +msgstr "" + +#: fas/templates/login.html:20 +msgid "User Name:" +msgstr "" + +#: fas/templates/login.html:21 fas/templates/user/view.html:25 +msgid "Password:" +msgstr "" + +#: fas/templates/login.html:29 +msgid "Forgot Password?" +msgstr "" + +#: fas/templates/login.html:30 +msgid "Sign Up" +msgstr "" + +#: fas/templates/master.html:22 +msgid "Fedora" +msgstr "" + +#: fas/templates/master.html:25 +msgid "Search:" +msgstr "" + +#: fas/templates/master.html:27 fas/templates/group/list.html:25 +msgid "Search" +msgstr "" + +#: fas/templates/master.html:33 +msgid "Learn about Fedora" +msgstr "" + +#: fas/templates/master.html:34 +msgid "Download Fedora" +msgstr "" + +#: fas/templates/master.html:35 +msgid "Projects" +msgstr "" + +#: fas/templates/master.html:36 +msgid "Join Fedora" +msgstr "" + +#: fas/templates/master.html:37 +msgid "Communicate" +msgstr "" + +#: fas/templates/master.html:38 +msgid "Help/Documentation" +msgstr "" + +#: fas/templates/master.html:44 +msgid "Logged in:" +msgstr "" + +#: fas/templates/master.html:49 +msgid "My Account" +msgstr "" + +#: fas/templates/master.html:50 fas/templates/master.html:87 +msgid "Log Out" +msgstr "" + +#: fas/templates/master.html:51 fas/templates/welcome.html:21 +msgid "Log In" +msgstr "" + +#: fas/templates/master.html:58 +msgid "Group List" +msgstr "" + +#: fas/templates/master.html:61 +msgid "User List" +msgstr "" + +#: fas/templates/master.html:62 +msgid "New Group" +msgstr "" + +#: fas/templates/master.html:64 +msgid "Apply For a new Group" +msgstr "" + +#: fas/templates/master.html:65 +msgid "News" +msgstr "" + +#: fas/templates/master.html:69 +msgid "Locale:" +msgstr "" + +#: fas/templates/master.html:71 +msgid "OK" +msgstr "" + +#: fas/templates/master.html:83 +msgid "About" +msgstr "" + +#: fas/templates/master.html:84 +msgid "Contact Us" +msgstr "" + +#: fas/templates/master.html:85 +msgid "Legal & Privacy" +msgstr "" + +#: fas/templates/master.html:90 +msgid "" +"Copyright © 2007 Red Hat, Inc. and others. All Rights Reserved. Please " +"send any comments or corrections to the websites team." +msgstr "" + +#: fas/templates/master.html:93 +msgid "" +"The Fedora Project is maintained and driven by the community and " +"sponsored by Red Hat. This is a community maintained site. Red Hat is " +"not responsible for content." +msgstr "" + +#: fas/templates/welcome.html:7 +msgid "Welcome to FAS2" +msgstr "" + +#: fas/templates/welcome.html:18 +msgid "" +"Welcome to the Fedora Accounts System 2. This system is not yet live so " +"feel free to play around. Just don't expect it to work." +msgstr "" + +#: fas/templates/welcome.html:22 +msgid "New Account" +msgstr "" + +#: fas/templates/welcome.html:23 +msgid "Why Join?" +msgstr "" + +#: fas/templates/cla/click.html:11 fas/templates/cla/view.html:11 +msgid "Contributor License Agreement" +msgstr "" + +#: fas/templates/cla/click.html:15 fas/templates/cla/view.html:20 +#, python-format +msgid "If you agree to these terms and conditions, type \"%s\" here:" +msgstr "" + +#: fas/templates/cla/click.html:16 fas/templates/cla/view.html:21 +#: fas/templates/user/new.html:17 +msgid "Full Name:" +msgstr "" + +#: fas/templates/cla/click.html:17 fas/templates/cla/view.html:22 +msgid "E-mail:" +msgstr "" + +#: fas/templates/cla/click.html:18 fas/templates/cla/view.html:23 +msgid "Date:" +msgstr "" + +#: fas/templates/cla/click.html:19 fas/templates/cla/view.html:24 +#: fas/templates/cla/view.html:38 +msgid "Submit CLA" +msgstr "" + +#: fas/templates/cla/index.html:10 +msgid "Fedora Contributor License Agreement" +msgstr "" + +#: fas/templates/cla/index.html:12 +msgid "" +"There are two ways to sign the CLA. Most users will want to do a signed " +"CLA as it will promote them to a full contributor in Fedora. The click-" +"through CLA only grants partial access but may be preferred for those " +"with special legal considerations. See: CLA" +" Acceptance Hierarchies for more information." +msgstr "" + +#: fas/templates/cla/index.html:15 fas/templates/user/list.html:42 +#: fas/templates/user/view.html:30 +msgid "Signed CLA" +msgstr "" + +#: fas/templates/cla/index.html:16 fas/templates/user/list.html:43 +#: fas/templates/user/view.html:31 +msgid "Click-through CLA" +msgstr "" + +#: fas/templates/cla/index.html:19 +#, python-format +msgid "You have already sucessfully signed the CLA." +msgstr "" + +#: fas/templates/cla/view.html:30 +#, python-format +msgid "" +"Use the below link to download/save the CLA as fedora-" +"icla-%(username)s.txt, and run:
    gpg -as fedora-"
    +"icla-%(username)s.txt
    After, upload fedora-" +"icla-%(username)s.txt.asc in the form below." +msgstr "" + +#: fas/templates/cla/view.html:33 +msgid "Download the CLA text file here!" +msgstr "" + +#: fas/templates/cla/view.html:37 +msgid "Signed CLA:" +msgstr "" + +#: fas/templates/group/edit.html:7 fas/templates/group/view.html:7 +msgid "Edit Group" +msgstr "" + +#: fas/templates/group/edit.html:10 +#, python-format +msgid "Edit Group: %s" +msgstr "" + +#: fas/templates/group/edit.html:13 fas/templates/group/new.html:17 +msgid "Display Name:" +msgstr "" + +#: fas/templates/group/edit.html:17 fas/templates/group/new.html:25 +msgid "Group Type:" +msgstr "" + +#: fas/templates/group/edit.html:21 fas/templates/group/new.html:21 +msgid "Group Owner:" +msgstr "" + +#: fas/templates/group/edit.html:25 fas/templates/group/new.html:29 +#: fas/templates/group/view.html:38 +msgid "Needs Sponsor:" +msgstr "" + +#: fas/templates/group/edit.html:30 fas/templates/group/new.html:33 +#: fas/templates/group/view.html:42 +msgid "Self Removal:" +msgstr "" + +#: fas/templates/group/edit.html:35 +msgid "Group Prerequisite:" +msgstr "" + +#: fas/templates/group/edit.html:40 +msgid "Group Join Message:" +msgstr "" + +#: fas/templates/group/edit.html:44 fas/templates/user/edit.html:73 +msgid "Save!" +msgstr "" + +#: fas/templates/group/invite.html:7 fas/templates/group/invite.html:10 +msgid "Invite a new community member!" +msgstr "" + +#: fas/templates/group/invite.html:14 +msgid "To email:" +msgstr "" + +#: fas/templates/group/invite.html:15 +msgid "From:" +msgstr "" + +#: fas/templates/group/invite.html:16 +msgid "Subject:" +msgstr "" + +#: fas/templates/group/invite.html:17 +msgid "Message:" +msgstr "" + +#: fas/templates/group/invite.html:39 +msgid "Send!" +msgstr "" + +#: fas/templates/group/list.html:7 +msgid "Groups List" +msgstr "" + +#: fas/templates/group/list.html:19 fas/templates/user/list.html:11 +#, python-format +msgid "List (%s)" +msgstr "" + +#: fas/templates/group/list.html:20 +msgid "Search Groups" +msgstr "" + +#: fas/templates/group/list.html:22 +msgid "\"*\" is a wildcard (Ex: \"cvs*\")" +msgstr "" + +#: fas/templates/group/list.html:28 fas/templates/user/list.html:19 +msgid "Results" +msgstr "" + +#: fas/templates/group/list.html:31 fas/templates/user/list.html:22 +msgid "All" +msgstr "" + +#: fas/templates/group/list.html:36 +msgid "Group" +msgstr "" + +#: fas/templates/group/list.html:36 +msgid "Description" +msgstr "" + +#: fas/templates/group/list.html:36 +msgid "Status" +msgstr "" + +#: fas/templates/group/list.html:44 fas/templates/group/view.html:20 +#: fas/templates/user/view.html:56 +msgid "Approved" +msgstr "" + +#: fas/templates/group/list.html:45 fas/templates/group/view.html:21 +#: fas/templates/user/view.html:57 +msgid "Unapproved" +msgstr "" + +#: fas/templates/group/list.html:47 +msgid "Apply" +msgstr "" + +#: fas/templates/group/new.html:7 fas/templates/group/new.html:10 +msgid "Create a new FAS Group" +msgstr "" + +#: fas/templates/group/new.html:13 +msgid "Group Name:" +msgstr "" + +#: fas/templates/group/new.html:37 +msgid "Must Belong To:" +msgstr "" + +#: fas/templates/group/new.html:41 fas/templates/group/view.html:46 +msgid "Join Message:" +msgstr "" + +#: fas/templates/group/new.html:45 +msgid "Create!" +msgstr "" + +#: fas/templates/group/view.html:19 +msgid "My Status:" +msgstr "" + +#: fas/templates/group/view.html:22 +msgid "Not a Member" +msgstr "" + +#: fas/templates/group/view.html:30 +msgid "Remove me" +msgstr "" + +#: fas/templates/group/view.html:31 fas/templates/user/view.html:13 +msgid "(edit)" +msgstr "" + +#: fas/templates/group/view.html:34 fas/templates/openid/id.html:16 +msgid "Name:" +msgstr "" + +#: fas/templates/group/view.html:35 +msgid "Description:" +msgstr "" + +#: fas/templates/group/view.html:36 +msgid "Owner:" +msgstr "" + +#: fas/templates/group/view.html:37 +msgid "Type:" +msgstr "" + +#: fas/templates/group/view.html:39 fas/templates/group/view.html:43 +msgid "Yes" +msgstr "" + +#: fas/templates/group/view.html:40 fas/templates/group/view.html:44 +msgid "No" +msgstr "" + +#: fas/templates/group/view.html:47 +msgid "Prerequisite:" +msgstr "" + +#: fas/templates/group/view.html:50 +msgid "Created:" +msgstr "" + +#: fas/templates/group/view.html:58 +msgid "Members" +msgstr "" + +#: fas/templates/group/view.html:62 fas/templates/user/list.html:27 +msgid "Username" +msgstr "" + +#: fas/templates/group/view.html:63 fas/templates/group/view.html:83 +msgid "Sponsor" +msgstr "" + +#: fas/templates/group/view.html:64 +msgid "Date Added" +msgstr "" + +#: fas/templates/group/view.html:65 +msgid "Date Approved" +msgstr "" + +#: fas/templates/group/view.html:66 +msgid "Approval" +msgstr "" + +#: fas/templates/group/view.html:67 +msgid "Role Type" +msgstr "" + +#: fas/templates/group/view.html:68 +msgid "Action" +msgstr "" + +#: fas/templates/group/view.html:74 +msgid "None" +msgstr "" + +#: fas/templates/group/view.html:84 +msgid "Approve" +msgstr "" + +#: fas/templates/group/view.html:87 +msgid "Remove" +msgstr "" + +#: fas/templates/group/view.html:90 +msgid "Upgrade" +msgstr "" + +#: fas/templates/group/view.html:93 +msgid "Downgrade" +msgstr "" + +#: fas/templates/openid/about.html:10 fas/templates/openid/trusted.html:10 +msgid "Fedora Project OpenID Provider" +msgstr "" + +#: fas/templates/openid/id.html:11 +#, python-format +msgid "User %s" +msgstr "" + +#: fas/templates/openid/id.html:14 fas/templates/user/new.html:13 +#: fas/templates/user/resetpass.html:13 +msgid "Username:" +msgstr "" + +#: fas/templates/openid/trusted.html:15 +#, python-format +msgid "Allow %s to authenticate to your OpenID identity?" +msgstr "" + +#: fas/templates/openid/trusted.html:16 +msgid "Submit" +msgstr "" + +#: fas/templates/user/changepass.html:7 fas/templates/user/changepass.html:10 +#: fas/templates/user/changepass.html:16 +msgid "Change Password" +msgstr "" + +#: fas/templates/user/changepass.html:13 +msgid "Current Password:" +msgstr "" + +#: fas/templates/user/changepass.html:14 +msgid "New Password:" +msgstr "" + +#: fas/templates/user/changepass.html:15 +msgid "Confirm Password:" +msgstr "" + +#: fas/templates/user/edit.html:7 +msgid "Edit Account" +msgstr "" + +#: fas/templates/user/edit.html:10 +#, python-format +msgid "Edit Account (%s)" +msgstr "" + +#: fas/templates/user/edit.html:13 +msgid "Human Name" +msgstr "" + +#: fas/templates/user/edit.html:19 +msgid "Email" +msgstr "" + +#: fas/templates/user/edit.html:28 +msgid "IRC Nick" +msgstr "" + +#: fas/templates/user/edit.html:33 +msgid "PGP Key" +msgstr "" + +#: fas/templates/user/edit.html:38 +msgid "Telephone Number" +msgstr "" + +#: fas/templates/user/edit.html:43 +msgid "Postal Address" +msgstr "" + +#: fas/templates/user/edit.html:48 +msgid "Time Zone" +msgstr "" + +#: fas/templates/user/edit.html:58 +msgid "Locale" +msgstr "" + +#: fas/templates/user/edit.html:68 +msgid "Comments" +msgstr "" + +#: fas/templates/user/edit.html:74 +msgid "Cancel" +msgstr "" + +#: fas/templates/user/list.html:7 +msgid "Users List" +msgstr "" + +#: fas/templates/user/list.html:13 +msgid "\"*\" is a wildcard (Ex: \"ric*\")" +msgstr "" + +#: fas/templates/user/list.html:28 +msgid "Account Status" +msgstr "" + +#: fas/templates/user/list.html:44 fas/templates/user/view.html:32 +msgid "Not Done" +msgstr "" + +#: fas/templates/user/new.html:7 fas/templates/user/new.html:10 +msgid "Sign up for a Fedora account" +msgstr "" + +#: fas/templates/user/new.html:21 fas/templates/user/view.html:18 +msgid "Email:" +msgstr "" + +#: fas/templates/user/new.html:31 fas/templates/user/view.html:22 +msgid "Telephone Number:" +msgstr "" + +#: fas/templates/user/new.html:35 fas/templates/user/view.html:23 +msgid "Postal Address:" +msgstr "" + +#: fas/templates/user/new.html:39 +msgid "Sign up!" +msgstr "" + +#: fas/templates/user/resetpass.html:7 fas/templates/user/resetpass.html:10 +#: fas/templates/user/resetpass.html:16 +msgid "Reset Password" +msgstr "" + +#: fas/templates/user/resetpass.html:14 +msgid "Primary Email:" +msgstr "" + +#: fas/templates/user/resetpass.html:15 +msgid "Encrypt/Sign password reset email" +msgstr "" + +#: fas/templates/user/view.html:7 +msgid "View Account" +msgstr "" + +#: fas/templates/user/view.html:11 +msgid "Your Fedora Account" +msgstr "" + +#: fas/templates/user/view.html:12 +#, python-format +msgid "%s's Fedora Account" +msgstr "" + +#: fas/templates/user/view.html:13 +msgid "Account Details" +msgstr "" + +#: fas/templates/user/view.html:16 +msgid "Account Name:" +msgstr "" + +#: fas/templates/user/view.html:17 +msgid "Real Name:" +msgstr "" + +#: fas/templates/user/view.html:20 +msgid "IRC Nick:" +msgstr "" + +#: fas/templates/user/view.html:21 +msgid "PGP Key:" +msgstr "" + +#: fas/templates/user/view.html:24 +msgid "Comments:" +msgstr "" + +#: fas/templates/user/view.html:25 fas/templates/user/view.html:26 +msgid "Valid" +msgstr "" + +#: fas/templates/user/view.html:26 +msgid "Account Status:" +msgstr "" + +#: fas/templates/user/view.html:29 +msgid "CLA:" +msgstr "" + +#: fas/templates/user/view.html:31 +msgid "GPG Sign it!" +msgstr "" + +#: fas/templates/user/view.html:32 +msgid "Sign it!" +msgstr "" + +#: fas/templates/user/view.html:36 +msgid "Your Roles" +msgstr "" + +#: fas/templates/user/view.html:37 +#, python-format +msgid "%s's Roles" +msgstr "" + +#: fas/templates/user/view.html:54 +msgid "Status:" +msgstr "" + +#: fas/templates/user/view.html:59 +msgid "Tools:" +msgstr "" + +#: fas/templates/user/view.html:62 +msgid "View Group" +msgstr "" + +#: fas/templates/user/view.html:63 +msgid "Invite a New Member..." +msgstr "" + +#: fas/templates/user/view.html:64 +msgid "Manage Group Membership..." +msgstr "" + +#: fas/templates/user/view.html:65 +msgid "Manage Group Details..." +msgstr "" + +#: fas/templates/user/view.html:69 +msgid "Queue:" +msgstr "" + +#: fas/templates/user/view.html:73 +#, python-format +msgid "" +"%(user)s requests approval to join " +"%(group)s." +msgstr "" + diff --git a/fas/po/messages.pot b/fas/po/messages.pot deleted file mode 100644 index 82981f2..0000000 --- a/fas/po/messages.pot +++ /dev/null @@ -1,1304 +0,0 @@ -# Translations template for PROJECT. -# Copyright (C) 2007 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2007. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2007-09-26 20:45-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.8.1\n" - -#: fas/cla.py:55 fas/cla.py:159 -msgid "" -"You have already signed the CLA, so it is unnecessary to complete the " -"Click-through CLA." -msgstr "" - -#: fas/cla.py:59 fas/cla.py:163 -msgid "You have already completed the Click-through CLA." -msgstr "" - -#: fas/cla.py:64 fas/cla.py:90 -msgid "You have already signed the CLA." -msgstr "" - -#: fas/cla.py:102 -#, python-format -msgid "Your signature could not be verified: '%s'." -msgstr "" - -#: fas/cla.py:110 -msgid "" -"Your signature's fingerprint did not match the fingerprint registered in " -"FAS." -msgstr "" - -#: fas/cla.py:120 -msgid "Your key did not match your email." -msgstr "" - -#: fas/cla.py:127 -msgid "The GPG-signed part of the message did not contain a signed CLA." -msgstr "" - -#: fas/cla.py:131 -msgid "The text \"I agree\" was not found in the CLA." -msgstr "" - -#: fas/cla.py:140 fas/cla.py:173 -#, python-format -msgid "You could not be added to the '%s' group." -msgstr "" - -#: fas/cla.py:148 -#, python-format -msgid "You have successfully signed the CLA. You are now in the '%s' group." -msgstr "" - -#: fas/cla.py:177 -#, python-format -msgid "" -"You have successfully agreed to the click-through CLA. You are now in " -"the '%s' group." -msgstr "" - -#: fas/cla.py:181 -msgid "You have not agreed to the click-through CLA." -msgstr "" - -#: fas/controllers.py:60 -#, python-format -msgid "Welcome, %s" -msgstr "" - -#: fas/controllers.py:68 -msgid "" -"The credentials you supplied were not correct or did not grant access to " -"this resource." -msgstr "" - -#: fas/controllers.py:71 -msgid "You must provide your credentials before accessing this resource." -msgstr "" - -#: fas/controllers.py:73 -msgid "Please log in." -msgstr "" - -#: fas/controllers.py:84 -msgid "You have successfully logged out." -msgstr "" - -#: fas/controllers.py:92 -#, python-format -msgid "Invitation Sent to: \"%(name)s\" <%(email)s>" -msgstr "" - -#: fas/controllers.py:94 -msgid "Please provide both an email address and the persons name." -msgstr "" - -#: fas/controllers.py:109 -msgid "Come join The Fedora Project!" -msgstr "" - -#: fas/controllers.py:124 -#, python-format -msgid "" -"%(name)s <%(email)s> has invited you to join the Fedora\n" -"Project! We are a community of users and developers who produce a\n" -"complete operating system from entirely free and open source software\n" -"(FOSS). %(name)s thinks that you have knowledge and skills\n" -"that make you a great fit for the Fedora community, and that you might\n" -"be interested in contributing.\n" -"\n" -"How could you team up with the Fedora community to use and develop your\n" -"skills? Check out http://fedoraproject.org/wiki/Join for some ideas.\n" -"Our community is more than just software developers -- we also have a\n" -"place for you whether you're an artist, a web site builder, a writer, or\n" -"a people person. You'll grow and learn as you work on a team with other\n" -"very smart and talented people. \n" -"\n" -"Fedora and FOSS are changing the world -- come be a part of it!" -msgstr "" - -#: fas/controllers.py:126 -#, python-format -msgid "Message sent to: %s" -msgstr "" - -#: fas/group.py:25 -#, python-format -msgid "The group '%s' does not exist." -msgstr "" - -#: fas/group.py:35 -#, python-format -msgid "The required group '%s' does not exist." -msgstr "" - -#: fas/group.py:44 -#, python-format -msgid "The group '%s' already exists." -msgstr "" - -#: fas/group.py:101 fas/group.py:358 -#, python-format -msgid "You cannot view '%s'" -msgstr "" - -#: fas/group.py:127 fas/group.py:139 -msgid "Only FAS adminstrators can create groups." -msgstr "" - -#: fas/group.py:150 -#, python-format -msgid "The group: '%s' could not be created." -msgstr "" - -#: fas/group.py:160 -#, python-format -msgid "" -"The group: '%(group)s' has been created, but '%(user)' could not be added" -" as a group administrator." -msgstr "" - -#: fas/group.py:162 -#, python-format -msgid "The group: '%s' has been created." -msgstr "" - -#: fas/group.py:174 fas/group.py:189 -#, python-format -msgid "You cannot edit '%s'." -msgstr "" - -#: fas/group.py:204 -msgid "The group details could not be saved." -msgstr "" - -#: fas/group.py:206 -msgid "The group details have been saved." -msgstr "" - -#: fas/group.py:219 -#, python-format -msgid "No Groups found matching '%s'" -msgstr "" - -#: fas/group.py:235 -#, python-format -msgid "%(user)s could not apply to %(group)s!" -msgstr "" - -#: fas/group.py:243 -#, python-format -msgid "%(user)s has already applied to %(group)s!" -msgstr "" - -#: fas/group.py:246 -#, python-format -msgid "%(user)s has applied to %(group)s!" -msgstr "" - -#: fas/group.py:259 -#, python-format -msgid "You cannot sponsor '%s'" -msgstr "" - -#: fas/group.py:267 -#, python-format -msgid "'%s' could not be sponsored!" -msgstr "" - -#: fas/group.py:270 -#, python-format -msgid "'%s' has been sponsored!" -msgstr "" - -#: fas/group.py:283 -#, python-format -msgid "You cannot remove '%s'." -msgstr "" - -#: fas/group.py:290 -#, python-format -msgid "%(name)s could not be removed from %(group)s!" -msgstr "" - -#: fas/group.py:294 -#, python-format -msgid "%(name)s has been removed from %(group)s!" -msgstr "" - -#: fas/group.py:307 -#, python-format -msgid "You cannot upgrade '%s'" -msgstr "" - -#: fas/group.py:318 -#, python-format -msgid "%(name)s could not be upgraded!" -msgstr "" - -#: fas/group.py:321 -#, python-format -msgid "%s has been upgraded!" -msgstr "" - -#: fas/group.py:333 -#, python-format -msgid "You cannot downgrade '%s'" -msgstr "" - -#: fas/group.py:344 -#, python-format -msgid "%(name)s could not be downgraded!" -msgstr "" - -#: fas/group.py:347 -#, python-format -msgid "%s has been downgraded!" -msgstr "" - -#: fas/user.py:29 -#, python-format -msgid "'%s' does not exist." -msgstr "" - -#: fas/user.py:38 -msgid "To prevent email loops, your email address cannot be @fedoraproject.org." -msgstr "" - -#: fas/user.py:47 -#, python-format -msgid "'%s' already exists." -msgstr "" - -#: fas/user.py:56 -#, python-format -msgid "'%s' is an illegal username." -msgstr "" - -#: fas/user.py:160 -#, python-format -msgid "You cannot edit %s" -msgstr "" - -#: fas/user.py:171 -#, python-format -msgid "You do not have permission to edit '%s'" -msgstr "" - -#: fas/user.py:184 -msgid "Your account details could not be saved." -msgstr "" - -#: fas/user.py:186 -msgid "Your account details have been saved." -msgstr "" - -#: fas/user.py:208 -#, python-format -msgid "No users found matching '%s'" -msgstr "" - -#: fas/user.py:223 -msgid "No need to sign up, You have an account!" -msgstr "" - -#: fas/user.py:244 fas/user.py:306 -msgid "Fedora Project Password Reset" -msgstr "" - -#: fas/user.py:250 -#, python-format -msgid "" -"\n" -" You have created a new Fedora account!\n" -" Your new password is: %s\n" -"\n" -" Please go to https://admin.fedoraproject.org/fas/ to " -"change it.\n" -" " -msgstr "" - -#: fas/user.py:253 -msgid "" -"Your password has been emailed to you. Please log in with it and change " -"your password" -msgstr "" - -#: fas/user.py:256 -#, python-format -msgid "The username '%s' already Exists. Please choose a different username." -msgstr "" - -#: fas/user.py:280 -msgid "Your password has been changed." -msgstr "" - -#: fas/user.py:282 -msgid "Your password could not be changed." -msgstr "" - -#: fas/user.py:288 -msgid "You are already logged in!" -msgstr "" - -#: fas/user.py:297 -msgid "You are already logged in." -msgstr "" - -#: fas/user.py:303 -msgid "username + email combo unknown." -msgstr "" - -#: fas/user.py:312 -#, python-format -msgid "" -"\n" -" You have requested a password reset!\n" -" Your new password is - %s\n" -" \n" -" Please go to https://admin.fedoraproject.org/fas/ to " -"change it.\n" -" " -msgstr "" - -#: fas/user.py:331 -msgid "" -"Your password reset email could not be encrypted. Your password has not " -"been changed." -msgstr "" - -#: fas/user.py:338 -msgid "Your new password has been emailed to you." -msgstr "" - -#: fas/user.py:340 -msgid "Your password could not be reset." -msgstr "" - -#: fas/templates/error.html:7 fas/templates/home.html:7 -#: fas/templates/cla/click.html:7 fas/templates/cla/index.html:7 -#: fas/templates/cla/sign.html:7 fas/templates/cla/view.html:7 -msgid "Fedora Accounts System" -msgstr "" - -#: fas/templates/error.html:8 fas/templates/login.html:8 -#: fas/templates/welcome.html:8 -msgid "" -"#content ul\n" -" {\n" -" list-style: square;\n" -" margin: 1ex 3ex;\n" -" }" -msgstr "" - -#: fas/templates/error.html:17 -msgid "Error!" -msgstr "" - -#: fas/templates/error.html:18 -msgid "The following error(s) have occured with your request:" -msgstr "" - -#: fas/templates/home.html:10 -msgid "Recent Builds" -msgstr "" - -#: fas/templates/home.html:10 -msgid "(Koji)" -msgstr "" - -#: fas/templates/home.html:13 -msgid "Build" -msgstr "" - -#: fas/templates/home.html:13 -msgid "Build Date" -msgstr "" - -#: fas/templates/invite.html:7 fas/templates/invite.html:10 -msgid "Invite a new community member!" -msgstr "" - -#: fas/templates/invite.html:12 -msgid "To email:" -msgstr "" - -#: fas/templates/invite.html:13 -msgid "From:" -msgstr "" - -#: fas/templates/invite.html:14 -msgid "Subject: Invitation to join the Fedora Team!" -msgstr "" - -#: fas/templates/invite.html:15 -msgid "Message:" -msgstr "" - -#: fas/templates/invite.html:19 -msgid "" -"> has invited you to join the Fedora\n" -" Project! We are a community of users and developers who " -"produce a\n" -" complete operating system from entirely free and open source " -"software\n" -" (FOSS)." -msgstr "" - -#: fas/templates/invite.html:22 -msgid "" -"thinks that you have knowledge and skills\n" -" that make you a great fit for the Fedora community, and that " -"you might\n" -" be interested in contributing." -msgstr "" - -#: fas/templates/invite.html:26 -msgid "" -"How could you team up with the Fedora community to use and develop your\n" -" skills? Check out http://fedoraproject.org/wiki/Join for some " -"ideas.\n" -" Our community is more than just software developers -- we also " -"have a\n" -" place for you whether you're an artist, a web site builder, a " -"writer, or\n" -" a people person. You'll grow and learn as you work on a team " -"with other\n" -" very smart and talented people." -msgstr "" - -#: fas/templates/invite.html:34 -msgid "Fedora and FOSS are changing the world -- come be a part of it!" -msgstr "" - -#: fas/templates/login.html:7 -msgid "Login to the Fedora Accounts System" -msgstr "" - -#: fas/templates/login.html:17 -msgid "Login" -msgstr "" - -#: fas/templates/login.html:20 -msgid "User Name:" -msgstr "" - -#: fas/templates/login.html:21 -msgid "Password:" -msgstr "" - -#: fas/templates/login.html:29 -msgid "Forgot Password?" -msgstr "" - -#: fas/templates/login.html:30 -msgid "Sign Up" -msgstr "" - -#: fas/templates/master.html:13 -msgid "Fedora" -msgstr "" - -#: fas/templates/master.html:16 -msgid "Search:" -msgstr "" - -#: fas/templates/master.html:24 -msgid "Learn about Fedora" -msgstr "" - -#: fas/templates/master.html:25 -msgid "Download Fedora" -msgstr "" - -#: fas/templates/master.html:26 -msgid "Projects" -msgstr "" - -#: fas/templates/master.html:27 -msgid "Join Fedora" -msgstr "" - -#: fas/templates/master.html:28 -msgid "Communicate" -msgstr "" - -#: fas/templates/master.html:29 -msgid "Help/Documentation" -msgstr "" - -#: fas/templates/master.html:35 -msgid "Logged in:" -msgstr "" - -#: fas/templates/master.html:40 -msgid "My Account" -msgstr "" - -#: fas/templates/master.html:41 fas/templates/master.html:71 -msgid "Log Out" -msgstr "" - -#: fas/templates/master.html:42 fas/templates/welcome.html:21 -msgid "Log In" -msgstr "" - -#: fas/templates/master.html:49 -msgid "Group List" -msgstr "" - -#: fas/templates/master.html:52 -msgid "User List" -msgstr "" - -#: fas/templates/master.html:53 -msgid "New Group" -msgstr "" - -#: fas/templates/master.html:55 -msgid "Apply For a new Group" -msgstr "" - -#: fas/templates/master.html:56 -msgid "News" -msgstr "" - -#: fas/templates/master.html:67 -msgid "About" -msgstr "" - -#: fas/templates/master.html:68 -msgid "Contact Us" -msgstr "" - -#: fas/templates/master.html:69 -msgid "Legal & Privacy" -msgstr "" - -#: fas/templates/master.html:73 -msgid "" -"Copyright © 2007 Red Hat, Inc. and others. All Rights Reserved.\n" -" Please send any comments or corrections to the" -msgstr "" - -#: fas/templates/master.html:75 -msgid "websites team" -msgstr "" - -#: fas/templates/master.html:77 -msgid "" -"The Fedora Project is maintained and driven by the community and " -"sponsored by Red Hat. This is a community maintained site. Red Hat is " -"not responsible for content." -msgstr "" - -#: fas/templates/welcome.html:7 -msgid "Welcome to FAS2" -msgstr "" - -#: fas/templates/welcome.html:17 -msgid "" -"Welcome to the Fedora Accounts System 2. This system is not yet live so " -"feel free to play around. Just don't expect it to work." -msgstr "" - -#: fas/templates/welcome.html:22 -msgid "New Account" -msgstr "" - -#: fas/templates/welcome.html:23 -msgid "Why Join?" -msgstr "" - -#: fas/templates/cla/cla.txt:1 -msgid "" -"The Fedora Project\n" -" Individual Contributor License Agreement (CLA)\n" -" http://www.fedora.redhat.com/licenses/\n" -"\n" -" Thank you for your interest in The Fedora Project (the\n" -" \"Project\"). In order to clarify the intellectual property license\n" -" granted with Contributions from any person or entity, Red hat,\n" -" Inc. (\"Red Hat\"), as maintainer of the Project, must have a\n" -" Contributor License Agreement (CLA) on file that has been signed\n" -" by each Contributor, indicating agreement to the license terms\n" -" below. This license is for Your protection as a Contributor as\n" -" well as the protection of the Project and its users; it does not\n" -" change your rights to use your own Contributions for any other\n" -" purpose.\n" -"\n" -" If you have not already done so, please complete an original signed\n" -" Agreement. Use black ink, and hand-print or type the items other than" -"\n" -" the signature. Send the completed Agreement to\n" -"\n" -"\t Fedora Project, c/o Red Hat, Inc.,\n" -"\t Attn: Legal Affairs\n" -"\t 1801 Varsity Drive\n" -"\t Raleigh, North Carolina, 27606 U.S.A.\n" -"\n" -" If necessary, you may send it by facsimile to the Project at\n" -" +1-919-754-3704 or e-mail a signed pdf copy of the document to\n" -" fedora-legal@redhat.com. Please read this document carefully before\n" -" signing and keep a copy for your records.\n" -"\n" -" Full name:" -msgstr "" - -#: fas/templates/cla/cla.txt:30 -msgid "E-Mail:" -msgstr "" - -#: fas/templates/cla/cla.txt:30 -msgid "Address:" -msgstr "" - -#: fas/templates/cla/cla.txt:32 -msgid "Telephone:" -msgstr "" - -#: fas/templates/cla/cla.txt:34 -#, python-format -msgid "" -"Facsimile: %(facsimile)s\n" -"\n" -" You and the Project hereby accept and agree to the following terms " -"and conditions:\n" -"\n" -" 1. Contributors and Contributions.\n" -"\n" -" A. The Project and any individual or legal entity that\n" -" voluntarily submits to the Project a Contribution are\n" -" collectively addressed herein as \"Contributors\". For legal\n" -" entities, the entity making a Contribution and all other\n" -" entities that control, are controlled by, or are under common\n" -" control with that entity are considered to be a single\n" -" Contributor. For the purposes of this definition, \"control\"\n" -" means (i) the power, direct or indirect, to cause the direction\n" -" or management of such entity, whether by contract or otherwise,\n" -" or (ii) ownership of fifty percent (50%) or more of the\n" -" outstanding shares, or (iii) beneficial ownership of such\n" -" entity.\n" -"\n" -" B. A \"Contribution\" is any original work, including any\n" -" modification or addition to an existing work, that has been\n" -" submitted for inclusion in, or documentation of, any of the\n" -" products owned or managed by the Project, where such work\n" -" originates from that particular Contributor or from some entity\n" -" acting on behalf of that Contributor.\n" -"\n" -" C. A Contribution is \"submitted\" when any form of electronic,\n" -" verbal, or written communication is sent to the Project,\n" -" including but not limited to communication on electronic\n" -" mailing lists, source code control systems, and issue tracking\n" -" systems that are managed by, or on behalf of, the Project for\n" -" the purpose of discussing or improving software or\n" -" documentation of the Project, but excluding communication that\n" -" is conspicuously marked or otherwise designated in writing by\n" -" you as \"Not a Contribution.\"\n" -"\n" -" D. Any Contribution submitted by you to the Project shall be\n" -" under the terms and conditions of this License, without any\n" -" additional terms or conditions, unless you explicitly state\n" -" otherwise in the submission.\n" -"\n" -" 2. Contributor Grant of License. You hereby grant to Red Hat,\n" -" Inc., on behalf of the Project, and to recipients of software\n" -" distributed by the Project:\n" -"\n" -" (a) a perpetual, non-exclusive, worldwide, fully paid-up,\n" -" royalty free, irrevocable copyright license to reproduce,\n" -" prepare derivative works of, publicly display, publicly\n" -" perform, sublicense, and distribute your Contribution and such\n" -" derivative works; and,\n" -"\n" -" (b) a perpetual, non-exclusive, worldwide, fully paid-up,\n" -" royalty free, irrevocable (subject to Section 3) patent license\n" -" to make, have made, use, offer to sell, sell, import, and\n" -" otherwise transfer your Contribution and derivative works\n" -" thereof, where such license applies only to those patent claims\n" -" licensable by you that are necessarily infringed by your\n" -" Contribution alone or by combination of your Contribution with\n" -" the work to which you submitted the Contribution. Except for\n" -" the license granted in this section, you reserve all right,\n" -" title and interest in and to your Contributions.\n" -"\n" -" 3. Reciprocity. As of the date any such litigation is filed, your\n" -" patent grant shall immediately terminate with respect to any\n" -" party that institutes patent litigation against you (including\n" -" a cross-claim or counterclaim in a lawsuit) alleging that your\n" -" Contribution, or the work to which you have contributed,\n" -" constitutes direct or contributory patent infringement.\n" -"\n" -" 4. You represent that you are legally entitled to grant the above\n" -" license. If your employer(s) has rights to intellectual\n" -" property that you create that includes your Contributions, you\n" -" represent that you have received permission to make\n" -" Contributions on behalf of that employer, that your employer\n" -" has waived such rights for your Contributions to the Project,\n" -" or that your employer has executed a separate Corporate CLA\n" -" with the Project.\n" -"\n" -" 5. You represent that each of your Contributions is your original\n" -" creation (see section 7 for submissions on behalf of others).\n" -" You represent that your Contribution submission(s) include\n" -" complete details of any third-party license or other\n" -" restriction (including, but not limited to, related copyright,\n" -" atents and trademarks) of which you are personally aware and\n" -" which are associated with any part of your Contribution.\n" -"\n" -" 6. You are not expected to provide support for your Contributions,\n" -" except to the extent you desire to provide support. You may\n" -" provide support for free, for a fee, or not at all. Your\n" -" Contributions are provided on an \"AS IS\" BASIS, WITHOUT\n" -" WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n" -" implied, including, without limitation, any warranties or\n" -" conditions of NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR\n" -" A PARTICULAR PURPOSE.\n" -"\n" -" 7. Should you wish to submit work that is not your original\n" -" creation, you may submit it to the Project separately from any\n" -" Contribution, identifying the complete details of its source\n" -" and of any license or other restriction (including, but not\n" -" limited to, related patents, trademarks, and license\n" -" agreements) of which you are personally aware, and\n" -" conspicuously marking the work as \"Submitted on behalf of a\n" -" third-party: [named here]\".\n" -"\n" -" 8. You agree to notify the Project of any facts or circumstances\n" -" of which you become aware that would make these representations\n" -" inaccurate in any respect.\n" -"\n" -" 9. The Project is under no obligations to accept and include every " -"contribution.\n" -"\n" -"\n" -" \n" -"\n" -"\n" -" If you agree to these terms and conditions, type \"I agree\" here: \n" -" Enter your full name here: \n" -" E-mail:" -msgstr "" - -#: fas/templates/cla/cla.txt:152 fas/templates/cla/click.html:17 -#: fas/templates/cla/view.html:22 -msgid "Date:" -msgstr "" - -#: fas/templates/cla/click.html:11 fas/templates/cla/sign.html:11 -#: fas/templates/cla/view.html:11 -msgid "Contributor License Agreement" -msgstr "" - -#: fas/templates/cla/click.html:14 fas/templates/cla/view.html:19 -msgid "If you agree to these terms and conditions, type \"I agree\" here:" -msgstr "" - -#: fas/templates/cla/click.html:15 fas/templates/cla/view.html:20 -#: fas/templates/user/edit.html:13 fas/templates/user/new.html:17 -msgid "Full Name:" -msgstr "" - -#: fas/templates/cla/click.html:16 fas/templates/cla/view.html:21 -msgid "E-mail:" -msgstr "" - -#: fas/templates/cla/index.html:10 -msgid "Fedora Contributor License Agreement" -msgstr "" - -#: fas/templates/cla/index.html:11 -msgid "There are two ways to sign the CLA..." -msgstr "" - -#: fas/templates/cla/index.html:12 -msgid "CLA Acceptance Hierarchies" -msgstr "" - -#: fas/templates/cla/index.html:15 -msgid "Signed CLA" -msgstr "" - -#: fas/templates/cla/index.html:16 -msgid "Click-through CLA" -msgstr "" - -#: fas/templates/cla/index.html:18 -msgid "Congratulations, you have already sucessfully signed the" -msgstr "" - -#: fas/templates/cla/index.html:19 fas/templates/user/view.html:27 -msgid "CLA" -msgstr "" - -#: fas/templates/cla/sign.html:12 fas/templates/cla/view.html:29 -msgid "Use the below link to download/save the CLA as fedora-icla-" -msgstr "" - -#: fas/templates/cla/sign.html:13 -msgid ".txt, run gpg -as fedora-icla-" -msgstr "" - -#: fas/templates/cla/sign.html:13 -msgid ".txt, and upload fedora-icla-" -msgstr "" - -#: fas/templates/cla/sign.html:13 fas/templates/cla/view.html:32 -msgid ".txt.asc in the form below." -msgstr "" - -#: fas/templates/cla/sign.html:15 fas/templates/cla/view.html:35 -msgid "Download the CLA text file here!" -msgstr "" - -#: fas/templates/cla/sign.html:19 fas/templates/cla/view.html:40 -msgid "Signed CLA:" -msgstr "" - -#: fas/templates/cla/view.html:30 -msgid ".txt, and run:" -msgstr "" - -#: fas/templates/cla/view.html:31 -msgid "gpg -as fedora-icla-" -msgstr "" - -#: fas/templates/cla/view.html:31 -msgid ".txt" -msgstr "" - -#: fas/templates/cla/view.html:31 -msgid "After, upload fedora-icla-" -msgstr "" - -#: fas/templates/group/edit.html:7 fas/templates/group/view.html:7 -msgid "Edit Group" -msgstr "" - -#: fas/templates/group/edit.html:10 -msgid "Edit Group:" -msgstr "" - -#: fas/templates/group/edit.html:13 fas/templates/group/new.html:17 -#: fas/templates/group/view.html:29 fas/templates/user/edit.html:41 -msgid "Description:" -msgstr "" - -#: fas/templates/group/edit.html:17 fas/templates/group/new.html:21 -msgid "Group Owner:" -msgstr "" - -#: fas/templates/group/edit.html:21 fas/templates/group/new.html:25 -#: fas/templates/group/view.html:32 -msgid "Needs Sponsor:" -msgstr "" - -#: fas/templates/group/edit.html:26 fas/templates/group/new.html:29 -msgid "Self Removal:" -msgstr "" - -#: fas/templates/group/edit.html:31 fas/templates/group/new.html:33 -msgid "Must Belong To:" -msgstr "" - -#: fas/templates/group/edit.html:35 -msgid "Group Join Message:" -msgstr "" - -#: fas/templates/group/list.html:7 -msgid "Groups List" -msgstr "" - -#: fas/templates/group/list.html:11 fas/templates/user/list.html:10 -msgid "List (" -msgstr "" - -#: fas/templates/group/list.html:12 -msgid "Search Groups" -msgstr "" - -#: fas/templates/group/list.html:14 fas/templates/user/list.html:12 -msgid "\"*\" is a wildcard (Ex: \"cvs*\")" -msgstr "" - -#: fas/templates/group/list.html:20 fas/templates/user/list.html:18 -msgid "Results" -msgstr "" - -#: fas/templates/group/list.html:23 fas/templates/user/list.html:21 -msgid "All" -msgstr "" - -#: fas/templates/group/list.html:28 -msgid "Group" -msgstr "" - -#: fas/templates/group/list.html:28 fas/templates/user/view.html:24 -msgid "Description" -msgstr "" - -#: fas/templates/group/list.html:28 -msgid "Status" -msgstr "" - -#: fas/templates/group/list.html:37 fas/templates/group/view.html:14 -#: fas/templates/user/view.html:26 fas/templates/user/view.html:47 -msgid "Approved" -msgstr "" - -#: fas/templates/group/list.html:38 fas/templates/group/view.html:15 -msgid "Unapproved" -msgstr "" - -#: fas/templates/group/list.html:40 -msgid "Apply" -msgstr "" - -#: fas/templates/group/new.html:7 fas/templates/group/new.html:10 -msgid "Create a new FAS Group" -msgstr "" - -#: fas/templates/group/new.html:13 -msgid "Group Name:" -msgstr "" - -#: fas/templates/group/new.html:37 fas/templates/group/view.html:40 -msgid "Join Message:" -msgstr "" - -#: fas/templates/group/view.html:12 -msgid "My Status:" -msgstr "" - -#: fas/templates/group/view.html:16 -msgid "Not a Member" -msgstr "" - -#: fas/templates/group/view.html:24 -msgid "Remove me" -msgstr "" - -#: fas/templates/group/view.html:25 -msgid "Group Details" -msgstr "" - -#: fas/templates/group/view.html:25 fas/templates/user/view.html:13 -msgid "(edit)" -msgstr "" - -#: fas/templates/group/view.html:28 -msgid "Name:" -msgstr "" - -#: fas/templates/group/view.html:30 -msgid "Owner:" -msgstr "" - -#: fas/templates/group/view.html:31 -msgid "Type:" -msgstr "" - -#: fas/templates/group/view.html:33 fas/templates/group/view.html:37 -msgid "Yes" -msgstr "" - -#: fas/templates/group/view.html:34 fas/templates/group/view.html:38 -msgid "No" -msgstr "" - -#: fas/templates/group/view.html:36 -msgid "Self Removal" -msgstr "" - -#: fas/templates/group/view.html:48 -msgid "Members" -msgstr "" - -#: fas/templates/group/view.html:52 fas/templates/user/list.html:26 -msgid "Username" -msgstr "" - -#: fas/templates/group/view.html:53 fas/templates/group/view.html:75 -msgid "Sponsor" -msgstr "" - -#: fas/templates/group/view.html:54 -msgid "Date Added" -msgstr "" - -#: fas/templates/group/view.html:55 -msgid "Date Approved" -msgstr "" - -#: fas/templates/group/view.html:56 -msgid "Approval" -msgstr "" - -#: fas/templates/group/view.html:57 -msgid "Role Type" -msgstr "" - -#: fas/templates/group/view.html:58 -msgid "Action" -msgstr "" - -#: fas/templates/group/view.html:64 -msgid "None" -msgstr "" - -#: fas/templates/group/view.html:77 -msgid "Approve" -msgstr "" - -#: fas/templates/group/view.html:80 -msgid "Remove" -msgstr "" - -#: fas/templates/group/view.html:83 -msgid "Upgrade" -msgstr "" - -#: fas/templates/group/view.html:86 -msgid "Downgrade" -msgstr "" - -#: fas/templates/user/changepass.html:7 fas/templates/user/changepass.html:10 -msgid "Change Password" -msgstr "" - -#: fas/templates/user/changepass.html:13 -msgid "Current Password:" -msgstr "" - -#: fas/templates/user/changepass.html:14 -msgid "New Password:" -msgstr "" - -#: fas/templates/user/changepass.html:15 -msgid "Confirm Password:" -msgstr "" - -#: fas/templates/user/edit.html:7 fas/templates/user/edit.html:10 -msgid "Edit Account" -msgstr "" - -#: fas/templates/user/edit.html:17 -msgid "Email:" -msgstr "" - -#: fas/templates/user/edit.html:21 -msgid "Bugzilla Email:" -msgstr "" - -#: fas/templates/user/edit.html:25 -msgid "IRC Nick:" -msgstr "" - -#: fas/templates/user/edit.html:29 -msgid "PGP Key:" -msgstr "" - -#: fas/templates/user/edit.html:33 -msgid "Telephone Number:" -msgstr "" - -#: fas/templates/user/edit.html:37 -msgid "Postal Address:" -msgstr "" - -#: fas/templates/user/list.html:7 -msgid "Users List" -msgstr "" - -#: fas/templates/user/list.html:27 fas/templates/user/view.html:26 -msgid "Account Status" -msgstr "" - -#: fas/templates/user/list.html:34 -msgid "CLA Done" -msgstr "" - -#: fas/templates/user/list.html:35 -msgid "CLA Not Done" -msgstr "" - -#: fas/templates/user/new.html:7 fas/templates/user/new.html:10 -msgid "Sign up for a Fedora account" -msgstr "" - -#: fas/templates/user/new.html:13 fas/templates/user/resetpass.html:13 -msgid "Username:" -msgstr "" - -#: fas/templates/user/new.html:21 fas/templates/user/view.html:18 -msgid "Email" -msgstr "" - -#: fas/templates/user/new.html:29 fas/templates/user/view.html:22 -msgid "Telephone Number" -msgstr "" - -#: fas/templates/user/new.html:33 fas/templates/user/view.html:23 -msgid "Postal Address" -msgstr "" - -#: fas/templates/user/resetpass.html:7 fas/templates/user/resetpass.html:10 -msgid "Reset Password" -msgstr "" - -#: fas/templates/user/resetpass.html:14 -msgid "Primary Email:" -msgstr "" - -#: fas/templates/user/resetpass.html:15 -msgid "Encrypt/Sign password reset email" -msgstr "" - -#: fas/templates/user/view.html:7 -msgid "View Account" -msgstr "" - -#: fas/templates/user/view.html:11 -msgid "Your Fedora Account" -msgstr "" - -#: fas/templates/user/view.html:12 -msgid "'s Fedora Account" -msgstr "" - -#: fas/templates/user/view.html:13 -msgid "Account Details" -msgstr "" - -#: fas/templates/user/view.html:16 -msgid "Account Name" -msgstr "" - -#: fas/templates/user/view.html:17 -msgid "Real Name" -msgstr "" - -#: fas/templates/user/view.html:19 -msgid "Bugzilla Email" -msgstr "" - -#: fas/templates/user/view.html:20 -msgid "IRC Nick" -msgstr "" - -#: fas/templates/user/view.html:21 -msgid "PGP Key" -msgstr "" - -#: fas/templates/user/view.html:25 -msgid "Password" -msgstr "" - -#: fas/templates/user/view.html:25 -msgid "Valid" -msgstr "" - -#: fas/templates/user/view.html:25 -msgid "(change)" -msgstr "" - -#: fas/templates/user/view.html:26 fas/templates/user/view.html:47 -msgid ", Active" -msgstr "" - -#: fas/templates/user/view.html:27 -msgid "Done" -msgstr "" - -#: fas/templates/user/view.html:27 -msgid "Not Done" -msgstr "" - -#: fas/templates/user/view.html:30 -msgid "Your Roles" -msgstr "" - -#: fas/templates/user/view.html:31 -msgid "'s Roles" -msgstr "" - -#: fas/templates/user/view.html:37 -msgid "(Join another project)" -msgstr "" - -#: fas/templates/user/view.html:38 -msgid "(Create a new project)" -msgstr "" - -#: fas/templates/user/view.html:45 -msgid "Status:" -msgstr "" - -#: fas/templates/user/view.html:49 -msgid "Tools:" -msgstr "" - -#: fas/templates/user/view.html:52 -msgid "Invite a New Member..." -msgstr "" - -#: fas/templates/user/view.html:53 -msgid "View All Pending Group Membership Requests..." -msgstr "" - -#: fas/templates/user/view.html:54 -msgid "Manage Group Membership..." -msgstr "" - -#: fas/templates/user/view.html:55 -msgid "Manage Group Details..." -msgstr "" - -#: fas/templates/user/view.html:59 -msgid "Queue:" -msgstr "" - -#: fas/templates/user/view.html:62 -msgid "Chewbacca D. Wookiee requests approval to join project as a" -msgstr "" - -#: fas/templates/user/view.html:62 fas/templates/user/view.html:63 -#: fas/templates/user/view.html:64 -msgid "user" -msgstr "" - -#: fas/templates/user/view.html:63 -msgid "Gaius Baltar requests approval to upgrade from" -msgstr "" - -#: fas/templates/user/view.html:63 fas/templates/user/view.html:64 -msgid "to" -msgstr "" - -#: fas/templates/user/view.html:63 -msgid "sponsor" -msgstr "" - -#: fas/templates/user/view.html:64 -msgid "Leia Organa requests approval to upgrade from" -msgstr "" - -#: fas/templates/user/view.html:64 -msgid "administrator" -msgstr "" - diff --git a/fas/po/test/LC_MESSAGES/fas.po b/fas/po/test/LC_MESSAGES/fas.po new file mode 100644 index 0000000..6e99422 --- /dev/null +++ b/fas/po/test/LC_MESSAGES/fas.po @@ -0,0 +1,1240 @@ +# Translations template for PROJECT. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2008. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-03-03 00:46-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.1\n" + +#: client/fasClient.py:42 +msgid "Download and sync most recent content" +msgstr "test" + +#: client/fasClient.py:47 +msgid "Do not sync group information" +msgstr "test" + +#: client/fasClient.py:52 +msgid "Do not sync passwd information" +msgstr "test" + +#: client/fasClient.py:57 +msgid "Do not sync shadow information" +msgstr "test" + +#: client/fasClient.py:62 +#, python-format +msgid "Specify URL of fas server (default \"%default\")" +msgstr "test" + +#: client/fasClient.py:67 +msgid "Enable FAS synced shell accounts" +msgstr "test" + +#: client/fasClient.py:72 +msgid "Disable FAS synced shell accounts" +msgstr "test" + +#: fas/auth.py:87 +msgid "cla_sign_group Does not exist! Please create it!" +msgstr "test" + +#: fas/auth.py:101 +msgid "cla_click_group Does not exist! Please create it!" +msgstr "test" + +#: fas/auth.py:168 fas/auth.py:176 +#, python-format +msgid "%s membership required before application to this group is allowed" +msgstr "test" + +#: fas/cla.py:52 fas/cla.py:178 +msgid "test" +"You have already signed the CLA, so it is unnecessary to complete the " +"Click-through CLA." +msgstr "test" + +#: fas/cla.py:56 fas/cla.py:182 +msgid "You have already completed the Click-through CLA." +msgstr "test" + +#: fas/cla.py:61 fas/cla.py:87 +msgid "You have already signed the CLA." +msgstr "test" + +#: fas/cla.py:100 fas/user.py:380 +msgid "Your key could not be retrieved from subkeys.pgp.net" +msgstr "test" + +#: fas/cla.py:107 +#, python-format +msgid "Your signature could not be verified: '%s'." +msgstr "test" + +#: fas/cla.py:117 +msgid "test" +"Your signature's fingerprint did not match the fingerprint registered in " +"FAS." +msgstr "test" + +#: fas/cla.py:126 +msgid "Your key did not match your email." +msgstr "test" + +#: fas/cla.py:131 +msgid "len(sigs) == 0" +msgstr "test" + +#: fas/cla.py:137 +msgid "The GPG-signed part of the message did not contain a signed CLA." +msgstr "test" + +#: fas/cla.py:142 +msgid "The text \"I agree\" was not found in the CLA." +msgstr "test" + +#: fas/cla.py:156 fas/cla.py:194 +#, python-format +msgid "You could not be added to the '%s' group." +msgstr "test" + +#: fas/cla.py:165 +#, python-format +msgid "You have successfully signed the CLA. You are now in the '%s' group." +msgstr "test" + +#: fas/cla.py:198 +#, python-format +msgid "test" +"You have successfully agreed to the click-through CLA. You are now in " +"the '%s' group." +msgstr "test" + +#: fas/cla.py:202 +msgid "You have not agreed to the click-through CLA." +msgstr "test" + +#: fas/controllers.py:84 +#, python-format +msgid "Welcome, %s" +msgstr "test" + +#: fas/controllers.py:99 +msgid "test" +"The credentials you supplied were not correct or did not grant access to " +"this resource." +msgstr "test" + +#: fas/controllers.py:102 +msgid "You must provide your credentials before accessing this resource." +msgstr "test" + +#: fas/controllers.py:105 +msgid "Please log in." +msgstr "test" + +#: fas/controllers.py:116 +msgid "You have successfully logged out." +msgstr "test" + +#: fas/group.py:21 +#, python-format +msgid "The group '%s' does not exist." +msgstr "test" + +#: fas/group.py:33 +#, python-format +msgid "The group '%s' already exists." +msgstr "test" + +#: fas/group.py:129 fas/group.py:467 +#, python-format +msgid "You cannot view '%s'" +msgstr "test" + +#: fas/group.py:143 fas/group.py:159 +msgid "Only FAS adminstrators can create groups." +msgstr "test" + +#: fas/group.py:177 +#, python-format +msgid "The group: '%s' could not be created." +msgstr "test" + +#: fas/group.py:187 +#, python-format +msgid "test" +"The group: '%(group)s' has been created, but '%(user)s' could not be " +"added as a group administrator." +msgstr "test" + +#: fas/group.py:189 +#, python-format +msgid "The group: '%s' has been created." +msgstr "test" + +#: fas/group.py:204 fas/group.py:219 +#, python-format +msgid "You cannot edit '%s'." +msgstr "test" + +#: fas/group.py:236 +msgid "The group details could not be saved." +msgstr "test" + +#: fas/group.py:238 +msgid "The group details have been saved." +msgstr "test" + +#: fas/group.py:257 +#, python-format +msgid "No Groups found matching '%s'" +msgstr "test" + +#: fas/group.py:283 +#, python-format +msgid "%(user)s has already applied to %(group)s!" +msgstr "test" + +#: fas/group.py:293 +#, python-format +msgid "test" +"\n" +"Fedora user %(user)s, aka %(name)s <%(email)s> has requested\n" +"membership for %(applicant)s (%(applicant_name)s) in the %(group)s group " +"and needs a sponsor.\n" +"\n" +"Please go to %(url)s to take action. \n" +msgstr "test" + +#: fas/group.py:300 +#, python-format +msgid "%(user)s has applied to %(group)s!" +msgstr "test" + +#: fas/group.py:317 +#, python-format +msgid "You cannot sponsor '%s'" +msgstr "test" + +#: fas/group.py:324 +#, python-format +msgid "'%s' could not be sponsored!" +msgstr "test" + +#: fas/group.py:329 +#, python-format +msgid "test" +"\n" +"%(name)s <%(email)s> has sponsored you for membership in the %(group)s\n" +"group of the Fedora account system. If applicable, this change should\n" +"propagate into the e-mail aliases and CVS repository within an hour.\n" +"\n" +"%(joinmsg)s\n" +msgstr "test" + +#: fas/group.py:337 +#, python-format +msgid "'%s' has been sponsored!" +msgstr "test" + +#: fas/group.py:354 +#, python-format +msgid "You cannot remove '%s'." +msgstr "test" + +#: fas/group.py:361 +#, python-format +msgid "%(name)s could not be removed from %(group)s!" +msgstr "test" + +#: fas/group.py:367 +#, python-format +msgid "test" +"\n" +"%(name)s <%(email)s> has removed you from the '%(group)s'\n" +"group of the Fedora Accounts System This change is effective\n" +"immediately for new operations, and should propagate into the e-mail\n" +"aliases within an hour.\n" +msgstr "test" + +#: fas/group.py:374 +#, python-format +msgid "%(name)s has been removed from %(group)s!" +msgstr "test" + +#: fas/group.py:391 +#, python-format +msgid "You cannot upgrade '%s'" +msgstr "test" + +#: fas/group.py:401 +#, python-format +msgid "%(name)s could not be upgraded!" +msgstr "test" + +#: fas/group.py:409 +#, python-format +msgid "test" +"\n" +"%(name)s <%(email)s> has upgraded you to %(status)s status in the\n" +"'%(group)s' group of the Fedora Accounts System This change is\n" +"effective immediately for new operations, and should propagate\n" +"into the e-mail aliases within an hour.\n" +msgstr "test" + +#: fas/group.py:416 +#, python-format +msgid "%s has been upgraded!" +msgstr "test" + +#: fas/group.py:432 +#, python-format +msgid "You cannot downgrade '%s'" +msgstr "test" + +#: fas/group.py:439 +#, python-format +msgid "%(username)s could not be downgraded!" +msgstr "test" + +#: fas/group.py:446 +#, python-format +msgid "test" +"\n" +"%(name)s <%(email)s> has downgraded you to %(status)s status in the\n" +"'%(group)s' group of the Fedora Accounts System This change is\n" +"effective immediately for new operations, and should propagate\n" +"into the e-mail aliases within an hour.\n" +msgstr "test" + +#: fas/group.py:453 +#, python-format +msgid "%s has been downgraded!" +msgstr "test" + +#: fas/group.py:495 +msgid "Come join The Fedora Project!" +msgstr "test" + +#: fas/group.py:496 +#, python-format +msgid "test" +"\n" +"%(name)s <%(email)s> has invited you to join the Fedora\n" +"Project! We are a community of users and developers who produce a\n" +"complete operating system from entirely free and open source software\n" +"(FOSS). %(name)s thinks that you have knowledge and skills\n" +"that make you a great fit for the Fedora community, and that you might\n" +"be interested in contributing.\n" +"\n" +"How could you team up with the Fedora community to use and develop your\n" +"skills? Check out http://fedoraproject.org/join-fedora for some ideas.\n" +"Our community is more than just software developers -- we also have a\n" +"place for you whether you're an artist, a web site builder, a writer, or\n" +"a people person. You'll grow and learn as you work on a team with other\n" +"very smart and talented people.\n" +"\n" +"Fedora and FOSS are changing the world -- come be a part of it!" +msgstr "test" + +#: fas/group.py:513 +#, python-format +msgid "Message sent to: %s" +msgstr "test" + +#: fas/group.py:516 +#, python-format +msgid "You are not in the '%s' group." +msgstr "test" + +#: fas/openid_fas.py:55 +msgid "The OpenID request could not be decoded." +msgstr "test" + +#: fas/safasprovider.py:126 +#, python-format +msgid "Loading: %(visitmod)s" +msgstr "test" + +#: fas/user.py:33 +#, python-format +msgid "'%s' does not exist." +msgstr "test" + +#: fas/user.py:41 +msgid "To prevent email loops, your email address cannot be @fedoraproject.org." +msgstr "test" + +#: fas/user.py:53 +#, python-format +msgid "Error: Could not create - '%s'" +msgstr "test" + +#: fas/user.py:55 +#, python-format +msgid "'%s' already exists." +msgstr "test" + +#: fas/user.py:64 +#, python-format +msgid "'%s' is an illegal username." +msgstr "test" + +#: fas/user.py:196 +#, python-format +msgid "You cannot edit %s" +msgstr "test" + +#: fas/user.py:211 +#, python-format +msgid "You do not have permission to edit '%s'" +msgstr "test" + +#: fas/user.py:226 +#, python-format +msgid "Your account details could not be saved: %s" +msgstr "test" + +#: fas/user.py:228 +msgid "Your account details have been saved." +msgstr "test" + +#: fas/user.py:242 +#, python-format +msgid "No users found matching '%s'" +msgstr "test" + +#: fas/user.py:248 +msgid "No need to sign up, you have an account!" +msgstr "test" + +#: fas/user.py:269 +msgid "Welcome to the Fedora Project!" +msgstr "test" + +#: fas/user.py:270 +#, python-format +msgid "test" +"\n" +"You have created a new Fedora account!\n" +"Your new password is: %s\n" +"\n" +"Please go to https://admin.fedoraproject.org/fas/ to change it.\n" +"\n" +"Welcome to the Fedora Project. Now that you've signed up for an\n" +"account you're probably desperate to start contributing, and with that\n" +"in mind we hope this e-mail might guide you in the right direction to\n" +"make this process as easy as possible.\n" +"\n" +"Fedora is an exciting project with lots going on, and you can\n" +"contribute in a huge number of ways, using all sorts of different\n" +"skill sets. To find out about the different ways you can contribute to\n" +"Fedora, you can visit our join page which provides more information\n" +"about all the different roles we have available.\n" +"\n" +"http://fedoraproject.org/en/join-fedora\n" +"\n" +"If you already know how you want to contribute to Fedora, and have\n" +"found the group already working in the area you're interested in, then\n" +"there are a few more steps for you to get going.\n" +"\n" +"Foremost amongst these is to sign up for the team or project's mailing\n" +"list that you're interested in - and if you're interested in more than\n" +"one group's work, feel free to sign up for as many mailing lists as\n" +"you like! This is because mailing lists are where the majority of work\n" +"gets organised and tasks assigned, so to stay in the loop be sure to\n" +"keep up with the messages.\n" +"\n" +"Once this is done, it's probably wise to send a short introduction to\n" +"the list letting them know what experience you have and how you'd like\n" +"to help. From here, existing members of the team will help you to find\n" +"your feet as a Fedora contributor.\n" +"\n" +"And finally, from all of us here at the Fedora Project, we're looking\n" +"forward to working with you!\n" +msgstr "test" + +#: fas/user.py:310 +msgid "test" +"Your password has been emailed to you. Please log in with it and change " +"your password" +msgstr "test" + +#: fas/user.py:313 +#, python-format +msgid "The username '%s' already Exists. Please choose a different username." +msgstr "test" + +#: fas/user.py:338 +msgid "Your password has been changed." +msgstr "test" + +#: fas/user.py:341 +msgid "Your password could not be changed." +msgstr "test" + +#: fas/user.py:347 +msgid "You are already logged in!" +msgstr "test" + +#: fas/user.py:356 +msgid "You are already logged in." +msgstr "test" + +#: fas/user.py:362 +msgid "username + email combo unknown." +msgstr "test" + +#: fas/user.py:365 +msgid "Fedora Project Password Reset" +msgstr "test" + +#: fas/user.py:366 +#, python-format +msgid "test" +"\n" +"You have requested a password reset!\n" +"Your new password is: %s\n" +"\n" +"Please go to https://admin.fedoraproject.org/fas/ to change it.\n" +msgstr "test" + +#: fas/user.py:399 +msgid "test" +"Your password reset email could not be encrypted. Your password has not " +"been changed." +msgstr "test" + +#: fas/user.py:406 +msgid "Your new password has been emailed to you." +msgstr "test" + +#: fas/user.py:408 +msgid "Your password could not be reset." +msgstr "test" + +#: fas/templates/error.html:7 fas/templates/home.html:7 +#: fas/templates/cla/click.html:7 fas/templates/cla/index.html:7 +#: fas/templates/cla/view.html:7 fas/templates/openid/about.html:7 +#: fas/templates/openid/id.html:7 fas/templates/openid/trusted.html:7 +msgid "Fedora Accounts System" +msgstr "test" + +#: fas/templates/error.html:17 +msgid "Error!" +msgstr "test" + +#: fas/templates/error.html:18 +msgid "The following error(s) have occured with your request:" +msgstr "test" + +#: fas/templates/login.html:7 +msgid "Login to the Fedora Accounts System" +msgstr "test" + +#: fas/templates/login.html:17 fas/templates/login.html:23 +msgid "Login" +msgstr "test" + +#: fas/templates/login.html:20 +msgid "User Name:" +msgstr "test" + +#: fas/templates/login.html:21 fas/templates/user/view.html:25 +msgid "Password:" +msgstr "test" + +#: fas/templates/login.html:29 +msgid "Forgot Password?" +msgstr "test" + +#: fas/templates/login.html:30 +msgid "Sign Up" +msgstr "test" + +#: fas/templates/master.html:22 +msgid "Fedora" +msgstr "test" + +#: fas/templates/master.html:25 +msgid "Search:" +msgstr "test" + +#: fas/templates/master.html:27 fas/templates/group/list.html:25 +msgid "Search" +msgstr "test" + +#: fas/templates/master.html:33 +msgid "Learn about Fedora" +msgstr "test" + +#: fas/templates/master.html:34 +msgid "Download Fedora" +msgstr "test" + +#: fas/templates/master.html:35 +msgid "Projects" +msgstr "test" + +#: fas/templates/master.html:36 +msgid "Join Fedora" +msgstr "test" + +#: fas/templates/master.html:37 +msgid "Communicate" +msgstr "test" + +#: fas/templates/master.html:38 +msgid "Help/Documentation" +msgstr "test" + +#: fas/templates/master.html:44 +msgid "Logged in:" +msgstr "test" + +#: fas/templates/master.html:49 +msgid "My Account" +msgstr "test" + +#: fas/templates/master.html:50 fas/templates/master.html:87 +msgid "Log Out" +msgstr "test" + +#: fas/templates/master.html:51 fas/templates/welcome.html:21 +msgid "Log In" +msgstr "test" + +#: fas/templates/master.html:58 +msgid "Group List" +msgstr "test" + +#: fas/templates/master.html:61 +msgid "User List" +msgstr "test" + +#: fas/templates/master.html:62 +msgid "New Group" +msgstr "test" + +#: fas/templates/master.html:64 +msgid "Apply For a new Group" +msgstr "test" + +#: fas/templates/master.html:65 +msgid "News" +msgstr "test" + +#: fas/templates/master.html:69 +msgid "Locale:" +msgstr "test" + +#: fas/templates/master.html:71 +msgid "OK" +msgstr "test" + +#: fas/templates/master.html:83 +msgid "About" +msgstr "test" + +#: fas/templates/master.html:84 +msgid "Contact Us" +msgstr "test" + +#: fas/templates/master.html:85 +msgid "Legal & Privacy" +msgstr "test" + +#: fas/templates/master.html:90 +msgid "test" +"Copyright © 2007 Red Hat, Inc. and others. All Rights Reserved. Please " +"send any comments or corrections to the websites team." +msgstr "test" + +#: fas/templates/master.html:93 +msgid "test" +"The Fedora Project is maintained and driven by the community and " +"sponsored by Red Hat. This is a community maintained site. Red Hat is " +"not responsible for content." +msgstr "test" + +#: fas/templates/welcome.html:7 +msgid "Welcome to FAS2" +msgstr "test" + +#: fas/templates/welcome.html:18 +msgid "test" +"Welcome to the Fedora Accounts System 2. This system is not yet live so " +"feel free to play around. Just don't expect it to work." +msgstr "test" + +#: fas/templates/welcome.html:22 +msgid "New Account" +msgstr "test" + +#: fas/templates/welcome.html:23 +msgid "Why Join?" +msgstr "test" + +#: fas/templates/cla/click.html:11 fas/templates/cla/view.html:11 +msgid "Contributor License Agreement" +msgstr "test" + +#: fas/templates/cla/click.html:15 fas/templates/cla/view.html:20 +#, python-format +msgid "If you agree to these terms and conditions, type \"%s\" here:" +msgstr "test" + +#: fas/templates/cla/click.html:16 fas/templates/cla/view.html:21 +#: fas/templates/user/new.html:17 +msgid "Full Name:" +msgstr "test" + +#: fas/templates/cla/click.html:17 fas/templates/cla/view.html:22 +msgid "E-mail:" +msgstr "test" + +#: fas/templates/cla/click.html:18 fas/templates/cla/view.html:23 +msgid "Date:" +msgstr "test" + +#: fas/templates/cla/click.html:19 fas/templates/cla/view.html:24 +#: fas/templates/cla/view.html:38 +msgid "Submit CLA" +msgstr "test" + +#: fas/templates/cla/index.html:10 +msgid "Fedora Contributor License Agreement" +msgstr "test" + +#: fas/templates/cla/index.html:12 +msgid "test" +"There are two ways to sign the CLA. Most users will want to do a signed " +"CLA as it will promote them to a full contributor in Fedora. The click-" +"through CLA only grants partial access but may be preferred for those " +"with special legal considerations. See: CLA" +" Acceptance Hierarchies for more information." +msgstr "test" + +#: fas/templates/cla/index.html:15 fas/templates/user/list.html:42 +#: fas/templates/user/view.html:30 +msgid "Signed CLA" +msgstr "test" + +#: fas/templates/cla/index.html:16 fas/templates/user/list.html:43 +#: fas/templates/user/view.html:31 +msgid "Click-through CLA" +msgstr "test" + +#: fas/templates/cla/index.html:19 +#, python-format +msgid "You have already sucessfully signed the CLA." +msgstr "test" + +#: fas/templates/cla/view.html:30 +#, python-format +msgid "test" +"Use the below link to download/save the CLA as fedora-" +"icla-%(username)s.txt, and run:
    gpg -as fedora-"
    +"icla-%(username)s.txt
    After, upload fedora-" +"icla-%(username)s.txt.asc in the form below." +msgstr "test" + +#: fas/templates/cla/view.html:33 +msgid "Download the CLA text file here!" +msgstr "test" + +#: fas/templates/cla/view.html:37 +msgid "Signed CLA:" +msgstr "test" + +#: fas/templates/group/edit.html:7 fas/templates/group/view.html:7 +msgid "Edit Group" +msgstr "test" + +#: fas/templates/group/edit.html:10 +#, python-format +msgid "Edit Group: %s" +msgstr "test" + +#: fas/templates/group/edit.html:13 fas/templates/group/new.html:17 +msgid "Display Name:" +msgstr "test" + +#: fas/templates/group/edit.html:17 fas/templates/group/new.html:25 +msgid "Group Type:" +msgstr "test" + +#: fas/templates/group/edit.html:21 fas/templates/group/new.html:21 +msgid "Group Owner:" +msgstr "test" + +#: fas/templates/group/edit.html:25 fas/templates/group/new.html:29 +#: fas/templates/group/view.html:38 +msgid "Needs Sponsor:" +msgstr "test" + +#: fas/templates/group/edit.html:30 fas/templates/group/new.html:33 +#: fas/templates/group/view.html:42 +msgid "Self Removal:" +msgstr "test" + +#: fas/templates/group/edit.html:35 +msgid "Group Prerequisite:" +msgstr "test" + +#: fas/templates/group/edit.html:40 +msgid "Group Join Message:" +msgstr "test" + +#: fas/templates/group/edit.html:44 fas/templates/user/edit.html:73 +msgid "Save!" +msgstr "test" + +#: fas/templates/group/invite.html:7 fas/templates/group/invite.html:10 +msgid "Invite a new community member!" +msgstr "test" + +#: fas/templates/group/invite.html:14 +msgid "To email:" +msgstr "test" + +#: fas/templates/group/invite.html:15 +msgid "From:" +msgstr "test" + +#: fas/templates/group/invite.html:16 +msgid "Subject:" +msgstr "test" + +#: fas/templates/group/invite.html:17 +msgid "Message:" +msgstr "test" + +#: fas/templates/group/invite.html:39 +msgid "Send!" +msgstr "test" + +#: fas/templates/group/list.html:7 +msgid "Groups List" +msgstr "test" + +#: fas/templates/group/list.html:19 fas/templates/user/list.html:11 +#, python-format +msgid "List (%s)" +msgstr "test" + +#: fas/templates/group/list.html:20 +msgid "Search Groups" +msgstr "test" + +#: fas/templates/group/list.html:22 +msgid "\"*\" is a wildcard (Ex: \"cvs*\")" +msgstr "test" + +#: fas/templates/group/list.html:28 fas/templates/user/list.html:19 +msgid "Results" +msgstr "test" + +#: fas/templates/group/list.html:31 fas/templates/user/list.html:22 +msgid "All" +msgstr "test" + +#: fas/templates/group/list.html:36 +msgid "Group" +msgstr "test" + +#: fas/templates/group/list.html:36 +msgid "Description" +msgstr "test" + +#: fas/templates/group/list.html:36 +msgid "Status" +msgstr "test" + +#: fas/templates/group/list.html:44 fas/templates/group/view.html:20 +#: fas/templates/user/view.html:56 +msgid "Approved" +msgstr "test" + +#: fas/templates/group/list.html:45 fas/templates/group/view.html:21 +#: fas/templates/user/view.html:57 +msgid "Unapproved" +msgstr "test" + +#: fas/templates/group/list.html:47 +msgid "Apply" +msgstr "test" + +#: fas/templates/group/new.html:7 fas/templates/group/new.html:10 +msgid "Create a new FAS Group" +msgstr "test" + +#: fas/templates/group/new.html:13 +msgid "Group Name:" +msgstr "test" + +#: fas/templates/group/new.html:37 +msgid "Must Belong To:" +msgstr "test" + +#: fas/templates/group/new.html:41 fas/templates/group/view.html:46 +msgid "Join Message:" +msgstr "test" + +#: fas/templates/group/new.html:45 +msgid "Create!" +msgstr "test" + +#: fas/templates/group/view.html:19 +msgid "My Status:" +msgstr "test" + +#: fas/templates/group/view.html:22 +msgid "Not a Member" +msgstr "test" + +#: fas/templates/group/view.html:30 +msgid "Remove me" +msgstr "test" + +#: fas/templates/group/view.html:31 fas/templates/user/view.html:13 +msgid "(edit)" +msgstr "test" + +#: fas/templates/group/view.html:34 fas/templates/openid/id.html:16 +msgid "Name:" +msgstr "test" + +#: fas/templates/group/view.html:35 +msgid "Description:" +msgstr "test" + +#: fas/templates/group/view.html:36 +msgid "Owner:" +msgstr "test" + +#: fas/templates/group/view.html:37 +msgid "Type:" +msgstr "test" + +#: fas/templates/group/view.html:39 fas/templates/group/view.html:43 +msgid "Yes" +msgstr "test" + +#: fas/templates/group/view.html:40 fas/templates/group/view.html:44 +msgid "No" +msgstr "test" + +#: fas/templates/group/view.html:47 +msgid "Prerequisite:" +msgstr "test" + +#: fas/templates/group/view.html:50 +msgid "Created:" +msgstr "test" + +#: fas/templates/group/view.html:58 +msgid "Members" +msgstr "test" + +#: fas/templates/group/view.html:62 fas/templates/user/list.html:27 +msgid "Username" +msgstr "test" + +#: fas/templates/group/view.html:63 fas/templates/group/view.html:83 +msgid "Sponsor" +msgstr "test" + +#: fas/templates/group/view.html:64 +msgid "Date Added" +msgstr "test" + +#: fas/templates/group/view.html:65 +msgid "Date Approved" +msgstr "test" + +#: fas/templates/group/view.html:66 +msgid "Approval" +msgstr "test" + +#: fas/templates/group/view.html:67 +msgid "Role Type" +msgstr "test" + +#: fas/templates/group/view.html:68 +msgid "Action" +msgstr "test" + +#: fas/templates/group/view.html:74 +msgid "None" +msgstr "test" + +#: fas/templates/group/view.html:84 +msgid "Approve" +msgstr "test" + +#: fas/templates/group/view.html:87 +msgid "Remove" +msgstr "test" + +#: fas/templates/group/view.html:90 +msgid "Upgrade" +msgstr "test" + +#: fas/templates/group/view.html:93 +msgid "Downgrade" +msgstr "test" + +#: fas/templates/openid/about.html:10 fas/templates/openid/trusted.html:10 +msgid "Fedora Project OpenID Provider" +msgstr "test" + +#: fas/templates/openid/id.html:11 +#, python-format +msgid "User %s" +msgstr "test" + +#: fas/templates/openid/id.html:14 fas/templates/user/new.html:13 +#: fas/templates/user/resetpass.html:13 +msgid "Username:" +msgstr "test" + +#: fas/templates/openid/trusted.html:15 +#, python-format +msgid "Allow %s to authenticate to your OpenID identity?" +msgstr "test" + +#: fas/templates/openid/trusted.html:16 +msgid "Submit" +msgstr "test" + +#: fas/templates/user/changepass.html:7 fas/templates/user/changepass.html:10 +#: fas/templates/user/changepass.html:16 +msgid "Change Password" +msgstr "test" + +#: fas/templates/user/changepass.html:13 +msgid "Current Password:" +msgstr "test" + +#: fas/templates/user/changepass.html:14 +msgid "New Password:" +msgstr "test" + +#: fas/templates/user/changepass.html:15 +msgid "Confirm Password:" +msgstr "test" + +#: fas/templates/user/edit.html:7 +msgid "Edit Account" +msgstr "test" + +#: fas/templates/user/edit.html:10 +#, python-format +msgid "Edit Account (%s)" +msgstr "test" + +#: fas/templates/user/edit.html:13 +msgid "Human Name" +msgstr "test" + +#: fas/templates/user/edit.html:19 +msgid "Email" +msgstr "test" + +#: fas/templates/user/edit.html:28 +msgid "IRC Nick" +msgstr "test" + +#: fas/templates/user/edit.html:33 +msgid "PGP Key" +msgstr "test" + +#: fas/templates/user/edit.html:38 +msgid "Telephone Number" +msgstr "test" + +#: fas/templates/user/edit.html:43 +msgid "Postal Address" +msgstr "test" + +#: fas/templates/user/edit.html:48 +msgid "Time Zone" +msgstr "test" + +#: fas/templates/user/edit.html:58 +msgid "Locale" +msgstr "test" + +#: fas/templates/user/edit.html:68 +msgid "Comments" +msgstr "test" + +#: fas/templates/user/edit.html:74 +msgid "Cancel" +msgstr "test" + +#: fas/templates/user/list.html:7 +msgid "Users List" +msgstr "test" + +#: fas/templates/user/list.html:13 +msgid "\"*\" is a wildcard (Ex: \"ric*\")" +msgstr "test" + +#: fas/templates/user/list.html:28 +msgid "Account Status" +msgstr "test" + +#: fas/templates/user/list.html:44 fas/templates/user/view.html:32 +msgid "Not Done" +msgstr "test" + +#: fas/templates/user/new.html:7 fas/templates/user/new.html:10 +msgid "Sign up for a Fedora account" +msgstr "test" + +#: fas/templates/user/new.html:21 fas/templates/user/view.html:18 +msgid "Email:" +msgstr "test" + +#: fas/templates/user/new.html:31 fas/templates/user/view.html:22 +msgid "Telephone Number:" +msgstr "test" + +#: fas/templates/user/new.html:35 fas/templates/user/view.html:23 +msgid "Postal Address:" +msgstr "test" + +#: fas/templates/user/new.html:39 +msgid "Sign up!" +msgstr "test" + +#: fas/templates/user/resetpass.html:7 fas/templates/user/resetpass.html:10 +#: fas/templates/user/resetpass.html:16 +msgid "Reset Password" +msgstr "test" + +#: fas/templates/user/resetpass.html:14 +msgid "Primary Email:" +msgstr "test" + +#: fas/templates/user/resetpass.html:15 +msgid "Encrypt/Sign password reset email" +msgstr "test" + +#: fas/templates/user/view.html:7 +msgid "View Account" +msgstr "test" + +#: fas/templates/user/view.html:11 +msgid "Your Fedora Account" +msgstr "test" + +#: fas/templates/user/view.html:12 +#, python-format +msgid "%s's Fedora Account" +msgstr "test" + +#: fas/templates/user/view.html:13 +msgid "Account Details" +msgstr "test" + +#: fas/templates/user/view.html:16 +msgid "Account Name:" +msgstr "test" + +#: fas/templates/user/view.html:17 +msgid "Real Name:" +msgstr "test" + +#: fas/templates/user/view.html:20 +msgid "IRC Nick:" +msgstr "test" + +#: fas/templates/user/view.html:21 +msgid "PGP Key:" +msgstr "test" + +#: fas/templates/user/view.html:24 +msgid "Comments:" +msgstr "test" + +#: fas/templates/user/view.html:25 fas/templates/user/view.html:26 +msgid "Valid" +msgstr "test" + +#: fas/templates/user/view.html:26 +msgid "Account Status:" +msgstr "test" + +#: fas/templates/user/view.html:29 +msgid "CLA:" +msgstr "test" + +#: fas/templates/user/view.html:31 +msgid "GPG Sign it!" +msgstr "test" + +#: fas/templates/user/view.html:32 +msgid "Sign it!" +msgstr "test" + +#: fas/templates/user/view.html:36 +msgid "Your Roles" +msgstr "test" + +#: fas/templates/user/view.html:37 +#, python-format +msgid "%s's Roles" +msgstr "test" + +#: fas/templates/user/view.html:54 +msgid "Status:" +msgstr "test" + +#: fas/templates/user/view.html:59 +msgid "Tools:" +msgstr "test" + +#: fas/templates/user/view.html:62 +msgid "View Group" +msgstr "test" + +#: fas/templates/user/view.html:63 +msgid "Invite a New Member..." +msgstr "test" + +#: fas/templates/user/view.html:64 +msgid "Manage Group Membership..." +msgstr "test" + +#: fas/templates/user/view.html:65 +msgid "Manage Group Details..." +msgstr "test" + +#: fas/templates/user/view.html:69 +msgid "Queue:" +msgstr "test" + +#: fas/templates/user/view.html:73 +#, python-format +msgid "test" +"%(user)s requests approval to join " +"%(group)s." +msgstr "test" + diff --git a/fas/pybabel.conf b/fas/pybabel.conf index e6b9ded..7c7997f 100644 --- a/fas/pybabel.conf +++ b/fas/pybabel.conf @@ -5,10 +5,12 @@ # Extraction from Genshi HTML and text templates [genshi: **/templates/**.html] -ignore_tags = script,style -include_attrs = alt title summary +extract_text = False +#ignore_tags = script,style +#include_attrs = alt title summary -[genshi: **/templates/**.txt] -template_class = genshi.template:TextTemplate -encoding = UTF-8 +#[genshi: **/templates/**.txt] +#template_class = genshi.template:TextTemplate +#extract_text = False +#encoding = UTF-8