endo-core
Version:
Put some description here
127 lines (106 loc) • 5.34 kB
text/coffeescript
_ = require 'lodash'
MeshbluHTTP = require 'meshblu-http'
CredentialsDevice = require '../models/credentials-device'
credentialsDeviceCreateGenerator = require '../config-generators/credentials-device-create-config-generator'
Encryption = require 'meshblu-encryption'
class CredentialsDeviceService
constructor: ({, , , , }) ->
throw new Error('deviceType is required') unless ?
= .uuid
= new MeshbluHTTP
= Encryption.fromJustGuess .privateKey
authorizedFind: ({authorizedUuid, credentialsDeviceUuid}, callback) =>
authorizedKey = .sign(authorizedUuid)
.search {uuid: credentialsDeviceUuid, 'endo.authorizedKey': authorizedKey}, {}, (error, devices) =>
return callback(error) if error?
device = _.first devices
return callback ('credentials device not found', 404) unless device?.endo?.encrypted?
return callback ('credentials device not found', 404) unless device
options =
uuid: credentialsDeviceUuid
encrypted: device.endo.encrypted
return options, callback
getEndoByUuid: (uuid, callback) =>
.search {uuid}, as: uuid, (error, devices) =>
if error?
return uuid, callback if error.code == 403
return callback error
device = _.first devices
return callback 'invalid credentials device', 400 unless device
return callback null, device.endo
_handleRefreshToken: ({endo, credentialsUuid, userDeviceUuid}, callback) =>
return callback null, endo unless ?
{ encrypted } = endo
encrypted = .decrypt encrypted
{ secrets } = encrypted
.isTokenValid secrets, (error, isValid) =>
return callback error if error?
return callback null, endo if isValid
.refreshToken secrets, (error, secrets) =>
return callback error if error?
encrypted.secrets = secrets
{ credentialsUuid, userDeviceUuid, encrypted }, (error) =>
return callback error if error?
credentialsUuid, callback
_updateEncryptedCredentials: ({credentialsDevice, userDeviceUuid, encrypted }, callback) =>
resourceOwnerID = encrypted.id
resourceOwnerID, (error, credentialsDevice) =>
credentialsDevice.getUserDevice userDeviceUuid, (error, userDevice) =>
return callback error if error?
authorizedUuid = userDevice.owner
id = resourceOwnerID
credentialsDevice.update { authorizedUuid, encrypted, id}, callback
_updateDiscoverAsPermissionsAndGetEndo: (uuid, callback) =>
update = '$addToSet': 'meshblu.whitelists.discover.as': {}
.updateDangerously uuid, update, (error) =>
return callback error if error?
uuid, callback
getCredentialsTokenFromEndo: ({encrypted}) =>
.decrypt(encrypted)?.secrets?.credentialsDeviceToken
findOrCreate: (resourceOwnerID, callback) =>
resourceOwnerID, (error, device) =>
return callback error if error?
device, callback
_findOrCreate: (resourceOwnerID, callback) =>
return callback new Error('resourceOwnerID is required') unless resourceOwnerID?
idKey = .sign(resourceOwnerID)
.search 'endo.idKey': idKey, {}, (error, devices) =>
return callback error if error?
devices = _.filter devices,
return callback null, _.first devices unless _.isEmpty devices
record = credentialsDeviceCreateGenerator {serviceUuid: }
.register record, (error, device) =>
return callback error if error?
device.uuid, (error) =>
return callback error, device
_subscribeToCredentialsMessagesReceived: (credentialsUuid, callback) =>
subscription = {subscriberUuid: , emitterUuid: credentialsUuid, type: 'message.received'}
.createSubscription subscription, callback
_getCredentialsDevice: ({uuid, encrypted}, callback) =>
.generateAndStoreToken uuid, (error, {token}={}) =>
return callback new Error("Failed to access credentials device") if error?
meshbluConfig = _.defaults {uuid, token},
serviceUuid =
return callback null, new CredentialsDevice {
meshbluConfig
encrypted
serviceUuid
}
_isSignedCorrectly: ({endo, endoSignature, uuid}={}) =>
return false unless endo?.encrypted?
return false unless endo?.credentialsDeviceUuid == uuid
endo = _.cloneDeep endo
try
endo.encrypted = .decrypt endo?.encrypted
catch error
console.error error.stack
return false
return .verify endo, endoSignature
_userError: (message, code) =>
error = new Error message
error.code = code if code?
return error
module.exports = CredentialsDeviceService