From f40e2286faef696c25a81c04635aaf737606a39a Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 16 Feb 2017 02:17:03 +0100 Subject: lib --- lib/okpush/.gitignore | 3 + lib/okpush/apn.js | 57 +++ lib/okpush/db.js | 132 +++++++ lib/okpush/index.js | 120 +++++++ lib/okpush/package.json | 21 ++ lib/okpush/public/push.js | 31 ++ lib/okpush/templates/index.liquid | 74 ++++ lib/okpush/templates/partials/flash.liquid | 20 ++ lib/okpush/templates/partials/head.liquid | 13 + lib/okpush/templates/partials/inputs.liquid | 395 +++++++++++++++++++++ lib/okpush/templates/partials/tail.liquid | 14 + .../CertificateSigningRequest.certSigningRequest | 16 + lib/okpush/test_certs/Certificates.p12 | Bin 0 -> 3209 bytes lib/okpush/test_certs/aps_development.cer | Bin 0 -> 1421 bytes lib/okpush/test_certs/overlayer_dev_cert.pem | 32 ++ lib/okpush/test_certs/overlayer_dev_key.pem | 68 ++++ 16 files changed, 996 insertions(+) create mode 100644 lib/okpush/.gitignore create mode 100644 lib/okpush/apn.js create mode 100644 lib/okpush/db.js create mode 100644 lib/okpush/index.js create mode 100644 lib/okpush/package.json create mode 100644 lib/okpush/public/push.js create mode 100644 lib/okpush/templates/index.liquid create mode 100644 lib/okpush/templates/partials/flash.liquid create mode 100644 lib/okpush/templates/partials/head.liquid create mode 100644 lib/okpush/templates/partials/inputs.liquid create mode 100644 lib/okpush/templates/partials/tail.liquid create mode 100644 lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest create mode 100644 lib/okpush/test_certs/Certificates.p12 create mode 100644 lib/okpush/test_certs/aps_development.cer create mode 100644 lib/okpush/test_certs/overlayer_dev_cert.pem create mode 100644 lib/okpush/test_certs/overlayer_dev_key.pem (limited to 'lib') diff --git a/lib/okpush/.gitignore b/lib/okpush/.gitignore new file mode 100644 index 00000000..e314c5fe --- /dev/null +++ b/lib/okpush/.gitignore @@ -0,0 +1,3 @@ + +node_modules + diff --git a/lib/okpush/apn.js b/lib/okpush/apn.js new file mode 100644 index 00000000..b6909f6f --- /dev/null +++ b/lib/okpush/apn.js @@ -0,0 +1,57 @@ + +var apn = require('apn') +var db = require('./db') +var apnProvider, apnFeedback + +function init (config) { + config.apn.connection.key = config.apn.key + config.apn.connection.cert = config.apn.cert + apnProvider = new apn.Provider(config.apn.connection) +} + +function push (note) { + db.getAllDevices(function(err, tokens){ + if (err) { + console.error("Error fetching devices:", err) + return + } + connection.send(note, tokens).then( function (response) { + // response.sent.forEach( function (token) { + // notificationSent(user, token) + // }) + response.failed.forEach( function (failure) { + if (failure.error) { + // A transport-level error occurred (e.g. network problem) + // notificationError(user, token, failure.error); + } else if (failure.status == 410) { + // `failure.status` is the HTTP status code + // `failure.response` is the JSON payload + // notificationFailed(token, failure.status, failure.response); + db.removeDevice(token) + } + }) + }) + }) +} + +function buildPayload (options, bundleId) { + var note = new apn.Notification() + note.topic = bundleId + if (options.expiry) + note.expiry = Math.floor(Date.now() / 1000) + options.expiry + if (options.alert) + note.alert = options.alert + if (options.badge) + note.badge = options.badge + if (options.payload) + note.payload = options.payload + if (options.sound) + note.sound = options.sound + return note +} + +module.exports = { + init: init, + push: push, + buildPayload: buildPayload +} diff --git a/lib/okpush/db.js b/lib/okpush/db.js new file mode 100644 index 00000000..844bccae --- /dev/null +++ b/lib/okpush/db.js @@ -0,0 +1,132 @@ +var mongoose = require('mongoose') +var findOrCreate = require('mongoose-findorcreate') +var _ = require('lodash') +var db, PushToken, Notification, Channel + +mongoose.Promise = require('bluebird') + +function init (config) { + db = mongoose.connect(config.mongodbUrl) + mongoose.connection.on('error', errorHandler) + + var pushTokenSchema = new db.Schema({ + type: { + type: 'String', + required: true, + lowercase: true, + enum: ['ios', 'android'], + }, + token: { + type: 'String', + required: true, + }, + channel: { + type: 'String', + required: true, + }, + }) + + var channelSchema = new db.Schema({ + channel: { + type: 'String', + required: true, + lowercase: true, + }, + last_push: { + type: 'Date', + required: true, + } + }) + channelSchema.plugin(findOrCreate); + + var notificationSchema = new db.Schema({ + channel: { + type: 'String', + required: true, + lowercase: true, + }, + date: { + type: 'Date', + required: true, + } + }) + + PushToken = db.model('PushToken', pushTokenSchema) + Notification = db.model('Notification', notificationSchema) + Channel = db.model('Channel', channelSchema) +} + +function errorHandler (error) { + console.error('ERROR: ' + error) +} + +/* devices / tokens */ + +function addToken (deviceType, token, channel) { + var pushItem = new PushToken({ + type: deviceType, + token: token, + channel: channel + }) + pushItem.save() +} +function getAllTokens (channel, cb) { + PushToken.find({ channel: channel }, function (err, items) { + if (err) return cb(err, null) + var items = _.map(items, function (item) { + return _.pick(item, ['type', 'token']) + }) + return cb(null, items) + }) +} +function removeToken (token, channel) { + PushToken.find({ token: token, channel: channel }).remove().exec() +} +function getDeviceCount (channel, cb) { + PushToken.count({ channel: channel }, cb) +} + +/* notifications */ + +function addNotification (channel, cb) { + var now = new Date + Channel.findOrCreate({channel: channel}, {last_push: now}, function(err, note, created) { + if (err) { + console.error("Error finding/creating notification", err) + cb(err, false) + return + } + else if (! created) { + note.last_push = now + note.save() + } + cb(null, note) + }) + new Notification ({ + channel: channel, + date: now, + }).save() +} +function getNotifications (cb) { + Notification.find(function (err, items) { + if (err) return cb(err, null) + + var items = _.map(items, function (item) { + return _.pick(item, ['channel', 'last_push']) + }) + + return cb(null, items) + }) +} + +/* wrap functions for some reason */ + +module.exports = { + init: init, + addToken: addToken, + removeToken: removeToken, + getAllTokens: getAllTokens, + getDeviceCount: getDeviceCount, + addNotification: addNotification, + getNotifications: getNotifications, +} \ No newline at end of file diff --git a/lib/okpush/index.js b/lib/okpush/index.js new file mode 100644 index 00000000..a9ba12eb --- /dev/null +++ b/lib/okpush/index.js @@ -0,0 +1,120 @@ +/** + * OKPush - Handles basic broadcast push notifications, as well as keeping track of tokens. + */ + +var path = require('path') +var passport = require('passport') +var DigestStrategy = require('passport-http').DigestStrategy; +var bodyParser = require('body-parser') +var OKTemplate = require('../../../app/node_modules/oktemplate') +var apn = require('./apn') +var db = require('./db') + +passport.use(new DigestStrategy({qop: 'auth'}, function authenticate(username, done) { + if (!process.env.OK_USER || !process.env.OK_PASS) { + return done(new Error('No user or pass configured on server')) + } else { + return done(null, process.env.OK_USER, process.env.OK_PASS) + } +})) + +function OKPush (options) { + if (!(this instanceof OKPush)) return new OKPush(options) + options = options || {} + if (!options.express) + throw new Error('Express not provided to OKPush') + if (!options.config) + throw new Error('Configuration not provided to OKPush') + if (!options.config.notifications) + throw new Error('Notifications not provided to OKPush') + if (!options.config.bundleId) + throw new Error('bundleId not provided to OKPush') + if (!options.config.mongodbUrl) + throw new Error('mongodbUrl not provided to OKPush') + + var express = options.express + var router = express.Router() + var config = options.config + var meta = options.meta + var error = options.errorHandler + // var okcms_db = options.db + + var templateProvider = this._templateProvider = new OKTemplate({ + root: path.join(__dirname, './templates'), + debug: meta.debug + }) + + var templates = {} + templates['index'] = templateProvider.getTemplate('index') + + apn.init(config) + db.init(config) + + router.use('/admin/', passport.initialize()) + router.use('/public/', express.static(path.join(__dirname, './public'))); + + // monkeypatch because of app.use(router) .. obnoxious + router.all('/admin/(:path*)?', function (req, res, next) { + req.newUrl = req.url + req.url = req.originalUrl + next() + }) + router.all('/admin/(:path*)?', passport.authenticate('digest', { + session: false + })) + router.all('/admin/(:path*)?', function (req, res, next) { + req.url = req.newUrl + next() + }) + + // pass in admin middleware! + router.get('/admin', function (req, res) { + db.getNotifications(function(err, notes){ + db.getDeviceCount(function(err, count){ + var data = { + meta: meta, + notifications: config.notifications, + device_count: count, + } + notes.forEach(function(note){ + if (note.key in data.notifications) { + data.notifications[ note.key ].last_push = note.last_push + } + }) + templates['index'].render(data).then(function(rendered) { + res.send(rendered); + }).fail(error(req, res, 500)) + }) + }) + }) + + router.post('/send', bodyParser.urlencoded({ extended: false }), function (req, res) { + var key = req.body.key + var opt = options.config.notifications[key] + var note = apn.buildPayload(opt, options.config.bundleId) + // apn.push(note) + db.updateNotification(key, function(){ + res.send(200) + }) + }) + + // should work without middleware + router.post('/add', function (req, res) { + // add a key + db. + registrationId: localStorage.getItem("yoox.registrationId"), + channel: channel, + platform, + }) + router.post('/remove', function (req, res) { + // remove a key + }) + + this._router = router +} + +OKPush.prototype.middleware = function () { + return this._router +} + +module.exports = OKPush diff --git a/lib/okpush/package.json b/lib/okpush/package.json new file mode 100644 index 00000000..87ca92ca --- /dev/null +++ b/lib/okpush/package.json @@ -0,0 +1,21 @@ +{ + "name": "okpush", + "version": "1.0.0", + "description": "push notification service", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "okfocus ", + "license": "LNT", + "dependencies": { + "apn": "^2.1.1", + "bluebird": "^3.4.6", + "body-parser": "^1.15.2", + "lodash": "^4.16.3", + "mongoose": "^4.6.2", + "mongoose-findorcreate": "^0.1.2", + "passport": "^0.3.2", + "passport-http": "^0.3.0" + } +} diff --git a/lib/okpush/public/push.js b/lib/okpush/public/push.js new file mode 100644 index 00000000..d369c903 --- /dev/null +++ b/lib/okpush/public/push.js @@ -0,0 +1,31 @@ +$(function(){ + var count = $(".device-count").data("count"); + var confirm_msg = "This will send the notification {{key}} to {{count}} people. Click OK to confirm."; + $(".notifications button").click(function(){ + var $el = $(this) + var data = $el.data() + var msg = confirm_msg.replace("{{key}}", data.key).replace("{{count}}", count) + if (! confirm(msg)) return + $.ajax({ + type: "POST", + url: "/_services/push/send", + data: { key: data.key }, + success: function(){ + alert("Push notification sent.") + var now = new Date() + // "%a %d-%b-%Y %H:%M" + var months = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ") + var days = "Sun Mon Tue Wed Thu Fri Sat".split(" ") + var date = days[ now.getDay() ] + date += " " + now.getDate() + date += "-" + months[now.getMonth()] + date += "-" + now.getFullYear() + date += " " + now.getHours() + var mins = now.getMinutes() + if (mins < 10) mins = "0" + mins + date += ":" + mins + $el.closest("tr").find(".notification-date").html(date) + } + }) + }) +}) \ No newline at end of file diff --git a/lib/okpush/templates/index.liquid b/lib/okpush/templates/index.liquid new file mode 100644 index 00000000..10772b55 --- /dev/null +++ b/lib/okpush/templates/index.liquid @@ -0,0 +1,74 @@ +{% include 'partials/head' %} + +{% include 'partials/flash' %} + + + + + +
+ +

Push Notifications

+ +
Device count: {{ device_count }}
+ + + + + + + + + {% for pair in notifications %} + {% assign name = pair[0] %} + {% assign spec = pair[1] %} + + + + + + + {% endfor %} +
KeyMessageLast Push
+ {{name | escape}} + + {{spec.alert}} + + {% unless spec.last_push %} + Never + {% else %} + {{ spec.last_push | date: "%a %d-%b-%Y %H:%M" }} + {% endunless %} + + +
+ +
+ +{% include 'partials/tail' %} + + \ No newline at end of file diff --git a/lib/okpush/templates/partials/flash.liquid b/lib/okpush/templates/partials/flash.liquid new file mode 100644 index 00000000..e51a86b7 --- /dev/null +++ b/lib/okpush/templates/partials/flash.liquid @@ -0,0 +1,20 @@ +{% if success.length > 0 %} +
+
Changes saved.
+ +
+{% endif %} + +{% if errors.length > 0 %} +
+ {% for error in errors %} +
+
{{error.message}}
+
+ {% endfor %} +
+{% endif %} \ No newline at end of file diff --git a/lib/okpush/templates/partials/head.liquid b/lib/okpush/templates/partials/head.liquid new file mode 100644 index 00000000..e9c27dc0 --- /dev/null +++ b/lib/okpush/templates/partials/head.liquid @@ -0,0 +1,13 @@ + + + + + {{meta.project}} Admin + + + +
+ {{meta.project}} Admin + View Site +
+
\ No newline at end of file diff --git a/lib/okpush/templates/partials/inputs.liquid b/lib/okpush/templates/partials/inputs.liquid new file mode 100644 index 00000000..60466de9 --- /dev/null +++ b/lib/okpush/templates/partials/inputs.liquid @@ -0,0 +1,395 @@ +{% for pair in resource.spec %} + {% assign name = pair[0] %} + {% assign spec = pair[1] %} + {% assign type = spec.type %} + +
+ + + {% if type == 'string' %} + + {% elsif type == 'text' %} + + {% elsif type == 'number' %} + + {% elsif type == 'enum' or type == 'foreign-key' %} + + {% elsif type == 'video' %} +
+ + + + + + + + + +
+ {% elsif type == 'image' %} +
+
+
+ + +
+ +
+
+ + + + + {{spec.value.caption | escape}} + +
+
+ + {% elsif type == 'date' %} + +
+ +
+ + {% elsif type == 'flag' %} + +
+ +
+ + {% elsif type == 'tag-list' %} +
+ +
+ + {% elsif type == 'link-list' %} + + + {% elsif type == 'media-list' or type == 'media' %} +
+
+
+ + +
+ +
+ + + + + + + + + +
    + {% for image in spec.value %} + {% if image.type and (image.type == "vimeo" or image.type == "youtube" or image.type == "video") %} +
  1. +
    + + + + + + + + + + + + + + + +
    + + +
  2. + {% elsif image.type and (image.type == "audio" or image.type == "soundcloud") %} +
  3. +
    + + + + + + + + +
    + + +
  4. + {% elsif image.type and image.type == "link" %} + + {% else %} +
  5. + + + + + + + {{image.caption | strip_html}} + +
  6. + {% endif %} + {% endfor %} +
+
+ {% elsif type == 'captioned-image-list' or type == 'gallery' %} +
+
+
+ + +
+ +
+ + + +
    + {% for image in spec.value %} +
  1. + + + + + {{image.caption | strip_html}} + +
  2. + {% endfor %} +
+
+ {% elsif type == 'double-captioned-image-list' %} +
+
+
+ + +
+ +
+ + + +
    + {% for image in spec.value %} +
  1. + {{image.caption | strip_html}} + + + + + + +
  2. + {% endfor %} +
+
+ {% elsif type == 'triple-captioned-image-list' %} +
+
+
+ + +
+ +
+ + + +
    + {% for image in spec.value %} +
  1. + {{image.caption | strip_html}} + + + + + + + +
  2. + {% endfor %} +
+
+ {% elsif type == 'meta' %} + + {% else %} +

Admin template doesn't support '{{type}}' properties!

+ {% endif %} +
+ +{% endfor %} diff --git a/lib/okpush/templates/partials/tail.liquid b/lib/okpush/templates/partials/tail.liquid new file mode 100644 index 00000000..522023b5 --- /dev/null +++ b/lib/okpush/templates/partials/tail.liquid @@ -0,0 +1,14 @@ +
{% comment %} closes container tag {% endcomment %} +
+
+ + + + + + + + diff --git a/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest b/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest new file mode 100644 index 00000000..3a4074ae --- /dev/null +++ b/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICkjCCAXoCAQAwTTEdMBsGCSqGSIb3DQEJARYOanVsZXNAb2tmb2MudXMxHzAd +BgNVBAMMFkp1bGlhbiBMYXBsYWNlIERFViBLRVkxCzAJBgNVBAYTAlVTMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArrpXz8B0q/tJ2+N6gjK2zLNPIIlA +lzrE46TIkY10xo9jW3vBRgZL9V5xKtmCWf3KfR2I7KioyqqnZvz6++TV/M3rZptJ +XN8yMmG4mjTqgC1V2SubYyUZqpqkfyLK1ePimsg09UUNxwNcIyBJun+f8wXqz7HK +Kieiq+d7oTs+WJbWdkIftxe7hjL2n93PI1LLCF15Cx8s7XP7R7QsTGMvHUzYYHiL +4bc+r54jpZ28onVAwdYx+p3WkKzdFGjkrIl++IXmyJr0E7jilfrKwMWi4tvCKgXV +KH6VmWLIKOtfKVMdIK0WQ9ij3kRHfEwgN/djC3M2UWFEGLx1d7FuL5c+nQIDAQAB +oAAwDQYJKoZIhvcNAQELBQADggEBAIGOwvuW7HaOb1h+nkpIDTHNRN6Lw3MTg8nU +68skeSFatC8lC4e//Gsl1z8iyR7amhoMrZ29f4Tgs5w8NFgcVmzdp5CL126WA3qV +Qu+xZxhgwUnLRxtpDUVtTdJGaYNmowpm4mqs5YFg6WCIhWg+kuEJJ8MSOkYHtyAx +HIpbfjeSW69VGelr+vGZ6Jf07UCquwJCJR4WmsIyruJhvf2CQMPsT3bXKrhu/sWg +WyjjCjXVLeDOO/tiRMnPteCcDZPsXKyi9PPkSF4u591YoUL0UxjlzlignBT4FSyq +s8kdmrEHWIW1BAscmNVny2YTuGjbFos/GBSMDeJvoXdvPS2kRiQ= +-----END CERTIFICATE REQUEST----- diff --git a/lib/okpush/test_certs/Certificates.p12 b/lib/okpush/test_certs/Certificates.p12 new file mode 100644 index 00000000..6e61158f Binary files /dev/null and b/lib/okpush/test_certs/Certificates.p12 differ diff --git a/lib/okpush/test_certs/aps_development.cer b/lib/okpush/test_certs/aps_development.cer new file mode 100644 index 00000000..8d55dd44 Binary files /dev/null and b/lib/okpush/test_certs/aps_development.cer differ diff --git a/lib/okpush/test_certs/overlayer_dev_cert.pem b/lib/okpush/test_certs/overlayer_dev_cert.pem new file mode 100644 index 00000000..3758dd23 --- /dev/null +++ b/lib/okpush/test_certs/overlayer_dev_cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFiTCCBHGgAwIBAgIIaNpEjSUbbWwwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTYxMDA0MjAxMTM3WhcNMTcxMDA0MjAxMTM3WjCBiDEiMCAGCgmSJomT8ixk +AQEMEnVzLm9rZm9jLm92ZXJsYXllcjFAMD4GA1UEAww3QXBwbGUgRGV2ZWxvcG1l +bnQgSU9TIFB1c2ggU2VydmljZXM6IHVzLm9rZm9jLm92ZXJsYXllcjETMBEGA1UE +CwwKNUVIOVc1WDVTSjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCuulfPwHSr+0nb43qCMrbMs08giUCXOsTjpMiRjXTGj2Nbe8FG +Bkv1XnEq2YJZ/cp9HYjsqKjKqqdm/Pr75NX8zetmm0lc3zIyYbiaNOqALVXZK5tj +JRmqmqR/IsrV4+KayDT1RQ3HA1wjIEm6f5/zBerPscoqJ6Kr53uhOz5YltZ2Qh+3 +F7uGMvaf3c8jUssIXXkLHyztc/tHtCxMYy8dTNhgeIvhtz6vniOlnbyidUDB1jH6 +ndaQrN0UaOSsiX74hebImvQTuOKV+srAxaLi28IqBdUofpWZYsgo618pUx0grRZD +2KPeREd8TCA392MLczZRYUQYvHV3sW4vlz6dAgMBAAGjggHlMIIB4TAdBgNVHQ4E +FgQUckSbISzH7PTE7R9gsIb/sxKzHrgwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSI +JxcJqbYYYIvs67r2R1nFUlSjtzCCAQ8GA1UdIASCAQYwggECMIH/BgkqhkiG92Nk +BQEwgfEwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZp +Y2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ug +c3RhdGVtZW50cy4wKQYIKwYBBQUHAgEWHWh0dHA6Ly93d3cuYXBwbGUuY29tL2Fw +cGxlY2EvME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu +Y29tL2NlcnRpZmljYXRpb25hdXRob3JpdHkvd3dkcmNhLmNybDALBgNVHQ8EBAMC +B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEAYKKoZIhvdjZAYDAQQCBQAwDQYJKoZI +hvcNAQEFBQADggEBAEuQKbpqxQPnazN4A0NVB7YRr2M2Hk5DtV4M/QT8OFDY1IsA +s4U8NmI9AMgoszIdLG3n4x2Y4mm6yTYDEMQpaJRbir9Fx6WcZQ4GB72iZ1M/1fkC +79Yq17yzxM9Awf2igx1EkZhzy6Oq+7cUX9Jbz5IQrPyfXe5hpaOmY4jnWgSlaiwJ +6bBhFHwhJY9ekAFOyRnZS7hQD4mLOBZLti/lH4Z2zadd21DbM/uhUvLJgYpIRplP +hoFxV5bev5vv9A0dbYw6ERa3+aG8HHmP9N4u1/JxHIX2VlYzzLj1l7Tlps6QG6/r +4CsJBIfpGjxwznrYJBN5ox1KlFxNLwD3UNpLhOQ= +-----END CERTIFICATE----- diff --git a/lib/okpush/test_certs/overlayer_dev_key.pem b/lib/okpush/test_certs/overlayer_dev_key.pem new file mode 100644 index 00000000..30cb696d --- /dev/null +++ b/lib/okpush/test_certs/overlayer_dev_key.pem @@ -0,0 +1,68 @@ +Bag Attributes + friendlyName: Apple Development IOS Push Services: us.okfoc.overlayer + localKeyID: 72 44 9B 21 2C C7 EC F4 C4 ED 1F 60 B0 86 FF B3 12 B3 1E B8 +subject=/UID=us.okfoc.overlayer/CN=Apple Development IOS Push Services: us.okfoc.overlayer/OU=5EH9W5X5SJ/C=US +issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority +-----BEGIN CERTIFICATE----- +MIIFiTCCBHGgAwIBAgIIaNpEjSUbbWwwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTYxMDA0MjAxMTM3WhcNMTcxMDA0MjAxMTM3WjCBiDEiMCAGCgmSJomT8ixk +AQEMEnVzLm9rZm9jLm92ZXJsYXllcjFAMD4GA1UEAww3QXBwbGUgRGV2ZWxvcG1l +bnQgSU9TIFB1c2ggU2VydmljZXM6IHVzLm9rZm9jLm92ZXJsYXllcjETMBEGA1UE +CwwKNUVIOVc1WDVTSjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCuulfPwHSr+0nb43qCMrbMs08giUCXOsTjpMiRjXTGj2Nbe8FG +Bkv1XnEq2YJZ/cp9HYjsqKjKqqdm/Pr75NX8zetmm0lc3zIyYbiaNOqALVXZK5tj +JRmqmqR/IsrV4+KayDT1RQ3HA1wjIEm6f5/zBerPscoqJ6Kr53uhOz5YltZ2Qh+3 +F7uGMvaf3c8jUssIXXkLHyztc/tHtCxMYy8dTNhgeIvhtz6vniOlnbyidUDB1jH6 +ndaQrN0UaOSsiX74hebImvQTuOKV+srAxaLi28IqBdUofpWZYsgo618pUx0grRZD +2KPeREd8TCA392MLczZRYUQYvHV3sW4vlz6dAgMBAAGjggHlMIIB4TAdBgNVHQ4E +FgQUckSbISzH7PTE7R9gsIb/sxKzHrgwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSI +JxcJqbYYYIvs67r2R1nFUlSjtzCCAQ8GA1UdIASCAQYwggECMIH/BgkqhkiG92Nk +BQEwgfEwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZp +Y2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ug +c3RhdGVtZW50cy4wKQYIKwYBBQUHAgEWHWh0dHA6Ly93d3cuYXBwbGUuY29tL2Fw +cGxlY2EvME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu +Y29tL2NlcnRpZmljYXRpb25hdXRob3JpdHkvd3dkcmNhLmNybDALBgNVHQ8EBAMC +B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEAYKKoZIhvdjZAYDAQQCBQAwDQYJKoZI +hvcNAQEFBQADggEBAEuQKbpqxQPnazN4A0NVB7YRr2M2Hk5DtV4M/QT8OFDY1IsA +s4U8NmI9AMgoszIdLG3n4x2Y4mm6yTYDEMQpaJRbir9Fx6WcZQ4GB72iZ1M/1fkC +79Yq17yzxM9Awf2igx1EkZhzy6Oq+7cUX9Jbz5IQrPyfXe5hpaOmY4jnWgSlaiwJ +6bBhFHwhJY9ekAFOyRnZS7hQD4mLOBZLti/lH4Z2zadd21DbM/uhUvLJgYpIRplP +hoFxV5bev5vv9A0dbYw6ERa3+aG8HHmP9N4u1/JxHIX2VlYzzLj1l7Tlps6QG6/r +4CsJBIfpGjxwznrYJBN5ox1KlFxNLwD3UNpLhOQ= +-----END CERTIFICATE----- +Bag Attributes + friendlyName: Julian Laplace DEV KEY + localKeyID: 72 44 9B 21 2C C7 EC F4 C4 ED 1F 60 B0 86 FF B3 12 B3 1E B8 +Key Attributes: +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEArrpXz8B0q/tJ2+N6gjK2zLNPIIlAlzrE46TIkY10xo9jW3vB +RgZL9V5xKtmCWf3KfR2I7KioyqqnZvz6++TV/M3rZptJXN8yMmG4mjTqgC1V2Sub +YyUZqpqkfyLK1ePimsg09UUNxwNcIyBJun+f8wXqz7HKKieiq+d7oTs+WJbWdkIf +txe7hjL2n93PI1LLCF15Cx8s7XP7R7QsTGMvHUzYYHiL4bc+r54jpZ28onVAwdYx ++p3WkKzdFGjkrIl++IXmyJr0E7jilfrKwMWi4tvCKgXVKH6VmWLIKOtfKVMdIK0W +Q9ij3kRHfEwgN/djC3M2UWFEGLx1d7FuL5c+nQIDAQABAoIBAQCdKIiBGccXRa/a +MxJm9zyKhCGAz1MkczzS0M2Cdax6SFCC4Z4m4NUDfw3lD7z6Opcd0CnvS4h+ud5W +eOc7GEoM2B6KrNPgz/Szckf7k+r0nVJhQqLCG4WpeOzKWb39grq4o6lWjuTkgzYl +dg46zD5O9ZyNcYm4PuxHGK+Phtz+CjkEx5Y6WqoBvgA10A+pHBSMAZ2uRznGHJmQ +xF9HHdLLKwtZemRGEdZaC510fpBDbgapLzZqy495/2I3zlOFSW9thWhJ/PO45AH1 +bqtRRq0z0CU94QynulrcvZlyFVF5msDyzBI6B7oZAumC5y9s/v6/jE2rIr1uNx2W +e3Zbh+21AoGBAOAUhkD932XhDKtatDpBDQ8va9ZiiQCuO8VFP1wck2U18ovy6DQn +A3JJUoC/d4K7brCQ5CgzACI0tgen99u78qN3F3caapwJMbQ3LAdZA6U5tZq/7poA +FrvEs6vAToe+HhLkWxvctO0sEGtZEDUptRRa5cGoMAV2FyLvtSHgPk+jAoGBAMee +GgcunO+XBI8HVgC9GTLxJWUuXpwYslI9uDXTVFsJ4jqEAk0R4qA8wGa6VpXS7yea +3Vd8qG9C8yVIuSoajyH4FYQ6rzfbUDoYHsKkJUabJWTK08VPb2RVae6vDQmXqyw3 +X6QH+no33inyD5bEqaSg7lTcQ03kX3shVj+kTBy/AoGBAL0slqsHqTI5bJi9WqpT +gNLxFflH9qG8dnl0nKkG9ujbQokj6SUeSqqRfDV1b0/PLQOjTvshE1vNZF/STk4T +viSCxiynAJn6qRub+G+7lnhG4CplHuqkaIzc41J8Z8/xkTIh10kOazBPowz9g9Fe +BKHKm22CsAfsSlwUQrb2uaRBAoGAI660UmJXtVBWhUa3bexfi8ale5+9U8PqZF8a +Ba0gICH1KaadTq+Kxj/12KcogSGylG7PcCsdZL4f/qMwTkFvIpBZMEjZN2/huHDF +Vt/GtgdXuNu03UlkzRejlwH9n6BX/dBsLUMr2BsSgIb/mGDRPldyIwM4mLzhAH6m +DzxMSrsCgYB9LP/AsmUY67lajzYO18Xu9YTNzIKwovD/RhRHRz0kOI7QQRSXNtGZ +RwzV9OCeRXGLrC2n6w9KnGx8d6pZKElzDkN7+Ql9y2ALmzaInmugTyoNxBPeU3GB +DxN5IIkt2G1rexC/SaQ9WOokiQSKJIZGRHR/WHKpXC/mBHxq7CENkQ== +-----END RSA PRIVATE KEY----- -- cgit v1.2.3-70-g09d2 From d3d195470caef02891de58ed25b92a02c088c37d Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 16 Feb 2017 18:32:08 +0100 Subject: routes --- lib/okpush/db.js | 15 +++++---------- lib/okpush/index.js | 16 ++++++++++------ 2 files changed, 15 insertions(+), 16 deletions(-) (limited to 'lib') diff --git a/lib/okpush/db.js b/lib/okpush/db.js index 844bccae..ad18b7b3 100644 --- a/lib/okpush/db.js +++ b/lib/okpush/db.js @@ -10,7 +10,7 @@ function init (config) { mongoose.connection.on('error', errorHandler) var pushTokenSchema = new db.Schema({ - type: { + platform: { type: 'String', required: true, lowercase: true, @@ -62,13 +62,8 @@ function errorHandler (error) { /* devices / tokens */ -function addToken (deviceType, token, channel) { - var pushItem = new PushToken({ - type: deviceType, - token: token, - channel: channel - }) - pushItem.save() +function addToken (data) { + return new PushToken(data).save() } function getAllTokens (channel, cb) { PushToken.find({ channel: channel }, function (err, items) { @@ -79,8 +74,8 @@ function getAllTokens (channel, cb) { return cb(null, items) }) } -function removeToken (token, channel) { - PushToken.find({ token: token, channel: channel }).remove().exec() +function removeToken (data) { + PushToken.find(data).remove().exec() } function getDeviceCount (channel, cb) { PushToken.count({ channel: channel }, cb) diff --git a/lib/okpush/index.js b/lib/okpush/index.js index a9ba12eb..a509c891 100644 --- a/lib/okpush/index.js +++ b/lib/okpush/index.js @@ -69,6 +69,7 @@ function OKPush (options) { // pass in admin middleware! router.get('/admin', function (req, res) { + // change this to get notification counts for each channel db.getNotifications(function(err, notes){ db.getDeviceCount(function(err, count){ var data = { @@ -100,14 +101,17 @@ function OKPush (options) { // should work without middleware router.post('/add', function (req, res) { - // add a key - db. - registrationId: localStorage.getItem("yoox.registrationId"), - channel: channel, - platform, + db.addToken({ + token: req.body.registrationId, + channel: req.body.channel, + platform: req.body.platform, + }) }) router.post('/remove', function (req, res) { - // remove a key + db.removeToken({ + token: req.body.registrationId, + channel: req.body.channel, + }) }) this._router = router -- cgit v1.2.3-70-g09d2 From d6be5583190174bd45c417b934b36e4469ab3441 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Sun, 19 Feb 2017 01:14:24 +0100 Subject: new certs --- .env | 7 + db.json | 398 +++++++++++++++++++++++++++++- index.js | 19 +- lib/okpush/apn.js | 6 +- lib/okpush/certs/aps_development_cert.pem | 32 +++ lib/okpush/certs/aps_development_key.pem | 68 +++++ lib/okpush/certs/aps_production_cert.pem | 35 +++ lib/okpush/certs/aps_production_key.pem | 71 ++++++ lib/okpush/index.js | 2 +- 9 files changed, 623 insertions(+), 15 deletions(-) create mode 100644 .env create mode 100644 lib/okpush/certs/aps_development_cert.pem create mode 100644 lib/okpush/certs/aps_development_key.pem create mode 100644 lib/okpush/certs/aps_production_cert.pem create mode 100644 lib/okpush/certs/aps_production_key.pem (limited to 'lib') diff --git a/.env b/.env new file mode 100644 index 00000000..7b4b883f --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +S3_KEY=AKIAJ73D6JOPQRGR4M3Q +S3_SECRET=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 +S3_BUCKET=marsupial +S3_DIRNAME=stoneisland +OK_USER=stoneisland +OK_PASS=okfocus + diff --git a/db.json b/db.json index ead7f2b3..fb663ed7 100644 --- a/db.json +++ b/db.json @@ -1574,6 +1574,383 @@ "caption": "" } ] + }, + { + "id": "stone-island_spring-summer_-017_video-teaser", + "date": "Wed, 11 Jan 2017 12:00:00 GMT", + "title": "Stone Island_Spring Summer_'017_Video teaser", + "subtitle": "", + "body": "", + "link": "https://youtu.be/iia_oPZPY_Y", + "store": "false", + "image": [ + { + "uri": "https://ltho.s3.amazonaws.com/undefined/93699100-d8dd-11e6-abc7-59ceb822d9d2.jpg", + "width": "1920", + "height": "1080", + "caption": "" + } + ], + "__index": 23, + "dateCreated": "Thu, 12 Jan 2017 15:42:24 GMT" + }, + { + "id": "stone-island_spring-summer_-017_icon-imagery", + "date": "Thu, 12 Jan 2017 12:00:00 GMT", + "title": "Stone Island_Spring Summer_'017_Icon Imagery", + "subtitle": "", + "body": "", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d5f07520-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d4b13e60-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d57c7da0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d6bb1820-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d432bf90-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d4f54c40-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d33043b0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d58222f0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d28f21b0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d1f1a930-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d3219db0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d32658a0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d0611e20-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d131b490-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d07bf920-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d1d2fda0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d21006a0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/d01d5e60-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cec19ef0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cd455f30-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/ce493aa0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/ce8224f0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/ce774f80-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cd49a4f0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cd0e49a0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cbc771c0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cac06200-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/c9ca6940-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cbbe22f0-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/cbba5260-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/ca202a60-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/ca130b00-d8d8-11e6-abc7-59ceb822d9d2.jpg", + "width": "776", + "height": "1012", + "caption": "" + } + ], + "__index": 24, + "dateCreated": "Thu, 12 Jan 2017 15:46:04 GMT" + }, + { + "id": "nikelab-x-stone-island-sock-dart-mid_preview-stone-island-research-meets-nike-design", + "date": "Thu, 19 Jan 2017 12:00:00 GMT", + "title": "NIKELAB X STONE ISLAND SOCK DART MID_PREVIEW 
STONE ISLAND RESEARCH MEETS NIKE DESIGN", + "subtitle": "", + "body": "With this collaboration Stone Island has been challenged to apply its research skills on Nike fabrics in an interpretation of the Nike Sock Dart Mid Slip On Shoe. 
Applying the personal approach to investigation and the development of new technologies, Stone Island has tested several techniques in able to combine a graphic look and feel with functionality, in order to find the right meeting point between its know-how and Nike’s design.
The outcome is a glossy and elastic engineered zonal silicone print, adding structure and protection to the hyper-stretch breathable sandwich mesh used for the upper, still maintains the flexibility attributes that are signature to the Sock Dart. 

The new mid-cut silhouette has an extended collar with a leather grain deboss pattern and poly spandex lining. 
Glossy molded midfoot adjustable strap. 
New Duralon foam outsole: the forefoot features a multidirectional sipe pattern for water dispersion and improved traction.

NikeLab x Stone Island Sock Dart Mid will be released in three colorways: black, obsidian bleu and - exclusively at flagship stores - in sequoia green.
It will be on sale from Thursday, January 26 in Stone Island flagship stores, on the Stone Island app, in NikeLab stores and on nike.com/nikelab.", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://ltho.s3.amazonaws.com/undefined/a6e5c860-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "1000", + "height": "563", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/89838140-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/89aa4320-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/89a7ab10-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/89378420-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/89548200-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/890c5570-de47-11e6-abc7-59ceb822d9d2.jpg", + "width": "770", + "height": "488", + "caption": "" + } + ], + "__index": 25, + "dateCreated": "Thu, 19 Jan 2017 13:44:32 GMT" + }, + { + "id": "hand-corrosion_stone-island-app-exclusive-colorways", + "date": "Sun, 22 Jan 2017 12:00:00 GMT", + "title": "Hand Corrosion_Stone Island App Exclusive Colorways", + "subtitle": "", + "body": "An artisan process with corrosive paste
 that makes each garment unique and unrepeatable.
\r\n\r\nHAND CORROSION\r\nGarments are dyed with special recipes and then decolored by hand with a corrosive paste. 
The Stone Island badge is attached to the pieces during the manual fading and features the same corrosion marks.
Residual dye highlights the architecture of the garments. 
This artisan process makes each piece unique and unrepeatable.\r\n\r\nSTONE ISLAND APP EXCLUSIVE COLORWAYS \r\n\r\n45131_Yellow Field Jacket made in military-derived cotton satin, garment dyed with special corrodible colorants and then manually faded, steamed and intensely washed with the addition of an anti-drop agent.\r\n\r\n

541A1_Black cotton crew neck. Worked in brioche stitch knit. Garment dyed with special corrodible colorants and then faded by hand with a corrosive paste, steamed and intensely washed. ", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://ltho.s3.amazonaws.com/undefined/020846f0-e17c-11e6-abc7-59ceb822d9d2.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/023d60b0-e17c-11e6-abc7-59ceb822d9d2.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 26, + "dateCreated": "Mon, 23 Jan 2017 14:57:23 GMT" + }, + { + "id": "hand-corrosion-video", + "date": "Mon, 23 Jan 2017 12:00:00 GMT", + "title": "Hand Corrosion Video", + "subtitle": "", + "body": "An artisan process with corrosive paste\r\nthat makes each garment unique and unrepeatable.", + "link": "https://youtu.be/1u6OovE0cY4", + "store": "true", + "__index": 27, + "dateCreated": "Mon, 23 Jan 2017 15:21:19 GMT", + "image": [] + }, + { + "id": "nylon-metal-color-weft_app-exclusive-colorway", + "date": "Tue, 14 Feb 2017 12:00:00 GMT", + "title": "Nylon Metal Color Weft_App Exclusive Colorway", + "subtitle": "", + "body": "The evolution of one of the most iconic Stone Island fabrics\r\nUnprecedented iridescent colors \r\n\r\nNYLON METAL COLOR WEFT\r\n\r\n10245_Over shirt in Nylon Metal with colored weaved yarns. 
Two pockets with flap and button fastening on chest.
 Hidden zip fastening.

 \r\n\r\nThe metallic and iridescent aspect of Nylon Metal, one of the most versatile fabrics issued from the STONE ISLAND textile research, is enhanced with colored tones thanks to the tint of its weft yarns. Garments made in this fabric undergo an elaborate double recipe dye process enhancing its chromatic iridescences.

 \r\n\r\nAPP EXCLUSIVE FROM 2/16 TO 2/20", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://ltho.s3.amazonaws.com/undefined/579783e0-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/57936530-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/57861ec0-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/57a16ef0-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/57a2a770-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/578e0e00-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/57ef67e0-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + }, + { + "uri": "https://ltho.s3.amazonaws.com/undefined/58036510-f2c7-11e6-abc7-59ceb822d9d2.jpg", + "width": "466", + "height": "692", + "caption": "" + } + ], + "__index": 28, + "dateCreated": "Tue, 14 Feb 2017 15:08:43 GMT" } ], "page": [ @@ -1633,24 +2010,31 @@ "StoreIsOpen": "false", "ClosedStoreImages": [ { - "uri": "https://ltho.s3.amazonaws.com/undefined/12d30460-c7a1-11e6-bd08-255bc61066e4.jpg", - "width": "776", - "height": "1013", + "uri": "https://ltho.s3.amazonaws.com/undefined/f064c600-f461-11e6-abc7-59ceb822d9d2.jpg", + "width": "519", + "height": "692", "caption": "" } ], "__index": 0, "dateCreated": "Fri, 20 Nov 2015 00:45:03 GMT", - "collection": "SPRING SUMMER_'017 PREVIEW", + "collection": "NYLON METAL COLOR WEFT", "FitsLarge": "false", "BackgroundIsGray": "false", "CollectionId": "", - "StoreStatus": "closed", + "StoreStatus": "open", "OpensOn": "", - "DepartmentId": "DrpppHddnSSS", + "DepartmentId": "DrpppNlnMtl", "StoreClosedMessageOne": "", "StoreClosedMessageTwo": "", - "FittingCodes": "" + "FittingCodes": "", + "DepartmentStoreStatus": "closed", + "Departments": [ + { + "text": "", + "uri": "" + } + ] } ] } \ No newline at end of file diff --git a/index.js b/index.js index 2fad7abe..9ce35659 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ var okcms = require('okcms') var assign = require('object-assign') +var path = require('path') var app = okcms.createApp({ @@ -74,19 +75,28 @@ var app = okcms.createApp({ key: process.env.S3_KEY, secret: process.env.S3_SECRET, bucket: process.env.S3_BUCKET, + dirname: process.env.S3_DIRNAME, maxbytes: 1024*1024*2, }, push: { lib: require("./lib/okpush"), - mongodbUrl: "mongodb://localhost/okpush_example", - apn: { - cert: path.join(__dirname, "./lib/okpush/test_certs/overlayer_dev_cert.pem"), - key: path.join(__dirname, "./lib/okpush/test_certs/overlayer_dev_key.pem"), + mongodbUrl: "mongodb://localhost/okpush_stone", + production: false, + apn_development: { + cert: path.join(__dirname, "./lib/okpush/certs/aps_development_cert.pem"), + key: path.join(__dirname, "./lib/okpush/certs/aps_development_key.pem"), connection: { gateway: "gateway.sandbox.push.apple.com", } }, + apn_production: { + cert: path.join(__dirname, "./lib/okpush/certs/aps_production_cert.pem"), + key: path.join(__dirname, "./lib/okpush/certs/aps_production_key.pem"), + connection: { + gateway: "gateway.push.apple.com", + } + }, bundleId: "us.okfoc.stoneisland", notifications: { // expiry (in seconds) @@ -101,7 +111,6 @@ var app = okcms.createApp({ }, } }, - }, } }).listen(1337) diff --git a/lib/okpush/apn.js b/lib/okpush/apn.js index b6909f6f..febd03bb 100644 --- a/lib/okpush/apn.js +++ b/lib/okpush/apn.js @@ -4,8 +4,10 @@ var db = require('./db') var apnProvider, apnFeedback function init (config) { - config.apn.connection.key = config.apn.key - config.apn.connection.cert = config.apn.cert + var apn_config = config.production ? config.apn_production : config.apn_development + config.apn = apn_config + config.apn.connection.key = apn_config.key + config.apn.connection.cert = apn_config.cert apnProvider = new apn.Provider(config.apn.connection) } diff --git a/lib/okpush/certs/aps_development_cert.pem b/lib/okpush/certs/aps_development_cert.pem new file mode 100644 index 00000000..fdfc2ba0 --- /dev/null +++ b/lib/okpush/certs/aps_development_cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFjTCCBHWgAwIBAgIIcP///sIUbaEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTcwMjE4MTYwNDAxWhcNMTgwMjE4MTYwNDAxWjCBjDEkMCIGCgmSJomT8ixk +AQEMFHVzLm9rZm9jLnN0b25laXNsYW5kMUIwQAYDVQQDDDlBcHBsZSBEZXZlbG9w +bWVudCBJT1MgUHVzaCBTZXJ2aWNlczogdXMub2tmb2Muc3RvbmVpc2xhbmQxEzAR +BgNVBAsMCkM2SlFUUEdKOTcxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtO/TPmNPgqPw6FNIQsg6IU1htEaUsfG7hvMWMxmhLfIz +YaRaoN++rb+yFHLx9v9LuAox+CBsMjUVeHR0vI2rHf9oQ0fBaxf+hkaWISp6hgpp +tPahQEsNRk56wFxaPh4m1ybLidYhWCJzPDJUNJDQX7Bk4YZ+tzQIDsVobwYyZtFI +NtSxi04mZrGy7s5tJKQ8pE++AF7Fo8QJoGfTw/eJIiu2V2khYgt3k1ieXvl0+o+j +B+zuvHO9fuLfOWa1Bo6Xy1gc0Qz1HALytkx6NYkTJ/vAJamegcKhjH2Z6vukha5U +RcSybpE2cEjg6I/2LK5ypRiGYtQJWACxRUAdTeYCAQIDAQABo4IB5TCCAeEwHQYD +VR0OBBYEFFqpdB90hmc8EisSBphK5Q/b1nb3MAkGA1UdEwQCMAAwHwYDVR0jBBgw +FoAUiCcXCam2GGCL7Ou69kdZxVJUo7cwggEPBgNVHSAEggEGMIIBAjCB/wYJKoZI +hvdjZAUBMIHxMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2Vy +dGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUg +dGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9m +IHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0 +aWNlIHN0YXRlbWVudHMuMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3LmFwcGxlLmNv +bS9hcHBsZWNhLzBNBgNVHR8ERjBEMEKgQKA+hjxodHRwOi8vZGV2ZWxvcGVyLmFw +cGxlLmNvbS9jZXJ0aWZpY2F0aW9uYXV0aG9yaXR5L3d3ZHJjYS5jcmwwCwYDVR0P +BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMBAGCiqGSIb3Y2QGAwEEAgUAMA0G +CSqGSIb3DQEBBQUAA4IBAQAGstXORHB9X0+RhRDmbTgfz9iTv7JJnRXDxD294rxG +Z/CeRDYE+gedxayTieKdcLn7bl+NjyIo2LsX3vr2i7la5CdWt1r1V7Y4mJ1fu3w1 +MTEYEHF7ejd8PI9n2M68p5/qTaqhJ4zI9zKsVXGJUmi9Ta5FNfJiud4OVZbfurN5 +rnyFFCk/kd+5sHgU/KqdnxtKR1DVjGbFqh6YI63Lv3druNJl8SpmTRuK9Vz6wQw3 +idXEj18jbqoADBnjiQuLhyxDxDM8lOjVUAsmALG1t20dFJeSUw61a+8DLoqLJvRg +X0A8Ssh8FawGy9sSl5s3K9bjFrxLBHyOqZ8dVWeFXZPR +-----END CERTIFICATE----- diff --git a/lib/okpush/certs/aps_development_key.pem b/lib/okpush/certs/aps_development_key.pem new file mode 100644 index 00000000..a1663eef --- /dev/null +++ b/lib/okpush/certs/aps_development_key.pem @@ -0,0 +1,68 @@ +Bag Attributes + friendlyName: Apple Development IOS Push Services: us.okfoc.stoneisland + localKeyID: 5A A9 74 1F 74 86 67 3C 12 2B 12 06 98 4A E5 0F DB D6 76 F7 +subject=/UID=us.okfoc.stoneisland/CN=Apple Development IOS Push Services: us.okfoc.stoneisland/OU=C6JQTPGJ97/C=US +issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority +-----BEGIN CERTIFICATE----- +MIIFjTCCBHWgAwIBAgIIcP///sIUbaEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTcwMjE4MTYwNDAxWhcNMTgwMjE4MTYwNDAxWjCBjDEkMCIGCgmSJomT8ixk +AQEMFHVzLm9rZm9jLnN0b25laXNsYW5kMUIwQAYDVQQDDDlBcHBsZSBEZXZlbG9w +bWVudCBJT1MgUHVzaCBTZXJ2aWNlczogdXMub2tmb2Muc3RvbmVpc2xhbmQxEzAR +BgNVBAsMCkM2SlFUUEdKOTcxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtO/TPmNPgqPw6FNIQsg6IU1htEaUsfG7hvMWMxmhLfIz +YaRaoN++rb+yFHLx9v9LuAox+CBsMjUVeHR0vI2rHf9oQ0fBaxf+hkaWISp6hgpp +tPahQEsNRk56wFxaPh4m1ybLidYhWCJzPDJUNJDQX7Bk4YZ+tzQIDsVobwYyZtFI +NtSxi04mZrGy7s5tJKQ8pE++AF7Fo8QJoGfTw/eJIiu2V2khYgt3k1ieXvl0+o+j +B+zuvHO9fuLfOWa1Bo6Xy1gc0Qz1HALytkx6NYkTJ/vAJamegcKhjH2Z6vukha5U +RcSybpE2cEjg6I/2LK5ypRiGYtQJWACxRUAdTeYCAQIDAQABo4IB5TCCAeEwHQYD +VR0OBBYEFFqpdB90hmc8EisSBphK5Q/b1nb3MAkGA1UdEwQCMAAwHwYDVR0jBBgw +FoAUiCcXCam2GGCL7Ou69kdZxVJUo7cwggEPBgNVHSAEggEGMIIBAjCB/wYJKoZI +hvdjZAUBMIHxMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2Vy +dGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUg +dGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9m +IHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0 +aWNlIHN0YXRlbWVudHMuMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3LmFwcGxlLmNv +bS9hcHBsZWNhLzBNBgNVHR8ERjBEMEKgQKA+hjxodHRwOi8vZGV2ZWxvcGVyLmFw +cGxlLmNvbS9jZXJ0aWZpY2F0aW9uYXV0aG9yaXR5L3d3ZHJjYS5jcmwwCwYDVR0P +BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMBAGCiqGSIb3Y2QGAwEEAgUAMA0G +CSqGSIb3DQEBBQUAA4IBAQAGstXORHB9X0+RhRDmbTgfz9iTv7JJnRXDxD294rxG +Z/CeRDYE+gedxayTieKdcLn7bl+NjyIo2LsX3vr2i7la5CdWt1r1V7Y4mJ1fu3w1 +MTEYEHF7ejd8PI9n2M68p5/qTaqhJ4zI9zKsVXGJUmi9Ta5FNfJiud4OVZbfurN5 +rnyFFCk/kd+5sHgU/KqdnxtKR1DVjGbFqh6YI63Lv3druNJl8SpmTRuK9Vz6wQw3 +idXEj18jbqoADBnjiQuLhyxDxDM8lOjVUAsmALG1t20dFJeSUw61a+8DLoqLJvRg +X0A8Ssh8FawGy9sSl5s3K9bjFrxLBHyOqZ8dVWeFXZPR +-----END CERTIFICATE----- +Bag Attributes + friendlyName: Julian Laplace + localKeyID: 5A A9 74 1F 74 86 67 3C 12 2B 12 06 98 4A E5 0F DB D6 76 F7 +Key Attributes: +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAtO/TPmNPgqPw6FNIQsg6IU1htEaUsfG7hvMWMxmhLfIzYaRa +oN++rb+yFHLx9v9LuAox+CBsMjUVeHR0vI2rHf9oQ0fBaxf+hkaWISp6hgpptPah +QEsNRk56wFxaPh4m1ybLidYhWCJzPDJUNJDQX7Bk4YZ+tzQIDsVobwYyZtFINtSx +i04mZrGy7s5tJKQ8pE++AF7Fo8QJoGfTw/eJIiu2V2khYgt3k1ieXvl0+o+jB+zu +vHO9fuLfOWa1Bo6Xy1gc0Qz1HALytkx6NYkTJ/vAJamegcKhjH2Z6vukha5URcSy +bpE2cEjg6I/2LK5ypRiGYtQJWACxRUAdTeYCAQIDAQABAoIBAQCbKszDRRGr3II+ +CyX+N446fw0aOClOzRrgKVnRatph98J+qx8Ztaflg27pwIWnJ9s8smmV++At0n5e +NajjBq9H43/7qu7Bs+sQJjqbqL04dHegvJ0e8P4qXCVDEDBH8z2l51xIEb24wpqG +djbmeYZpeXGaQugqntGGMV9VT0AsET3sA+LbhO3klIE5j3C+cWOZWKccMjppCSD+ +iA9c8hGdAt/wOWLQ7R15mvqlZZuSd4mIxgprClPN9/SUnk/w3PM8gXBNV1Vz79Cm +xxiv4BMbobGUtJF/d8vzpSP/M2J5sCc8PhIHjuzhgZTg1pitFdIcxcZxKSW2xYH7 +F51JX1ABAoGBAOnnHNFfj7uZzRqqOzD8De1oLhIJ+Ua1HaoyLcn9YIGD56p+AxCi +BgjIIAgz0SctbeSQeo7vVspwSR4kxrQsvTfAaZgvxWSAJc3eHkrucgT/qdAWs0fk +YgWtNXmvmDNo4ZQqfX3rvXPt+ILPB2/pLg/2qfZ5HZRpu355VNO09tzBAoGBAMYH +vgn/MEd02WGonvCTJO7RTvficJkThP1Z4TDBttfjCvbcFalvHM+0nOhRwTCZcS6H +oLXkse6wAVNzQP+2GUT/gmvyqfYM18C2BQm6InqnBBfd2bgH1WP2j76XWuOhw5q/ ++AjtPnFszIhpusR1PSrsA86+ZuIHzd2DGfpshDVBAoGAdYRfbzZjAa9pZE9JA/hv +iur/0qJeMs9Ggz9I0CZUeV3rZDaBlbbB72GU7moSWGuzvdV1LiFD6tv1cIarqtSb +kMpEg2jk9PSJieBiOeWJNce56sms857kPNPkfSni/1lflNCwUjbB7eAPLrGTm/98 +3BpjFGmPmgRxZj7RhrhyG0ECgYB2PxdF5uAQOwC2pLZLVsGd7NOnhsnPTe2CTpH9 +yB4C6SqZ3y78HkHo8KMkwfSGrYj8zLW1BxsMOIKCLvbn+fc60QsypBLCvkZyZv25 +IjEGZgY2rh0cG2lbKFYK61u1QtmG5QwZYHiByAKVjfSc7JiasZVQdTb/zsMpeugf +NX74QQKBgD4441+lWTadLqDFxE/DQ29QPC5JTwjvCs9O0Aq+7StQ+yXQHSVWP8i1 +t/mUkDIntVUu0b75ZfjR55EvbkEOvPj1rtaVBUaPA5hk/6jAvHwJJWr/Dmu7oBbu +ELmFAk8FmoL3RIeEHzqbJZ/FR184TGWi8YmooDDMOOv8pYDRsytj +-----END RSA PRIVATE KEY----- diff --git a/lib/okpush/certs/aps_production_cert.pem b/lib/okpush/certs/aps_production_cert.pem new file mode 100644 index 00000000..e3023909 --- /dev/null +++ b/lib/okpush/certs/aps_production_cert.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIGLDCCBRSgAwIBAgIIGH+Bvy4cPa8wDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTcwMjE4MTYwNDI1WhcNMTgwMzIwMTYwNDI1WjCBnTEkMCIGCgmSJomT8ixk +AQEMFHVzLm9rZm9jLnN0b25laXNsYW5kMTIwMAYDVQQDDClBcHBsZSBQdXNoIFNl +cnZpY2VzOiB1cy5va2ZvYy5zdG9uZWlzbGFuZDETMBEGA1UECwwKQzZKUVRQR0o5 +NzEfMB0GA1UECgwWU3BvcnRzd2VhciBDb21wYW55IFNwYTELMAkGA1UEBhMCVVMw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC079M+Y0+Co/DoU0hCyDoh +TWG0RpSx8buG8xYzGaEt8jNhpFqg376tv7IUcvH2/0u4CjH4IGwyNRV4dHS8jasd +/2hDR8FrF/6GRpYhKnqGCmm09qFASw1GTnrAXFo+HibXJsuJ1iFYInM8MlQ0kNBf +sGThhn63NAgOxWhvBjJm0Ug21LGLTiZmsbLuzm0kpDykT74AXsWjxAmgZ9PD94ki +K7ZXaSFiC3eTWJ5e+XT6j6MH7O68c71+4t85ZrUGjpfLWBzRDPUcAvK2THo1iRMn ++8AlqZ6BwqGMfZnq+6SFrlRFxLJukTZwSODoj/YsrnKlGIZi1AlYALFFQB1N5gIB +AgMBAAGjggJzMIICbzAdBgNVHQ4EFgQUWql0H3SGZzwSKxIGmErlD9vWdvcwDAYD +VR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCARwG +A1UdIASCARMwggEPMIIBCwYJKoZIhvdjZAUBMIH9MIHDBggrBgEFBQcCAjCBtgyB +s1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3Vt +ZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRl +cm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFu +ZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDUGCCsGAQUFBwIB +FilodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eTAwBgNV +HR8EKTAnMCWgI6Ahhh9odHRwOi8vY3JsLmFwcGxlLmNvbS93d2RyY2EuY3JsMA4G +A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAjAQBgoqhkiG92NkBgMB +BAIFADAQBgoqhkiG92NkBgMCBAIFADCBgwYKKoZIhvdjZAYDBgR1MHMMFHVzLm9r +Zm9jLnN0b25laXNsYW5kMAUMA2FwcAwZdXMub2tmb2Muc3RvbmVpc2xhbmQudm9p +cDAGDAR2b2lwDCF1cy5va2ZvYy5zdG9uZWlzbGFuZC5jb21wbGljYXRpb24wDgwM +Y29tcGxpY2F0aW9uMA0GCSqGSIb3DQEBCwUAA4IBAQA/fUg+Q375bqS1fziJt8jw ++b8R7LLARQkMYKsq6/6x5bZJklCllgFR+uy5ahmEvNy+iFDnDW1BL+kkN8rxiwNk +QJDuxFB1cwmeLw5Yw4XF2XRhnmHNuUOA6Q/no84IeBttlFQWnFdWyUUO3dwqWQZf +dvpPesXL6XYmNtFUVMwrtBPjvrVBYsfqbnmPdcr+XETtl7+pv7+A5HaTVhF/eEP3 +q6C1YA412IuccQLJTcTBYUbaGfk5eOcJzRwbfetXW+qE0n/fxiw1esoOoiv22yof +ojLbDM9OPF/zqNfU7+nY5juw5whXDI7lSwUvoYXC80tFf7IdivwPy2DbBonlr0ye +-----END CERTIFICATE----- diff --git a/lib/okpush/certs/aps_production_key.pem b/lib/okpush/certs/aps_production_key.pem new file mode 100644 index 00000000..3fe17b37 --- /dev/null +++ b/lib/okpush/certs/aps_production_key.pem @@ -0,0 +1,71 @@ +Bag Attributes + friendlyName: Apple Push Services: us.okfoc.stoneisland + localKeyID: 5A A9 74 1F 74 86 67 3C 12 2B 12 06 98 4A E5 0F DB D6 76 F7 +subject=/UID=us.okfoc.stoneisland/CN=Apple Push Services: us.okfoc.stoneisland/OU=C6JQTPGJ97/O=Sportswear Company Spa/C=US +issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority +-----BEGIN CERTIFICATE----- +MIIGLDCCBRSgAwIBAgIIGH+Bvy4cPa8wDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTcwMjE4MTYwNDI1WhcNMTgwMzIwMTYwNDI1WjCBnTEkMCIGCgmSJomT8ixk +AQEMFHVzLm9rZm9jLnN0b25laXNsYW5kMTIwMAYDVQQDDClBcHBsZSBQdXNoIFNl +cnZpY2VzOiB1cy5va2ZvYy5zdG9uZWlzbGFuZDETMBEGA1UECwwKQzZKUVRQR0o5 +NzEfMB0GA1UECgwWU3BvcnRzd2VhciBDb21wYW55IFNwYTELMAkGA1UEBhMCVVMw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC079M+Y0+Co/DoU0hCyDoh +TWG0RpSx8buG8xYzGaEt8jNhpFqg376tv7IUcvH2/0u4CjH4IGwyNRV4dHS8jasd +/2hDR8FrF/6GRpYhKnqGCmm09qFASw1GTnrAXFo+HibXJsuJ1iFYInM8MlQ0kNBf +sGThhn63NAgOxWhvBjJm0Ug21LGLTiZmsbLuzm0kpDykT74AXsWjxAmgZ9PD94ki +K7ZXaSFiC3eTWJ5e+XT6j6MH7O68c71+4t85ZrUGjpfLWBzRDPUcAvK2THo1iRMn ++8AlqZ6BwqGMfZnq+6SFrlRFxLJukTZwSODoj/YsrnKlGIZi1AlYALFFQB1N5gIB +AgMBAAGjggJzMIICbzAdBgNVHQ4EFgQUWql0H3SGZzwSKxIGmErlD9vWdvcwDAYD +VR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCARwG +A1UdIASCARMwggEPMIIBCwYJKoZIhvdjZAUBMIH9MIHDBggrBgEFBQcCAjCBtgyB +s1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3Vt +ZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRl +cm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFu +ZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDUGCCsGAQUFBwIB +FilodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eTAwBgNV +HR8EKTAnMCWgI6Ahhh9odHRwOi8vY3JsLmFwcGxlLmNvbS93d2RyY2EuY3JsMA4G +A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAjAQBgoqhkiG92NkBgMB +BAIFADAQBgoqhkiG92NkBgMCBAIFADCBgwYKKoZIhvdjZAYDBgR1MHMMFHVzLm9r +Zm9jLnN0b25laXNsYW5kMAUMA2FwcAwZdXMub2tmb2Muc3RvbmVpc2xhbmQudm9p +cDAGDAR2b2lwDCF1cy5va2ZvYy5zdG9uZWlzbGFuZC5jb21wbGljYXRpb24wDgwM +Y29tcGxpY2F0aW9uMA0GCSqGSIb3DQEBCwUAA4IBAQA/fUg+Q375bqS1fziJt8jw ++b8R7LLARQkMYKsq6/6x5bZJklCllgFR+uy5ahmEvNy+iFDnDW1BL+kkN8rxiwNk +QJDuxFB1cwmeLw5Yw4XF2XRhnmHNuUOA6Q/no84IeBttlFQWnFdWyUUO3dwqWQZf +dvpPesXL6XYmNtFUVMwrtBPjvrVBYsfqbnmPdcr+XETtl7+pv7+A5HaTVhF/eEP3 +q6C1YA412IuccQLJTcTBYUbaGfk5eOcJzRwbfetXW+qE0n/fxiw1esoOoiv22yof +ojLbDM9OPF/zqNfU7+nY5juw5whXDI7lSwUvoYXC80tFf7IdivwPy2DbBonlr0ye +-----END CERTIFICATE----- +Bag Attributes + friendlyName: Julian Laplace + localKeyID: 5A A9 74 1F 74 86 67 3C 12 2B 12 06 98 4A E5 0F DB D6 76 F7 +Key Attributes: +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAtO/TPmNPgqPw6FNIQsg6IU1htEaUsfG7hvMWMxmhLfIzYaRa +oN++rb+yFHLx9v9LuAox+CBsMjUVeHR0vI2rHf9oQ0fBaxf+hkaWISp6hgpptPah +QEsNRk56wFxaPh4m1ybLidYhWCJzPDJUNJDQX7Bk4YZ+tzQIDsVobwYyZtFINtSx +i04mZrGy7s5tJKQ8pE++AF7Fo8QJoGfTw/eJIiu2V2khYgt3k1ieXvl0+o+jB+zu +vHO9fuLfOWa1Bo6Xy1gc0Qz1HALytkx6NYkTJ/vAJamegcKhjH2Z6vukha5URcSy +bpE2cEjg6I/2LK5ypRiGYtQJWACxRUAdTeYCAQIDAQABAoIBAQCbKszDRRGr3II+ +CyX+N446fw0aOClOzRrgKVnRatph98J+qx8Ztaflg27pwIWnJ9s8smmV++At0n5e +NajjBq9H43/7qu7Bs+sQJjqbqL04dHegvJ0e8P4qXCVDEDBH8z2l51xIEb24wpqG +djbmeYZpeXGaQugqntGGMV9VT0AsET3sA+LbhO3klIE5j3C+cWOZWKccMjppCSD+ +iA9c8hGdAt/wOWLQ7R15mvqlZZuSd4mIxgprClPN9/SUnk/w3PM8gXBNV1Vz79Cm +xxiv4BMbobGUtJF/d8vzpSP/M2J5sCc8PhIHjuzhgZTg1pitFdIcxcZxKSW2xYH7 +F51JX1ABAoGBAOnnHNFfj7uZzRqqOzD8De1oLhIJ+Ua1HaoyLcn9YIGD56p+AxCi +BgjIIAgz0SctbeSQeo7vVspwSR4kxrQsvTfAaZgvxWSAJc3eHkrucgT/qdAWs0fk +YgWtNXmvmDNo4ZQqfX3rvXPt+ILPB2/pLg/2qfZ5HZRpu355VNO09tzBAoGBAMYH +vgn/MEd02WGonvCTJO7RTvficJkThP1Z4TDBttfjCvbcFalvHM+0nOhRwTCZcS6H +oLXkse6wAVNzQP+2GUT/gmvyqfYM18C2BQm6InqnBBfd2bgH1WP2j76XWuOhw5q/ ++AjtPnFszIhpusR1PSrsA86+ZuIHzd2DGfpshDVBAoGAdYRfbzZjAa9pZE9JA/hv +iur/0qJeMs9Ggz9I0CZUeV3rZDaBlbbB72GU7moSWGuzvdV1LiFD6tv1cIarqtSb +kMpEg2jk9PSJieBiOeWJNce56sms857kPNPkfSni/1lflNCwUjbB7eAPLrGTm/98 +3BpjFGmPmgRxZj7RhrhyG0ECgYB2PxdF5uAQOwC2pLZLVsGd7NOnhsnPTe2CTpH9 +yB4C6SqZ3y78HkHo8KMkwfSGrYj8zLW1BxsMOIKCLvbn+fc60QsypBLCvkZyZv25 +IjEGZgY2rh0cG2lbKFYK61u1QtmG5QwZYHiByAKVjfSc7JiasZVQdTb/zsMpeugf +NX74QQKBgD4441+lWTadLqDFxE/DQ29QPC5JTwjvCs9O0Aq+7StQ+yXQHSVWP8i1 +t/mUkDIntVUu0b75ZfjR55EvbkEOvPj1rtaVBUaPA5hk/6jAvHwJJWr/Dmu7oBbu +ELmFAk8FmoL3RIeEHzqbJZ/FR184TGWi8YmooDDMOOv8pYDRsytj +-----END RSA PRIVATE KEY----- diff --git a/lib/okpush/index.js b/lib/okpush/index.js index a509c891..2fe59932 100644 --- a/lib/okpush/index.js +++ b/lib/okpush/index.js @@ -6,7 +6,7 @@ var path = require('path') var passport = require('passport') var DigestStrategy = require('passport-http').DigestStrategy; var bodyParser = require('body-parser') -var OKTemplate = require('../../../app/node_modules/oktemplate') +var OKTemplate = require('../../node_modules/okcms/app/node_modules/oktemplate') var apn = require('./apn') var db = require('./db') -- cgit v1.2.3-70-g09d2 From cf85cc2b75b9c3ead3a693b6fa0feeca5b9e70ba Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Sun, 19 Feb 2017 01:23:53 +0100 Subject: counts --- lib/okpush/db.js | 17 +++++++++++++++-- lib/okpush/index.js | 35 +++++++++++++++++++---------------- lib/okpush/templates/index.liquid | 6 ++++-- 3 files changed, 38 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/lib/okpush/db.js b/lib/okpush/db.js index ad18b7b3..f64acf69 100644 --- a/lib/okpush/db.js +++ b/lib/okpush/db.js @@ -77,8 +77,21 @@ function getAllTokens (channel, cb) { function removeToken (data) { PushToken.find(data).remove().exec() } -function getDeviceCount (channel, cb) { - PushToken.count({ channel: channel }, cb) +function getDeviceCount (channels, cb) { + var countz = {} + get_next() + function get_next() { + var channel = channels.pop() + PushToken.count({ channel: channel }, function(err, count){ + countz[channel] = count + if (channels.length) { + return get_next() + } + else { + cb(countz) + } + }) + } } /* notifications */ diff --git a/lib/okpush/index.js b/lib/okpush/index.js index 2fe59932..df9c8265 100644 --- a/lib/okpush/index.js +++ b/lib/okpush/index.js @@ -50,37 +50,40 @@ function OKPush (options) { apn.init(config) db.init(config) - router.use('/admin/', passport.initialize()) +// router.use('/admin/', passport.initialize()) router.use('/public/', express.static(path.join(__dirname, './public'))); // monkeypatch because of app.use(router) .. obnoxious - router.all('/admin/(:path*)?', function (req, res, next) { - req.newUrl = req.url - req.url = req.originalUrl - next() - }) - router.all('/admin/(:path*)?', passport.authenticate('digest', { - session: false - })) - router.all('/admin/(:path*)?', function (req, res, next) { - req.url = req.newUrl - next() - }) +// router.all('/admin/(:path*)?', function (req, res, next) { +// console.log(req.url) +// req.newUrl = req.url +// req.url = req.originalUrl +// next() +// }) +// router.all('/admin/(:path*)?', passport.authenticate('digest', { +// session: false +// })) +// router.all('/admin/(:path*)?', function (req, res, next) { +// req.url = req.newUrl +// next() +// }) // pass in admin middleware! router.get('/admin', function (req, res) { - // change this to get notification counts for each channel db.getNotifications(function(err, notes){ - db.getDeviceCount(function(err, count){ + var channels = Object.keys(config.notifications) + db.getDeviceCount(channels, function(count){ var data = { meta: meta, notifications: config.notifications, - device_count: count, } notes.forEach(function(note){ if (note.key in data.notifications) { data.notifications[ note.key ].last_push = note.last_push } + if (note.key in count) { + data.notifications[ note.key ].count = count[note.key] + } }) templates['index'].render(data).then(function(rendered) { res.send(rendered); diff --git a/lib/okpush/templates/index.liquid b/lib/okpush/templates/index.liquid index 10772b55..1db77a58 100644 --- a/lib/okpush/templates/index.liquid +++ b/lib/okpush/templates/index.liquid @@ -34,13 +34,12 @@ tr:nth-child(2n+1) {

Push Notifications

-
Device count: {{ device_count }}
- + {% for pair in notifications %} @@ -60,6 +59,9 @@ tr:nth-child(2n+1) { {{ spec.last_push | date: "%a %d-%b-%Y %H:%M" }} {% endunless %} + -- cgit v1.2.3-70-g09d2
Key Message Last PushRegistrations
+ {{spec.count}} +