1
0
Fork 0
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:
Denis barbaron 2019-08-27 15:04:33 +02:00
parent 7f5dc4c152
commit 91d828dfdb
5 changed files with 217 additions and 125 deletions

View file

@ -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 \

View file

@ -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)
})
} }

View file

@ -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)
}) })

View file

@ -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:

View file

@ -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",