Commit f87e08ef authored by BaiJiangJie's avatar BaiJiangJie Committed by 老广

[Update] 添加deb依赖,完善用户登录失败日志,修复资产标签bug (#1983)

* [Update] 修改deb依赖

* [Update] 修改记录用户登录失败日志,用户不存在的情况,但是显示登录日志列表还不全..

* [Update] 用户登录日志,记录用户名不存在的情况(Default组织显示所有用户的登录日志)

* [Bugfix] 修复标签名为search, limit时资产列表不显示的bug
parent 82d866db
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
{% block custom_foot_js %} {% block custom_foot_js %}
<script> <script>
var zTree, asset_table; var zTree, asset_table, show=0;
var inited = false; var inited = false;
var url; var url;
function initTable() { function initTable() {
...@@ -184,7 +184,7 @@ $(document).ready(function () { ...@@ -184,7 +184,7 @@ $(document).ready(function () {
}); });
function toggle() { function toggle() {
if ($("#split-left").is(':visible')) { if (show === 0) {
$("#split-left").hide(500, function () { $("#split-left").hide(500, function () {
$("#split-right").attr("class", "col-lg-12"); $("#split-right").attr("class", "col-lg-12");
$("#toggle-icon").attr("class", "fa fa-angle-right fa-x"); $("#toggle-icon").attr("class", "fa fa-angle-right fa-x");
......
...@@ -36,6 +36,7 @@ class LabelCreateView(AdminUserRequiredMixin, CreateView): ...@@ -36,6 +36,7 @@ class LabelCreateView(AdminUserRequiredMixin, CreateView):
form_class = LabelForm form_class = LabelForm
success_url = reverse_lazy('assets:label-list') success_url = reverse_lazy('assets:label-list')
success_message = create_success_msg success_message = create_success_msg
disable_name = ['draw', 'search', 'limit', 'offset', '_']
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
...@@ -45,6 +46,16 @@ class LabelCreateView(AdminUserRequiredMixin, CreateView): ...@@ -45,6 +46,16 @@ class LabelCreateView(AdminUserRequiredMixin, CreateView):
kwargs.update(context) kwargs.update(context)
return super().get_context_data(**kwargs) return super().get_context_data(**kwargs)
def form_valid(self, form):
name = form.cleaned_data.get('name')
if name in self.disable_name:
msg = _(
'Tips: Avoid using label names reserved internally: {}'
).format(', '.join(self.disable_name))
form.add_error("name", msg)
return self.form_invalid(form)
return super().form_valid(form)
class LabelUpdateView(AdminUserRequiredMixin, UpdateView): class LabelUpdateView(AdminUserRequiredMixin, UpdateView):
model = Label model = Label
......
...@@ -160,8 +160,12 @@ class LoginLogListView(AdminUserRequiredMixin, DatetimeSearchMixin, ListView): ...@@ -160,8 +160,12 @@ class LoginLogListView(AdminUserRequiredMixin, DatetimeSearchMixin, ListView):
return users return users
def get_queryset(self): def get_queryset(self):
users = self.get_org_users() if current_org.is_default():
queryset = super().get_queryset().filter(username__in=users) queryset = super().get_queryset()
else:
users = self.get_org_users()
queryset = super().get_queryset().filter(username__in=users)
self.user = self.request.GET.get('user', '') self.user = self.request.GET.get('user', '')
self.keyword = self.request.GET.get("keyword", '') self.keyword = self.request.GET.get("keyword", '')
......
This diff is collapsed.
...@@ -43,10 +43,13 @@ class UserAuthApi(RootOrgViewMixin, APIView): ...@@ -43,10 +43,13 @@ class UserAuthApi(RootOrgViewMixin, APIView):
user, msg = self.check_user_valid(request) user, msg = self.check_user_valid(request)
if not user: if not user:
username = request.data.get('username', '')
exist = User.objects.filter(username=username).first()
reason = LoginLog.REASON_PASSWORD if exist else LoginLog.REASON_NOT_EXIST
data = { data = {
'username': request.data.get('username', ''), 'username': username,
'mfa': LoginLog.MFA_UNKNOWN, 'mfa': LoginLog.MFA_UNKNOWN,
'reason': LoginLog.REASON_PASSWORD, 'reason': reason,
'status': False 'status': False
} }
self.write_login_log(request, data) self.write_login_log(request, data)
......
...@@ -55,11 +55,13 @@ class LoginLog(models.Model): ...@@ -55,11 +55,13 @@ class LoginLog(models.Model):
REASON_NOTHING = 0 REASON_NOTHING = 0
REASON_PASSWORD = 1 REASON_PASSWORD = 1
REASON_MFA = 2 REASON_MFA = 2
REASON_NOT_EXIST = 3
REASON_CHOICE = ( REASON_CHOICE = (
(REASON_NOTHING, _('-')), (REASON_NOTHING, _('-')),
(REASON_PASSWORD, _('Username/password check failed')), (REASON_PASSWORD, _('Username/password check failed')),
(REASON_MFA, _('MFA authentication failed')), (REASON_MFA, _('MFA authentication failed')),
(REASON_NOT_EXIST, _("Username does not exist")),
) )
STATUS_CHOICE = ( STATUS_CHOICE = (
...@@ -67,7 +69,7 @@ class LoginLog(models.Model): ...@@ -67,7 +69,7 @@ class LoginLog(models.Model):
(False, _('Failed')) (False, _('Failed'))
) )
id = models.UUIDField(default=uuid.uuid4, primary_key=True) id = models.UUIDField(default=uuid.uuid4, primary_key=True)
username = models.CharField(max_length=20, verbose_name=_('Username')) username = models.CharField(max_length=128, verbose_name=_('Username'))
type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=2, verbose_name=_('Login type')) type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=2, verbose_name=_('Login type'))
ip = models.GenericIPAddressField(verbose_name=_('Login ip')) ip = models.GenericIPAddressField(verbose_name=_('Login ip'))
city = models.CharField(max_length=254, blank=True, null=True, verbose_name=_('Login city')) city = models.CharField(max_length=254, blank=True, null=True, verbose_name=_('Login city'))
......
...@@ -79,12 +79,15 @@ class UserLoginView(FormView): ...@@ -79,12 +79,15 @@ class UserLoginView(FormView):
def form_invalid(self, form): def form_invalid(self, form):
# write login failed log # write login failed log
username = form.cleaned_data.get('username') username = form.cleaned_data.get('username')
exist = User.objects.filter(username=username).first()
reason = LoginLog.REASON_PASSWORD if exist else LoginLog.REASON_NOT_EXIST
data = { data = {
'username': username, 'username': username,
'mfa': LoginLog.MFA_UNKNOWN, 'mfa': LoginLog.MFA_UNKNOWN,
'reason': LoginLog.REASON_PASSWORD, 'reason': reason,
'status': False 'status': False
} }
self.write_login_log(data) self.write_login_log(data)
# limit user login failed count # limit user login failed count
......
libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk python-dev openssl libssl-dev libldap2-dev libsasl2-dev sqlite gcc automake libkrb5-dev libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk python-dev openssl libssl-dev libldap2-dev libsasl2-dev sqlite gcc automake libkrb5-dev sshpass
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment