Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
586d6e6a
Commit
586d6e6a
authored
Jul 31, 2019
by
BaiJiangJie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Update] 添加用户过期邮件提醒
parent
9ab6c586
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
94 additions
and
23 deletions
+94
-23
django.mo
apps/locale/zh/LC_MESSAGES/django.mo
+0
-0
django.po
apps/locale/zh/LC_MESSAGES/django.po
+0
-0
_message.html
apps/templates/_message.html
+17
-1
user.py
apps/users/models/user.py
+13
-1
tasks.py
apps/users/tasks.py
+27
-5
utils.py
apps/users/utils.py
+37
-16
No files found.
apps/locale/zh/LC_MESSAGES/django.mo
View file @
586d6e6a
No preview for this file type
apps/locale/zh/LC_MESSAGES/django.po
View file @
586d6e6a
This diff is collapsed.
Click to expand it.
apps/templates/_message.html
View file @
586d6e6a
{% load i18n %}
{% load i18n %}
{% block user_expired_message %}
{% if request.user.is_expired %}
<div
class=
"alert alert-danger help-message alert-dismissable"
>
{% blocktrans %}
Your account has expired, please contact the administrator.
{% endblocktrans %}
<button
aria-hidden=
"true"
data-dismiss=
"alert"
class=
"close"
type=
"button"
style=
"outline: none;"
>
×
</button>
</div>
{% elif request.user.will_expired %}
<div
class=
"alert alert-danger help-message alert-dismissable"
>
{% trans 'Your account will at' %} {{ request.user.date_expired }} {% trans 'expired. ' %}
<button
aria-hidden=
"true"
data-dismiss=
"alert"
class=
"close"
type=
"button"
style=
"outline: none;"
>
×
</button>
</div>
{% endif %}
{% endblock %}
{% block password_expired_message %}
{% block password_expired_message %}
{% url 'users:user-password-update' as user_password_update_url %}
{% url 'users:user-password-update' as user_password_update_url %}
{% if request.user.password_has_expired
%}
{% if request.user.password_has_expired %}
<div
class=
"alert alert-danger help-message alert-dismissable"
>
<div
class=
"alert alert-danger help-message alert-dismissable"
>
{% blocktrans %}
{% blocktrans %}
Your password has expired, please click
<a
href=
"{{ user_password_update_url }}"
>
this link
</a>
update password.
Your password has expired, please click
<a
href=
"{{ user_password_update_url }}"
>
this link
</a>
update password.
...
...
apps/users/models/user.py
View file @
586d6e6a
...
@@ -402,6 +402,18 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
...
@@ -402,6 +402,18 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
else
:
else
:
return
False
return
False
@property
def
expired_remain_days
(
self
):
date_remain
=
self
.
date_expired
-
timezone
.
now
()
return
date_remain
.
days
@property
def
will_expired
(
self
):
if
0
<=
self
.
expired_remain_days
<
5
:
return
True
else
:
return
False
@property
@property
def
is_valid
(
self
):
def
is_valid
(
self
):
if
self
.
is_active
and
not
self
.
is_expired
:
if
self
.
is_active
and
not
self
.
is_expired
:
...
@@ -411,7 +423,7 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
...
@@ -411,7 +423,7 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
@property
@property
def
is_local
(
self
):
def
is_local
(
self
):
return
self
.
source
==
self
.
SOURCE_LOCAL
return
self
.
source
==
self
.
SOURCE_LOCAL
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
if
not
self
.
name
:
if
not
self
.
name
:
self
.
name
=
self
.
username
self
.
name
=
self
.
username
...
...
apps/users/tasks.py
View file @
586d6e6a
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
#
#
import
datetime
from
django.utils
import
timezone
from
django.conf
import
settings
from
celery
import
shared_task
from
celery
import
shared_task
from
ops.celery.utils
import
create_or_update_celery_periodic_tasks
from
ops.celery.utils
import
create_or_update_celery_periodic_tasks
from
ops.celery.decorator
import
after_app_ready_start
,
register_as_period_task
from
ops.celery.decorator
import
after_app_ready_start
from
common.utils
import
get_logger
from
common.utils
import
get_logger
from
.models
import
User
from
.models
import
User
from
.utils
import
send_password_expiration_reminder_mail
from
.utils
import
(
send_password_expiration_reminder_mail
,
send_user_expiration_reminder_mail
)
logger
=
get_logger
(
__file__
)
logger
=
get_logger
(
__file__
)
...
@@ -43,4 +42,27 @@ def check_password_expired_periodic():
...
@@ -43,4 +42,27 @@ def check_password_expired_periodic():
create_or_update_celery_periodic_tasks
(
tasks
)
create_or_update_celery_periodic_tasks
(
tasks
)
@shared_task
def
check_user_expired
():
users
=
User
.
objects
.
exclude
(
role
=
User
.
ROLE_APP
)
for
user
in
users
:
if
not
user
.
is_valid
:
continue
if
not
user
.
will_expired
:
continue
send_user_expiration_reminder_mail
(
user
)
@shared_task
@after_app_ready_start
def
check_user_expired_periodic
():
tasks
=
{
'check_user_expired_periodic'
:
{
'task'
:
check_user_expired
.
name
,
'interval'
:
None
,
'crontab'
:
'0 14 * * *'
,
'enabled'
:
True
,
}
}
create_or_update_celery_periodic_tasks
(
tasks
)
apps/users/utils.py
View file @
586d6e6a
...
@@ -89,20 +89,20 @@ def send_reset_password_mail(user):
...
@@ -89,20 +89,20 @@ def send_reset_password_mail(user):
recipient_list
=
[
user
.
email
]
recipient_list
=
[
user
.
email
]
message
=
_
(
"""
message
=
_
(
"""
Hello
%(name)
s:
Hello
%(name)
s:
<
/
br>
<br>
Please click the link below to reset your password, if not your request, concern your account security
Please click the link below to reset your password, if not your request, concern your account security
<
/
br>
<br>
<a href="
%(rest_password_url)
s?token=
%(rest_password_token)
s">Click here reset password</a>
<a href="
%(rest_password_url)
s?token=
%(rest_password_token)
s">Click here reset password</a>
<
/
br>
<br>
This link is valid for 1 hour. After it expires, <a href="
%(forget_password_url)
s?email=
%(email)
s">request new one</a>
This link is valid for 1 hour. After it expires, <a href="
%(forget_password_url)
s?email=
%(email)
s">request new one</a>
<
/
br>
<br>
---
---
<
/
br>
<br>
<a href="
%(login_url)
s">Login direct</a>
<a href="
%(login_url)
s">Login direct</a>
<
/
br>
<br>
"""
)
%
{
"""
)
%
{
'name'
:
user
.
name
,
'name'
:
user
.
name
,
'rest_password_url'
:
reverse
(
'users:reset-password'
,
external
=
True
),
'rest_password_url'
:
reverse
(
'users:reset-password'
,
external
=
True
),
...
@@ -122,24 +122,24 @@ def send_password_expiration_reminder_mail(user):
...
@@ -122,24 +122,24 @@ def send_password_expiration_reminder_mail(user):
recipient_list
=
[
user
.
email
]
recipient_list
=
[
user
.
email
]
message
=
_
(
"""
message
=
_
(
"""
Hello
%(name)
s:
Hello
%(name)
s:
<
/
br>
<br>
Your password will expire in
%(date_password_expired)
s,
Your password will expire in
%(date_password_expired)
s,
<
/
br>
<br>
For your account security, please click on the link below to update your password in time
For your account security, please click on the link below to update your password in time
<
/
br>
<br>
<a href="
%(update_password_url)
s">Click here update password</a>
<a href="
%(update_password_url)
s">Click here update password</a>
<
/
br>
<br>
If your password has expired, please click
If your password has expired, please click
<a href="
%(forget_password_url)
s?email=
%(email)
s">Password expired</a>
<a href="
%(forget_password_url)
s?email=
%(email)
s">Password expired</a>
to apply for a password reset email.
to apply for a password reset email.
<
/
br>
<br>
---
---
<
/
br>
<br>
<a href="
%(login_url)
s">Login direct</a>
<a href="
%(login_url)
s">Login direct</a>
<
/
br>
<br>
"""
)
%
{
"""
)
%
{
'name'
:
user
.
name
,
'name'
:
user
.
name
,
'date_password_expired'
:
datetime
.
fromtimestamp
(
datetime
.
timestamp
(
'date_password_expired'
:
datetime
.
fromtimestamp
(
datetime
.
timestamp
(
...
@@ -155,18 +155,39 @@ def send_password_expiration_reminder_mail(user):
...
@@ -155,18 +155,39 @@ def send_password_expiration_reminder_mail(user):
send_mail_async
.
delay
(
subject
,
message
,
recipient_list
,
html_message
=
message
)
send_mail_async
.
delay
(
subject
,
message
,
recipient_list
,
html_message
=
message
)
def
send_user_expiration_reminder_mail
(
user
):
subject
=
_
(
'Expiration notice'
)
recipient_list
=
[
user
.
email
]
message
=
_
(
"""
Hello
%(name)
s:
<br>
Your account will expire in
%(date_expired)
s,
<br>
In order not to affect your normal work, please contact the administrator for confirmation.
<br>
"""
)
%
{
'name'
:
user
.
name
,
'date_expired'
:
datetime
.
fromtimestamp
(
datetime
.
timestamp
(
user
.
date_expired
))
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M'
),
}
if
settings
.
DEBUG
:
logger
.
debug
(
message
)
send_mail_async
.
delay
(
subject
,
message
,
recipient_list
,
html_message
=
message
)
def
send_reset_ssh_key_mail
(
user
):
def
send_reset_ssh_key_mail
(
user
):
subject
=
_
(
'SSH Key Reset'
)
subject
=
_
(
'SSH Key Reset'
)
recipient_list
=
[
user
.
email
]
recipient_list
=
[
user
.
email
]
message
=
_
(
"""
message
=
_
(
"""
Hello
%(name)
s:
Hello
%(name)
s:
<
/
br>
<br>
Your ssh public key has been reset by site administrator.
Your ssh public key has been reset by site administrator.
Please login and reset your ssh public key.
Please login and reset your ssh public key.
<
/
br>
<br>
<a href="
%(login_url)
s">Login direct</a>
<a href="
%(login_url)
s">Login direct</a>
<
/
br>
<br>
"""
)
%
{
"""
)
%
{
'name'
:
user
.
name
,
'name'
:
user
.
name
,
'login_url'
:
reverse
(
'authentication:login'
,
external
=
True
),
'login_url'
:
reverse
(
'authentication:login'
,
external
=
True
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment