blob: 6de491a6f5d8b68ab94507d8f618f1ccfa0df5b6 [file] [log] [blame]
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -07001<template>
2 <b-container fluid="xl">
3 <page-title :description="$t('pageLdap.pageDescription')" />
4 <page-section :section-title="$t('pageLdap.settings')">
5 <b-form novalidate @submit.prevent="handleSubmit">
Yoshie Muranaka1c536592020-11-17 09:03:46 -08006 <b-row>
7 <b-col>
Mateusz Gapski471f2e02020-07-27 14:43:26 +02008 <b-form-group
Yoshie Muranaka1c536592020-11-17 09:03:46 -08009 class="mb-3"
10 :label="$t('pageLdap.form.ldapAuthentication')"
11 :disabled="loading"
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -070012 >
Yoshie Muranaka1c536592020-11-17 09:03:46 -080013 <b-form-checkbox
14 v-model="form.ldapAuthenticationEnabled"
15 data-test-id="ldap-checkbox-ldapAuthenticationEnabled"
16 @change="onChangeldapAuthenticationEnabled"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020017 >
Yoshie Muranaka1c536592020-11-17 09:03:46 -080018 {{ $t('global.action.enable') }}
19 </b-form-checkbox>
20 </b-form-group>
21 </b-col>
22 </b-row>
23 <div class="form-background p-3">
24 <b-form-group
25 class="m-0"
26 :label="$t('pageLdap.ariaLabel.ldapSettings')"
27 label-class="sr-only"
28 :disabled="!form.ldapAuthenticationEnabled || loading"
29 >
30 <b-row>
31 <b-col md="3" lg="4" xl="3">
32 <b-form-group
33 class="mb-4"
34 :label="$t('pageLdap.form.secureLdapUsingSsl')"
35 >
36 <b-form-text id="enable-secure-help-block">
37 {{ $t('pageLdap.form.secureLdapHelper') }}
38 </b-form-text>
39 <b-form-checkbox
40 id="enable-secure-ldap"
41 v-model="form.secureLdapEnabled"
42 aria-describedby="enable-secure-help-block"
43 data-test-id="ldap-checkbox-secureLdapEnabled"
44 :disabled="
45 !caCertificateExpiration || !ldapCertificateExpiration
46 "
Surya Vde23ea22024-07-11 15:19:46 +053047 @change="v$.form.secureLdapEnabled.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -080048 >
49 {{ $t('global.action.enable') }}
50 </b-form-checkbox>
51 </b-form-group>
52 <dl>
53 <dt>{{ $t('pageLdap.form.caCertificateValidUntil') }}</dt>
54 <dd v-if="caCertificateExpiration">
Surya Vde23ea22024-07-11 15:19:46 +053055 {{ $filters.formatDate(caCertificateExpiration) }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080056 </dd>
57 <dd v-else>--</dd>
58 <dt>{{ $t('pageLdap.form.ldapCertificateValidUntil') }}</dt>
59 <dd v-if="ldapCertificateExpiration">
Surya Vde23ea22024-07-11 15:19:46 +053060 {{ $filters.formatDate(ldapCertificateExpiration) }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080061 </dd>
62 <dd v-else>--</dd>
63 </dl>
64 <b-link
65 class="d-inline-block mb-4 m-md-0"
Sandeepa Singhb4406162021-07-26 15:05:39 +053066 to="/security-and-access/certificates"
Yoshie Muranaka1c536592020-11-17 09:03:46 -080067 >
68 {{ $t('pageLdap.form.manageSslCertificates') }}
69 </b-link>
70 </b-col>
71 <b-col md="9" lg="8" xl="9">
72 <b-row>
73 <b-col>
74 <b-form-group :label="$t('pageLdap.form.serviceType')">
75 <b-form-radio
76 v-model="form.activeDirectoryEnabled"
77 data-test-id="ldap-radio-activeDirectoryEnabled"
78 :value="false"
79 @change="onChangeServiceType"
80 >
Nikhil Ashoka65fa7bf2023-06-15 14:11:12 +053081 {{ $t('pageLdap.form.openLDAP') }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080082 </b-form-radio>
83 <b-form-radio
84 v-model="form.activeDirectoryEnabled"
85 data-test-id="ldap-radio-activeDirectoryEnabled"
86 :value="true"
87 @change="onChangeServiceType"
88 >
Nikhil Ashoka65fa7bf2023-06-15 14:11:12 +053089 {{ $t('pageLdap.form.activeDirectory') }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080090 </b-form-radio>
91 </b-form-group>
92 </b-col>
93 </b-row>
94 <b-row>
95 <b-col sm="6" xl="4">
96 <b-form-group label-for="server-uri">
97 <template #label>
98 {{ $t('pageLdap.form.serverUri') }}
99 <info-tooltip
100 :title="$t('pageLdap.form.serverUriTooltip')"
101 />
102 </template>
103 <b-input-group :prepend="ldapProtocol">
104 <b-form-input
105 id="server-uri"
106 v-model="form.serverUri"
107 data-test-id="ldap-input-serverUri"
Surya Vde23ea22024-07-11 15:19:46 +0530108 :state="getValidationState(v$.form.serverUri)"
109 @change="v$.form.serverUri.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800110 />
111 <b-form-invalid-feedback role="alert">
112 {{ $t('global.form.fieldRequired') }}
113 </b-form-invalid-feedback>
114 </b-input-group>
115 </b-form-group>
116 </b-col>
117 <b-col sm="6" xl="4">
118 <b-form-group
119 :label="$t('pageLdap.form.bindDn')"
120 label-for="bind-dn"
121 >
122 <b-form-input
123 id="bind-dn"
124 v-model="form.bindDn"
125 data-test-id="ldap-input-bindDn"
Surya Vde23ea22024-07-11 15:19:46 +0530126 :state="getValidationState(v$.form.bindDn)"
127 @change="v$.form.bindDn.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800128 />
129 <b-form-invalid-feedback role="alert">
130 {{ $t('global.form.fieldRequired') }}
131 </b-form-invalid-feedback>
132 </b-form-group>
133 </b-col>
134 <b-col sm="6" xl="4">
135 <b-form-group
136 :label="$t('pageLdap.form.bindPassword')"
137 label-for="bind-password"
138 >
139 <input-password-toggle
140 data-test-id="ldap-input-togglePassword"
141 >
142 <b-form-input
143 id="bind-password"
144 v-model="form.bindPassword"
145 type="password"
Surya Vde23ea22024-07-11 15:19:46 +0530146 :state="getValidationState(v$.form.bindPassword)"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800147 class="form-control-with-button"
Surya Vde23ea22024-07-11 15:19:46 +0530148 @change="v$.form.bindPassword.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800149 />
150 <b-form-invalid-feedback role="alert">
151 {{ $t('global.form.fieldRequired') }}
152 </b-form-invalid-feedback>
153 </input-password-toggle>
154 </b-form-group>
155 </b-col>
156 <b-col sm="6" xl="4">
157 <b-form-group
158 :label="$t('pageLdap.form.baseDn')"
159 label-for="base-dn"
160 >
161 <b-form-input
162 id="base-dn"
163 v-model="form.baseDn"
164 data-test-id="ldap-input-baseDn"
Surya Vde23ea22024-07-11 15:19:46 +0530165 :state="getValidationState(v$.form.baseDn)"
166 @change="v$.form.baseDn.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800167 />
168 <b-form-invalid-feedback role="alert">
169 {{ $t('global.form.fieldRequired') }}
170 </b-form-invalid-feedback>
171 </b-form-group>
172 </b-col>
173 <b-col sm="6" xl="4">
174 <b-form-group label-for="user-id-attribute">
175 <template #label>
176 {{ $t('pageLdap.form.userIdAttribute') }} -
177 <span class="form-text d-inline">
178 {{ $t('global.form.optional') }}
179 </span>
180 </template>
181 <b-form-input
182 id="user-id-attribute"
183 v-model="form.userIdAttribute"
184 data-test-id="ldap-input-userIdAttribute"
Surya Vde23ea22024-07-11 15:19:46 +0530185 @change="v$.form.userIdAttribute.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800186 />
187 </b-form-group>
188 </b-col>
189 <b-col sm="6" xl="4">
190 <b-form-group label-for="group-id-attribute">
191 <template #label>
192 {{ $t('pageLdap.form.groupIdAttribute') }} -
193 <span class="form-text d-inline">
194 {{ $t('global.form.optional') }}
195 </span>
196 </template>
197 <b-form-input
198 id="group-id-attribute"
199 v-model="form.groupIdAttribute"
200 data-test-id="ldap-input-groupIdAttribute"
Surya Vde23ea22024-07-11 15:19:46 +0530201 @change="v$.form.groupIdAttribute.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800202 />
203 </b-form-group>
204 </b-col>
205 </b-row>
206 </b-col>
207 </b-row>
208 </b-form-group>
209 </div>
210 <b-row class="mt-4 mb-5">
211 <b-col>
212 <b-btn
213 variant="primary"
214 type="submit"
215 data-test-id="ldap-button-saveSettings"
216 :disabled="loading"
217 >
218 {{ $t('global.action.saveSettings') }}
219 </b-btn>
220 </b-col>
221 </b-row>
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700222 </b-form>
223 </page-section>
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700224
225 <!-- Role groups -->
226 <page-section :section-title="$t('pageLdap.roleGroups')">
227 <table-role-groups />
228 </page-section>
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700229 </b-container>
230</template>
231
232<script>
233import { mapGetters } from 'vuex';
234import { find } from 'lodash';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700235import { requiredIf } from '@vuelidate/validators';
236import { useVuelidate } from '@vuelidate/core';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700237
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700238import BVToastMixin from '@/components/Mixins/BVToastMixin';
239import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800240import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
Derick Montagued853fba2020-07-16 11:24:10 -0500241import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700242import PageTitle from '@/components/Global/PageTitle';
243import PageSection from '@/components/Global/PageSection';
244import InfoTooltip from '@/components/Global/InfoTooltip';
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700245import TableRoleGroups from './TableRoleGroups';
Surya Vde23ea22024-07-11 15:19:46 +0530246import { useI18n } from 'vue-i18n';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700247
248export default {
249 name: 'Ldap',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700250 components: {
251 InfoTooltip,
252 InputPasswordToggle,
253 PageTitle,
254 PageSection,
Derick Montague602e98a2020-10-21 16:20:00 -0500255 TableRoleGroups,
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700256 },
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700257 mixins: [BVToastMixin, VuelidateMixin, LoadingBarMixin],
Derick Montague602e98a2020-10-21 16:20:00 -0500258 beforeRouteLeave(to, from, next) {
259 this.hideLoader();
260 next();
261 },
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700262 setup() {
263 return {
264 v$: useVuelidate(),
265 };
266 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700267 data() {
268 return {
Surya Vde23ea22024-07-11 15:19:46 +0530269 $t: useI18n().t,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700270 form: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700271 ldapAuthenticationEnabled: this.$store.getters['ldap/isServiceEnabled'],
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700272 secureLdapEnabled: false,
Ed Tanous81323992024-02-27 11:26:24 -0800273 activeDirectoryEnabled:
274 this.$store.getters['ldap/isActiveDirectoryEnabled'],
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700275 serverUri: '',
276 bindDn: '',
277 bindPassword: '',
278 baseDn: '',
279 userIdAttribute: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500280 groupIdAttribute: '',
281 },
Surya Venkatesan1a814b92024-09-23 16:29:01 +0530282 loading,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700283 };
284 },
285 computed: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700286 ...mapGetters('ldap', [
287 'isServiceEnabled',
288 'isActiveDirectoryEnabled',
289 'ldap',
Derick Montague602e98a2020-10-21 16:20:00 -0500290 'activeDirectory',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700291 ]),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700292 sslCertificates() {
Sandeepa Singhb4406162021-07-26 15:05:39 +0530293 return this.$store.getters['certificates/allCertificates'];
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700294 },
295 caCertificateExpiration() {
296 const caCertificate = find(this.sslCertificates, {
Derick Montague602e98a2020-10-21 16:20:00 -0500297 type: 'TrustStore Certificate',
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700298 });
299 if (caCertificate === undefined) return null;
300 return caCertificate.validUntil;
301 },
302 ldapCertificateExpiration() {
303 const ldapCertificate = find(this.sslCertificates, {
Derick Montague602e98a2020-10-21 16:20:00 -0500304 type: 'LDAP Certificate',
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700305 });
306 if (ldapCertificate === undefined) return null;
307 return ldapCertificate.validUntil;
308 },
309 ldapProtocol() {
310 return this.form.secureLdapEnabled ? 'ldaps://' : 'ldap://';
Derick Montague602e98a2020-10-21 16:20:00 -0500311 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700312 },
313 watch: {
Derick Montague602e98a2020-10-21 16:20:00 -0500314 isServiceEnabled: function (value) {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700315 this.form.ldapAuthenticationEnabled = value;
316 },
Derick Montague602e98a2020-10-21 16:20:00 -0500317 isActiveDirectoryEnabled: function (value) {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700318 this.form.activeDirectoryEnabled = value;
319 this.setFormValues();
Derick Montague602e98a2020-10-21 16:20:00 -0500320 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700321 },
322 validations: {
323 form: {
324 ldapAuthenticationEnabled: {},
325 secureLdapEnabled: {},
326 activeDirectoryEnabled: {
Derick Montague602e98a2020-10-21 16:20:00 -0500327 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700328 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500329 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700330 },
331 serverUri: {
Derick Montague602e98a2020-10-21 16:20:00 -0500332 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700333 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500334 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700335 },
336 bindDn: {
Derick Montague602e98a2020-10-21 16:20:00 -0500337 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700338 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500339 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700340 },
341 bindPassword: {
Derick Montague602e98a2020-10-21 16:20:00 -0500342 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700343 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500344 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700345 },
346 baseDn: {
Derick Montague602e98a2020-10-21 16:20:00 -0500347 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700348 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500349 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700350 },
351 userIdAttribute: {},
Derick Montague602e98a2020-10-21 16:20:00 -0500352 groupIdAttribute: {},
353 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700354 },
355 created() {
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700356 this.startLoader();
357 this.$store
358 .dispatch('ldap/getAccountSettings')
359 .finally(() => this.endLoader());
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530360 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530361 .dispatch('certificates/getCertificates')
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530362 .finally(() => this.endLoader());
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700363 this.setFormValues();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700364 },
365 methods: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700366 setFormValues(serviceType) {
367 if (!serviceType) {
368 serviceType = this.isActiveDirectoryEnabled
369 ? this.activeDirectory
370 : this.ldap;
371 }
372 const {
373 serviceAddress = '',
374 bindDn = '',
375 baseDn = '',
376 userAttribute = '',
Derick Montague602e98a2020-10-21 16:20:00 -0500377 groupsAttribute = '',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700378 } = serviceType;
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700379 const secureLdap =
380 serviceAddress && serviceAddress.includes('ldaps://') ? true : false;
381 const serverUri = serviceAddress
382 ? serviceAddress.replace(/ldaps?:\/\//, '')
383 : '';
384 this.form.secureLdapEnabled = secureLdap;
385 this.form.serverUri = serverUri;
386 this.form.bindDn = bindDn;
387 this.form.bindPassword = '';
388 this.form.baseDn = baseDn;
389 this.form.userIdAttribute = userAttribute;
390 this.form.groupIdAttribute = groupsAttribute;
391 },
392 handleSubmit() {
Surya Venkatesan1a814b92024-09-23 16:29:01 +0530393 this.v$.form.$touch();
394 if (this.v$.form.$invalid) return;
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700395 const data = {
396 serviceEnabled: this.form.ldapAuthenticationEnabled,
397 activeDirectoryEnabled: this.form.activeDirectoryEnabled,
398 serviceAddress: `${this.ldapProtocol}${this.form.serverUri}`,
399 bindDn: this.form.bindDn,
400 bindPassword: this.form.bindPassword,
401 baseDn: this.form.baseDn,
402 userIdAttribute: this.form.userIdAttribute,
Derick Montague602e98a2020-10-21 16:20:00 -0500403 groupIdAttribute: this.form.groupIdAttribute,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700404 };
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700405 this.startLoader();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700406 this.$store
407 .dispatch('ldap/saveAccountSettings', data)
Derick Montague602e98a2020-10-21 16:20:00 -0500408 .then((success) => {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700409 this.successToast(success);
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700410 })
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530411 .catch(({ message }) => {
412 this.errorToast(message);
413 })
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700414 .finally(() => {
415 this.form.bindPassword = '';
Surya Vde23ea22024-07-11 15:19:46 +0530416 this.v$.form.$reset();
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700417 this.endLoader();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700418 });
419 },
420 onChangeServiceType(isActiveDirectoryEnabled) {
Surya Vde23ea22024-07-11 15:19:46 +0530421 this.v$.form.activeDirectoryEnabled.$touch();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700422 const serviceType = isActiveDirectoryEnabled
423 ? this.activeDirectory
424 : this.ldap;
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700425 // Set form values according to user selected
426 // service type
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700427 this.setFormValues(serviceType);
428 },
429 onChangeldapAuthenticationEnabled(isServiceEnabled) {
Surya Vde23ea22024-07-11 15:19:46 +0530430 this.v$.form.ldapAuthenticationEnabled.$touch();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700431 if (!isServiceEnabled) {
432 // Request will fail if sent with empty values.
433 // The frontend only checks for required fields
434 // when the service is enabled. This is to prevent
435 // an error if a user clears any properties then
436 // disables the service.
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700437 this.setFormValues();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700438 }
Derick Montague602e98a2020-10-21 16:20:00 -0500439 },
440 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700441};
442</script>