1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

csp: update lwsgs

This commit is contained in:
Andy Green 2018-08-29 07:15:34 +08:00
parent b31f8b2aa6
commit 35473ca446
4 changed files with 301 additions and 173 deletions

View file

@ -2138,6 +2138,7 @@ if (LWS_WITH_GENERIC_SESSIONS)
plugins/generic-sessions/assets/seats.jpg
plugins/generic-sessions/assets/failed-login.html
plugins/generic-sessions/assets/lwsgs.js
plugins/generic-sessions/assets/lwsgs.css
plugins/generic-sessions/assets/post-register-fail.html
plugins/generic-sessions/assets/post-register-ok.html
plugins/generic-sessions/assets/post-verify-ok.html

View file

@ -1,52 +1,44 @@
<html>
<head>
<script src="/lws-common.js" nonce="lwscaro"></script>
<script src="lwsgs.js" nonce="lwscaro"></script>
<style>
.body { font-size: 12 }
.gstitle { font-size: 18 }
.group1 { vertical-align:middle;text-align:center;background:#f0f0e0;
padding:12px; -webkit-border-radius:10px;
-moz-border-radius:10px;border-radius:10px; }
.group2 { vertical-align:middle; font-size: 22;text-align:center;
margin:auto; align:center;
background-color: rgba(255, 255, 255, 0.8); padding:12px;
display:inline-block; -webkit-border-radius:10px;
-moz-border-radius:10px; border-radius:10px; }
</style>
<meta charset="UTF-8">
<script src="/lws-common.js"></script>
<link rel="stylesheet" type="text/css" href="lwsgs.css"/>
<script src="lwsgs.js"></script>
</head>
<body style="background-image:url(seats.jpg)">
<table style="width:100%;height:100%;transition: max-height 2s;">
<body class="seats">
<table class="lwsgs">
<tr>
<td style="vertical-align:top;text-align:left;width=200px">
<td class="logo">
<img src="lwsgs-logo.png">
</td>
<td style="vertical-align:top;float:right">
<div id=lwsgs style="zIndex: 1000;text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div>
<td class="">
<div id=lwsgs class="lwsgs"></div>
</td>
</tr>
<tr><td colspan=2 style="height:99%;vertical-align:middle;">
<table style="text-align:center;width:100%"><tr>
<td style="margin:auto;align:center">
<span id="nolog" class="group2" style="display:none;">
<tr><td colspan=2 class="h99">
<table class="c100"><tr>
<td class="c">
<span id="nolog" class="group2">
This is a demo application for lws generic-sessions.<br><br>
It's a simple messageboard.<br><br>
What's interesting about it is there is <b>no serverside scripting</b>,<br>
instead client js makes a wss:// connection back to the server<br>
and then reacts to JSON from the ws protocol. Sessions stuff is <br>
handled by lws generic sessions, making the <a href="https://github.com/warmcat/libwebsockets/blob/master/plugins/generic-sessions/protocol_lws_messageboard.c">actual<br>
test application</a> <a href="https://github.com/warmcat/libwebsockets/blob/master/plugins/generic-sessions/index.html">very small</a>.<br><br>
handled by lws generic sessions, making the <a href="https://libwebsockets.org/git/libwebsockets/tree/plugins/generic-sessions/protocol_generic_sessions.c">actual<br>
test application</a> <a href="https://libwebsockets.org/git/libwebsockets/tree/plugins/generic-sessions/protocol_lws_messageboard.c">very small</a>.<br><br>
And because it's natively websocket, it's naturally connected<br>
for dynamic events and easy to maintain.
<br><br>
Register / Login at the top right to see and create new messages.
</span>
<span id="logged" class="group2" style="display:none">
<span id="logged" class="group2">
<div id="newmsg">
<form action="msg" method="post" target="hidden">
New message<br>
<textarea id="msg" placeholder="type your message here" cols="40" rows="5" name="msg"></textarea><br>
<textarea id="msg" placeholder="type your message here" cols="40" rows="5" name="msg">
</textarea><br>
<input type="submit" id="send" name="send" disabled=1>
</form>
</div>
@ -59,106 +51,6 @@
</td></tr>
</table>
</form>
<iframe name="hidden" style="display:none"></iframe>
<script nonce="lwscaro">lwsgs_initial();
document.getElementById("nolog").style.display = !!lwsgs_user ? "none" : "inline-block";
document.getElementById("logged").style.display = !lwsgs_user ? "none" : "inline-block";
document.getElementById("msg").onkeyup = mupd;
document.getElementById("msg").onchange = mupd;
var ws;
function mb_format(s)
{
var r = "", n, wos = 0;
for (n = 0; n < s.length; n++) {
if (s[n] == ' ')
wos = 0;
else {
wos++;
if (wos == 40) {
wos = 0;
r = r + ' ';
}
}
if (s[n] == '<') {
r = r + "&lt;";
continue;
}
if (s[n] == '\n') {
r = r + "<br>";
continue;
}
r = r + s[n];
}
return r;
}
function add_div(n, m)
{
var q = document.getElementById(n);
var d = new Date(m.time * 1000);
q.innerHTML = "<br><div style=\"margin:2px\" class=\"group2\"><table style=\"table-layout: fixed;\"><tr><td>" +
"<img src=\"https://www.gravatar.com/avatar/" + md5(m.email) +
"?d=identicon\"><br>" +
"<b>" + lwsgs_san(m.username) + "</b><br>" +
"<span style=\"font-size:8pt\">" + d.toDateString() +
"<br>" + d.toTimeString() + "</span><br>" +
"IP: " + lwsgs_san(m.ip) +
"</td><td style=\"display:inline-block;vertical-align:top;word-wrap:break-word;\"><span>" +
mb_format(m.content) +
"</span></td></tr></table></div><br>" + q.innerHTML;
}
function get_appropriate_ws_url()
{
var pcol;
var u = document.URL;
if (u.substring(0, 5) == "https") {
pcol = "wss://";
u = u.substr(8);
} else {
pcol = "ws://";
if (u.substring(0, 4) == "http")
u = u.substr(7);
}
u = u.split('/');
return pcol + u[0] + "/xxx";
}
if (lwsgs_user) {
if (typeof MozWebSocket != "undefined")
ws = new MozWebSocket(get_appropriate_ws_url(),
"protocol-lws-messageboard");
else
ws = new WebSocket(get_appropriate_ws_url(),
"protocol-lws-messageboard");
try {
ws.onopen = function() {
document.getElementById("debug").textContent = "ws opened";
}
ws.onmessage =function got_packet(msg) {
add_div("messages", JSON.parse(msg.data));
}
ws.onclose = function(){
}
} catch(exception) {
alert('<p>Error' + exception);
}
}
function mupd()
{
document.getElementById("send").disabled = !document.getElementById("msg").value;
}
</script>
<iframe name="hidden" class="hidden"></iframe>
</body>
</html>

