From deeb8da2260c094034cb828e0292b9ae96ab67ca Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 17 Aug 2023 17:39:58 +0800 Subject: [PATCH 001/115] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=20django=20c?= =?UTF-8?q?as=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 6 +++--- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7a3397d29..0bc57ce0a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1824,7 +1824,7 @@ description = "" optional = false python-versions = ">=3.7" files = [ - {file = "django-cas-ng-4.3.1.zip", hash = "sha256:aeea96ad7958e3cb40d9bb5ef6a1add66f720835dfe87cc1dfe163f92d084690"}, + {file = "django-cas-ng-4.3.2.zip", hash = "sha256:3539eae7ca857017cefa962782c99cbd35cc15ea741655b10c3417fa7e86807a"}, ] [package.dependencies] @@ -1833,7 +1833,7 @@ python-cas = ">=1.6.0" [package.source] type = "url" -url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.1/django-cas-ng-4.3.1.zip" +url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.2/django-cas-ng-4.3.2.zip" [[package]] name = "django-celery-beat" @@ -7223,4 +7223,4 @@ reference = "tsinghua" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "0bc2878f163c8b2f48d1103d96314c56f722f10d8f8adf6dfaba0452e6eac368" +content-hash = "6772c51033ce0b8cc877596f541cef0b902fe81d7495367cf4f7febec2bc260b" diff --git a/pyproject.toml b/pyproject.toml index 00d18bf29..5df11be53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,7 +114,7 @@ websockets = "11.0.3" python-ldap = "3.4.3" ldap3 = "2.9.1" django-radius = { url = "https://github.com/ibuler/django-radius/archive/refs/tags/1.5.0.zip" } -django-cas-ng = { url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.1/django-cas-ng-4.3.1.zip" } +django-cas-ng = {url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.2/django-cas-ng-4.3.2.zip"} python-cas = "1.6.0" django-auth-ldap = "4.4.0" boto3 = "1.28.9" From 7506c7ea43088a1ec9b934520bda106a36aef72d Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 17 Aug 2023 18:25:13 +0800 Subject: [PATCH 002/115] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AF=86?= =?UTF-8?q?=E9=92=A5=E6=A0=A1=E9=AA=8Cansible=E4=B8=8D=E6=94=AF=E6=8C=81{%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/accounts/utils.py | 2 ++ apps/locale/ja/LC_MESSAGES/django.mo | 4 ++-- apps/locale/ja/LC_MESSAGES/django.po | 32 ++++++++++++++++------------ apps/locale/zh/LC_MESSAGES/django.mo | 4 ++-- apps/locale/zh/LC_MESSAGES/django.po | 32 ++++++++++++++++------------ 5 files changed, 42 insertions(+), 32 deletions(-) diff --git a/apps/accounts/utils.py b/apps/accounts/utils.py index c0e3fc1cd..cc467ecc0 100644 --- a/apps/accounts/utils.py +++ b/apps/accounts/utils.py @@ -39,6 +39,8 @@ def validate_password_for_ansible(password): # Ansible 推送的时候不支持 if '{{' in password: raise serializers.ValidationError(_('Password can not contains `{{` ')) + if '{%' in password: + raise serializers.ValidationError(_('Password can not contains `{%` ')) # Ansible Windows 推送的时候不支持 if "'" in password: raise serializers.ValidationError(_("Password can not contains `'` ")) diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index 2e46fa34c..d89c38567 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:810d46e14e09a2309a8d898bc391f33082bfc5c164dec246bd95cea8436e33ee -size 154540 +oid sha256:f87b3d05a2f665ef21a4876b9af8ba651936220b35633d1dc6a93941000bd253 +size 154676 diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index e541c9c8c..791dc3098 100644 --- a/apps/locale/ja/LC_MESSAGES/django.po +++ b/apps/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-17 15:30+0800\n" +"POT-Creation-Date: 2023-08-17 18:24+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -857,15 +857,19 @@ msgstr "アカウント接続のテスト" msgid "Password can not contains `{{` " msgstr "パスワードには '{{' を含まない" -#: accounts/utils.py:44 +#: accounts/utils.py:43 +msgid "Password can not contains `{%` " +msgstr "パスワードには '{%' を含まない" + +#: accounts/utils.py:46 msgid "Password can not contains `'` " msgstr "パスワードには `'` を含まない" -#: accounts/utils.py:46 +#: accounts/utils.py:48 msgid "Password can not contains `\"` " msgstr "パスワードには `\"` を含まない" -#: accounts/utils.py:52 +#: accounts/utils.py:54 msgid "private key invalid or passphrase error" msgstr "秘密鍵が無効またはpassphraseエラー" @@ -1032,7 +1036,7 @@ msgid "None of the reviewers belong to Organization `{}`" msgstr "いずれのレビューアも組織 '{}' に属していません" #: acls/serializers/rules/rules.py:20 -#: xpack/plugins/cloud/serializers/task.py:133 +#: xpack/plugins/cloud/serializers/task.py:137 msgid "IP address invalid: `{}`" msgstr "IPアドレスが無効: '{}'" @@ -7696,7 +7700,7 @@ msgstr "クラウドアカウント" msgid "Test cloud account" msgstr "クラウドアカウントのテスト" -#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers/task.py:147 +#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers/task.py:151 msgid "Regions" msgstr "リージョン" @@ -7705,17 +7709,17 @@ msgid "Hostname strategy" msgstr "ホスト名戦略" #: xpack/plugins/cloud/models.py:100 -#: xpack/plugins/cloud/serializers/task.py:150 +#: xpack/plugins/cloud/serializers/task.py:154 msgid "IP network segment group" msgstr "IPネットワークセグメントグループ" #: xpack/plugins/cloud/models.py:103 -#: xpack/plugins/cloud/serializers/task.py:155 +#: xpack/plugins/cloud/serializers/task.py:159 msgid "Sync IP type" msgstr "同期IPタイプ" #: xpack/plugins/cloud/models.py:106 -#: xpack/plugins/cloud/serializers/task.py:173 +#: xpack/plugins/cloud/serializers/task.py:177 msgid "Always update" msgstr "常に更新" @@ -7808,7 +7812,7 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:317 +#: xpack/plugins/cloud/models.py:317 xpack/plugins/cloud/serializers/task.py:70 msgid "Strategy rule" msgstr "戦略ルール" @@ -7820,7 +7824,7 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:341 +#: xpack/plugins/cloud/models.py:341 xpack/plugins/cloud/serializers/task.py:73 msgid "Strategy action" msgstr "戦略アクション" @@ -8108,7 +8112,7 @@ msgstr "テストタイムアウト" msgid "Project" msgstr "project" -#: xpack/plugins/cloud/serializers/task.py:139 +#: xpack/plugins/cloud/serializers/task.py:143 msgid "" "Only instances matching the IP range will be synced.
If the instance " "contains multiple IP addresses, the first IP address that matches will be " @@ -8122,11 +8126,11 @@ msgstr "" "ドレスをランダムに一致させることを意味します。
例: " "192.168.1.0/24,10.1.1.1-10.1.1.20。" -#: xpack/plugins/cloud/serializers/task.py:145 +#: xpack/plugins/cloud/serializers/task.py:149 msgid "History count" msgstr "実行回数" -#: xpack/plugins/cloud/serializers/task.py:146 +#: xpack/plugins/cloud/serializers/task.py:150 msgid "Instance count" msgstr "インスタンス数" diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 16bde8040..a41cce69b 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da4f312ed86d27fa8b6bde8da3bc70b0f32fe40811ee855f9fe81d89a68a646f -size 126402 +oid sha256:f2f7fa427404ca2b2f5651cb1be3e84876dad9d72f14e488321a2dc84d4f4051 +size 126472 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 5f14e8671..dfacac28e 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-17 15:30+0800\n" +"POT-Creation-Date: 2023-08-17 18:24+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -857,15 +857,19 @@ msgstr "测试账号可连接性" msgid "Password can not contains `{{` " msgstr "密码不能包含 `{{` 字符" -#: accounts/utils.py:44 +#: accounts/utils.py:43 +msgid "Password can not contains `{%` " +msgstr "密码不能包含 `{%` 字符" + +#: accounts/utils.py:46 msgid "Password can not contains `'` " msgstr "密码不能包含 `'` 字符" -#: accounts/utils.py:46 +#: accounts/utils.py:48 msgid "Password can not contains `\"` " msgstr "密码不能包含 `\"` 字符" -#: accounts/utils.py:52 +#: accounts/utils.py:54 msgid "private key invalid or passphrase error" msgstr "密钥不合法或密钥密码错误" @@ -1031,7 +1035,7 @@ msgid "None of the reviewers belong to Organization `{}`" msgstr "所有复核人都不属于组织 `{}`" #: acls/serializers/rules/rules.py:20 -#: xpack/plugins/cloud/serializers/task.py:133 +#: xpack/plugins/cloud/serializers/task.py:137 msgid "IP address invalid: `{}`" msgstr "IP 地址无效: `{}`" @@ -7588,7 +7592,7 @@ msgstr "云账号" msgid "Test cloud account" msgstr "测试云账号" -#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers/task.py:147 +#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers/task.py:151 msgid "Regions" msgstr "地域" @@ -7597,17 +7601,17 @@ msgid "Hostname strategy" msgstr "主机名策略" #: xpack/plugins/cloud/models.py:100 -#: xpack/plugins/cloud/serializers/task.py:150 +#: xpack/plugins/cloud/serializers/task.py:154 msgid "IP network segment group" msgstr "IP网段组" #: xpack/plugins/cloud/models.py:103 -#: xpack/plugins/cloud/serializers/task.py:155 +#: xpack/plugins/cloud/serializers/task.py:159 msgid "Sync IP type" msgstr "同步IP类型" #: xpack/plugins/cloud/models.py:106 -#: xpack/plugins/cloud/serializers/task.py:173 +#: xpack/plugins/cloud/serializers/task.py:177 msgid "Always update" msgstr "总是更新" @@ -7700,7 +7704,7 @@ msgstr "规则匹配" msgid "Rule value" msgstr "规则值" -#: xpack/plugins/cloud/models.py:317 +#: xpack/plugins/cloud/models.py:317 xpack/plugins/cloud/serializers/task.py:70 msgid "Strategy rule" msgstr "策略规则" @@ -7712,7 +7716,7 @@ msgstr "动作属性" msgid "Action value" msgstr "动作值" -#: xpack/plugins/cloud/models.py:341 +#: xpack/plugins/cloud/models.py:341 xpack/plugins/cloud/serializers/task.py:73 msgid "Strategy action" msgstr "策略动作" @@ -7999,7 +8003,7 @@ msgstr "测试超时时间" msgid "Project" msgstr "project" -#: xpack/plugins/cloud/serializers/task.py:139 +#: xpack/plugins/cloud/serializers/task.py:143 msgid "" "Only instances matching the IP range will be synced.
If the instance " "contains multiple IP addresses, the first IP address that matches will be " @@ -8011,11 +8015,11 @@ msgstr "" "到的 IP 地址将被用作创建的资产的 IP。
默认值 * 表示同步所有实例和随机匹配 " "IP 地址。
例如: 192.168.1.0/24,10.1.1.1-10.1.1.20。" -#: xpack/plugins/cloud/serializers/task.py:145 +#: xpack/plugins/cloud/serializers/task.py:149 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers/task.py:146 +#: xpack/plugins/cloud/serializers/task.py:150 msgid "Instance count" msgstr "实例个数" From 61ce39b4baa649f8cd5719b64ece34acd1beae71 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 18 Aug 2023 15:19:26 +0800 Subject: [PATCH 003/115] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 8 ++++---- pyproject.toml | 8 +++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0bc57ce0a..39b9b7ee6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1348,13 +1348,13 @@ reference = "tsinghua" [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -7223,4 +7223,4 @@ reference = "tsinghua" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "6772c51033ce0b8cc877596f541cef0b902fe81d7495367cf4f7febec2bc260b" +content-hash = "f5bef179ee92691490abd486fd53596156e8af343ae8461a306c4fd8c174e348" diff --git a/pyproject.toml b/pyproject.toml index 5df11be53..797ec2048 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,7 +100,6 @@ openapi-codec = "1.3.2" pillow = "10.0.0" pytz = "2023.3" django-proxy = "1.2.2" -channels-redis = "4.1.0" python-daemon = "3.0.1" eventlet = "0.33.3" greenlet = "2.0.2" @@ -114,7 +113,7 @@ websockets = "11.0.3" python-ldap = "3.4.3" ldap3 = "2.9.1" django-radius = { url = "https://github.com/ibuler/django-radius/archive/refs/tags/1.5.0.zip" } -django-cas-ng = {url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.2/django-cas-ng-4.3.2.zip"} +django-cas-ng = { url = "https://github.com/ibuler/django-cas-ng/releases/download/v4.3.2/django-cas-ng-4.3.2.zip" } python-cas = "1.6.0" django-auth-ldap = "4.4.0" boto3 = "1.28.9" @@ -137,11 +136,10 @@ hvac = "1.1.1" pyhcl = "0.4.4" ipy = "1.1" netifaces = "^0.11.0" - -[tool.poetry.group.dev.dependencies] daphne = "4.0.0" channels = "^4.0.0" -channels-redis = "^4.1.0" +channels-redis = "4.1.0" + [tool.poetry.group.xpack.dependencies] qingcloud-sdk = "1.2.15" From ea7b409a7f6d9be735afd7950c850361968d6efc Mon Sep 17 00:00:00 2001 From: Bai Date: Fri, 18 Aug 2023 15:43:06 +0800 Subject: [PATCH 004/115] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B5=84?= =?UTF-8?q?=E4=BA=A7=E6=A0=91=E5=AD=90=E8=8A=82=E7=82=B9=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=90=8E=E6=B2=A1=E6=9C=89=E8=8E=B7=E5=8F=96=E5=88=B0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/assets/api/mixin.py b/apps/assets/api/mixin.py index 7d3c1c7a8..6dadbcdaa 100644 --- a/apps/assets/api/mixin.py +++ b/apps/assets/api/mixin.py @@ -42,7 +42,7 @@ class SerializeToTreeNodeMixin: 'name': _name(node), 'title': _name(node), 'pId': node.parent_key, - 'isParent': node.assets_amount > 0, + 'isParent': True, 'open': _open(node), 'meta': { 'data': { From 75e48953148ca7e914c5d4511f896795934c9a6f Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 18 Aug 2023 16:15:25 +0800 Subject: [PATCH 005/115] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=20allowed=20?= =?UTF-8?q?hosts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/settings/base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/jumpserver/settings/base.py b/apps/jumpserver/settings/base.py index 5bd7fb84e..b2a869f62 100644 --- a/apps/jumpserver/settings/base.py +++ b/apps/jumpserver/settings/base.py @@ -88,11 +88,12 @@ if DEBUG: DEBUG_HOST_PORTS = ['{}:{}'.format(host, port) for host in DEBUG_HOSTS for port in DEBUG_PORT] ALLOWED_DOMAINS.extend(DEBUG_HOST_PORTS) -ALLOWED_HOSTS = list(set(['.' + host.split(':')[0] for host in ALLOWED_DOMAINS])) print("ALLOWED_HOSTS: ", ) -for host in ALLOWED_HOSTS: +for host in ALLOWED_DOMAINS: print(' - ' + host.lstrip('.')) +ALLOWED_HOSTS = ['*'] + # https://docs.djangoproject.com/en/4.1/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS CSRF_TRUSTED_ORIGINS = [] for host_port in ALLOWED_DOMAINS: From 20799ece93134ef5c56f5ec5ed29b9b0499bf4bf Mon Sep 17 00:00:00 2001 From: Bai Date: Fri, 18 Aug 2023 16:45:12 +0800 Subject: [PATCH 006/115] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BC=9A=E8=AF=9D=E5=88=86=E4=BA=AB=E4=B8=8D=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E7=94=A8=E6=88=B7=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/models/session/sharing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/terminal/models/session/sharing.py b/apps/terminal/models/session/sharing.py index 92a75f9c4..11e06953d 100644 --- a/apps/terminal/models/session/sharing.py +++ b/apps/terminal/models/session/sharing.py @@ -6,6 +6,7 @@ from django.utils.translation import gettext_lazy as _ from django.utils.functional import cached_property from common.db.models import JMSBaseModel +from common.utils import is_uuid from orgs.mixins.models import OrgModelMixin from orgs.utils import tmp_to_root_org from users.models import User @@ -62,6 +63,9 @@ class SessionSharing(JMSBaseModel, OrgModelMixin): @cached_property def users_queryset(self): user_ids = self.users.split(',') + user_ids = [user_id for user_id in user_ids if is_uuid(user_id)] + if not user_ids: + return User.objects.none() return User.objects.filter(id__in=user_ids) @property From 822a124dbc6c55478abbd2a4df0af56ac62d932d Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 18 Aug 2023 16:46:29 +0800 Subject: [PATCH 007/115] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/authentication/login.html | 14 +++++++++++++- apps/authentication/views/login.py | 11 +++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/authentication/templates/authentication/login.html b/apps/authentication/templates/authentication/login.html index 3b8ae55a9..7163573ba 100644 --- a/apps/authentication/templates/authentication/login.html +++ b/apps/authentication/templates/authentication/login.html @@ -223,10 +223,21 @@ height: 13px; cursor: pointer; } + + .error-info { + font-size: 16px; + text-align: center; + } +{% if not origin_is_allowed %} +
+ 配置文件存在问题,无法完成登录,请联系管理员解决,或查看最新更新说明
+ Configuration file has problems and cannot be logged in. Please contact the administrator +
+{% endif %}