mirror of
https://github.com/openstf/stf
synced 2025-10-05 10:39:25 +02:00
merge from master: fixing conflicts
This commit is contained in:
parent
7f5dc4c152
commit
91d828dfdb
5 changed files with 217 additions and 125 deletions
|
@ -325,7 +325,7 @@ ExecStart=/usr/bin/docker run --rm \
|
||||||
-e "SECRET=YOUR_SESSION_SECRET_HERE" \
|
-e "SECRET=YOUR_SESSION_SECRET_HERE" \
|
||||||
-e "SAML_ID_PROVIDER_ENTRY_POINT_URL=YOUR_ID_PROVIDER_ENTRY_POINT" \
|
-e "SAML_ID_PROVIDER_ENTRY_POINT_URL=YOUR_ID_PROVIDER_ENTRY_POINT" \
|
||||||
-e "SAML_ID_PROVIDER_ISSUER=YOUR_ID_PROVIDER_ISSUER" \
|
-e "SAML_ID_PROVIDER_ISSUER=YOUR_ID_PROVIDER_ISSUER" \
|
||||||
-e "SAML_ID_PROVIDER_CERT_PATH=/etc/id_proider.cert" \
|
-e "SAML_ID_PROVIDER_CERT_PATH=/etc/id_provider.cert" \
|
||||||
-p %i:3000 \
|
-p %i:3000 \
|
||||||
openstf/stf:latest \
|
openstf/stf:latest \
|
||||||
stf auth-saml2 --port 3000 \
|
stf auth-saml2 --port 3000 \
|
||||||
|
|
|
@ -7,7 +7,7 @@ var util = require('util')
|
||||||
var _ = require('lodash')
|
var _ = require('lodash')
|
||||||
var Promise = require('bluebird')
|
var Promise = require('bluebird')
|
||||||
var uuid = require('uuid')
|
var uuid = require('uuid')
|
||||||
|
var adbkit = require('adbkit')
|
||||||
var dbapi = require('../../../db/api')
|
var dbapi = require('../../../db/api')
|
||||||
var logger = require('../../../util/logger')
|
var logger = require('../../../util/logger')
|
||||||
var datautil = require('../../../util/datautil')
|
var datautil = require('../../../util/datautil')
|
||||||
|
@ -21,112 +21,22 @@ const jwtutil = require('../../../util/jwtutil')
|
||||||
|
|
||||||
var log = logger.createLogger('api:controllers:user')
|
var log = logger.createLogger('api:controllers:user')
|
||||||
|
|
||||||
function getAccessToken(req, res) {
|
module.exports = {
|
||||||
const id = req.swagger.params.id.value
|
getUser: getUser
|
||||||
|
, getUserDevices: getUserDevices
|
||||||
dbapi.loadAccessToken(id).then(function(token) {
|
, addUserDevice: addUserDevice
|
||||||
if (!token || token.email !== req.user.email) {
|
, getUserDeviceBySerial: getUserDeviceBySerial
|
||||||
apiutil.respond(res, 404, 'Not Found (access token)')
|
, deleteUserDeviceBySerial: deleteUserDeviceBySerial
|
||||||
}
|
, remoteConnectUserDeviceBySerial: remoteConnectUserDeviceBySerial
|
||||||
else {
|
, remoteDisconnectUserDeviceBySerial: remoteDisconnectUserDeviceBySerial
|
||||||
apiutil.respond(res, 200, 'Access Token Information', {
|
, getUserAccessTokens: getUserAccessTokens
|
||||||
token: apiutil.publishAccessToken(token)
|
, addAdbPublicKey: addAdbPublicKey
|
||||||
})
|
, addUserDeviceV2: addUserDevice
|
||||||
}
|
, getAccessTokens: getAccessTokens
|
||||||
})
|
, getAccessToken: getAccessToken
|
||||||
.catch(function(err) {
|
, createAccessToken: createAccessToken
|
||||||
apiutil.internalError(res, 'Failed to delete access token "%s": ', id, err.stack)
|
, deleteAccessToken: deleteAccessToken
|
||||||
})
|
, deleteAccessTokens: deleteAccessTokens
|
||||||
}
|
|
||||||
|
|
||||||
function getAccessTokens(req, res) {
|
|
||||||
dbapi.loadAccessTokens(req.user.email).then(function(cursor) {
|
|
||||||
Promise.promisify(cursor.toArray, cursor)().then(function(tokens) {
|
|
||||||
const tokenList = []
|
|
||||||
|
|
||||||
tokens.forEach(function(token) {
|
|
||||||
tokenList.push(apiutil.publishAccessToken(token))
|
|
||||||
})
|
|
||||||
apiutil.respond(res, 200, 'Access Tokens Information', {tokens: tokenList})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
apiutil.internalError(res, 'Failed to get access tokens: ', err.stack)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function createAccessToken(req, res) {
|
|
||||||
const title = req.swagger.params.title.value
|
|
||||||
const jwt = jwtutil.encode({
|
|
||||||
payload: {
|
|
||||||
email: req.user.email
|
|
||||||
, name: req.user.name
|
|
||||||
}
|
|
||||||
, secret: req.options.secret
|
|
||||||
})
|
|
||||||
const id = util.format('%s-%s', uuid.v4(), uuid.v4()).replace(/-/g, '')
|
|
||||||
|
|
||||||
dbapi.saveUserAccessToken(req.user.email, {
|
|
||||||
title: title
|
|
||||||
, id: id
|
|
||||||
, jwt: jwt
|
|
||||||
})
|
|
||||||
.then(function(stats) {
|
|
||||||
req.options.pushdev.send([
|
|
||||||
req.user.group
|
|
||||||
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
|
||||||
])
|
|
||||||
apiutil.respond(res, 201, 'Created (access token)',
|
|
||||||
{token: apiutil.publishAccessToken(stats.changes[0].new_val)})
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
apiutil.internalError(res, 'Failed to create access token "%s": ', title, err.stack)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteAccessTokens(req, res) {
|
|
||||||
dbapi.removeUserAccessTokens(req.user.email).then(function(stats) {
|
|
||||||
if (!stats.deleted) {
|
|
||||||
apiutil.respond(res, 200, 'Unchanged (access tokens)')
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
req.options.pushdev.send([
|
|
||||||
req.user.group
|
|
||||||
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
|
||||||
])
|
|
||||||
apiutil.respond(res, 200, 'Deleted (access tokens)')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
apiutil.internalError(res, 'Failed to delete access tokens: ', err.stack)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteAccessToken(req, res) {
|
|
||||||
const id = req.swagger.params.id.value
|
|
||||||
|
|
||||||
dbapi.loadAccessToken(id).then(function(token) {
|
|
||||||
if (!token || token.email !== req.user.email) {
|
|
||||||
apiutil.respond(res, 404, 'Not Found (access token)')
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dbapi.removeAccessToken(id).then(function(stats) {
|
|
||||||
if (!stats.deleted) {
|
|
||||||
apiutil.respond(res, 404, 'Not Found (access token)')
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
req.options.pushdev.send([
|
|
||||||
req.user.group
|
|
||||||
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
|
||||||
])
|
|
||||||
apiutil.respond(res, 200, 'Deleted (access token)')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
apiutil.internalError(res, 'Failed to delete access token "%s": ', id, err.stack)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUser(req, res) {
|
function getUser(req, res) {
|
||||||
|
@ -525,19 +435,163 @@ function getUserAccessTokens(req, res) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
function addAdbPublicKey(req, res) {
|
||||||
getUser: getUser
|
var data = req.swagger.params.adb.value
|
||||||
, getUserDevices: getUserDevices
|
adbkit.util.parsePublicKey(data.publickey)
|
||||||
, addUserDevice: addUserDevice
|
.then(function(key) {
|
||||||
, addUserDeviceV2: addUserDevice
|
return dbapi.lookupUsersByAdbKey(key.fingerprint)
|
||||||
, getUserDeviceBySerial: getUserDeviceBySerial
|
.then(function(cursor) {
|
||||||
, deleteUserDeviceBySerial: deleteUserDeviceBySerial
|
return cursor.toArray()
|
||||||
, remoteConnectUserDeviceBySerial: remoteConnectUserDeviceBySerial
|
})
|
||||||
, remoteDisconnectUserDeviceBySerial: remoteDisconnectUserDeviceBySerial
|
.then(function(users) {
|
||||||
, getUserAccessTokens: getUserAccessTokens
|
return {
|
||||||
, getAccessTokens: getAccessTokens
|
key: {
|
||||||
, getAccessToken: getAccessToken
|
title: data.title || key.comment
|
||||||
, createAccessToken: createAccessToken
|
, fingerprint: key.fingerprint
|
||||||
, deleteAccessToken: deleteAccessToken
|
}
|
||||||
, deleteAccessTokens: deleteAccessTokens
|
, users: users
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(function(data) {
|
||||||
|
if (data.users.length) {
|
||||||
|
return res.json({
|
||||||
|
success: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return dbapi.insertUserAdbKey(req.user.email, data.key)
|
||||||
|
.then(function() {
|
||||||
|
return res.json({
|
||||||
|
success: true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(function() {
|
||||||
|
req.options.push.send([
|
||||||
|
req.user.group
|
||||||
|
, wireutil.envelope(new wire.AdbKeysUpdatedMessage())
|
||||||
|
])
|
||||||
|
})
|
||||||
|
.catch(dbapi.DuplicateSecondaryIndexError, function() {
|
||||||
|
// No-op
|
||||||
|
return res.json({
|
||||||
|
success: true
|
||||||
|
})
|
||||||
|
}).catch(function(err) {
|
||||||
|
log.error('Failed to insert new adb key fingerprint: ', err.stack)
|
||||||
|
return res.status(500).json({
|
||||||
|
success: false
|
||||||
|
, message: 'Unable to insert new adb key fingerprint to database'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccessToken(req, res) {
|
||||||
|
const id = req.swagger.params.id.value
|
||||||
|
|
||||||
|
dbapi.loadAccessToken(id).then(function(token) {
|
||||||
|
if (!token || token.email !== req.user.email) {
|
||||||
|
apiutil.respond(res, 404, 'Not Found (access token)')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
apiutil.respond(res, 200, 'Access Token Information', {
|
||||||
|
token: apiutil.publishAccessToken(token)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
apiutil.internalError(res, 'Failed to delete access token "%s": ', id, err.stack)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccessTokens(req, res) {
|
||||||
|
dbapi.loadAccessTokens(req.user.email).then(function(cursor) {
|
||||||
|
Promise.promisify(cursor.toArray, cursor)().then(function(tokens) {
|
||||||
|
const tokenList = []
|
||||||
|
|
||||||
|
tokens.forEach(function(token) {
|
||||||
|
tokenList.push(apiutil.publishAccessToken(token))
|
||||||
|
})
|
||||||
|
apiutil.respond(res, 200, 'Access Tokens Information', {tokens: tokenList})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
apiutil.internalError(res, 'Failed to get access tokens: ', err.stack)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function createAccessToken(req, res) {
|
||||||
|
const title = req.swagger.params.title.value
|
||||||
|
const jwt = jwtutil.encode({
|
||||||
|
payload: {
|
||||||
|
email: req.user.email
|
||||||
|
, name: req.user.name
|
||||||
|
}
|
||||||
|
, secret: req.options.secret
|
||||||
|
})
|
||||||
|
const id = util.format('%s-%s', uuid.v4(), uuid.v4()).replace(/-/g, '')
|
||||||
|
|
||||||
|
dbapi.saveUserAccessToken(req.user.email, {
|
||||||
|
title: title
|
||||||
|
, id: id
|
||||||
|
, jwt: jwt
|
||||||
|
})
|
||||||
|
.then(function(stats) {
|
||||||
|
req.options.pushdev.send([
|
||||||
|
req.user.group
|
||||||
|
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
||||||
|
])
|
||||||
|
apiutil.respond(res, 201, 'Created (access token)',
|
||||||
|
{token: apiutil.publishAccessToken(stats.changes[0].new_val)})
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
apiutil.internalError(res, 'Failed to create access token "%s": ', title, err.stack)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteAccessTokens(req, res) {
|
||||||
|
dbapi.removeUserAccessTokens(req.user.email).then(function(stats) {
|
||||||
|
if (!stats.deleted) {
|
||||||
|
apiutil.respond(res, 200, 'Unchanged (access tokens)')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
req.options.pushdev.send([
|
||||||
|
req.user.group
|
||||||
|
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
||||||
|
])
|
||||||
|
apiutil.respond(res, 200, 'Deleted (access tokens)')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
apiutil.internalError(res, 'Failed to delete access tokens: ', err.stack)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteAccessToken(req, res) {
|
||||||
|
const id = req.swagger.params.id.value
|
||||||
|
|
||||||
|
dbapi.loadAccessToken(id).then(function(token) {
|
||||||
|
if (!token || token.email !== req.user.email) {
|
||||||
|
apiutil.respond(res, 404, 'Not Found (access token)')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dbapi.removeAccessToken(id).then(function(stats) {
|
||||||
|
if (!stats.deleted) {
|
||||||
|
apiutil.respond(res, 404, 'Not Found (access token)')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
req.options.pushdev.send([
|
||||||
|
req.user.group
|
||||||
|
, wireutil.envelope(new wire.UpdateAccessTokenMessage())
|
||||||
|
])
|
||||||
|
apiutil.respond(res, 200, 'Deleted (access token)')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
apiutil.internalError(res, 'Failed to delete access token "%s": ', id, err.stack)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,8 @@ var path = require('path')
|
||||||
var events = require('events')
|
var events = require('events')
|
||||||
|
|
||||||
var express = require('express')
|
var express = require('express')
|
||||||
var SwaggerExpress = require('swagger-express-mw')
|
var swaggerExpress = require('swagger-express-mw')
|
||||||
|
var swaggerUi = require('swagger-tools/middleware/swagger-ui')
|
||||||
var cookieSession = require('cookie-session')
|
var cookieSession = require('cookie-session')
|
||||||
var Promise = require('bluebird')
|
var Promise = require('bluebird')
|
||||||
var _ = require('lodash')
|
var _ = require('lodash')
|
||||||
|
@ -106,10 +107,11 @@ module.exports = function(options) {
|
||||||
, swaggerFile: path.resolve(__dirname, 'swagger', 'api_v1.yaml')
|
, swaggerFile: path.resolve(__dirname, 'swagger', 'api_v1.yaml')
|
||||||
}
|
}
|
||||||
|
|
||||||
SwaggerExpress.create(config, function(err, swaggerExpress) {
|
swaggerExpress.create(config, function(err, swaggerExpress) {
|
||||||
if (err) {
|
if (err) {
|
||||||
throw err
|
throw err
|
||||||
}
|
}
|
||||||
|
app.use(swaggerUi(swaggerExpress.runner.swagger))
|
||||||
swaggerExpress.register(app)
|
swaggerExpress.register(app)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1670,6 +1670,41 @@ paths:
|
||||||
$ref: "#/definitions/UnexpectedErrorResponse"
|
$ref: "#/definitions/UnexpectedErrorResponse"
|
||||||
security:
|
security:
|
||||||
- accessTokenAuth: []
|
- accessTokenAuth: []
|
||||||
|
/user/adbPublicKeys:
|
||||||
|
x-swagger-router-controller: user
|
||||||
|
post:
|
||||||
|
summary: Adb public keys
|
||||||
|
description: Add adb public key for current user
|
||||||
|
operationId: addAdbPublicKey
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
tags:
|
||||||
|
- user
|
||||||
|
parameters:
|
||||||
|
- name: adb
|
||||||
|
in: body
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- publickey
|
||||||
|
properties:
|
||||||
|
publickey:
|
||||||
|
type: string
|
||||||
|
description: adb public key (~/.android/id_rsa.pub)
|
||||||
|
title:
|
||||||
|
type: string
|
||||||
|
description: By default will be extracted from public key
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Add adb key response
|
||||||
|
default:
|
||||||
|
description: Unexpected Error
|
||||||
|
schema:
|
||||||
|
$ref: "#/definitions/ErrorResponse"
|
||||||
|
security:
|
||||||
|
- accessTokenAuth: []
|
||||||
/devices:
|
/devices:
|
||||||
x-swagger-router-controller: devices
|
x-swagger-router-controller: devices
|
||||||
get:
|
get:
|
||||||
|
|
|
@ -87,6 +87,7 @@
|
||||||
"stf-syrup": "^1.0.0",
|
"stf-syrup": "^1.0.0",
|
||||||
"stf-wiki": "^1.0.0",
|
"stf-wiki": "^1.0.0",
|
||||||
"swagger-express-mw": "^0.7.0",
|
"swagger-express-mw": "^0.7.0",
|
||||||
|
"swagger-tools": "^0.10.3",
|
||||||
"temp": "^0.8.1",
|
"temp": "^0.8.1",
|
||||||
"transliteration": "^1.1.6",
|
"transliteration": "^1.1.6",
|
||||||
"url-join": "1.1.0",
|
"url-join": "1.1.0",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue