examples updated to new dynamic module sandbox. UI improvements

This commit is contained in:
Dominic Bosch 2014-04-17 18:19:40 +02:00
parent 2c3ac8d24d
commit a68b27c0c7
24 changed files with 385 additions and 345 deletions

View file

@ -318,12 +318,13 @@ commandFunctions =
# if action module params were send, store them
oParams = oPayload.action_params
db.actionInvokers.storeUserParams id, user.username, JSON.stringify params for id, params of oParams
for id, params of oParams
db.actionInvokers.storeUserParams id, user.username, JSON.stringify params
oParams = oPayload.action_functions
# if action function arguments were send, store them
for id, params of oParams
arr = id.split ' -> '
db.actionInvokers.storeUserArguments arr[ 0 ], arr[ 1 ], user.username, JSON.stringify params
db.actionInvokers.storeUserArguments user.username, rule.id, arr[ 0 ], arr[ 1 ], JSON.stringify params
# Initialize the rule log
db.resetLog user.username, rule.id

View file

@ -153,13 +153,14 @@ fTryToLoadModule = ( userId, ruleId, modId, src, dbMod, params, cb ) =>
oFuncArgs = {}
for func of oFuncParams
dbMod.getUserArguments modId, func, userId, ( err, obj ) =>
dbMod.getUserArguments userId, ruleId, modId, func, ( err, obj ) =>
if obj
try
oDecrypted = cryptico.decrypt obj, @oPrivateRSAkey
oFuncArgs[ func ] = JSON.parse oDecrypted.plaintext
@log.info "DM | Found and attached user-specific arguments to #{ userId }, #{ ruleId }, #{ modId }"
catch err
@log.warn "DM | Error during parsing of user defined params for #{ userId }, #{ ruleId }, #{ modId }"
@log.warn "DM | Error during parsing of user-specific arguments for #{ userId }, #{ ruleId }, #{ modId }"
@log.warn err
cb
answ: answ

View file

@ -49,6 +49,7 @@ process.on 'disconnect', () ->
# If the process receives a message it is concerning the rules
process.on 'message', ( msg ) ->
log.info "EP | Got info about new rule: #{ msg.event }"
# Let's split the event string to find module and function in an array
@ -87,17 +88,17 @@ fLoadModule = ( msg ) ->
if not listUserModules[msg.user]
listUserModules[msg.user] = {}
iv = msg.rule.interval * 60 * 1000
iv = msg.rule.event_interval * 60 * 1000
# We open up a new object for the rule it
listUserModules[msg.user][msg.rule.id] =
id: msg.rule.event
pollfunc: arrName[1]
interval: iv
event_interval: iv
module: result.module
logger: result.logger
log.info "EP | New event module '#{ arrName[0] }' loaded for user #{ msg.user },
in rule #{ msg.rule.id }, polling every #{ iv } minutes"
in rule #{ msg.rule.id }, polling every #{ msg.rule.event_interval } minutes"
setTimeout fCheckAndRun( msg.user, msg.rule.id ), iv
if msg.event is 'new' or
@ -107,12 +108,13 @@ fLoadModule = ( msg ) ->
fCheckAndRun = ( userId, ruleId ) ->
() ->
log.info "EP | Check and run user #{ userId }, rule #{ ruleId }"
if isRunning and
listUserModules[userId] and
listUserModules[userId][ruleId]
oRule = listUserModules[userId][ruleId]
fCallFunction userId, ruleId, oRule
setTimeout fCheckAndRun( userId, ruleId ), oRule.interval
setTimeout fCheckAndRun( userId, ruleId ), oRule.event_interval
# We have to register the poll function in belows anonymous function
# because we're fast iterating through the listUserModules and references will
@ -127,26 +129,30 @@ fCallFunction = ( userId, ruleId, oRule ) ->
catch err
log.info "EP | ERROR in module when polled: #{ oRule.id } #{ userId }: #{err.message}"
oRule.logger err.message
# ###
# This function will loop infinitely every 10 seconds until isRunning is set to false
###
This function will loop infinitely every 10 seconds until isRunning is set to false
# @private pollLoop()
# ###
# pollLoop = () ->
# # We only loop if we're running
# if isRunning
@private pollLoop()
###
pollLoop = () ->
# We only loop if we're running
if isRunning
# # Go through all users
# for userName, oRules of listUserModules
# # Go through each of the users modules
# for ruleName, myRule of oRules
# # Call the event poller module function
# fCallFunction myRule, ruleName, userName
# setTimeout pollLoop, 10000
#FIXME a scheduler should go here because we are limited in setTimeout
# to an integer value -> ~24 days at maximum!
# # Finally if everything initialized we start polling for new events
# pollLoop()
# # Go through all users
# for userName, oRules of listUserModules
# # Go through each of the users modules
# for ruleName, myRule of oRules
# # Call the event poller module function
# fCallFunction myRule, ruleName, userName
setTimeout pollLoop, 10000
# Finally if everything initialized we start polling for new events
pollLoop()

View file

