Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • Dockerfile
  • feature_invite_validuntil_minmax
  • incremental-sync
  • jwt_encode_inconsistencies
  • master
  • recovery-code-pwhash
  • redis-rate-limits
  • roles-recursive-cte
  • typehints
  • v1.0.x
  • v1.1.x
  • v1.2.x
  • v1.x.x
  • v0.1.2
  • v0.1.4
  • v0.1.5
  • v0.2.0
  • v0.3.0
  • v1.0.0
  • v1.0.1
  • v1.0.2
  • v1.1.0
  • v1.1.1
  • v1.1.2
  • v1.2.0
  • v2.0.0
  • v2.0.1
  • v2.1.0
  • v2.2.0
  • v2.3.0
  • v2.3.1
31 results

Target

Select target project
  • uffd/uffd
  • rixx/uffd
  • thies/uffd
  • leona/uffd
  • strifel/uffd
  • thies/uffd-2
6 results
Select Git revision
  • Dockerfile
  • feature_invite_validuntil_minmax
  • incremental-sync
  • jwt_encode_inconsistencies
  • master
  • redis-rate-limits
  • roles-recursive-cte
  • typehints
  • v1.0.x
  • v1.1.x
  • v1.2.x
  • v1.x.x
  • v0.1.2
  • v0.1.4
  • v0.1.5
  • v0.2.0
  • v0.3.0
  • v1.0.0
  • v1.0.1
  • v1.0.2
  • v1.1.0
  • v1.1.1
  • v1.1.2
  • v1.2.0
  • v2.0.0
  • v2.0.1
  • v2.1.0
  • v2.2.0
  • v2.3.0
  • v2.3.1
30 results
Show changes

Commits on Source 3

  • psy's avatar
    Bugfix to prevent internal server error on invite page if associated user was deleted · 69463f58
    psy authored and Julian's avatar Julian committed
    69463f58
  • Julian's avatar
    Removed CHANGELOG and simplified Debian release workflow · 3088d97a
    Julian authored
    Previously CHANGELOG had to be updated manually. This was done by downloading
    the output of a CI job that used listed commits since the last release. This
    made releasing a bit more complicated and led to uselsess release commits.
    
    Now a script creates the full debian/changelog with all versions based on
    git tags and git commits.
    
    (cherry picked from commit 5c9ab56e)
    3088d97a
  • Julian's avatar
    Fixes and improvements for changelog auto-generation · 76f1fa92
    Julian authored
    The script generated a broken changelog if the current commit is tagged as
    a release. That works now.
    
    Additional improvements:
    * Merge commits are ignored
    * "^fixup!" commits are ignored
    * Commit summaries are line-wrapped
    * Authors can be merged by manually supplied name mapping
    * The first release also includes a list of commits. They were originally
      excluded because the first release contains so many commits, including
      many unclean ones. But excluding those commits also means excluding the
      attribution, so it is not really an option.
    * Authors are ordered by the number of their contributions in a release
      to make occasional contributors more visible.
    
    (cherry picked from commit 328caf00)
    76f1fa92
