Merge pull request #6 from squatconf/www-launch-v4
website launch v4.0 (release candidate #2)pull/10/head
commit
a91b15abf1
@ -0,0 +1,16 @@
|
|||||||
|
var join = require('path').join
|
||||||
|
, name = 'squatconf'
|
||||||
|
, cwd = process.cwd()
|
||||||
|
|
||||||
|
module.exports = require('rc')(name, {
|
||||||
|
db_opts: { valueEncoding: 'json' }
|
||||||
|
, db_path: join(cwd, 'db', name)
|
||||||
|
, port: 8000
|
||||||
|
, host: "squatconf.eu"
|
||||||
|
, email: {
|
||||||
|
from : "no-reply@squatconf.eu"
|
||||||
|
, subject : "Hello, everyone is welcome at SquatConf.."
|
||||||
|
, bodyText : "Please verify that you wish to signup by following this link\n%link%\nYou can ignore this message if you DID NOT request to signup at our website\nhttp://squatconf.eu\n\nThe next event is in Paris, we hope to see you there !!\n\nKind regards from the team,\nSquatConf Paris 2014"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"db": {
|
|
||||||
"path": ""
|
|
||||||
},
|
|
||||||
|
|
||||||
"email": {
|
|
||||||
"from" : "no-reply@squatconf.eu"
|
|
||||||
, "subject" : "Hello, everyone is welcome at SquatConf.."
|
|
||||||
, "bodyText": "Please verify that you wish to signup by following this link\n%link%\nYou can ignore this message if you DID NOT request to signup at our website\nhttp://squatconf.eu\n\nThe next event is in Paris, we hope to see you there !!\n\nKind regards from the team,\nSquatConf Paris 2014"
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>SquatConf.386</title>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Squatconf webSite">
|
||||||
|
|
||||||
|
<link href="assets/css/bootstrap.css" rel="stylesheet">
|
||||||
|
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
|
||||||
|
<link href="assets/css/squatconf.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="span3 leftCol">
|
||||||
|
<ul class="nav nav-list">
|
||||||
|
<li><a href="/"><i class="icon-chevron-right"></i> SquatConf</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- content -->
|
||||||
|
<div class="span9">
|
||||||
|
<div class="page-header">
|
||||||
|
<pre class="maxW"><small>
|
||||||
|
.d8888b. 888 .d888
|
||||||
|
d88P Y88b 888 d88P"
|
||||||
|
Y88b. 888 888
|
||||||
|
"Y888b. .d88888888 888 8888b. 888888 .d8888b .d88b. 88888b. 888888
|
||||||
|
"Y88b.d88" 888888 888 "88b888 d88P" d88""88b888 "88b888
|
||||||
|
"888888 888888 888.d888888888 888 888 888888 888888
|
||||||
|
Y88b d88PY88b 888Y88b 888888 888Y88b. Y88b. Y88..88P888 888888
|
||||||
|
"Y8888P" "Y88888 "Y88888"Y888888 "Y888 "Y8888P "Y88P" 888 888888
|
||||||
|
888
|
||||||
|
888
|
||||||
|
888
|
||||||
|
<br></small></pre>
|
||||||
|
<pre class="dskW">
|
||||||
|
____ _ ____ __
|
||||||
|
/ ___| __ _ _ _ __ _| |_ / ___|___ _ __ / _|
|
||||||
|
\___ \ / _` | | | |/ _` | __| | / _ \| '_ \| |_
|
||||||
|
___) | (_| | |_| | (_| | |_| |__| (_) | | | | _|
|
||||||
|
|____/ \__, |\__,_|\__,_|\__|\____\___/|_| |_|_|
|
||||||
|
|_|
|
||||||
|
<br></pre>
|
||||||
|
<pre class="tblW">
|
||||||
|
|
||||||
|
(~ _ _ _|_/~` _ _ |`
|
||||||
|
_)(_||_|(_| | \_,(_)| |~|~
|
||||||
|
|/
|
||||||
|
<br></pre>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 id="email-verified" class="pull-left">You're verified</h2>
|
||||||
|
<br /><br />
|
||||||
|
<p>Thanks for completing our signup process</p>
|
||||||
|
<br />
|
||||||
|
<a href="/" class="btn">Go back</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Footer
|
||||||
|
================================================== -->
|
||||||
|
<!-- <footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
some info, maybe ? ;)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</footer> -->
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,72 +1,37 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
var nodemailer = require('nodemailer')
|
var fs = require('fs')
|
||||||
, transporter = nodemailer.createTransport()
|
, http = require('http')
|
||||||
, server = require('http').createServer(handler)
|
, stack = require('stack')
|
||||||
, email = require('./config.json').email
|
, route = require('tiny-route')
|
||||||
, rn = require('./src/rng')
|
, assets = require('ecstatic')
|
||||||
, fs = require('fs')
|
, join = require('path').join
|
||||||
, re = new RegExp('\.js$', 'i')
|
, config = require('./config')
|
||||||
, port = process.env.PORT || /*80*/ 8000
|
, db = require('level')(config.db_path, config.db_opts)
|
||||||
|
, port = process.env.PORT || config.port
|
||||||
function handler(req, res) {
|
|
||||||
|
// create the level db folder if it does not exists
|
||||||
// process incoming requests.
|
if(!fs.existsSync('./db/squatconf')){
|
||||||
if (req.url == '/') req.url = '/index.html'
|
fs.mkdirSync('./db/squatconf', 0766, function(err){
|
||||||
else if (re.test(req.url))
|
if(err){
|
||||||
res.setHeader('Content-Type', 'application/javascript')
|
console.log(err);
|
||||||
|
}
|
||||||
if (/^\/confirm\?/.test(req.url)) {
|
});
|
||||||
|
}
|
||||||
// @TODO
|
|
||||||
// compare submitted token with the token stored in our database.
|
var app = stack(
|
||||||
|
route('/email', require('./src/email-submit')(db))
|
||||||
res.statusCode = 302
|
, route('/confirm', require('./src/email-confirm')(db))
|
||||||
res.setHeader('Location', '/')
|
, assets(join(__dirname, 'html'))
|
||||||
return res.end()
|
)
|
||||||
}
|
|
||||||
|
|
||||||
if (/^\/email\?/.test(req.url)) {
|
|
||||||
var params = require('url').parse(req.url, true)
|
|
||||||
if (params && params.query.email) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
var to_addr = params.query.email // @NOTE:
|
|
||||||
// Q: do we trust the user input ?
|
|
||||||
// A: FUCK NO !!
|
|
||||||
, url = 'http://squatconf.eu/confirm'
|
|
||||||
, link = url +'?email='+ to_addr +'&token='+ rn() +'\n\n'
|
|
||||||
|
|
||||||
var opts = {
|
|
||||||
from : email.from
|
|
||||||
, to : to_addr
|
|
||||||
, subject: email.subject
|
|
||||||
, text : email.bodyText.replace(/\%link\%/, link)
|
|
||||||
}
|
|
||||||
|
|
||||||
transporter.sendMail(opts, function(err, data) {
|
|
||||||
if (err) return console.error('email problem !', err)
|
|
||||||
console.log('email sent', data)
|
|
||||||
})
|
|
||||||
*/
|
|
||||||
|
|
||||||
console.log(' got email:', params.query)
|
|
||||||
}
|
|
||||||
res.statusCode = 302
|
|
||||||
res.setHeader('Location', '/')
|
|
||||||
return res.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
// serve static assets
|
|
||||||
var rs = fs.createReadStream(__dirname +'/html'+ req.url)
|
|
||||||
rs.pipe(res)
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on('uncaughtException', function (err) {
|
process.on('uncaughtException', function (err) {
|
||||||
console.error('Error at:', new Date)
|
console.error('Error at:', new Date)
|
||||||
console.error(err.stack)
|
console.error(err.stack)
|
||||||
})
|
})
|
||||||
|
|
||||||
server.listen(port)
|
http.createServer(app).listen(port, function() {
|
||||||
console.error('['+ process.pid +'] server started on port '+ port)
|
console.log('['+ process.pid +'] server started on port '+ port)
|
||||||
console.error('(use ctrl+c to stop server)')
|
console.log('(use Ctrl+c to stop the server)')
|
||||||
|
})
|
||||||
|
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
var sanitize = require('xss-escape')
|
||||||
|
, ip = require('./ip-trace')
|
||||||
|
|
||||||
|
module.exports = function(db) {
|
||||||
|
return function (req, res, next) {
|
||||||
|
req.resume()
|
||||||
|
|
||||||
|
var params = require('url').parse(req.url, true)
|
||||||
|
|
||||||
|
if (params && params.query.email && params.query.token) {
|
||||||
|
//console.log('got token:', params.query)
|
||||||
|
|
||||||
|
var email = sanitize(params.query.email)
|
||||||
|
, token = sanitize(params.query.token)
|
||||||
|
|
||||||
|
db.get(email, function(err, obj) {
|
||||||
|
if (err) next(err)
|
||||||
|
|
||||||
|
// db read OK..
|
||||||
|
if (obj && obj.token === token) {
|
||||||
|
obj.verified = true
|
||||||
|
obj.trace = obj.trace.concat(ip(req))
|
||||||
|
|
||||||
|
db.put(email, obj, function(err) {
|
||||||
|
if (err) next(err)
|
||||||
|
|
||||||
|
// db write OK..
|
||||||
|
res.statusCode = 302
|
||||||
|
res.setHeader('Location', '/verified.html')
|
||||||
|
return res.end()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (next) return next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
|||||||
|
var sanitize = require('xss-escape')
|
||||||
|
, rn = require('./rng')
|
||||||
|
, ip = require('./ip-trace')
|
||||||
|
, config = require('../config')
|
||||||
|
|
||||||
|
module.exports = function(db) {
|
||||||
|
return function (req, res, next) {
|
||||||
|
req.resume()
|
||||||
|
|
||||||
|
var params = require('url').parse(req.url, true)
|
||||||
|
|
||||||
|
if (params && params.query.email) {
|
||||||
|
console.log('got email:', params.query)
|
||||||
|
|
||||||
|
var obj = {}
|
||||||
|
, email = sanitize(params.query.email)
|
||||||
|
|
||||||
|
obj.token = rn()
|
||||||
|
obj.verified = false
|
||||||
|
obj.events = { paris: params.query.paris ? true : false }
|
||||||
|
obj.trace = ip(req)
|
||||||
|
|
||||||
|
db.put(email, obj, function(err) {
|
||||||
|
if (err) next(err)
|
||||||
|
|
||||||
|
// db write OK..
|
||||||
|
var nodemailer = require('nodemailer')
|
||||||
|
, transporter = nodemailer.createTransport()
|
||||||
|
, url = 'http://squatconf.eu/confirm'
|
||||||
|
, link = url +'?email='+ email +'&token='+ obj.token +'\n\n'
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
from : config.email.from
|
||||||
|
, to : email
|
||||||
|
, subject: config.email.subject
|
||||||
|
, text : config.email.bodyText.replace(/\%link\%/, link)
|
||||||
|
}
|
||||||
|
|
||||||
|
transporter.sendMail(opts, function(err, data) {
|
||||||
|
if (err) throw err
|
||||||
|
// validation email sent
|
||||||
|
console.log('email sent..', data)
|
||||||
|
})
|
||||||
|
|
||||||
|
res.statusCode = 302
|
||||||
|
res.setHeader('Location', '/')
|
||||||
|
return res.end()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next) return next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
module.exports = function(req) {
|
||||||
|
if (req.headers['x-forwarded-for']) {
|
||||||
|
return req.headers['x-forwarded-for'].split(',')
|
||||||
|
} else {
|
||||||
|
return [ req.connection.remoteAddress ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue