mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-08-01 23:40:25 +00:00
almost got accessControl working, getting errors in createWriteGuard
This commit is contained in:
parent
595ad960f3
commit
71a4430efc
8 changed files with 79 additions and 71 deletions
|
|
@ -19,12 +19,13 @@ helpers = require('./helpers');
|
|||
|
||||
helpers.viewHelpers(view);
|
||||
|
||||
get('/', function(page, model) {
|
||||
var userId;
|
||||
get('/:uidParam?', function(page, model, _arg) {
|
||||
var uidParam, userId;
|
||||
uidParam = _arg.uidParam;
|
||||
userId = model.get('_userId');
|
||||
return model.fetch("users." + userId, function(err, user) {
|
||||
var guid, newUser, task, _i, _len, _ref1;
|
||||
if (user == null) {
|
||||
if (!user.get('id')) {
|
||||
newUser = schema.userSchema;
|
||||
_ref1 = content.defaultTasks;
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
// Generated by CoffeeScript 1.3.3
|
||||
var ONE_YEAR, app, customMiddleware, derby, express, expressApp, gzippo, http, path, publicPath, racer, root, server, serverError, store,
|
||||
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
var ONE_YEAR, app, customMiddleware, derby, express, expressApp, gzippo, http, path, publicPath, racer, root, server, serverError, store;
|
||||
|
||||
http = require('http');
|
||||
|
||||
|
|
@ -38,7 +37,7 @@ store = derby.createStore({
|
|||
listen: server
|
||||
});
|
||||
|
||||
require('./queries')(store);
|
||||
require('./setupStore').accessControl(store);
|
||||
|
||||
ONE_YEAR = 1000 * 60 * 60 * 24 * 365;
|
||||
|
||||
|
|
@ -46,31 +45,20 @@ root = path.dirname(path.dirname(__dirname));
|
|||
|
||||
publicPath = path.join(root, 'public');
|
||||
|
||||
customMiddleware = function(req, res, next) {
|
||||
var acceptableUid, model, uidParam, _i, _results;
|
||||
model = req.getModel();
|
||||
model.set('_mobileDevice', /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent')));
|
||||
uidParam = req.url.split('/')[1];
|
||||
acceptableUid = require('Guid').isGuid(uidParam) || (__indexOf.call((function() {
|
||||
_results = [];
|
||||
for (_i = 0; _i <= 40; _i++){ _results.push(_i); }
|
||||
return _results;
|
||||
}).apply(this), uidParam) >= 0);
|
||||
if (acceptableUid && model.session.userId !== uidParam) {
|
||||
model.fetch("users." + uidParam, function(err, user) {
|
||||
console.log({
|
||||
uidParam: uidParam,
|
||||
split: req.url.split('/'),
|
||||
err: err,
|
||||
user: user
|
||||
});
|
||||
if (!user.get('id')) {
|
||||
model.set('_userId', uidParam);
|
||||
return model.session.userId = uidParam;
|
||||
}
|
||||
});
|
||||
}
|
||||
return next();
|
||||
customMiddleware = function(that) {
|
||||
return function(req, res, next) {
|
||||
var acceptableUid, model, uidParam;
|
||||
model = req.getModel();
|
||||
model.set('_mobileDevice', /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent')));
|
||||
uidParam = req.url.split('/')[1];
|
||||
acceptableUid = require('Guid').isGuid(uidParam) || (uidParam === '3' || uidParam === '4' || uidParam === '9');
|
||||
if (acceptableUid && model.session.userId !== uidParam) {
|
||||
model.set('_userId', uidParam);
|
||||
model.session.userId = uidParam;
|
||||
}
|
||||
next();
|
||||
return that;
|
||||
};
|
||||
};
|
||||
|
||||
expressApp.use(express.favicon()).use(gzippo.staticGzip(publicPath, {
|
||||
|
|
@ -80,7 +68,7 @@ expressApp.use(express.favicon()).use(gzippo.staticGzip(publicPath, {
|
|||
cookie: {
|
||||
maxAge: ONE_YEAR
|
||||
}
|
||||
})).use(store.modelMiddleware()).use(customMiddleware).use(app.router()).use(expressApp.router).use(serverError(root));
|
||||
})).use(store.modelMiddleware()).use(customMiddleware(this)).use(app.router()).use(expressApp.router).use(serverError(root));
|
||||
|
||||
expressApp.all('*', function(req) {
|
||||
throw "404: " + req.url;
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
// Generated by CoffeeScript 1.3.3
|
||||
|
||||
module.exports = function(store) {
|
||||
return store.query.expose('users', 'withId', function(id) {
|
||||
return this.byId(id);
|
||||
});
|
||||
};
|
||||
19
lib/server/setupStore.js
Normal file
19
lib/server/setupStore.js
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Generated by CoffeeScript 1.3.3
|
||||
|
||||
module.exports.queries = function(store) {
|
||||
return store.query.expose('users', 'withId', function(id) {
|
||||
return this.byId(id);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports.accessControl = function(store) {
|
||||
store.accessControl = true;
|
||||
store.readPathAccess('users.*', function(userId, accept) {
|
||||
console.log(accept, 'read.accept');
|
||||
return accept(userId === this.session.userId);
|
||||
});
|
||||
return store.writeAccess('*', 'users.*', function(mutator, userId, accept) {
|
||||
console.log(accept, 'write.accept');
|
||||
return accept(userId === this.session.userId);
|
||||
});
|
||||
};
|
||||
|
|
@ -12,7 +12,7 @@ helpers.viewHelpers(view)
|
|||
|
||||
# ========== ROUTES ==========
|
||||
|
||||
get '/', (page, model) ->
|
||||
get '/:uidParam?', (page, model, {uidParam}) ->
|
||||
|
||||
# Current browser session
|
||||
# The session middleware will assign a _userId automatically
|
||||
|
|
@ -21,7 +21,7 @@ get '/', (page, model) ->
|
|||
model.fetch "users.#{userId}", (err, user) ->
|
||||
|
||||
# Else, select a new userId and initialize user
|
||||
unless user?
|
||||
unless user.get('id')
|
||||
newUser = schema.userSchema
|
||||
for task in content.defaultTasks
|
||||
guid = task.id = require('derby/node_modules/racer').uuid()
|
||||
|
|
@ -33,15 +33,6 @@ get '/', (page, model) ->
|
|||
when 'reward' then newUser.rewardIds.push guid
|
||||
model.set "users.#{userId}", newUser
|
||||
|
||||
# #TODO these *Access functions aren't being called, why?
|
||||
# model.store.accessControl = true
|
||||
# model.store.readPathAccess 'users.*', (id, accept) ->
|
||||
# console.log "model.writeAccess called with id:#{id}" # never called
|
||||
# accept(id == userId)
|
||||
# model.store.writeAccess '*', 'users.*', (id, accept) ->
|
||||
# console.log "model.writeAccess called with id:#{id}" # never called
|
||||
# accept(id == userId)
|
||||
|
||||
getHabits(page, model, userId)
|
||||
|
||||
getHabits = (page, model, userId) ->
|
||||
|
|
|
|||
|
|
@ -24,28 +24,30 @@ derby.use(require 'racer-db-mongo')
|
|||
store = derby.createStore
|
||||
db: {type: 'Mongo', uri: process.env.NODE_DB_URI}
|
||||
listen: server
|
||||
require('./queries')(store)
|
||||
require('./setupStore').accessControl(store)
|
||||
|
||||
ONE_YEAR = 1000 * 60 * 60 * 24 * 365
|
||||
root = path.dirname path.dirname __dirname
|
||||
publicPath = path.join root, 'public'
|
||||
|
||||
customMiddleware = (req, res, next) ->
|
||||
# Setup for mobile-device customizations
|
||||
model = req.getModel()
|
||||
model.set '_mobileDevice', /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header 'User-Agent')
|
||||
|
||||
# PURL pseudo-auth: Previously saved session (eg, http://localhost/{guid}) (temporary solution until authentication built)
|
||||
uidParam = req.url.split('/')[1]
|
||||
acceptableUid = require('Guid').isGuid(uidParam) or (uidParam in [0..40])
|
||||
if acceptableUid and model.session.userId!=uidParam
|
||||
model.fetch "users.#{uidParam}", (err, user) ->
|
||||
console.log {uidParam:uidParam, split:req.url.split('/'), err:err, user:user}
|
||||
unless user.get('id')
|
||||
model.set '_userId', uidParam # set for this request
|
||||
model.session.userId = uidParam # and for next requests
|
||||
|
||||
next()
|
||||
customMiddleware = (that) ->
|
||||
return (req, res, next) ->
|
||||
# Setup for mobile-device customizations
|
||||
model = req.getModel()
|
||||
model.set '_mobileDevice', /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header 'User-Agent')
|
||||
|
||||
uidParam = req.url.split('/')[1]
|
||||
# PURL pseudo-auth: Previously saved session (eg, http://localhost/{guid}) (temporary solution until authentication built)
|
||||
acceptableUid = require('Guid').isGuid(uidParam) or (uidParam in ['3','4','9'])
|
||||
if acceptableUid and model.session.userId!=uidParam
|
||||
##FIXME why isn't this working?
|
||||
# model.fetch "users.#{uidParam}", (err, user) ->
|
||||
# console.log {uidParam:uidParam, split:req.url.split('/'), err:err, user:user}
|
||||
# unless user.get('id')
|
||||
model.set '_userId', uidParam # set for this request
|
||||
model.session.userId = uidParam # and for next requests
|
||||
next()
|
||||
return that
|
||||
|
||||
expressApp
|
||||
.use(express.favicon())
|
||||
|
|
@ -70,7 +72,7 @@ expressApp
|
|||
.use(store.modelMiddleware())
|
||||
# Middelware can be inserted after the modelMiddleware and before
|
||||
# the app router to pass server accessible data to a model
|
||||
.use(customMiddleware)
|
||||
.use(customMiddleware(this))
|
||||
# Creates an express middleware from the app's routes
|
||||
.use(app.router())
|
||||
.use(expressApp.router)
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = (store) ->
|
||||
store.query.expose 'users', 'withId', (id) ->
|
||||
@byId(id)
|
||||
17
src/server/setupStore.coffee
Normal file
17
src/server/setupStore.coffee
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# expose query motifs
|
||||
module.exports.queries = (store) ->
|
||||
store.query.expose 'users', 'withId', (id) ->
|
||||
@byId(id)
|
||||
|
||||
# setup accessControl
|
||||
module.exports.accessControl = (store) ->
|
||||
|
||||
store.accessControl = true
|
||||
|
||||
store.readPathAccess 'users.*', (userId, accept) ->
|
||||
console.log accept, 'read.accept'
|
||||
accept(userId == @session.userId)
|
||||
|
||||
store.writeAccess '*', 'users.*', (mutator, userId, accept) ->
|
||||
console.log accept, 'write.accept'
|
||||
accept(userId == @session.userId)
|
||||
Loading…
Reference in a new issue