......@@ -30,16 +30,15 @@ build:pip:
build:apt:
extends: .build
script:
- cp CHANGELOG debian/changelog
- ./debian/create_changelog.py uffd > debian/changelog
- export PYBUILD_INSTALL_ARGS="--install-lib=/usr/share/uffd/ --install-scripts=/usr/share/uffd/"
- gbp dch --no-git-author --ignore-branch --debian-tag=v%\(version\)s
- dpkg-buildpackage -us -uc
- mkdir build
- mv ../*.deb build/
- mv ../*.deb ./
- dpkg-deb -I *.deb
- dpkg-deb -c *.deb
artifacts:
paths:
- build/*.deb
- debian/changelog
- ./*.deb
db_migrations_updated:
stage: test
......@@ -73,7 +72,6 @@ linter:buster:
reports:
codequality: codeclimate.json
linter:bullseye:
image: registry.git.cccv.de/uffd/docker-images/bullseye
stage: test
......@@ -171,20 +169,11 @@ test:package:pip:bullseye:
dependencies:
- build:pip
test:package:apt:changelog:
stage: test
rules:
- if: '$CI_COMMIT_TAG =~ /v[0-9]+[.][0-9]+[.][0-9]+.*/'
script:
- head -n 1 debian/changelog | grep -qv UNRELEASED || { echo 'CHANGELOG not up-to-date!'; exit 1; }
dependencies:
- build:apt
test:package:apt:buster:
image: registry.git.cccv.de/uffd/docker-images/buster
stage: test
script:
- apt -y install ./build/*.deb
- apt -y install ./*.deb
- service uwsgi start uffd || ( service uwsgi status uffd ; sleep 15; cat /var/log/uwsgi/app/uffd.log; )
- echo "server { listen 127.0.0.1:5000 default_server; include /etc/uffd/nginx.include.conf; }" > /etc/nginx/sites-enabled/uffd.ini
- service nginx start || ( service nginx status; nginx -t; exit 1; )
......@@ -197,7 +186,7 @@ test:package:apt:bullseye:
image: registry.git.cccv.de/uffd/docker-images/bullseye
stage: test
script:
- apt -y install ./build/*.deb
- apt -y install ./*.deb
- service uwsgi start uffd || ( service uwsgi status uffd ; sleep 15; cat /var/log/uwsgi/app/uffd.log; )
- echo "server { listen 127.0.0.1:5000 default_server; include /etc/uffd/nginx.include.conf; }" > /etc/nginx/sites-enabled/uffd.ini
- service nginx start || ( service nginx status; nginx -t; exit 1; )
......@@ -222,7 +211,7 @@ publish:pip:
publish:apt:
extends: .publish
script:
- export DEBPATH="$(echo build/*.deb)"
- export DEBPATH="$(echo *.deb)"
- echo Upload deb file, add it to repo and clean up upload
- curl --user "${APTLY_API_USER}:${APTLY_API_PW}" -X POST -F file=@"$DEBPATH" "${APT_API_URL}/api/files/${APT_REPO}-ci-upload-${CI_JOB_ID}"
- curl --user "${APTLY_API_USER}:${APTLY_API_PW}" -X POST "${APT_API_URL}/api/repos/${APT_REPO}/file/${APT_REPO}-ci-upload-${CI_JOB_ID}"
......
uffd (1.1.1) unstable; urgency=medium
[ Julian Rother ]
* Fix regression: OAuth2 authorize endpoint rejects empty scope parameter
* Fix regression: OAuth2 token endpoint does not support Basic-Auth
* Verify 2FA recovery codes and TOTP codes in constant-time
-- root <root@runner-f9u6bnzu-project-27-concurrent-0> Mon, 13 Sep 2021 20:18:30 +0000
uffd (1.1.0) unstable; urgency=medium
[ Julian Rother ]
* Switched tests from tmpfile to in-memory databases
* Catch LDAPSASLPrepError on login
* Restrict password alphabet to SASLprep-safe ASCII subset
* Replace flask_oauthlib with plain oauthlib
* Fix for 45d4598 (Replace flask_oauthlib with plain oauthlib)
* Don't display login page if user is already logged in
* Display per-client-customizable message on login page
* Dedicated error page for permission errors
* Fix HTML element id construction in role view
* Removed TestUserViewsOLUserAsUser test cases
* Make sure that users can only confirm their own verification tokens
* Refactor permission checking and differenciate login and selfservice access
* Refactor base template and add narrow base template
* Handle if user referenced in session does not exist
* Support for python3-fido2 v0.9.x (Debian Bullseye)
* Support for python3-werkzeug v1.0.x (Debian Bullseye)
* Properly rollback db transaction in db_flush (tests)
* Fix debian package dependency on python3-oauthlib
* Verify OAuth2 codes/tokens in constant-time
* Verify invite link secrets in constant-time
* Verify selfservice link secrets in constant-time
* Verify signup link secrets in constant-time
* Verify api keys in constant-time
* Explain OAuth2 code/token customization hack
* Add CI tests for Bullseye and fix remaining compatability issues
* Publish Debian packages to packages.cccv.de
[ C-Tim ]
* fix(uffd-admin): Fix bug with util-linux fallback path
* fix(migrations): Calculate correct path for migrations instead of assuming cwd
[ Julian Rother ]
* CI check for CHANGELOG on release
* Refactor migrations to support MySQL/MariaDB
* Add Debian repo signing key and install instructions
* Auto-generate SECRET_KEY in Debian package, minor improvement of uffd-admin
-- root <root@runner-f9u6bnzu-project-27-concurrent-0> Mon, 13 Sep 2021 12:07:04 +0000
uffd (1.0.0) unstable; urgency=medium
[ nd ]
* enable more pylint checks
* disable all checks for ldapalchemy and enable duplicate code check
* disable cuplicate-code check in pylint again
[ Julian Rother ]
* Fixed typo in German translation (#91)
* Made shell context more usable and cleaned up imports in __init__.py
[ nd ]
* refactor selfservice mail sending
[ Julian Rother ]
* Disabled unhelpful deprecation warnings for pytest
* Fixed minor html validity error in qr code generation
* Moved token generation to common module and introduced token_urlfriendly
* Implemented ordering for navbar items
* Added api endpoint for mail aliases
[ Sistason ]
* Updated translations readme, made some editorial translation changes and fixed some typos
[ Julian Rother ]
* Made devicelogin button text easier to understand, closes #91
* Fixed layout bug in selfservice introduced by 7b94843b
* Changed developing status to "production/stable"
-- root <root@runner-f9u6bnzu-project-27-concurrent-0> Fri, 13 Aug 2021 14:35:19 +0000
uffd (0.3.0) unstable; urgency=medium
[ nd ]
* update link to rocketchat in README
* add uffd-admin command, cleanup cronjob and needed /run folder
* move package build dependencies to docker image
* enable uwsgi app by default and add maintainer script to restart uwsgi
* move python dependencies from requirements.txt to setup.py
* update changelog for 0.3.0 release
* add more warnings against using pip install for production setups
* add comment why we ignore the package dependencies extracted by pybild
* removed not needed sleep from tests
[ Julian ]
* ensure uffd-admin works with arguments containing whitespace
-- root <root@runner-f9u6bnzu-project-27-concurrent-0> Sun, 01 Aug 2021 13:27:31 +0000
uffd (0.2.0) unstable; urgency=medium
[ CCCV ]
* Working debian packages
-- root <root@runner-f9u6bnzu-project-26-concurrent-1> Sat, 31 Jul 2021 19:05:30 +0000
uffd (0.1.2) unstable; urgency=medium
* Initial release.
-- Andreas Valder <nd@cccv.de> Fri, 30 Jul 2021 23:02:31 +0200
File moved
#!/usr/bin/python3
import sys
import re
import textwrap
import datetime
import email.utils
import git
package_name = 'UNKNOWN'
alias_names = {
'julian': 'Julian Rother',
'Julian': 'Julian Rother',
}
ignore_commit_regexes = [
'^fixup!',
]
def print_release(tag=None, commits=tuple(), last_tag=None):
release_version = '0.0.0'
release_author = git.objects.util.Actor('None', 'undefined@example.com')
release_date = 0
release_status = 'UNRELEASED'
message = ''
if tag:
release_status = 'unstable'
release_version = tag.name[1:] # strip leading "v"
if isinstance(tag.object, git.TagObject):
release_author = tag.object.tagger
release_date = tag.object.tagged_date
message = tag.object.message.split('-----BEGIN PGP SIGNATURE-----')[0].strip()
else:
release_author = tag.object.committer
release_date = tag.object.committed_date
elif commits:
release_author = commits[0].committer
release_date = commits[0].committed_date
date = datetime.datetime.fromtimestamp(release_date).strftime('%Y%m%dT%H%M%S')
last_version = '0.0.0'
if last_tag:
last_version = last_tag.name[1:] # strip leading "v"
release_version = f'{last_version}+git{date}-{commits[0].hexsha[:8]}'
print(f'{package_name} ({release_version}) {release_status}; urgency=medium')
print()
if message:
print(textwrap.indent(message, ' '))
print()
commit_authors = [] # list of (key, author), sorted by first commit date
commit_author_emails = {} # author email -> key
commit_author_names = {} # author name -> key
commit_author_commits = {} # key -> list of commits
for commit in commits:
if any(filter(lambda pattern: re.match(pattern, commit.summary), ignore_commit_regexes)):
continue
if len(commit.parents) > 1:
continue # Ignore merge commits
author_name = alias_names.get(commit.author.name, commit.author.name)
key = commit_author_emails.get(commit.author.email)
if key is None:
key = commit_author_names.get(author_name)
if key is None:
key = commit.author.email
commit_authors.append((key, author_name))
commit_author_emails[commit.author.email] = key
commit_author_names[author_name] = key
commit_author_commits[key] = commit_author_commits.get(key, []) + [commit]
commit_authors.sort(key=lambda args: len(commit_author_commits[args[0]]))
for key, author_name in commit_authors:
print(f' [ {author_name} ]')
for commit in commit_author_commits[key]:
lines = '\n'.join(textwrap.wrap(commit.summary, 90))
lines = ' * ' + textwrap.indent(lines, ' ').strip()
print(lines)
print()
print(f' -- {alias_names.get(release_author.name, release_author.name)} <{release_author.email}> {email.utils.formatdate(release_date)}')
if __name__ == '__main__':
repo = git.Repo('.')
package_name = sys.argv[1]
version_commits = {}
for tag in repo.tags:
if not re.fullmatch('v[0-9]+[.][0-9]+[.][0-9]+.*', tag.name):
continue
if isinstance(tag.object, git.TagObject):
commit_hexsha = tag.object.object.hexsha
else:
commit_hexsha = tag.object.hexsha
version_commits[commit_hexsha] = tag
tag = None
commits = []
for commit in repo.iter_commits('HEAD'):
if commit.hexsha in version_commits:
prev_tag = version_commits[commit.hexsha]
if commits:
print_release(tag, commits, last_tag=prev_tag)
print()
tag = prev_tag
commits = []
commits.append(commit)
print_release(tag, commits)
uwsgi.ini /etc/uffd/
nginx.include.conf /etc/uffd/
debian/uffd.cfg /etc/uffd/
debian/contrib/uffd.cfg /etc/uffd/
debian/contrib/uffd-admin /usr/bin/
......@@ -363,6 +363,16 @@ class TestInviteAdminViews(UffdTestCase):
self.assertNotIn('testrole1'.encode(), r.data)
self.assertIn('testrole2'.encode(), r.data)
# Regression test for #130
def test_index_deleted_dn(self):
valid_until = datetime.datetime.now() + datetime.timedelta(seconds=60)
db.session.add(Invite(valid_until=valid_until, single_use=True, used=True, signups=[InviteSignup(user_dn='uid=doesnotexist,ou=users,dc=example,dc=com')]))
db.session.commit()
self.login_as('admin')
r = self.client.get(path=url_for('invite.index'), follow_redirects=True)
dump('invite_index_deleted_dn', r)
self.assertEqual(r.status_code, 200)
def test_new(self):
self.login_as('admin')
role = Role(name='testrole1')
......
......@@ -105,7 +105,11 @@
{% else %}
<ul>
{% for signup in invite.signups if signup.completed %}
{% if signup.user %}
<li>{{_('Registration of user <a href="%(user_url)s">%(user_name)s</a>', user_url=url_for('user.show', uid=signup.user.uid)|e, user_name=signup.user.loginname|e)|safe}}</li>
{% else %}
<li>{{_('Registration of a user (no longer available)')}}</li>
{% endif %}
{% endfor %}
{% for grant in invite.grants if grant.user %}
<li>{{_('Roles granted to <a href="%(user_url)s">%(user_name)s</a>', user_url=url_for('user.show', uid=grant.user.uid)|e, user_name=grant.user.loginname|e)|safe}}</li>
......
No preview for this file type
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-05 01:02+0200\n"
"POT-Creation-Date: 2021-11-16 15:16+0100\n"
"PO-Revision-Date: 2021-05-25 21:18+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
......@@ -44,54 +44,54 @@ msgstr "eine Stunde"
msgid "%(hours)d hours"
msgstr "%(hours)d Stunden\""
#: uffd/invite/views.py:46
#: uffd/invite/views.py:47
msgid "Invites"
msgstr "Einladungslinks"
#: uffd/invite/views.py:75
#: uffd/invite/views.py:76
msgid "The \"Expires After\" date is too far in the future"
msgstr "Das Ablaufdatum liegt zu weit in der Zukunft"
#: uffd/invite/views.py:78
#: uffd/invite/views.py:79
msgid "You are not allowed to create invite links with these permissions"
msgstr "Dir fehlen Berechtigungen um diesen Einladungslink zu erstellen"
#: uffd/invite/views.py:81
#: uffd/invite/views.py:82
msgid "Invite link must either allow signup or grant at least one role"
msgstr ""
"Einladungslink muss entweder Account-Registrierung erlauben oder Rollen "
"vergeben"
#: uffd/invite/views.py:109 uffd/invite/views.py:138
#: uffd/invite/views.py:123 uffd/invite/views.py:159
msgid "Invalid invite link"
msgstr "Ungültiger Einladungslink"
#: uffd/invite/views.py:126
#: uffd/invite/views.py:142
msgid "Roles successfully updated"
msgstr "Rollen erfolgreich geändert"
#: uffd/invite/views.py:141
#: uffd/invite/views.py:162
msgid "Invite link does not allow signup"
msgstr "Einladungslink erlaubt keine Account-Registrierung"
#: uffd/invite/views.py:163 uffd/selfservice/views.py:53
#: uffd/signup/views.py:49
#: uffd/invite/views.py:188 uffd/selfservice/views.py:54
#: uffd/signup/views.py:51
msgid "Passwords do not match"
msgstr "Die Passwörter stimmen nicht überein"
#: uffd/invite/views.py:168 uffd/signup/views.py:54
#: uffd/invite/views.py:193 uffd/signup/views.py:56
#, python-format
msgid "Too many signup requests with this mail address! Please wait %(delay)s."
msgstr ""
"Zu viele Account-Registrierungen mit dieser E-Mail-Adresse! Bitte warte "
"%(delay)s."
#: uffd/invite/views.py:170 uffd/signup/views.py:56 uffd/signup/views.py:92
#: uffd/invite/views.py:195 uffd/signup/views.py:58 uffd/signup/views.py:107
#, python-format
msgid "Too many requests! Please wait %(delay)s."
msgstr "Zu viele Anfragen! Bitte warte %(delay)s."
#: uffd/invite/views.py:183 uffd/signup/views.py:68
#: uffd/invite/views.py:208 uffd/signup/views.py:70
msgid "Cound not send mail"
msgstr "Mailversand fehlgeschlagen"
......@@ -211,25 +211,30 @@ msgstr "Link gibt Accounts die Rolle \"%(name)s\""
msgid "Never used"
msgstr "Keine Verwendungen"
#: uffd/invite/templates/invite/list.html:108
#: uffd/invite/templates/invite/list.html:109
#, python-format
msgid "Registration of user <a href=\"%(user_url)s\">%(user_name)s</a>"
msgstr "Account-Registrierung von <a href=\"%(user_url)s\">%(user_name)s</a>"
#: uffd/invite/templates/invite/list.html:111
#, fuzzy
msgid "Registration of a user (no longer available)"
msgstr "Account-Registrierung (Account existiert nicht mehr)"
#: uffd/invite/templates/invite/list.html:115
#, python-format
msgid "Roles granted to <a href=\"%(user_url)s\">%(user_name)s</a>"
msgstr "Rollen an <a href=\"%(user_url)s\">%(user_name)s</a> vergeben"
#: uffd/invite/templates/invite/list.html:122
#: uffd/invite/templates/invite/list.html:126
msgid "Disable Link"
msgstr "Link deaktivieren"
#: uffd/invite/templates/invite/list.html:126
#: uffd/invite/templates/invite/list.html:130
msgid "Reenable Link"
msgstr "Link reaktivieren"
#: uffd/invite/templates/invite/list.html:140
#: uffd/invite/templates/invite/list.html:144
msgid "Invite"
msgstr "Einladungslink"
......@@ -251,7 +256,7 @@ msgid "Must be within the next %(max_valid_days)d days"
msgstr "Muss innerhalb der nächsten %(max_valid_days)d Tage liegen"
#: uffd/invite/templates/invite/new.html:19
#: uffd/signup/templates/signup/start.html:11
#: uffd/signup/templates/signup/start.html:6
msgid "Account Registration"
msgstr "Account-Registrierung"
......@@ -289,26 +294,26 @@ msgid "Create Link"
msgstr "Link erstellen"
#: uffd/invite/templates/invite/new.html:56
#: uffd/mail/templates/mail/show.html:28 uffd/mfa/templates/mfa/auth.html:39
#: uffd/mail/templates/mail/show.html:28 uffd/mfa/templates/mfa/auth.html:33
#: uffd/role/templates/role/show.html:14
#: uffd/rolemod/templates/rolemod/show.html:11
#: uffd/session/templates/session/deviceauth.html:44
#: uffd/session/templates/session/deviceauth.html:54
#: uffd/session/templates/session/devicelogin.html:34
#: uffd/session/templates/session/deviceauth.html:39
#: uffd/session/templates/session/deviceauth.html:49
#: uffd/session/templates/session/devicelogin.html:29
#: uffd/user/templates/user/show.html:8
msgid "Cancel"
msgstr "Abbrechen"
#: uffd/invite/templates/invite/use.html:11
#: uffd/invite/templates/invite/use.html:5
msgid "Invite Link"
msgstr "Einladungslink"
#: uffd/invite/templates/invite/use.html:14
#: uffd/invite/templates/invite/use.html:8
#, python-format
msgid "Welcome to the %(org_name)s Single-Sign-On!"
msgstr "Willkommen im %(org_name)s Single-Sign-On!"
#: uffd/invite/templates/invite/use.html:18
#: uffd/invite/templates/invite/use.html:12
msgid ""
"With this link you can register a new user account with the following "
"roles or add the roles to an existing account:"
......@@ -316,33 +321,33 @@ msgstr ""
"Mit diesem Link kannst du einen Account mit den folgenden Rollen "
"erstellen oder diese Rollen zu einem existierenden Account hinzufügen:"
#: uffd/invite/templates/invite/use.html:20
#: uffd/invite/templates/invite/use.html:14
msgid "With this link you can add the following roles to an existing account:"
msgstr ""
"Mit diesem Link kannst du die folgenden Rollen zu einem existierenden "
"Account hinzufügen:"
#: uffd/invite/templates/invite/use.html:22
#: uffd/invite/templates/invite/use.html:16
msgid "With this link you can register a new user account."
msgstr "Mit diesem Link kannst du einen Account registieren."
#: uffd/invite/templates/invite/use.html:34
#: uffd/invite/templates/invite/use.html:28
msgid "Add the roles to your account now"
msgstr "Rollen jetzt zu deinem Account hinzufügen"
#: uffd/invite/templates/invite/use.html:36
#: uffd/invite/templates/invite/use.html:30
msgid "Logout and switch to a different account"
msgstr "Abmelden und zu einem anderen Account wechseln"
#: uffd/invite/templates/invite/use.html:39
#: uffd/invite/templates/invite/use.html:33
msgid "Logout to register a new account"
msgstr "Abmelden um einen neuen Account zu registrieren"
#: uffd/invite/templates/invite/use.html:43
#: uffd/invite/templates/invite/use.html:37
msgid "Register a new account"
msgstr "Neuen Account registrieren"
#: uffd/invite/templates/invite/use.html:46
#: uffd/invite/templates/invite/use.html:40
msgid "Login and add the roles to your account"
msgstr "Anmelden und die Rollen zu deinem Account hinzufügen"
......@@ -395,7 +400,7 @@ msgstr "Generiere zuerst die Wiederherstellungscodes!"
msgid "Code is invalid"
msgstr "Wiederherstellungscode ist ungültig"
#: uffd/mfa/views.py:115
#: uffd/mfa/views.py:127
#, python-format
msgid ""
"2FA WebAuthn support disabled because import of the fido2 module failed "
......@@ -404,16 +409,16 @@ msgstr ""
"2FA WebAuthn Unterstützung deaktiviert, da das fido2 Modul nicht geladen "
"werden konnte (%s)"
#: uffd/mfa/views.py:224
#: uffd/mfa/views.py:238
#, python-format
msgid "We received too many invalid attempts! Please wait at least %s."
msgstr "Wir haben zu viele fehlgeschlagene Versuche! Bitte warte mindestens %s."
#: uffd/mfa/views.py:238
#: uffd/mfa/views.py:252
msgid "You have exhausted your recovery codes. Please generate new ones now!"
msgstr "Du hast keine Wiederherstellungscode mehr. Bitte generiere diese jetzt!"
#: uffd/mfa/views.py:241
#: uffd/mfa/views.py:255
msgid ""
"You only have a few recovery codes remaining. Make sure to generate new "
"ones before they run out."
......@@ -421,38 +426,38 @@ msgstr ""
"Du hast nur noch wenige Wiederherstellungscodes übrig. Bitte generiere "
"diese erneut bevor keine mehr übrig sind."
#: uffd/mfa/views.py:245
#: uffd/mfa/views.py:259
msgid "Two-factor authentication failed"
msgstr "Zwei-Faktor-Authentifizierung fehlgeschlagen"
#: uffd/mfa/templates/mfa/auth.html:12
#: uffd/mfa/templates/mfa/auth.html:6
#: uffd/selfservice/templates/selfservice/self.html:67
msgid "Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung"
#: uffd/mfa/templates/mfa/auth.html:17
#: uffd/mfa/templates/mfa/auth.html:11
msgid "Enable javascript for authentication with U2F/FIDO2 devices"
msgstr "Aktiviere Javascript zur Authentifizierung mit U2F/FIDO2 Geräten"
#: uffd/mfa/templates/mfa/auth.html:21
#: uffd/mfa/templates/mfa/auth.html:15
msgid "Authentication with U2F/FIDO2 devices is not supported by your browser"
msgstr ""
"Authentifizierung mit U2F/FIDO2 Geräten wird von deinem Browser nicht "
"unterstützt"
#: uffd/mfa/templates/mfa/auth.html:27
#: uffd/mfa/templates/mfa/auth.html:21
msgid "Authenticate with U2F/FIDO2 device"
msgstr "Authentifiziere dich mit einem U2F/FIDO2 Gerät"
#: uffd/mfa/templates/mfa/auth.html:30
#: uffd/mfa/templates/mfa/auth.html:24
msgid "or"
msgstr "oder"
#: uffd/mfa/templates/mfa/auth.html:33
#: uffd/mfa/templates/mfa/auth.html:27
msgid "Code from your authenticator app or recovery code"
msgstr "Code aus deiner Authentifikator-App oder Wiederherstellungscode"
#: uffd/mfa/templates/mfa/auth.html:36
#: uffd/mfa/templates/mfa/auth.html:30
msgid "Verify"
msgstr "Verifizieren"
......@@ -704,7 +709,7 @@ msgstr "Verifiziere und beende das Setup"
msgid "You need to login to access this service"
msgstr "Du musst dich anmelden, um auf diesen Dienst zugreifen zu können"
#: uffd/oauth2/views.py:140 uffd/selfservice/views.py:79
#: uffd/oauth2/views.py:173 uffd/selfservice/views.py:80
#: uffd/session/views.py:97
#, python-format
msgid ""
......@@ -714,15 +719,15 @@ msgstr ""
"Wir haben zu viele Anfragen von deiner IP-Adresses bzw. aus deinem "
"Netzwerk empfangen! Bitte warte mindestens %(delay)s."
#: uffd/oauth2/views.py:148
#: uffd/oauth2/views.py:181
msgid "Device login is currently not available. Try again later!"
msgstr "Geräte-Login ist gerade nicht verfügbar. Versuche es später nochmal!"
#: uffd/oauth2/views.py:161
#: uffd/oauth2/views.py:194
msgid "Device login failed"
msgstr "Gerätelogin fehlgeschlagen"
#: uffd/oauth2/views.py:174
#: uffd/oauth2/views.py:207
#, python-format
msgid ""
"You don't have the permission to access the service "
......@@ -731,15 +736,15 @@ msgstr ""
"Du bist nicht berechtigt, auf den Dienst <b>%(service_name)s</b> "
"zuzugreifen."
#: uffd/oauth2/templates/oauth2/logout.html:10 uffd/templates/base.html:99
#: uffd/oauth2/templates/oauth2/logout.html:5 uffd/templates/base.html:99
msgid "Logout"
msgstr "Abmelden"
#: uffd/oauth2/templates/oauth2/logout.html:15
#: uffd/oauth2/templates/oauth2/logout.html:10
msgid "Javascript is required for automatic logout"
msgstr "Für das automatische Abmelden muss Javascript aktiviert sein"
#: uffd/oauth2/templates/oauth2/logout.html:17
#: uffd/oauth2/templates/oauth2/logout.html:12
msgid ""
"While you successfully logged out of the Single-Sign-On service, you may "
"still be logged in on these services:"
......@@ -747,7 +752,7 @@ msgstr ""
"Während du nun aus dem Single-Sign-On abgemeldet bist, bist du eventuell "
"weiterhin in folgenden Diensten angemeldet:"
#: uffd/oauth2/templates/oauth2/logout.html:30
#: uffd/oauth2/templates/oauth2/logout.html:25
msgid ""
"Please wait until you have been automatically logged out of all services "
"or make sure of this yourself."
......@@ -755,19 +760,19 @@ msgstr ""
"Bitte warte, bis das automatische Abmelden bei allen Diensten "
"abgeschlossen ist oder melde dich überall manuell ab."
#: uffd/oauth2/templates/oauth2/logout.html:34
#: uffd/oauth2/templates/oauth2/logout.html:29
msgid "Logging you out on all services ..."
msgstr "Abmeldung bei allen Diensten ..."
#: uffd/oauth2/templates/oauth2/logout.html:38
#: uffd/oauth2/templates/oauth2/logout.html:33
msgid "Skip this and continue"
msgstr "Automatisches Abmelden überspringen"
#: uffd/oauth2/templates/oauth2/logout.html:82
#: uffd/oauth2/templates/oauth2/logout.html:75
msgid "Done, redirecting ..."
msgstr "Abgeschlossen, leite weiter ..."
#: uffd/oauth2/templates/oauth2/logout.html:86
#: uffd/oauth2/templates/oauth2/logout.html:79
msgid "Log out failed on some services. Retry?"
msgstr ""
"Automatisches Abmelden bei einigen Diensten fehlgeschlagen. Nochmal "
......@@ -907,31 +912,31 @@ msgstr "Mitglieder:"
msgid "Remove"
msgstr "Entfernen"
#: uffd/selfservice/views.py:25
#: uffd/selfservice/views.py:26
msgid "Selfservice"
msgstr "Selfservice"
#: uffd/selfservice/views.py:37
#: uffd/selfservice/views.py:38
msgid "Display name changed."
msgstr "Anzeigename geändert."
#: uffd/selfservice/views.py:39
#: uffd/selfservice/views.py:40
msgid "Display name is not valid."
msgstr "Anzeigename ist nicht valide."
#: uffd/selfservice/views.py:42
#: uffd/selfservice/views.py:43
msgid "We sent you an email, please verify your mail address."
msgstr "Wir haben dir eine E-Mail gesendet, bitte prüfe deine E-Mail-Adresse."
#: uffd/selfservice/views.py:56
#: uffd/selfservice/views.py:57
msgid "Password changed"
msgstr "Passwort geändert"
#: uffd/selfservice/views.py:59
#: uffd/selfservice/views.py:60
msgid "Invalid password"
msgstr "Passwort ungültig"
#: uffd/selfservice/views.py:77
#: uffd/selfservice/views.py:78
#, python-format
msgid ""
"We received too many password reset requests for this user! Please wait "
......@@ -940,7 +945,7 @@ msgstr ""
"Wir haben zu viele fehlgeschlagene Anmeldeversuche für diesen Account! "
"Bitte warte mindestens %(delay)s."
#: uffd/selfservice/views.py:83
#: uffd/selfservice/views.py:84
msgid ""
"We sent a mail to this user's mail address if you entered the correct "
"mail and login name combination"
......@@ -948,27 +953,28 @@ msgstr ""
"Falls E-Mail-Adresse und Anmeldename richtig waren, wurde eine E-Mail an "
"die Adresse gesendet."
#: uffd/selfservice/views.py:93 uffd/selfservice/views.py:123
#: uffd/selfservice/views.py:99 uffd/selfservice/views.py:108
#: uffd/selfservice/views.py:142 uffd/selfservice/views.py:152
msgid "Token expired, please try again."
msgstr "Link abgelaufen, bitte versuche es erneut."
#: uffd/selfservice/views.py:101
#: uffd/selfservice/views.py:116
msgid "You need to set a password, please try again."
msgstr "Password fehlt, bitte versuche es erneut."
#: uffd/selfservice/views.py:104
#: uffd/selfservice/views.py:119
msgid "Passwords do not match, please try again."
msgstr "Die Passwörter stimmen nicht überein, bitte versuche es erneut"
#: uffd/selfservice/views.py:110
#: uffd/selfservice/views.py:125
msgid "Password ist not valid, please try again."
msgstr "Ungültiges Passwort, bitte versuche es erneut"
#: uffd/selfservice/views.py:113
#: uffd/selfservice/views.py:128
msgid "New password set"
msgstr "Passwort geändert"
#: uffd/selfservice/views.py:131
#: uffd/selfservice/views.py:159
msgid ""
"This link was generated for another user. Login as the correct user to "
"continue."
......@@ -976,41 +982,41 @@ msgstr ""
"Dieser Link wurde für einen anderen Account erstellt. Melde dich mit dem "
"richtigen Account an um Fortzufahren."
#: uffd/selfservice/views.py:133
#: uffd/selfservice/views.py:161
msgid "New mail set"
msgstr "E-Mail-Adresse geändert"
#: uffd/selfservice/views.py:144
#: uffd/selfservice/views.py:172
msgid "Leaving roles is disabled"
msgstr "Verlassen von Rollen ist deaktiviert"
#: uffd/selfservice/views.py:151
#: uffd/selfservice/views.py:179
#, python-format
msgid "You left role %(role_name)s"
msgstr "Rolle %(role_name)s verlassen"
#: uffd/selfservice/views.py:168 uffd/selfservice/views.py:188
#: uffd/selfservice/views.py:196 uffd/selfservice/views.py:216
#, python-format
msgid "Mail to \"%(mail_address)s\" could not be sent!"
msgstr "E-Mail an \"%(mail_address)s\" konnte nicht gesendet werden!"
#: uffd/selfservice/templates/selfservice/forgot_password.html:11
#: uffd/selfservice/templates/selfservice/forgot_password.html:6
msgid "Forgot password"
msgstr "Passwort vergessen"
#: uffd/selfservice/templates/selfservice/forgot_password.html:14
#: uffd/selfservice/templates/selfservice/forgot_password.html:9
#: uffd/selfservice/templates/selfservice/self.html:21
#: uffd/session/templates/session/login.html:14
#: uffd/signup/templates/signup/start.html:19
#: uffd/session/templates/session/login.html:9
#: uffd/signup/templates/signup/start.html:14
#: uffd/user/templates/user/list.html:18 uffd/user/templates/user/show.html:48
msgid "Login Name"
msgstr "Anmeldename"
#: uffd/selfservice/templates/selfservice/forgot_password.html:18
#: uffd/selfservice/templates/selfservice/forgot_password.html:13
msgid "Mail Address"
msgstr "E-Mail-Adresse"
#: uffd/selfservice/templates/selfservice/forgot_password.html:22
#: uffd/selfservice/templates/selfservice/forgot_password.html:17
msgid "Send password reset mail"
msgstr "Passwort-Zurücksetzen-Mail versenden"
......@@ -1043,13 +1049,13 @@ msgid "Changes may take serveral minutes to be visible in all services."
msgstr "Änderungen sind erst nach einigen Minuten in allen Diensten sichtbar."
#: uffd/selfservice/templates/selfservice/self.html:25
#: uffd/signup/templates/signup/start.html:32
#: uffd/signup/templates/signup/start.html:27
#: uffd/user/templates/user/list.html:19 uffd/user/templates/user/show.html:63
msgid "Display Name"
msgstr "Anzeigename"
#: uffd/selfservice/templates/selfservice/self.html:29
#: uffd/signup/templates/signup/start.html:39
#: uffd/signup/templates/signup/start.html:34
msgid "E-Mail Address"
msgstr "E-Mail-Adresse"
......@@ -1064,8 +1070,8 @@ msgid "Update Profile"
msgstr "Änderungen speichern"
#: uffd/selfservice/templates/selfservice/self.html:44
#: uffd/session/templates/session/login.html:18
#: uffd/signup/templates/signup/start.html:46
#: uffd/session/templates/session/login.html:13
#: uffd/signup/templates/signup/start.html:41
#: uffd/user/templates/user/show.html:77
msgid "Password"
msgstr "Passwort"
......@@ -1082,13 +1088,13 @@ msgstr ""
" Support-Anfragen benötigt."
#: uffd/selfservice/templates/selfservice/self.html:50
#: uffd/selfservice/templates/selfservice/set_password.html:14
#: uffd/selfservice/templates/selfservice/set_password.html:9
msgid "New Password"
msgstr "Neues Passwort"
#: uffd/selfservice/templates/selfservice/self.html:56
#: uffd/selfservice/templates/selfservice/set_password.html:21
#: uffd/signup/templates/signup/start.html:53
#: uffd/selfservice/templates/selfservice/set_password.html:16
#: uffd/signup/templates/signup/start.html:48
msgid "Repeat Password"
msgstr "Passwort wiederholen"
......@@ -1153,11 +1159,11 @@ msgstr "Verlassen"
msgid "You currently don't have any roles"
msgstr "Du hast derzeit keine Rollen"
#: uffd/selfservice/templates/selfservice/set_password.html:11
#: uffd/selfservice/templates/selfservice/set_password.html:6
msgid "Reset password"
msgstr "Passwort zurücksetzen"
#: uffd/selfservice/templates/selfservice/set_password.html:25
#: uffd/selfservice/templates/selfservice/set_password.html:20
msgid "Set password"
msgstr "Passwort setzen"
......@@ -1215,28 +1221,28 @@ msgstr "Ungültiger Bestätigungscode"
msgid "Invalid initiation code"
msgstr "Ungültiger Startcode"
#: uffd/session/templates/session/deviceauth.html:17
#: uffd/session/templates/session/deviceauth.html:12
#: uffd/templates/base.html:92
msgid "Authorize Device Login"
msgstr "Gerätelogin erlauben"
#: uffd/session/templates/session/deviceauth.html:20
#: uffd/session/templates/session/deviceauth.html:15
msgid "Log into a service on another device without entering your password."
msgstr ""
"Melde dich an einem Dienst auf einem anderen Gerät an ohne dein Password "
"eingeben zu müssen."
#: uffd/session/templates/session/deviceauth.html:23
#: uffd/session/templates/session/devicelogin.html:18
#: uffd/session/templates/session/deviceauth.html:18
#: uffd/session/templates/session/devicelogin.html:13
msgid "Initiation Code"
msgstr "Startcode"
#: uffd/session/templates/session/deviceauth.html:32
#: uffd/session/templates/session/devicelogin.html:23
#: uffd/session/templates/session/deviceauth.html:27
#: uffd/session/templates/session/devicelogin.html:18
msgid "Confirmation Code"
msgstr "Bestätigungscode"
#: uffd/session/templates/session/deviceauth.html:38
#: uffd/session/templates/session/deviceauth.html:33
msgid ""
"Start logging into a service on the other device and chose \"Device "
"Login\" on the login page. Enter the displayed initiation code in the box"
......@@ -1246,21 +1252,21 @@ msgstr ""
"\"Gerätelogin\" auf der Anmeldeseite aus. Gib den angezeigten Startcode "
"oben ein."
#: uffd/session/templates/session/deviceauth.html:41
#: uffd/session/templates/session/devicelogin.html:30
#: uffd/session/templates/session/deviceauth.html:36
#: uffd/session/templates/session/devicelogin.html:25
msgid "Continue"
msgstr "Weiter"
#: uffd/session/templates/session/deviceauth.html:48
#: uffd/session/templates/session/deviceauth.html:43
#, python-format
msgid "Authorize the login for service <b>%(service_name)s</b>?"
msgstr "Anmeldung an Dienst <b>%(service_name)s</b> erlauben?"
#: uffd/session/templates/session/deviceauth.html:51
#: uffd/session/templates/session/deviceauth.html:46
msgid "Authorize Login"
msgstr "Anmeldung erlauben"
#: uffd/session/templates/session/deviceauth.html:58
#: uffd/session/templates/session/deviceauth.html:53
msgid ""
"Enter the confirmation code on the other device and complete the login. "
"Click <em>Finish</em> afterwards."
......@@ -1268,16 +1274,16 @@ msgstr ""
"Gib den Bestätigungscode auf dem anderen Gerät ein und schließe die "
"Anmeldung ab. Clicke danach auf <em>Abschließen</em>."
#: uffd/session/templates/session/deviceauth.html:61
#: uffd/session/templates/session/deviceauth.html:56
msgid "Finish"
msgstr "Beenden"
#: uffd/session/templates/session/devicelogin.html:11
#: uffd/session/templates/session/devicelogin.html:6
#: uffd/templates/base.html:93
msgid "Device Login"
msgstr "Gerätelogin"
#: uffd/session/templates/session/devicelogin.html:14
#: uffd/session/templates/session/devicelogin.html:9
msgid ""
"Use a login session on another device (e.g. your laptop) to log into a "
"service without entering your password."
......@@ -1285,7 +1291,7 @@ msgstr ""
"Nutze eine Login-Sitzung auf einem anderen Gerät (z.B. deinem Laptop) um "
"dich bei einem Dienst anzumelden."
#: uffd/session/templates/session/devicelogin.html:27
#: uffd/session/templates/session/devicelogin.html:22
#, python-format
msgid ""
"Open <code><a href=\"%(deviceauth_url)s\">%(deviceauth_url)s</a></code> "
......@@ -1296,65 +1302,65 @@ msgstr ""
"auf dem anderen Gerät und gib dort den obenstehenden Startcode ein. Geben"
" anschließend den Bestätigungscode hier ein."
#: uffd/session/templates/session/login.html:11
#: uffd/session/templates/session/login.html:22
#: uffd/session/templates/session/login.html:6
#: uffd/session/templates/session/login.html:17
msgid "Login"
msgstr "Anmelden"
#: uffd/session/templates/session/login.html:25
#: uffd/session/templates/session/login.html:20
msgid "- or -"
msgstr "- oder -"
#: uffd/session/templates/session/login.html:27
#: uffd/session/templates/session/login.html:22
msgid "Login with another device"
msgstr "Über anderes Gerät anmelden"
#: uffd/session/templates/session/login.html:32
#: uffd/session/templates/session/login.html:27
msgid "Register"
msgstr "Registrieren"
#: uffd/session/templates/session/login.html:35
#: uffd/session/templates/session/login.html:30
msgid "Forgot Password?"
msgstr "Passwort vergessen?"
#: uffd/signup/views.py:23
#: uffd/signup/views.py:25
msgid "Singup not enabled"
msgstr "Account-Registrierung ist deaktiviert"
#: uffd/signup/views.py:77 uffd/signup/views.py:85
#: uffd/signup/views.py:83 uffd/signup/views.py:92 uffd/signup/views.py:100
msgid "Invalid signup link"
msgstr "Ungültiger Account-Registrierungs-Link"
#: uffd/signup/views.py:90
#: uffd/signup/views.py:105
#, python-format
msgid "Too many failed attempts! Please wait %(delay)s."
msgstr "Zu viele fehlgeschlagene Versuche! Bitte warte mindestens %(delay)s."
#: uffd/signup/views.py:96
#: uffd/signup/views.py:111
msgid "Wrong password"
msgstr "Falsches Passwort"
#: uffd/signup/views.py:103
#: uffd/signup/views.py:118
msgid "Your account was successfully created"
msgstr "Account erfolgreich erstellt"
#: uffd/signup/templates/signup/confirm.html:11
#: uffd/signup/templates/signup/confirm.html:6
msgid "Complete Registration"
msgstr "Account-Registrierung abschließen"
#: uffd/signup/templates/signup/confirm.html:17
#: uffd/signup/templates/signup/confirm.html:12
msgid "Please enter your password to complete the account registration"
msgstr "Bitte gib dein Passwort ein, um die Account-Registrierung abzuschließen"
#: uffd/signup/templates/signup/confirm.html:21
#: uffd/signup/templates/signup/confirm.html:16
msgid "Complete Account Registration"
msgstr "Account-Registrierung abschließen"
#: uffd/signup/templates/signup/start.html:23
#: uffd/signup/templates/signup/start.html:18
msgid "Check"
msgstr "Überprüfen"
#: uffd/signup/templates/signup/start.html:28
#: uffd/signup/templates/signup/start.html:23
msgid ""
"At least one and at most 32 lower-case characters, digits, dashes (\"-\")"
" or underscores (\"_\"). <b>Cannot be changed later!</b>"
......@@ -1362,11 +1368,11 @@ msgstr ""
"1 bis 32 Kleinbuchstaben, Zahlen, Binde- (\"-\") und Unterstriche "
"(\"_\"). <b>Kann später nicht geändert werden!</b>"
#: uffd/signup/templates/signup/start.html:35
#: uffd/signup/templates/signup/start.html:30
msgid "At least one and at most 128 characters, no other special requirements."
msgstr "Mindestens 1 und maximal 128 Zeichen, keine weiteren Einschränkungen."
#: uffd/signup/templates/signup/start.html:42
#: uffd/signup/templates/signup/start.html:37
msgid ""
"We will send a confirmation mail to this address that you need to "
"complete the registration."
......@@ -1374,27 +1380,27 @@ msgstr ""
"Wir werden eine Bestätigungsmail an diese Adresse senden. Du benötigst "
"sie, um die Account-Registrierung abzuschließen."
#: uffd/signup/templates/signup/start.html:57
#: uffd/signup/templates/signup/start.html:52
msgid "Create Account"
msgstr "Account registrieren"
#: uffd/signup/templates/signup/start.html:86
#: uffd/signup/templates/signup/start.html:79
msgid "The name is already taken"
msgstr "Dieser Name wird bereits verwendet"
#: uffd/signup/templates/signup/start.html:89
#: uffd/signup/templates/signup/start.html:82
msgid "Too many requests! Please wait a bit before trying again!"
msgstr "Zu viele Anfragen! Bitte warte etwas, bevor du es erneut versuchst!"
#: uffd/signup/templates/signup/start.html:92
#: uffd/signup/templates/signup/start.html:85
msgid "The name is invalid"
msgstr "Name ungültig"
#: uffd/signup/templates/signup/submitted.html:11
#: uffd/signup/templates/signup/submitted.html:5
msgid "Confirm your E-Mail Address"
msgstr "E-Mail-Adresse bestätigen"
#: uffd/signup/templates/signup/submitted.html:13
#: uffd/signup/templates/signup/submitted.html:7
#, python-format
msgid ""
"We sent a confirmation mail to <b>%(signup_mail)s</b>. You need to "
......@@ -1405,7 +1411,7 @@ msgstr ""
"deine E-Mail-Adresse innerhalb von 48 Stunden bestätigen, um die Account-"
"Registrierung abzuschließen."
#: uffd/signup/templates/signup/submitted.html:14
#: uffd/signup/templates/signup/submitted.html:8
msgid ""
"If you mistyped your mail address or don't receive the confirmation mail "
"for another reason, retry the registration procedure from the beginning."
......