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>
372 lines
9.2 KiB
JavaScript
372 lines
9.2 KiB
JavaScript
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/';
|
||
} |