annotate rlgwebd.js @ 171:671bed5039aa

RLGWebD: fix simultaneous watcher bugs. WebSockets should now only receive the intended data, no matter how many of them there are or what they are doing. They should...
author John "Elwin" Edwards
date Sat, 10 Jan 2015 18:54:55 -0500
parents 50e4c9feeac2
children dc12ba30d559
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1 #!/usr/bin/env node
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
2
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
3 var http = require('http');
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
4 var net = require('net');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
5 var url = require('url');
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
6 var path = require('path');
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
7 var fs = require('fs');
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
8 var events = require('events');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
9 var child_process = require('child_process');
141
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
10 // Dependencies
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
11 var posix = require("posix");
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
12 var pty = require("pty.js");
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
13 var WebSocketServer = require("websocket").server;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
14
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
15 /* Configuration variables */
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
16 // The first file is NOT in the chroot.
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
17 var ctlsocket = "/var/local/rlgwebd/ctl";
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
18 var httpPort = 8080;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
19 var chrootDir = "/var/dgl/";
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
20 var dropToUser = "rodney";
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
21 var serveStaticRoot = "/var/www/"; // inside the chroot
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
22
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
23 /* Data on the games available. */
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
24 var games = {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
25 "rogue3": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
26 "name": "Rogue V3",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
27 "uname": "rogue3",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
28 "suffix": ".r3sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
29 "path": "/usr/bin/rogue3",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
30 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
31 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
32 "rogue4": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
33 "name": "Rogue V4",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
34 "uname": "rogue4",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
35 "suffix": ".r4sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
36 "path": "/usr/bin/rogue4",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
37 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
38 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
39 "rogue5": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
40 "name": "Rogue V5",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
41 "uname": "rogue5",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
42 "suffix": ".r5sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
43 "path": "/usr/bin/rogue5",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
44 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
45 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
46 "srogue": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
47 "name": "Super-Rogue",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
48 "uname": "srogue",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
49 "suffix": ".srsav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
50 "path": "/usr/bin/srogue",
121
077adfeea038 Correct the clear sequence for srogue.
John "Elwin" Edwards <elwin@sdf.org>
parents: 120
diff changeset
51 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
120
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
52 },
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
53 "arogue5": {
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
54 "name": "Advanced Rogue 5",
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
55 "uname": "arogue5",
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
56 "suffix": ".ar5sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
57 "path": "/usr/bin/arogue5",
120
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
58 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
59 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
60 };
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
61
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
62 /* Global state */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
63 var logins = {};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
64 var sessions = {};
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
65 var dglgames = {};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
66 var allowlogin = true;
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
67 var gamemux = new events.EventEmitter();
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
68
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
69 /* Constructor. A TermSession handles a pty and the game running on it.
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
70 * gname: (String) Name of the game to launch.
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
71 * pname: (String) The player's name.
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
72 * wsReq: (WebSocketRequest) The request from the client.
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
73 *
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
74 * Events:
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
75 * "data": Data generated by child. Parameters: buf (Buffer)
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
76 * "exit": Child terminated. Parameters: none
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
77 */
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
78 function TermSession(gname, pname, wsReq) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
79 var ss = this;
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
80 /* Subclass EventEmitter to do the hard work. */
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
81 events.EventEmitter.call(this);
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
82 /* Don't launch anything that's not a real game. */
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
83 if (gname in games) {
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
84 this.game = games[gname];
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
85 }
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
86 else {
168
0ceaca924b4c Remove the TermSession 'open' event.
John "Elwin" Edwards
parents: 167
diff changeset
87 this.failed = true;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
88 wsReq.reject(404, errorcodes[2], "No such game");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
89 tslog("Game %s is not available", game);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
90 return;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
91 }
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
92 this.pname = pname;
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
93 /* Set up the sizes. */
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
94 this.w = Math.floor(Number(wsReq.resourceURL.query.w));
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
95 if (!(this.w > 0 && this.w < 256))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
96 this.w = 80;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
97 this.h = Math.floor(Number(wsReq.resourceURL.query.h));
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
98 if (!(this.h > 0 && this.h < 256))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
99 this.h = 24;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
100 /* Environment. */
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
101 var childenv = {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
102 for (var key in process.env) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
103 childenv[key] = process.env[key];
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
104 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
105 var args = ["-n", this.pname];
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
106 var spawnopts = {"env": childenv, "cwd": "/", "rows": this.h, "cols": this.w,
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
107 "name": "xterm-256color"};
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
108 this.term = pty.spawn(this.game.path, args, spawnopts);
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
109 tslog("%s playing %s (pid %d)", this.pname, this.game.uname, this.term.pid);
168
0ceaca924b4c Remove the TermSession 'open' event.
John "Elwin" Edwards
parents: 167
diff changeset
110 this.failed = false;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
111 sessions[this.game.uname + "/" + this.pname] = this;
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
112 gamemux.emit('begin', this.game.uname, this.pname);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
113 /* Set up the lockfile and ttyrec */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
114 this.lasttime = new Date();
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
115 var ts = timestamp(this.lasttime);
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
116 var progressdir = path.join("/dgldir/inprogress", this.game.uname);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
117 this.lock = path.join(progressdir, this.pname + ":node:" + ts + ".ttyrec");
110
18a81cc0084b RLG-Web: fix lockfile mixup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 109
diff changeset
118 var lmsg = this.term.pid.toString() + '\n' + this.h + '\n' + this.w + '\n';
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
119 fs.writeFile(this.lock, lmsg, "utf8");
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
120 var ttyrec = path.join("/dgldir/ttyrec", this.pname, this.game.uname,
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
121 ts + ".ttyrec");
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
122 this.record = fs.createWriteStream(ttyrec, { mode: 0664 });
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
123 /* Holds the output since the last screen clear, so watchers can begin
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
124 * with a complete screen. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
125 this.framebuf = new Buffer(1024);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
126 this.frameoff = 0;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
127 this.playerconn = wsReq.accept(null, wsReq.origin);
171
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
128 /* Array for watcher connections. */
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
129 this.watchers = [];
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
130 /* END setup */
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
131 function ttyrec_chunk(datastr) {
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
132 ss.lasttime = new Date();
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
133 var buf = new Buffer(datastr);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
134 var chunk = new Buffer(buf.length + 12);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
135 /* TTYREC headers */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
136 chunk.writeUInt32LE(Math.floor(ss.lasttime.getTime() / 1000), 0);
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
137 chunk.writeUInt32LE(1000 * (ss.lasttime.getTime() % 1000), 4);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
138 chunk.writeUInt32LE(buf.length, 8);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
139 buf.copy(chunk, 12);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
140 ss.record.write(chunk);
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
141 ss.framepush(buf);
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
142 /* Send to the player. */
171
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
143 var msg = JSON.stringify({"t": "d", "d": buf.toString("hex")});
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
144 ss.playerconn.sendUTF(msg);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
145 /* Send to any watchers. */
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
146 for (var i = 0; i < ss.watchers.length; i++) {
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
147 if (ss.watchers[i].connected)
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
148 ss.watchers[i].sendUTF(msg);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
149 }
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
150 ss.emit('data', buf);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
151 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
152 this.term.on("data", ttyrec_chunk);
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
153 this.framepush = function(chunk) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
154 /* If this chunk resets the screen, discard what preceded it. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
155 if (bufncmp(chunk, this.game.clear, this.game.clear.length)) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
156 this.framebuf = new Buffer(1024);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
157 this.frameoff = 0;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
158 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
159 /* Make sure there's space. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
160 while (this.framebuf.length < chunk.length + this.frameoff) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
161 var nbuf = new Buffer(this.framebuf.length * 2);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
162 this.framebuf.copy(nbuf, 0, 0, this.frameoff);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
163 this.framebuf = nbuf;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
164 if (this.framebuf.length > 65536) {
162
5a7e7ec136c8 Properly print session tags in the log.
John "Elwin" Edwards
parents: 160
diff changeset
165 tslog("Warning: Game %s frame buffer at %d bytes", this.tag(),
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
166 this.framebuf.length);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
167 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
168 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
169 chunk.copy(this.framebuf, this.frameoff);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
170 this.frameoff += chunk.length;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
171 };
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
172 this.write = function(data) {
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
173 this.term.write(data);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
174 };
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
175 this.tag = function() {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
176 return this.game.uname + "/" + this.pname;
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
177 };
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
178 // Teardown.
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
179 this.term.on("exit", function () {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
180 var tag = ss.tag();
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
181 fs.unlink(ss.lock);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
182 ss.record.end();
171
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
183 var watchsocks = ss.watchers;
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
184 ss.watchers = [];
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
185 for (var i = 0; i < watchsocks.length; i++) {
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
186 if (watchsocks[i].connected)
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
187 watchsocks[i].close();
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
188 }
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
189 if (ss.playerconn.connected) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
190 ss.playerconn.sendUTF(JSON.stringify({"t": "q"}));
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
191 ss.playerconn.close();
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
192 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
193 ss.emit('exit');
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
194 gamemux.emit('end', ss.game.uname, ss.pname);
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
195 delete sessions[tag];
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
196 tslog("Game %s ended.", tag);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
197 });
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
198 this.close = function () {
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
199 if (ss.tag() in sessions)
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
200 ss.term.kill('SIGHUP');
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
201 };
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
202 /* Send initial data. */
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
203 this.playerconn.sendUTF(JSON.stringify({"t": "s", "w": this.w, "h": this.h,
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
204 "p": this.pname, "g": this.game.uname}));
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
205 /* Attach handlers. */
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
206 function messageH(message) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
207 var parsedMsg = getMsgWS(message);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
208 if (parsedMsg.t == 'q') {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
209 ss.close();
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
210 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
211 else if (parsedMsg.t == 'd') {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
212 var hexstr = parsedMsg.d.replace(/[^0-9a-f]/gi, "");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
213 if (hexstr.length % 2 != 0) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
214 hexstr = hexstr.slice(0, -1);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
215 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
216 var keybuf = new Buffer(hexstr, "hex");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
217 ss.write(keybuf);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
218 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
219 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
220 this.playerconn.on('message', messageH);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
221 this.playerconn.on('close', this.close);
171
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
222 /* To attach a watcher. */
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
223 this.attach = function (wsReq) {
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
224 var conn = wsReq.accept(null, wsReq.origin);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
225 conn.sendUTF(JSON.stringify({
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
226 "t": "w", "w": this.w, "h": this.h, "p": this.pname,
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
227 "g": this.game.uname
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
228 }));
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
229 conn.sendUTF(JSON.stringify({"t": "d",
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
230 "d": this.framebuf.toString("hex", 0, this.frameoff)}));
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
231 conn.on('close', function () {
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
232 /* 'this' is the connection when triggered */
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
233 var n = ss.watchers.indexOf(this);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
234 if (n >= 0) {
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
235 ss.watchers.splice(n, 1);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
236 tslog("A WebSocket watcher has left game %s", ss.tag());
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
237 }
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
238 });
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
239 this.watchers.push(conn);
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
240 };
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
241 }
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
242 TermSession.prototype = new events.EventEmitter();
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
243
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
244 function DglSession(filename) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
245 var ss = this;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
246 events.EventEmitter.call(this);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
247 var pathcoms = filename.split('/');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
248 this.gname = pathcoms[pathcoms.length - 2];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
249 if (!(this.gname in games)) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
250 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
251 return;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
252 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
253 var basename = pathcoms[pathcoms.length - 1];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
254 var firstsep = basename.indexOf(':');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
255 this.pname = basename.slice(0, firstsep);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
256 var fname = basename.slice(firstsep + 1);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
257 this.ttyrec = path.join("/dgldir/ttyrec", this.pname, this.gname, fname);
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
258 /* Flag to prevent multiple handlers from reading simultaneously and
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
259 * getting into a race. */
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
260 this.reading = false;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
261 this.framebuf = new Buffer(1024);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
262 this.frameoff = 0;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
263 this.framepush = function(chunk) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
264 /* If this chunk resets the screen, discard what preceded it. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
265 var cgame = games[this.gname];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
266 if (bufncmp(chunk, cgame.clear, cgame.clear.length)) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
267 tslog("DGL %s: clearing frame", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
268 this.framebuf = new Buffer(1024);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
269 this.frameoff = 0;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
270 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
271 /* Make sure there's space. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
272 while (this.framebuf.length < chunk.length + this.frameoff) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
273 var nbuf = new Buffer(this.framebuf.length * 2);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
274 this.framebuf.copy(nbuf, 0, 0, this.frameoff);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
275 this.framebuf = nbuf;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
276 if (this.framebuf.length > 65536) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
277 tslog("Warning: DGL %s frame buffer at %d bytes", this.tag(),
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
278 this.framebuf.length);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
279 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
280 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
281 chunk.copy(this.framebuf, this.frameoff);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
282 this.frameoff += chunk.length;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
283 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
284 this.readchunk = function () {
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
285 if (this.reading)
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
286 return;
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
287 this.reading = true;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
288 var header = new Buffer(12);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
289 fs.read(ss.fd, header, 0, 12, null, function (err, n, buf) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
290 /* Stop recursion if end of file has been reached. */
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
291 if (err || n < 12) {
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
292 ss.reading = false;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
293 return;
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
294 }
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
295 var datalen = buf.readUInt32LE(8);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
296 //tslog("Allocating %d bytes", datalen);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
297 var databuf = new Buffer(datalen);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
298 fs.read(ss.fd, databuf, 0, datalen, null, function (err, n, buf) {
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
299 ss.reading = false;
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
300 if (err || n < datalen) {
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
301 return;
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
302 }
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
303 /* Process the data */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
304 ss.framepush(buf);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
305 ss.emit("data", buf);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
306 tslog("DGL %s: %d bytes", ss.tag(), buf.length);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
307 /* Recurse. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
308 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
309 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
310 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
311 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
312 fs.readFile(filename, {encoding: "utf8"}, function (err, data) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
313 if (err) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
314 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
315 return;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
316 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
317 var lines = data.split('\n');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
318 ss.h = Number(lines[1]);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
319 ss.w = Number(lines[2]);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
320 fs.open(ss.ttyrec, "r", function(err, fd) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
321 if (err) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
322 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
323 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
324 else {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
325 ss.fd = fd;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
326 ss.emit('open', true);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
327 tslog("DGL %s: open", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
328 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
329 ss.watcher = fs.watch(ss.ttyrec, function (ev, finame) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
330 if (ev == "change")
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
331 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
332 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
333 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
334 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
335 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
336 this.tag = function () {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
337 return this.gname + "/" + this.pname;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
338 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
339 this.close = function () {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
340 this.watcher.close()
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
341 /* Ensure all data is handled before quitting. */
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
342 this.readchunk();
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
343 fs.close(this.fd);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
344 this.emit("close");
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
345 tslog("DGL %s: closed", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
346 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
347 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
348 DglSession.prototype = new events.EventEmitter();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
349
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
350 function wsStartGame(wsReq) {
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
351 var playmatch = wsReq.resourceURL.pathname.match(/^\/play\/([^\/]*)$/);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
352 if (!playmatch[1] || !(playmatch[1] in games)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
353 wsReq.reject(404, errorcodes[2]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
354 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
355 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
356 var gname = playmatch[1];
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
357 if (!allowlogin) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
358 wsReq.reject(404, errorcodes[6]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
359 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
360 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
361 if (!("key" in wsReq.resourceURL.query)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
362 wsReq.reject(404, "No key given.");
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
363 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
364 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
365 var lkey = wsReq.resourceURL.query["key"];
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
366 if (!(lkey in logins)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
367 wsReq.reject(404, errorcodes[1]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
368 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
369 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
370 var pname = logins[lkey].name;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
371 function progcallback(err, fname) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
372 if (fname) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
373 wsReq.reject(404, errorcodes[4]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
374 tslog("%s is already playing %s", pname, gname);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
375 }
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
376 else {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
377 new TermSession(gname, pname, wsReq);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
378 }
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
379 };
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
380 checkprogress(pname, games[gname], progcallback, []);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
381 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
382
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
383 /* Some functions which check whether a player is currently playing or
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
384 * has a saved game. Maybe someday they will provide information on
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
385 * the game. */
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
386 function checkprogress(user, game, callback, args) {
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
387 var progressdir = path.join("/dgldir/inprogress", game.uname);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
388 fs.readdir(progressdir, function(err, files) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
389 if (err) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
390 args.unshift(err, null);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
391 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
392 return;
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
393 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
394 var fre = RegExp("^" + user + ":");
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
395 for (var i = 0; i < files.length; i++) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
396 if (files[i].match(fre)) {
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
397 args.unshift(null, files[i]);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
398 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
399 return;
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
400 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
401 }
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
402 args.unshift(null, false);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
403 callback.apply(null, args);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
404 });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
405 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
406
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
407 function checksaved(user, game, callback, args) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
408 var savedirc = game.uname + "save";
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
409 var basename = String(pwent.uid) + "-" + user + game.suffix;
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
410 var savefile = path.join("/var/games/roguelike", savedirc, basename);
81
e4773ac5d4d5 Switch to node v0.8.
John "Elwin" Edwards <elwin@sdf.org>
parents: 66
diff changeset
411 fs.exists(savefile, function (exist) {
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
412 args.unshift(exist);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
413 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
414 });
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
415 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
416
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
417 function playerstatus(user, callback) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
418 var sdata = {};
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
419 function finishp() {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
420 for (var gname in games) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
421 if (!(gname in sdata))
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
422 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
423 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
424 callback(sdata);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
425 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
426 function regsaved(exists, game) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
427 if (exists)
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
428 sdata[game.uname] = "s";
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
429 else
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
430 sdata[game.uname] = "0";
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
431 finishp();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
432 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
433 function regactive(err, filename, game) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
434 if (!err && filename) {
88
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
435 if (filename.match(/^[^:]*:node:/))
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
436 sdata[game.uname] = "p";
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
437 else
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
438 sdata[game.uname] = "d";
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
439 finishp();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
440 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
441 else
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
442 checksaved(user, game, regsaved, [game]);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
443 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
444 for (var gname in games) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
445 checkprogress(user, games[gname], regactive, [games[gname]]);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
446 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
447 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
448
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
449 /* A few utility functions */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
450 function timestamp(dd) {
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
451 if (!(dd instanceof Date)) {
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
452 dd = new Date();
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
453 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
454 sd = dd.toISOString();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
455 sd = sd.slice(0, sd.indexOf("."));
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
456 return sd.replace("T", ".");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
457 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
458
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
459 function randkey(words) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
460 if (!words || !(words > 0))
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
461 words = 1;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
462 function rand32() {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
463 rnum = Math.floor(Math.random() * 65536 * 65536);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
464 hexstr = rnum.toString(16);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
465 while (hexstr.length < 8)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
466 hexstr = "0" + hexstr;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
467 return hexstr;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
468 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
469 var key = "";
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
470 for (var i = 0; i < words; i++)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
471 key += rand32();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
472 return key;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
473 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
474
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
475 /* Compares two buffers, returns true for equality up to index n */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
476 function bufncmp(buf1, buf2, n) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
477 if (!Buffer.isBuffer(buf1) || !Buffer.isBuffer(buf2))
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
478 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
479 for (var i = 0; i < n; i++) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
480 if (i == buf1.length && i == buf2.length)
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
481 return true;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
482 if (i == buf1.length || i == buf2.length)
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
483 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
484 if (buf1[i] != buf2[i])
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
485 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
486 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
487 return true;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
488 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
489
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
490 function tslog() {
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
491 arguments[0] = new Date().toISOString() + ": " + String(arguments[0]);
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
492 console.log.apply(console, arguments);
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
493 }
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
494
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
495 /* Returns a list of the cookies in the request, obviously. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
496 function getCookies(req) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
497 cookies = [];
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
498 if ("cookie" in req.headers) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
499 cookstrs = req.headers["cookie"].split("; ");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
500 for (var i = 0; i < cookstrs.length; i++) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
501 eqsign = cookstrs[i].indexOf("=");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
502 if (eqsign > 0) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
503 name = cookstrs[i].slice(0, eqsign).toLowerCase();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
504 val = cookstrs[i].slice(eqsign + 1);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
505 cookies[name] = val;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
506 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
507 else if (eqsign < 0)
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
508 cookies[cookstrs[i]] = null;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
509 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
510 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
511 return cookies;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
512 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
513
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
514 function getMsg(posttext) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
515 var jsonobj;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
516 if (!posttext)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
517 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
518 try {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
519 jsonobj = JSON.parse(posttext);
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
520 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
521 catch (e) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
522 if (e instanceof SyntaxError)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
523 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
524 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
525 if (typeof(jsonobj) != "object")
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
526 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
527 return jsonobj;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
528 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
529
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
530 function getMsgWS(msgObj) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
531 if (msgObj.type != "utf8")
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
532 return {};
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
533 return getMsg(msgObj.utf8Data);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
534 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
535
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
536 function login(req, res, formdata) {
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
537 if (!allowlogin) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
538 sendError(res, 6, null, false);
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
539 return;
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
540 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
541 if (!("name" in formdata)) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
542 sendError(res, 2, "Username not given.", false);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
543 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
544 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
545 else if (!("pw" in formdata)) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
546 sendError(res, 2, "Password not given.", false);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
547 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
548 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
549 var username = String(formdata["name"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
550 var password = String(formdata["pw"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
551 function checkit(code, signal) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
552 /* Checks the exit status, see sqlickrypt.c for details. */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
553 if (code != 0) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
554 sendError(res, 3);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
555 if (code == 1)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
556 tslog("Password check failed for user %s", username);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
557 else if (code == 2)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
558 tslog("Attempted login by nonexistent user %s", username);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
559 else
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
560 tslog("Login failed: sqlickrypt error %d", code);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
561 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
562 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
563 var lkey = randkey(2);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
564 while (lkey in logins)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
565 lkey = randkey(2);
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
566 logins[lkey] = {"name": username, "ts": new Date()};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
567 res.writeHead(200, {'Content-Type': 'application/json'});
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
568 var reply = {"t": "l", "k": lkey, "u": username};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
569 res.write(JSON.stringify(reply));
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
570 res.end();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
571 tslog("%s has logged in (key %s)", username, lkey);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
572 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
573 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
574 /* Launch the sqlickrypt utility to check the password. */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
575 var pwchecker = child_process.spawn("/bin/sqlickrypt", ["check"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
576 pwchecker.on("exit", checkit);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
577 pwchecker.stdin.end(username + '\n' + password + '\n', "utf8");
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
578 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
579 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
580
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
581 /* Sets things up for a new user, like dgamelaunch's commands[register] */
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
582 function regsetup(username) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
583 function regsetup_l2(err) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
584 for (var g in games) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
585 fs.mkdir(path.join("/dgldir/ttyrec", username, games[g].uname), 0755);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
586 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
587 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
588 fs.mkdir(path.join("/dgldir/userdata", username), 0755);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
589 fs.mkdir(path.join("/dgldir/ttyrec/", username), 0755, regsetup_l2);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
590 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
591
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
592 function register(req, res, formdata) {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
593 var uname, passwd, email;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
594 if (typeof (formdata.name) != "string" || formdata.name === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
595 sendError(res, 2, "No name given.");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
596 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
597 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
598 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
599 uname = formdata["name"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
600 if (typeof (formdata.pw) != "string" || formdata.pw === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
601 sendError(res, 2, "No password given.");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
602 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
603 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
604 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
605 passwd = formdata["pw"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
606 if (typeof (formdata.email) != "string" || formdata.email === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
607 /* E-mail is optional */
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
608 email = "nobody@nowhere.not";
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
609 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
610 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
611 email = formdata["email"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
612 function checkreg(code, signal) {
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
613 if (code === 0) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
614 var lkey = randkey(2);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
615 while (lkey in logins)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
616 lkey = randkey(2);
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
617 logins[lkey] = {"name": uname, "ts": new Date()};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
618 var reply = {"t": "r", "k": lkey, "u": uname};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
619 res.writeHead(200, {'Content-Type': 'application/json'});
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
620 res.write(JSON.stringify(reply));
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
621 res.end();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
622 tslog("Added new user: %s", uname);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
623 regsetup(uname);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
624 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
625 else if (code == 4) {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
626 sendError(res, 2, "Invalid characters in name or email.");
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
627 tslog("Attempted registration: %s %s", uname, email);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
628 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
629 else if (code == 1) {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
630 sendError(res, 2, "Username " + uname + " is already being used.");
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
631 tslog("Attempted duplicate registration: %s", uname);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
632 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
633 else {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
634 sendError(res, 0, null);
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
635 tslog("sqlickrypt register failed with code %d", code);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
636 }
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
637 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
638 var child_adder = child_process.spawn("/bin/sqlickrypt", ["register"]);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
639 child_adder.on("exit", checkreg);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
640 child_adder.stdin.end(uname + '\n' + passwd + '\n' + email + '\n', "utf8");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
641 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
642 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
643
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
644 /* Stops a running game if the request has the proper key. */
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
645 function stopgame(res, formdata) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
646 if (!("key" in formdata) || !(formdata["key"] in logins)) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
647 sendError(res, 1);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
648 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
649 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
650 var pname = logins[formdata["key"]].name;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
651 if (!("g" in formdata) || !(formdata["g"] in games)) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
652 sendError(res, 2, "No such game.");
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
653 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
654 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
655 var gname = formdata["g"];
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
656 function checkback(err, fname) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
657 if (!fname) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
658 sendError(res, 7);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
659 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
660 }
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
661 var fullfile = path.join("/dgldir/inprogress", gname, fname);
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
662 fs.readFile(fullfile, "utf8", function(err, fdata) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
663 if (err) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
664 sendError(res, 7);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
665 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
666 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
667 var pid = parseInt(fdata.split('\n')[0], 10);
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
668 try {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
669 process.kill(pid, 'SIGHUP');
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
670 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
671 catch (err) {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
672 /* If the PID is invalid, the lockfile is stale. */
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
673 if (err.code == "ESRCH") {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
674 var nodere = RegExp("^" + pname + ":node:");
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
675 if (fname.match(nodere)) {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
676 fs.unlink(fullfile);
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
677 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
678 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
679 }
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
680 /* The response doesn't mean that the game is gone. The only way
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
681 * to make sure a dgamelaunch-supervised game is over would be to
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
682 * poll fname until it disappears. */
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
683 res.writeHead(200, {'Content-Type': 'application/json'});
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
684 res.write(JSON.stringify({"t": "q"}));
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
685 res.end();
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
686 });
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
687 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
688 checkprogress(pname, games[gname], checkback, []);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
689 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
690
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
691 function startProgressWatcher() {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
692 var watchdirs = [];
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
693 for (var gname in games) {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
694 watchdirs.push(path.join("/dgldir/inprogress", gname));
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
695 }
167
fba1b34e7554 Rename watcher to dglwatcher.
John "Elwin" Edwards
parents: 165
diff changeset
696 var subproc = child_process.spawn("/bin/dglwatcher", watchdirs);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
697 subproc.stdout.setEncoding('utf8');
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
698 subproc.stdout.on('data', function (chunk) {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
699 var fname = chunk.slice(2, -1);
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
700 var filere = /.*\/([^\/]*)\/([^\/:]*):(node:)?(.*)/;
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
701 var matchresult = fname.match(filere);
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
702 if (!matchresult || matchresult[3])
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
703 return;
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
704 var gname = matchresult[1];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
705 var pname = matchresult[2];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
706 var tag = gname + "/" + pname;
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
707 if (chunk[0] == "E") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
708 tslog("DGL: %s is playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
709 dglgames[tag] = new DglSession(fname);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
710 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
711 else if (chunk[0] == "C") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
712 tslog("DGL: %s started playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
713 dglgames[tag] = new DglSession(fname);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
714 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
715 else if (chunk[0] == "D") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
716 tslog("DGL: %s finished playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
717 dglgames[tag].close();
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
718 delete dglgames[tag];
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
719 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
720 else {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
721 tslog("Watcher says: %s", chunk)
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
722 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
723 });
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
724 subproc.stdout.resume();
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
725 return subproc;
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
726 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
727
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
728 function serveStatic(req, res, fname) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
729 var nname = path.normalize(fname);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
730 if (nname == "" || nname == "/")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
731 nname = "index.html";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
732 if (nname.match(/\/$/))
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
733 path.join(nname, "index.html"); /* it was a directory */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
734 var realname = path.join(serveStaticRoot, nname);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
735 var extension = path.extname(realname);
81
e4773ac5d4d5 Switch to node v0.8.
John "Elwin" Edwards <elwin@sdf.org>
parents: 66
diff changeset
736 fs.exists(realname, function (exists) {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
737 var resheaders = {};
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
738 if (!exists || !extension || extension == ".html")
31
7dd6becf9ce9 rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents: 30
diff changeset
739 resheaders["Content-Type"] = "text/html; charset=utf-8";
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
740 else if (extension == ".png")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
741 resheaders["Content-Type"] = "image/png";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
742 else if (extension == ".css")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
743 resheaders["Content-Type"] = "text/css";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
744 else if (extension == ".js")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
745 resheaders["Content-Type"] = "text/javascript";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
746 else if (extension == ".svg")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
747 resheaders["Content-Type"] = "image/svg+xml";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
748 else
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
749 resheaders["Content-Type"] = "application/octet-stream";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
750 if (exists) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
751 fs.readFile(realname, function (error, data) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
752 if (error) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
753 res.writeHead(500, {});
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
754 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
755 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
756 else {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
757 res.writeHead(200, resheaders);
34
57f4b36ef06b rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents: 32
diff changeset
758 if (req.method != 'HEAD')
57f4b36ef06b rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents: 32
diff changeset
759 res.write(data);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
760 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
761 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
762 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
763 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
764 else {
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
765 send404(res, nname, req.method == 'HEAD');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
766 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
767 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
768 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
769 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
770
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
771 /* Currently, this doesn't do anything blocking, but keep the callback */
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
772 function getStatus(callback) {
66
57bf0dcd080e Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents: 64
diff changeset
773 var now = new Date();
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
774 var statusinfo = {"s": allowlogin, "g": []};
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
775 for (var tag in sessions) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
776 var gamedesc = {};
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
777 gamedesc["p"] = sessions[tag].pname;
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
778 gamedesc["g"] = sessions[tag].game.uname;
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
779 gamedesc["i"] = now - sessions[tag].lasttime;
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
780 statusinfo["g"].push(gamedesc);
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
781 }
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
782 statusinfo["dgl"] = [];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
783 for (var tag in dglgames) {
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
784 var dglinfo = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
785 var slash = tag.search('/');
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
786 dglinfo["g"] = tag.slice(0, slash);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
787 dglinfo["p"] = tag.slice(slash + 1);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
788 dglinfo["i"] = -1;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
789 statusinfo["dgl"].push(dglinfo);
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
790 }
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
791 callback(statusinfo);
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
792 }
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
793
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
794 function statusmsg(req, res) {
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
795 function respond(info) {
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
796 res.writeHead(200, { "Content-Type": "application/json" });
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
797 if (req.method != 'HEAD')
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
798 res.write(JSON.stringify(info));
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
799 res.end();
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
800 }
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
801 getStatus(respond);
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
802 }
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
803
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
804 function pstatusmsg(req, res) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
805 if (req.method == 'HEAD') {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
806 res.writeHead(200, { "Content-Type": "application/json" });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
807 res.end();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
808 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
809 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
810 var target = url.parse(req.url).pathname;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
811 var pmatch = target.match(/^\/pstatus\/(.*)/);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
812 if (pmatch && pmatch[1])
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
813 var pname = pmatch[1];
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
814 else {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
815 sendError(res, 2, "No name given.");
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
816 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
817 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
818 var reply = {"name": pname};
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
819 playerstatus(pname, function (pdata) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
820 reply["stat"] = pdata;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
821 res.writeHead(200, { "Content-Type": "application/json" });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
822 res.write(JSON.stringify(reply));
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
823 res.end();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
824 });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
825 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
826
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
827 function getuinfo(req, res) {
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
828 var urlobj = url.parse(req.url, true);
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
829 var query = urlobj.query;
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
830 if (!("key" in query) || !(query["key"] in logins)) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
831 sendError(res, 1);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
832 return;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
833 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
834 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/);
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
835 if (!match || !match[1]) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
836 send404(res, urlobj.pathname, req.method == 'HEAD');
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
837 return;
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
838 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
839 var which = match[1];
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
840 var name = logins[query["key"]].name;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
841 var reply = { "u": name };
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
842 function send() {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
843 res.writeHead(200, { "Content-Type": "application/json" });
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
844 res.write(JSON.stringify(reply));
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
845 res.end();
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
846 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
847 if (which == "pw") {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
848 /* Don't actually divulge passwords. */
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
849 reply["pw"] = "";
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
850 send();
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
851 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
852 else if (which == "email") {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
853 var address;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
854 function finish(code, signal) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
855 if (code != 0) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
856 tslog("sqlickrypt: %d with name %s", code, name);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
857 sendError(res, 2);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
858 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
859 else {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
860 reply["email"] = address;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
861 send();
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
862 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
863 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
864 var subproc = child_process.spawn("/bin/sqlickrypt", ["getmail"]);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
865 subproc.stdout.on("data", function (data) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
866 address = data.toString().replace(/\n/g, "");
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
867 });
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
868 subproc.on("exit", finish);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
869 subproc.stdin.end(name + '\n', "utf8");
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
870 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
871 else {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
872 send404(res, urlobj.pathname, req.method == 'HEAD');
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
873 return;
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
874 }
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
875 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
876
126
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
877 function setuinfo(req, res, postdata) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
878 var urlobj = url.parse(req.url, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
879 var query = urlobj.query;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
880 if (!("key" in query) || !(query["key"] in logins)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
881 sendError(res, 1);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
882 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
883 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
884 var name = logins[query["key"]].name;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
885 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
886 if (!match || !match[1]) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
887 send404(res, urlobj.pathname, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
888 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
889 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
890 var which = match[1];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
891 if (!("v" in postdata)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
892 sendError(res, 2, "No value provided");
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
893 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
894 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
895 if (which == "email" || which == "pw") {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
896 var args;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
897 if (which == "email")
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
898 args = ["setmail"];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
899 else
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
900 args = ["setpw"];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
901 var child = child_process.execFile("/bin/sqlickrypt", args,
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
902 function (err, stdout, stderr) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
903 if (err) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
904 tslog("Could not set %s: sqlickrypt error %d", which, err.code);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
905 sendError(res, 2);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
906 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
907 else {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
908 tslog("User %s has changed %s", name, which);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
909 res.writeHead(200, { "Content-Type": "application/json" });
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
910 res.end(JSON.stringify({"t": "t"}));
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
911 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
912 });
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
913 child.stdin.end(name + "\n" + postdata.v + "\n", "utf8");
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
914 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
915 else {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
916 send404(res, urlobj.pathname, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
917 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
918 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
919
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
920 var errorcodes = [ "Generic Error", "Not logged in", "Invalid data",
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
921 "Login failed", "Already playing", "Game launch failed",
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
922 "Server shutting down", "Game not in progress" ];
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
923
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
924 function sendError(res, ecode, msg, box) {
31
7dd6becf9ce9 rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents: 30
diff changeset
925 res.writeHead(200, { "Content-Type": "application/json" });
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
926 var edict = {"t": "E"};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
927 if (!(ecode < errorcodes.length && ecode > 0))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
928 ecode = 0;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
929 edict["c"] = ecode;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
930 edict["s"] = errorcodes[ecode];
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
931 if (msg)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
932 edict["s"] += ": " + msg;
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
933 if (box)
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
934 res.write(JSON.stringify([edict]));
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
935 else
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
936 res.write(JSON.stringify(edict));
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
937 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
938 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
939
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
940 function send404(res, path, nopage) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
941 res.writeHead(404, {"Content-Type": "text/html; charset=utf-8"});
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
942 if (!nopage) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
943 res.write("<html><head><title>" + path + "</title></head>\n<body><h1>"
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
944 + path + " Not Found</h1></body></html>\n");
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
945 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
946 res.end();
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
947 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
948
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
949 function webHandler(req, res) {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
950 /* default headers for the response */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
951 var resheaders = {'Content-Type': 'text/html'};
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
952 /* The request body will be added to this as it arrives. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
953 var reqbody = "";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
954 var formdata;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
955
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
956 /* Register a listener to get the body. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
957 function moredata(chunk) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
958 reqbody += chunk;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
959 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
960 req.on('data', moredata);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
961
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
962 /* This will send the response once the whole request is here. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
963 function respond() {
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
964 formdata = getMsg(reqbody);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
965 var target = url.parse(req.url).pathname;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
966 /* First figure out if the client is POSTing to a command interface. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
967 if (req.method == 'POST') {
159
a613380ffdc2 RLGWebD: excise polling.
John "Elwin" Edwards
parents: 158
diff changeset
968 if (target == "/login") {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
969 login(req, res, formdata);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
970 }
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
971 else if (target == "/addacct") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
972 register(req, res, formdata);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
973 }
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
974 else if (target == "/quit") {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
975 stopgame(res, formdata);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
976 }
126
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
977 else if (target.match(/^\/uinfo\//)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
978 setuinfo(req, res, formdata);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
979 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
980 else {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
981 res.writeHead(405, resheaders);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
982 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
983 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
984 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
985 else if (req.method == 'GET' || req.method == 'HEAD') {
159
a613380ffdc2 RLGWebD: excise polling.
John "Elwin" Edwards
parents: 158
diff changeset
986 if (target == '/status') {
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
987 statusmsg(req, res);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
988 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
989 else if (target.match(/^\/uinfo\//)) {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
990 getuinfo(req, res);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
991 }
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
992 else if (target.match(/^\/pstatus\//)) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
993 pstatusmsg(req, res);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
994 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
995 else /* Go look for it in the filesystem */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
996 serveStatic(req, res, target);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
997 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
998 else { /* Some other method */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
999 res.writeHead(501, resheaders);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1000 res.write("<html><head><title>501</title></head>\n<body><h1>501 Not Implemented</h1></body></html>\n");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1001 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1002 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1003 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1004 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1005 req.on('end', respond);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1006 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1007
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1008 function wsHandler(wsRequest) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1009 var watchmatch = wsRequest.resource.match(/^\/watch\/(.*)$/);
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1010 var playmatch = wsRequest.resource.match(/^\/play\//);
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1011 if (watchmatch !== null) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1012 if (!(watchmatch[1] in sessions)) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1013 wsRequest.reject(404, errorcodes[7]);
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1014 return;
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1015 }
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1016 var tsession = sessions[watchmatch[1]];
171
671bed5039aa RLGWebD: fix simultaneous watcher bugs.
John "Elwin" Edwards
parents: 170
diff changeset
1017 tsession.attach(wsRequest);
162
5a7e7ec136c8 Properly print session tags in the log.
John "Elwin" Edwards
parents: 160
diff changeset
1018 tslog("Game %s is being watched via WebSockets", tsession.tag());
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1019 }
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1020 else if (playmatch !== null) {
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
1021 wsStartGame(wsRequest);
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1022 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1023 else if (wsRequest.resourceURL.pathname == "/status") {
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1024 var conn = wsRequest.accept(null, wsRequest.origin);
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1025 var tell = function () {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1026 getStatus(function (info) {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1027 info["t"] = "t";
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1028 conn.sendUTF(JSON.stringify(info));
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1029 });
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1030 }
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1031 var beginH = function (gname, pname) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1032 conn.sendUTF(JSON.stringify({"t": "b", "p": pname, "g": gname}));
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1033 };
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1034 var listH = function (list) {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1035 conn.sendUTF(JSON.stringify(list));
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1036 };
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1037 var endH = function (gname, pname) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1038 conn.sendUTF(JSON.stringify({"t": "e", "p": pname, "g": gname}));
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1039 };
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1040 gamemux.on('begin', beginH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1041 gamemux.on('list', listH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1042 gamemux.on('end', endH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1043 conn.on('message', tell);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1044 conn.on('close', function () {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1045 gamemux.removeListener('begin', beginH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1046 gamemux.removeListener('list', listH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1047 gamemux.removeListener('end', endH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1048 });
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1049 tell();
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1050 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1051 else
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1052 wsRequest.reject(404, "No such resource.");
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1053 }
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1054
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1055 /* Only games with low idle time are included. Use getStatus() for the
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1056 * complete list. */
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1057 function pushStatus() {
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1058 var now = new Date();
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1059 var statusinfo = {"t": "p", "s": allowlogin, "g": [], "dgl": []};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1060 for (var tag in sessions) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1061 var delta = now - sessions[tag].lasttime;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1062 if (delta < 60000) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1063 var gamedesc = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1064 gamedesc["p"] = sessions[tag].pname;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1065 gamedesc["g"] = sessions[tag].game.uname;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1066 gamedesc["i"] = delta;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1067 statusinfo["g"].push(gamedesc);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1068 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1069 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1070 for (var tag in dglgames) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1071 var dglinfo = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1072 var slash = tag.search('/');
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1073 dglinfo["g"] = tag.slice(0, slash);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1074 dglinfo["p"] = tag.slice(slash + 1);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1075 dglinfo["i"] = -1;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1076 statusinfo["dgl"].push(dglinfo);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1077 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1078 gamemux.emit('list', statusinfo);
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1079 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1080
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1081 function shutdown () {
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1082 httpServer.close();
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1083 httpServer.removeAllListeners('request');
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1084 ctlServer.close();
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1085 tslog("Shutting down...");
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1086 process.exit();
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1087 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1088
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1089 function consoleHandler(chunk) {
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1090 var msg = chunk.toString().split('\n')[0];
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1091 if (msg == "quit") {
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1092 allowlogin = false;
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1093 tslog("Disconnecting...");
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1094 for (var tag in sessions) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1095 sessions[tag].close();
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1096 }
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1097 progressWatcher.stdin.end("\n");
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
1098 setTimeout(shutdown, 2000);
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1099 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1100 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1101
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1102 process.on("exit", function () {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1103 for (var tag in sessions) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1104 sessions[tag].term.kill('SIGHUP');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1105 }
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
1106 tslog("Quitting...");
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1107 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1108 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1109
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1110 /* Initialization STARTS HERE */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1111 process.env["TERM"] = "xterm-256color";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1112
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1113 if (process.getuid() != 0) {
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
1114 tslog("Not running as root, cannot chroot.");
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1115 process.exit(1);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1116 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1117
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1118 var httpServer; // declare here so shutdown() can find it
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1119 var wsServer;
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1120 var progressWatcher;
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1121
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1122 var pwent;
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1123 try {
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1124 pwent = posix.getpwnam(dropToUser);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1125 }
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1126 catch (err) {
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1127 tslog("Could not drop to user %s: user does not exist", dropToUser);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1128 process.exit(1);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1129 }
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1130
85
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1131 /* This could be nonblocking, but nothing else can start yet anyway. */
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1132 if (fs.existsSync(ctlsocket)) {
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1133 fs.unlinkSync(ctlsocket);
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1134 }
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1135
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1136 /* Open the control socket before chrooting where it can't be found */
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1137 var ctlServer = net.createServer(function (sock) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1138 sock.on('data', consoleHandler);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1139 });
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1140 ctlServer.listen(ctlsocket, function () {
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1141 /* rlgwebd.js now assumes that it has been started by the rlgwebd shell
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1142 * script, or some other method that detaches it and sets up stdio. */
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1143 /* chroot and drop permissions. posix.chroot() does chdir() itself. */
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1144 try {
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1145 posix.chroot(chrootDir);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1146 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1147 catch (err) {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1148 tslog("chroot to %s failed: %s", chrootDir, err);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1149 process.exit(1);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1150 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1151 try {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1152 // drop gid first, that requires UID=0
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1153 process.setgid(pwent.gid);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1154 process.setuid(pwent.uid);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1155 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1156 catch (err) {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1157 tslog("Could not drop permissions: %s", err);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1158 process.exit(1);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1159 }
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1160 httpServer = http.createServer(webHandler);
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
1161 httpServer.listen(httpPort);
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
1162 tslog('rlgwebd running on port %d', httpPort);
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1163 wsServer = new WebSocketServer({"httpServer": httpServer});
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1164 wsServer.on("request", wsHandler);
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1165 tslog('WebSockets are online');
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1166 progressWatcher = startProgressWatcher();
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1167 setInterval(pushStatus, 40000);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1168 });
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1169