diff --git a/client/admin/brewCleanup/brewCleanup.jsx b/client/admin/brewCleanup/brewCleanup.jsx index b70fbdb..3cf13f9 100644 --- a/client/admin/brewCleanup/brewCleanup.jsx +++ b/client/admin/brewCleanup/brewCleanup.jsx @@ -2,13 +2,43 @@ const React = require('react'); const createClass = require('create-react-class'); const cx = require('classnames'); +const request = require('superagent'); + const BrewCleanup = createClass({ displayName : 'BrewCleanup', getDefaultProps(){ return { + adminKey : '', }; }, + getInitialState() { + return { + count : 0, + + pending : false, + primed : false + }; + }, + prime(){ + if(this.state.primed) return this.cleanup(); + this.setState({ pending: true }); + + request.get('/admin/cleanup') + .query({ admin_key: this.props.adminKey }) + .then((res)=> this.setState({count : res.body.count })) + .catch((err)=>this.setState({ error : err })) + .finally(()=>this.setState({ pending : false })) + }, + cleanup(){ + this.setState({ pending: true }); + + request.post('/admin/cleanup') + .query({ admin_key: this.props.adminKey }) + .then((res)=> this.setState({count : res.body.count })) + .catch((err)=>this.setState({ error : err })) + .finally(()=>this.setState({ pending : false, primed : false })) + }, render(){ return
BrewCleanup Component Ready. diff --git a/client/admin/brewLookup/brewLookup.jsx b/client/admin/brewLookup/brewLookup.jsx index 80016b5..e9cac75 100644 --- a/client/admin/brewLookup/brewLookup.jsx +++ b/client/admin/brewLookup/brewLookup.jsx @@ -1,6 +1,5 @@ const React = require('react'); const createClass = require('create-react-class'); -const _ = require('lodash'); const cx = require('classnames'); const request = require('superagent'); @@ -21,7 +20,6 @@ const BrewLookup = createClass({ error : null }; }, - handleChange(e){ this.setState({ query : e.target.value }); }, @@ -29,7 +27,7 @@ const BrewLookup = createClass({ this.setState({ searching: true, error: null }); request.get(`/admin/lookup/${this.state.query}`) - .query({ admin_key: this.props.adminKey }) + //.query({ admin_key: this.props.adminKey }) .then((res)=> this.setState({foundBrew : res.body})) .catch((err)=>this.setState({ error : err })) .finally(()=>this.setState({ searching : false })) @@ -72,7 +70,7 @@ const BrewLookup = createClass({ {this.state.error - &&
{this.state.error}
+ &&
{this.state.error.toString()}
} {this.state.foundBrew diff --git a/package-lock.json b/package-lock.json index b59a4a0..c8f1adc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1066,14 +1066,6 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" }, - "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", - "requires": { - "safe-buffer": "5.1.1" - } - }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", diff --git a/package.json b/package.json index 088a5ef..906d6b4 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "dependencies": { "babel-preset-env": "^1.1.8", "babel-preset-react": "^6.24.1", - "basic-auth": "^2.0.0", "body-parser": "^1.14.2", "classnames": "^2.2.0", "codemirror": "^5.22.0", diff --git a/server/admin.api.js b/server/admin.api.js index 40798f4..a2c07ee 100644 --- a/server/admin.api.js +++ b/server/admin.api.js @@ -1,97 +1,88 @@ -const _ = require('lodash'); -const auth = require('basic-auth'); +//const auth = require('basic-auth'); const HomebrewModel = require('./homebrew.model.js').model; const router = require('express').Router(); +const Moment = require('moment'); +const render = require('vitreum/steps/render'); +const templateFn = require('../client/template.js'); +process.env.ADMIN_USER = process.env.ADMIN_USER || 'admin'; +process.env.ADMIN_PASS = process.env.ADMIN_PASS || 'password3'; +//process.env.ADMIN_KEY = process.env.ADMIN_KEY || 'admin_key'; + +//FIXME: remove this whole 'ADMIN_KEY' buulshit + const mw = { adminOnly : (req, res, next)=>{ - if(req.query && req.query.admin_key == process.env.ADMIN_KEY) return next(); + if(!req.get('authorization')){ + return res + .set('WWW-Authenticate', 'Basic realm="Authorization Required"') + .status(401) + .send('Authorization Required'); + } + const [username, password] = new Buffer(req.get('authorization').split(' ').pop(), 'base64') + .toString('ascii') + .split(':'); + if(process.env.ADMIN_USER === username && process.env.ADMIN_PASS === password){ + return next(); + } return res.status(401).send('Access denied'); } }; -process.env.ADMIN_USER = process.env.ADMIN_USER || 'admin'; -process.env.ADMIN_PASS = process.env.ADMIN_PASS || 'password'; -process.env.ADMIN_KEY = process.env.ADMIN_KEY || 'admin_key'; - - /* Removes all empty brews that are older than 3 days and that are shorter than a tweet */ -router.get('/admin/clear_invalid', mw.adminOnly, (req, res)=>{ - const invalidBrewQuery = HomebrewModel.find({ - '$where' : 'this.text.length < 140', - createdAt : { - $lt : Moment().subtract(3, 'days').toDate() - } - }); - - if(req.query.do_it){ - invalidBrewQuery.remove().exec((err, objs)=>{ - if(err) return res.status(500).send(err); - return res.send(200); - }); - } else { - invalidBrewQuery.exec((err, objs)=>{ - if(err) return res.status(500).send(err); - return res.json({ - count : objs.length - }); - }); +const junkBrewQuery = HomebrewModel.find({ + '$where' : 'this.text.length < 140', + createdAt : { + $lt : Moment().subtract(3, 'days').toDate() } }); +router.get('/admin/cleanup', mw.adminOnly, (req, res)=>{ + junkBrewQuery.exec((err, objs)=>{ + if(err) return res.status(500).send(err); + return res.json({ count : objs.length }); + }); +}); +/* Removes all empty brews that are older than 3 days and that are shorter than a tweet */ +router.post('/admin/cleanup', mw.adminOnly, (req, res)=>{ + junkBrewQuery.remove().exec((err, objs)=>{ + if(err) return res.status(500).send(err); + return res.json({ count : objs.length }); + }); +}) /* Searches for matching edit or share id, also attempts to partial match */ router.get('/admin/lookup/:id', mw.adminOnly, (req, res, next)=>{ - - console.log('lookup'); - - HomebrewModel.findOne({ $or : [ - { editId: { '$regex': req.params.id, '$options': 'i' } }, + { editId: { '$regex': req.params.id, '$options': 'i' } }, { shareId: { '$regex': req.params.id, '$options': 'i' } }, - ] }).exec((err, brew)=>{ + ]}).exec((err, brew)=>{ return res.json(brew); }); }); -router.get('/admin/stats', mw.adminOnly, (req, res)=>{ - console.log('hittting stats'); +router.get('/admin/stats', mw.adminOnly, (req, res)=>{ HomebrewModel.count({}, (err, count)=>{ return res.json({ totalBrews : count }) }) - }); - - -//Admin route - -const render = require('vitreum/steps/render'); -const templateFn = require('../client/template.js'); -router.get('/admin', function(req, res){ - const credentials = auth(req); - if(!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) { - res.setHeader('WWW-Authenticate', 'Basic realm="example"'); - return res.status(401).send('Access denied'); - } +router.get('/admin', mw.adminOnly, (req, res)=>{ + // const credentials = auth(req); + // if(!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) { + // res.setHeader('WWW-Authenticate', 'Basic realm="example"'); + // return res.status(401).send('Access denied'); + // } render('admin', templateFn, { url : req.originalUrl, adminKey : process.env.ADMIN_KEY }) - .then((page)=>{ - return res.send(page); - }) - .catch((err)=>{ - console.log(err); - return res.sendStatus(500); - }); + .then((page)=>res.send(page)) + .catch((err)=>res.sendStatus(500)) }); - - - module.exports = router; \ No newline at end of file