Improved oauth admin area.

This commit is contained in:
Martin Edenhofer 2016-11-13 22:16:17 +01:00
parent faafe0cc60
commit 48e084df3d
7 changed files with 119 additions and 19 deletions

View file

@ -76,14 +76,15 @@ class App.ControllerTable extends App.Controller
e.preventDefault()
console.log('checkboxClick', e.target)
callbackHeader = (header) ->
console.log('current header is', header)
callbackHeader = (headers) ->
console.log('current header is', headers)
# add new header item
attribute =
name: 'some name'
display: 'Some Name'
header.push attribute
console.log('new header is', header)
headers.push attribute
console.log('new header is', headers)
headers
callbackAttributes = (value, object, attribute, header, refObject) ->
console.log('data of item col', value, object, attribute, header, refObject)

View file

@ -34,20 +34,47 @@ class Index extends App.ControllerSubContent
App.Setting.unsubscribe(@subscribeApplicationId)
table = =>
callbackHeader = (headers) ->
attribute =
name: 'view'
display: 'View'
headers.splice(3, 0, attribute)
attribute =
name: 'token'
display: 'Token'
headers.splice(4, 0, attribute)
headers
callbackViewAttributes = (value, object, attribute, header, refObject) ->
value = 'X'
value
callbackTokenAttributes = (value, object, attribute, header, refObject) ->
value = 'X'
value
new App.ControllerTable(
el: @$('.js-appList')
model: App.Application
table_id: 'applications'
objects: App.Application.all()
el: @$('.js-appList')
model: App.Application
table_id: 'applications'
objects: App.Application.all()
bindRow:
events:
'click': @appEdit
bindCol:
view:
events:
'click': @appView
token:
events:
'click': @appToken
callbackHeader: [callbackHeader]
callbackAttributes:
view: [callbackViewAttributes]
token: [callbackTokenAttributes]
)
table()
#App.Application.fetchFull(
# table
# clear: true
#)
@subscribeApplicationId = App.Application.subscribe(table, initFetch: true, clear: true)
@ -82,6 +109,18 @@ class Index extends App.ControllerSubContent
value = @PasswordAccess.prop('checked')
App.Setting.set('api_password_access', value)
appToken: (id, e) ->
e.preventDefault()
new ViewAppTokenModal(
app: App.Application.find(id)
)
appView: (id, e) ->
e.preventDefault()
new ViewAppModal(
app: App.Application.find(id)
)
appNew: (e) ->
e.preventDefault()
new App.ControllerGenericNew(
@ -107,4 +146,51 @@ class Index extends App.ControllerSubContent
container: @el.closest('.content')
)
class ViewAppModal extends App.ControllerModal
headPrefix: 'App'
buttonSubmit: false
buttonCancel: true
shown: true
small: true
events:
'click .js-select': 'selectAll'
constructor: (params) ->
@head = params.app.name
super
content: ->
"AppID: <input class=\"js-select\" type=\"text\" value=\"#{@app.uid}\">
<br>
Secret: <input class=\"js-select\" type=\"text\" value=\"#{@app.secret}\">"
class ViewAppTokenModal extends App.ControllerModal
headPrefix: 'Generate Token'
buttonSubmit: 'Generate Token'
buttonCancel: true
shown: true
small: true
events:
'click .js-select': 'selectAll'
constructor: (params) ->
@head = params.app.name
super
content: ->
"#{App.i18n.translateContent('Generate Access Token for |%s|', App.Session.get().displayNameLong())}"
onSubmit: =>
@ajax(
id: 'application_token'
type: 'POST'
url: "#{@apiPath}/applications/token"
processData: true
data: JSON.stringify(id: @app.id)
success: (data, status, xhr) =>
@contentInline = "#{App.i18n.translateContent('New Access Token is')}: <input class=\"js-select\" type=\"text\" value=\"#{data.token}\">"
@update()
@$('.js-submit').remove()
)
App.Config.set('API', { prio: 1200, name: 'API', parent: '#system', target: '#system/api', controller: Index, permission: ['admin.api'] }, 'NavBarAdmin')

View file

@ -1,17 +1,16 @@
class App.Application extends App.Model
@configure 'Application', 'name', 'redirect_uri', 'uid', 'secret'
@configure 'Application', 'name', 'redirect_uri'
@extend Spine.Model.Ajax
@url: @apiPath + '/applications'
@configure_attributes = [
{ name: 'name', display: 'Name', tag: 'input', type: 'text', limit: 100, null: false },
{ name: 'redirect_uri', display: 'Redirect URI', tag: 'textarea', limit: 250, null: false, note: 'Use one line per URI' },
{ name: 'uid', display: 'Application ID', tag: 'input', type: 'text', null: true, readonly: 1 },
{ name: 'secret', display: 'Application secret', tag: 'input', type: 'text', null: true },
{ name: 'redirect_uri', display: 'Callback URL', tag: 'textarea', limit: 250, null: false, note: 'Use one line per URI' },
{ name: 'clients', display: 'Clients', tag: 'input', readonly: 1 },
{ name: 'created_at', display: 'Created', tag: 'datetime', readonly: 1 },
{ name: 'updated_at', display: 'Updated', tag: 'datetime', readonly: 1 },
]
@configure_overview = [
'name', 'uid'
'name', 'redirect_uri', 'clients'
]
@configure_delete = true

View file

@ -51,6 +51,7 @@ curl -u <%= @S('email') %>:some_password <%= @C('http_type') %>://<%= @C('fqdn')
<button class="btn js-appNew"><%- @T('New Application') %></button>
<br>
<br>
<div>

View file

@ -308,6 +308,10 @@ class ApplicationController < ActionController::Base
logger.debug "oauth2 token auth check '#{token}'"
access_token = Doorkeeper::AccessToken.by_token(token)
if !access_token
raise Exceptions::NotAuthorized, 'Invalid token!'
end
# check expire
if access_token.expires_in && (access_token.created_at + access_token.expires_in) < Time.zone.now
raise Exceptions::NotAuthorized, 'OAuth2 token is expired!'

View file

@ -1,4 +1,4 @@
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class ApplicationsController < ApplicationController
before_action { authentication_check(permission: 'admin.api') }
@ -13,7 +13,9 @@ class ApplicationsController < ApplicationController
if !assets[:Application]
assets[:Application] = {}
end
assets[:Application][item.id] = item.attributes
application = item.attributes
application[:clients] = Doorkeeper::AccessToken.where(application_id: item.id).count
assets[:Application][item.id] = application
}
render json: {
record_ids: item_ids,
@ -25,6 +27,11 @@ class ApplicationsController < ApplicationController
render json: all, status: :ok
end
def token
access_token = Doorkeeper::AccessToken.create!(application_id: params[:id], resource_owner_id: current_user.id)
render json: { token: access_token.token }, status: :ok
end
def show
application = Doorkeeper::Application.find(params[:id])
render json: application, status: :ok
@ -59,6 +66,7 @@ class ApplicationsController < ApplicationController
params_data.delete('uid')
params_data.delete('secret')
params_data.delete('created_at')
params_data.delete('updated_at')
params_data
end
end

View file

@ -5,6 +5,7 @@ Zammad::Application.routes.draw do
match api_path + '/applications/:id', to: 'applications#show', via: :get
match api_path + '/applications', to: 'applications#create', via: :post
match api_path + '/applications/:id', to: 'applications#update', via: :put
match api_path + '/applications/token', to: 'applications#token', via: :post
# oauth2 provider routes
use_doorkeeper do