/*! Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one or more contributor license agreements. * Licensed under the Elastic License 2.0; you may not use this file except in compliance with the Elastic License 2.0. */ (window.security_bundle_jsonpfunction=window.security_bundle_jsonpfunction||[]).push([[15],{300:function(e,t,a){"use strict";a.r(t),a.d(t,"APIKeysGridPage",(function(){return J}));var s=a(13),i=a.n(s),n=a(3),c=a(50),l=a.n(c),r=a(2),o=a.n(r),u=a(12),d=a(29),p=a.n(d),m=a(54),y=a(4),j=a(6),g=a(5),b=a(92),x=a(9),O=a(25),M=a(68),f=a(78),h=a(99);function F(e,t){return Object(r.useMemo)((()=>Object(n.htmlIdGenerator)(e)(t)),[e,t])}var k=a(0);const K=({title:e,submitButtonText:t,submitButtonColor:a,onCancel:s,onSubmit:c,isLoading:l,isDisabled:o,isSubmitButtonHidden:u,children:d,initialFocus:p,...m})=>{Object(r.useEffect)((()=>{p&&p.current&&p.current.focus()}),[p]);const y=F("formFlyout","title");return Object(k.jsx)(n.EuiPortal,null,Object(k.jsx)(n.EuiFlyout,i()({onClose:s,"aria-labelledby":y},m),Object(k.jsx)(n.EuiFlyoutHeader,{hasBorder:!0},Object(k.jsx)(n.EuiTitle,{size:"m"},Object(k.jsx)("h2",{id:y},e))),Object(k.jsx)(n.EuiFlyoutBody,null,d),Object(k.jsx)(n.EuiFlyoutFooter,null,Object(k.jsx)(n.EuiFlexGroup,{justifyContent:"spaceBetween"},Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiButtonEmpty,{"data-test-subj":"formFlyoutCancelButton",flush:"right",isDisabled:l,onClick:s},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.formFlyout.cancelButton",defaultMessage:"Cancel"}))),!u&&Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiButton,{"data-test-subj":"formFlyoutSubmitButton",isLoading:l,isDisabled:o,color:a,fill:!0,onClick:c},t))))))};var E=a(100),C=a(17),v=a(73),S=a(33);const A="/internal/security/api_key";class APIKeysAPIClient{constructor(e){this.http=e}async getApiKeys(){return await this.http.get(A)}async invalidateApiKeys(e,t=!1){return await this.http.post(`${A}/invalidate`,{body:JSON.stringify({apiKeys:e,isAdmin:t})})}async createApiKey(e){return await this.http.post(A,{body:JSON.stringify(e)})}async updateApiKey(e){return await this.http.put(A,{body:JSON.stringify(e)})}}const w={name:"",type:"rest",customExpiration:!1,expiration:"",includeMetadata:!1,metadata:"{}",customPrivileges:!1,access:JSON.stringify({search:[{names:["*"]}],replication:[{names:["*"]}]},null,2),role_descriptors:"{}"},T=({onSuccess:e,onCancel:t,apiKey:a,canManageCrossClusterApiKeys:s=!1,readOnly:i=!1})=>{const{services:c}=Object(g.useKibana)(),{value:u,loading:d}=Object(C.c)(),[{value:m,loading:b},x]=p()((()=>new S.RolesAPIClient(c.http).getRoles()),[c.http]),O=Object(M.useFormik)({onSubmit:async t=>{try{if(a){const s=await new APIKeysAPIClient(c.http).updateApiKey(function(e,t,a){const s=a.includeMetadata?JSON.parse(a.metadata):"{}";return"cross_cluster"===e?{type:e,id:t,metadata:s,access:JSON.parse(a.access)}:{id:t,metadata:s,role_descriptors:a.customPrivileges?JSON.parse(a.role_descriptors):"{}"}}(a.type,a.id,t));null==e||e(s)}else{const a=await new APIKeysAPIClient(c.http).createApiKey(function(e){const{type:t,name:a}=e,s=e.customExpiration?`${e.expiration}d`:void 0,i=e.includeMetadata?JSON.parse(e.metadata):"{}";return"cross_cluster"===t?{type:t,name:a,expiration:s,metadata:i,access:JSON.parse(e.access)}:{name:a,expiration:s,metadata:i,role_descriptors:e.customPrivileges?JSON.parse(e.role_descriptors):"{}"}}(t));null==e||e(a)}}catch(e){throw e}},initialValues:a?P(a):w});Object(r.useEffect)((()=>{x()}),[]),Object(r.useEffect)((()=>{if(u&&m){const e=u.roles.reduce(((e,t)=>{const a=m.find((e=>e.name===t));return a&&(e[a.name]=a.elasticsearch),e}),{});O.touched.role_descriptors||a||O.setFieldValue("role_descriptors",JSON.stringify(e,null,2))}}),[u,m]);const F=d||b,A=!(!u||!a)&&u.username===a.username,T=!!a&&a.expiration&&l()(a.expiration).isBefore(),I=A&&!T,B=Object(v.a)([F]);return Object(k.jsx)(M.FormikProvider,{value:O},Object(k.jsx)(K,{title:a?i||!I?y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.viewTitle",{defaultMessage:"API key details"}):y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.updateTitle",{defaultMessage:"Update API key"}):y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.createTitle",{defaultMessage:"Create API key"}),onCancel:t,onSubmit:O.submitForm,submitButtonText:a?y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.updateSubmitButton",{defaultMessage:"{isSubmitting, select, true{Updating API key…} other{Update API key}}",values:{isSubmitting:O.isSubmitting}}):y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.createSubmitButton",{defaultMessage:"{isSubmitting, select, true{Creating API key…} other{Create API key}}",values:{isSubmitting:O.isSubmitting}}),isLoading:O.isSubmitting,isDisabled:F||O.submitCount>0&&!O.isValid||i||a&&!I,isSubmitButtonHidden:i||a&&!I,size:"m",ownFocus:!0},Object(k.jsx)(n.EuiSkeletonText,{isLoading:F},a&&!i?A?T?Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiCallOut,{iconType:"lock",title:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.readonlyExpiredWarning",defaultMessage:"You cannot update this API key, since it has already expired."})}),Object(k.jsx)(n.EuiSpacer,null)):null:Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiCallOut,{iconType:"lock",title:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.readonlyOwnedByOtherUserWarning",defaultMessage:"You cannot update this API key, since it is owned by another user."})}),Object(k.jsx)(n.EuiSpacer,null)):null,Object(k.jsx)(M.Form,null,Object(k.jsx)(E.a,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.nameLabel",defaultMessage:"Name"}),fullWidth:!0},Object(k.jsx)(h.a,{name:"name",inputRef:B,"data-test-subj":"apiKeyNameInput",disabled:i||!!a,validate:{required:y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.nameRequired",{defaultMessage:"Enter a name."})},fullWidth:!0})),a?Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiSpacer,null),Object(k.jsx)(n.EuiFlexGroup,{gutterSize:"xl"},Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiFormRow,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.typeLabel",defaultMessage:"Type"})},Object(k.jsx)(Y,{type:a.type}))),Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiFormRow,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.ownerLabel",defaultMessage:"Owner"})},Object(k.jsx)(U,{username:a.username}))),Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiFormRow,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.createdLabel",defaultMessage:"Created"})},Object(k.jsx)($,{timestamp:a.creation}))),Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiFormRow,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.statusLabel",defaultMessage:"Status"})},Object(k.jsx)(G,{expiration:a.expiration}))))):s?Object(k.jsx)(E.a,{name:"type",label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.typeLabel",defaultMessage:"Type"}),fullWidth:!0},Object(k.jsx)(n.EuiFlexGroup,{gutterSize:"m"},Object(k.jsx)(n.EuiFlexItem,null,Object(k.jsx)(n.EuiCheckableCard,{id:"rest",label:Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiTitle,{size:"xxs"},Object(k.jsx)("h2",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.restTypeLabel",defaultMessage:"Personal API key"}))),Object(k.jsx)(n.EuiSpacer,{size:"xs"}),Object(k.jsx)(n.EuiText,{size:"s"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.restTypeDescription",defaultMessage:"Allow external services to access the Elastic Stack on your behalf."}))),onChange:()=>O.setFieldValue("type","rest"),checked:"rest"===O.values.type})),Object(k.jsx)(n.EuiFlexItem,null,Object(k.jsx)(n.EuiCheckableCard,{id:"cross_cluster",label:Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiTitle,{size:"xxs"},Object(k.jsx)("h2",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.crossClusterTypeLabel",defaultMessage:"Cross-Cluster API key"}))),Object(k.jsx)(n.EuiSpacer,{size:"xs"}),Object(k.jsx)(n.EuiText,{size:"s"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.crossClusterTypeDescription",defaultMessage:"Allow remote clusters to connect to your local cluster."}))),onChange:()=>O.setFieldValue("type","cross_cluster"),checked:"cross_cluster"===O.values.type})))):Object(k.jsx)(n.EuiFormRow,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.typeLabel",defaultMessage:"Type"})},Object(k.jsx)(Y,{type:"rest"})),Object(k.jsx)(n.EuiHorizontalRule,null),"cross_cluster"===O.values.type?Object(k.jsx)(E.a,{"data-test-subj":"apiKeysAccessCodeEditor",label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.accessLabel",defaultMessage:"Access"}),helpText:Object(k.jsx)(f.a,{app:"elasticsearch",doc:"security-api-create-cross-cluster-api-key.html#security-api-create-cross-cluster-api-key-request-body"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.accessHelpText",defaultMessage:"Learn how to structure access permissions."})),fullWidth:!0},Object(k.jsx)(h.a,{as:g.CodeEditorField,name:"access",value:O.values.access,options:{readOnly:i||a&&!I},onChange:e=>O.setFieldValue("access",e),validate:e=>{if(!e)return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.accessRequired",{defaultMessage:"Enter access permissions or disable this option."});try{JSON.parse(e)}catch(e){return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.invalidJsonError",{defaultMessage:"Enter valid JSON."})}},fullWidth:!0,languageId:"xjson",height:200})):Object(k.jsx)(n.EuiFormFieldset,null,Object(k.jsx)(n.EuiSwitch,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.customPrivilegesLabel",defaultMessage:"Restrict privileges"}),checked:O.values.customPrivileges,"data-test-subj":"apiKeysRoleDescriptorsSwitch",onChange:e=>O.setFieldValue("customPrivileges",e.target.checked),disabled:i||a&&!I}),O.values.customPrivileges&&Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiSpacer,{size:"m"}),Object(k.jsx)(E.a,{helpText:Object(k.jsx)(f.a,{app:"elasticsearch",doc:"security-api-create-api-key.html#security-api-create-api-key-request-body"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.roleDescriptorsHelpText",defaultMessage:"Learn how to structure role descriptors."})),fullWidth:!0,"data-test-subj":"apiKeysRoleDescriptorsCodeEditor"},Object(k.jsx)(h.a,{as:g.CodeEditorField,name:"role_descriptors",value:O.values.role_descriptors,options:{readOnly:i||a&&!I},onChange:e=>O.setFieldValue("role_descriptors",e),validate:e=>{if(!e)return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.roleDescriptorsRequired",{defaultMessage:"Enter role descriptors or disable this option."});try{JSON.parse(e)}catch(e){return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.invalidJsonError",{defaultMessage:"Enter valid JSON."})}},fullWidth:!0,languageId:"xjson",height:200})),Object(k.jsx)(n.EuiSpacer,{size:"s"}))),!a&&Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiSpacer,null),Object(k.jsx)(n.EuiFormFieldset,null,Object(k.jsx)(n.EuiSwitch,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.customExpirationLabel",defaultMessage:"Expire after time"}),checked:O.values.customExpiration,onChange:e=>O.setFieldValue("customExpiration",e.target.checked),disabled:i||!!a,"data-test-subj":"apiKeyCustomExpirationSwitch"}),O.values.customExpiration&&Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiSpacer,{size:"m"}),Object(k.jsx)(E.a,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.customExpirationInputLabel",defaultMessage:"Lifetime"}),fullWidth:!0},Object(k.jsx)(h.a,{as:n.EuiFieldNumber,name:"expiration",min:0,append:y.i18n.translate("xpack.security.accountManagement.apiKeyFlyout.expirationUnit",{defaultMessage:"days"}),validate:{min:{value:1,message:y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.expirationRequired",{defaultMessage:"Enter a valid duration or disable this option."})}},disabled:i||!!a,"data-test-subj":"apiKeyCustomExpirationInput"})),Object(k.jsx)(n.EuiSpacer,{size:"s"})))),Object(k.jsx)(n.EuiSpacer,null),Object(k.jsx)(n.EuiFormFieldset,null,Object(k.jsx)(n.EuiSwitch,{label:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.includeMetadataLabel",defaultMessage:"Include metadata"}),"data-test-subj":"apiKeysMetadataSwitch",checked:O.values.includeMetadata,disabled:i||a&&!I,onChange:e=>O.setFieldValue("includeMetadata",e.target.checked)}),O.values.includeMetadata&&Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiSpacer,{size:"m"}),Object(k.jsx)(E.a,{"data-test-subj":"apiKeysMetadataCodeEditor",helpText:Object(k.jsx)(f.a,{app:"elasticsearch",doc:"security-api-create-api-key.html#security-api-create-api-key-request-body"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyFlyout.metadataHelpText",defaultMessage:"Learn how to structure metadata."})),fullWidth:!0},Object(k.jsx)(h.a,{as:g.CodeEditorField,name:"metadata",options:{readOnly:i||a&&!I},value:O.values.metadata,onChange:e=>O.setFieldValue("metadata",e),validate:e=>{if(!e)return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.metadataRequired",{defaultMessage:"Enter metadata or disable this option."});try{JSON.parse(e)}catch(e){return y.i18n.translate("xpack.security.management.apiKeys.apiKeyFlyout.invalidJsonError",{defaultMessage:"Enter valid JSON."})}},fullWidth:!0,languageId:"xjson",height:200})),Object(k.jsx)(n.EuiSpacer,{size:"s"})))))))};function P(e){const t=Object.keys(e.metadata).length>0,a="cross_cluster"!==e.type&&Object.keys(e.role_descriptors).length>0;return{name:e.name,type:e.type,customExpiration:!!e.expiration,expiration:e.expiration?e.expiration.toString():"",includeMetadata:t,metadata:t?JSON.stringify(e.metadata,null,2):"{}",customPrivileges:a,role_descriptors:a?JSON.stringify("cross_cluster"!==e.type&&e.role_descriptors,null,2):"{}",access:"cross_cluster"===e.type?JSON.stringify(e.access,null,2):"{}"}}var I=a(116);const B=({error:e,readOnly:t,children:a})=>{const{euiTheme:s}=Object(n.useEuiTheme)(),i=F("apiKeysEmptyPrompt","accordion");if(e){if(function(e){var t;return-1!==((null===(t=e.body)||void 0===t?void 0:t.message)||"").indexOf('disabled.feature="api_keys"')}(e))return Object(k.jsx)(b.a.EmptyPrompt,{iconType:"warning",body:Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.disabledErrorMessage",defaultMessage:"API keys are disabled."})),Object(k.jsx)("p",null,Object(k.jsx)(f.a,{app:"elasticsearch",doc:"security-settings.html#api-key-service-settings"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.docsLinkText",defaultMessage:"Learn how to enable API keys."}))))});if(function(e){var t;return 403===(null===(t=e.body)||void 0===t?void 0:t.statusCode)}(e))return Object(k.jsx)(b.a.EmptyPrompt,{iconType:"lock",body:Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.forbiddenErrorMessage",defaultMessage:"You do not have permission to manage API keys."}))});const t=()=>{throw e};return Object(k.jsx)(b.a.EmptyPrompt,{iconType:"warning",body:Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.errorMessage",defaultMessage:"Could not load API keys."})),actions:Object(k.jsx)(o.a.Fragment,null,a,Object(k.jsx)(n.EuiSpacer,{size:"xl"}),Object(k.jsx)(n.EuiAccordion,{id:i,buttonClassName:Object(I.css)({name:"zl1inp",styles:"display:flex;justify-content:center"}),buttonContent:Object(k.jsx)(n.EuiText,{size:"xs",className:Object(I.css)({fontWeight:s.font.weight.medium},"","")},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.technicalDetailsButton",defaultMessage:"Technical details"})),arrowDisplay:"right",paddingSize:"m"},Object(k.jsx)(n.EuiText,{textAlign:"left"},Object(k.jsx)(n.EuiErrorBoundary,null,Object(k.jsx)(t,null)))))})}return t?Object(k.jsx)(b.a.EmptyPrompt,{iconType:"error",title:Object(k.jsx)("h1",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.readOnlyEmptyTitle",defaultMessage:"You do not have permission to create API keys"})),body:Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.readOnlyEmptyMessage",defaultMessage:"Please contact your administrator for more information"}))}):Object(k.jsx)(b.a.EmptyPrompt,{iconType:"managementApp",title:Object(k.jsx)("h1",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.emptyTitle",defaultMessage:"Create your first API key"})),body:Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeysEmptyPrompt.emptyMessage",defaultMessage:"Allow external services to access the Elastic Stack on your behalf."})),actions:a})},L=({isAdmin:e,children:t,notifications:a,apiKeysAPIClient:s})=>{const[i,c]=Object(r.useState)([]),[l,o]=Object(r.useState)(!1),u=Object(r.useRef)(null),d=()=>{o(!1),c([])},p=async()=>{let t,n,c;try{t=await s.invalidateApiKeys(i,e)}catch(e){n=e}if(d(),t){const{itemsInvalidated:e}=t;if(({errors:c}=t),e&&e.length){const t=e.length>1?y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.successMultipleNotificationTitle",{defaultMessage:"Deleted {count} API keys",values:{count:e.length}}):y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.successSingleNotificationTitle",{defaultMessage:"Deleted API key '{name}'",values:{name:e[0].name}});a.toasts.addSuccess(t),u.current&&u.current([...e])}}if(n||c&&c.length){const e=c&&c.length>1||n&&i.length>1?y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.errorMultipleNotificationTitle",{defaultMessage:"Error deleting {count} apiKeys",values:{count:c&&c.length||i.length}}):y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.errorSingleNotificationTitle",{defaultMessage:"Error deleting API key '{name}'",values:{name:c&&c[0].name||i[0].name}});a.toasts.addDanger(e)}};return Object(k.jsx)(r.Fragment,null,t(((e,t=(()=>{}))=>{if(!e||!e.length)throw new Error("No API key IDs specified for deletion");o(!0),c(e),u.current=t})),(()=>{if(!l)return null;const e=1===i.length;return Object(k.jsx)(n.EuiConfirmModal,{role:"dialog",title:e?y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.confirmModal.deleteSingleTitle",{defaultMessage:"Delete API key '{name}'?",values:{name:i[0].name}}):y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.confirmModal.deleteMultipleTitle",{defaultMessage:"Delete {count} API keys?",values:{count:i.length}}),onCancel:d,onConfirm:p,cancelButtonText:y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.confirmModal.cancelButtonLabel",{defaultMessage:"Cancel"}),confirmButtonText:y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.confirmModal.confirmButtonLabel",{defaultMessage:"Delete {count, plural, one {API key} other {API keys}}",values:{count:i.length}}),buttonColor:"danger","data-test-subj":"invalidateApiKeyConfirmationModal"},e?null:Object(k.jsx)(r.Fragment,null,Object(k.jsx)("p",null,y.i18n.translate("xpack.security.management.apiKeys.deleteApiKey.confirmModal.deleteMultipleListDescription",{defaultMessage:"You are about to delete these API keys:"})),Object(k.jsx)("ul",null,i.map((({name:e,id:t})=>Object(k.jsx)("li",{key:t},e))))))})())};var N=a(7),_=a(48);const D=e=>Object(k.jsx)(n.EuiFormControlLayout,i()({},e,{append:Object(k.jsx)(n.EuiCopy,{textToCopy:e.value},(e=>Object(k.jsx)(n.EuiButtonIcon,{"aria-label":y.i18n.translate("xpack.security.copyTokenField.copyButton",{defaultMessage:"Copy to clipboard"}),iconType:"copyClipboard",color:"success",style:{backgroundColor:"transparent"},onClick:e}))),style:{backgroundColor:"transparent"},readOnly:!0}),Object(k.jsx)("input",{type:"text","aria-label":y.i18n.translate("xpack.security.copyTokenField.tokenLabel",{defaultMessage:"Token"}),className:"euiFieldText euiFieldText--inGroup",value:e.value,style:{fontFamily:_.euiThemeVars.euiCodeFontFamily,fontSize:_.euiThemeVars.euiFontSizeXS,backgroundColor:"transparent"},onFocus:e=>e.currentTarget.select(),readOnly:!0})),z=e=>{const{options:t,...a}=e,[s,c]=o.a.useState(!1),[l,r]=o.a.useState(t[0]),u=t.findIndex((e=>e.key===l.key)),d=()=>c(!1);return Object(k.jsx)(D,i()({},a,{prepend:Object(k.jsx)(n.EuiPopover,{button:Object(k.jsx)(n.EuiButtonEmpty,{size:"xs",iconType:"arrowDown",iconSide:"right",color:"success",onClick:()=>c(!s)},l.label),isOpen:s,panelPaddingSize:"none",closePopover:d},Object(k.jsx)(n.EuiContextMenuPanel,{initialFocusedItemIndex:2*u,items:t.reduce(((e,a,s)=>(e.push(Object(k.jsx)(n.EuiContextMenuItem,{key:a.key,icon:a.icon,layoutAlign:"top",onClick:()=>{d(),r(a)}},Object(k.jsx)("strong",null,a.label),Object(k.jsx)(n.EuiSpacer,{size:"xs"}),Object(k.jsx)(n.EuiText,{size:"s",color:"subdued"},Object(k.jsx)("p",null,a.description)))),s{const{services:e}=Object(g.useKibana)(),t=Object(u.useHistory)(),a=Object(C.b)(),[s,c]=p()((()=>Promise.all([new APIKeysAPIClient(e.http).getApiKeys(),a.getCurrentUser()])),[e.http]),[l,d]=Object(r.useState)(),[O,M]=Object(r.useState)(),f=!Object(R.a)("api_keys").save;if(Object(r.useEffect)((()=>{c()}),[]),!s.value)return s.loading?Object(k.jsx)(m.SectionLoading,null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.loadingApiKeysDescription",defaultMessage:"Loading API keys…"})):Object(k.jsx)(B,{error:s.error},Object(k.jsx)(n.EuiButton,{iconType:"refresh",onClick:()=>c()},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeys.retryButton",defaultMessage:"Try again"})));const[{apiKeys:h,canManageCrossClusterApiKeys:F,canManageApiKeys:K,canManageOwnApiKeys:E},v]=s.value;return Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(x.a,{path:"/create"},Object(k.jsx)(N.a,{text:y.i18n.translate("xpack.security.management.apiKeys.createBreadcrumb",{defaultMessage:"Create"}),href:"/create"},Object(k.jsx)(T,{onSuccess:e=>{t.push({pathname:"/"}),d(e),c()},onCancel:()=>t.push({pathname:"/"}),canManageCrossClusterApiKeys:F}))),O&&Object(k.jsx)(T,{onSuccess:()=>{e.notifications.toasts.addSuccess({title:y.i18n.translate("xpack.security.management.apiKeys.updateSuccessMessage",{defaultMessage:"Updated API key '{name}'",values:{name:O.name}}),"data-test-subj":"updateApiKeySuccessToast"}),M(void 0),c()},onCancel:()=>M(void 0),apiKey:O,readOnly:f}),h.length?Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(b.a.Header,{pageTitle:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.apiKeysTitle",defaultMessage:"API keys"}),description:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.apiKeysAllDescription",defaultMessage:"Allow external services to access the Elastic Stack on behalf of a user."}),rightSideItems:f?void 0:[Object(k.jsx)(n.EuiButton,i()({},Object(g.reactRouterNavigate)(t,"/create"),{fill:!0,iconType:"plusInCircleFilled","data-test-subj":"apiKeysCreateTableButton"}),Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.createButton",defaultMessage:"Create API key"}))],paddingSize:"none",bottomBorder:!0}),Object(k.jsx)(n.EuiSpacer,null),Object(k.jsx)(b.a.Section,{paddingSize:"none"},l&&!s.loading&&Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(V,{createdApiKey:l}),Object(k.jsx)(n.EuiSpacer,null)),E&&!K?Object(k.jsx)(o.a.Fragment,null,Object(k.jsx)(n.EuiCallOut,{title:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.manageOwnKeysWarning",defaultMessage:"You only have permission to manage your own API keys."})}),Object(k.jsx)(n.EuiSpacer,null)):void 0,Object(k.jsx)(L,{isAdmin:K,notifications:e.notifications,apiKeysAPIClient:new APIKeysAPIClient(e.http)},(e=>Object(k.jsx)(q,{apiKeys:h,onClick:e=>M(e),onDelete:t=>e(t.map((({name:e,id:t})=>({name:e,id:t}))),c),currentUser:v,createdApiKey:l,canManageCrossClusterApiKeys:F,canManageApiKeys:K,canManageOwnApiKeys:E,readOnly:f,loading:s.loading}))))):Object(k.jsx)(B,{readOnly:f},Object(k.jsx)(n.EuiButton,i()({},Object(g.reactRouterNavigate)(t,"/create"),{fill:!0,iconType:"plusInCircleFilled","data-test-subj":"apiKeysCreatePromptButton"}),Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.createButton",defaultMessage:"Create API key"}))))},V=({createdApiKey:e})=>{const t=`${e.id}:${e.api_key}`;return Object(k.jsx)(n.EuiCallOut,{color:"success",iconType:"check",title:y.i18n.translate("xpack.security.management.apiKeys.createSuccessMessage",{defaultMessage:"Created API key '{name}'",values:{name:e.name}})},Object(k.jsx)("p",null,Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.successDescription",defaultMessage:"Copy this key now. You will not be able to view it again."})),Object(k.jsx)(z,{options:[{key:"encoded",value:e.encoded,icon:"empty",label:y.i18n.translate("xpack.security.management.apiKeys.encodedLabel",{defaultMessage:"Encoded"}),description:y.i18n.translate("xpack.security.management.apiKeys.encodedDescription",{defaultMessage:"Format used to make requests to Elasticsearch REST API."})},{key:"beats",value:t,icon:"logoBeats",label:y.i18n.translate("xpack.security.management.apiKeys.beatsLabel",{defaultMessage:"Beats"}),description:y.i18n.translate("xpack.security.management.apiKeys.beatsDescription",{defaultMessage:"Format used to configure Beats."})},{key:"logstash",value:t,icon:"logoLogstash",label:y.i18n.translate("xpack.security.management.apiKeys.logstashLabel",{defaultMessage:"Logstash"}),description:y.i18n.translate("xpack.security.management.apiKeys.logstashDescription",{defaultMessage:"Format used to configure Logstash."})}]}))},q=({apiKeys:e,createdApiKey:t,currentUser:a,onClick:s,onDelete:i,canManageApiKeys:c=!1,canManageOwnApiKeys:l=!1,readOnly:o=!1,loading:u=!1})=>{const d=[],[p,m]=Object(r.useState)([]),{categorizedApiKeys:g,typeFilters:b,usernameFilters:x,expiredFilters:O}=Object(r.useMemo)((()=>function(e){const t=[],a=new Set,s=new Set,i=new Set;return e.forEach((e=>{const n=function(e){var t;return"rest"===e.type&&(null!==(t=e.metadata)&&void 0!==t&&t.managed||0===e.name.indexOf("Alerting: "))?"managed":e.type}(e),c=!!e.expiration&&Date.now()>e.expiration;a.add(n),s.add(e.username),i.add(c),t.push({...e,type:n,expired:c})})),{categorizedApiKeys:t,typeFilters:[...a],usernameFilters:[...s],expiredFilters:[...i]}}(e)),[e]),M=e=>c||l&&e.username===a.username;d.push({field:"name",name:y.i18n.translate("xpack.security.management.apiKeys.table.nameColumnName",{defaultMessage:"Name"}),sortable:!0,render:(e,t)=>Object(k.jsx)(n.EuiLink,{onClick:()=>s(t),"data-test-subj":`apiKeyRowName-${t.name}`},e)},{field:"type",name:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.typeColumnName",defaultMessage:"Type"}),sortable:!0,render:e=>Object(k.jsx)(Y,{type:e})}),(c||x.length>1)&&d.push({field:"username",name:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.ownerColumnName",defaultMessage:"Owner"}),sortable:!0,render:e=>Object(k.jsx)(U,{username:e})}),d.push({field:"creation",name:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.createdColumnName",defaultMessage:"Created"}),sortable:!0,mobileOptions:{show:!1},render:(e,a)=>Object(k.jsx)($,{timestamp:e},a.id===(null==t?void 0:t.id)?Object(k.jsx)(n.EuiBadge,{color:"success"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.createdBadge",defaultMessage:"Just now"})):null)},{field:"expiration",name:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.statusColumnName",defaultMessage:"Status"}),sortable:!0,render:e=>Object(k.jsx)(G,{expiration:e})}),o||d.push({width:"40px",actions:[{name:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.deleteAction",defaultMessage:"Delete"}),description:y.i18n.translate("xpack.security.management.apiKeys.table.deleteDescription",{defaultMessage:"Delete this API key"}),icon:"trash",type:"icon",color:"danger",onClick:e=>i([e]),available:M,"data-test-subj":"apiKeysTableDeleteAction"}]});const f=[];return b.length>1&&f.push({type:"custom_component",component:({query:e,onChange:t})=>Object(k.jsx)(W,{types:b,query:e,onChange:t})}),x.length>1&&f.push({type:"custom_component",component:({query:e,onChange:t})=>Object(k.jsx)(H,{usernames:x,query:e,onChange:t})}),O.length>1&&f.push({type:"field_value_toggle_group",field:"expired",items:[{value:!1,name:y.i18n.translate("xpack.security.management.apiKeys.table.activeFilter",{defaultMessage:"Active"})},{value:!0,name:y.i18n.translate("xpack.security.management.apiKeys.table.expiredFilter",{defaultMessage:"Expired"})}]}),Object(k.jsx)(n.EuiInMemoryTable,{items:g,itemId:"id",columns:d,search:g.length>0?{toolsLeft:p.length?Object(k.jsx)(n.EuiButton,{onClick:()=>i(p),color:"danger",iconType:"trash","data-test-subj":"bulkInvalidateActionButton"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.invalidateApiKeyButton",defaultMessage:"Delete {count, plural, one {API key} other {# API keys}}",values:{count:p.length}})):void 0,box:{incremental:!0},filters:f}:void 0,sorting:{sort:{field:"creation",direction:"desc"}},selection:o?void 0:{selectable:M,onSelectionChange:m},pagination:{initialPageSize:10,pageSizeOptions:[10,25,50]},loading:u,isSelectable:l})},W=({query:e,onChange:t,types:a})=>t?Object(k.jsx)(o.a.Fragment,null,a.includes("rest")?Object(k.jsx)(n.EuiFilterButton,{iconType:"user",iconSide:"left",hasActiveFilters:e.hasSimpleFieldClause("type","rest"),onClick:()=>t(e.hasSimpleFieldClause("type","rest")?e.removeSimpleFieldClauses("type"):e.removeSimpleFieldClauses("type").addSimpleFieldValue("type","rest")),withNext:a.includes("cross_cluster")||a.includes("managed")},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.restTitle",defaultMessage:"Personal"})):null,a.includes("cross_cluster")?Object(k.jsx)(n.EuiFilterButton,{iconType:"cluster",iconSide:"left",hasActiveFilters:e.hasSimpleFieldClause("type","cross_cluster"),onClick:()=>t(e.hasSimpleFieldClause("type","cross_cluster")?e.removeSimpleFieldClauses("type"):e.removeSimpleFieldClauses("type").addSimpleFieldValue("type","cross_cluster")),withNext:a.includes("managed")},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.crossClusterLabel",defaultMessage:"Cross-Cluster"})):null,a.includes("managed")?Object(k.jsx)(n.EuiFilterButton,{iconType:"gear",iconSide:"left",hasActiveFilters:e.hasSimpleFieldClause("type","managed"),onClick:()=>t(e.hasSimpleFieldClause("type","managed")?e.removeSimpleFieldClauses("type"):e.removeSimpleFieldClauses("type").addSimpleFieldValue("type","managed"))},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.managedTitle",defaultMessage:"Managed"})):null):null,H=({query:e,onChange:t,usernames:a})=>{const[s,i]=Object(r.useState)(!1),[c,l]=Object(r.useState)("");if(!t)return null;let o=0;const u=e.getOrFieldClause("username");u&&(o=Array.isArray(u.value)?u.value.length:1);const d=c?a.filter((e=>e.includes(c))):a;return Object(k.jsx)(O.c,{button:Object(k.jsx)(n.EuiFilterButton,{iconType:"arrowDown",onClick:()=>i((e=>!e)),isSelected:s,numFilters:a.length,hasActiveFilters:!!o,numActiveFilters:o},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.ownerFilter",defaultMessage:"Owner"})),isOpen:s,panelPaddingSize:"none",anchorPosition:"downCenter",panelClassName:"euiFilterGroup__popoverPanel",closePopover:()=>i(!1),selectableProps:{options:d.map((e=>({uid:e,user:{username:e},enabled:!1,data:{}}))),onSearchChange:l,selectedOptions:a.filter((t=>e.hasOrFieldClause("username",t))).map((e=>({uid:e,user:{username:e},enabled:!1,data:{}}))),onChange:a=>{const s=a.reduce(((e,t)=>e.addOrFieldValue("username",t.user.username)),e.removeOrFieldClauses("username"));t(s)}}})},U=({username:e})=>Object(k.jsx)(n.EuiFlexGroup,{alignItems:"center",gutterSize:"s",responsive:!1},Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(O.a,{user:{username:e},size:"s"})),Object(k.jsx)(n.EuiFlexItem,{grow:!1},Object(k.jsx)(n.EuiText,{size:"s","data-test-subj":"apiKeyUsername"},e))),$=({timestamp:e,children:t})=>Object(k.jsx)(n.EuiToolTip,{content:l()(e).format("LLL")},Object(k.jsx)("span",null,null!=t?t:l()(e).fromNow())),G=({expiration:e})=>e?Date.now()>e?Object(k.jsx)(n.EuiHealth,{color:"subdued","data-test-subj":"apiKeyStatus"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.statusExpired",defaultMessage:"Expired"})):Object(k.jsx)(n.EuiHealth,{color:"warning","data-test-subj":"apiKeyStatus"},Object(k.jsx)($,{timestamp:e},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.statusExpires",defaultMessage:"Expires {timeFromNow}",values:{timeFromNow:l()(e).fromNow()}}))):Object(k.jsx)(n.EuiHealth,{color:"primary","data-test-subj":"apiKeyStatus"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.management.apiKeys.table.statusActive",defaultMessage:"Active"})),Y=({type:e})=>"cross_cluster"===e?Object(k.jsx)(n.EuiToolTip,{content:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.crossClusterDescription",defaultMessage:"Allows remote clusters to connect to your local cluster."})},Object(k.jsx)(n.EuiBadge,{color:"hollow",iconType:"cluster"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.crossClusterLabel",defaultMessage:"Cross-Cluster"}))):"managed"===e?Object(k.jsx)(n.EuiToolTip,{content:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.managedDescription",defaultMessage:"Created and managed by Kibana to correctly run background tasks."})},Object(k.jsx)(n.EuiBadge,{color:"hollow",iconType:"gear"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.managedTitle",defaultMessage:"Managed"}))):Object(k.jsx)(n.EuiToolTip,{content:Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.restDescription",defaultMessage:"Allows external services to access the Elastic Stack on behalf of a user."})},Object(k.jsx)(n.EuiBadge,{color:"hollow",iconType:"user"},Object(k.jsx)(j.FormattedMessage,{id:"xpack.security.accountManagement.apiKeyBadge.restTitle",defaultMessage:"Personal"})))},78:function(e,t,a){"use strict";a.d(t,"a",(function(){return l}));var s=a(3),i=a(2),n=a(5),c=a(0);const l=({app:e,doc:t,children:a})=>{const[,l]=function(){const{services:e}=Object(n.useKibana)(),{links:t,ELASTIC_WEBSITE_URL:a,DOC_LINK_VERSION:s}=e.docLinks;return[t,Object(i.useCallback)(((e,t)=>`${a}guide/en/${e}/reference/${s}/${t}`),[a,s])]}();return Object(c.jsx)(s.EuiLink,{href:l(e,t),target:"_blank",external:!0},a)}}}]);