View file

@ -0,0 +1,134 @@
.body { font-size: 12px }
.gstitle { font-size: 18px }
.group1 {
vertical-align:middle;
text-align:center;
background:#f0f0e0;
padding:12px;
border-radius:10px;
}
.group2 {
display:none;
vertical-align:middle;
font-size: 22px;
text-align:center;
margin:auto;
align:center;
background-color: rgba(255, 255, 255, 0.8);
padding:12px;
border-radius:10px;
}
body.seats {
background-image:url(seats.jpg)
}
div.lwsgs {
z-index: 3;
text-align:right;
background-color: rgba(255, 255, 255, 0.8);
}
table.lwsgs {
width:100%;
height:100%;
transition: max-height 2s;
}
table.c100 {
text-align:center;
width:100%;
}
table.r {
vertical-align:top;
text-align:right;
}
table.l {
vertical-align:top;
text-align:left;
}
table.fixed {
table-layout: fixed;
}
td.logo {
vertical-align:top;
text-align:left;
width:200px
}
td.lwsgs {
vertical-align:top;
float:right;
}
td.h99 {
height:99%;
vertical-align:middle;
}
td.c {
margin:auto;
align:center
}
td.tac {
text-align:center
}
td.ava {
display:inline-block;
vertical-align:top;
word-wrap:break-word;
}
iframe.hidden {
display:none;
}
div.hidden {
display:none;
}
div.hiddenr {
display:none;
text-align:right;
}
input {
margin: 2px;
padding: 2px;
}
input.em {
margin: 4px;
font-weight:bold;
}
input.wide {
margin: 6px;
padding: 6px;
}
input.hidden {
display: none;
}
form.r {
text-align:right;
}
span.bad {
color: red;
}
span.small {
style=\"font-size:8pt;
}
.green {
color: green;
}

