annotate avatar.js @ 13:38ddd5888b8d

It’s now a client instead of a component. :)
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 03 Jun 2011 21:45:59 +0200
parents a0ed785d1b8d
children 7fdae201c1e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 #!/usr/bin/env node
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 /*
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 * Copyright (C) 2011 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
5 *
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 * This file is the source code of an XMPP avatar retriever.
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 *
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or modify
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 * it under the terms of the GNU Affero General Public License as
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 * published by the Free Software Foundation, version 3 of the License.
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
11 *
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15 * GNU Affero General Public License for more details.
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 *
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 * You should have received a copy of the GNU Affero General Public License
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 */
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 'use strict';
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 var config = require('./configuration');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
25 var util = require('util');
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
26 var fs = require('fs');
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
27 var http = require('http');
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
28
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
29 var xmpp = require('node-xmpp');
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
30 var conn = new xmpp.Client(config);
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
31 var Element = require('ltx').Element;
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
32
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
33 Element.prototype.getAttribute = function(name) {
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
34 return this.attrs[name];
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
35 };
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
36
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
37 process.addListener('uncaughtException', function (err) {
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
38 console.log('Uncaught exception (' + err + '), this should never happen:\n' + err.stack);
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
39 });
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
41 (function() {
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
42 var send = conn.send;
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
43 conn.send = function(s) {
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
44 util.log('Sent: ' + s + '');
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
45 send.call(conn, s);
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
46 };
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
47 })();
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
49 conn.on('online', function () {
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
50 console.log('Connected');
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
51 });
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
53 conn.on('stanza', function (stanza) {
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
54 util.log('Recv: ' + stanza + '');
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
55 if (stanza.is('iq'))
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
56 onIq(stanza);
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
57 else
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
58 onError(stanza);
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
59 });
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
61 var getUniqueId = (function() {
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
62 var id = 0;
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
63 return function() {
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
64 return ++id;
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
65 };
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
66 })();
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
67
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
68 var extensions = {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69 png: 'image/png',
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
70 svg: 'image/svg+xml',
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
71 jpg: 'image/jpeg',
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
72 gif: 'image/gif'
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 var jids = {};
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
76
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
77 var sent = {};
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
78
2
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
79 var svgError = function(res, message) {
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
80 res.writeHead(500, {'Content-Type': 'image/svg+xml'});
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
81 res.write('<?xml version="1.0" encoding="UTF-8"?>\n');
6
3b799c33ab16 More avatar-like error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
82 res.write('<svg xmlns="http://www.w3.org/2000/svg" viewBox="-32 -36 64 64">\n');
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
83 res.write('\t<title>'+message+'</title>\n');
6
3b799c33ab16 More avatar-like error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
84 res.write('\t<rect x="-32" y="-36" width="64" height="64" fill="white"/>\n');
3b799c33ab16 More avatar-like error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
85 res.write('\t<text font-family="sans-serif" font-weight="bold" text-anchor="middle">Error</text>\n');
2
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
86 res.end('</svg>\n');
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
87 }
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
88
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
89 var makeError = function(response) {
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
90 response.attrs.type = 'error';
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
91
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
92 response.c('error', {type: 'cancel'})
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
93 .c('feature-not-implemented', {xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'});
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
94
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
95 return response;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
96 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
97
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
98 function onIq(stanza) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
99 var type = stanza.getAttribute('type');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
100 var from = stanza.getAttribute('to');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
101 var to = stanza.getAttribute('from');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
102 var id = stanza.getAttribute('id');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
103
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
104 var response = new Element('iq', {to: to, from: from, type: 'result'});
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
105 if (id)
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
106 response.attrs.id = id;
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
107
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
108 if (!sent[id])
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
109 return conn.send(makeError(response));
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
110
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
111 var res = sent[id];
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
112 delete sent[id];
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
113
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
114 if (type == 'error') {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
115 try {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
116 var err = stanza.getChild('error').getChild().name;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
117 } catch (e) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118 var err = 'none';
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
119 }
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
120 return svgError(res, 'Error during query of this user’s vCard: “'+err+'”.');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
121 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
122
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
123 var vCard = stanza.getChild('vCard', 'vcard-temp');
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
124 if (!vCard)
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
125 return svgError(res, 'Error: this user doesn’t have a vCard.');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
126
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
127 try {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
128 var photo = vCard.getChild('PHOTO', 'vcard-temp');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
129 var base64 = photo.getChild('BINVAL', 'vcard-temp').getText();
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
130
1
0c19fadfc12d Serve the right error message when the TYPE of the PHOTO is missing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
131 try {
0c19fadfc12d Serve the right error message when the TYPE of the PHOTO is missing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
132 var type = photo.getChild('TYPE', 'vcard-temp').getText();
0c19fadfc12d Serve the right error message when the TYPE of the PHOTO is missing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
133 } catch (e) {
5
9b2f17ea1594 Add an option to guess the type of an avatar even if it is unspecified.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
134 if (config.guessType)
9b2f17ea1594 Add an option to guess the type of an avatar even if it is unspecified.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
135 type = 'image/png'; // FIXME: use magic.
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
136 else
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
137 return svgError(res, 'Error: this user’s vCard doesn’t specify the MIME type of its avatar.');
1
0c19fadfc12d Serve the right error message when the TYPE of the PHOTO is missing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
138 }
0c19fadfc12d Serve the right error message when the TYPE of the PHOTO is missing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
139
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 var ext;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 for (var i in extensions)
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142 if (type == extensions[i])
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143 ext = i;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144
5
9b2f17ea1594 Add an option to guess the type of an avatar even if it is unspecified.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
145 // Here we don’t try to guess the extension even if the option is set.
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146 if (ext === undefined) {
5
9b2f17ea1594 Add an option to guess the type of an avatar even if it is unspecified.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
147 console.log('Unknown MIME type: '+type);
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
148 return svgError(res, 'Error: this user’s avatar is in an unknown format.');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
150
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
151 var binval = new Buffer(base64.replace(/\n/g, ''), 'base64');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
152
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
153 fs.writeFile(config.directory+'/'+to+'.'+ext, binval, function() {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
154 jids[to] = ext;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
155 showImage(to, res);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
157 } catch (e) {
2
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
158 svgError(res, 'Error: this user doesn’t have an avatar in his/her vCard.');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162 function onError(stanza) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
163 if (stanza.getAttribute('type') == 'error')
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
164 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
165
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
166 var from = stanza.getAttribute('to');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
167 var to = stanza.getAttribute('from');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
168 var id = stanza.getAttribute('id');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
170 var response = new Element(stanza.name, {to: to, from: from});
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171 if (id)
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
172 response.attrs.id = id;
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
173
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
174 conn.send(makeError(response));
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
175 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
176
3
805f24754ff1 Don’t delete avatar on error, only allow update.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2
diff changeset
177 var getVCard = function(jid, res) {
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
178 var id = getUniqueId();
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
179
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
180 var toSend = new Element('iq', {to: jid, from: config.jid, type: 'get', id: id})
12
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
181 .c('vCard', {xmlns: 'vcard-temp'})
a0ed785d1b8d Remove xmpp.js compatibility and fix the node-xmpp one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
182 .up();
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
183
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
184 conn.send(toSend);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
185
3
805f24754ff1 Don’t delete avatar on error, only allow update.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2
diff changeset
186 sent[id] = res;
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
187 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
188
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
189 var showImage = function(jid, res) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
190 var extension = jids[jid];
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
191 var file = config.directory+'/'+jid+'.'+extension;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
192 res.writeHead(200, {'Content-Type': extensions[extension]});
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
193 fs.readFile(file, function(err, data) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
194 res.end(data);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
195 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
196 fs.stat(file, function(err, stats) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
197 if (err) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
198 console.log('Error when stat on “'+file+'”.');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
199 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
201
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
202 var last = new Date(stats.mtime);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
203 var now = new Date();
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
204
3
805f24754ff1 Don’t delete avatar on error, only allow update.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2
diff changeset
205 if (now - last > 24*60*60*1000)
805f24754ff1 Don’t delete avatar on error, only allow update.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2
diff changeset
206 getVCard(jid, res);
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
208 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
209 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
211 fs.readdir('data', function(err, files) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
212 if (err)
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
213 process.exit('1');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
214
2
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
215 for (var i in files) {
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
216 var tab = /(.*)\.([a-z]{3})/.exec(files[i]);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
217 jids[tab[1]] = tab[2];
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
219 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
220
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
221 http.createServer(function (req, res) {
7
51cda3a6e1c3 Better handling of proxy connections; add an option to specify the root on the webserver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
222 console.log('Connection from ' + (req.headers['x-forwarded-for'] || req.client.remoteAddress) + ' (' + req.headers['user-agent'] + ') to get “' + req.url + '”.');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
223
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
224 var easterEggs = {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
225 source: {
7
51cda3a6e1c3 Better handling of proxy connections; add an option to specify the root on the webserver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
226 re: new RegExp(config.webRoot + 'source/code$'),
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
227 file: process.argv[1],
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
228 mime: 'application/ecmascript',
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
229 error: 'source code unavailable! oO'
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
230 },
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
231 README: {},
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
232 COPYING: {},
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
233 };
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
234
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
235 req.setEncoding('utf-8');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
236
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
237 for (var i in easterEggs) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
238 var ee = easterEggs[i];
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
239 var file = ee.file || i;
7
51cda3a6e1c3 Better handling of proxy connections; add an option to specify the root on the webserver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
240 var re = ee.re || new RegExp(config.webRoot + file + '$');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
241 if (re.test(req.url)) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
242 fs.readFile(file, function(err, content) {
13
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
243 if (err)
38ddd5888b8d It’s now a client instead of a component. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 12
diff changeset
244 return svgError(res, 'Error: ' + (ee.error || file + ' unavailable.'));
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
245 res.writeHead(200, {'Content-Type': ee.mime || 'text/plain'});
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
246 res.end(content);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
247 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
248 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
249 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
250 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
251
7
51cda3a6e1c3 Better handling of proxy connections; add an option to specify the root on the webserver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
252 var jid = unescape(req.url.replace(new RegExp(config.webRoot), ''));
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
253
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
254 if (jid === '') {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
255 res.writeHead(200, {'Content-Type': 'application/xhtml+xml'});
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
256 res.write('<?xml version="1.0" encoding="utf-8"?>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
257 res.write('<!DOCTYPE html>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
258 res.write('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
259 res.write('\t<head>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
260 res.write('\t\t<title>JavaScript XMPP Avatar Retriever</title>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
261 res.write('\t</head>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
262 res.write('\t<body>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
263 res.write('\t\t<header><h1>JavaScript XMPP Avatar Retriever</h1></header>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
264 res.write('\t\t<p>Put any JID and get its avatar. :)</p>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
265 res.write('\t\t<form action="redirect" method="post">\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
266 res.write('\t\t\t<p>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
267 res.write('\t\t\t\t<input name="jid" type="text" placeholder="you@yourserver.tld"/>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
268 res.write('\t\t\t\t<input type="submit"/>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
269 res.write('\t\t\t</p>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
270 res.write('\t\t</form>\n');
2
ad496e8a5e66 Use an image for errors instead of text (unusable in <img/>).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
271 res.write('\t\t<footer><p>(<a href="README">README</a>, <a href="source/code">source code</a>, <a href="http://hg.linkmauve.fr/avatar">Mercurial repository</a>)</p></footer>\n');
0
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
272 res.write('\t</body>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
273 res.end('</html>\n');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
274 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
275 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
276
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
277 if (jid === 'redirect') {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
278 if (req.method !== 'POST') {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
279 res.writeHead(404, {'Content-Type': 'text/plain'});
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
280 res.end('Error: redirect unavailable.');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
281 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
282 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
283
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
284 req.on('data', function(content) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
285 console.log(content);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
286 var jid = unescape(content.toString()).replace(/^jid=/, '');
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
287 res.writeHead(301, {'Location': jid});
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
288 res.end();
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
289 });
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
290 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
291 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
292
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
293 if (jid in jids) {
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
294 showImage(jid, res);
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
295 return;
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
296 }
d5cfe54f11aa Initial commit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
297
3
805f24754ff1 Don’t delete avatar on error, only allow update.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2
diff changeset
298 getVCard(jid, res);
9
9360b78c7a5b Add WebHost configuration, and default it to both IPv6 and IPv4.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
299 }).listen(config.webPort, config.webHost);