From 51d8c665d0c09f1c6222369eb674a1d83f6b2522 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 16 Apr 2015 18:59:15 -0400 Subject: add dirname to the uploaded images --- app/node_modules/okservices/index.js | 1 + 1 file changed, 1 insertion(+) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/index.js b/app/node_modules/okservices/index.js index 46f7ffd..015fff0 100644 --- a/app/node_modules/okservices/index.js +++ b/app/node_modules/okservices/index.js @@ -21,6 +21,7 @@ function OKImageService(options) { key: options.s3.key, secret: options.s3.secret, bucket: options.s3.bucket, + dirname: options.s3.dirname, headers: { 'x-amz-acl': 'public-read' } -- cgit v1.2.3-70-g09d2 From 2e922f5f58f852e1c3471c77dd6d2db06535cdc2 Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Fri, 24 Apr 2015 17:36:30 -0400 Subject: Update image upload service dependency with bug patch --- app/node_modules/okservices/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/package.json b/app/node_modules/okservices/package.json index f27247b..556b9df 100644 --- a/app/node_modules/okservices/package.json +++ b/app/node_modules/okservices/package.json @@ -9,7 +9,7 @@ "author": "OKFocus", "license": "None", "dependencies": { - "skipper": "^0.5.5", + "skipper": "git+ssh://git@github.com:nitzo/skipper#patch-1", "skipper-s3": "^0.5.5" } } -- cgit v1.2.3-70-g09d2 From 40d553c5e76aa685f547faa2419fd4e71cbf67a9 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 24 Apr 2015 17:44:18 -0400 Subject: maxbytes setting --- app/node_modules/okservices/index.js | 1 + site/index.js | 1 + site/templates/page.liquid | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/index.js b/app/node_modules/okservices/index.js index 015fff0..fbbdbfd 100644 --- a/app/node_modules/okservices/index.js +++ b/app/node_modules/okservices/index.js @@ -22,6 +22,7 @@ function OKImageService(options) { secret: options.s3.secret, bucket: options.s3.bucket, dirname: options.s3.dirname, + maxBytes: options.s3.maxbytes, headers: { 'x-amz-acl': 'public-read' } diff --git a/site/index.js b/site/index.js index d7989b9..8bb4b4d 100644 --- a/site/index.js +++ b/site/index.js @@ -54,6 +54,7 @@ var app = okcms.createApp({ secret: process.env.S3_SECRET, bucket: process.env.S3_BUCKET, dirname: "twohustlers", + maxbytes: 1024*1024*2, } }, diff --git a/site/templates/page.liquid b/site/templates/page.liquid index 7c295ff..63f71f2 100644 --- a/site/templates/page.liquid +++ b/site/templates/page.liquid @@ -1,7 +1,7 @@
- {{page.title}} {% if page.image %} + {{page.title}}
{{page.body | newline_to_br}} -- cgit v1.2.3-70-g09d2 From 96eccfa594fb2526e50d4f9adfa690ea345a29ff Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Sat, 19 Sep 2015 23:41:58 +0200 Subject: Update skipper dep --- app/node_modules/okservices/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/package.json b/app/node_modules/okservices/package.json index 556b9df..2c95325 100644 --- a/app/node_modules/okservices/package.json +++ b/app/node_modules/okservices/package.json @@ -9,7 +9,7 @@ "author": "OKFocus", "license": "None", "dependencies": { - "skipper": "git+ssh://git@github.com:nitzo/skipper#patch-1", + "skipper": "^0.5.7", "skipper-s3": "^0.5.5" } } -- cgit v1.2.3-70-g09d2 From eb2d4cd758eb06abfe9387a33f1e0f0898980d0d Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Sat, 12 Dec 2015 16:21:35 +0100 Subject: Implement Twitter service --- app/index.js | 15 +++++-- app/node_modules/okserver/index.js | 7 +++- app/node_modules/okservices/index.js | 43 ------------------- app/node_modules/okservices/oks3/index.js | 42 +++++++++++++++++++ app/node_modules/okservices/oks3/package.json | 15 +++++++ app/node_modules/okservices/oktwitter/Readme.md | 6 +++ app/node_modules/okservices/oktwitter/index.js | 48 ++++++++++++++++++++++ app/node_modules/okservices/oktwitter/package.json | 13 ++++++ app/node_modules/okservices/package.json | 7 +--- package.json | 2 +- 10 files changed, 143 insertions(+), 55 deletions(-) delete mode 100644 app/node_modules/okservices/index.js create mode 100644 app/node_modules/okservices/oks3/index.js create mode 100644 app/node_modules/okservices/oks3/package.json create mode 100644 app/node_modules/okservices/oktwitter/Readme.md create mode 100644 app/node_modules/okservices/oktwitter/index.js create mode 100644 app/node_modules/okservices/oktwitter/package.json (limited to 'app/node_modules/okservices') diff --git a/app/index.js b/app/index.js index 2507dd2..6a1c74f 100644 --- a/app/index.js +++ b/app/index.js @@ -13,7 +13,8 @@ var OKResource = require('okresource') var OKTemplate = require('oktemplate'); var OKServer = require('okserver'); var OKSchema = require('okschema'); -var OKImageService = require('okservices').OKImageService; +var OKS3Service = require('okservices/oks3'); +var OKTwitterService = require('okservices/oktwitter') require('dotenv').load(); @@ -92,12 +93,19 @@ function OKCMS(options) { // Create services if (serviceConfig.s3) { - var imageService = OKImageService({ + var s3Service = OKS3Service({ express: express, s3: serviceConfig.s3, }); } + if (serviceConfig.twitter) { + var twitterService = OKTwitterService({ + express: express, + credentials: serviceConfig.twitter, + }) + } + var server = this._server = new OKServer({ express: express, app: app, @@ -108,7 +116,8 @@ function OKCMS(options) { adminRoot: adminRoot, adminPath: adminPath, services: { - image: imageService + s3: s3Service, + twitter: twitterService, }, errorHandler: errorHandler }); diff --git a/app/node_modules/okserver/index.js b/app/node_modules/okserver/index.js index 6d0ed17..ee1b4fb 100644 --- a/app/node_modules/okserver/index.js +++ b/app/node_modules/okserver/index.js @@ -59,8 +59,11 @@ function OKServer(options) { // Application router app.use(router); // Add services - if (services.image) { - app.use('/_services/image', services.image.middleware()); + if (services.s3) { + app.use('/_services/image', services.s3.middleware()); + } + if (services.twitter) { + app.use('/_services/twitter', services.twitter.middleware()) } // Make sure this lady is last. Checks whether the desired // route has a trailing-slash counterpart and redirects there diff --git a/app/node_modules/okservices/index.js b/app/node_modules/okservices/index.js deleted file mode 100644 index fbbdbfd..0000000 --- a/app/node_modules/okservices/index.js +++ /dev/null @@ -1,43 +0,0 @@ -var skipper = require('skipper'); - -function OKImageService(options) { - if (!(this instanceof OKImageService)) return new OKImageService(options); - options = options || {}; - if (!options.express) - throw new Error('Express not provided to OKImageService'); - if (!options.s3) - throw new Error('S3 configuration not provided to OKImageService'); - var express = options.express; - - var router = express.Router(); - - router.use(skipper()); - - router.post('/', function(req, res) { - // req should have a method `file` on it which is - // provided by skipper. Use that to do AWS stuff - req.file('image').upload({ - adapter: require('skipper-s3'), - key: options.s3.key, - secret: options.s3.secret, - bucket: options.s3.bucket, - dirname: options.s3.dirname, - maxBytes: options.s3.maxbytes, - headers: { - 'x-amz-acl': 'public-read' - } - }, function (err, uploadedFiles) { - res.json(uploadedFiles); - }); - }); - - this._middleware = router; -} - -OKImageService.prototype.middleware = function() { - return this._middleware; -}; - -module.exports = { - OKImageService: OKImageService -}; diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js new file mode 100644 index 0000000..bd0915e --- /dev/null +++ b/app/node_modules/okservices/oks3/index.js @@ -0,0 +1,42 @@ +var skipper = require('skipper'); +var skipperS3 = require('skipper-s3') + +function OKS3(options) { + if (!(this instanceof OKS3)) return new OKS3(options); + options = options || {}; + if (!options.express) + throw new Error('Express not provided to OKS3'); + if (!options.s3) + throw new Error('S3 configuration not provided to OKS3'); + var express = options.express; + + var router = express.Router(); + + router.use(skipper()); + + router.post('/', function(req, res) { + // req should have a method `file` on it which is + // provided by skipper. Use that to do AWS stuff + req.file('image').upload({ + adapter: skipperS3, + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + dirname: options.s3.dirname, + maxBytes: options.s3.maxbytes, + headers: { + 'x-amz-acl': 'public-read' + } + }, function (err, uploadedFiles) { + res.json(uploadedFiles); + }); + }); + + this._middleware = router; +} + +OKS3.prototype.middleware = function() { + return this._middleware; +}; + +module.exports = OKS3 diff --git a/app/node_modules/okservices/oks3/package.json b/app/node_modules/okservices/oks3/package.json new file mode 100644 index 0000000..982fbfe --- /dev/null +++ b/app/node_modules/okservices/oks3/package.json @@ -0,0 +1,15 @@ +{ + "name": "oks3", + "version": "1.0.0", + "description": "s3 wassup", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "OKFocus", + "license": "None", + "dependencies": { + "skipper": "^0.5.7", + "skipper-s3": "^0.5.5" + } +} diff --git a/app/node_modules/okservices/oktwitter/Readme.md b/app/node_modules/okservices/oktwitter/Readme.md new file mode 100644 index 0000000..def73db --- /dev/null +++ b/app/node_modules/okservices/oktwitter/Readme.md @@ -0,0 +1,6 @@ +# oktwitter + +## Service to allow auth with Twitter API + +Requests to this service proxy to the twitter API, adding proper auth +credentials along the way diff --git a/app/node_modules/okservices/oktwitter/index.js b/app/node_modules/okservices/oktwitter/index.js new file mode 100644 index 0000000..ec4945d --- /dev/null +++ b/app/node_modules/okservices/oktwitter/index.js @@ -0,0 +1,48 @@ +var Twit = require('twit') + +/** + * Proxy to Twitter API adding auth creds + * TODO Technically can be abused by anyone right now. + * Should add some sort of same origin policy. + */ +function OKTwitter (options) { + if (!(this instanceof OKTwitter)) return new OKTwitter(options) + options = options || {} + if (!options.express) + throw new Error('Express not provided to OKTwitter'); + if (!options.credentials) + throw new Error('Twitter credentials not provided to OKTwitter'); + + var express = options.express + var router = express.Router() + var creds = options.credentials + var twitter = new Twit({ + consumer_key: creds.consumerKey, + consumer_secret: creds.consumerSecret, + access_token: creds.accessToken, + access_token_secret: creds.accessTokenSecret, + }) + + router.get('*', function (req, res) { + twitter.get(req.path.slice(1), req.query, function (err, data) { + if (err) { + res.status(err.statusCode) + res.send(err.twitterReply) + } else { + res.json(data) + } + }) + }) + + router.post('*', function (req, res) { + throw new Error('Twitter POST requests not implemented') + }) + + this._router = router +} + +OKTwitter.prototype.middleware = function () { + return this._router +} + +module.exports = OKTwitter diff --git a/app/node_modules/okservices/oktwitter/package.json b/app/node_modules/okservices/oktwitter/package.json new file mode 100644 index 0000000..ddee2f9 --- /dev/null +++ b/app/node_modules/okservices/oktwitter/package.json @@ -0,0 +1,13 @@ +{ + "name": "oktwitter", + "version": "1.0.0", + "description": "Allows auth to Twitter API", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "OKFocus", + "dependencies": { + "twit": "^2.1.1" + } +} diff --git a/app/node_modules/okservices/package.json b/app/node_modules/okservices/package.json index 2c95325..2669a49 100644 --- a/app/node_modules/okservices/package.json +++ b/app/node_modules/okservices/package.json @@ -6,10 +6,5 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "author": "OKFocus", - "license": "None", - "dependencies": { - "skipper": "^0.5.7", - "skipper-s3": "^0.5.5" - } + "author": "OKFocus" } diff --git a/package.json b/package.json index f91a986..8587ab7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okcms", - "version": "0.1.12", + "version": "0.1.13", "description": "great", "main": "app/index.js", "scripts": { -- cgit v1.2.3-70-g09d2 From 5a3eead8e5819ff2f9bff121f92b9aef55a79d08 Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Sat, 12 Dec 2015 18:48:26 +0100 Subject: Fix bug in shameful install flow --- app/node_modules/okservices/install.sh | 1 + app/node_modules/okservices/package.json | 1 + install.sh | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 app/node_modules/okservices/install.sh (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/install.sh b/app/node_modules/okservices/install.sh new file mode 100755 index 0000000..5ffd898 --- /dev/null +++ b/app/node_modules/okservices/install.sh @@ -0,0 +1 @@ +for i in ok* ; do cd $i ; npm install; cd .. ; done ; cd ../.. diff --git a/app/node_modules/okservices/package.json b/app/node_modules/okservices/package.json index 2669a49..6231499 100644 --- a/app/node_modules/okservices/package.json +++ b/app/node_modules/okservices/package.json @@ -4,6 +4,7 @@ "description": "providing very good services", "main": "index.js", "scripts": { + "postinstall": "./install.sh", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "OKFocus" diff --git a/install.sh b/install.sh index 80ef53f..41e51dc 100755 --- a/install.sh +++ b/install.sh @@ -1 +1 @@ -cd app/node_modules ; for i in * ; do cd $i ; npm install; cd .. ; done ; cd ../.. +cd app/node_modules ; for i in ok* ; do cd $i ; npm install; cd .. ; done ; cd ../.. -- cgit v1.2.3-70-g09d2 From d525344670731be9b99e5b7c4e9d7afacf08db8b Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Mon, 14 Dec 2015 21:19:14 +0100 Subject: Finally smash S3 upload crash bug --- app/node_modules/okservices/oks3/index.js | 35 +++++++++++++++++---------- app/node_modules/okservices/oks3/package.json | 4 +-- package.json | 2 +- 3 files changed, 25 insertions(+), 16 deletions(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js index bd0915e..d556c20 100644 --- a/app/node_modules/okservices/oks3/index.js +++ b/app/node_modules/okservices/oks3/index.js @@ -1,6 +1,12 @@ var skipper = require('skipper'); var skipperS3 = require('skipper-s3') +// Hack to prevent this god-forsaken module from crashing our shit +var d = require('domain').create() +d.on('error', function (err) { + console.error('Stupid error in S3 upload. Image upload probably prematurely canceled') +}) + function OKS3(options) { if (!(this instanceof OKS3)) return new OKS3(options); options = options || {}; @@ -17,19 +23,22 @@ function OKS3(options) { router.post('/', function(req, res) { // req should have a method `file` on it which is // provided by skipper. Use that to do AWS stuff - req.file('image').upload({ - adapter: skipperS3, - key: options.s3.key, - secret: options.s3.secret, - bucket: options.s3.bucket, - dirname: options.s3.dirname, - maxBytes: options.s3.maxbytes, - headers: { - 'x-amz-acl': 'public-read' - } - }, function (err, uploadedFiles) { - res.json(uploadedFiles); - }); + d.run(function () { + req.file('image').upload({ + adapter: skipperS3, + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + dirname: options.s3.dirname, + maxBytes: options.s3.maxbytes, + headers: { + 'x-amz-acl': 'public-read' + } + }, function (err, uploadedFiles) { + if (err) res.status(500).send(err) + res.json(uploadedFiles); + }); + }) }); this._middleware = router; diff --git a/app/node_modules/okservices/oks3/package.json b/app/node_modules/okservices/oks3/package.json index 982fbfe..1d72a26 100644 --- a/app/node_modules/okservices/oks3/package.json +++ b/app/node_modules/okservices/oks3/package.json @@ -9,7 +9,7 @@ "author": "OKFocus", "license": "None", "dependencies": { - "skipper": "^0.5.7", - "skipper-s3": "^0.5.5" + "skipper": "^0.5.8", + "skipper-s3": "^0.5.6" } } diff --git a/package.json b/package.json index 4fdfce2..b7f1105 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okcms", - "version": "0.1.15", + "version": "0.1.16", "description": "great", "main": "app/index.js", "scripts": { -- cgit v1.2.3-70-g09d2 From 56580705e3a62eaf1c498c1c0456fc33fe3b2f76 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Tue, 5 Apr 2016 14:05:35 -0400 Subject: broaden media support --- app/node_modules/okserver/index.js | 2 +- app/node_modules/okservices/oks3/index.js | 54 ++++++++++++++++++-- examples/db.json | 29 ++++++++++- examples/index.js | 5 ++ package.json | 2 +- themes/okadmin/public/css/main.css | 3 ++ themes/okadmin/public/js/app.js | 18 ++++++- themes/okadmin/public/js/parser.js | 31 +++++++++-- themes/okadmin/public/js/upload.js | 61 ++++++++++++++++------ themes/okadmin/templates/partials/inputs.liquid | 68 ++++++++++++++++++------- 10 files changed, 226 insertions(+), 47 deletions(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okserver/index.js b/app/node_modules/okserver/index.js index ee1b4fb..3428565 100644 --- a/app/node_modules/okserver/index.js +++ b/app/node_modules/okserver/index.js @@ -60,7 +60,7 @@ function OKServer(options) { app.use(router); // Add services if (services.s3) { - app.use('/_services/image', services.s3.middleware()); + app.use('/_services/s3', services.s3.middleware()); } if (services.twitter) { app.use('/_services/twitter', services.twitter.middleware()) diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js index d556c20..dc0ca19 100644 --- a/app/node_modules/okservices/oks3/index.js +++ b/app/node_modules/okservices/oks3/index.js @@ -4,7 +4,7 @@ var skipperS3 = require('skipper-s3') // Hack to prevent this god-forsaken module from crashing our shit var d = require('domain').create() d.on('error', function (err) { - console.error('Stupid error in S3 upload. Image upload probably prematurely canceled') + console.error('Stupid error in S3 upload. Upload probably prematurely canceled') }) function OKS3(options) { @@ -20,9 +20,9 @@ function OKS3(options) { router.use(skipper()); - router.post('/', function(req, res) { - // req should have a method `file` on it which is - // provided by skipper. Use that to do AWS stuff + // req should have a method `file` on it which is + // provided by skipper. Use that to do AWS stuff + router.post('/image', function(req, res) { d.run(function () { req.file('image').upload({ adapter: skipperS3, @@ -38,7 +38,51 @@ function OKS3(options) { if (err) res.status(500).send(err) res.json(uploadedFiles); }); - }) + }); + }); + + router.post('/audio', function(req, res) { + d.run(function () { + if (! options.s3.allowAudioUploads) { + return res.status(500).json({ error: "audio uploading not permitted" }) + } + req.file('audio').upload({ + adapter: skipperS3, + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + dirname: options.s3.dirname, + maxBytes: options.s3.maxbytesAudio, + headers: { + 'x-amz-acl': 'public-read' + } + }, function (err, uploadedFiles) { + if (err) res.status(500).send(err) + res.json(uploadedFiles); + }); + }); + }); + + router.post('/video', function(req, res) { + d.run(function () { + if (! options.s3.allowVideoUploads) { + return res.status(500).json({ error: "video uploading not permitted" }) + } + req.file('video').upload({ + adapter: skipperS3, + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + dirname: options.s3.dirname, + maxBytes: options.s3.maxbytesVideo, + headers: { + 'x-amz-acl': 'public-read' + } + }, function (err, uploadedFiles) { + if (err) res.status(500).send(err) + res.json(uploadedFiles); + }); + }); }); this._middleware = router; diff --git a/examples/db.json b/examples/db.json index 1d045c3..3650355 100644 --- a/examples/db.json +++ b/examples/db.json @@ -174,7 +174,34 @@ "title": "Green", "__index": 1, "dateCreated": "Tue, 05 Apr 2016 15:17:57 GMT", - "media": [] + "media": [ + { + "type": "video", + "token": "https://ltho.s3.amazonaws.com/ee12b137-1c8a-400a-87e3-89cbee7b4da6.mp4", + "uri": "", + "width": "400", + "height": "400", + "title": "ee12b137-1c8a-400a-87e3-89cbee7b4da6.mp4", + "thumb": "http://okfocus.s3.amazonaws.com/misc/okcms/video.png" + }, + { + "type": "youtube", + "token": "y_35kXCQxN4", + "uri": "", + "width": "640", + "height": "360", + "title": "dëf lëöpär¨d¨¨¨¨<>~!@~#!:I!@", + "thumb": "http://i.ytimg.com/vi/y_35kXCQxN4/hqdefault.jpg" + }, + { + "type": "audio", + "token": "http://asdf.us/clouds35.mp3", + "uri": "", + "duration": "225.645792", + "title": "clouds35.mp3", + "thumb": "http://okfocus.s3.amazonaws.com/misc/okcms/video.png" + } + ] } ] } \ No newline at end of file diff --git a/examples/index.js b/examples/index.js index 81d9241..e9de0a3 100644 --- a/examples/index.js +++ b/examples/index.js @@ -40,6 +40,11 @@ var app = okcms.createApp({ key: process.env.S3_KEY, secret: process.env.S3_SECRET, bucket: process.env.S3_BUCKET, + allowVideoUploads: true, + allowAudioUploads: true, + maxsize: 200, + maxsizeVideo: 150000000, + maxsizeAudio: 150000000, } }, diff --git a/package.json b/package.json index c95a2bc..c3a7280 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okcms", - "version": "0.1.24", + "version": "0.1.27", "description": "great", "main": "app/index.js", "scripts": { diff --git a/themes/okadmin/public/css/main.css b/themes/okadmin/public/css/main.css index 2f2d376..15b8781 100644 --- a/themes/okadmin/public/css/main.css +++ b/themes/okadmin/public/css/main.css @@ -303,6 +303,7 @@ button, input[type=submit] { width: 15em; height: 6em; } +.main.resource form .audio-element input[type=text], .main.resource form .video-element input[type=text] { width: 15em; } @@ -353,10 +354,12 @@ button, input[type=submit] { margin: 0; padding: 0; cursor: pointer; } +.audio-element:hover .remove, .video-element:hover .remove, .image-element:hover .remove { display: block; } +.audio-element .remove:hover, .video-element .remove:hover, .image-element .remove:hover { color: red; diff --git a/themes/okadmin/public/js/app.js b/themes/okadmin/public/js/app.js index e79f704..a12f517 100644 --- a/themes/okadmin/public/js/app.js +++ b/themes/okadmin/public/js/app.js @@ -5,7 +5,8 @@ var OKAdmin = function(){ var parent = this var uploader = new OKUpload () uploader.bind( this ) - uploader.add = function(url){ + uploader.add = function(media){ + var url = media.url var imageTemplate = $(".image-template", parent).html() var $el = $(imageTemplate) $el.find(".uri").val(url) @@ -46,7 +47,7 @@ var OKAdmin = function(){ $el.find("img").attr("src", url) $("ol", parent).prepend($el) } - uploader.addVideo = function(media){ + uploader.addMedia = function(media){ switch (media.type) { case 'youtube': case 'vimeo': @@ -64,6 +65,19 @@ var OKAdmin = function(){ $el.find("img").attr("src", media.thumbnail ) $("ol", parent).prepend($el) break + case 'audio': + var audioTemplate = $(".audio-template", parent).html() + var $el = $(audioTemplate) + $el.addClass("loaded") + $el.find(".audio-type").val( media.type ) + $el.find(".audio-token").val( media.token ) + $el.find(".audio-uri").val( media.uri ) + $el.find(".audio-title").val( media.title ) + $el.find(".audio-thumb").val( media.thumbnail ) + $el.find(".audio-duration").val( media.duration ) + $el.find("img").attr("src", media.thumbnail ) + $("ol", parent).prepend($el) + break case 'link': var linkTemplate = $(".link-template", parent).html() var $el = $(linkTemplate) diff --git a/themes/okadmin/public/js/parser.js b/themes/okadmin/public/js/parser.js index b4a087d..4ab9a6c 100644 --- a/themes/okadmin/public/js/parser.js +++ b/themes/okadmin/public/js/parser.js @@ -52,6 +52,31 @@ var Parser = { tag: function (media) { return '
{% elsif type == 'image' %}
@@ -47,8 +47,8 @@
- - {{spec.value.caption}} + + {{spec.value.caption | escape}}
@@ -78,7 +78,7 @@ {% elsif type == 'tag-list' %}
@@ -90,13 +90,13 @@
@@ -142,8 +142,8 @@
- - + +
@@ -177,6 +177,23 @@ + + -- cgit v1.2.3-70-g09d2 From 180cf3eaa829fd04f759488d76641c4656caa245 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 11 Apr 2016 14:20:33 -0400 Subject: rewrite file upload code to use knox directly --- app/node_modules/okserver/index.js | 2 + app/node_modules/okservices/oks3/index.js | 136 +++++++++++++++----------- app/node_modules/okservices/oks3/package.json | 5 +- app/node_modules/okservices/oks3/upload.js | 80 +++++++++++++++ examples/index.js | 7 +- themes/okadmin/public/js/upload.js | 2 +- 6 files changed, 166 insertions(+), 66 deletions(-) create mode 100644 app/node_modules/okservices/oks3/upload.js (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okserver/index.js b/app/node_modules/okserver/index.js index 3428565..302911d 100644 --- a/app/node_modules/okserver/index.js +++ b/app/node_modules/okserver/index.js @@ -52,6 +52,8 @@ function OKServer(options) { * other middleware. */ + // Disable silly express header + app.disable('x-powered-by') // Serve user static files app.use(express.static(root)); // Serve admin interface static files diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js index 34c5840..c636308 100644 --- a/app/node_modules/okservices/oks3/index.js +++ b/app/node_modules/okservices/oks3/index.js @@ -1,5 +1,5 @@ -var skipper = require('skipper'); -var skipperS3 = require('skipper-s3') +var upload = require("./upload") +var multer = require('multer') // Hack to prevent this god-forsaken module from crashing our shit var d = require('domain').create() @@ -20,7 +20,6 @@ function OKS3(options) { if (!options.s3.audio) options.s3.audio = {} if (!options.s3.video) options.s3.video = {} -/* // TODO: maxBytes property doesn't work - if you upload a large file, // it will just hang until you reload the browser, and then CRASH. @@ -34,85 +33,104 @@ function OKS3(options) { if (! ('maxbytes' in options.s3.audio)) options.s3.audio.maxbytes = options.s3.maxbytes } -*/ - if (options.s3.image.preserveFilename) - options.s3.image.preserveFilename = preserveFilename - if (options.s3.video.preserveFilename) - options.s3.video.preserveFilename = preserveFilename - if (options.s3.audio.preserveFilename) - options.s3.audio.preserveFilename = preserveFilename + if (typeof options.s3.image.allowed !== "boolean") + options.s3.image.allowed = true + if (typeof options.s3.video.allowed !== "boolean") + options.s3.video.allowed = false + if (typeof options.s3.audio.allowed !== "boolean") + options.s3.audio.allowed = false + + upload.init({ + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + }) var express = options.express; var router = express.Router(); - router.use(skipper()); + var mult = multer() - // req should have a method `file` on it which is - // provided by skipper. Use that to do AWS stuff - router.post('/image', function(req, res) { + router.post('/image', mult.single('image'), function(req, res) { d.run(function () { - var skip = req.file('image').upload({ - adapter: skipperS3, - key: options.s3.key, - secret: options.s3.secret, - bucket: options.s3.bucket, + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Image uploading not permitted" }) + } + + upload.put({ + file: req.file, + preserveFilename: options.s3.image.preserveFilename, dirname: options.s3.dirname, - // maxBytes: options.s3.image.maxbytes, - saveAs: options.s3.image.preserveFilename, - headers: { - 'x-amz-acl': 'public-read' + types: { + 'image/gif': 'gif', + 'image/jpeg': 'jpg', + 'image/jpg': 'jpg', + 'image/png': 'png', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) } - }, function (err, uploadedFiles) { - if (err) return res.status(500).send(err) - res.json(uploadedFiles); - }); + }) + }); }); - router.post('/audio', function(req, res) { + router.post('/audio', mult.single('audio'), function(req, res) { d.run(function () { - if (! options.s3.allowAudioUploads) { - return res.status(500).json({ error: "audio uploading not permitted" }) + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Audio uploading not permitted" }) } - req.file('audio').upload({ - adapter: skipperS3, - key: options.s3.key, - secret: options.s3.secret, - bucket: options.s3.bucket, + + upload.put({ + file: req.file, + preserveFilename: options.s3.audio.preserveFilename, dirname: options.s3.dirname, - // maxBytes: options.s3.audio.maxbytes, - saveAs: options.s3.audio.preserveFilename, - headers: { - 'x-amz-acl': 'public-read' + types: { + 'audio/mp3': 'mp3', + 'audio/mpeg': 'mp3', + 'audio/wav': 'wav', + 'audio/flac': 'flac', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) } - }, function (err, uploadedFiles) { - if (err) res.status(500).send(err) - res.json(uploadedFiles); - }); + }) + }); }); - router.post('/video', function(req, res) { + router.post('/video', mult.single('video'), function(req, res) { d.run(function () { - if (! options.s3.allowVideoUploads) { - return res.status(500).json({ error: "video uploading not permitted" }) + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Video uploading not permitted" }) } - req.file('video').upload({ - adapter: skipperS3, - key: options.s3.key, - secret: options.s3.secret, - bucket: options.s3.bucket, + + upload.put({ + file: req.file, + preserveFilename: options.s3.video.preserveFilename, dirname: options.s3.dirname, - // maxBytes: options.s3.video.maxbytes, - saveAs: options.s3.video.preserveFilename, - headers: { - 'x-amz-acl': 'public-read' + types: { + 'video/mp4': 'mp4', + 'video/webm': 'webm', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) } - }, function (err, uploadedFiles) { - if (err) res.status(500).send(err) - res.json(uploadedFiles); - }); + }) + }); }); diff --git a/app/node_modules/okservices/oks3/package.json b/app/node_modules/okservices/oks3/package.json index 19a2d2a..35bb4ce 100644 --- a/app/node_modules/okservices/oks3/package.json +++ b/app/node_modules/okservices/oks3/package.json @@ -9,7 +9,8 @@ "author": "OKFocus", "license": "None", "dependencies": { - "skipper": "^0.5.9", - "skipper-s3": "^0.5.6" + "knox": "^0.9.2", + "multer": "^1.1.0", + "node-uuid": "^1.4.7", } } diff --git a/app/node_modules/okservices/oks3/upload.js b/app/node_modules/okservices/oks3/upload.js new file mode 100644 index 0000000..6b16d61 --- /dev/null +++ b/app/node_modules/okservices/oks3/upload.js @@ -0,0 +1,80 @@ + +var knox = require('knox') +var moment = require('moment') +var uuid = require('node-uuid') + +var s3 + +var acceptableuploadTypes = { + 'image/gif': 'gif', + 'image/jpeg': 'jpg', + 'image/jpg': 'jpg', + 'image/png': 'png', +} + +module.exports = {} + +module.exports.init = function (opt){ + s3 = knox.createClient({ + key: opt.key, + secret: opt.secret, + bucket: opt.bucket, + }) +} + +module.exports.put = function (opt) { + var filename + var err + var now = new Date() + + var file = opt.file + + var types = opt.types || acceptableuploadTypes + var extension = types[file.mimetype] + + if (opt.preserveFilename) { + filename = file.originalname + } + else { + filename = uuid.v1() + "." + extension; + } + + var remote_path = "/" + opt.dirname + "/" + filename + + if (! extension) { + err = "Unacceptable filetype." + } + else if (opt.maxSize && file.size > opt.maxSize) { + err = "File too large. Uploads can be a maximum of " + opt.maxSize + " bytes." + } + + if (err) { + console.error(">>>", err) + opt.unacceptable && opt.unacceptable(err) + return + } + + opt.acceptable && opt.acceptable(err) + + // console.log("upload >", remote_path) + s3.putBuffer(file.buffer, remote_path, { + 'Content-Length': file.size, + 'Content-Type': file.mimetype, + 'x-amz-acl': 'public-read' + }, function(err, s3res) { + if (err || s3res.statusCode !== 200) { + console.error(err); + if (s3res && s3res.resume) { + s3res.resume() + } + return; + } + + var file_url = s3res.url || s3res.req.url + + opt.success && opt.success(file_url) + }).on('error', function(err, s3res){ + console.error(err) + s3res && s3res.resume && s3res.resume() + }) +} diff --git a/examples/index.js b/examples/index.js index fe37954..31ae8d2 100644 --- a/examples/index.js +++ b/examples/index.js @@ -42,10 +42,9 @@ var app = okcms.createApp({ secret: process.env.S3_SECRET, bucket: process.env.S3_BUCKET, dirname: "okcms-example", - // TODO: maxbytes stuff isn't working, need to change underlying module - image: { preserveFilename: false, maxbytes: 20000 }, - video: { preserveFilename: true, maxbytes: 0 }, - audio: { preserveFilename: true, maxbytes: 150000000 }, + image: { allowed: true, preserveFilename: false, maxbytes: 2*1024*1024 }, + video: { allowed: true, preserveFilename: true, maxbytes: 200*1024*1024 }, + audio: { allowed: true, preserveFilename: true, maxbytes: 100*1024*1024 }, } }, diff --git a/themes/okadmin/public/js/upload.js b/themes/okadmin/public/js/upload.js index 44a34b5..da23b1b 100644 --- a/themes/okadmin/public/js/upload.js +++ b/themes/okadmin/public/js/upload.js @@ -167,7 +167,7 @@ OKUpload.prototype.success = function(data){ console.log(data.error) return } - var url = data[0].extra.Location.replace(/%2F/, '\/') + var url = data.url console.log(url) this.parse(url) } -- cgit v1.2.3-70-g09d2 From 3c33b364b4b3a9fef64a005713979f02fe04d4b9 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 11 Apr 2016 14:49:06 -0400 Subject: draconian json parsing --- app/node_modules/okservices/oks3/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/oks3/package.json b/app/node_modules/okservices/oks3/package.json index 35bb4ce..61da414 100644 --- a/app/node_modules/okservices/oks3/package.json +++ b/app/node_modules/okservices/oks3/package.json @@ -11,6 +11,6 @@ "dependencies": { "knox": "^0.9.2", "multer": "^1.1.0", - "node-uuid": "^1.4.7", + "node-uuid": "^1.4.7" } } diff --git a/package.json b/package.json index 2d5df49..2a927d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okcms", - "version": "0.1.27", + "version": "0.1.30", "description": "great", "main": "app/index.js", "scripts": { -- cgit v1.2.3-70-g09d2 From 099c4091f1e98148e5ac05d1fc30cfd8333707bb Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 11 Apr 2016 14:58:07 -0400 Subject: typo --- app/node_modules/okservices/oks3/upload.js | 1 - 1 file changed, 1 deletion(-) (limited to 'app/node_modules/okservices') diff --git a/app/node_modules/okservices/oks3/upload.js b/app/node_modules/okservices/oks3/upload.js index 6b16d61..517d5f7 100644 --- a/app/node_modules/okservices/oks3/upload.js +++ b/app/node_modules/okservices/oks3/upload.js @@ -1,6 +1,5 @@ var knox = require('knox') -var moment = require('moment') var uuid = require('node-uuid') var s3 -- cgit v1.2.3-70-g09d2 From 5922279561c1998a3e158c26f951348f4c031928 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 14 Apr 2016 14:17:00 -0400 Subject: support adding custom services per-project --- app/index.js | 42 ++++++++++++++++++------------- app/node_modules/okserver/index.js | 11 +++----- app/node_modules/okservices/oks3/index.js | 3 --- package.json | 5 ++-- themes/okadmin/public/js/upload.js | 3 --- 5 files changed, 32 insertions(+), 32 deletions(-) (limited to 'app/node_modules/okservices') diff --git a/app/index.js b/app/index.js index 1a8f97e..7fd88f4 100644 --- a/app/index.js +++ b/app/index.js @@ -94,19 +94,30 @@ function OKCMS(options) { errorHandler); // Create services - if (serviceConfig.s3) { - var s3Service = OKS3Service({ - express: express, - s3: serviceConfig.s3, - }); - } - - if (serviceConfig.twitter) { - var twitterService = OKTwitterService({ - express: express, - credentials: serviceConfig.twitter, - }) - } + var services = {} + Object.keys(serviceConfig).forEach(function(key){ + var config = serviceConfig[key] + switch (key) { + case 's3': + services.s3 = OKS3Service({ + express: express, + s3: config, + }); + break + case 'twitter': + services.twitter = OKTwitterService({ + express: express, + credentials: config, + }); + break + default: + services[key] = config.lib({ + express: express, + config: config, + }); + break + } + }); var server = this._server = new OKServer({ express: express, @@ -117,10 +128,7 @@ function OKCMS(options) { root: root, adminRoot: adminRoot, adminPath: adminPath, - services: { - s3: s3Service, - twitter: twitterService, - }, + services: services, errorHandler: errorHandler }); } diff --git a/app/node_modules/okserver/index.js b/app/node_modules/okserver/index.js index 302911d..a89676f 100644 --- a/app/node_modules/okserver/index.js +++ b/app/node_modules/okserver/index.js @@ -52,7 +52,7 @@ function OKServer(options) { * other middleware. */ - // Disable silly express header + // Disable x-powered-by express header app.disable('x-powered-by') // Serve user static files app.use(express.static(root)); @@ -61,12 +61,9 @@ function OKServer(options) { // Application router app.use(router); // Add services - if (services.s3) { - app.use('/_services/s3', services.s3.middleware()); - } - if (services.twitter) { - app.use('/_services/twitter', services.twitter.middleware()) - } + Object.keys(services).forEach(function(key){ + app.use('/_services/' + key, services[key].middleware()); + }) // Make sure this lady is last. Checks whether the desired // route has a trailing-slash counterpart and redirects there app.use(slash()); diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js index c636308..cc40b71 100644 --- a/app/node_modules/okservices/oks3/index.js +++ b/app/node_modules/okservices/oks3/index.js @@ -20,9 +20,6 @@ function OKS3(options) { if (!options.s3.audio) options.s3.audio = {} if (!options.s3.video) options.s3.video = {} - // TODO: maxBytes property doesn't work - if you upload a large file, - // it will just hang until you reload the browser, and then CRASH. - // Make sure maxbytes property is there - it can be a number, // or zero/undefined (for no maximum upload size) if (options.s3.maxbytes) { diff --git a/package.json b/package.json index 2a927d5..bd5719b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okcms", - "version": "0.1.30", + "version": "0.1.31", "description": "great", "main": "app/index.js", "scripts": { @@ -13,7 +13,8 @@ "dotenv": "^1.1.0", "express": "^4.12.3", "object-assign": "^2.0.0", - "q": "^1.2.0" + "q": "^1.2.0", + "request": "^2.71.0" }, "devDependencies": { "grunt": "^0.4.5", diff --git a/themes/okadmin/public/js/upload.js b/themes/okadmin/public/js/upload.js index da23b1b..6ff7ac9 100644 --- a/themes/okadmin/public/js/upload.js +++ b/themes/okadmin/public/js/upload.js @@ -177,9 +177,6 @@ OKUpload.prototype.add = function(media){ OKUpload.prototype.addMedia = function(media){ console.log(media) } -OKUpload.prototype.addAudio = function(media){ - console.log(media) -} OKUpload.prototype.error = function(error){ throw error } -- cgit v1.2.3-70-g09d2 From c98560cca095ef27b909ac47baf843362bffb28d Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 14 Apr 2016 20:32:08 -0400 Subject: OKWebhook module for receiving pushes from git --- app/index.js | 7 ++ app/node_modules/okservices/okwebhook/index.js | 83 ++++++++++++++++++++++ app/node_modules/okservices/okwebhook/package.json | 11 +++ examples/index.js | 11 ++- examples/lib/okexample/index.js | 5 +- 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 app/node_modules/okservices/okwebhook/index.js create mode 100644 app/node_modules/okservices/okwebhook/package.json (limited to 'app/node_modules/okservices') diff --git a/app/index.js b/app/index.js index 8c3abb9..48e713a 100644 --- a/app/index.js +++ b/app/index.js @@ -15,6 +15,7 @@ var OKServer = require('okserver'); var OKSchema = require('okschema'); var OKS3Service = require('okservices/oks3'); var OKTwitterService = require('okservices/oktwitter') +var OKWebhookService = require('okservices/okwebhook') require('dotenv').load(); @@ -110,6 +111,12 @@ function OKCMS(options) { credentials: config, }); break + case 'webhook': + services.webhook = OKWebhookService({ + express: express, + config: config, + }); + break default: services[key] = config.lib({ db: resourceCache, diff --git a/app/node_modules/okservices/okwebhook/index.js b/app/node_modules/okservices/okwebhook/index.js new file mode 100644 index 0000000..d04e662 --- /dev/null +++ b/app/node_modules/okservices/okwebhook/index.js @@ -0,0 +1,83 @@ + +/** + * Service which will listen for a Github webhook, fired on push. + * This service can be used to rebuild / restart the app automatically + * when new code is pushed. + */ + +var crypto = require('crypto') +var exec = require('child_process').exec +var path = require('path') + +function OKWebhook (options) { + if (!(this instanceof OKWebhook)) return new OKWebhook(options) + options = options || {} + if (!options.express) + throw new Error('Express not provided to OKWebhook'); + if (!options.config) + throw new Error('Configuration not provided to OKWebhook'); + if (options.config.active && !options.config.secret) + throw new Error('Github secret not provided to OKWebhook'); + if (options.config.active && !options.config.command) + throw new Error('Build command not provided to OKWebhook'); + + var express = options.express + var router = express.Router() + var config = options.config + + var secret = config.secret + var command = config.command + + router.get('/', function (req, res) { + res.send('GET not supported') + }) + + router.post('/', getBody, function (req, res) { + if (!config.active) + return + console.log("OKWebhook received push") + var event = req.headers['x-github-event'] + if (event !== "push") { + return res.sendStatus(500) + } + var sig = req.headers['x-hub-signature'].split('=')[1] + var text = req.rawBody + var hash = crypto.createHmac('sha1', secret).update(text).digest('hex') + if (hash !== sig) { + return res.sendStatus(500) + } + res.sendStatus(200) + var cwd = path.dirname(command) + exec(command, { cwd: cwd }, function(err, stdout, stderr){ + // may not fire if process was restarted.. + console.log(process.env) + console.log(stdout) + }) + }) + + function getBody (req, res, next) { + req.rawBody = '' + // req.setEncoding('utf8') + + req.on('data', function(chunk) { + req.rawBody += chunk + }) + + req.on('end', function() { + try { + req.body = JSON.parse(req.rawBody) + } catch (e) { + return res.sendStatus(500) + } + next() + }) + } + + this._router = router +} + +OKWebhook.prototype.middleware = function () { + return this._router +} + +module.exports = OKWebhook diff --git a/app/node_modules/okservices/okwebhook/package.json b/app/node_modules/okservices/okwebhook/package.json new file mode 100644 index 0000000..0436f01 --- /dev/null +++ b/app/node_modules/okservices/okwebhook/package.json @@ -0,0 +1,11 @@ +{ + "name": "okwebhook", + "version": "1.0.0", + "description": "webhook to receive pushes from github", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "okfocus ", + "license": "LNT" +} diff --git a/examples/index.js b/examples/index.js index 3bbed28..efbfc38 100644 --- a/examples/index.js +++ b/examples/index.js @@ -1,10 +1,13 @@ var okcms = require('..'); +var isProduction = process.env.OK_PRODUCTION === 'true' + var app = okcms.createApp({ root: 'public', - debug: true, + debug: !isProduction, + production: isProduction, schemas: { page: { @@ -47,6 +50,12 @@ var app = okcms.createApp({ audio: { allowed: true, preserveFilename: true, maxbytes: 100*1024*1024 }, }, + webhook: { + active: false, + secret: 'test', + command: '/path/to/build.sh', + }, + example: { lib: require("./lib/okexample"), stuff: "things", diff --git a/examples/lib/okexample/index.js b/examples/lib/okexample/index.js index b614697..04c5984 100644 --- a/examples/lib/okexample/index.js +++ b/examples/lib/okexample/index.js @@ -22,13 +22,14 @@ function OKExample (options) { if (!(this instanceof OKExample)) return new OKExample(options) options = options || {} if (!options.express) - throw new Error('Express not provided to OKDumpfm'); + throw new Error('Express not provided to OKExample'); if (!options.config) - throw new Error('Configuration not provided to OKDumpfm'); + throw new Error('Configuration not provided to OKExample'); var express = options.express var router = express.Router() var config = options.config + var db = options.db router.get('*', function (req, res) { res.send(config.stuff) -- cgit v1.2.3-70-g09d2