feat: admin auth - save config

pull/621/head
NGPixel 7 years ago
parent 0afa65fa58
commit 2500d8b054

@ -49,11 +49,33 @@ moment.locale(siteConfig.lang)
const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql' const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql'
const graphQLLink = createPersistedQueryLink().concat(createHttpLink({ const graphQLLink = createPersistedQueryLink().concat(
createHttpLink({
includeExtensions: true, includeExtensions: true,
uri: graphQLEndpoint, uri: graphQLEndpoint,
credentials: 'include' credentials: 'include',
})) fetch: (uri, options) => {
// Strip __typename fields from variables
let body = JSON.parse(options.body)
// body = body.map(bd => {
// return ({
// ...bd,
// variables: JSON.parse(JSON.stringify(bd.variables), (key, value) => { return key === '__typename' ? undefined : value })
// })
// })
body = {
...body,
variables: JSON.parse(JSON.stringify(body.variables), (key, value) => { return key === '__typename' ? undefined : value })
}
options.body = JSON.stringify(body)
// Inject authentication token
options.headers.Authorization = `Bearer TODO`
return fetch(uri, options)
}
})
)
window.graphQL = new ApolloClient({ window.graphQL = new ApolloClient({
link: graphQLLink, link: graphQLLink,

@ -13,12 +13,11 @@
.caption.grey--text.pb-2 Some strategies require additional configuration in their dedicated tab (when selected). .caption.grey--text.pb-2 Some strategies require additional configuration in their dedicated tab (when selected).
v-form v-form
v-checkbox( v-checkbox(
v-for='strategy in strategies', v-for='strategy in strategies'
v-model='selectedStrategies', v-model='strategy.isEnabled'
:key='strategy.key', :key='strategy.key'
:label='strategy.title', :label='strategy.title'
:value='strategy.key', color='primary'
color='primary',
:disabled='strategy.key === `local`' :disabled='strategy.key === `local`'
hide-details hide-details
) )
@ -38,29 +37,43 @@
) )
v-divider v-divider
v-subheader.pl-0 Registration v-subheader.pl-0 Registration
.pr-3
v-switch.ml-3( v-switch.ml-3(
v-model='allowSelfRegistration', v-model='strategy.selfRegistration'
label='Allow self-registration', label='Allow self-registration'
:value='true', color='primary'
color='primary', hint='Allow any user successfully authorized by the strategy to access the wiki.'
hint='Allow any user successfully authorized by the strategy to access the wiki.',
persistent-hint persistent-hint
) )
v-text-field.ml-3( v-select.ml-3(
label='Limit to specific email domains' label='Limit to specific email domains'
v-model='strategy.domainWhitelist'
prepend-icon='mail_outline' prepend-icon='mail_outline'
hint='Domain(s) seperated by comma. (e.g. domain1.com, domain2.com)'
persistent-hint persistent-hint
deletable-chips
clearable
multiple
chips
tags
) )
v-text-field.ml-3( v-select.ml-3(
:items='groups'
item-text='name'
item-value='id'
label='Assign to group' label='Assign to group'
v-model='strategy.autoEnrollGroups'
prepend-icon='people' prepend-icon='people'
hint='Automatically assign new users to these groups.' hint='Automatically assign new users to these groups.'
persistent-hint persistent-hint
deletable-chips
autocomplete
clearable
multiple
chips
) )
v-card-chin v-card-chin
v-btn(color='primary') v-btn(color='primary', @click='save')
v-icon(left) chevron_right v-icon(left) chevron_right
span Save span Save
v-spacer v-spacer
@ -72,22 +85,20 @@
<script> <script>
import _ from 'lodash' import _ from 'lodash'
import groupsQuery from 'gql/admin/auth/auth-query-groups.gql'
import strategiesQuery from 'gql/admin/auth/auth-query-strategies.gql' import strategiesQuery from 'gql/admin/auth/auth-query-strategies.gql'
import strategiesSaveMutation from 'gql/admin/auth/auth-mutation-save-strategies.gql' import strategiesSaveMutation from 'gql/admin/auth/auth-mutation-save-strategies.gql'
export default { export default {
data() { data() {
return { return {
strategies: [], groups: [],
selectedStrategies: ['local'], strategies: []
selfRegistration: false,
domainWhitelist: [],
autoEnrollGroups: []
} }
}, },
computed: { computed: {
activeStrategies() { activeStrategies() {
return _.filter(this.strategies, prv => _.includes(this.selectedStrategies, prv.key)) return _.filter(this.strategies, 'isEnabled')
} }
}, },
methods: { methods: {
@ -99,14 +110,26 @@ export default {
icon: 'cached' icon: 'cached'
}) })
}, },
async saveProviders() { async save() {
this.$store.commit(`loadingStart`, 'admin-auth-savestrategies') this.$store.commit(`loadingStart`, 'admin-auth-savestrategies')
await this.$apollo.mutate({ await this.$apollo.mutate({
mutation: strategiesSaveMutation, mutation: strategiesSaveMutation,
variables: { variables: {
strategies: this.auths strategies: this.strategies.map(str => _.pick(str, [
'isEnabled',
'key',
'config',
'selfRegistration',
'domainWhitelist',
'autoEnrollGroups'
]))
} }
}) })
this.$store.commit('showNotification', {
message: 'Strategies saved successfully.',
style: 'success',
icon: 'check'
})
this.$store.commit(`loadingStop`, 'admin-auth-savestrategies') this.$store.commit(`loadingStop`, 'admin-auth-savestrategies')
} }
}, },
@ -114,10 +137,18 @@ export default {
strategies: { strategies: {
query: strategiesQuery, query: strategiesQuery,
fetchPolicy: 'network-only', fetchPolicy: 'network-only',
update: (data) => data.authentication.strategies, update: (data) => _.cloneDeep(data.authentication.strategies),
watchLoading (isLoading) { watchLoading (isLoading) {
this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-refresh') this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-refresh')
} }
},
groups: {
query: groupsQuery,
fetchPolicy: 'network-only',
update: (data) => data.groups.list,
watchLoading (isLoading) {
this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-groups-refresh')
}
} }
} }
} }

