2013-02-21 22:06:22 +00:00
|
|
|
derbyAuth = require('derby-auth/store')
|
|
|
|
|
|
2013-01-25 19:18:17 +00:00
|
|
|
###
|
|
|
|
|
Setup read / write access
|
|
|
|
|
@param store
|
|
|
|
|
###
|
2013-02-05 05:20:58 +00:00
|
|
|
|
|
|
|
|
module.exports.customAccessControl = (store) ->
|
2013-02-06 02:09:09 +00:00
|
|
|
userAccess(store)
|
|
|
|
|
partySystem(store)
|
|
|
|
|
REST(store)
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-06 02:09:09 +00:00
|
|
|
###
|
|
|
|
|
General user access
|
|
|
|
|
###
|
|
|
|
|
userAccess = (store) ->
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
store.readPathAccess "users.*", -> # captures, accept, err ->
|
2013-02-21 22:06:22 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
|
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
accept = arguments[arguments.length - 2]
|
2013-02-06 19:57:12 +00:00
|
|
|
uid = arguments[0]
|
2013-02-13 16:21:36 +00:00
|
|
|
accept (uid is @session.userId) or @session.req?._isServer
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
store.writeAccess "*", "users.*", -> # captures, value, accept, err ->
|
2013-02-21 22:06:22 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
|
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
accept = arguments[arguments.length-2]
|
2013-02-06 19:57:12 +00:00
|
|
|
captures = arguments[0].split('.')
|
2013-02-05 05:20:58 +00:00
|
|
|
uid = captures.shift()
|
|
|
|
|
attrPath = captures.join('.') # new array shifted left, after shift() was run
|
|
|
|
|
|
|
|
|
|
# public access to users.*.party.invitation (TODO, lock down a bit more)
|
2013-02-06 02:09:09 +00:00
|
|
|
if (attrPath == 'party.invitation')
|
2013-02-13 16:21:36 +00:00
|
|
|
return accept(true)
|
2013-02-05 05:20:58 +00:00
|
|
|
|
|
|
|
|
# Same session (user.id = this.session.userId)
|
2013-02-06 02:28:05 +00:00
|
|
|
if (uid is @session.userId) or @session.req?._isServer
|
2013-02-13 16:21:36 +00:00
|
|
|
return accept(true)
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
accept(false)
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
store.writeAccess "*", "users.*.balance", (id, newBalance, accept, err) ->
|
2013-02-21 22:06:22 +00:00
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
|
|
|
|
|
2013-02-16 16:23:28 +00:00
|
|
|
oldBalance = @session.req?._racerModel?.get("users.#{id}.balance") || 0
|
2013-02-06 02:09:09 +00:00
|
|
|
purchasingSomethingOnClient = newBalance < oldBalance
|
2013-02-13 16:21:36 +00:00
|
|
|
accept(purchasingSomethingOnClient or @session.req?._isServer)
|
2013-01-25 19:18:17 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
store.writeAccess "*", "users.*.flags.ads", -> # captures, value, accept, err ->
|
2013-02-21 22:06:22 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
|
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
accept(@session.req?._isServer)
|
2013-02-06 02:09:09 +00:00
|
|
|
|
2013-01-30 20:57:36 +00:00
|
|
|
|
2013-02-06 02:09:09 +00:00
|
|
|
###
|
|
|
|
|
REST
|
|
|
|
|
Get user with API token
|
|
|
|
|
###
|
|
|
|
|
REST = (store) ->
|
2013-02-21 22:06:22 +00:00
|
|
|
store.query.expose "users", "withIdAndToken", (uid, token) ->
|
|
|
|
|
@byId(uid)
|
|
|
|
|
.where('apiToken').equals(token)
|
|
|
|
|
.one
|
2013-01-30 20:57:36 +00:00
|
|
|
|
2013-02-21 22:06:22 +00:00
|
|
|
store.queryAccess "users", "withIdAndToken", (uid, token, accept, err) ->
|
|
|
|
|
return accept(true) if uid && token
|
|
|
|
|
accept(false) # only user has id & token
|
2013-02-06 02:09:09 +00:00
|
|
|
|
2013-01-30 21:10:57 +00:00
|
|
|
|
2013-02-06 02:09:09 +00:00
|
|
|
###
|
|
|
|
|
Party permissions
|
|
|
|
|
###
|
|
|
|
|
partySystem = (store) ->
|
2013-02-04 19:10:20 +00:00
|
|
|
store.query.expose "users", "party", (ids) ->
|
2013-01-30 21:10:57 +00:00
|
|
|
@where("id").within(ids)
|
2013-02-05 05:20:58 +00:00
|
|
|
.only('stats',
|
|
|
|
|
'items',
|
|
|
|
|
'party',
|
2013-02-08 20:18:15 +00:00
|
|
|
'preferences',
|
2013-02-05 05:20:58 +00:00
|
|
|
'auth.local.username',
|
|
|
|
|
'auth.facebook.displayName')
|
2013-01-30 21:10:57 +00:00
|
|
|
|
2013-02-13 16:21:36 +00:00
|
|
|
store.queryAccess "users", "party", (ids, accept, err) ->
|
2013-02-22 02:06:29 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
2013-02-13 16:21:36 +00:00
|
|
|
accept(true) # no harm in public user stats
|
2013-02-05 05:20:58 +00:00
|
|
|
|
2013-02-05 06:37:13 +00:00
|
|
|
store.query.expose "parties", "withId", (id) ->
|
|
|
|
|
@where("id").equals(id)
|
2013-02-13 16:21:36 +00:00
|
|
|
store.queryAccess "parties", "withId", (id, accept, err) ->
|
2013-02-22 02:06:29 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
2013-02-13 16:21:36 +00:00
|
|
|
accept(true)
|
2013-02-05 06:37:13 +00:00
|
|
|
|
2013-02-05 05:20:58 +00:00
|
|
|
store.readPathAccess "parties.*", ->
|
2013-02-13 16:21:36 +00:00
|
|
|
accept = arguments[arguments.length-2]
|
|
|
|
|
accept(true)
|
2013-02-05 05:20:58 +00:00
|
|
|
|
|
|
|
|
store.writeAccess "*", "parties.*", ->
|
2013-02-22 02:06:29 +00:00
|
|
|
err = arguments[arguments.length - 1]
|
|
|
|
|
return err(derbyAuth.SESSION_INVALIDATED_ERROR) if derbyAuth.sessionInvalidated(@)
|
2013-02-13 16:21:36 +00:00
|
|
|
accept = arguments[arguments.length-2]
|
2013-02-21 22:06:22 +00:00
|
|
|
accept(true)
|