add english translation

This commit is contained in:
lijiejie
2022-04-10 00:08:10 +08:00
parent e5b34be344
commit c004584df0
10 changed files with 483 additions and 90 deletions
+8 -1
View File
@@ -1,6 +1,7 @@
# coding:utf-8 # coding:utf-8
import os import os
from django.utils.translation import gettext_lazy as _
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -27,6 +28,7 @@ INSTALLED_APPS = (
MIDDLEWARE = ( MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
@@ -68,12 +70,17 @@ DATABASES = {
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/ # https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai' TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True USE_I18N = True
USE_L10N = True USE_L10N = True
USE_TZ = True USE_TZ = True
LANGUAGES = (
('zh-hans', _('中文')),
('en-us', _('English')),
)
LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),)
STATIC_URL = '/static/' STATIC_URL = '/static/'
if DEBUG: if DEBUG:
+2 -1
View File
@@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
from django.urls import path, re_path from django.urls import path, re_path, include
from django.contrib import admin from django.contrib import admin
from logview import views from logview import views
@@ -23,5 +23,6 @@ urlpatterns = [
re_path(r'^rebind/gen$', views.rebind_gen, name='rebind_gen'), re_path(r'^rebind/gen$', views.rebind_gen, name='rebind_gen'),
re_path(r'^as_admin/$', views.as_admin, name='as_admin'), re_path(r'^as_admin/$', views.as_admin, name='as_admin'),
re_path(r'^config/update$', views.config_update, name='config_update'), re_path(r'^config/update$', views.config_update, name='config_update'),
path('i18n/', include('django.conf.urls.i18n')),
re_path(r'^.*$', views.index, name='index'), re_path(r'^.*$', views.index, name='index'),
] ]
Binary file not shown.
+340
View File
@@ -0,0 +1,340 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-09 23:51+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: .\dnslog\settings.py:79
msgid "中文"
msgstr ""
#: .\dnslog\settings.py:80
msgid "English"
msgstr ""
#: .\logview\views.py:87 .\templates\login.html:64
msgid "登录"
msgstr "Log In"
#: .\logview\views.py:104
msgid "登录失败次数太多,锁定10分钟"
msgstr "Too many login failures, account locked"
#: .\logview\views.py:116
msgid "用户名或密码错误"
msgstr "Username or password wrong"
#: .\logview\views.py:128
msgid "随机账号功能已关闭"
msgstr "Random login disabled by admin"
#: .\logview\views.py:132
msgid "爬虫禁止登录"
msgstr "Bots login not allowed"
#: .\logview\views.py:136
msgid "随机账号超限,请注册登录"
msgstr "Random account login exceeded, please register"
#: .\logview\views.py:146
msgid "随机账号创建失败"
msgstr "Fail to generate random account"
#: .\logview\views.py:152
msgid "注册功能已关闭"
msgstr "Register disabled by admin"
#: .\logview\views.py:156
msgid "注册"
msgstr "Register"
#: .\logview\views.py:163
msgid "无法创建该账号,已被占用"
msgstr "Username Token, please choose another one"
#: .\logview\views.py:168
msgid "用户名只能包含字母或数字"
msgstr "Username must be alpha-numberic"
#: .\logview\views.py:179
msgid "注册成功,请登录以确保密码有效"
msgstr "Register succeded, please log in"
#: .\logview\views.py:222 .\logview\views.py:253
msgid "删除成功"
msgstr "Delete Success"
#: .\logview\views.py:228 .\logview\views.py:259
msgid "删除失败"
msgstr "Delete Failed"
#: .\logview\views.py:307
msgid "DNSLog管理"
msgstr "DNSLog"
#: .\logview\views.py:340
msgid "WebLog管理"
msgstr "WebLog"
#: .\logview\views.py:363
msgid "API配置"
msgstr "API"
#: .\logview\views.py:368
msgid "DNS重绑定"
msgstr "DNS Rebind"
#: .\logview\views.py:375
msgid "Payloads大全"
msgstr "Payloads"
#: .\templates\auto_reload.html:3
msgid "监视刷新"
msgstr "Auto Refresh"
#: .\templates\auto_reload.html:6
msgid "自动刷新"
msgstr "Auto Refresh"
#: .\templates\auto_reload.html:6
msgid ""
"监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请"
"在搜索结果页开启"
msgstr ""
"Auto reload webpage once new records found, you can also check this box on a "
"search result page to monitor any keywords you like"
#: .\templates\login.html:51
msgid "用户名即域名前缀,越短,越有利于绕过限制"
msgstr "Username will become your domain name prefix"
#: .\templates\login.html:53 .\templates\login.html:61
msgid "用户名"
msgstr "Username"
#: .\templates\login.html:54
msgid "邮箱"
msgstr "Email"
#: .\templates\login.html:55 .\templates\login.html:62
msgid "密码"
msgstr "Password"
#: .\templates\login.html:56
msgid "再次输入密码"
msgstr "Confirm password"
#: .\templates\login.html:58
msgid "创建用户"
msgstr "Register"
#: .\templates\login.html:59
msgid "已有账号?登录"
msgstr "Already have an account, login"
#: .\templates\login.html:66
msgid "注册新账号"
msgstr "Register new account"
#: .\templates\login.html:68
msgid "创建随机ID并登录"
msgstr "Login as random new user"
#: .\templates\login.html:73
msgid ""
"基于<a href=\"https://github.com/bugscanteam/dnslog/\" class=\"alert-link\" "
"target=\"_blank\">bugscan dnslog</a>开发"
msgstr ""
"Based on <a href=\"https://github.com/bugscanteam/dnslog/\" class=\"alert-"
"link\" target=\"_blank\">bugscan dnslog</a>"
#: .\templates\login.html:82 .\templates\views.html:373
msgid "提示"
msgstr "TIPS"
#: .\templates\login.html:88
msgid "随机账号创建后,无法再次登录,其数据可能被定期清理"
msgstr ""
"Generated random users can not login and access logs after session ends"
#: .\templates\login.html:89
msgid "如果你希望长期保存日志,可注册个人账号"
msgstr "You can register an account to save and view logs"
#: .\templates\login.html:93
msgid "确认创建"
msgstr "Sure, create random user for me"
#: .\templates\pager.html:34
#, python-format
msgid "第%(page)s页 / 共%(numpages)s页, 共%(total)s条记录"
msgstr "Page %(page)s / %(numpages)s , %(total)s records in total"
#: .\templates\pager.html:36
msgid "删除所有记录"
msgstr "Delete All Records"
#: .\templates\views.html:49
msgid "退出"
msgstr "Logout"
#: .\templates\views.html:57 .\templates\views.html:69
msgid "域名"
msgstr "Domain"
#: .\templates\views.html:58 .\templates\views.html:105
msgid "搜索"
msgstr "Search"
#: .\templates\views.html:59 .\templates\views.html:154
msgid "子域名"
msgstr "Sub name"
#: .\templates\views.html:72 .\templates\views.html:116
msgid "位置"
msgstr "Location"
#: .\templates\views.html:73 .\templates\views.html:117
msgid "时间"
msgstr "Time"
#: .\templates\views.html:74 .\templates\views.html:118
msgid "操作"
msgstr "Operate"
#: .\templates\views.html:87 .\templates\views.html:131
#: .\templates\views.html:384
msgid "删除"
msgstr "Delete"
#: .\templates\views.html:130 .\templates\views.html:401
msgid "查看"
msgstr "Details"
#: .\templates\views.html:157
msgid "开启用户注册功能"
msgstr "Enable register"
#: .\templates\views.html:158
msgid "开启产生随机账号"
msgstr "Enable generate random new user"
#: .\templates\views.html:167
msgid "单个请求命中查询"
msgstr "Single Query Check"
#: .\templates\views.html:174
msgid "设置为"
msgstr " "
#: .\templates\views.html:174
msgid "或者"
msgstr "or"
#: .\templates\views.html:175 .\templates\views.html:194
msgid "三级域名前缀"
msgstr "sub name prefix"
#: .\templates\views.html:177
msgid "检查是否触发"
msgstr "To check wheather a query was recieved, for example "
#: .\templates\views.html:177
msgid "访问"
msgstr "visit"
#: .\templates\views.html:179 .\templates\views.html:180
#: .\templates\views.html:205 .\templates\views.html:206
msgid "返回"
msgstr "Return"
#: .\templates\views.html:179
msgid "请求被触发"
msgstr "Query recieved"
#: .\templates\views.html:180
msgid "请求未触发"
msgstr "Query never recieved"
#: .\templates\views.html:187
msgid "多个请求命中查询"
msgstr "Multiple Queries Check"
#: .\templates\views.html:196
msgid ""
"对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些"
"payload触发执行成功。"
msgstr ""
"After your scanner sends large number of requests includes variaties of sub "
"names. You can check weather any dns queries were captured with only one API "
"request"
#: .\templates\views.html:198 .\templates\views.html:199
#: .\templates\views.html:200
msgid "扫描器投递"
msgstr "Test"
#: .\templates\views.html:198 .\templates\views.html:199
#: .\templates\views.html:200
msgid "使用域名"
msgstr "send requests with domain"
#: .\templates\views.html:203
msgid "检查是否存在漏洞,访问"
msgstr "To check wheather any queries were captured, visit"
#: .\templates\views.html:205
msgid "漏洞未触发"
msgstr "not vulnerable"
#: .\templates\views.html:206
msgid ",漏洞被触发,data字段包含成功触发的payload清单,至多返回50个"
msgstr "vulnerable, subs in data were queried by target"
#: .\templates\views.html:221 .\templates\views.html:229
msgid "生成域名"
msgstr "Generate Domain"
#: .\templates\views.html:227
msgid "合法IP"
msgstr "Valid IP"
#: .\templates\views.html:228
msgid "非法IP"
msgstr "Invalid IP"
#: .\templates\views.html:234
msgid "DNS监控"
msgstr "Monitor DNS Query"
#: .\templates\views.html:235
msgid "HTTP监控"
msgstr "Monitor HTTP Request"
#: .\templates\views.html:379
#, python-format
msgid " 是否清空全部 <b>%(total)s</b> 条记录?删除后数据无法恢复' "
msgstr ""
"This will delete all <b>%(total)s</b> records, data can not be recovered, "
"continue?"
#: .\templates\views.html:382
msgid "关闭"
msgstr "Close"
#: .\templates\views.html:398
msgid "收起"
msgstr "Collapse"
+22 -21
View File
@@ -19,6 +19,7 @@ from django.contrib.auth.models import User as SysUser
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from django.conf import settings from django.conf import settings
from django.contrib.auth import logout from django.contrib.auth import logout
from django.utils.translation import gettext as _
def get_city_by_ip(ip): def get_city_by_ip(ip):
@@ -83,7 +84,7 @@ def do_login(request):
if userid: if userid:
return HttpResponseRedirect('/dns/') return HttpResponseRedirect('/dns/')
context = {'title': '登录', 'enable_register': 'yes', 'enable_create_random_user': 'yes'} context = {'title': _('登录'), 'enable_register': 'yes', 'enable_create_random_user': 'yes'}
c = Config.objects.filter(name='enable_register') c = Config.objects.filter(name='enable_register')
if c and 'no' == c[0].value: if c and 'no' == c[0].value:
context['enable_register'] = 'no' context['enable_register'] = 'no'
@@ -100,7 +101,7 @@ def do_login(request):
if user.try_login_counter > 10 and (timezone.now() - user.last_try_login_time).seconds < 600: if user.try_login_counter > 10 and (timezone.now() - user.last_try_login_time).seconds < 600:
user.try_login_counter += 1 user.try_login_counter += 1
user.save() user.save()
context['error_msg'] = '登录失败次数太多,锁定10分钟' context['error_msg'] = _('登录失败次数太多,锁定10分钟')
return render(request, 'login.html', context) return render(request, 'login.html', context)
if user.password == hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest(): if user.password == hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest():
request.session['userid'] = user.id request.session['userid'] = user.id
@@ -112,7 +113,7 @@ def do_login(request):
else: else:
user.try_login_counter += 1 user.try_login_counter += 1
user.save() user.save()
context['error_msg'] = '用户名或密码错误' context['error_msg'] = _('用户名或密码错误')
return render(request, 'login.html', context) return render(request, 'login.html', context)
if User.objects.count() < 1: if User.objects.count() < 1:
@@ -124,15 +125,15 @@ def do_login(request):
def random_id_login(request): def random_id_login(request):
c = Config.objects.filter(name='enable_create_random_user') c = Config.objects.filter(name='enable_create_random_user')
if c and 'no' == c[0].value: if c and 'no' == c[0].value:
return redirect('/login?msg=随机账号功能已关闭') return redirect('/login?msg=' + _('随机账号功能已关闭'))
user_agent = request.META.get('HTTP_USER_AGENT').lower() user_agent = request.META.get('HTTP_USER_AGENT').lower()
if user_agent.find('bot') > 0 or user_agent.find('spider') > 0: if user_agent.find('bot') > 0 or user_agent.find('spider') > 0:
return redirect('/login?msg=爬虫禁止登录') return redirect('/login?msg=' + _('爬虫禁止登录'))
user_ip = request.META.get('HTTP_X_REAL_IP') or request.META.get('REMOTE_ADDR') user_ip = request.META.get('HTTP_X_REAL_IP') or request.META.get('REMOTE_ADDR')
if User.objects.filter(login_ip=user_ip).count() > 20: if User.objects.filter(login_ip=user_ip).count() > 20:
return redirect('/login?msg=随机账号超限,请注册登录') return redirect('/login?msg=' + _('随机账号超限,请注册登录'))
for _ in range(30): for _ in range(30):
username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8)) username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
if not User.objects.filter(username=username): if not User.objects.filter(username=username):
@@ -142,29 +143,29 @@ def random_id_login(request):
request.session['userid'] = user.id request.session['userid'] = user.id
request.session['username'] = username request.session['username'] = username
return redirect('/dns/') return redirect('/dns/')
return redirect('/login?msg=随机账号创建失败') return redirect('/login?msg=' + _('随机账号创建失败'))
def register(request): def register(request):
c = Config.objects.filter(name='enable_register') c = Config.objects.filter(name='enable_register')
if c and 'no' == c[0].value: if c and 'no' == c[0].value:
return redirect('/login?msg=注册功能已关闭') return redirect('/login?msg=' + _('注册功能已关闭'))
username = request.POST.get('username', '')[:100] username = request.POST.get('username', '')[:100]
password = request.POST.get('password', '')[:100] password = request.POST.get('password', '')[:100]
email = request.POST.get('email', '')[:100] email = request.POST.get('email', '')[:100]
context = {'title': '注册', 'reg': 'true', 'error_msg': '', context = {'title': _('注册'), 'reg': 'true', 'error_msg': '',
'username': username, 'password': password, 'email': email} 'username': username, 'password': password, 'email': email}
if User.objects.count() < 1: if User.objects.count() < 1:
context['init'] = 'true' context['init'] = 'true'
if request.method == 'POST': if request.method == 'POST':
if User.objects.filter(username=username): if User.objects.filter(username=username):
context['error_msg'] = '无法创建该账号,已被占用' context['error_msg'] = _('无法创建该账号,已被占用')
return render(request, 'login.html', context) return render(request, 'login.html', context)
else: else:
m = re.match('[a-zA-Z0-9]+', username) m = re.match('[a-zA-Z0-9]+', username)
if not m or len(m.group()) != len(username): if not m or len(m.group()) != len(username):
context['error_msg'] = '用户名只能包含字母或数字' context['error_msg'] = _('用户名只能包含字母或数字')
return render(request, 'login.html', context) return render(request, 'login.html', context)
password = hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest() password = hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest()
token = hashlib.md5((password + username[:3] + '@token').encode('utf-8')).hexdigest()[:8] token = hashlib.md5((password + username[:3] + '@token').encode('utf-8')).hexdigest()[:8]
@@ -175,7 +176,7 @@ def register(request):
SysUser.objects.create_user(username=username, email=email, password=password, SysUser.objects.create_user(username=username, email=email, password=password,
is_staff=1, is_superuser=1) is_staff=1, is_superuser=1)
user.save() user.save()
return redirect('/login?msg=注册成功,请登录以确保密码有效') return redirect('/login?msg=' + _('注册成功,请登录以确保密码有效'))
return render(request, 'login.html', context) return render(request, 'login.html', context)
@@ -218,13 +219,13 @@ def dns_delete(request):
if obj: if obj:
if user.username != 'demo': if user.username != 'demo':
obj.delete() obj.delete()
return redirect(url+'&suc=删除成功') return redirect(url+'&suc=' + _('删除成功'))
else: else:
if request.GET.get("domain"): if request.GET.get("domain"):
url += "&domain=" + request.GET.get("domain") url += "&domain=" + request.GET.get("domain")
if request.GET.get("ip"): if request.GET.get("ip"):
url += "&ip=" + request.GET.get("ip") url += "&ip=" + request.GET.get("ip")
return redirect(url+"&fail=删除失败") return redirect(url+"&fail=" + _("删除失败"))
def web_delete(request): def web_delete(request):
@@ -249,13 +250,13 @@ def web_delete(request):
if obj: if obj:
if user.username != 'demo': if user.username != 'demo':
obj.delete() obj.delete()
return redirect(url+'&suc=删除成功') return redirect(url+'&suc=' + _('删除成功'))
else: else:
if request.GET.get("domain"): if request.GET.get("domain"):
url += "&domain=" + request.GET.get("domain") url += "&domain=" + request.GET.get("domain")
if request.GET.get("ip"): if request.GET.get("ip"):
url += "&ip=" + request.GET.get("ip") url += "&ip=" + request.GET.get("ip")
return redirect(url+"&fail=删除失败") return redirect(url+"&fail=" + _("删除失败"))
def web_view(request): def web_view(request):
@@ -303,7 +304,7 @@ def log_view(request, type):
return HttpResponse('noChange') return HttpResponse('noChange')
else: else:
return HttpResponse('Changed') return HttpResponse('Changed')
context['title'] = 'DNSLog管理' context['title'] = _('DNSLog管理')
context['page'] = page context['page'] = page
context['logs'] = logs context['logs'] = logs
context['numpages'] = paginator.num_pages context['numpages'] = paginator.num_pages
@@ -336,7 +337,7 @@ def log_view(request, type):
return HttpResponse('noChange') return HttpResponse('noChange')
else: else:
return HttpResponse('Changed') return HttpResponse('Changed')
context['title'] = 'WebLog管理' context['title'] = _('WebLog管理')
context['page'] = page context['page'] = page
context['logs'] = logs context['logs'] = logs
context['numpages'] = paginator.num_pages context['numpages'] = paginator.num_pages
@@ -359,19 +360,19 @@ def log_view(request, type):
c = Config.objects.filter(name=c_name) c = Config.objects.filter(name=c_name)
if c and 'no' == c[0].value: if c and 'no' == c[0].value:
context[c_name] = 'no' context[c_name] = 'no'
context['title'] = 'API配置' context['title'] = _('API配置')
context['last_id'] = context['total'] = context['page'] = 0 context['last_id'] = context['total'] = context['page'] = 0
context['query_prefix'] = '' context['query_prefix'] = ''
context['host'] = request.scheme + '://' + request.get_host() context['host'] = request.scheme + '://' + request.get_host()
elif type == 'rebind': elif type == 'rebind':
context['title'] = 'DNS重绑定' context['title'] = _('DNS重绑定')
context['last_id'] = 0 context['last_id'] = 0
context['total'] = 0 context['total'] = 0
context['page'] = 0 context['page'] = 0
context['query_prefix'] = '' context['query_prefix'] = ''
context['host'] = request.scheme + '://' + request.get_host() context['host'] = request.scheme + '://' + request.get_host()
elif type == 'payloads': elif type == 'payloads':
context['title'] = 'Payloads大全' context['title'] = _('Payloads大全')
else: else:
return HttpResponseRedirect('/') return HttpResponseRedirect('/')
context['userdomain'] = user.user_domain + '.' + settings.DNS_DOMAIN context['userdomain'] = user.user_domain + '.' + settings.DNS_DOMAIN
+1
View File
@@ -6,6 +6,7 @@ body {
body { body {
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
flex-direction: column;
-ms-flex-align: center; -ms-flex-align: center;
align-items: center; align-items: center;
padding-top: 40px; padding-top: 40px;
+3 -2
View File
@@ -1,6 +1,7 @@
{% load i18n %}
<div style="margin-left: auto;"> <div style="margin-left: auto;">
<label><input type="checkbox" class="form-control ml-5 mr-2" id="auto_refresh" {% if monitor == 'true' %} checked {% endif %}>监视刷新</label> <label><input type="checkbox" class="form-control ml-5 mr-2" id="auto_refresh" {% if monitor == 'true' %} checked {% endif %}>{% translate '监视刷新' %}</label>
</div> </div>
<div class="mr-5 ml-2"> <div class="mr-5 ml-2">
<img src="/static/help.png" width="16" height="16" data-toggle="popover" data-trigger="hover" data-title="自动刷新" data-content="监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请在搜索结果页开启"/> <img src="/static/help.png" width="16" height="16" data-toggle="popover" data-trigger="hover" data-title="{% translate '自动刷新' %}" data-content="{% translate '监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请在搜索结果页开启' %}"/>
</div> </div>
+57 -17
View File
@@ -1,4 +1,5 @@
{% load static %} {% load static %}
{% load i18n %}
<!doctype html> <!doctype html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
@@ -13,33 +14,63 @@
<link href="{% static 'signin.css' %}" rel="stylesheet"> <link href="{% static 'signin.css' %}" rel="stylesheet">
</head> </head>
<body class="text-center"> <body class="text-center">
<form action="{% url 'set_language' %}" method="post" name="langForm" style="display: none">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}">
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
{{ LANGUAGE_CODE }}
<input type="submit" value="Switch">
</form>
<form class="form-signin" method="post"{% if reg == 'true' %} oninput='password_check.setCustomValidity(password_check.value != password.value ? "两次输入的密码不一致" : "")'{% endif %}> <form class="form-signin" method="post"{% if reg == 'true' %} oninput='password_check.setCustomValidity(password_check.value != password.value ? "两次输入的密码不一致" : "")'{% endif %}>
<img class="mb-4" src="{% static "pentester.png" %}" width="400"> <img class="mb-4" src="{% static "pentester.png" %}" width="400">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="lang" id="lang_zh" value="zh-hans" {% if LANGUAGE_CODE == 'zh-hans' %}checked{% endif %}>
<label class="form-check-label" for="exampleRadios1">
简体中文
</label>
</div>
<div class="form-check form-check-inline ml-4 mb-3">
<input class="form-check-input" type="radio" name="lang" id="lang_en" value="en" {% if LANGUAGE_CODE == 'en-us' %}checked{% endif %}>
<label class="form-check-label" for="exampleRadios1">
English
</label>
</div>
<div class="alert-warning mb-2">{{ error_msg }}</div> <div class="alert-warning mb-2">{{ error_msg }}</div>
{% if reg == 'true' %} {% if reg == 'true' %}
<p class="alert alert-info">{% if init == 'true' %}<span style="color: red">请创建第一个账户,默认将成为管理员</span><br />{% endif %}用户名即域名前缀,越短,越有利于绕过限制</p> <p class="alert alert-info">{% if init == 'true' %}<span style="color: red">请创建第一个账户,默认将成为管理员</span><br />{% endif %}{% translate '用户名即域名前缀,越短,越有利于绕过限制' %}</p>
<input type="text" id="username" name="username" class="form-control mt-3" placeholder="用户名" value="{{ username }}" required autofocus> <input type="text" id="username" name="username" class="form-control mt-3" placeholder="{% translate '用户名' %}" value="{{ username }}" required autofocus>
<input type="email" id="email" name="email" class="form-control" placeholder="邮箱" value="{{ email }}" style="border-radius: 0;margin-bottom: -1px;" required autofocus> <input type="email" id="email" name="email" class="form-control" placeholder="{% translate '邮箱' %}" value="{{ email }}" style="border-radius: 0;margin-bottom: -1px;" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" minlength="6" value="{{ password }}" style="border-radius: 0;margin-bottom: -1px;" required> <input type="password" id="password" name="password" class="form-control" placeholder="{% translate '密码' %}" minlength="6" value="{{ password }}" style="border-radius: 0;margin-bottom: -1px;" required>
<input type="password" id="password_check" name="password_check" class="form-control" placeholder="再次输入密码" required> <input type="password" id="password_check" name="password_check" class="form-control" placeholder="{% translate '再次输入密码' %}" required>
{% csrf_token %} {% csrf_token %}
<button class="btn btn-lg btn-primary btn-block" type="submit">创建用户</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate '创建用户' %}</button>
<div class="mt-4"><a href="/login">已有账号?登录</a></div> <div class="mt-4"><a href="/login">{% translate '已有账号?登录' %}</a></div>
{% else %} {% else %}
<input type="text" id="username" name="username" class="form-control" placeholder="用户名" required autofocus> <input type="text" id="username" name="username" class="form-control" placeholder="{% translate '用户名' %}" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" minlength="6" required> <input type="password" id="password" name="password" class="form-control" placeholder="{% translate '密码' %}" minlength="6" required>
{% csrf_token %} {% csrf_token %}
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate '登录' %}</button>
<div class="mt-4"> <div class="mt-4">
{% if enable_register == 'yes' %}<a href="/register">注册新账号</a> {% endif %} {% if enable_register == 'yes' %}<a href="/register">{% translate '注册新账号' %}</a> {% endif %}
{% if enable_create_random_user == 'yes' %} {% if enable_create_random_user == 'yes' %}
<a href="#" class="ml-5" onclick="gen_random_id(event, false)">创建随机ID并登录</a> <a href="#" class="ml-5" onclick="gen_random_id(event, false)">{% translate '创建随机ID并登录' %}</a>
{% endif %}</div> {% endif %}</div>
{% endif %} {% endif %}
<div class="alert alert-info mt-5" role="alert"> <div class="alert alert-info mt-5" role="alert">
基于<a href="https://github.com/bugscanteam/dnslog/" class="alert-link" target="_blank">bugscan dnslog</a>开发<br/> {% blocktranslate %}基于<a href="https://github.com/bugscanteam/dnslog/" class="alert-link" target="_blank">bugscan dnslog</a>开发{% endblocktranslate %}<br/>
</div> </div>
<p class="mt-5 mb-3 text-muted">&copy; 2022-2022 <a href="https://github.com/lijiejie/eyes.sh" target="_blank">LiJieJie</a><br />DNSLog / HTTPLog tool for pentesters</p> <p class="mt-5 mb-3 text-muted">&copy; 2022-2022 <a href="https://github.com/lijiejie/eyes.sh" target="_blank">LiJieJie</a><br />DNSLog / HTTPLog tool for pentesters</p>
</form> </form>
@@ -48,18 +79,19 @@
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">提示</h5> <h5 class="modal-title" id="exampleModalLabel">{% translate '提示' %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>随机账号创建后,无法再次登录,其数据可能被定期清理 <br /> <p>{% translate '随机账号创建后,无法再次登录,其数据可能被定期清理' %} <br />
如果你希望长期保存日志,可注册个人账号</p> {% translate '如果你希望长期保存日志,可注册个人账号' %}</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="button btn-sm btn-primary" style="padding-top: 7px;" href="#" <a class="button btn-sm btn-primary" style="padding-top: 7px;" href="#"
onclick="gen_random_id(event, true)">确认创建</a> onclick="gen_random_id(event, true)">{% translate '确认创建' %}</a>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -74,6 +106,14 @@
} }
$('#confirmModal').modal(); $('#confirmModal').modal();
} }
$('.form-check-input').change(function (e){
if (e.target.id === 'lang_zh'){
$("[name='language']").val('zh-hans');
} else {
$("[name='language']").val('en');
}
$("[name='langForm']").submit();
})
</script> </script>
</body> </body>
</html> </html>
+3 -2
View File
@@ -1,3 +1,4 @@
{% load i18n %}
<nav> <nav>
<ul class="pagination"> <ul class="pagination">
@@ -30,9 +31,9 @@
<li class="page-item disabled"><span class="page-link" aria-hidden="true">&raquo;</span></li> <li class="page-item disabled"><span class="page-link" aria-hidden="true">&raquo;</span></li>
{% endif %} {% endif %}
<span class="page-link ml-4" style="border: none">第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录</span> <span class="page-link ml-4" style="border: none">{% blocktranslate %}第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录{% endblocktranslate %}</span>
<a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}" <a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}"
onclick="delete_all(event, false)">删除所有记录</a> onclick="delete_all(event, false)">{% translate '删除所有记录' %}</a>
</ul> </ul>
</nav> </nav>
+46 -45
View File
@@ -1,4 +1,5 @@
{% load static %} {% load static %}
{% load i18n %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
@@ -45,7 +46,7 @@
<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/> <path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
</svg> </svg>
{{ username }}</span> {{ username }}</span>
<a href="/logout/">退出</a> <a href="/logout/">{% translate '退出' %}</a>
</ul> </ul>
</nav> </nav>
{% if fail %}<div class="alert alert-danger">{{ fail }}</div>{% endif %} {% if fail %}<div class="alert alert-danger">{{ fail }}</div>{% endif %}
@@ -53,9 +54,9 @@
{% if type == 'dns'%} {% if type == 'dns'%}
<form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between"> <form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between">
<div> <div>
<input class="form-control mr-sm-2 input-sm" size="30" type="text" placeholder="域名" name="domain" value="{{ domain }}"> <input class="form-control mr-sm-2 input-sm" size="30" type="text" placeholder="{% translate '域名' %}" name="domain" value="{{ domain }}">
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">搜索</button> <button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">{% translate '搜索' %}</button>
<span class="ml-5">子域名: <mark>{{userdomain}}</mark></span> <span class="ml-5">{% translate '子域名' %}: <mark>{{userdomain}}</mark></span>
</div> </div>
{% include 'auto_reload.html' %} {% include 'auto_reload.html' %}
</form> </form>
@@ -65,12 +66,12 @@
<thead> <thead>
<tr> <tr>
<th>ID</th> <th>ID</th>
<th>域名</th> <th>{% translate '域名' %}</th>
<th>Type</th> <th>Type</th>
<th>IP</th> <th>IP</th>
<th>位置</th> <th>{% translate '位置' %}</th>
<th>时间</th> <th>{% translate '时间' %}</th>
<th style="width: 100px;">操作</th> <th style="width: 120px;">{% translate '操作' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -83,7 +84,7 @@
<td>{% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %}</td> <td>{% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %}</td>
<td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td> <td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td>
<td> <td>
<a class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">删除</a> <a class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">{% translate '删除' %}</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@@ -101,7 +102,7 @@
</select> </select>
<input class="form-control mr-sm-2 input-sm {% if headers != '' and path == '' %}d-none{% endif %}" size="30" type="text" placeholder="URL" name="path" id="inputURL" value="{{ path }}"> <input class="form-control mr-sm-2 input-sm {% if headers != '' and path == '' %}d-none{% endif %}" size="30" type="text" placeholder="URL" name="path" id="inputURL" value="{{ path }}">
<input class="form-control mr-sm-2 input-sm {% if path != '' or headers == '' %}d-none{% endif %}" size="30" type="text" placeholder="headers" name="headers" id="inputHeaders" value="{{ headers }}"> <input class="form-control mr-sm-2 input-sm {% if path != '' or headers == '' %}d-none{% endif %}" size="30" type="text" placeholder="headers" name="headers" id="inputHeaders" value="{{ headers }}">
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">搜索</button> <button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">{% translate '搜索' %}</button>
</div> </div>
{% include 'auto_reload.html' %} {% include 'auto_reload.html' %}
</form> </form>
@@ -112,9 +113,9 @@
<th>ID</th> <th>ID</th>
<th style="width: 350px;">URL</th> <th style="width: 350px;">URL</th>
<th>IP</th> <th>IP</th>
<th>位置</th> <th>{% translate '位置' %}</th>
<th>时间</th> <th>{% translate '时间' %}</th>
<th style="width: 150px;">操作</th> <th style="width: 170px;">{% translate '操作' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -126,8 +127,8 @@
<td> {% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %} </td> <td> {% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %} </td>
<td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td> <td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td>
<td style="width: 150px;"> <td style="width: 150px;">
<a type="button" class="button btn-sm btn-primary" onclick="show_web_headers({{log.id}})" id="showButton_{{log.id}}">查看</a> <a type="button" class="button btn-sm btn-primary" onclick="show_web_headers({{log.id}})" id="showButton_{{log.id}}">{% translate '查看' %}</a>
<a type="button" class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">删除</a> <a type="button" class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">{% translate '删除' %}</a>
</td> </td>
</tr> </tr>
<tr class="d-none" id="web_headers_{{log.id}}"> <tr class="d-none" id="web_headers_{{log.id}}">
@@ -150,11 +151,11 @@
<div class="card" > <div class="card" >
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">
<b>子域名:</b> <mark>{{userdomain}}</mark> <b>{% translate '子域名' %}:</b> <mark>{{userdomain}}</mark>
<b class="ml-4">Token:</b> <mark>{{token}}</mark> <b class="ml-4">Token:</b> <mark>{{token}}</mark>
{% if is_admin %} {% if is_admin %}
<b class="ml-4 config"><input type="checkbox" id="enable_register" {% if enable_register == 'yes' %}checked{% endif %}> 开启用户注册功能</b> <b class="ml-4 config"><input type="checkbox" id="enable_register" {% if enable_register == 'yes' %}checked{% endif %}> {% translate '开启用户注册功能' %}</b>
<b class="ml-4 config"><input type="checkbox" id="enable_create_random_user" {% if enable_create_random_user == 'yes' %}checked{% endif %}> 开启产生随机账号</b> <b class="ml-4 config"><input type="checkbox" id="enable_create_random_user" {% if enable_create_random_user == 'yes' %}checked{% endif %}> {% translate '开启产生随机账号' %}</b>
{% endif %} {% endif %}
</p> </p>
@@ -163,46 +164,46 @@
<div class="card mt-2"> <div class="card mt-2">
<div class="card-header"> <div class="card-header">
单个请求命中查询 {% translate '单个请求命中查询' %}
</div> </div>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">
{{host}}/api/{type}/{{username}}/{prefix}/?token={{ token }}</p> {{host}}/api/{type}/{{username}}/{prefix}/?token={{ token }}</p>
</p> </p>
<ul> <ul>
<li>type: 设置为 <mark>dns</mark> 或者 <mark>web</mark></li> <li>type: {% translate '设置为' %} <mark>dns</mark> {% translate '或者' %} <mark>web</mark></li>
<li>prefix: 三级域名前缀</li> <li>prefix: {% translate '三级域名前缀' %}</li>
</ul> </ul>
<p>检查是否触发 <mark>test.{{userdomain}}</mark>访问<a href="{{host}}/api/dns/{{username}}/test/?token={{ token }}" target="_blank">{{host}}/api/dns/{{username}}/test/?token={{ token }}</a></p> <p>{% translate '检查是否触发' %} <mark>test.{{userdomain}}</mark>{% translate '访问' %}<a href="{{host}}/api/dns/{{username}}/test/?token={{ token }}" target="_blank">{{host}}/api/dns/{{username}}/test/?token={{ token }}</a></p>
<ul> <ul>
<li>返回 <mark>True</mark>,请求被触发</li> <li>{% translate '返回' %} <mark>True</mark>{% translate '请求被触发' %}</li>
<li>返回 <mark>False</mark>,请求未触发</li> <li>{% translate '返回' %} <mark>False</mark>{% translate '请求未触发' %}</li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="card mt-2"> <div class="card mt-2">
<div class="card-header"> <div class="card-header">
多个请求命中查询 {% translate '多个请求命中查询' %}
</div> </div>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">
{{host}}/api/group/dns/{{username}}/{prefix}/?token={{ token }}</p> {{host}}/api/group/dns/{{username}}/{prefix}/?token={{ token }}</p>
</p> </p>
<ul> <ul>
<li>prefix: 三级域名前缀</li> <li>prefix: {% translate '三级域名前缀' %}</li>
</ul> </ul>
<p>对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。</p> <p>{% translate '对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。' %}</p>
<ul> <ul>
<li>扫描器投递 <mark>payload1</mark>使用域名<mark>payload1.xxx-rce.{{userdomain}}</mark></li> <li>{% translate '扫描器投递' %} <mark>payload1</mark>{% translate '使用域名' %}<mark>payload1.xxx-rce.{{userdomain}}</mark></li>
<li>扫描器投递 <mark>payload2</mark>使用域名<mark>payload2.xxx-rce.{{userdomain}}</mark></li> <li>{% translate '扫描器投递' %} <mark>payload2</mark>{% translate '使用域名' %}<mark>payload2.xxx-rce.{{userdomain}}</mark></li>
<li>扫描器投递 <mark>payload3</mark>使用域名<mark>payload3.xxx-rce.{{userdomain}}</mark></li> <li>{% translate '扫描器投递' %} <mark>payload3</mark>{% translate '使用域名' %}<mark>payload3.xxx-rce.{{userdomain}}</mark></li>
<li>...</li> <li>...</li>
</ul> </ul>
<p>检查是否存在漏洞,访问:<a href="{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}" target="_blank">{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}</a></p> <p>{% translate '检查是否存在漏洞,访问' %}<a href="{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}" target="_blank">{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}</a></p>
<ul> <ul>
<li>返回 <mark>False</mark>,漏洞未触发</li> <li>{% translate '返回' %} <mark>False</mark>{% translate '漏洞未触发' %}</li>
<li>返回 <mark>{"success": "true", "data": ["payload3", "payload2", "payload1"]}</mark>,漏洞被触发,data字段包含成功触发的payload清单,至多返回50个</li> <li>{% translate '返回' %} <mark>{"success": "true", "data": ["payload3", "payload2", "payload1"]}</mark>{% translate ',漏洞被触发,data字段包含成功触发的payload清单,至多返回50个' %}</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -217,21 +218,21 @@
<div class="card-body"> <div class="card-body">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
生成域名 {% translate '生成域名' %}
</div> </div>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">
<form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between"> <form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between">
<div> <div>
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="合法IP" id="valid_ip" value="123.123.123.123"> <input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="{% translate '合法IP' %}" id="valid_ip" value="123.123.123.123">
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="非法IP" id="invalid_ip" value="10.1.1.1"> <input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="{% translate '非法IP' %}" id="invalid_ip" value="10.1.1.1">
<button class="btn btn-primary my-2 my-sm-0" type="button" onclick="generate_domain(event)">生成域名</button> <button class="btn btn-primary my-2 my-sm-0" type="button" onclick="generate_domain(event)">{% translate '生成域名' %}</button>
</div> </div>
</form> </form>
<div class="mt-4" id="result" style="color: red"></div> <div class="mt-4" id="result" style="color: red"></div>
<div class="mt-4"><a href="/dns/?domain=.r.{{ userdomain }}&monitor=true" target="_blank" class="mr-4">DNS监控</a> <div class="mt-4"><a href="/dns/?domain=.r.{{ userdomain }}&monitor=true" target="_blank" class="mr-4">{% translate 'DNS监控' %}</a>
<a href="/web/?path=.r.{{ userdomain }}&monitor=true" target="_blank">HTTP监控</a></div> <a href="/web/?path=.r.{{ userdomain }}&monitor=true" target="_blank">{% translate 'HTTP监控' %}</a></div>
</p> </p>
</div> </div>
@@ -369,18 +370,18 @@
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">提示</h5> <h5 class="modal-title" id="exampleModalLabel">{% translate '提示' %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
是否清空全部 <b>{{ total }}</b> 条记录?删除后数据无法恢复 {% blocktranslate %} 是否清空全部 <b>{{ total }}</b> 条记录?删除后数据无法恢复' {% endblocktranslate %}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">{% translate '关闭' %}</button>
<a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}" <a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}"
onclick="delete_all(event, true)">删除</a> onclick="delete_all(event, true)">{% translate '删除' %}</a>
</div> </div>
</div> </div>
</div> </div>
@@ -394,10 +395,10 @@
function show_web_headers(id) { function show_web_headers(id) {
if ( $('#web_headers_' + id)[0].className == 'd-none'){ if ( $('#web_headers_' + id)[0].className == 'd-none'){
$('#web_headers_' + id).removeClass('d-none'); $('#web_headers_' + id).removeClass('d-none');
$('#showButton_' + id).text('收起'); $('#showButton_' + id).text('{% translate '收起' %}');
} else { } else {
$('#web_headers_' + id).addClass('d-none'); $('#web_headers_' + id).addClass('d-none');
$('#showButton_' + id).text('查看'); $('#showButton_' + id).text('{% translate '查看' %}');
} }
} }
/* var getUrlParameter = function getUrlParameter(sParam) { /* var getUrlParameter = function getUrlParameter(sParam) {