136 lines
5.1 KiB
HTML
136 lines
5.1 KiB
HTML
<!DOCTYPE html>
|
||
<!--
|
||
Copyright (c) 2025 Nikita Osokin.
|
||
|
||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||
provided that the following conditions are met:
|
||
1. Redistributions of source code must retain the above copyright notice, this list of
|
||
conditions and the following disclaimer.
|
||
2. Redistributions in binary form must reproduce the above copyright notice, this list of
|
||
conditions and the following disclaimer in the documentation and/or other materials provided
|
||
with the distribution.
|
||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
POSSIBILITY OF SUCH DAMAGE.
|
||
-->
|
||
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<style>
|
||
#container {
|
||
display: grid;
|
||
grid-template-rows: 2fr 1fr 1fr 1fr 1fr 1fr 2fr;
|
||
place-items: center;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div id="container">
|
||
<h2>Смена пароля на почтовый ящик @sch9.ru</h2>
|
||
<input id="username" type="email" placeholder="Адрес эл. почты" />
|
||
<input id="old_password" type="password" placeholder="Старый пароль" />
|
||
<input id="password" type="password" placeholder="Новый пароль" />
|
||
<input id="password_repeat" type="password" placeholder="Повторите новый пароль" />
|
||
<input id="send" type="button" onclick="send_input()" value="Поменять пароль" />
|
||
</div>
|
||
|
||
<script>
|
||
function response_body_to_status(response_body) {
|
||
if(response_body == "255") {
|
||
return "Внутренняя ошибка сервера.";
|
||
}
|
||
if(response_body == "254") {
|
||
return "Адрес эл. почты содержит недопустимые символы.";
|
||
}
|
||
if(response_body == "253") {
|
||
return "Адрес эл. почты не найден.";
|
||
}
|
||
if(response_body == "252") {
|
||
return "Старый пароль неправилен.";
|
||
}
|
||
if(response_body == "251") {
|
||
return "Новые пароли не совпадают.";
|
||
}
|
||
if(response_body == "250") {
|
||
return "Неправильно заполнены поля, или слишком длинные данные (макс. 2048 байтов на поле).";
|
||
}
|
||
return response_body;
|
||
}
|
||
|
||
async function display_status(response) {
|
||
let send_button = document.getElementById("send");
|
||
let paragraph = document.createElement("p");
|
||
paragraph.id = "status_display";
|
||
let status_text;
|
||
|
||
if(response.status == 200) {
|
||
status_text = document.createTextNode("Пароль изменён.");
|
||
} else {
|
||
let response_body = await response.text();
|
||
|
||
status_text = document.createTextNode(response_body_to_status(response_body));
|
||
}
|
||
|
||
paragraph.append(status_text);
|
||
send_button.after(paragraph);
|
||
}
|
||
|
||
function display_net_error(e) {
|
||
let send_button = document.getElementById("send");
|
||
let paragraph = document.createElement("p");
|
||
paragraph.id = "status_display";
|
||
let status_text = document.createTextNode("Сетевая ошибка. Возможно, вам стоит проверить своё интернет-соединение или подождать, а затем попробовать поменять пароль снова.");
|
||
|
||
paragraph.append(status_text);
|
||
send_button.after(paragraph);
|
||
}
|
||
|
||
function append_to_input(input, offset, text) {
|
||
input.set(text, offset);
|
||
input[offset + text.length] = 10; // '\n'
|
||
return offset + text.length + 1;
|
||
}
|
||
|
||
function send_input() {
|
||
let old_paragraph = document.getElementById("status_display");
|
||
if(old_paragraph != null) {
|
||
old_paragraph.remove();
|
||
}
|
||
|
||
let text_encoder = new TextEncoder();
|
||
let username = text_encoder.encode(document.getElementById("username").value);
|
||
let old_password = text_encoder.encode(document.getElementById("old_password").value);
|
||
let password = text_encoder.encode(document.getElementById("password").value);
|
||
let password_repeat = text_encoder.encode(document.getElementById("password_repeat").value);
|
||
|
||
let input = new Uint8Array(username.length + old_password.length + password.length + password_repeat.length + 4);
|
||
|
||
let offset = append_to_input(input, 0, username);
|
||
offset = append_to_input(input, offset, old_password);
|
||
offset = append_to_input(input, offset, password);
|
||
append_to_input(input, offset, password_repeat);
|
||
|
||
fetch(
|
||
"",
|
||
{
|
||
method: "POST",
|
||
body: input
|
||
}
|
||
).then(
|
||
display_status,
|
||
display_net_error
|
||
);
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|
||
|