ken_nogi/Pleasanter/Extended/wwwroot/passwordChanger/js/passwordChange.js
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。
NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは
別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter
インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 15:37:06 +09:00

372 lines
9.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let passwordScore = 0;
let apiKey = 'c63feb0027f958152bd376d1fa63fff7c8ee86e0a13de5ab2f2ea14303e6278cf507547a04a83d02d3b32650bac7b85e7e8f31e9ea1ab17ef620b378a2a02f16';
let baseUrl = 'https://' + location.hostname;
//確認コードテーブルのID
let passwordCheckSite = '204330';
let userId = "";
let loginId = "";
let mailAddr = "";
let passWord1 = "";
let passWord2 = "";
let checkPass = ""; //確認コード保管用
let checkCodeId = "";
let timeout;
window.addEventListener('load', function () {
$('#checkCode').css('display', 'none');
});
function passwordChange1() {
loginId = $('#Users_LoginId').val();
mailAddr = $('#MailAddress').val();
passWord1 = $('#Users_Password1').val();
passWord2 = $('#Users_Password2').val();
if (loginId == '') {
$('#Guide').html('ログインIDを入力してください');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#Users_LoginId').focus();
} else if (mailAddr == '') {
$('#Guide').html('メールアドレスを入力してください!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#MailAddress').focus();
} else if (passWord1 == '') {
$('#Guide').html('変更後パスワードを入力してください!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#Users_Password1').focus();
} else if (passWord2 == '') {
$('#Guide').html('確認用パスワードを入力してください!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#Users_Password2').focus();
} else if (passWord1 !== passWord2) {
$('#Guide').html('確認用パスワードが一致しません!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#Users_Password2').focus();
} else if (!isValidPassword(passWord1)) {
$('#Guide').html('大文字・小文字・数字をすべて含めてください!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
} else {
if (passwordScore < 3) {
$('#Guide').html('安全なパスワードを指定してください');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#Users_Password1').focus();
} else {
//エラー無し
$('#Guide').html('');
$('#Guide').css({
'background-color': '',
color: '',
});
//---------------------------------------------------------------------------
//ログインIDからユーザー情報を取得
let json = {
ApiVersion: 1.1,
ApiKey: apiKey,
View: {
ApiGetMailAddresses: true,
ColumnFilterHash: {
LoginId: loginId,
Disabled: false,
},
},
};
let url = baseUrl + '/pleasanter/api/users/get';
$.ajax({
type: 'post',
async: true,
url: url,
data: JSON.stringify(json),
contentType: 'application/json',
scriptCharset: 'utf-8',
dataType: 'json',
success: function (data) {
//console.log(data);
if (data.StatusCode == 200) {
if (data.Response.TotalCount <= 0) {
$('#Guide').html('ログインIDが一致しません');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
} else {
let mailAddresses = data.Response.Data[0].MailAddresses;
if (!mailAddresses.includes(mailAddr)) {
$('#Guide').html('メールアドレスが一致しません!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
} else {
//ログインIDとメールアドレスが一致している場合、パスワード更新を許可
userId = data.Response.Data[0].UserId;
createCheckCode();
}
}
}
},
error: function (data) {
console.log(data);
$('#Guide').html('処理に失敗しました!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
},
});
}
}
}
function createCheckCode() {
//メインフォームを隠す
$('#pwChange').css('display', 'none');
//確認コードの作成
const str = "0123456789abcdefghijklmnopqrstuvwxyz";
const passLength = 8;
for (let i = 0; i < passLength; i++) {
let selected = Math.floor(Math.random() * str.length);
checkPass += str.substring(selected, selected + 1);
}
//プリザンターのパスワード更新確認テーブルにアップロード
let json = {
ApiVersion: 1.1,
ApiKey: apiKey,
"ClassHash": {
"ClassA": loginId,
"ClassB": mailAddr,
"ClassC": passWord1,
"ClassD": checkPass
},
}
let url = baseUrl + '/pleasanter/api/items/' + passwordCheckSite + '/create';
$.ajax({
type: 'post',
async: true,
url: url,
data: JSON.stringify(json),
contentType: 'application/json',
scriptCharset: 'utf-8',
dataType: 'json',
success: function (data) {
//console.log(data);
if (data.StatusCode == 200) {
//確認コード入力画面を開く
checkCodeId = data.Id;
$('#checkCode').css('display', 'block');
//指定時間実施がなかったら、ページを読み込み直してやり直し
timeout = window.setTimeout(function () {
alert('時間切れです。最初からやり直してください。');
location.reload();
}, 1800000);
}
},
error: function (data) {
console.log(data);
$('#Guide').html(data.responseJSON.StatusCode + ':' + data.responseJSON.Message);
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
$('#pwChange').css('display', 'block');
},
});
}
function passwordChange2() {
let inputCode = $('#inputCode').val();
if (checkPass === inputCode) {
let json = {
ApiVersion: 1.1,
ApiKey: apiKey,
Password: passWord1,
Lockout: false,
LockoutCounter: 0,
};
let url = baseUrl + '/pleasanter/api/users/' + userId + '/update';
$.ajax({
type: 'post',
async: true,
url: url,
data: JSON.stringify(json),
contentType: 'application/json',
scriptCharset: 'utf-8',
dataType: 'json',
success: function (data) {
//console.log(data);
if (data.StatusCode == 200) {
$('#Guide').html('パスワードを更新しました!');
$('#Guide').css({
'background-color': 'blue',
color: 'white',
});
//変数初期化
userId = "";
loginId = "";
mailAddr = "";
passWord1 = "";
passWord2 = "";
checkPass = "";
//確認コードテーブルの更新
checkCodeComplete();
$('#checkCode').css('display', 'none');
//タイマー停止
window.clearTimeout(timeout);
}
},
error: function (data) {
console.log(data);
$('#Guide').html(data.responseJSON.StatusCode + ':' + data.responseJSON.Message);
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
},
});
} else {
$('#Guide').html('確認コードが一致しません!');
$('#Guide').css({
'background-color': 'red',
color: 'white',
});
}
}
function isValidPassword(str) {
const ratz = /[a-z]/,
rAtZ = /[A-Z]/,
r0t9 = /[0-9]/;
return ratz.test(str) && rAtZ.test(str) && r0t9.test(str);
}
function checkCodeComplete() {
let json = {
ApiVersion: 1.1,
ApiKey: apiKey,
"Status": 900,
}
let url = baseUrl + '/pleasanter/api/items/' + checkCodeId + '/update';
$.ajax({
type: 'post',
async: true,
url: url,
data: JSON.stringify(json),
contentType: 'application/json',
scriptCharset: 'utf-8',
dataType: 'json',
success: function (data) {
console.log(data);
},
error: function (data) {
console.log(data);
}
});
}
function formReset() {
console.log('Form Reset');
$('#Users_LoginId').val('');
$('#MailAddress').val('');
$('#Users_Password1').val('');
$('#Users_Password2').val('');
//エラー無し
$('#Guide').html('');
$('#Guide').css({
'background-color': '',
color: '',
});
const meter = document.querySelector('#password-strength-meter');
meter.className = '';
$('#passwordScore').html('パスワードを入力してください');
}
function passwordCheck() {
const meter = document.querySelector('#password-strength-meter');
let loginId = $('#Users_LoginId').val();
let mailAddr = $('#MailAddress').val();
let passWord1 = $('#Users_Password1').val();
//let passWord2 = $('#Users_Password2').val();
let results = zxcvbn(passWord1, [loginId, mailAddr, 'Next', 'next', 'NEXT', 'Ntk', 'ntk', 'NTK', 'aichi', 'AICHI', 'actie', 'Kimi', 'kimi', 'KIMI', 'graph', 'Graph']);
//console.log(results);
const strength = results.score;
if (passWord1.length === 0) {
meter.className = '';
$('#passwordScore').html('パスワードを入力してください');
//パスワードが入力されているとき
} else {
passwordScore = strength;
meter.className = 'progress-bar strength-' + strength;
switch (strength) {
case 0:
$('#passwordScore').html('非常に脆弱なパスワードです');
break;
case 1:
$('#passwordScore').html('脆弱なパスワードです');
break;
case 2:
$('#passwordScore').html('弱いパスワードです');
break;
case 3:
$('#passwordScore').html('安全なパスワードです');
break;
case 4:
$('#passwordScore').html('非常に安全なパスワードです');
break;
}
}
}
function goHome() {
window.location.href = baseUrl + '/pleasanter/';
}