View file

@ -5,7 +5,7 @@ var lwsgs_auth = "$lwsgs_auth";
var lwsgs_email = "$lwsgs_email";
var lwsgs_html = '\
<div id="dlogin" style="display:none"> \
<div id="dlogin" class="hidden"> \
<form action="lwsgs-login" method="post"> \
<input type="hidden" name="admin" value="needadmin/admin-login.html"> \
<input type="hidden" name="good" value="index.html"> \
@ -14,35 +14,35 @@ var lwsgs_html = '\
<input type="hidden" name="forgot-bad" value="sent-forgot-fail.html">\
<input type="hidden" name="forgot-post-good" value="post-forgot-ok.html">\
<input type="hidden" name="forgot-post-bad" value="post-forgot-fail.html">\
<table style="vertical-align:top;text-align:right"\
<table class="r">\
<tr>\
<td>User Name\
<input type="text" size="10" id="username" name="username"></td>\
<td>Password\
<input type="password" id="password" size="10" name="password"><div id="pw1"></div></td>\
</tr><tr>\
<td colspan="2" style="text-align:center"><input type="submit" id="login" name="login" value="Login" style="margin: 4px; padding: 2px; font-weight=bold;">\
&nbsp;<input type="submit" id="forgot" name="forgot" value="Forgot password" style="margin: 2px; padding: 2px">\
&nbsp;<input id="doreg" type="button" value="Sign up" style="margin: 2px; padding: 2px"></td>\
<td colspan="2" class="c"><input type="submit" id="login" name="login" value="Login" class="em">\
&nbsp;<input type="submit" id="forgot" name="forgot" value="Forgot password">\
&nbsp;<input id="doreg" type="button" value="Sign up"></td>\
</tr>\
</table>\
</form>\
</div>\
\
<div id="dlogout" style="display:none;text-align:right">\
<form action="lwsgs-logout" method="post" style="text-align:right">\
<div id="dlogout" class="hiddenr">\
<form action="lwsgs-logout" method="post" class="r">\
<input type="hidden" name="good" value="index.html">\
<table style="vertical-align:top;text-align:right">\
<table class="r">\
<tr><td><span id=grav></span></td>\
<td style="text-align:center"><table><tr><td style="text-align:center">\
<td class="tac"><table><tr><td class="tac">\
<a href="#" id="clink">\
<span id="curuser"></span></a></td></tr><tr>\
<td style="text-align:center"><input type="submit" name="logout" value="Logout" style="margin: 2px; padding: 2px"></td>\
<td class="tac"><input type="submit" name="logout" value="Logout"></td>\
</tr></table></td></tr>\
</table>\
</form></div>\
\
<div id="dregister" style="display:none">\
<div id="dregister" class="hidden">\
<form action="lwsgs-login" method="post">\
<input type="hidden" name="admin" value="needadmin/admin-login.html">\
<input type="hidden" name="good" value="successful-login.html">\
@ -53,14 +53,10 @@ var lwsgs_html = '\
<input type="hidden" name="forgot-bad" value="sent-forgot-fail.html">\
<input type="hidden" name="forgot-post-good" value="post-forgot-ok.html">\
<input type="hidden" name="forgot-post-bad" value="post-forgot-fail.html">\
<table style="vertical-align:top;text-align:left">\
<table class="l">\
<tr>\
<td colspan=2 align=center>\
<span id="curuser"></span>\
<script>\
if (lwsgs_user)\
document.getElementById("curuser").innerHTML = "currently logged in as " + lwsgs_san(lwsgs_user) + "</br>";\
</script>\
<b>Please enter your details to register</b>:\
</td>\
</tr>\
@ -85,16 +81,16 @@ var lwsgs_html = '\
</tr>\
<tr>\
<td colspan=2 align=center>\
<input type="submit" id="register" name="register" value="Register" style="margin: 2px; padding: 2px">\
<input type="submit" id="rforgot" name="forgot" value="Forgot Password" style="margin: 2px; padding: 2px;display: none">\
<input type="button" id="cancel" name="cancel" value="Cancel" style="margin: 2px; padding: 2px;">\
<input type="submit" id="register" name="register" value="Register" >\
<input type="submit" id="rforgot" name="forgot" value="Forgot Password" class="hidden">\
<input type="button" id="cancel" name="cancel" value="Cancel">\
</td>\
</tr>\
</table>\
</form>\
</div>\
\
<div id="dchange" style="display:none">\
<div id="dchange" class="hidden">\
<form action="lwsgs-change" method="post">\
<input type="hidden" id="cusername" name="username">\
<input type="hidden" name="admin" value="needadmin/admin-login.html">\
@ -106,16 +102,10 @@ var lwsgs_html = '\
<input type="hidden" name="forgot-bad" value="sent-forgot-fail.html">\
<input type="hidden" name="forgot-post-good" value="post-forgot-ok.html">\
<input type="hidden" name="forgot-post-bad" value="post-forgot-fail.html">\
<table style="vertical-align:top;text-align:left">\
<table class="l">\
<tr>\
<td colspan=2 align=center>\
<span id="ccuruser"></span>\
<script nonce="lwscaro">\
if (lwsgs_user)\
document.getElementById("ccuruser").innerHTML =\
"<span class=\"gstitle\">Login settings for " +\
lwsgs_san(lwsgs_user) + "</span></br>";\
</script>\
<b>Please enter your details to change</b>:\
</td>\
</tr>\
@ -144,11 +134,11 @@ var lwsgs_html = '\
<tr>\
<td colspan=2 align=center>\
<input type="submit" id="change" name="change"\
value="Change" style="margin: 6px; padding: 6px">\
value="Change" class="wide">\
<input type="submit" id="cforgot" name="forgot"\
value="Forgot Password" style="margin: 6px; padding: 6px;display: none">\
value="Forgot Password" class="wide hidden">\
<input type="button" id="cancel2" name="cancel"\
value="Cancel" style="margin: 6px; padding: 6px;">\
value="Cancel" class="wide">\
</td>\
</tr>\
<tr>\
@ -156,14 +146,14 @@ var lwsgs_html = '\
<input type="checkbox" id="showdel" name="showdel"\
> Show Delete&nbsp;\
<input type="submit" id="delete" name="delete" \
value="Delete Account" style="margin: 6px; padding: 6px;display: none">\
value="Delete Account" class="wide hidden">\
</td>\
</tr>\
</table>\
</form>\
</div>\
\
<div id="dadmin" style="display:none">\
<div id="dadmin" class="hidden">\
Admin settings TBD\
</div>\
';
@ -260,7 +250,7 @@ function lwsgs_rupdate()
document.getElementById('password2').value) {
if (document.getElementById('rpassword').value.length)
document.getElementById('match').innerHTML =
"<b style=\"color:green\">\u2713</b>";
"<b class=\"green\">\u2713</b>";
else
document.getElementById('match').innerHTML = "";
document.getElementById('pw2').style = "";
@ -268,10 +258,10 @@ function lwsgs_rupdate()
if (document.getElementById('password2').value ||
document.getElementById('email').value) { // ie, he is filling in "register" path and cares
document.getElementById('match').innerHTML =
"<span style=\"color: red\">\u2718 <b>Passwords do not match</b></span>";
"<span class=\"bad\">\u2718 <b>Passwords do not match</b></span>";
} else
document.getElementById('match').innerHTML =
"<span style=\"color: gray\">\u2718 Passwords do not match</span>";
"<span class=\"bad\">\u2718 Passwords do not match</span>";
en_register = 0;
}
@ -282,7 +272,7 @@ function lwsgs_rupdate()
document.getElementById('rpw1').innerHTML = "Need 8 chars";
} else
if (document.getElementById('rpassword').value.length)
document.getElementById('rpw1').innerHTML = "<b style=\"color:green\">\u2713</b>";
document.getElementById('rpw1').innerHTML = "<b class=\"green\">\u2713</b>";
else
document.getElementById('rpw1').innerHTML = "";
@ -304,13 +294,13 @@ function lwsgs_rupdate()
if (uc) {
if (document.getElementById('rusername').value)
uc.innerHTML = "<b style=\"color:green\">\u2713</b>";
uc.innerHTML = "<b class=\"green\">\u2713</b>";
else
uc.innerHTML = "";
}
} else {
if (document.getElementById('uchk'))
ocument.getElementById('uchk').innerHTML = "<b style=\"color:red\">\u2718 Already registered</b>";
ocument.getElementById('uchk').innerHTML = "<b class=\"red\">\u2718 Already registered</b>";
en_forgot = 1;
}
@ -319,13 +309,13 @@ function lwsgs_rupdate()
if (ec) {
if (document.getElementById('email').value)
ec.innerHTML = "<b style=\"color:green\">\u2713</b>";
ec.innerHTML = "<b class=\"green\">\u2713</b>";
else
ec.innerHTML = "";
}
} else {
if (document.getElementById('echk'))
document.getElementById('echk').innerHTML = "<b style=\"color:red\">\u2718 Already registered</b>";
document.getElementById('echk').innerHTML = "<b class=\"red\">\u2718 Already registered</b>";
en_forgot = 1;
}
@ -355,7 +345,7 @@ function lwsgs_cupdate()
document.getElementById('ccurpw').value.length < 8) {
en_change = 0;
pwok = 0;
document.getElementById('cuchk').innerHTML = "<b style=\"color:red\">\u2718</b>";
document.getElementById('cuchk').innerHTML = "<b class=\"red\">\u2718</b>";
} else {
en_forgot = 0;
document.getElementById('cuchk').innerHTML = "";
@ -367,7 +357,7 @@ function lwsgs_cupdate()
if (document.getElementById('cpassword').value ==
document.getElementById('cpassword2').value) {
if (document.getElementById('cpassword').value.length)
document.getElementById('cmatch').innerHTML = "<b style=\"color:green\">\u2713</b>";
document.getElementById('cmatch').innerHTML = "<b class=\"green\">\u2713</b>";
else
document.getElementById('cmatch').innerHTML = "";
document.getElementById('pw2').style = "";
@ -376,9 +366,9 @@ function lwsgs_cupdate()
//document.getElementById('cemail').value
) { // ie, he is filling in "register" path and cares
document.getElementById('cmatch').innerHTML =
"<span style=\"color: red\">\u2718 <b>Passwords do not match</b></span>";
"<span class=\"red\">\u2718 <b>Passwords do not match</b></span>";
} else
document.getElementById('cmatch').innerHTML = "<span style=\"color: gray\">\u2718 Passwords do not match</span>";
document.getElementById('cmatch').innerHTML = "<span class=\"red\">\u2718 Passwords do not match</span>";
en_change = 0;
}
@ -392,7 +382,7 @@ function lwsgs_cupdate()
if (cpw) {
if (document.getElementById('cpassword').value.length)
cpw.innerHTML = "<b style=\"color:green\">\u2713</b>";
cpw.innerHTML = "<b class=\"green\">\u2713</b>";
else
cpw.innerHTML = "";
}
@ -500,6 +490,15 @@ function lwsgs_initial()
{
document.getElementById('lwsgs').innerHTML = lwsgs_html;
if (lwsgs_user) {
document.getElementById("curuser").innerHTML =
"currently logged in as " + lwsgs_san(lwsgs_user) + "</br>";
document.getElementById("ccuruser").innerHTML =
"<span class=\"gstitle\">Login settings for " +
lwsgs_san(lwsgs_user) + "</span></br>";
}
document.getElementById('username').oninput = lwsgs_update;
document.getElementById('username').onchange = lwsgs_update;
document.getElementById('password').oninput = lwsgs_update;
@ -528,3 +527,105 @@ function lwsgs_initial()
lwsgs_update();
lwsgs_cupdate();
}
window.addEventListener("load", function() {
lwsgs_initial();
document.getElementById("nolog").style.display = !!lwsgs_user ? "none" : "inline-block";
document.getElementById("logged").style.display = !lwsgs_user ? "none" : "inline-block";
document.getElementById("msg").onkeyup = mupd;
document.getElementById("msg").onchange = mupd;
var ws;
function mb_format(s)
{
var r = "", n, wos = 0;
for (n = 0; n < s.length; n++) {
if (s[n] == ' ')
wos = 0;
else {
wos++;
if (wos == 40) {
wos = 0;
r = r + ' ';
}
}
if (s[n] == '<') {
r = r + "&lt;";
continue;
}
if (s[n] == '\n') {
r = r + "<br>";
continue;
}
r = r + s[n];
}
return r;
}
function add_div(n, m)
{
var q = document.getElementById(n);
var d = new Date(m.time * 1000);
q.innerHTML = "<br><div class=\"group2\"><table class=\"fixed\"><tr><td>" +
"<img src=\"https://www.gravatar.com/avatar/" + md5(m.email) +
"?d=identicon\"><br>" +
"<b>" + lwsgs_san(m.username) + "</b><br>" +
"<span class=\"small\">" + d.toDateString() +
"<br>" + d.toTimeString() + "</span><br>" +
"IP: " + lwsgs_san(m.ip) +
"</td><td class=\"ava\"><span>" +
mb_format(m.content) +
"</span></td></tr></table></div><br>" + q.innerHTML;
}
function get_appropriate_ws_url()
{
var pcol;
var u = document.URL;
if (u.substring(0, 5) == "https") {
pcol = "wss://";
u = u.substr(8);
} else {
pcol = "ws://";
if (u.substring(0, 4) == "http")
u = u.substr(7);
}
u = u.split('/');
return pcol + u[0] + "/xxx";
}
if (lwsgs_user) {
if (typeof MozWebSocket != "undefined")
ws = new MozWebSocket(get_appropriate_ws_url(),
"protocol-lws-messageboard");
else
ws = new WebSocket(get_appropriate_ws_url(),
"protocol-lws-messageboard");
try {
ws.onopen = function() {
document.getElementById("debug").textContent = "ws opened";
}
ws.onmessage =function got_packet(msg) {
add_div("messages", JSON.parse(msg.data));
}
ws.onclose = function(){
}
} catch(exception) {
alert('<p>Error' + exception);
}
}
function mupd()
{
document.getElementById("send").disabled = !document.getElementById("msg").value;
}
}, false);