| /** | 
 |  * @license | 
 |  * Copyright (C) 2017 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 '../../../styles/shared-styles'; | 
 | import '../../../styles/gr-form-styles'; | 
 | import '../../admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog'; | 
 | import '../../shared/gr-button/gr-button'; | 
 | import '../../shared/gr-overlay/gr-overlay'; | 
 | import {PolymerElement} from '@polymer/polymer/polymer-element'; | 
 | import {htmlTemplate} from './gr-identities_html'; | 
 | import {getBaseUrl} from '../../../utils/url-util'; | 
 | import {customElement, property} from '@polymer/decorators'; | 
 | import {AccountExternalIdInfo, ServerInfo} from '../../../types/common'; | 
 | import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; | 
 | import {PolymerDomRepeatEvent} from '../../../types/types'; | 
 | import {appContext} from '../../../services/app-context'; | 
 |  | 
 | const AUTH = ['OPENID', 'OAUTH']; | 
 |  | 
 | export interface GrIdentities { | 
 |   $: { | 
 |     overlay: GrOverlay; | 
 |   }; | 
 | } | 
 |  | 
 | @customElement('gr-identities') | 
 | export class GrIdentities extends PolymerElement { | 
 |   static get template() { | 
 |     return htmlTemplate; | 
 |   } | 
 |  | 
 |   @property({type: Array}) | 
 |   _identities: AccountExternalIdInfo[] = []; | 
 |  | 
 |   @property({type: String}) | 
 |   _idName?: string; | 
 |  | 
 |   @property({type: Object}) | 
 |   serverConfig?: ServerInfo; | 
 |  | 
 |   @property({ | 
 |     type: Boolean, | 
 |     computed: '_computeShowLinkAnotherIdentity(serverConfig)', | 
 |   }) | 
 |   _showLinkAnotherIdentity?: boolean; | 
 |  | 
 |   private readonly restApiService = appContext.restApiService; | 
 |  | 
 |   loadData() { | 
 |     return this.restApiService.getExternalIds().then(id => { | 
 |       this._identities = id ?? []; | 
 |     }); | 
 |   } | 
 |  | 
 |   _computeIdentity(id: string) { | 
 |     return id && id.startsWith('mailto:') ? '' : id; | 
 |   } | 
 |  | 
 |   _computeHideDeleteClass(canDelete?: boolean) { | 
 |     return canDelete ? 'show' : ''; | 
 |   } | 
 |  | 
 |   _handleDeleteItemConfirm() { | 
 |     this.$.overlay.close(); | 
 |     return this.restApiService | 
 |       .deleteAccountIdentity([this._idName!]) | 
 |       .then(() => { | 
 |         this.loadData(); | 
 |       }); | 
 |   } | 
 |  | 
 |   _handleConfirmDialogCancel() { | 
 |     this.$.overlay.close(); | 
 |   } | 
 |  | 
 |   _handleDeleteItem(e: PolymerDomRepeatEvent<AccountExternalIdInfo>) { | 
 |     const name = e.model.item.identity; | 
 |     if (!name) { | 
 |       return; | 
 |     } | 
 |     this._idName = name; | 
 |     this.$.overlay.open(); | 
 |   } | 
 |  | 
 |   _computeIsTrusted(item?: boolean) { | 
 |     return item ? '' : 'Untrusted'; | 
 |   } | 
 |  | 
 |   filterIdentities(item: AccountExternalIdInfo) { | 
 |     return !item.identity.startsWith('username:'); | 
 |   } | 
 |  | 
 |   _computeShowLinkAnotherIdentity(config?: ServerInfo) { | 
 |     if (config?.auth?.git_basic_auth_policy) { | 
 |       return AUTH.includes(config.auth.git_basic_auth_policy.toUpperCase()); | 
 |     } | 
 |  | 
 |     return false; | 
 |   } | 
 |  | 
 |   _computeLinkAnotherIdentity() { | 
 |     const baseUrl = getBaseUrl() || ''; | 
 |     let pathname = window.location.pathname; | 
 |     if (baseUrl) { | 
 |       pathname = '/' + pathname.substring(baseUrl.length); | 
 |     } | 
 |     return baseUrl + '/login/' + encodeURIComponent(pathname) + '?link'; | 
 |   } | 
 | } | 
 |  | 
 | declare global { | 
 |   interface HTMLElementTagNameMap { | 
 |     'gr-identities': GrIdentities; | 
 |   } | 
 | } |