@ -1,6 +1,6 @@
mutation($locale: String!, $autoUpdate: Boolean!, $namespacing: Boolean!, $namespaces: [String]!) { mutation($strategies: [AuthenticationStrategyInput]) {
localization { authentication {
updateLocale(locale: $locale, autoUpdate: $autoUpdate, namespacing: $namespacing, namespaces: $namespaces) { updateStrategies(strategies: $strategies) {
responseResult { responseResult {
succeeded succeeded
errorCode errorCode

@ -0,0 +1,8 @@
query {
groups {
list {
id
name
}
}
}

@ -50,6 +50,27 @@ module.exports = {
} catch (err) { } catch (err) {
return graphHelper.generateError(err) return graphHelper.generateError(err)
} }
},
async updateStrategies(obj, args, context) {
try {
for (let str of args.strategies) {
await WIKI.db.authentication.query().patch({
isEnabled: str.isEnabled,
config: _.reduce(str.config, (result, value, key) => {
_.set(result, value.key, value.value)
return result
}, {}),
selfRegistration: str.selfRegistration,
domainWhitelist: { v: str.domainWhitelist },
autoEnrollGroups: { v: str.autoEnrollGroups }
}).where('key', str.key)
}
return {
responseResult: graphHelper.generateSuccess('Strategies updated successfully')
}
} catch (err) {
return graphHelper.generateError(err)
}
} }
}, },
AuthenticationStrategy: { AuthenticationStrategy: {

@ -37,10 +37,8 @@ type AuthenticationMutation {
securityCode: String! securityCode: String!
): DefaultResponse ): DefaultResponse
updateStrategy( updateStrategies(
strategy: String! strategies: [AuthenticationStrategyInput]
isEnabled: Boolean!
config: [KeyValuePairInput]
): DefaultResponse ): DefaultResponse
} }
@ -58,7 +56,7 @@ type AuthenticationStrategy {
config: [KeyValuePair] config: [KeyValuePair]
selfRegistration: Boolean! selfRegistration: Boolean!
domainWhitelist: [String]! domainWhitelist: [String]!
autoEnrollGroups: [String]! autoEnrollGroups: [Int]!
} }
type AuthenticationLoginResponse { type AuthenticationLoginResponse {
@ -66,3 +64,12 @@ type AuthenticationLoginResponse {
tfaRequired: Boolean tfaRequired: Boolean
tfaLoginToken: String tfaLoginToken: String
} }
input AuthenticationStrategyInput {
isEnabled: Boolean!
key: String!
config: [KeyValuePairInput]
selfRegistration: Boolean!
domainWhitelist: [String]!
autoEnrollGroups: [Int]!
}

Loading…
Cancel
Save