@ -217,45 +217,45 @@ class IndexedModules
storeModule: ( userId, oModule ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeModule( #{ userId }, oModule )"
@db.sadd "#{ @setname }s", oModule.id,
replyHandler "sadd '#{ oModule.id }' to '#{ @setname }'"
replyHandler "sadd '#{ @setname }s' -> '#{ oModule.id }'"
@db.hmset "#{ @setname }:#{ oModule.id }", oModule,
replyHandler "hmset properties in hash '#{ @setname }:#{ oModule.id }'"
replyHandler "hmset '#{ @setname }:#{ oModule.id }' -> [oModule]"
@linkModule oModule.id, userId
#TODO add testing
linkModule: ( mId, userId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.linkModule( #{ mId }, #{ userId } )"
@db.sadd "#{ @setname }:#{ mId }:users", userId,
replyHandler "sadd #{ userId } to '#{ @setname }:#{ mId }:users'"
replyHandler "sadd '#{ @setname }:#{ mId }:users' -> '#{ userId }'"
@db.sadd "user:#{ userId }:#{ @setname }s", mId,
replyHandler "sadd #{ mId } to 'user:#{ userId }:#{ @setname }s'"
replyHandler "sadd 'user:#{ userId }:#{ @setname }s' -> #{ mId }"
#TODO add testing
unlinkModule: ( mId, userId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.unlinkModule( #{ mId }, #{ userId } )"
@db.srem "#{ @setname }:#{ mId }:users", userId,
replyHandler "srem #{ userId } from '#{ @setname }:#{ mId }:users'"
replyHandler "srem '#{ @setname }:#{ mId }:users' -> #{ userId }"
@db.srem "user:#{ userId }:#{ @setname }s", mId,
replyHandler "srem #{ mId } from 'user:#{ userId }:#{ @setname }s'"
replyHandler "srem 'user:#{ userId }:#{ @setname }s' -> #{ mId }"
#TODO add testing
publish: ( mId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.publish( #{ mId } )"
@db.sadd "public-#{ @setname }s", mId,
replyHandler "sadd '#{ mId }' to 'public-#{ @setname }s'"
replyHandler "sadd 'public-#{ @setname }s' -> '#{ mId }'"
#TODO add testing
unpublish: ( mId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.unpublish( #{ mId } )"
@db.srem "public-#{ @setname }s", mId,
replyHandler "srem '#{ mId }' from 'public-#{ @setname }s'"
replyHandler "srem 'public-#{ @setname }s' -> '#{ mId }'"
getModule: ( mId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getModule( #{ mId } )"
@db.hgetall "#{ @setname }:#{ mId }", cb
getModuleField: ( mId, field, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getModule( #{ mId } )"
@log.info "DB | (IdxedMods) #{ @setname }.getModuleField( #{ mId }, #{ field } )"
@db.hget "#{ @setname }:#{ mId }", field, cb
#TODO add testing
@ -265,7 +265,7 @@ class IndexedModules
#TODO add testing
getAvailableModuleIds: ( userId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getPublicModuleIds( #{ userId } )"
@log.info "DB | (IdxedMods) #{ @setname }.getAvailableModuleIds( #{ userId } )"
@db.sunion "public-#{ @setname }s", "user:#{ userId }:#{ @setname }s", cb
getModuleIds: ( cb ) =>
@ -279,14 +279,18 @@ class IndexedModules
deleteModule: ( mId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.deleteModule( #{ mId } )"
@db.srem "#{ @setname }s", mId,
replyHandler "srem '#{ mId }' from #{ @setname }s"
replyHandler "srem '#{ @setname }s' -> '#{ mId }'"
@db.del "#{ @setname }:#{ mId }",
replyHandler "del of '#{ @setname }:#{ mId }'"
replyHandler "del '#{ @setname }:#{ mId }'"
@unpublish mId
@db.smembers "#{ @setname }:#{ mId }:users", ( err, obj ) =>
@unlinkModule mId, userId for userId in obj
@deleteUserParams mId, userId for userId in obj
@deleteUserArguments mId, userId for userId in obj
for userId in obj
@unlinkModule mId, userId
@deleteUserParams mId, userId
exports.getUserLinkedRules userId, ( err, obj ) =>
for rule in obj
@getUserArgumentsFunctions userId, rule, mId, ( err, obj ) =>
@deleteUserArguments userId, rule, mId
###
Stores user params for a module. They are expected to be RSA encrypted with helps of
@ -300,9 +304,9 @@ class IndexedModules
storeUserParams: ( mId, userId, encData ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeUserParams( #{ mId }, #{ userId }, encData )"
@db.sadd "#{ @setname }-params", "#{ mId }:#{ userId }",
replyHandler "sadd '#{ mId }:#{ userId }' to '#{ @setname }-params'"
replyHandler "sadd '#{ @setname }-params' -> '#{ mId }:#{ userId }'"
@db.set "#{ @setname }-params:#{ mId }:#{ userId }", encData,
replyHandler "set user params in '#{ @setname }-params:#{ mId }:#{ userId }'"
replyHandler "set '#{ @setname }-params:#{ mId }:#{ userId }' -> [encData]"
getUserParams: ( mId, userId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getUserParams( #{ mId }, #{ userId } )"
@ -313,9 +317,9 @@ class IndexedModules
@db.smembers "#{ @setname }-params", cb
deleteUserParams: ( mId, userId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.deleteUserParams(#{ mId }, #{ userId } )"
@log.info "DB | (IdxedMods) #{ @setname }.deleteUserParams( #{ mId }, #{ userId } )"
@db.srem "#{ @setname }-params", "#{ mId }:#{ userId }",
replyHandler "srem '#{ mId }:#{ userId }' from '#{ @setname }-params'"
replyHandler "srem '#{ @setname }-params' -> '#{ mId }:#{ userId }'"
@db.del "#{ @setname }-params:#{ mId }:#{ userId }",
replyHandler "del '#{ @setname }-params:#{ mId }:#{ userId }'"
@ -323,28 +327,34 @@ class IndexedModules
Stores user arguments for a function within a module. They are expected to be RSA encrypted with helps of
the provided cryptico JS library and will only be decrypted right before the module is loaded!
@private storeUserArguments( *mId, userId, encData* )
@param {String} mId
@private storeUserArguments( *userId, ruleId, mId, funcId, encData* )
@param {String} userId
@param {String} ruleId
@param {String} mId
@param {String} funcId
@param {object} encData
###
storeUserArguments: ( mId, funcId, userId, encData ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeUserArguments( #{ mId }, #{ funcId }, #{ userId }, encData )"
@db.sadd "#{ @setname }:#{ mId }:#{ userId }:functions", funcId,
replyHandler "sadd '#{ funcId }' to '#{ @setname }:#{ mId }:#{ userId }:functions'"
@db.set "#{ @setname }:#{ mId }:#{ userId }:function:#{ funcId }", encData,
replyHandler "set user params in '#{ @setname }:#{ mId }:#{ userId }:function:#{ func }'"
storeUserArguments: ( userId, ruleId, mId, funcId, encData ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeUserArguments( #{ userId }, #{ ruleId }, #{ mId }, #{ funcId }, encData )"
@db.sadd "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", funcId,
replyHandler "sadd '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions' -> '#{ funcId }'"
@db.set "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }", encData,
replyHandler "set '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }' -> [encData]"
getUserArguments: ( mId, funcId, userId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getUserArguments( #{ mId }, #{ funcId }, #{ userId } )"
@db.get "#{ @setname }:#{ mId }:#{ userId }:function:#{ funcId }", cb
getUserArgumentsFunctions: ( userId, ruleId, mId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getUserArgumentsFunctions( #{ userId }, #{ ruleId }, #{ mId } )"
@db.get "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", cb
deleteUserArguments: ( mId, userId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.deleteUserArguments(#{ mId }, #{ userId } )"
@db.smembers "#{ @setname }:#{ mId }:#{ userId }:functions", ( err, obj ) =>
getUserArguments: ( userId, ruleId, mId, funcId, cb ) =>
@log.info "DB | (IdxedMods) #{ @setname }.getUserArguments( #{ userId }, #{ ruleId }, #{ mId }, #{ funcId } )"
@db.get "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }", cb
deleteUserArguments: ( userId, ruleId, mId ) =>
@log.info "DB | (IdxedMods) #{ @setname }.deleteUserArguments( #{ userId }, #{ ruleId }, #{ mId } )"
@db.smembers "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", ( err, obj ) =>
for func in obj
@db.del "#{ @setname }:#{ mId }:#{ userId }:function:#{ func }",
replyHandler "del '#{ @setname }:#{ mId }:#{ userId }:function:#{ func }'"
@db.del "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ func }",
replyHandler "del '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ func }'"
###
@ -394,7 +404,7 @@ Query the DB for a rule and pass it to cb(err, obj).
@param {function} cb
###
exports.getRule = ( ruleId, cb ) =>
@log.info "DB | get: 'rule:#{ ruleId }'"
@log.info "DB | getRule( '#{ ruleId }' )"
@db.get "rule:#{ ruleId }", cb
###
@ -425,11 +435,11 @@ Store a string representation of a rule in the DB.
@param {String} data
###
exports.storeRule = ( ruleId, data ) =>
@log.info "DB | storeRule: '#{ ruleId }'"
@log.info "DB | storeRule( '#{ ruleId }' )"
@db.sadd 'rules', "#{ ruleId }",
replyHandler "sadd rules: '#{ ruleId }'"
replyHandler "sadd 'rules' -> '#{ ruleId }'"
@db.set "rule:#{ ruleId }", data,
replyHandler "set 'rule:#{ ruleId }': data"
replyHandler "set 'rule:#{ ruleId }' -> [data]"
###
Delete a string representation of a rule.
@ -439,26 +449,27 @@ Delete a string representation of a rule.
@param {String} userId
###
exports.deleteRule = ( ruleId ) =>
@log.info "DB | deleteRule: '#{ ruleId }'"
@db.srem "rules", ruleId, replyHandler "srem 'rules': '#{ ruleId }'"
@db.del "rule:#{ ruleId }", replyHandler "del: 'rule:#{ ruleId }'"
@log.info "DB | deleteRule( '#{ ruleId }' )"
@db.srem "rules", ruleId, replyHandler "srem 'rules' -> '#{ ruleId }'"
@db.del "rule:#{ ruleId }", replyHandler "del 'rule:#{ ruleId }'"
# We also need to delete all references in linked and active users
@db.smembers "rule:#{ ruleId }:users", ( err, obj ) =>
delLinkedUserRule = ( userId ) =>
exports.resetLog userId, ruleId
@db.srem "user:#{ userId }:rules", ruleId,
replyHandler "srem 'user:#{ userId }:rules': '#{ ruleId }'"
replyHandler "srem 'user:#{ userId }:rules' -> '#{ ruleId }'"
delLinkedUserRule id for id in obj
@db.del "rule:#{ ruleId }:users", replyHandler "del 'rule:#{ ruleId }:users'"
@db.smembers "rule:#{ ruleId }:active-users", ( err, obj ) =>
delActiveUserRule = ( userId ) =>
@db.srem "user:#{ userId }:active-rules", ruleId,
replyHandler "srem 'user:#{ userId }:active-rules': '#{ ruleId }'"
replyHandler "srem 'user:#{ userId }:active-rules' -> '#{ ruleId }'"
delActiveUserRule id for id in obj
@db.del "rule:#{ ruleId }:active-users",
replyHandler "del 'rule:#{ ruleId }:active-users'"
#TODO remove module links and params and arguments
###
Associate a rule to a user.
@ -470,9 +481,9 @@ Associate a rule to a user.
exports.linkRule = ( ruleId, userId ) =>
@log.info "DB | linkRule: '#{ ruleId }' to user '#{ userId }'"
@db.sadd "rule:#{ ruleId }:users", userId,
replyHandler "sadd 'rule:#{ ruleId }:users': '#{ userId }'"
replyHandler "sadd 'rule:#{ ruleId }:users' -> '#{ userId }'"
@db.sadd "user:#{ userId }:rules", ruleId,
replyHandler "sadd 'user:#{ userId }:rules': '#{ ruleId }'"
replyHandler "sadd 'user:#{ userId }:rules' -> '#{ ruleId }'"
###
Get rules linked to a user and hand it to cb(err, obj).
@ -482,7 +493,7 @@ Get rules linked to a user and hand it to cb(err, obj).
@param {function} cb
###
exports.getUserLinkedRules = ( userId, cb ) =>
@log.info "DB | getUserLinkedRules: 'user:#{ userId }:rules'"
@log.info "DB | getUserLinkedRules: smembers 'user:#{ userId }:rules'"
@db.smembers "user:#{ userId }:rules", cb
###
@ -493,7 +504,7 @@ Get users linked to a rule and hand it to cb(err, obj).
@param {function} cb
###
exports.getRuleLinkedUsers = ( ruleId, cb ) =>
@log.info "DB | getRuleLinkedUsers: 'rule:#{ ruleId }:users'"
@log.info "DB | getRuleLinkedUsers: smembers 'rule:#{ ruleId }:users'"
@db.smembers "rule:#{ ruleId }:users", cb
###
@ -506,9 +517,9 @@ Delete an association of a rule to a user.
exports.unlinkRule = ( ruleId, userId ) =>
@log.info "DB | unlinkRule: '#{ ruleId }:#{ userId }'"
@db.srem "rule:#{ ruleId }:users", userId,
replyHandler "srem 'rule:#{ ruleId }:users': '#{ userId }'"
replyHandler "srem 'rule:#{ ruleId }:users' -> '#{ userId }'"
@db.srem "user:#{ userId }:rules", ruleId,
replyHandler "srem 'user:#{ userId }:rules': '#{ ruleId }'"
replyHandler "srem 'user:#{ userId }:rules' -> '#{ ruleId }'"
###
Activate a rule.
@ -520,9 +531,9 @@ Activate a rule.
exports.activateRule = ( ruleId, userId ) =>
@log.info "DB | activateRule: '#{ ruleId }' for '#{ userId }'"
@db.sadd "rule:#{ ruleId }:active-users", userId,
replyHandler "sadd 'rule:#{ ruleId }:active-users': '#{ userId }'"
replyHandler "sadd 'rule:#{ ruleId }:active-users' -> '#{ userId }'"
@db.sadd "user:#{ userId }:active-rules", ruleId,
replyHandler "sadd 'user:#{ userId }:active-rules': '#{ ruleId }'"
replyHandler "sadd 'user:#{ userId }:active-rules' -> '#{ ruleId }'"
###
Get rules activated for a user and hand it to cb(err, obj).
@ -556,7 +567,7 @@ Deactivate a rule.
exports.deactivateRule = ( ruleId, userId ) =>
@log.info "DB | deactivateRule: '#{ ruleId }' for '#{ userId }'"
@db.srem "rule:#{ ruleId }:active-users", userId,
replyHandler "srem 'rule:#{ ruleId }:active-users': '#{ userId }'"
replyHandler "srem 'rule:#{ ruleId }:active-users' -> '#{ userId }'"
@db.srem "user:#{ userId }:active-rules", ruleId,
replyHandler "srem 'user:#{ userId }:active-rules' '#{ ruleId }'"
@ -598,10 +609,10 @@ exports.storeUser = ( objUser ) =>
@log.info "DB | storeUser: '#{ objUser.username }'"
if objUser and objUser.username and objUser.password
@db.sadd 'users', objUser.username,
replyHandler "storing user key '#{ objUser.username }'"
replyHandler "sadd 'users' -> '#{ objUser.username }'"
objUser.password = objUser.password
@db.hmset "user:#{ objUser.username }", objUser,
replyHandler "storing user properties '#{ objUser.username }'"
replyHandler "hmset 'user:#{ objUser.username }' -> [objUser]"
else
@log.warn new Error 'DB | username or password was missing'
@ -634,35 +645,34 @@ Deletes a user and all his associated linked and active rules.
###
exports.deleteUser = ( userId ) =>
@log.info "DB | deleteUser: '#{ userId }'"
@db.srem "users", userId, replyHandler "Deleting user key '#{ userId }'"
@db.del "user:#{ userId }", replyHandler "Deleting user '#{ userId }'"
@db.srem "users", userId, replyHandler "srem 'users' -> '#{ userId }'"
@db.del "user:#{ userId }", replyHandler "del 'user:#{ userId }'"
# We also need to delete all linked rules
@db.smembers "user:#{ userId }:rules", ( err, obj ) =>
delLinkedRuleUser = ( ruleId ) =>
@db.srem "rule:#{ ruleId }:users", userId,
replyHandler "Deleting user key '#{ userId }' in linked rule '#{ ruleId }'"
replyHandler "srem 'rule:#{ ruleId }:users' -> '#{ userId }'"
delLinkedRuleUser id for id in obj
@db.del "user:#{ userId }:rules",
replyHandler "Deleting user '#{ userId }' rules"
replyHandler "del 'user:#{ userId }:rules'"
# We also need to delete all active rules
@db.smembers "user:#{ userId }:active-rules", ( err, obj ) =>
delActivatedRuleUser = ( ruleId ) =>
@db.srem "rule:#{ ruleId }:active-users", userId,
replyHandler "Deleting user key '#{ userId }' in active rule '#{ ruleId }'"
replyHandler "srem 'rule:#{ ruleId }:active-users' -> '#{ userId }'"
delActivatedRuleUser id for id in obj
@db.del "user:#{ userId }:active-rules",
replyHandler "Deleting user '#{ userId }' rules"
replyHandler "del user:#{ userId }:active-rules"
# We also need to delete all associated roles
@db.smembers "user:#{ userId }:roles", ( err, obj ) =>
delRoleUser = ( roleId ) =>
@db.srem "role:#{ roleId }:users", userId,
replyHandler "Deleting user key '#{ userId }' in role '#{ roleId }'"
replyHandler "srem 'role:#{ roleId }:users' -> '#{ userId }'"
delRoleUser id for id in obj
@db.del "user:#{ userId }:roles",
replyHandler "Deleting user '#{ userId }' roles"
@db.del "user:#{ userId }:roles", replyHandler "del 'user:#{ userId }:roles'"
###
Checks the credentials and on success returns the user object to the
@ -707,11 +717,28 @@ Associate a role with a user.
###
exports.storeUserRole = ( userId, role ) =>
@log.info "DB | storeUserRole: '#{ userId }:#{ role }'"
@db.sadd 'roles', role, replyHandler "adding role '#{ role }' to role index set"
@db.sadd 'roles', role, replyHandler "sadd '#{ role }' to 'roles'"
@db.sadd "user:#{ userId }:roles", role,
replyHandler "adding role '#{ role }' to user '#{ userId }'"
replyHandler "sadd 'user:#{ userId }:roles' -> '#{ role }'"
@db.sadd "role:#{ role }:users", userId,
replyHandler "adding user '#{ userId }' to role '#{ role }'"
replyHandler "sadd 'role:#{ role }:users' -> '#{ userId }'"
###
Associate a role with a user.
@public storeUserRole( *userId, role* )
@param {String} userId
@param {String} role
###
exports.deleteRole = ( role ) =>
@log.info "DB | deleteRole: '#{ role }'"
@db.smembers "role:#{ role }:users", ( err, obj ) =>
delUserRole = ( userId ) =>
@db.srem "user:#{ userId }:roles", role,
replyHandler "srem 'user:#{ userId }:roles' -> '#{ role }'"
delUserRole id for id in obj
@db.srem "roles", role,
replyHandler "srem 'roles' -> '#{ role }'"
###
Fetch all roles of a user and pass them to cb(err, obj).
@ -745,9 +772,9 @@ Remove a role from a user.
exports.removeUserRole = ( userId, role ) =>
@log.info "DB | removeRoleFromUser: role '#{ role }', user '#{ userId }'"
@db.srem "user:#{ userId }:roles", role,
replyHandler "Removing role '#{ role }' from user '#{ userId }'"
replyHandler "srem 'user:#{ userId }:roles' -> '#{ role }'"
@db.srem "role:#{ role }:users", userId,
replyHandler "Removing user '#{ userId }' from role '#{ role }'"
replyHandler "srem 'role:#{ role }:users' -> '#{ userId }'"
###

View file

@ -37,5 +37,5 @@ exports.sendMail = ( sender, receipient, subject, content ) ->
ToAddress: receipient
Subject: subject
TextBody: content
needlereq 'post', url, data, json: true, standardCallback 'sendMail'
needle.request 'post', url, data, json: true, standardCallback 'sendMail'

View file

@ -16,7 +16,7 @@ exports.newMail = ( pushEvent ) ->
#
# Syntax: needle.request method, url, data, [options], callback
#
needlereq 'get', url, null, null, ( err, resp, body ) ->
needle.request 'get', url, null, null, ( err, resp, body ) ->
if err
log 'Error in EmailYak EM newMail: ' + err.message
else

View file

@ -42,7 +42,7 @@ callService = ( args ) ->
if not args.callback
args.callback = standardCallback 'call'
url = urlService + args.service + '/' + args.method
needlereq 'post', url, args.data, credentials, args.callback
needle.request 'post', url, args.data, credentials, args.callback
###
Calls the user's unread content service.

View file

@ -32,7 +32,7 @@ Fetches the temperature
###
getTemperature = ( cb ) ->
url = urlService + '?APPID=' + params.openweatherKey + '&q=' + params.city
needlereq 'get', url, null, null, cb
needle.request 'get', url, null, null, cb
###
Emits one event per day if the temperature today raises above user defined threshold

View file

@ -411,7 +411,7 @@ Components Manager
for (id in oParams) {
params = oParams[id];
arr = id.split(' -> ');
db.actionInvokers.storeUserArguments(arr[0], arr[1], user.username, JSON.stringify(params));
db.actionInvokers.storeUserArguments(user.username, rule.id, arr[0], arr[1], JSON.stringify(params));
}
db.resetLog(user.username, rule.id);
db.appendLog(user.username, rule.id, "INIT", "Rule '" + rule.id + "' initialized");

View file

@ -173,15 +173,16 @@ Dynamic Modules
if (dbMod) {
oFuncArgs = {};
for (func in oFuncParams) {
dbMod.getUserArguments(modId, func, userId, function(err, obj) {
dbMod.getUserArguments(userId, ruleId, modId, func, function(err, obj) {
var oDecrypted;
if (obj) {
try {
oDecrypted = cryptico.decrypt(obj, _this.oPrivateRSAkey);
return oFuncArgs[func] = JSON.parse(oDecrypted.plaintext);
oFuncArgs[func] = JSON.parse(oDecrypted.plaintext);
return _this.log.info("DM | Found and attached user-specific arguments to " + userId + ", " + ruleId + ", " + modId);
} catch (_error) {
err = _error;
_this.log.warn("DM | Error during parsing of user defined params for " + userId + ", " + ruleId + ", " + modId);
_this.log.warn("DM | Error during parsing of user-specific arguments for " + userId + ", " + ruleId + ", " + modId);
return _this.log.warn(err);
}
}

View file

@ -9,7 +9,7 @@ Dynamic Modules
*/
(function() {
var db, dynmod, fCallFunction, fCheckAndRun, fLoadModule, isRunning, listUserModules, log, logconf, logger;
var db, dynmod, fCallFunction, fCheckAndRun, fLoadModule, isRunning, listUserModules, log, logconf, logger, pollLoop;
logger = require('./logging');
@ -57,6 +57,7 @@ Dynamic Modules
});
process.on('message', function(msg) {
log.info("EP | Got info about new rule: " + msg.event);
if (msg.event === 'new' || msg.event === 'init') {
fLoadModule(msg);
}
@ -84,15 +85,15 @@ Dynamic Modules
if (!listUserModules[msg.user]) {
listUserModules[msg.user] = {};
}
iv = msg.rule.interval * 60 * 1000;
iv = msg.rule.event_interval * 60 * 1000;
listUserModules[msg.user][msg.rule.id] = {
id: msg.rule.event,
pollfunc: arrName[1],
interval: iv,
event_interval: iv,
module: result.module,
logger: result.logger
};
log.info("EP | New event module '" + arrName[0] + "' loaded for user " + msg.user + ", in rule " + msg.rule.id + ", polling every " + iv + " minutes");
log.info("EP | New event module '" + arrName[0] + "' loaded for user " + msg.user + ", in rule " + msg.rule.id + ", polling every " + msg.rule.event_interval + " minutes");
return setTimeout(fCheckAndRun(msg.user, msg.rule.id), iv);
});
}
@ -106,10 +107,11 @@ Dynamic Modules
fCheckAndRun = function(userId, ruleId) {
return function() {
var oRule;
log.info("EP | Check and run user " + userId + ", rule " + ruleId);
if (isRunning && listUserModules[userId] && listUserModules[userId][ruleId]) {
oRule = listUserModules[userId][ruleId];
fCallFunction(userId, ruleId, oRule);
return setTimeout(fCheckAndRun(userId, ruleId), oRule.interval);
return setTimeout(fCheckAndRun(userId, ruleId), oRule.event_interval);
}
};
};
@ -131,4 +133,19 @@ Dynamic Modules
}
};
/*
This function will loop infinitely every 10 seconds until isRunning is set to false
@private pollLoop()
*/
pollLoop = function() {
if (isRunning) {
return setTimeout(pollLoop, 10000);
}
};
pollLoop();
}).call(this);

View file

@ -257,6 +257,7 @@ Persistence
this.log = log;
this.deleteUserArguments = __bind(this.deleteUserArguments, this);
this.getUserArguments = __bind(this.getUserArguments, this);
this.getUserArgumentsFunctions = __bind(this.getUserArgumentsFunctions, this);
this.storeUserArguments = __bind(this.storeUserArguments, this);
this.deleteUserParams = __bind(this.deleteUserParams, this);
this.getUserParamsIds = __bind(this.getUserParamsIds, this);
@ -293,31 +294,31 @@ Persistence
IndexedModules.prototype.storeModule = function(userId, oModule) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeModule( " + userId + ", oModule )");
this.db.sadd("" + this.setname + "s", oModule.id, replyHandler("sadd '" + oModule.id + "' to '" + this.setname + "'"));
this.db.hmset("" + this.setname + ":" + oModule.id, oModule, replyHandler("hmset properties in hash '" + this.setname + ":" + oModule.id + "'"));
this.db.sadd("" + this.setname + "s", oModule.id, replyHandler("sadd '" + this.setname + "s' -> '" + oModule.id + "'"));
this.db.hmset("" + this.setname + ":" + oModule.id, oModule, replyHandler("hmset '" + this.setname + ":" + oModule.id + "' -> [oModule]"));
return this.linkModule(oModule.id, userId);
};
IndexedModules.prototype.linkModule = function(mId, userId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".linkModule( " + mId + ", " + userId + " )");
this.db.sadd("" + this.setname + ":" + mId + ":users", userId, replyHandler("sadd " + userId + " to '" + this.setname + ":" + mId + ":users'"));
return this.db.sadd("user:" + userId + ":" + this.setname + "s", mId, replyHandler("sadd " + mId + " to 'user:" + userId + ":" + this.setname + "s'"));
this.db.sadd("" + this.setname + ":" + mId + ":users", userId, replyHandler("sadd '" + this.setname + ":" + mId + ":users' -> '" + userId + "'"));
return this.db.sadd("user:" + userId + ":" + this.setname + "s", mId, replyHandler("sadd 'user:" + userId + ":" + this.setname + "s' -> " + mId));
};
IndexedModules.prototype.unlinkModule = function(mId, userId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".unlinkModule( " + mId + ", " + userId + " )");
this.db.srem("" + this.setname + ":" + mId + ":users", userId, replyHandler("srem " + userId + " from '" + this.setname + ":" + mId + ":users'"));
return this.db.srem("user:" + userId + ":" + this.setname + "s", mId, replyHandler("srem " + mId + " from 'user:" + userId + ":" + this.setname + "s'"));
this.db.srem("" + this.setname + ":" + mId + ":users", userId, replyHandler("srem '" + this.setname + ":" + mId + ":users' -> " + userId));
return this.db.srem("user:" + userId + ":" + this.setname + "s", mId, replyHandler("srem 'user:" + userId + ":" + this.setname + "s' -> " + mId));
};
IndexedModules.prototype.publish = function(mId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".publish( " + mId + " )");
return this.db.sadd("public-" + this.setname + "s", mId, replyHandler("sadd '" + mId + "' to 'public-" + this.setname + "s'"));
return this.db.sadd("public-" + this.setname + "s", mId, replyHandler("sadd 'public-" + this.setname + "s' -> '" + mId + "'"));
};
IndexedModules.prototype.unpublish = function(mId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".unpublish( " + mId + " )");
return this.db.srem("public-" + this.setname + "s", mId, replyHandler("srem '" + mId + "' from 'public-" + this.setname + "s'"));
return this.db.srem("public-" + this.setname + "s", mId, replyHandler("srem 'public-" + this.setname + "s' -> '" + mId + "'"));
};
IndexedModules.prototype.getModule = function(mId, cb) {
@ -326,7 +327,7 @@ Persistence
};
IndexedModules.prototype.getModuleField = function(mId, field, cb) {
this.log.info("DB | (IdxedMods) " + this.setname + ".getModule( " + mId + " )");
this.log.info("DB | (IdxedMods) " + this.setname + ".getModuleField( " + mId + ", " + field + " )");
return this.db.hget("" + this.setname + ":" + mId, field, cb);
};
@ -336,7 +337,7 @@ Persistence
};
IndexedModules.prototype.getAvailableModuleIds = function(userId, cb) {
this.log.info("DB | (IdxedMods) " + this.setname + ".getPublicModuleIds( " + userId + " )");
this.log.info("DB | (IdxedMods) " + this.setname + ".getAvailableModuleIds( " + userId + " )");
return this.db.sunion("public-" + this.setname + "s", "user:" + userId + ":" + this.setname + "s", cb);
};
@ -352,24 +353,28 @@ Persistence
IndexedModules.prototype.deleteModule = function(mId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".deleteModule( " + mId + " )");
this.db.srem("" + this.setname + "s", mId, replyHandler("srem '" + mId + "' from " + this.setname + "s"));
this.db.del("" + this.setname + ":" + mId, replyHandler("del of '" + this.setname + ":" + mId + "'"));
this.db.srem("" + this.setname + "s", mId, replyHandler("srem '" + this.setname + "s' -> '" + mId + "'"));
this.db.del("" + this.setname + ":" + mId, replyHandler("del '" + this.setname + ":" + mId + "'"));
this.unpublish(mId);
return this.db.smembers("" + this.setname + ":" + mId + ":users", (function(_this) {
return function(err, obj) {
var userId, _i, _j, _k, _len, _len1, _len2, _results;
var userId, _i, _len, _results;
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
userId = obj[_i];
_this.unlinkModule(mId, userId);
}
for (_j = 0, _len1 = obj.length; _j < _len1; _j++) {
userId = obj[_j];
_this.deleteUserParams(mId, userId);
}
_results = [];
for (_k = 0, _len2 = obj.length; _k < _len2; _k++) {
userId = obj[_k];
_results.push(_this.deleteUserArguments(mId, userId));
_results.push(exports.getUserLinkedRules(userId, function(err, obj) {
var rule, _j, _len1, _results1;
_results1 = [];
for (_j = 0, _len1 = obj.length; _j < _len1; _j++) {
rule = obj[_j];
_results1.push(_this.getUserArgumentsFunctions(userId, rule, mId, function(err, obj) {
return _this.deleteUserArguments(userId, rule, mId);
}));
}
return _results1;
}));
}
return _results;
};
@ -389,8 +394,8 @@ Persistence
IndexedModules.prototype.storeUserParams = function(mId, userId, encData) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserParams( " + mId + ", " + userId + ", encData )");
this.db.sadd("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("sadd '" + mId + ":" + userId + "' to '" + this.setname + "-params'"));
return this.db.set("" + this.setname + "-params:" + mId + ":" + userId, encData, replyHandler("set user params in '" + this.setname + "-params:" + mId + ":" + userId + "'"));
this.db.sadd("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("sadd '" + this.setname + "-params' -> '" + mId + ":" + userId + "'"));
return this.db.set("" + this.setname + "-params:" + mId + ":" + userId, encData, replyHandler("set '" + this.setname + "-params:" + mId + ":" + userId + "' -> [encData]"));
};
IndexedModules.prototype.getUserParams = function(mId, userId, cb) {
@ -404,8 +409,8 @@ Persistence
};
IndexedModules.prototype.deleteUserParams = function(mId, userId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserParams(" + mId + ", " + userId + " )");
this.db.srem("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("srem '" + mId + ":" + userId + "' from '" + this.setname + "-params'"));
this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserParams( " + mId + ", " + userId + " )");
this.db.srem("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("srem '" + this.setname + "-params' -> '" + mId + ":" + userId + "'"));
return this.db.del("" + this.setname + "-params:" + mId + ":" + userId, replyHandler("del '" + this.setname + "-params:" + mId + ":" + userId + "'"));
};
@ -414,32 +419,39 @@ Persistence
Stores user arguments for a function within a module. They are expected to be RSA encrypted with helps of
the provided cryptico JS library and will only be decrypted right before the module is loaded!
@private storeUserArguments( *mId, userId, encData* )
@param {String} mId
@private storeUserArguments( *userId, ruleId, mId, funcId, encData* )
@param {String} userId
@param {String} ruleId
@param {String} mId
@param {String} funcId
@param {object} encData
*/
IndexedModules.prototype.storeUserArguments = function(mId, funcId, userId, encData) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserArguments( " + mId + ", " + funcId + ", " + userId + ", encData )");
this.db.sadd("" + this.setname + ":" + mId + ":" + userId + ":functions", funcId, replyHandler("sadd '" + funcId + "' to '" + this.setname + ":" + mId + ":" + userId + ":functions'"));
return this.db.set("" + this.setname + ":" + mId + ":" + userId + ":function:" + funcId, encData, replyHandler("set user params in '" + this.setname + ":" + mId + ":" + userId + ":function:" + func + "'"));
IndexedModules.prototype.storeUserArguments = function(userId, ruleId, mId, funcId, encData) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserArguments( " + userId + ", " + ruleId + ", " + mId + ", " + funcId + ", encData )");
this.db.sadd("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", funcId, replyHandler("sadd '" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions' -> '" + funcId + "'"));
return this.db.set("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId, encData, replyHandler("set '" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId + "' -> [encData]"));
};
IndexedModules.prototype.getUserArguments = function(mId, funcId, userId, cb) {
this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArguments( " + mId + ", " + funcId + ", " + userId + " )");
return this.db.get("" + this.setname + ":" + mId + ":" + userId + ":function:" + funcId, cb);
IndexedModules.prototype.getUserArgumentsFunctions = function(userId, ruleId, mId, cb) {
this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArgumentsFunctions( " + userId + ", " + ruleId + ", " + mId + " )");
return this.db.get("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", cb);
};
IndexedModules.prototype.deleteUserArguments = function(mId, userId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserArguments(" + mId + ", " + userId + " )");
return this.db.smembers("" + this.setname + ":" + mId + ":" + userId + ":functions", (function(_this) {
IndexedModules.prototype.getUserArguments = function(userId, ruleId, mId, funcId, cb) {
this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArguments( " + userId + ", " + ruleId + ", " + mId + ", " + funcId + " )");
return this.db.get("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId, cb);
};
IndexedModules.prototype.deleteUserArguments = function(userId, ruleId, mId) {
this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserArguments( " + userId + ", " + ruleId + ", " + mId + " )");
return this.db.smembers("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", (function(_this) {
return function(err, obj) {
var func, _i, _len, _results;
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
func = obj[_i];
_results.push(_this.db.del("" + _this.setname + ":" + mId + ":" + userId + ":function:" + func, replyHandler("del '" + _this.setname + ":" + mId + ":" + userId + ":function:" + func + "'")));
_results.push(_this.db.del("" + _this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + func, replyHandler("del '" + _this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + func + "'")));
}
return _results;
};
@ -513,7 +525,7 @@ Persistence
exports.getRule = (function(_this) {
return function(ruleId, cb) {
_this.log.info("DB | get: 'rule:" + ruleId + "'");
_this.log.info("DB | getRule( '" + ruleId + "' )");
return _this.db.get("rule:" + ruleId, cb);
};
})(this);
@ -559,9 +571,9 @@ Persistence
exports.storeRule = (function(_this) {
return function(ruleId, data) {
_this.log.info("DB | storeRule: '" + ruleId + "'");
_this.db.sadd('rules', "" + ruleId, replyHandler("sadd rules: '" + ruleId + "'"));
return _this.db.set("rule:" + ruleId, data, replyHandler("set 'rule:" + ruleId + "': data"));
_this.log.info("DB | storeRule( '" + ruleId + "' )");
_this.db.sadd('rules', "" + ruleId, replyHandler("sadd 'rules' -> '" + ruleId + "'"));
return _this.db.set("rule:" + ruleId, data, replyHandler("set 'rule:" + ruleId + "' -> [data]"));
};
})(this);
@ -576,14 +588,14 @@ Persistence
exports.deleteRule = (function(_this) {
return function(ruleId) {
_this.log.info("DB | deleteRule: '" + ruleId + "'");
_this.db.srem("rules", ruleId, replyHandler("srem 'rules': '" + ruleId + "'"));
_this.db.del("rule:" + ruleId, replyHandler("del: 'rule:" + ruleId + "'"));
_this.log.info("DB | deleteRule( '" + ruleId + "' )");
_this.db.srem("rules", ruleId, replyHandler("srem 'rules' -> '" + ruleId + "'"));
_this.db.del("rule:" + ruleId, replyHandler("del 'rule:" + ruleId + "'"));
_this.db.smembers("rule:" + ruleId + ":users", function(err, obj) {
var delLinkedUserRule, id, _i, _len, _results;
delLinkedUserRule = function(userId) {
exports.resetLog(userId, ruleId);
return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules': '" + ruleId + "'"));
return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules' -> '" + ruleId + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
@ -596,7 +608,7 @@ Persistence
_this.db.smembers("rule:" + ruleId + ":active-users", function(err, obj) {
var delActiveUserRule, id, _i, _len, _results;
delActiveUserRule = function(userId) {
return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules': '" + ruleId + "'"));
return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules' -> '" + ruleId + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
@ -621,8 +633,8 @@ Persistence
exports.linkRule = (function(_this) {
return function(ruleId, userId) {
_this.log.info("DB | linkRule: '" + ruleId + "' to user '" + userId + "'");
_this.db.sadd("rule:" + ruleId + ":users", userId, replyHandler("sadd 'rule:" + ruleId + ":users': '" + userId + "'"));
return _this.db.sadd("user:" + userId + ":rules", ruleId, replyHandler("sadd 'user:" + userId + ":rules': '" + ruleId + "'"));
_this.db.sadd("rule:" + ruleId + ":users", userId, replyHandler("sadd 'rule:" + ruleId + ":users' -> '" + userId + "'"));
return _this.db.sadd("user:" + userId + ":rules", ruleId, replyHandler("sadd 'user:" + userId + ":rules' -> '" + ruleId + "'"));
};
})(this);
@ -637,7 +649,7 @@ Persistence
exports.getUserLinkedRules = (function(_this) {
return function(userId, cb) {
_this.log.info("DB | getUserLinkedRules: 'user:" + userId + ":rules'");
_this.log.info("DB | getUserLinkedRules: smembers 'user:" + userId + ":rules'");
return _this.db.smembers("user:" + userId + ":rules", cb);
};
})(this);
@ -653,7 +665,7 @@ Persistence
exports.getRuleLinkedUsers = (function(_this) {
return function(ruleId, cb) {
_this.log.info("DB | getRuleLinkedUsers: 'rule:" + ruleId + ":users'");
_this.log.info("DB | getRuleLinkedUsers: smembers 'rule:" + ruleId + ":users'");
return _this.db.smembers("rule:" + ruleId + ":users", cb);
};
})(this);
@ -670,8 +682,8 @@ Persistence
exports.unlinkRule = (function(_this) {
return function(ruleId, userId) {
_this.log.info("DB | unlinkRule: '" + ruleId + ":" + userId + "'");
_this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users': '" + userId + "'"));
return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules': '" + ruleId + "'"));
_this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users' -> '" + userId + "'"));
return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules' -> '" + ruleId + "'"));
};
})(this);
@ -687,8 +699,8 @@ Persistence
exports.activateRule = (function(_this) {
return function(ruleId, userId) {
_this.log.info("DB | activateRule: '" + ruleId + "' for '" + userId + "'");
_this.db.sadd("rule:" + ruleId + ":active-users", userId, replyHandler("sadd 'rule:" + ruleId + ":active-users': '" + userId + "'"));
return _this.db.sadd("user:" + userId + ":active-rules", ruleId, replyHandler("sadd 'user:" + userId + ":active-rules': '" + ruleId + "'"));
_this.db.sadd("rule:" + ruleId + ":active-users", userId, replyHandler("sadd 'rule:" + ruleId + ":active-users' -> '" + userId + "'"));
return _this.db.sadd("user:" + userId + ":active-rules", ruleId, replyHandler("sadd 'user:" + userId + ":active-rules' -> '" + ruleId + "'"));
};
})(this);
@ -736,7 +748,7 @@ Persistence
exports.deactivateRule = (function(_this) {
return function(ruleId, userId) {
_this.log.info("DB | deactivateRule: '" + ruleId + "' for '" + userId + "'");
_this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users': '" + userId + "'"));
_this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users' -> '" + userId + "'"));
return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules' '" + ruleId + "'"));
};
})(this);
@ -798,9 +810,9 @@ Persistence
return function(objUser) {
_this.log.info("DB | storeUser: '" + objUser.username + "'");
if (objUser && objUser.username && objUser.password) {
_this.db.sadd('users', objUser.username, replyHandler("storing user key '" + objUser.username + "'"));
_this.db.sadd('users', objUser.username, replyHandler("sadd 'users' -> '" + objUser.username + "'"));
objUser.password = objUser.password;
return _this.db.hmset("user:" + objUser.username, objUser, replyHandler("storing user properties '" + objUser.username + "'"));
return _this.db.hmset("user:" + objUser.username, objUser, replyHandler("hmset 'user:" + objUser.username + "' -> [objUser]"));
} else {
return _this.log.warn(new Error('DB | username or password was missing'));
}
@ -849,12 +861,12 @@ Persistence
exports.deleteUser = (function(_this) {
return function(userId) {
_this.log.info("DB | deleteUser: '" + userId + "'");
_this.db.srem("users", userId, replyHandler("Deleting user key '" + userId + "'"));
_this.db.del("user:" + userId, replyHandler("Deleting user '" + userId + "'"));
_this.db.srem("users", userId, replyHandler("srem 'users' -> '" + userId + "'"));
_this.db.del("user:" + userId, replyHandler("del 'user:" + userId + "'"));
_this.db.smembers("user:" + userId + ":rules", function(err, obj) {
var delLinkedRuleUser, id, _i, _len, _results;
delLinkedRuleUser = function(ruleId) {
return _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("Deleting user key '" + userId + "' in linked rule '" + ruleId + "'"));
return _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users' -> '" + userId + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
@ -863,11 +875,11 @@ Persistence
}
return _results;
});
_this.db.del("user:" + userId + ":rules", replyHandler("Deleting user '" + userId + "' rules"));
_this.db.del("user:" + userId + ":rules", replyHandler("del 'user:" + userId + ":rules'"));
_this.db.smembers("user:" + userId + ":active-rules", function(err, obj) {
var delActivatedRuleUser, id, _i, _len, _results;
delActivatedRuleUser = function(ruleId) {
return _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("Deleting user key '" + userId + "' in active rule '" + ruleId + "'"));
return _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users' -> '" + userId + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
@ -876,11 +888,11 @@ Persistence
}
return _results;
});
_this.db.del("user:" + userId + ":active-rules", replyHandler("Deleting user '" + userId + "' rules"));
_this.db.del("user:" + userId + ":active-rules", replyHandler("del user:" + userId + ":active-rules"));
_this.db.smembers("user:" + userId + ":roles", function(err, obj) {
var delRoleUser, id, _i, _len, _results;
delRoleUser = function(roleId) {
return _this.db.srem("role:" + roleId + ":users", userId, replyHandler("Deleting user key '" + userId + "' in role '" + roleId + "'"));
return _this.db.srem("role:" + roleId + ":users", userId, replyHandler("srem 'role:" + roleId + ":users' -> '" + userId + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
@ -889,7 +901,7 @@ Persistence
}
return _results;
});
return _this.db.del("user:" + userId + ":roles", replyHandler("Deleting user '" + userId + "' roles"));
return _this.db.del("user:" + userId + ":roles", replyHandler("del 'user:" + userId + ":roles'"));
};
})(this);
@ -947,9 +959,37 @@ Persistence
exports.storeUserRole = (function(_this) {
return function(userId, role) {
_this.log.info("DB | storeUserRole: '" + userId + ":" + role + "'");
_this.db.sadd('roles', role, replyHandler("adding role '" + role + "' to role index set"));
_this.db.sadd("user:" + userId + ":roles", role, replyHandler("adding role '" + role + "' to user '" + userId + "'"));
return _this.db.sadd("role:" + role + ":users", userId, replyHandler("adding user '" + userId + "' to role '" + role + "'"));
_this.db.sadd('roles', role, replyHandler("sadd '" + role + "' to 'roles'"));
_this.db.sadd("user:" + userId + ":roles", role, replyHandler("sadd 'user:" + userId + ":roles' -> '" + role + "'"));
return _this.db.sadd("role:" + role + ":users", userId, replyHandler("sadd 'role:" + role + ":users' -> '" + userId + "'"));
};
})(this);
/*
Associate a role with a user.
@public storeUserRole( *userId, role* )
@param {String} userId
@param {String} role
*/
exports.deleteRole = (function(_this) {
return function(role) {
_this.log.info("DB | deleteRole: '" + role + "'");
_this.db.smembers("role:" + role + ":users", function(err, obj) {
var delUserRole, id, _i, _len, _results;
delUserRole = function(userId) {
return _this.db.srem("user:" + userId + ":roles", role, replyHandler("srem 'user:" + userId + ":roles' -> '" + role + "'"));
};
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
id = obj[_i];
_results.push(delUserRole(id));
}
return _results;
});
return _this.db.srem("roles", role, replyHandler("srem 'roles' -> '" + role + "'"));
};
})(this);
@ -997,8 +1037,8 @@ Persistence
exports.removeUserRole = (function(_this) {
return function(userId, role) {
_this.log.info("DB | removeRoleFromUser: role '" + role + "', user '" + userId + "'");
_this.db.srem("user:" + userId + ":roles", role, replyHandler("Removing role '" + role + "' from user '" + userId + "'"));
return _this.db.srem("role:" + role + ":users", userId, replyHandler("Removing user '" + userId + "' from role '" + role + "'"));
_this.db.srem("user:" + userId + ":roles", role, replyHandler("srem 'user:" + userId + ":roles' -> '" + role + "'"));
return _this.db.srem("role:" + role + ":users", userId, replyHandler("srem 'role:" + role + ":users' -> '" + userId + "'"));
};
})(this);

View file

@ -272,3 +272,5 @@ exports.ruleForge =
setTimeout fWaitAgain, 200
setTimeout fWaitForPersistence, 200
# TODO we have to implement a lot of extensive testing for the component manager since it is a core feature

View file

@ -29,11 +29,12 @@ oRuleTwo = objects.rules.ruleTwo
exports.tearDown = ( cb ) ->
db.deleteUser oUser.username
db.deleteRole 'tester'
setTimeout cb, 100
# ###
# # Test AVAILABILITY
# ###
###
# Test AVAILABILITY
###
exports.Availability =
testRequire: ( test ) ->
test.expect 1
@ -607,6 +608,7 @@ exports.User =
db.getUserActivatedRules oUser.username, ( err, obj ) ->
test.ok obj.length is 0,
'User still associated to activated rules!'
db.deleteRole 'tester'
test.done()
# Store the user and make some links
@ -616,6 +618,7 @@ exports.User =
db.linkRule 'rule-3', oUser.username
db.activateRule 'rule-1', oUser.username
db.storeUserRole oUser.username, 'tester'
# Verify role is deleted
setTimeout fWaitForPersistence, 100
@ -644,7 +647,6 @@ exports.User =
# Test ROLES
###
exports.Roles =
testStore: ( test ) ->
test.expect 2

View file

@ -71,6 +71,7 @@ exports.session =
tearDown: ( cb ) =>
db.deleteUser @oUsr.username
db.purgeEventQueue()
cb()
testLoginAndOut: ( test ) =>
@ -173,34 +174,34 @@ exports.events =
setTimeout fPopEvent, 200 # try to fetch the db entry
exports.testLoginOrPage = ( test ) ->
test.expect 3
test.expect 3
req = createRequest()
req = createRequest()
req.query =
page: 'forge_event'
resp = createResponse ( code, msg ) ->
# Ensure we have to login first
test.ok msg.indexOf( 'document.title = \'Login\'' ) > 0, 'Didn\'t get login page?'
req = createLoggedInRequest()
req.query =
page: 'forge_event'
resp = createResponse ( code, msg ) ->
# Ensure we have to login first
test.ok msg.indexOf( 'document.title = \'Login\'' ) > 0, 'Didn\'t get login page?'
# After being logged in we should get the expected page
test.ok msg.indexOf( 'document.title = \'Event Forge!\'' ) > 0, 'Didn\' get forge page?'
req = createLoggedInRequest()
req.query =
page: 'forge_event'
page: 'wrongpage'
resp = createResponse ( code, msg ) ->
# After being logged in we should get the expected page
test.ok msg.indexOf( 'document.title = \'Event Forge!\'' ) > 0, 'Didn\' get forge page?'
req = createLoggedInRequest()
req.query =
page: 'wrongpage'
resp = createResponse ( code, msg ) ->
# A wrong page request should give back an error page
test.ok msg.indexOf( 'document.title = \'Error!\'' ) > 0, 'Didn\' get forge page?'
test.done()
# A wrong page request should give back an error page
test.ok msg.indexOf( 'document.title = \'Error!\'' ) > 0, 'Didn\' get forge page?'
test.done()
rh.handleForge req, resp # set the handler to listening
rh.handleForge req, resp # set the handler to listening
rh.handleForge req, resp # set the handler to listening
rh.handleForge req, resp # set the handler to listening
exports.testUserCommandsNoLogin = ( test ) ->

View file

@ -3,38 +3,25 @@ fOnLoad = () ->
document.title = 'Edit Modules'
$( '#pagetitle' ).text "{{{user.username}}}, edit your Modules!"
moduleType = $( '#module_type' ).val()
$( '#module_type' ).change () ->
moduleType = $( this ).val()
console.log moduleType
fFetchModules()
editor = ace.edit "editor"
editor.setTheme "ace/theme/monokai"
editor.setReadOnly true
editor.setShowPrintMargin false
fErrHandler = ( errMsg ) ->
( err ) ->
if err.status is 401
window.location.href = 'forge?page=edit_modules'
else
$( '#moduleName' ).html "<h2>&nbsp;</h2>"
$( '#moduleLanguage' ).html "<b>&nbsp;</b>"
editor.setValue ""
fDelayed = () ->
if err.responseText is ''
msg = 'No Response from Server!'
else
try
oErr = JSON.parse err.responseText
msg = oErr.message
$( '#info' ).text errMsg + msg
$( '#info' ).attr 'class', 'error'
setTimeout fDelayed, 500
if err.responseText is ''
msg = 'No Response from Server!'
else
try
oErr = JSON.parse err.responseText
msg = oErr.message
$( '#info' ).text errMsg + msg
$( '#info' ).attr 'class', 'error'
fFetchModules = () ->
if moduleType is 'Event Poller'
if $( '#module_type' ).val() is 'Event Poller'
cmd = 'get_event_pollers'
else
cmd = 'get_action_invokers'
@ -63,10 +50,7 @@ fOnLoad = () ->
modName = $( 'div', $( this ).closest( 'tr' )).text()
if confirm "Do you really want to delete the Module '#{ modName }'?
The module might still be active in some of your rules!"
$( '#moduleName' ).html "<h2>&nbsp;</h2>"
$( '#moduleLanguage' ).html "<b>&nbsp;</b>"
editor.setValue ""
if moduleType is 'Event Poller'
if $( '#module_type' ).val() is 'Event Poller'
cmd = 'delete_event_poller'
else
cmd = 'delete_action_invoker'
@ -80,32 +64,10 @@ fOnLoad = () ->
.fail fErrHandler 'Could not delete module! '
$( '#tableModules' ).on 'click', 'img.log', () ->
modName = $( 'div', $( this ).closest( 'tr' )).text()
if moduleType is 'Event Poller'
cmd = 'get_full_event_poller'
modName = encodeURIComponent $( 'div', $( this ).closest( 'tr' )).text()
if $( '#module_type' ).val() is 'Event Poller'
window.location.href = 'forge?page=forge_event_poller&id=' + modName
else
cmd = 'get_full_action_invoker'
data =
command: cmd
payload:
id: modName
data.payload = JSON.stringify data.payload
$.post( '/usercommand', data )
.done ( data ) ->
try
oMod = JSON.parse data.message
catch err
fErrHandler err.message
if oMod.lang is 'CoffeeScript'
editor.getSession().setMode "ace/mode/coffee"
else
editor.getSession().setMode "ace/mode/javascript"
editor.setValue oMod.data
editor.gotoLine 1, 1
editor.scrollToRow 1
$( '#moduleName' ).html "<h2>#{ oMod.id }</h2>"
$( '#moduleLanguage' ).html "<b>#{ oMod.lang }</b>"
.fail fErrHandler 'Could not get module! '
window.location.href = 'forge?page=forge_action_invoker&id=' + modName
window.addEventListener 'load', fOnLoad, true

View file

@ -1,15 +1,3 @@
# encodeURIComponent(url); -> Rule Name to be passed to forge_rule
fOnLoad = () ->
document.title = 'Edit Rules'

View file

@ -92,4 +92,19 @@ fOnLoad = () ->
$( '#info' ).attr 'class', 'error'
setTimeout fDelayed, 500
# EDIT MODULES
arrParams = window.location.search.substring(1).split '&'
id = ''
for param in arrParams
arrKV = param.split '='
if arrKV[ 0 ] is 'id'
id = decodeURIComponent arrKV[ 1 ]
if id isnt ''
# TODO we have an idea so we want to edit this module!
console.log id
window.addEventListener 'load', fOnLoad, true

View file

@ -257,7 +257,8 @@ fOnLoad = () ->
argument: $( 'div.funcarg', this ).val()
value: $( 'input[type=text]', this ).val()
regexp: $( 'input[type=checkbox]', this ).is( ':checked' )
actParams[ actionName ] = cryptico.encrypt JSON.stringify( tmp ), strPublicKey
tmp = cryptico.encrypt JSON.stringify( tmp ), strPublicKey
actParams[ actionName ] = tmp.cipher
try
conds = JSON.parse editor.getValue()
@ -271,7 +272,7 @@ fOnLoad = () ->
fParseTime = ( str, hasDay ) ->
arrTime = str.split ':'
# If there's only one entry, this is the amount of minutes
if arrTime.length = 1
if arrTime.length is 1
time = parseInt( str ) || 10
if hasDay
time * 60
@ -282,14 +283,18 @@ fOnLoad = () ->
h * 60 + ( parseInt( arrTime[ 1 ] ) || 10 )
arrInp = $( '#event_interval' ).text().split ' '
txtInterval = $( '#event_interval' ).val()
arrInp = txtInterval.split ' '
# There's only one string entered, either day or hour
if arrInp.length = 1
mins = fParseTime arrInp[ 0 ]
if arrInp.length is 1
mins = fParseTime txtInterval
else
d = parseInt( arrInp[ 0 ] ) || 0
mins = d * 24 * 60 + fParseTime arrInp[ 1 ], true
# We have to limit this to 24 days because setTimeout only takes integer values
# until we implement a scheduler that deals with larger intervals
mins = Math.min mins, 35700
encryptedParams = cryptico.encrypt JSON.stringify( ep ), strPublicKey
obj =
command: 'forge_rule'

View file

@ -3,48 +3,34 @@
var fOnLoad;
fOnLoad = function() {
var editor, fErrHandler, fFetchModules, fUpdateModuleList, moduleType;
var fErrHandler, fFetchModules, fUpdateModuleList;
document.title = 'Edit Modules';
$('#pagetitle').text("{{{user.username}}}, edit your Modules!");
moduleType = $('#module_type').val();
$('#module_type').change(function() {
moduleType = $(this).val();
console.log(moduleType);
return fFetchModules();
});
editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.setReadOnly(true);
editor.setShowPrintMargin(false);
fErrHandler = function(errMsg) {
return function(err) {
var fDelayed;
var msg, oErr;
if (err.status === 401) {
return window.location.href = 'forge?page=edit_modules';
} else {
$('#moduleName').html("<h2>&nbsp;</h2>");
$('#moduleLanguage').html("<b>&nbsp;</b>");
editor.setValue("");
fDelayed = function() {
var msg, oErr;
if (err.responseText === '') {
msg = 'No Response from Server!';
} else {
try {
oErr = JSON.parse(err.responseText);
msg = oErr.message;
} catch (_error) {}
}
$('#info').text(errMsg + msg);
return $('#info').attr('class', 'error');
};
return setTimeout(fDelayed, 500);
if (err.responseText === '') {
msg = 'No Response from Server!';
} else {
try {
oErr = JSON.parse(err.responseText);
msg = oErr.message;
} catch (_error) {}
}
$('#info').text(errMsg + msg);
return $('#info').attr('class', 'error');
}
};
};
fFetchModules = function() {
var cmd;
if (moduleType === 'Event Poller') {
if ($('#module_type').val() === 'Event Poller') {
cmd = 'get_event_pollers';
} else {
cmd = 'get_action_invokers';
@ -75,10 +61,7 @@
var cmd, data, modName;
modName = $('div', $(this).closest('tr')).text();
if (confirm("Do you really want to delete the Module '" + modName + "'? The module might still be active in some of your rules!")) {
$('#moduleName').html("<h2>&nbsp;</h2>");
$('#moduleLanguage').html("<b>&nbsp;</b>");
editor.setValue("");
if (moduleType === 'Event Poller') {
if ($('#module_type').val() === 'Event Poller') {
cmd = 'delete_event_poller';
} else {
cmd = 'delete_action_invoker';
@ -94,39 +77,13 @@
}
});
return $('#tableModules').on('click', 'img.log', function() {
var cmd, data, modName;
modName = $('div', $(this).closest('tr')).text();
if (moduleType === 'Event Poller') {
cmd = 'get_full_event_poller';
var modName;
modName = encodeURIComponent($('div', $(this).closest('tr')).text());
if ($('#module_type').val() === 'Event Poller') {
return window.location.href = 'forge?page=forge_event_poller&id=' + modName;
} else {
cmd = 'get_full_action_invoker';
return window.location.href = 'forge?page=forge_action_invoker&id=' + modName;
}
data = {
command: cmd,
payload: {
id: modName
}
};
data.payload = JSON.stringify(data.payload);
return $.post('/usercommand', data).done(function(data) {
var err, oMod;
try {
oMod = JSON.parse(data.message);
} catch (_error) {
err = _error;
fErrHandler(err.message);
}
if (oMod.lang === 'CoffeeScript') {
editor.getSession().setMode("ace/mode/coffee");
} else {
editor.getSession().setMode("ace/mode/javascript");
}
editor.setValue(oMod.data);
editor.gotoLine(1, 1);
editor.scrollToRow(1);
$('#moduleName').html("<h2>" + oMod.id + "</h2>");
return $('#moduleLanguage').html("<b>" + oMod.lang + "</b>");
}).fail(fErrHandler('Could not get module! '));
});
};

View file

@ -3,7 +3,7 @@
var fOnLoad;
fOnLoad = function() {
var editor, fChangeInputVisibility;
var arrKV, arrParams, editor, fChangeInputVisibility, id, param, _i, _len;
document.title = 'Forge Action Invoker';
$('#pagetitle').text("{{{user.username}}}, forge your custom action invoker!");
editor = ace.edit("editor");
@ -58,7 +58,7 @@
}
});
fChangeInputVisibility();
return $('#but_submit').click(function() {
$('#but_submit').click(function() {
var listParams, obj;
if ($('#input_id').val() === '') {
return alert('Please enter an action invoker name!');
@ -111,6 +111,18 @@
});
}
});
arrParams = window.location.search.substring(1).split('&');
id = '';
for (_i = 0, _len = arrParams.length; _i < _len; _i++) {
param = arrParams[_i];
arrKV = param.split('=');
if (arrKV[0] === 'id') {
id = decodeURIComponent(arrKV[1]);
}
}
if (id !== '') {
return console.log(id);
}
};
window.addEventListener('load', fOnLoad, true);

View file

@ -276,7 +276,7 @@
return $(this).closest('tr').remove();
});
$('#but_submit').click(function() {
var actParams, acts, ap, arrInp, conds, d, encryptedParams, ep, err, fParseTime, mins;
var actParams, acts, ap, arrInp, conds, d, encryptedParams, ep, err, fParseTime, mins, txtInterval;
window.scrollTo(0, 0);
$('#info').text('');
try {
@ -333,7 +333,8 @@
value: $('input[type=text]', this).val(),
regexp: $('input[type=checkbox]', this).is(':checked')
};
return actParams[actionName] = cryptico.encrypt(JSON.stringify(tmp), strPublicKey);
tmp = cryptico.encrypt(JSON.stringify(tmp), strPublicKey);
return actParams[actionName] = tmp.cipher;
});
});
try {
@ -348,7 +349,7 @@
fParseTime = function(str, hasDay) {
var arrTime, h, time;
arrTime = str.split(':');
if (arrTime.length = 1) {
if (arrTime.length === 1) {
time = parseInt(str) || 10;
if (hasDay) {
return time * 60;
@ -360,13 +361,15 @@
return h * 60 + (parseInt(arrTime[1]) || 10);
}
};
arrInp = $('#event_interval').text().split(' ');
if (arrInp.length = 1) {
mins = fParseTime(arrInp[0]);
txtInterval = $('#event_interval').val();
arrInp = txtInterval.split(' ');
if (arrInp.length === 1) {
mins = fParseTime(txtInterval);
} else {
d = parseInt(arrInp[0]) || 0;
mins = d * 24 * 60 + fParseTime(arrInp[1], true);
}
mins = Math.min(mins, 35700);
encryptedParams = cryptico.encrypt(JSON.stringify(ep), strPublicKey);
obj = {
command: 'forge_rule',

View file

@ -3,12 +3,12 @@
<option>Action Invoker</option>
</select>
<table>
<!-- <table>
<tr>
<td valign="top">
<td valign="top"> -->
<h3>Available Modules:</h3>
<table id="tableModules"></table>
</td>
<!--</td>
<td width="50px"></td>
<td valign="top" width="700px">
<div id="moduleName"><h2>&nbsp;</h2></div>
@ -22,4 +22,4 @@ User-specific properties:
</td>
</td>
</tr>
</table>
</table> -->

View file

@ -24,7 +24,7 @@ exports.newMail = ( pushEvent ) ->
#
# Syntax: needle.request method, url, data, [options], callback
#
needlereq 'get', url, null, null, ( err, resp, body ) ->
needle.request 'get', url, null, null, ( err, resp, body ) ->
if err
log 'Error in EmailYak EM newMail: ' + err.message
else