v0.0.10
+ Добавлена авторизация как отдельная страница + Небольшие исправления в JS при ответе от сервера
This commit is contained in:
parent
639118f781
commit
e74c0a1af0
4
dub.json
4
dub.json
|
@ -5,9 +5,9 @@
|
||||||
"copyright": "Copyright © 2023, Alexander Zhirov",
|
"copyright": "Copyright © 2023, Alexander Zhirov",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vibe-d": "~>0.9",
|
"vibe-d": "~>0.9",
|
||||||
"singlog": "~>0.3.2",
|
"singlog": "~>0.4.0",
|
||||||
"arsd-official:postgres": "~>10.9.10",
|
"arsd-official:postgres": "~>10.9.10",
|
||||||
"readconf": "~>0.3.1"
|
"readconf": "~>0.4.0"
|
||||||
},
|
},
|
||||||
"buildTypes": {
|
"buildTypes": {
|
||||||
"debug": {
|
"debug": {
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
"mir-linux-kernel": "1.0.1",
|
"mir-linux-kernel": "1.0.1",
|
||||||
"openssl": "3.3.0",
|
"openssl": "3.3.0",
|
||||||
"openssl-static": "1.0.2+3.0.8",
|
"openssl-static": "1.0.2+3.0.8",
|
||||||
"readconf": "0.3.1",
|
"readconf": "0.4.0",
|
||||||
"silly": "1.1.1",
|
"silly": "1.2.0-dev.2",
|
||||||
"singlog": "0.3.2",
|
"singlog": "0.4.0",
|
||||||
"stdx-allocator": "2.77.5",
|
"stdx-allocator": "2.77.5",
|
||||||
"taggedalgebraic": "0.11.22",
|
"taggedalgebraic": "0.11.22",
|
||||||
"vibe-core": "2.2.0",
|
"vibe-core": "2.2.0",
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
$(document).ready(function () {
|
||||||
|
noticer = new Noticer;
|
||||||
|
|
||||||
|
$("#authorization").button({ icon: "ui-icon-home" });
|
||||||
|
|
||||||
|
$("#login, #password").on('keypress',function(e) {
|
||||||
|
if(e.which == 13) {
|
||||||
|
authorization()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#authorization").click(() => {
|
||||||
|
authorization()
|
||||||
|
});
|
||||||
|
|
||||||
|
$("body").fadeTo(500, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
function authorization() {
|
||||||
|
request().then((data) => {
|
||||||
|
data.error ? noticer.error(data.message) : (window.location.href = ".");
|
||||||
|
}).catch((e) => {
|
||||||
|
noticer.error(e.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function request() {
|
||||||
|
let login = $("#login").val();
|
||||||
|
let password = $("#password").val();
|
||||||
|
|
||||||
|
let response = await fetch('.', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json;charset=utf-8'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
login: login,
|
||||||
|
password: password,
|
||||||
|
query: "login"
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok)
|
||||||
|
throw new Error(`Произошла неизвестаня ошибка: ${response.status}`);
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data;
|
||||||
|
}
|
40
js/script.js
40
js/script.js
|
@ -58,6 +58,14 @@ $(document).ready(function () {
|
||||||
e.key == "Escape" && ($(this).val(""), lists[$("#tabs").tabs( "option", "active" )]())
|
e.key == "Escape" && ($(this).val(""), lists[$("#tabs").tabs( "option", "active" )]())
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#logout").click(() => {
|
||||||
|
request('logout', 'json').then(data => {
|
||||||
|
data.error ? noticer.error(data.message) : (window.location.href = ".");
|
||||||
|
}).catch(error => {
|
||||||
|
noticer.error(error.message);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
loadNumbers();
|
loadNumbers();
|
||||||
loadSMS();
|
loadSMS();
|
||||||
loadUSSD();
|
loadUSSD();
|
||||||
|
@ -129,7 +137,10 @@ function pEmpty(text) {
|
||||||
|
|
||||||
function loadNumbers() {
|
function loadNumbers() {
|
||||||
request('listnumbergroups', 'text').then(data => {
|
request('listnumbergroups', 'text').then(data => {
|
||||||
data.error ? noticer.error(data.message) : generateListNumberGroups(data);
|
if (isJSON(data) && JSON.parse(data).error)
|
||||||
|
noticer.error(JSON.parse(data).message);
|
||||||
|
else
|
||||||
|
generateListNumberGroups(data);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
noticer.error(error.message);
|
noticer.error(error.message);
|
||||||
});
|
});
|
||||||
|
@ -161,8 +172,8 @@ function generateListGroupNumbers(panel) {
|
||||||
}
|
}
|
||||||
|
|
||||||
request('listgroupnumbers', 'json', { group: panel.data("group-name") }).then(data => {
|
request('listgroupnumbers', 'json', { group: panel.data("group-name") }).then(data => {
|
||||||
if (isJSON(data) && JSON.parse(data).error)
|
if (data.error)
|
||||||
noticer.error(JSON.parse(data).message);
|
noticer.error(data.message);
|
||||||
else {
|
else {
|
||||||
numbers = data;
|
numbers = data;
|
||||||
showListNumbers(panel);
|
showListNumbers(panel);
|
||||||
|
@ -347,7 +358,10 @@ function delNumber(panel, currentWindow) {
|
||||||
|
|
||||||
function loadSMS() {
|
function loadSMS() {
|
||||||
request('listsmsgroups', 'text').then(data => {
|
request('listsmsgroups', 'text').then(data => {
|
||||||
data.error ? noticer.error(data.message) : generateListSMSGroups(data);
|
if (isJSON(data) && JSON.parse(data).error)
|
||||||
|
noticer.error(JSON.parse(data).message);
|
||||||
|
else
|
||||||
|
generateListSMSGroups(data);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
noticer.error(error.message);
|
noticer.error(error.message);
|
||||||
});
|
});
|
||||||
|
@ -379,8 +393,8 @@ function generateListGroupSMS(panel) {
|
||||||
}
|
}
|
||||||
|
|
||||||
request('listgroupsms', 'json', { to: panel.data("to") }).then(data => {
|
request('listgroupsms', 'json', { to: panel.data("to") }).then(data => {
|
||||||
if (isJSON(data) && JSON.parse(data).error)
|
if (data.error)
|
||||||
noticer.error(JSON.parse(data).message);
|
noticer.error(data.message);
|
||||||
else {
|
else {
|
||||||
sms = data;
|
sms = data;
|
||||||
showListSMS(panel);
|
showListSMS(panel);
|
||||||
|
@ -483,7 +497,10 @@ function delSMS(panel, currentWindow) {
|
||||||
|
|
||||||
function loadUSSD() {
|
function loadUSSD() {
|
||||||
request('listussdgroups', 'text').then(data => {
|
request('listussdgroups', 'text').then(data => {
|
||||||
data.error ? noticer.error(data.message) : generateListUSSDGroups(data);
|
if (isJSON(data) && JSON.parse(data).error)
|
||||||
|
noticer.error(JSON.parse(data).message);
|
||||||
|
else
|
||||||
|
generateListUSSDGroups(data);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
noticer.error(error.message);
|
noticer.error(error.message);
|
||||||
});
|
});
|
||||||
|
@ -515,8 +532,8 @@ function generateListGroupUSSD(panel) {
|
||||||
}
|
}
|
||||||
|
|
||||||
request('listgroupussd', 'json', { to: panel.data("to") }).then(data => {
|
request('listgroupussd', 'json', { to: panel.data("to") }).then(data => {
|
||||||
if (isJSON(data) && JSON.parse(data).error)
|
if (data.error)
|
||||||
noticer.error(JSON.parse(data).message);
|
noticer.error(data.message);
|
||||||
else {
|
else {
|
||||||
ussd = data;
|
ussd = data;
|
||||||
showListUSSD(panel);
|
showListUSSD(panel);
|
||||||
|
@ -618,7 +635,10 @@ function delUSSD(panel, currentWindow) {
|
||||||
|
|
||||||
function loadServerInfo() {
|
function loadServerInfo() {
|
||||||
request('serverinfo', 'text').then(data => {
|
request('serverinfo', 'text').then(data => {
|
||||||
data.error ? noticer.error(data.message) : showServerInfo(data);
|
if (isJSON(data) && JSON.parse(data).error)
|
||||||
|
noticer.error(JSON.parse(data).message);
|
||||||
|
else
|
||||||
|
showServerInfo(data);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
noticer.error(error.message);
|
noticer.error(error.message);
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: Scada;
|
||||||
|
src: url(Scada-Regular.ttf);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-top: -5%;
|
||||||
|
color: #333;
|
||||||
|
opacity: 0;
|
||||||
|
font-family: Scada;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.div-button {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
text-align: center;
|
||||||
|
color: #333;
|
||||||
|
border: 1px solid#c5c5c5;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:hover {
|
||||||
|
border: 1px solid #999;
|
||||||
|
box-shadow: 1px 1px 10px 1px #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-focus:focus {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: 1px 1px 10px 1px #666;
|
||||||
|
border: 1px solid #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
background-image: url("favicon.png");
|
||||||
|
min-width: 128px;
|
||||||
|
min-height: 128px;
|
||||||
|
background-size: contain;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
margin: 30px;
|
||||||
|
color:#333333
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
|
@ -10,6 +10,10 @@ loglevel => 0 ; 0 - debug, 1 - crit, 2
|
||||||
logoutput => 1, 4 ; 1 - syslog, 2 - stout, 4 - file => example: 1,2 or 1,2,4
|
logoutput => 1, 4 ; 1 - syslog, 2 - stout, 4 - file => example: 1,2 or 1,2,4
|
||||||
logfile => /var/log/daster.log ; if log-output set with 4
|
logfile => /var/log/daster.log ; if log-output set with 4
|
||||||
|
|
||||||
|
[auth]
|
||||||
|
login =>
|
||||||
|
password =>
|
||||||
|
|
||||||
[daster-db]
|
[daster-db]
|
||||||
host => 127.0.0.1
|
host => 127.0.0.1
|
||||||
port => 5432
|
port => 5432
|
||||||
|
|
|
@ -15,13 +15,16 @@ import std.array;
|
||||||
import verinfo;
|
import verinfo;
|
||||||
import pgdb;
|
import pgdb;
|
||||||
import structures;
|
import structures;
|
||||||
|
import response;
|
||||||
|
|
||||||
import requests.numbers;
|
import requests.numbers;
|
||||||
import requests.sms;
|
import requests.sms;
|
||||||
import requests.ussd;
|
import requests.ussd;
|
||||||
import requests.server;
|
import requests.server;
|
||||||
|
import requests.authorization;
|
||||||
|
|
||||||
static ServerInfo serverInfo;
|
static ServerInfo serverInfo;
|
||||||
|
static AuthData serverAuthData;
|
||||||
|
|
||||||
private void showVersion() {
|
private void showVersion() {
|
||||||
writefln("daster версия %s, собрано %s", getDasterVersion(), __DATE__);
|
writefln("daster версия %s, собрано %s", getDasterVersion(), __DATE__);
|
||||||
|
@ -32,8 +35,9 @@ void page404(HTTPServerRequest req, HTTPServerResponse res, HTTPServerErrorInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(string[] args) {
|
int main(string[] args) {
|
||||||
log.level(log.INFORMATION);
|
log.level(log.INFORMATION)
|
||||||
log.output(log.SYSLOG);
|
.output(log.SYSLOG)
|
||||||
|
.color(true);
|
||||||
|
|
||||||
bool flagVersion;
|
bool flagVersion;
|
||||||
string flagSettings;
|
string flagSettings;
|
||||||
|
@ -88,6 +92,7 @@ int main(string[] args) {
|
||||||
if (webHost.logfile.length) log.file(webHost.logfile);
|
if (webHost.logfile.length) log.file(webHost.logfile);
|
||||||
|
|
||||||
rcAsteriskDB();
|
rcAsteriskDB();
|
||||||
|
rcAuth();
|
||||||
|
|
||||||
auto router = new URLRouter;
|
auto router = new URLRouter;
|
||||||
router.post("/", &postReq);
|
router.post("/", &postReq);
|
||||||
|
@ -144,16 +149,15 @@ void startWebServer(WebHost wh, HTTPServerSettings http, HTTPServerSettings http
|
||||||
}
|
}
|
||||||
|
|
||||||
void getReq(HTTPServerRequest req, HTTPServerResponse res) {
|
void getReq(HTTPServerRequest req, HTTPServerResponse res) {
|
||||||
// if (req.session) {
|
if (req.session) {
|
||||||
// auto user = req.session.get!UserData("userData");
|
auto user = req.session.get!UserData("user");
|
||||||
// if (user.loggedIn) {
|
if (user.login) {
|
||||||
// renderMainPage(req, res);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// render!("index.dt", serverInfo)(res);
|
|
||||||
renderMainPage(req, res);
|
renderMainPage(req, res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render!("authorization.dt", serverInfo)(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderMainPage(HTTPServerRequest req, HTTPServerResponse res) {
|
void renderMainPage(HTTPServerRequest req, HTTPServerResponse res) {
|
||||||
|
@ -168,23 +172,23 @@ void postReq(HTTPServerRequest req, HTTPServerResponse res) {
|
||||||
|
|
||||||
if (query.empty) return;
|
if (query.empty) return;
|
||||||
|
|
||||||
// if (query != "authorization" && !checkAuth(req)) {
|
if (query != "login" && !checkAuth(req)) {
|
||||||
// res.send(
|
res.send(
|
||||||
// true,
|
true,
|
||||||
// "Сессия не существует. Перезагрузите страницу"
|
"Сессия не существует. Перезагрузите страницу"
|
||||||
// );
|
);
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
log.d("json request: " ~ jsr.to!string);
|
log.d("json request: " ~ jsr.to!string);
|
||||||
|
|
||||||
switch (query) {
|
switch (query) {
|
||||||
// case "authorization":
|
case "login":
|
||||||
// authorization(req, res);
|
login(req, res, serverAuthData);
|
||||||
// break;
|
break;
|
||||||
// case "logout":
|
case "logout":
|
||||||
// logout(req, res);
|
logout(req, res);
|
||||||
// break;
|
break;
|
||||||
case "listnumbergroups":
|
case "listnumbergroups":
|
||||||
getListNumberGroups(req, res);
|
getListNumberGroups(req, res);
|
||||||
break;
|
break;
|
||||||
|
@ -441,3 +445,24 @@ WebHost rcWebHost() {
|
||||||
|
|
||||||
return wh;
|
return wh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rcAuth() {
|
||||||
|
ConfigSection auth;
|
||||||
|
|
||||||
|
try {
|
||||||
|
auth = rc[]["auth"];
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.c("В конфигурационном файле не верны настройки auth");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auth["login"].empty)
|
||||||
|
log.w("Логин не был установлен - auth.login");
|
||||||
|
else
|
||||||
|
serverAuthData.login = auth["login"];
|
||||||
|
|
||||||
|
if (auth["password"].empty)
|
||||||
|
log.w("Пароль не был установлен - auth.password");
|
||||||
|
else
|
||||||
|
serverAuthData.password = auth["password"];
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
module requests.authorization;
|
||||||
|
|
||||||
|
import vibe.vibe;
|
||||||
|
import response;
|
||||||
|
import structures;
|
||||||
|
import singlog;
|
||||||
|
|
||||||
|
void login(HTTPServerRequest req, HTTPServerResponse res, AuthData serverAuthData) {
|
||||||
|
auto userAuthData = deserializeJson!AuthData(req.json);
|
||||||
|
|
||||||
|
if (!(serverAuthData.login == userAuthData.login &&
|
||||||
|
serverAuthData.password == userAuthData.password)) {
|
||||||
|
log.i(("Данные авторизации не верны: %s").format(req.json));
|
||||||
|
res.send(
|
||||||
|
true,
|
||||||
|
"Данные авторизации не верны"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto user = UserData(true);
|
||||||
|
|
||||||
|
req.session = res.startSession();
|
||||||
|
req.session.set!UserData("user", user);
|
||||||
|
|
||||||
|
log.i("Авторизация успешно пройдена");
|
||||||
|
|
||||||
|
res.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
void logout(HTTPServerRequest req, HTTPServerResponse res) {
|
||||||
|
req.session.set!UserData("user", UserData.init);
|
||||||
|
res.terminateSession();
|
||||||
|
|
||||||
|
log.i("Выход из системы");
|
||||||
|
|
||||||
|
res.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkAuth(HTTPServerRequest req) {
|
||||||
|
if (req.session)
|
||||||
|
return req.session.get!UserData("user").login;
|
||||||
|
|
||||||
|
log.d("Отсутствует авторизация");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -4,6 +4,15 @@ struct ServerInfo {
|
||||||
string name;
|
string name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct AuthData {
|
||||||
|
string login;
|
||||||
|
string password;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct UserData {
|
||||||
|
bool login = false;
|
||||||
|
}
|
||||||
|
|
||||||
struct WebHost {
|
struct WebHost {
|
||||||
string[] addresses;
|
string[] addresses;
|
||||||
ushort http = 0;
|
ushort http = 0;
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
module version_;
|
module version_;
|
||||||
|
|
||||||
enum dasterVersion = "v0.0.9";
|
enum dasterVersion = "v0.0.10";
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
doctype html
|
||||||
|
head
|
||||||
|
title #{serverInfo.name}: авторизация
|
||||||
|
link(rel='icon', type='image/png', sizes='128x128', href='favicon.png')
|
||||||
|
link(rel='stylesheet', type='text/css', href='jquery-ui.min.css')
|
||||||
|
link(rel='stylesheet', type='text/css', href='authorization.css')
|
||||||
|
script(src='jquery-3.7.0.min.js')
|
||||||
|
script(src='jquery-ui.min.js')
|
||||||
|
script(src='noticer.min.js')
|
||||||
|
script(src='authorization.js')
|
||||||
|
body
|
||||||
|
div.form
|
||||||
|
div.logo
|
||||||
|
div.title #{serverInfo.name}
|
||||||
|
table
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
td.label Логин:
|
||||||
|
td
|
||||||
|
input.input-focus#login(type='text')
|
||||||
|
tr
|
||||||
|
td.label Пароль:
|
||||||
|
td
|
||||||
|
input.input-focus#password(type='password')
|
||||||
|
div.div-button
|
||||||
|
button#authorization Войти
|
Loading…
Reference in New Issue