Newer
Older
WebSocketSample / otp / otp.js
@HIROSE Yuuji HIROSE Yuuji on 25 Oct 2022 3 KB Remove debugging code
document.addEventListener("DOMContentLoaded", ()=>{
    var mainElem = document.getElementById("main"),
	userinput = document.getElementById("user"),
	codeinput = document.getElementById("passcode"),
	noteinput = document.getElementById("note"),
	reply     = document.getElementById("reply");
    var conn, PORT=8889, server = location.hostname||"localhost";
    // server = "localhost";
    var userInfo = {
	"user":		null,
	"tmpkey":	null,
	"skey":		null,
	"stage":	null,
    };
    function clearStorage() {
	for (let key of Object.keys(localStorage)) {
	    if (key.match(/^otp_/)) {
		localStorage.removeItem(key);
		console.log(`localStorage[${key}] cleared`);
	    }
	}
    }
    function replMainHTML(HTMLtext) {
	mainElem.innerHTML = HTMLtext;
    }
    function getMessage(str) {
	console.log(`GET: ${str}`);
	let data = JSON.parse(str);
	if (data.body) {
	    replMainHTML(data.body);
	}
	if (data.tmpkey) {
	    userInfo.tmpkey = data.tmpkey;
	    let codeinput = document.getElementById("passcode");
	    codeinput.disabled = false;
	    codeinput.value = "";
	    codeinput.placeholder = "INPUT passcode";
	    codeinput.focus();
	} else if (data.skey && data.skey > "") {
	    // 認証成功でセッションキーをGET
	    userInfo.skey = data.skey;
	    localStorage.setItem("otp_skey", data.skey);
	    document.getElementById("main").classList.remove("hidden");
	    document.getElementById("auth").classList.add("shrink");
	} else if (data.reply) {
	    // サーバから {"reply": 文字列} が来たらそれを表示
	    reply.innerText = data.reply
	}
    }
    function initConn() {
	try {
	    let url = 'ws://' + server + ':' + PORT + '/';
	    if (location.href.match(/tmp.iekei/))
		url = 'wss://'+location.hostname+'/otpsample';
	    conn = new WebSocket(url);
	    conn.onopen = ()=>{
		// WSソケットが開いたらとりあえずその時の userInfo
		// を送ってみる(skeyが残っていたらログインできるかも)
		conn.send(JSON.stringify(userInfo));
		console.log(`Sending: ${JSON.stringify(userInfo)}`);
	    };
	    conn.onerror = function(err) {
		alert('WebSocket failure: ' + err)
	    };
	    conn.onmessage = function(ev) {
		getMessage(ev.data);
	    };
	    conn.onclose = function(ev) {
		conn = null;
	    };
	} catch (err) {
	    alert(`Socket Creation Error
Firefoxですか? URLウィンドウに about:config と入れて
Search: 窓に websocket と入れて、
network..websocket.allowInsecureFromHTTP
の行をダブルクリックして true に変えてください。\n` + err);
	    return;
	}
	userInfo["user"]	= localStorage.getItem("otp_user");
	userInfo["skey"]	= localStorage.getItem("otp_skey");
    }
    function initListener() {
	function sendUser(e) {
	    let user = userinput.value;
	    localStorage.setItem("otp_user", user)
	    userInfo.user = user;
	    if (user.match(/.+@.+\..+/)) {
		conn.send(JSON.stringify({"user": userInfo.user}));
	    }
	}
	document.getElementById("senduser").addEventListener("click", sendUser);
	userinput.addEventListener("keypress", (e)=>{
	    if (e.key=="Enter") sendUser(e);
	});
	//パスコード入力欄にヒストリがあると邪魔なので消す
	codeinput.value = "";
	function sendPasscode(e) {
	    let code = codeinput.value,
		user = localStorage.getItem("otp_user");
	    if (user.match(/.+@.+\..+/)) {
		conn.send(JSON.stringify({
		    "user": userInfo.user,
		    "passcode": code,
		    "tmpkey": userInfo.tmpkey
		}));
	    }
	}
	document.getElementById("sendcode").addEventListener("click", sendPasscode);
	codeinput.addEventListener("keypress", (e) => {
	    console.log(e.key);
	    if (e.key == "Enter")
		sendPasscode(e);
	});
	noteinput.addEventListener("keypress", (e) => {
	    if (e.key == "Enter" && noteinput.value > "") {
		conn.send(JSON.stringify({"note": noteinput.value}));
		noteinput.value = ""	// 送信したら消す
	    }
	});
	document.getElementById("clear").addEventListener(
	    "click", clearStorage);
    }
    initConn();
    initListener();
});