aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.coffee151
-rw-r--r--src/bcoin.coffee87
-rw-r--r--src/components/SignUp.vue39
-rw-r--r--src/install.coffee16
-rw-r--r--src/main.js9
-rw-r--r--src/passport.coffee35
-rw-r--r--src/redis.coffee7
-rw-r--r--src/routes/sessions.coffee25
-rw-r--r--src/routes/transactions.coffee105
-rw-r--r--src/routes/users.coffee31
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)
- )
- )
- )