Merge branch 'master' of ssh://git.fedorahosted.org/git/fedora-infrastructure
This commit is contained in:
commit
7b8c4f801b
9 changed files with 134 additions and 102 deletions
|
@ -201,7 +201,7 @@ class MakeShellAccounts(BaseClient):
|
||||||
return '/sbin/nologin'
|
return '/sbin/nologin'
|
||||||
|
|
||||||
def install_aliases_txt(self):
|
def install_aliases_txt(self):
|
||||||
move(self.temp + '/aliases', '/tmp/aliases')
|
move(self.temp + '/aliases', '/etc/aliases')
|
||||||
|
|
||||||
def passwd_text(self, people=None):
|
def passwd_text(self, people=None):
|
||||||
i = 0
|
i = 0
|
||||||
|
@ -397,15 +397,21 @@ class MakeShellAccounts(BaseClient):
|
||||||
for group in self.groups:
|
for group in self.groups:
|
||||||
name = group['name']
|
name = group['name']
|
||||||
members = {}
|
members = {}
|
||||||
|
members['member'] = []
|
||||||
for membership in self.memberships[name]:
|
for membership in self.memberships[name]:
|
||||||
role_type = membership['role_type']
|
role_type = membership['role_type']
|
||||||
person = usernames[membership['person_id']]
|
person = usernames[membership['person_id']]
|
||||||
|
if role_type == 'user':
|
||||||
|
''' Legacy support '''
|
||||||
|
members['member'].append(person)
|
||||||
|
continue
|
||||||
|
members['member'].append(person)
|
||||||
try:
|
try:
|
||||||
members[role_type].append(person)
|
members[role_type].append(person)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
members[role_type] = [person]
|
members[role_type] = [person]
|
||||||
for role in members:
|
for role in members:
|
||||||
print "%s-%s: %s" % (name, role, members[role])
|
email_file.write("%s-%ss: %s\n" % (name, role, ','.join(members[role])))
|
||||||
email_file.close()
|
email_file.close()
|
||||||
|
|
||||||
def enable():
|
def enable():
|
||||||
|
|
12
fas/dev.cfg
12
fas/dev.cfg
|
@ -3,9 +3,6 @@
|
||||||
# Settings that are the same for both development and production
|
# Settings that are the same for both development and production
|
||||||
# (such as template engine, encodings, etc.) all go in
|
# (such as template engine, encodings, etc.) all go in
|
||||||
# fas/config/app.cfg
|
# fas/config/app.cfg
|
||||||
#mail.on = True
|
|
||||||
#mail.server = 'bastion.fedora.phx.redhat.com'
|
|
||||||
#base_url_filter.base_url = "http://192.168.2.101:8080"
|
|
||||||
|
|
||||||
mail.on = True
|
mail.on = True
|
||||||
mail.server = 'localhost'
|
mail.server = 'localhost'
|
||||||
|
@ -13,8 +10,6 @@ mail.server = 'localhost'
|
||||||
mail.debug = False
|
mail.debug = False
|
||||||
mail.encoding = 'utf-8'
|
mail.encoding = 'utf-8'
|
||||||
|
|
||||||
base_url_filter.use_x_forwarded_host = True
|
|
||||||
|
|
||||||
# DATABASE
|
# DATABASE
|
||||||
|
|
||||||
# pick the form for your database
|
# pick the form for your database
|
||||||
|
@ -25,7 +20,7 @@ base_url_filter.use_x_forwarded_host = True
|
||||||
# If you have sqlite, here's a simple default to get you started
|
# If you have sqlite, here's a simple default to get you started
|
||||||
# in development
|
# in development
|
||||||
sqlalchemy.dburi="postgres://fedora:bunbunbun@localhost/fas2"
|
sqlalchemy.dburi="postgres://fedora:bunbunbun@localhost/fas2"
|
||||||
|
sqlalchemy.echo=True
|
||||||
|
|
||||||
# if you are using a database or table type without transactions
|
# if you are using a database or table type without transactions
|
||||||
# (MySQL default, for example), you should turn off transactions
|
# (MySQL default, for example), you should turn off transactions
|
||||||
|
@ -53,8 +48,9 @@ autoreload.package="fas"
|
||||||
tg.strict_parameters = True
|
tg.strict_parameters = True
|
||||||
|
|
||||||
server.webpath='/accounts'
|
server.webpath='/accounts'
|
||||||
base_url_filter.on=True
|
base_url_filter.on = True
|
||||||
base_url_filter.base_url = "https://publictest10.fedoraproject.org"
|
base_url_filter.use_x_forwarded_host = True
|
||||||
|
base_url_filter.base_url = "http://localhost:8088/accounts"
|
||||||
|
|
||||||
# Make the session cookie only return to the host over an SSL link
|
# Make the session cookie only return to the host over an SSL link
|
||||||
# Disabled for testing.
|
# Disabled for testing.
|
||||||
|
|
|
@ -9,6 +9,7 @@ import re
|
||||||
import gpgme
|
import gpgme
|
||||||
import StringIO
|
import StringIO
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import turbomail
|
||||||
|
|
||||||
from fas.auth import *
|
from fas.auth import *
|
||||||
|
|
||||||
|
@ -176,7 +177,14 @@ class CLA(controllers.Controller):
|
||||||
person.remove(cilckgroup, person)
|
person.remove(cilckgroup, person)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
# TODO: Email legal-cla-archive@fedoraproject.org
|
message = turbomail.Message(config.get('accounts_email'), config.get('legal_cla_email'), 'Fedora ICLA completed')
|
||||||
|
message.plain = '''
|
||||||
|
Fedora user %(username)s has signed a completed ICLA using their published GPG key, ID %(gpg_keyid)s,
|
||||||
|
that is associated with e-mail address %(email)s. The full signed ICLA is attached.
|
||||||
|
''' % {'username': person.username, 'gpg_keyid': person.gpg_keyid, 'email': person.emails['primary']}
|
||||||
|
signature.file.seek(0) # For another read()
|
||||||
|
message.attach(signature.file, signature.filename)
|
||||||
|
turbomail.enqueue(message)
|
||||||
turbogears.flash(_("You have successfully signed the CLA. You are now in the '%s' group.") % group.name)
|
turbogears.flash(_("You have successfully signed the CLA. You are now in the '%s' group.") % group.name)
|
||||||
turbogears.redirect('/cla/')
|
turbogears.redirect('/cla/')
|
||||||
return dict()
|
return dict()
|
||||||
|
|
|
@ -153,9 +153,14 @@ identity.saprovider.model.group="fas.model.Groups"
|
||||||
|
|
||||||
# identity.saprovider.encryption_algorithm=None
|
# identity.saprovider.encryption_algorithm=None
|
||||||
|
|
||||||
accounts_mail = "accounts@fedoraproject.org"
|
# CHANGE ME:
|
||||||
#email_host = "fedoraproject.org"
|
accounts_email = "nobody@fedoraproject.org"
|
||||||
email_host = "publictest10.fedoraproject.org"
|
#accounts_email = "accounts@fedoraproject.org"
|
||||||
|
legal_cla_email = "nobody@fedoraproject.org"
|
||||||
|
#legal_cla_email = "legal-cla-archive@fedoraproject.org"
|
||||||
|
|
||||||
|
#email_host = "bastion.fedora.phx.redhat.com"
|
||||||
|
email_host = "localhost"
|
||||||
|
|
||||||
gpgexec = "/usr/bin/gpg"
|
gpgexec = "/usr/bin/gpg"
|
||||||
gpghome = "/srv/fedora-infrastructure/fas/gnupg"
|
gpghome = "/srv/fedora-infrastructure/fas/gnupg"
|
||||||
|
|
|
@ -9,6 +9,7 @@ from fas.auth import *
|
||||||
from fas.user import KnownUser
|
from fas.user import KnownUser
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import turbomail
|
||||||
|
|
||||||
class KnownGroup(validators.FancyValidator):
|
class KnownGroup(validators.FancyValidator):
|
||||||
'''Make sure that a group already exists'''
|
'''Make sure that a group already exists'''
|
||||||
|
@ -287,11 +288,10 @@ class Group(controllers.Controller):
|
||||||
{'user': target.username, 'group': group.name, 'error': e})
|
{'user': target.username, 'group': group.name, 'error': e})
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
else:
|
else:
|
||||||
import turbomail
|
|
||||||
# TODO: How do we handle gettext calls for these kinds of emails?
|
# 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
|
# TODO: CC to right place, put a bit more thought into how to most elegantly do this
|
||||||
# TODO: Maybe that @fedoraproject.org (and even -sponsors) should be configurable somewhere?
|
# TODO: Maybe that @fedoraproject.org (and even -sponsors) should be configurable somewhere?
|
||||||
message = turbomail.Message(config.get('accounts_mail'), '%(group)s-sponsors@%(host)s' % {'group': group.name, 'host': config.get('email_host')}, \
|
message = turbomail.Message(config.get('accounts_email'), '%(group)s-sponsors@%(host)s' % {'group': group.name, 'host': config.get('email_host')}, \
|
||||||
"Fedora '%(group)s' sponsor needed for %(user)s" % {'user': target.username, 'group': 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)
|
url = config.get('base_url_filter.base_url') + turbogears.url('/group/edit/%s' % groupname)
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ Please go to %(url)s to take action.
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
else:
|
else:
|
||||||
import turbomail
|
import turbomail
|
||||||
message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'], "Your Fedora '%s' membership has been sponsored" % group.name)
|
message = turbomail.Message(config.get('accounts_email'), target.emails['primary'], "Your Fedora '%s' membership has been sponsored" % group.name)
|
||||||
message.plain = _('''
|
message.plain = _('''
|
||||||
%(name)s <%(email)s> has sponsored you for membership in the %(group)s
|
%(name)s <%(email)s> has sponsored you for membership in the %(group)s
|
||||||
group of the Fedora account system. If applicable, this change should
|
group of the Fedora account system. If applicable, this change should
|
||||||
|
@ -357,7 +357,7 @@ propagate into the e-mail aliases and CVS repository within an hour.
|
||||||
group = Groups.by_name(groupname)
|
group = Groups.by_name(groupname)
|
||||||
|
|
||||||
if not canRemoveUser(person, group, target):
|
if not canRemoveUser(person, group, target):
|
||||||
turbogears.flash(_("You cannot remove '%s'.") % target.username)
|
turbogears.flash(_("You cannot remove '%(user)s' from '%(group)s'.") % {'user': target.username, 'group': group.name})
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
return dict()
|
return dict()
|
||||||
else:
|
else:
|
||||||
|
@ -368,8 +368,7 @@ propagate into the e-mail aliases and CVS repository within an hour.
|
||||||
{'user': target.username, 'group': group.name, 'error': e})
|
{'user': target.username, 'group': group.name, 'error': e})
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
else:
|
else:
|
||||||
import turbomail
|
message = turbomail.Message(config.get('accounts_email'), target.emails['primary'], "Your Fedora '%s' membership has been removed" % group.name)
|
||||||
message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'], "Your Fedora '%s' membership has been removed" % group.name)
|
|
||||||
message.plain = _('''
|
message.plain = _('''
|
||||||
%(name)s <%(email)s> has removed you from the '%(group)s'
|
%(name)s <%(email)s> has removed you from the '%(group)s'
|
||||||
group of the Fedora Accounts System This change is effective
|
group of the Fedora Accounts System This change is effective
|
||||||
|
@ -406,7 +405,7 @@ aliases within an hour.
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
else:
|
else:
|
||||||
import turbomail
|
import turbomail
|
||||||
message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'], "Your Fedora '%s' membership has been upgraded" % group.name)
|
message = turbomail.Message(config.get('accounts_email'), target.emails['primary'], "Your Fedora '%s' membership has been upgraded" % group.name)
|
||||||
# Should we make person.upgrade return this?
|
# Should we make person.upgrade return this?
|
||||||
role = PersonRoles.query.filter_by(group=group, member=target).one()
|
role = PersonRoles.query.filter_by(group=group, member=target).one()
|
||||||
status = role.role_type
|
status = role.role_type
|
||||||
|
@ -445,7 +444,7 @@ into the e-mail aliases within an hour.
|
||||||
turbogears.redirect('/group/view/%s' % group.name)
|
turbogears.redirect('/group/view/%s' % group.name)
|
||||||
else:
|
else:
|
||||||
import turbomail
|
import turbomail
|
||||||
message = turbomail.Message(config.get('accounts_mail'), target.emails['primary'], "Your Fedora '%s' membership has been downgraded" % group.name)
|
message = turbomail.Message(config.get('accounts_email'), target.emails['primary'], "Your Fedora '%s' membership has been downgraded" % group.name)
|
||||||
role = PersonRoles.query.filter_by(group=group, member=target).one()
|
role = PersonRoles.query.filter_by(group=group, member=target).one()
|
||||||
status = role.role_type
|
status = role.role_type
|
||||||
message.plain = _('''
|
message.plain = _('''
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||||
<xi:include href="../master.html" />
|
<xi:include href="../master.html" />
|
||||||
<head>
|
<head>
|
||||||
<title>${_('Edit Group')}</title>
|
<title>${_('View Group')}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<?python
|
<?python
|
||||||
|
@ -13,6 +13,8 @@
|
||||||
import pytz
|
import pytz
|
||||||
person = People.by_username(tg.identity.user.username)
|
person = People.by_username(tg.identity.user.username)
|
||||||
timezone = pytz.timezone(person.timezone)
|
timezone = pytz.timezone(person.timezone)
|
||||||
|
can_admin = auth.canAdminGroup(person, group)
|
||||||
|
can_sponsor = auth.canSponsorGroup(person, group)
|
||||||
?>
|
?>
|
||||||
<h2>${group.display_name} (${group.name})</h2>
|
<h2>${group.display_name} (${group.name})</h2>
|
||||||
<h3>
|
<h3>
|
||||||
|
@ -29,7 +31,7 @@
|
||||||
</form>
|
</form>
|
||||||
<a py:if="group in person.memberships" href="${tg.url('/group/remove/%s/%s' % (group.name, person.username))}">${_('Remove me')}</a>
|
<a py:if="group in person.memberships" href="${tg.url('/group/remove/%s/%s' % (group.name, person.username))}">${_('Remove me')}</a>
|
||||||
<script py:if="group in person.memberships" type="text/javascript">var hb7 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_remove')}'});</script>
|
<script py:if="group in person.memberships" type="text/javascript">var hb7 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_remove')}'});</script>
|
||||||
<h3>Group Details <a py:if="auth.canAdminGroup(person, group)" href="${tg.url('/group/edit/%s' % group.name)}">${_('(edit)')}</a></h3>
|
<h3>Group Details <a py:if="can_admin" href="${tg.url('/group/edit/%s' % group.name)}">${_('(edit)')}</a></h3>
|
||||||
<div class="userbox">
|
<div class="userbox">
|
||||||
<dl>
|
<dl>
|
||||||
<dt>${_('Name:')}</dt><dd>${group.name} </dd>
|
<dt>${_('Name:')}</dt><dd>${group.name} </dd>
|
||||||
|
@ -49,14 +51,16 @@
|
||||||
<dd py:if="group.prerequisite">${group.prerequisite.name} </dd>
|
<dd py:if="group.prerequisite">${group.prerequisite.name} </dd>
|
||||||
<dd py:if="not group.prerequisite"> </dd>
|
<dd py:if="not group.prerequisite"> </dd>
|
||||||
<dt>${_('Created:')}</dt><dd>${group.creation} </dd>
|
<dt>${_('Created:')}</dt><dd>${group.creation} </dd>
|
||||||
<dt py:if="auth.canSponsorGroup(person, group)">${_('Add User:')}</dt>
|
<py:if test="can_sponsor">
|
||||||
<dd py:if="auth.canSponsorGroup(person, group)">
|
<dt>${_('Add User:')}</dt>
|
||||||
|
<dd>
|
||||||
<form action="${tg.url('/group/apply/%s' % group.name)}">
|
<form action="${tg.url('/group/apply/%s' % group.name)}">
|
||||||
<input type='text' size='15' name='targetname'/>
|
<input type='text' size='15' name='targetname'/>
|
||||||
<input type="submit" value="${('Add')}" />
|
<input type="submit" value="${('Add')}" />
|
||||||
<script type="text/javascript">var group_user_add = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_user_add')}'});</script>
|
<script type="text/javascript">var group_user_add = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_user_add')}'});</script>
|
||||||
</form>
|
</form>
|
||||||
</dd>
|
</dd>
|
||||||
|
</py:if>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<!--
|
<!--
|
||||||
|
@ -74,7 +78,7 @@
|
||||||
<th>${_('Date Approved')}</th>
|
<th>${_('Date Approved')}</th>
|
||||||
<th>${_('Approval')}</th>
|
<th>${_('Approval')}</th>
|
||||||
<th>${_('Role Type')}</th>
|
<th>${_('Role Type')}</th>
|
||||||
<th py:if="auth.canSponsorGroup(person, group)">${_('Action')}</th>
|
<th py:if="can_sponsor">${_('Action')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr py:for="role in group.roles">
|
<tr py:for="role in group.roles">
|
||||||
|
@ -87,13 +91,17 @@
|
||||||
<td>${role.role_status}</td>
|
<td>${role.role_status}</td>
|
||||||
<td>${role.role_type}</td>
|
<td>${role.role_type}</td>
|
||||||
<!-- This section includes all action items -->
|
<!-- This section includes all action items -->
|
||||||
<td py:if="auth.canSponsorGroup(person, group)">
|
<td py:if="can_sponsor">
|
||||||
<ul class="actions">
|
<ul class="actions">
|
||||||
<li py:if="group in role.member.unapproved_memberships">
|
<li py:if="role.role_status == 'unapproved'">
|
||||||
<a py:if="group.needs_sponsor" href="${tg.url('/group/sponsor/%s/%s' % (group.name, role.member.username))}">${_('Sponsor')}</a>
|
<py:if test="group.needs_sponsor">
|
||||||
<script py:if="group.needs_sponsor" type="text/javascript">var hb1 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_sponsor')}'});</script>
|
<a href="${tg.url('/group/sponsor/%s/%s' % (group.name, role.member.username))}">${_('Sponsor')}</a>
|
||||||
<a py:if="not group.needs_sponsor" href="${tg.url('/group/sponsor/%s/%s' % (group.name, role.member.username))}">${_('Approve')}</a>
|
<script type="text/javascript">var hb1 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_sponsor')}'});</script>
|
||||||
<script py:if="not group.needs_sponsor" type="text/javascript">var hb2 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_approve')}'});</script>
|
</py:if>
|
||||||
|
<py:if test="not group.needs_sponsor">
|
||||||
|
<a href="${tg.url('/group/sponsor/%s/%s' % (group.name, role.member.username))}">${_('Approve')}</a>
|
||||||
|
<script type="text/javascript">var hb2 = new HelpBalloon({dataURL: '${tg.url('/help/get_help/group_approve')}'});</script>
|
||||||
|
</py:if>
|
||||||
</li>
|
</li>
|
||||||
<li py:if="auth.canRemoveUser(person, group, role.member)">
|
<li py:if="auth.canRemoveUser(person, group, role.member)">
|
||||||
<a href="${tg.url('/group/remove/%s/%s' % (group.name, role.member.username))}">${_('Remove')}</a>
|
<a href="${tg.url('/group/remove/%s/%s' % (group.name, role.member.username))}">${_('Remove')}</a>
|
||||||
|
|
|
@ -19,13 +19,12 @@ from fas.model import EmailPurposes
|
||||||
from fas.model import Log
|
from fas.model import Log
|
||||||
|
|
||||||
from fas.auth import *
|
from fas.auth import *
|
||||||
from fas.user_email import Email, NonFedoraEmail
|
#from fas.user_email import Email, NonFedoraEmail
|
||||||
|
|
||||||
from random import Random
|
from random import Random
|
||||||
import sha
|
import sha
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
|
|
||||||
|
|
||||||
class KnownUser(validators.FancyValidator):
|
class KnownUser(validators.FancyValidator):
|
||||||
'''Make sure that a user already exists'''
|
'''Make sure that a user already exists'''
|
||||||
def _to_python(self, value, state):
|
def _to_python(self, value, state):
|
||||||
|
@ -50,6 +49,14 @@ class UnknownUser(validators.FancyValidator):
|
||||||
|
|
||||||
raise validators.Invalid(_("'%s' already exists.") % value, value, state)
|
raise validators.Invalid(_("'%s' already exists.") % value, value, state)
|
||||||
|
|
||||||
|
class NonFedoraEmail(validators.FancyValidator):
|
||||||
|
'''Make sure that an email address is not @fedoraproject.org'''
|
||||||
|
def _to_python(self, value, state):
|
||||||
|
return value.strip()
|
||||||
|
def validate_python(self, value, state):
|
||||||
|
if value.endswith('@fedoraproject.org'):
|
||||||
|
raise validators.Invalid(_("To prevent email loops, your email address cannot be @fedoraproject.org."), value, state)
|
||||||
|
|
||||||
class ValidSSHKey(validators.FancyValidator):
|
class ValidSSHKey(validators.FancyValidator):
|
||||||
''' Make sure the ssh key uploaded is valid '''
|
''' Make sure the ssh key uploaded is valid '''
|
||||||
def _to_python(self, value, state):
|
def _to_python(self, value, state):
|
||||||
|
@ -84,10 +91,10 @@ class UserSave(validators.Schema):
|
||||||
validators.Regex(regex='^[^\n:<>]+$'),
|
validators.Regex(regex='^[^\n:<>]+$'),
|
||||||
)
|
)
|
||||||
ssh_key = ValidSSHKey(max=5000)
|
ssh_key = ValidSSHKey(max=5000)
|
||||||
#mail = validators.All(
|
email = validators.All(
|
||||||
# validators.Email(not_empty=True, strip=True, max=128),
|
validators.Email(not_empty=True, strip=True, max=128),
|
||||||
# NonFedoraEmail(not_empty=True, strip=True, max=128),
|
NonFedoraEmail(not_empty=True, strip=True, max=128),
|
||||||
#)
|
)
|
||||||
#fedoraPersonBugzillaMail = validators.Email(strip=True, max=128)
|
#fedoraPersonBugzillaMail = validators.Email(strip=True, max=128)
|
||||||
#fedoraPersonKeyId- Save this one for later :)
|
#fedoraPersonKeyId- Save this one for later :)
|
||||||
postal_address = validators.String(max=512)
|
postal_address = validators.String(max=512)
|
||||||
|
@ -148,7 +155,7 @@ def generate_salt(length=8):
|
||||||
|
|
||||||
class User(controllers.Controller):
|
class User(controllers.Controller):
|
||||||
|
|
||||||
email = Email()
|
#email = Email()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
'''Create a User Controller.
|
'''Create a User Controller.
|
||||||
|
@ -243,6 +250,9 @@ class User(controllers.Controller):
|
||||||
return dict()
|
return dict()
|
||||||
try:
|
try:
|
||||||
target.human_name = human_name
|
target.human_name = human_name
|
||||||
|
# FIXME: WARNING! This is deceptive. Remember that it
|
||||||
|
# changes the email object itself, not the email attached
|
||||||
|
# to the purpose.
|
||||||
target.emails['primary'] = email
|
target.emails['primary'] = email
|
||||||
# target.emails['bugzilla'] = bugzilla
|
# target.emails['bugzilla'] = bugzilla
|
||||||
target.ircnick = ircnick
|
target.ircnick = ircnick
|
||||||
|
@ -323,7 +333,7 @@ class User(controllers.Controller):
|
||||||
session.flush()
|
session.flush()
|
||||||
|
|
||||||
newpass = generate_password()
|
newpass = generate_password()
|
||||||
message = turbomail.Message(config.get('accounts_mail'), person.emails['primary'], _('Welcome to the Fedora Project!'))
|
message = turbomail.Message(config.get('accounts_email'), person.emails['primary'], _('Welcome to the Fedora Project!'))
|
||||||
message.plain = _('''
|
message.plain = _('''
|
||||||
You have created a new Fedora account!
|
You have created a new Fedora account!
|
||||||
Your new password is: %s
|
Your new password is: %s
|
||||||
|
@ -424,7 +434,7 @@ forward to working with you!
|
||||||
turbogears.flash(_("username + email combo unknown."))
|
turbogears.flash(_("username + email combo unknown."))
|
||||||
return dict()
|
return dict()
|
||||||
newpass = generate_password()
|
newpass = generate_password()
|
||||||
message = turbomail.Message(config.get('accounts_mail'), email, _('Fedora Project Password Reset'))
|
message = turbomail.Message(config.get('accounts_email'), email, _('Fedora Project Password Reset'))
|
||||||
mail = _('''
|
mail = _('''
|
||||||
You have requested a password reset!
|
You have requested a password reset!
|
||||||
Your new password is: %s
|
Your new password is: %s
|
||||||
|
|
|
@ -238,7 +238,7 @@ class Email(controllers.Controller):
|
||||||
else:
|
else:
|
||||||
# TODO: Make this email more friendly. Maybe escape the @ in email too?
|
# TODO: Make this email more friendly. Maybe escape the @ in email too?
|
||||||
validurl = config.get('base_url_filter.base_url') + turbogears.url('/user/email/verify/%s/%s/%s') % (target.username, email, validtoken)
|
validurl = config.get('base_url_filter.base_url') + turbogears.url('/user/email/verify/%s/%s/%s') % (target.username, email, validtoken)
|
||||||
message = turbomail.Message(config.get('accounts_mail'), email, _('Confirm this email address'))
|
message = turbomail.Message(config.get('accounts_email'), email, _('Confirm this email address'))
|
||||||
message.plain = _('''
|
message.plain = _('''
|
||||||
Go to this URL to verify that you own this email address: %s
|
Go to this URL to verify that you own this email address: %s
|
||||||
''') % validurl
|
''') % validurl
|
||||||
|
|
118
fas/fas2.sql
118
fas/fas2.sql
|
@ -282,65 +282,65 @@ create table visit_identity (
|
||||||
--
|
--
|
||||||
-- When a person's fedorabugs role is updated, add them to bugzilla queue.
|
-- When a person's fedorabugs role is updated, add them to bugzilla queue.
|
||||||
--
|
--
|
||||||
create or replace function bugzilla_sync() returns trigger as $bz_sync$
|
-- create or replace function bugzilla_sync() returns trigger as $bz_sync$
|
||||||
# Decide which row we are operating on and the action to take
|
-- # Decide which row we are operating on and the action to take
|
||||||
if TD['event'] == 'DELETE':
|
-- if TD['event'] == 'DELETE':
|
||||||
# 'r' for removing an entry from bugzilla
|
-- # 'r' for removing an entry from bugzilla
|
||||||
newaction = 'r'
|
-- newaction = 'r'
|
||||||
row = TD['old']
|
-- row = TD['old']
|
||||||
else:
|
-- else:
|
||||||
# insert or update
|
-- # insert or update
|
||||||
row = TD['new']
|
-- row = TD['new']
|
||||||
if row['role_status'] == 'approved':
|
-- if row['role_status'] == 'approved':
|
||||||
# approved so add an entry to bugzilla
|
-- # approved so add an entry to bugzilla
|
||||||
newaction = 'a'
|
-- newaction = 'a'
|
||||||
else:
|
-- else:
|
||||||
# no longer approved so remove the entry from bugzilla
|
-- # no longer approved so remove the entry from bugzilla
|
||||||
newaction = 'r'
|
-- newaction = 'r'
|
||||||
|
--
|
||||||
# Get the group id for fedorabugs
|
-- # Get the group id for fedorabugs
|
||||||
result = plpy.execute("select id from groups where name = 'fedorabugs'", 1)
|
-- result = plpy.execute("select id from groups where name = 'fedorabugs'", 1)
|
||||||
if not result:
|
-- if not result:
|
||||||
# Danger Will Robinson! A basic FAS group does not exist!
|
-- # Danger Will Robinson! A basic FAS group does not exist!
|
||||||
plpy.error('Basic FAS group fedorabugs does not exist')
|
-- plpy.error('Basic FAS group fedorabugs does not exist')
|
||||||
# If this is not a fedorabugs role, no change needed
|
-- # If this is not a fedorabugs role, no change needed
|
||||||
if row['group_id'] != result[0]['id']:
|
-- if row['group_id'] != result[0]['id']:
|
||||||
return None
|
-- return None
|
||||||
|
--
|
||||||
# Retrieve the bugzilla email address
|
-- # Retrieve the bugzilla email address
|
||||||
plan = plpy.prepare("select email, purpose from person_emails as pee,"
|
-- plan = plpy.prepare("select email, purpose from person_emails as pee,"
|
||||||
" email_purposes as epu"
|
-- " email_purposes as epu"
|
||||||
" where epu.id = epu.email_id and pee.person_id = $1"
|
-- " where epu.id = epu.email_id and pee.person_id = $1"
|
||||||
" and purpose in ('bugzilla', 'primary')",
|
-- " and purpose in ('bugzilla', 'primary')",
|
||||||
('text',))
|
-- ('text',))
|
||||||
result = plpy.execute(plan, row['person_id'])
|
-- result = plpy.execute(plan, row['person_id'])
|
||||||
email = None
|
-- email = None
|
||||||
for record in result:
|
-- for record in result:
|
||||||
email = record['email']
|
-- email = record['email']
|
||||||
if record['purpose'] == 'bugzilla':
|
-- if record['purpose'] == 'bugzilla':
|
||||||
break
|
-- break
|
||||||
if not email:
|
-- if not email:
|
||||||
raise plpy.error('Cannot approve fedorabugs for person_id(%s) because they have no email address to use with bugzilla' % row['person_id'])
|
-- raise plpy.error('Cannot approve fedorabugs for person_id(%s) because they have no email address to use with bugzilla' % row['person_id'])
|
||||||
|
--
|
||||||
# If there is already a row in bugzilla_queue update, otherwise insert
|
-- # If there is already a row in bugzilla_queue update, otherwise insert
|
||||||
plan = plpy.prepare("select email from bugzilla_queue where email = $1",
|
-- plan = plpy.prepare("select email from bugzilla_queue where email = $1",
|
||||||
('text',))
|
-- ('text',))
|
||||||
result = plpy.execute(plan, (email,), 1)
|
-- result = plpy.execute(plan, (email,), 1)
|
||||||
if result:
|
-- if result:
|
||||||
plan = plpy.prepare("update bugzilla_queue set action = $1"
|
-- plan = plpy.prepare("update bugzilla_queue set action = $1"
|
||||||
" where email = $2", ('char', 'text'))
|
-- " where email = $2", ('char', 'text'))
|
||||||
plpy.execute(plan, (newaction, email))
|
-- plpy.execute(plan, (newaction, email))
|
||||||
else:
|
-- else:
|
||||||
plan = plpy.prepare("insert into bugzilla_queue (email, group_id"
|
-- plan = plpy.prepare("insert into bugzilla_queue (email, group_id"
|
||||||
", person_id, action) values ($1, $2, $3, $4)",
|
-- ", person_id, action) values ($1, $2, $3, $4)",
|
||||||
('text', 'text', 'text', 'char'))
|
-- ('text', 'text', 'text', 'char'))
|
||||||
plpy.execute(plan, (email, row['group_id'], row['person_id'], newaction))
|
-- plpy.execute(plan, (email, row['group_id'], row['person_id'], newaction))
|
||||||
return None
|
-- return None
|
||||||
$bz_sync$ language plpythonu;
|
-- $bz_sync$ language plpythonu;
|
||||||
|
--
|
||||||
create trigger role_bugzilla_sync before update or insert or delete
|
-- create trigger role_bugzilla_sync before update or insert or delete
|
||||||
on person_roles
|
-- on person_roles
|
||||||
for each row execute procedure bugzilla_sync();
|
-- for each row execute procedure bugzilla_sync();
|
||||||
|
|
||||||
--
|
--
|
||||||
-- When an email address changes, check whether it needs to be changed in
|
-- When an email address changes, check whether it needs to be changed in
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue