blob: fa8fd3272dc55ea03d1dd3d5711a5b5edd3f1806 [file] [log] [blame]
/**
* @license
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import './gr-serviceuser-ssh-panel.js';
import './gr-serviceuser-http-password.js';
import {htmlTemplate} from './gr-serviceuser-detail_html.js';
const NOT_FOUND_MESSAGE = 'Not Found';
export class GrServiceUserDetail extends Polymer.GestureEventListeners(
Polymer.Element) {
/** @returns {?} template for this component */
static get template() { return htmlTemplate; }
/** @returns {string} name of the component */
static get is() { return 'gr-serviceuser-detail'; }
/**
* Defines properties of the component
*
* @returns {?}
*/
static get properties() {
return {
_restApi: Object,
_serviceUserId: String,
_serviceUser: Object,
_loading: {
type: Boolean,
value: true,
},
_statusButtonText: {
type: String,
value: 'Activate',
},
_prefsChanged: {
type: Boolean,
value: false,
},
_changingPrefs: {
type: Boolean,
value: false,
},
_isAdmin: {
type: Boolean,
value: false,
},
_allowEmail: {
type: Boolean,
value: false,
},
_allowOwner: {
type: Boolean,
value: false,
},
_allowHttpPassword: {
type: Boolean,
value: false,
},
_newFullName: String,
_newEmail: String,
_availableOwners: Array,
_newOwner: String,
_ownerChangeWarning: String,
_query: {
type: Function,
value() {
return this._getGroupSuggestions.bind(this);
},
},
};
}
static get behaviors() {
return [
Gerrit.ListViewBehavior,
];
}
connectedCallback() {
super.connectedCallback();
this._extractUserId();
this._loadServiceUser();
}
_loadServiceUser() {
if (!this._serviceUserId) { return; }
const promises = [];
promises.push(this._getPluginConfig());
promises.push(this._getServiceUser());
Promise.all(promises).then(() => {
this.$.sshEditor.loadData(this._restApi, this._serviceUser);
this.$.httpPass.loadData(this._restApi, this._serviceUser);
this.dispatchEvent(
new CustomEvent(
'title-change',
{
detail: {title: this._serviceUser.name},
bubbles: true,
composed: true,
}
)
);
this._computeStatusButtonText();
this._loading = false;
this._newFullName = this._serviceUser.name;
this._newEmail = this._serviceUser.email;
});
}
_computeLoadingClass(loading) {
return loading ? 'loading' : '';
}
_extractUserId() {
this._serviceUserId = this.baseURI.split('/').pop();
}
_getPermissions() {
return this.plugin.restApi().getAccountCapabilities(['administrateServer'])
.then(capabilities => {
this._isAdmin = capabilities && capabilities.administrateServer;
});
}
_getPluginConfig() {
return Promise.resolve(this._getPermissions()).then(() => {
this.plugin.restApi('/config/server/serviceuser~config/').get('')
.then(config => {
if (!config) {
return;
}
this._allowEmail = config.allow_email || this._isAdmin;
this._allowOwner = config.allow_owner || this._isAdmin;
this._allowHttpPassword = config.allow_http_password
|| this._isAdmin;
});
});
}
_getServiceUser() {
this._restApi = this.plugin.restApi(
'/a/config/server/serviceuser~serviceusers/');
return this._restApi.get(this._serviceUserId)
.then(serviceUser => {
if (!serviceUser) {
this._serviceUser = {};
return;
}
this._serviceUser = serviceUser;
});
}
_active(serviceUser) {
if (!serviceUser) {
return NOT_FOUND_MESSAGE;
}
return serviceUser.inactive === true ? 'Inactive' : 'Active';
}
_computeStatusButtonText() {
if (!this._serviceUser) {
return;
}
this._statusButtonText = this._serviceUser.inactive === true
? 'Activate'
: 'Deactivate';
}
_toggleStatus() {
if (this._serviceUser.inactive === true) {
this._restApi.put(`${this._serviceUser._account_id}/active`)
.then(() => {
this._loadServiceUser();
});
} else {
this._restApi.delete(`${this._serviceUser._account_id}/active`)
.then(() => {
this._loadServiceUser();
});
}
}
_getCreator(serviceUser) {
if (!serviceUser || !serviceUser.created_by) {
return NOT_FOUND_MESSAGE;
}
if (serviceUser.created_by.username != undefined) {
return serviceUser.created_by.username;
}
if (serviceUser.created_by._account_id != -1) {
return serviceUser.created_by._account_id;
}
return NOT_FOUND_MESSAGE;
}
_getOwnerGroup(serviceUser) {
return serviceUser && serviceUser.owner
? serviceUser.owner.name
: NOT_FOUND_MESSAGE;
}
_isEmailValid(email) {
if (!email) {
return false;
}
return email.includes('@');
}
_getGroupSuggestions(input) {
let query;
if (!input || input === this._getOwnerGroup(this._serviceUser)) {
query = '';
} else {
query = `?suggest=${input}`;
}
return this.plugin.restApi('/a/groups/').get(query)
.then(response => {
const groups = [];
for (const key in response) {
if (!response.hasOwnProperty(key)) { continue; }
groups.push({
name: key,
value: decodeURIComponent(response[key].id),
});
}
this._availableOwners = groups;
return groups;
});
}
_isOwnerValid(owner) {
if (!owner) {
return false;
}
return this._getOwnerName(owner);
}
_isNewOwner() {
return this._getOwnerName(this._newOwner)
=== this._getOwnerGroup(this._serviceUser);
}
_getOwnerName(id) {
return this._availableOwners.find(o => { return o.value === id; }).name;
}
_computeOwnerWarning() {
let message = 'If ';
message += this._getOwnerGroup(this._serviceUser) != NOT_FOUND_MESSAGE
? 'the owner group is changed' : 'an owner group is set';
message += ' only members of the ';
message += this._getOwnerGroup(this._serviceUser) != NOT_FOUND_MESSAGE
? 'new ' : '';
message += 'owner group can see and administrate the service user.';
message += this._getOwnerGroup(this._serviceUser) != NOT_FOUND_MESSAGE
? '' : ' The creator of the service user can no'
+ ' longer see and administrate the service user if she/he'
+ ' is not member of the owner group.';
this._ownerChangeWarning = message;
}
_computePrefsChanged() {
if (this.loading || this._changingPrefs) {
return;
}
if (!this._newOwner && !this._newEmail && !this._newFullName) {
this._prefsChanged = false;
return;
}
if (this._newEmail && !this._isEmailValid(this._newEmail)) {
this._prefsChanged = false;
return;
}
if (this._newOwner
&& (this._isNewOwner() || !this._isOwnerValid(this._newOwner))) {
this._prefsChanged = false;
return;
}
if (this._newOwner) {
this._computeOwnerWarning();
}
this._prefsChanged = true;
}
_applyNewFullName() {
return this._restApi
.put(`${this._serviceUser._account_id}/name`,
{name: this._newFullName})
.then(() => {
this.$.serviceUserFullNameInput.value = '';
});
}
_applyNewEmail(email) {
if (!this._isEmailValid(email)) {
return;
}
return this._restApi
.put(`${this._serviceUser._account_id}/email`, {email})
.then(() => {
this.$.serviceUserEmailInput.value = '';
});
}
_applyNewOwner(owner) {
if (this._isNewOwner() || !this._isOwnerValid(this._newOwner)) {
return;
}
return this._restApi
.put(`${this._serviceUser._account_id}/owner`, {group: owner})
.then(() => {
this.$.serviceUserOwnerInput.text = this._getOwnerGroup(
this._serviceUser);
});
}
_handleSavePreferences() {
const promises = [];
this._changingPrefs = true;
if (this._newFullName) {
promises.push(this._applyNewFullName());
}
if (this._newEmail) {
promises.push(this._applyNewEmail(this._newEmail));
}
if (this._newOwner) {
promises.push(this._applyNewOwner(this._newOwner));
}
Promise.all(promises).then(() => {
this._changingPrefs = false;
this._prefsChanged = false;
this._ownerChangeWarning = '';
this._loadServiceUser();
});
}
}
customElements.define(GrServiceUserDetail.is, GrServiceUserDetail);