diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.coffee | 151 | ||||
| -rw-r--r-- | src/bcoin.coffee | 87 | ||||
| -rw-r--r-- | src/components/SignUp.vue | 39 | ||||
| -rw-r--r-- | src/install.coffee | 16 | ||||
| -rw-r--r-- | src/main.js | 9 | ||||
| -rw-r--r-- | src/passport.coffee | 35 | ||||
| -rw-r--r-- | src/redis.coffee | 7 | ||||
| -rw-r--r-- | src/routes/sessions.coffee | 25 | ||||
| -rw-r--r-- | src/routes/transactions.coffee | 105 | ||||
| -rw-r--r-- | src/routes/users.coffee | 31 |
10 files changed, 43 insertions, 462 deletions
diff --git a/src/app.coffee b/src/app.coffee deleted file mode 100644 index 1fc2099c..00000000 --- a/src/app.coffee +++ /dev/null @@ -1,151 +0,0 @@ -request = require('request') -express = require('express') -bodyParser = require('body-parser') -cookieParser = require('cookie-parser') -path = require('path') -passport = require('./passport') -config = require('./config') -fs = require('fs') -proxyMiddleware = require('http-proxy-middleware') -sessions = require("./routes/sessions")(passport) -transactions = require("./routes/transactions") -twilio = require('twilio') -users = require("./routes/users")(sessions) - -session = require('express-session') -RedisStore = require('connect-redis')(session) -sessionStore = new RedisStore(require('./redis').host, ttl: 172800) - - -proxyContext = '/blockcypher' -proxyOptions = - target: 'https://api.blockcypher.com' - changeOrigin: true - pathRewrite: - '^/blockcypher/': '/' - onProxyReq: (proxyReq, req, res) -> - symbol = if '?' in proxyReq.path then '&' else '?' - proxyReq.path += "#{symbol}token=#{config.blockcypher_token}" - -proxy = proxyMiddleware(proxyContext, proxyOptions) - -app = express() -app.enable('trust proxy') -app.engine('html', require('hogan-express')) -app.set('view engine', 'html') -app.set('views', __dirname + '/views') -app.use(express.static(__dirname + '/public')) -app.use(proxy) -app.use(bodyParser.urlencoded({ extended: true})) -app.use(bodyParser.json()) -app.use(bodyParser.json({ type: 'application/vnd.api+json' })) -app.use(cookieParser(config.secret)) -app.use(session( - resave: true - saveUninitialized: true - secret: config.secret - store: sessionStore - cookie: maxAge: 1209600000 - key: 'coinos.sid' -)) -app.use(passport.initialize()) -app.use(passport.session()) - -authorize = (req, res, next) -> - if req.params.user is req.user?.username or - req.user?.username is 'admin' - return next() - - req.session.redirect = req.path - res.redirect('/login') - -cache = (req, res, next) -> - unless req.path is '/login' - res.setHeader "Cache-Control", "public, max-age=900" - next() - -do fetchRates = -> - request("https://api.bitcoinaverage.com/exchanges/all", (error, response, body) -> - try - require('util').isDate(JSON.parse(body).timestamp) - file = 'public/js/rates.json' - stream = fs.createWriteStream(file) - fs.truncate(file, 0, -> - stream.write(body) - ) - ) - setTimeout(fetchRates, 120000) - -require('./bcoin').init(app) - -app.get('/', cache, sessions.new) - -app.get('/address', cache, (req, res) -> - res.render('address', - layout: 'layout', - js: (-> global.js), - css: (-> global.css) - ) -) - -app.get('/ticker', cache, (req, res) -> - fs = require('fs') - fs.readFile("./public/js/rates.json", (err, data) -> - req.query.currency ||= 'CAD' - req.query.symbol ||= 'quadrigacx' - req.query.type ||= 'bid' - - try - exchange = JSON.parse(data)[req.query.currency][req.query.symbol]['rates'][req.query.type].toString() - catch e - exchange = "0" - - res.writeHead(200, - 'Content-Length': exchange.length, - 'Content-Type': 'text/plain') - res.write(exchange) - res.end() - ) -) - -app.get('/tips', cache, (req, res) -> - res.render('tips', - notice: true, - layout: 'layout', - js: (-> global.js), - css: (-> global.css) - ) -) - -app.get('/login', cache, sessions.new) -app.post('/login', sessions.create) -app.get('/logout', sessions.destroy) - -app.get('/users.json', users.index) -app.get('/register', cache, users.new) -app.get('/users/new', cache, users.new) -app.post('/users', users.create) -app.get('/verify/:token', users.verify) - -app.post('/:user', authorize, users.update) -app.get('/:user/edit', authorize, users.edit) -app.get('/:user/profile', authorize, users.profile) -app.get('/:user/wallet', authorize, users.wallet) - -app.get('/:user/transactions.json', authorize, transactions.json) -app.post('/:user/transactions', transactions.create) -app.post('/transactions/:txid', transactions.update) -app.delete('/:user/transactions/:txid', transactions.delete) -app.get('/:user/report', authorize, transactions.index) - -app.get('/:user.json', users.json) -app.get('/:user', cache, users.show) - -app.use((err, req, res, next) -> - res.status(500) - res.send('An error occurred') - console.error(err.stack) - res.end() -) - -app.listen(3000) diff --git a/src/bcoin.coffee b/src/bcoin.coffee deleted file mode 100644 index d0a8a089..00000000 --- a/src/bcoin.coffee +++ /dev/null @@ -1,87 +0,0 @@ -bcoin = require('bcoin') -config = require('./config') -db = require('./redis') -twilio = require('twilio') - -module.exports = - init: (app) -> - users = {} - - chain = new bcoin.chain( - db: 'leveldb' - name: 'spvchain' - location: __dirname + '/db/spvchain' - spv: true - ) - - pool = new bcoin.pool( - chain: chain - spv: true - size: 1 - maxPeers: 1 - seeds: ['dctrl.ca'] - ) - - # pool.logger.level = 4 - - pool.open().then(-> - db.keysAsync("user:*").then((keys) -> - Promise.all(keys.map((key) -> - db.hgetallAsync(key).then((user) -> - if user.address - pool.watchAddress(user.address) - users[user.address] = - email: user.email - currency: user.currency - symbol: user.symbol - phone: user.phone - ) - )) - ) - - pool.connect() - pool.startSync() - - pool.on('error', (err) -> - console.log(err) - ) - - pool.on('tx', (tx) -> - for output in tx.outputs - value = (output.value / 100000000).toFixed(8) - address = output.getAddress().toBase58() - if Object.keys(users).includes(address) - app.render('payment', { value: value, address: address }, (err, html) -> - helper = require('sendgrid').mail - from_email = new helper.Email('[email protected]') - to_email = new helper.Email(users[address].email) - subject = 'Received Payment' - content = new helper.Content('text/html', html) - mail = new helper.Mail(from_email, subject, to_email, content) - - sg = require('sendgrid')(config.sendgrid_token) - request = sg.emptyRequest( - method: 'POST' - path: '/v3/mail/send' - body: mail.toJSON() - ) - - sg.API(request, (error, response) -> - console.log(response.statusCode) - console.log(response.body) - console.log(response.headers) - ) - ) - - if users[address].phone - client = new twilio.RestClient(config.twilio_sid, config.twilio_token) - - client.messages.create( - to: user.phone - from: config.twilio_number - body: "You received a payment of #{value} BTC" - , (err, message) -> - console.log(message.sid) - ) - ) - ) diff --git a/src/components/SignUp.vue b/src/components/SignUp.vue new file mode 100644 index 00000000..51583b82 --- /dev/null +++ b/src/components/SignUp.vue @@ -0,0 +1,39 @@ +<template lang="pug"> +div + #main-logo + form#register(action='/users', method='post') + .form-group + label(for='username') Username: + | + input#username.form-control(type='text', name='username') + .form-group + label(for='email') Email: + | + input#email.form-control(type='text', name='email') + .form-group + label(for='password') Passphrase: + | + input#password.form-control(type='password', name='password') + #messages + .form-group + label(for='confirm') Confirm Passphrase: + | + input#confirm.form-control(type='password', name='confirm') + | + input#commission(name='commission', type='hidden', value='0') + | + input#unit(name='unit', type='hidden', value='BTC') + | + input#pubkey(name='pubkey', type='hidden') + | + input#privkey(name='privkey', type='hidden') + | + input.btn.btn-primary(type='submit', value='Register') + #qr +</template> + +<script> +export default { + name: 'SignUp' +} +</script> diff --git a/src/install.coffee b/src/install.coffee deleted file mode 100644 index 7ba2449d..00000000 --- a/src/install.coffee +++ /dev/null @@ -1,16 +0,0 @@ -db = require("./redis") -bcrypt = require('bcryptjs') - -db.get("user:admin", (err, res) -> - if !res - bcrypt.hash('admin', 12, (err, hash) -> - db.sadd("users","user:admin") - db.hmset("user:admin", - username: 'admin' - password: hash, - , -> - console.log("Created admin user with password 'admin'") - process.exit() - ) - ) -) diff --git a/src/main.js b/src/main.js index 0fb682f3..cfaeb1ac 100644 --- a/src/main.js +++ b/src/main.js @@ -1,18 +1,18 @@ -// The Vue build version to load with the `import` command -// (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import VueRouter from 'vue-router' import App from './App' import SignIn from './components/SignIn' +import SignUp from './components/SignUp' import Sales from './components/Sales' const routes = [ - { path: '/', component: SignIn }, + { path: '/signin', component: SignIn }, + { path: '/signup', component: SignUp }, { path: '/sales', component: Sales } ] const router = new VueRouter({ - routes // short for routes: routes + routes }) Vue.use(VueRouter) @@ -24,4 +24,3 @@ new Vue({ components: { App }, router: router }) - diff --git a/src/passport.coffee b/src/passport.coffee deleted file mode 100644 index 7fd99668..00000000 --- a/src/passport.coffee +++ /dev/null @@ -1,35 +0,0 @@ -db = require("redis").createClient() -bcrypt = require('bcryptjs') - -passport = require('passport') -LocalStrategy = require('passport-local').Strategy - -passport.serializeUser((user, done) -> - done(null, user.username.toLowerCase()) -) - -passport.deserializeUser((username, done) -> - db.hgetall("user:"+username.toLowerCase(), (err, user) -> - return done(null, user) - ) -) - -passport.use(new LocalStrategy( - (username, password, done) -> - db.hget("user:"+username.toLowerCase(), 'password', (err, hash) -> - return done(err) if err - if hash - bcrypt.compare(password, hash, (err, match) -> - if match - db.hgetall("user:"+username.toLowerCase(), (err, user) -> - return done(null, user) - ) - else - return done(null, false) - ) - else - return done(null, false) - ) -)) - -module.exports = passport diff --git a/src/redis.coffee b/src/redis.coffee deleted file mode 100644 index 7f28fae0..00000000 --- a/src/redis.coffee +++ /dev/null @@ -1,7 +0,0 @@ -Promise = require('bluebird') - -settings = - port: 6379 - host: '127.0.0.1' - -module.exports = Promise.promisifyAll(require('redis')).createClient(settings.port, settings.host) diff --git a/src/routes/sessions.coffee b/src/routes/sessions.coffee deleted file mode 100644 index 70c18b4e..00000000 --- a/src/routes/sessions.coffee +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = (passport) -> - new: (req, res) -> - res.render('sessions/new', - js: (-> global.js), - css: (-> global.css) - ) - - create: (req, res, next) -> - passport.authenticate('local', (err, user, info) -> - if (err) - return next(err) - if (!user) - return res.redirect('/login') - req.login(user, (err) -> - if (err) - return next(err) - url = req.headers['referer'] - url = "/#{user.username}" unless /edit/.test(url) - return res.redirect(url) - ) - )(req, res, next) - - destroy: (req, res) -> - req.logout() - res.redirect('/login') diff --git a/src/routes/transactions.coffee b/src/routes/transactions.coffee deleted file mode 100644 index 2eca7766..00000000 --- a/src/routes/transactions.coffee +++ /dev/null @@ -1,105 +0,0 @@ -Promise = require('bluebird') -db = require('../redis') -config = require("../config") -moment = require('moment') - -txid = (transaction, user) -> - return transaction if transaction.match(/[a-z]/i) - return user + ":transactions:" + transaction - -module.exports = - index: (req, res) -> - res.render( - 'transactions/index' - user: req.params.user - currency: req.session.user.currency - layout: 'layout' - navigation: true - js: (-> global.js) - css: (-> global.css) - ) - - json: (req, res) -> - result = 'transactions': [] - promises = [] - pattern = req.params.user - if req.session.user.username is 'admin' - x = '*' - - db.keysAsync("#{pattern}:transactions").then((keys) -> - Promise.all(keys.map((key) -> - user = key.substr(0, key.indexOf(':')) - db.lrangeAsync(key, 0, -1).then((transactions) -> - Promise.all(transactions.map((transaction) -> - db.hgetallAsync(txid(transaction, user)).then((transaction) -> - if transaction - transaction.user = user - result.transactions.push(transaction) - ) - )) - ) - )) - ).then(-> - res.write(JSON.stringify(result)) - res.end() - ) - - - create: (req, res) -> - finish = -> - db.hgetall("user:"+req.params.user.toLowerCase(), (err, user) -> - res.render('transactions/notification', - layout: 'mail' - amount: (req.body.received * req.body.exchange).toFixed(2).toString() + ' ' + user.currency - address: req.body.address - txid: req.body.txid - js: (-> global.js) - css: (-> global.css) - (err, html) -> - helper = require('sendgrid').mail - from_email = new helper.Email('[email protected]') - to_email = new helper.Email(user.email) - subject = 'Payment Received' - content = new helper.Content('text/html', html) - mail = new helper.Mail(from_email, subject, to_email, content) - - sg = require('sendgrid')(config.sendgrid_token) - request = sg.emptyRequest( - method: 'POST' - path: '/v3/mail/send' - body: mail.toJSON() - ) - - sg.API(request, (error, response) -> - console.log(response.statusCode) - console.log(response.body) - console.log(response.headers) - ) - ) - ) - res.write(JSON.stringify(req.body)) - res.end() - - db.watch(req.body.txid) - db.exists(req.body.txid, (err, result) -> - return finish() if result - - multi = db.multi() - multi.hmset(req.body.txid, req.body) - multi.rpush("#{req.params.user}:transactions", req.body.txid) - multi.exec((err, replies) -> - finish() - ) - ) - - update: (req, res) -> - db.hset(req.params.txid, 'notes', req.body.notes, -> - res.end() - ) - - delete: (req, res) -> - db.del(req.params.txid, -> - db.lrem(req.params.user + ":transactions", 0, req.params.txid, -> - res.end() - ) - ) diff --git a/src/routes/users.coffee b/src/routes/users.coffee deleted file mode 100644 index 1611f691..00000000 --- a/src/routes/users.coffee +++ /dev/null @@ -1,31 +0,0 @@ -db = require("redis").createClient() -bcrypt = require('bcrypt') - -module.exports = (sessions) -> - exists: (req, res) -> - db.hgetall(req.params.user, (err, obj) -> - if obj? then res.write('true') else res.write('false') - res.end() - ) - - new: (req, res) -> - res.render('users/new', - js: (-> global.js), - css: (-> global.css), - ) - - create: (req, res) -> - db.hgetall(req.body.username, (err, obj) -> - if obj - res.redirect(req.body.username) - else - bcrypt.hash(req.body.password, 12, (err, hash) -> - db.hmset( - req.body.username, - {username: req.body.username, password: hash}, - -> - req.headers['referer'] = "/#{req.body.username}/edit" - sessions.create(req, res) - ) - ) - ) |
