mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2025-05-09 12:22:55 +00:00
Add API endpoint to expire and create new API key
This commit is contained in:
parent
4130df7771
commit
b57dd10e81
@ -1,3 +1,4 @@
|
|||||||
|
* Add API endpoint to expire and create new API key [Pablo]
|
||||||
* Enable control of API poll interval through Device Variables [Praneeth]
|
* Enable control of API poll interval through Device Variables [Praneeth]
|
||||||
* Allow control of VPN + TCP check + Pub nub logs with Device Environment variables [Praneeth]
|
* Allow control of VPN + TCP check + Pub nub logs with Device Environment variables [Praneeth]
|
||||||
* Add GO api for openvpn control [Praneeth]
|
* Add GO api for openvpn control [Praneeth]
|
||||||
|
@ -7,15 +7,21 @@ express = require 'express'
|
|||||||
bodyParser = require 'body-parser'
|
bodyParser = require 'body-parser'
|
||||||
request = require 'request'
|
request = require 'request'
|
||||||
config = require './config'
|
config = require './config'
|
||||||
|
device = require './device'
|
||||||
|
|
||||||
module.exports = (secret, application) ->
|
module.exports = (application) ->
|
||||||
api = express()
|
api = express()
|
||||||
api.use(bodyParser())
|
api.use(bodyParser())
|
||||||
api.use (req, res, next) ->
|
api.use (req, res, next) ->
|
||||||
if req.query.apikey is secret
|
utils.getOrGenerateApiSecret()
|
||||||
next()
|
.then (secret) ->
|
||||||
else
|
if req.query.apikey is secret
|
||||||
res.sendStatus(401)
|
next()
|
||||||
|
else
|
||||||
|
res.sendStatus(401)
|
||||||
|
.catch (err) ->
|
||||||
|
# This should never happen...
|
||||||
|
res.status(503).send('Invalid API key in supervisor')
|
||||||
|
|
||||||
api.get '/ping', (req, res) ->
|
api.get '/ping', (req, res) ->
|
||||||
res.send('OK')
|
res.send('OK')
|
||||||
@ -120,4 +126,14 @@ module.exports = (secret, application) ->
|
|||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
res.status(503).send(err?.message or err or 'Unknown error')
|
res.status(503).send(err?.message or err or 'Unknown error')
|
||||||
|
|
||||||
|
# Expires the supervisor's API key and generates a new one.
|
||||||
|
# It also communicates the new key to the Resin API.
|
||||||
|
api.post '/v1/regenerate-api-key', (req, res) ->
|
||||||
|
utils.newApiSecret()
|
||||||
|
.then (secret) ->
|
||||||
|
device.updateState(apikey: secret)
|
||||||
|
res.status(200).send(secret)
|
||||||
|
.catch (err) ->
|
||||||
|
res.status(503).send(err?.message or err or 'Unknown error')
|
||||||
|
|
||||||
return api
|
return api
|
||||||
|
@ -25,7 +25,7 @@ knex.init.then ->
|
|||||||
bootstrap.done
|
bootstrap.done
|
||||||
.then ->
|
.then ->
|
||||||
console.log('Starting API server..')
|
console.log('Starting API server..')
|
||||||
api(secret, application).listen(config.listenPort)
|
api(application).listen(config.listenPort)
|
||||||
# Let API know what version we are, and our api connection info.
|
# Let API know what version we are, and our api connection info.
|
||||||
console.log('Updating supervisor version and api info')
|
console.log('Updating supervisor version and api info')
|
||||||
device.updateState(
|
device.updateState(
|
||||||
|
@ -101,19 +101,28 @@ exports.connectivityCheck = _.once ->
|
|||||||
console.log('Waiting for connectivity...')
|
console.log('Waiting for connectivity...')
|
||||||
blink.pattern.start(networkPattern)
|
blink.pattern.start(networkPattern)
|
||||||
|
|
||||||
exports.getOrGenerateApiSecret = do ->
|
|
||||||
apiSecretPromise = null
|
apiSecretPromise = null
|
||||||
return ->
|
generateApiSecret = ->
|
||||||
apiSecretPromise ?= Promise.rejected()
|
Promise.try ->
|
||||||
apiSecretPromise = apiSecretPromise.catch ->
|
return config.forceApiSecret ? randomHexString.generate()
|
||||||
knex('config').select('value').where(key: 'apiSecret')
|
.then (newSecret) ->
|
||||||
.then ([ apiSecret ]) ->
|
secretInDB = { key: 'apiSecret', value: newSecret }
|
||||||
return apiSecret.value if apiSecret?
|
knex('config').update(secretInDB).where(key: 'apiSecret')
|
||||||
Promise.try ->
|
.then (affectedRows) ->
|
||||||
return config.forceApiSecret ? randomHexString.generate()
|
knex('config').insert(secretInDB) if affectedRows == 0
|
||||||
.then (newSecret) ->
|
.return(newSecret)
|
||||||
knex('config').insert([{ key: 'apiSecret', value: newSecret }])
|
|
||||||
.return(newSecret)
|
exports.newApiSecret = newApiSecret = ->
|
||||||
|
apiSecretPromise ?= Promise.resolve()
|
||||||
|
apiSecretPromise = apiSecretPromise.then ->
|
||||||
|
generateApiSecret()
|
||||||
|
|
||||||
|
exports.getOrGenerateApiSecret = ->
|
||||||
|
apiSecretPromise ?= knex('config').select('value').where(key: 'apiSecret').then ([ apiSecret ]) ->
|
||||||
|
return apiSecret.value if apiSecret?
|
||||||
|
generateApiSecret()
|
||||||
|
return apiSecretPromise
|
||||||
|
|
||||||
exports.extendEnvVars = (env, uuid) ->
|
exports.extendEnvVars = (env, uuid) ->
|
||||||
host = '127.0.0.1'
|
host = '127.0.0.1'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user