meshblu-authenticator-core
Version:
[](https://travis-ci.org/octoblu/meshblu-authenticator-core) [ • 3.71 kB
text/coffeescript
bcrypt = require 'bcrypt'
_ = require 'lodash'
class DeviceAuthenticator
: 'device already exists'
: 'device not found'
: 'cannot write to device'
constructor: ({, , })->
buildDeviceUpdate: ({owner, user_id, hashedSecret}) =>
data = {
id: user_id
name:
secret: hashedSecret
}
signature = .sign(data)
deviceUpdate = {
owner: owner
}
deviceUpdate[] = _.defaults({signature: signature}, data)
return deviceUpdate
create: ({query, data, user_id, secret}, callback) =>
data = _.cloneDeep(data ? {})
data.meshblu = {
version: '2.0.0'
search:
terms: []
whitelists:
configure:
update: [{uuid: }]
discover:
view: [{uuid: }]
}
data[] ?= {}
data[].createdAt = new Date
{query, data}, (error, device) =>
return callback error if error?
{uuid: device.uuid, owner: device.uuid, user_id, secret}, (error) =>
callback(error, device)
addAuth: ({query, uuid, user_id, secret}, callback) =>
{query}, (error, deviceExists) =>
return callback error if error?
return callback new Error DeviceAuthenticator.ERROR_DEVICE_ALREADY_EXISTS if deviceExists
.device uuid, (error, device) =>
return callback new Error DeviceAuthenticator.ERROR_DEVICE_NOT_FOUND if error?
{uuid: uuid, owner: device.owner, user_id, secret}, (error) =>
callback(error, device)
writeAuthData: ({uuid, owner, user_id, secret}, callback) =>
{secret: secret + uuid}, (error, hashedSecret) =>
return callback error if error?
updateData = ({owner, user_id, hashedSecret})
{uuid: uuid, data: updateData}, (error, device) =>
return callback new Error DeviceAuthenticator.ERROR_CANNOT_WRITE_TO_DEVICE if error?
callback null, device
exists: ({query}, callback) =>
.devices query, (error, devices) =>
return callback error if error?
devices = _.filter devices, (device) =>
data: device[]
callback null, ! _.isEmpty devices
findVerified: ({query, password}, callback) =>
projection =
uuid: true
"#{@authenticatorUuid}": true
.search query, {projection}, (error, devices) =>
return callback error if error?
devices = _.filter devices, (device) =>
authData = device[]
return false unless {data: authData}
return false unless {secret: password + device.uuid, hash: authData.secret}
return true
callback null, _.first devices
hashSecret: ({secret}, callback) =>
bcrypt.hash secret, 8, callback
insert: ({query, data}, callback) =>
{query}, (error, deviceExists) =>
return callback error if error?
return callback new Error DeviceAuthenticator.ERROR_DEVICE_ALREADY_EXISTS if deviceExists
.register data, callback
update: ({uuid, data}, callback) =>
.update uuid, data, callback
verifySignature: ({data}) =>
return false unless data?.signature?
.verify _.omit(data, 'signature'), data.signature
verifySecret: ({secret, hash}) =>
bcrypt.compareSync secret, hash
module.exports = DeviceAuthenticator