client-detail.html 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. <div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
  2. <ol class="breadcrumb">
  3. <li><a href="#/realms/{{realm.realm}}/clients">{{:: 'clients' | translate}}</a></li>
  4. <li>{{client.clientId}}</li>
  5. </ol>
  6. <kc-tabs-client></kc-tabs-client>
  7. <form class="form-horizontal" name="clientForm" novalidate kc-read-only="!client.access.configure">
  8. <fieldset class="border-top">
  9. <div class="form-group">
  10. <label class="col-md-2 control-label" for="clientId">{{:: 'client-id' | translate}}</label>
  11. <div class="col-sm-6">
  12. <input class="form-control" type="text" id="clientId" name="clientId" data-ng-model="clientEdit.clientId" autofocus required>
  13. </div>
  14. <kc-tooltip>{{:: 'client-id.tooltip' | translate}}</kc-tooltip>
  15. </div>
  16. <div class="form-group">
  17. <label class="col-md-2 control-label" for="name">{{:: 'name' | translate}} </label>
  18. <div class="col-sm-6">
  19. <input class="form-control" type="text" id="name" name="name" data-ng-model="clientEdit.name" autofocus>
  20. </div>
  21. <kc-tooltip>{{:: 'client.name.tooltip' | translate}}</kc-tooltip>
  22. </div>
  23. <div class="form-group">
  24. <label class="col-md-2 control-label" for="description">{{:: 'description' | translate}} </label>
  25. <div class="col-sm-6">
  26. <input class="form-control" type="text" id="description" name="description" data-ng-model="clientEdit.description">
  27. </div>
  28. <kc-tooltip>{{:: 'client.description.tooltip' | translate}}</kc-tooltip>
  29. </div>
  30. <div class="form-group clearfix block">
  31. <label class="col-md-2 control-label" for="enabled">{{:: 'enabled' | translate}}</label>
  32. <div class="col-sm-6">
  33. <input ng-model="clientEdit.enabled" name="enabled" id="enabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  34. </div>
  35. <kc-tooltip>{{:: 'client.enabled.tooltip' | translate}}</kc-tooltip>
  36. </div>
  37. <div class="form-group clearfix block" data-ng-show="serverInfo.featureEnabled('ACCOUNT2') && !(accessType === 'bearer-only' && protocol === 'openid-connect')">
  38. <label class="col-md-2 control-label" for="alwaysDisplayInConsole">{{:: 'alwaysDisplayInConsole' | translate}}</label>
  39. <div class="col-sm-6">
  40. <input ng-model="clientEdit.alwaysDisplayInConsole" name="alwaysDisplayInConsole" id="alwaysDisplayInConsole" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  41. </div>
  42. <kc-tooltip>{{:: 'alwaysDisplayInConsole.tooltip' | translate}}</kc-tooltip>
  43. </div>
  44. <div class="form-group clearfix block" data-ng-show="client.origin">
  45. <label class="col-md-2 control-label">{{:: 'client-origin-link' | translate}}</label>
  46. <div class="col-md-6">
  47. {{originName}}
  48. </div>
  49. <kc-tooltip>{{:: 'client-origin.tooltip' | translate}}</kc-tooltip>
  50. </div>
  51. <div class="form-group clearfix block" data-ng-show="protocol != 'docker-v2'">
  52. <label class="col-md-2 control-label" for="consentRequired">{{:: 'consent-required' | translate}}</label>
  53. <div class="col-sm-6">
  54. <input ng-model="clientEdit.consentRequired" name="consentRequired" id="consentRequired" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  55. </div>
  56. <kc-tooltip>{{:: 'consent-required.tooltip' | translate}}</kc-tooltip>
  57. </div>
  58. <div class="form-group clearfix block" data-ng-show="clientEdit.consentRequired && protocol != 'docker-v2'">
  59. <label class="col-md-2 control-label" for="displayOnConsentScreen">{{:: 'client.display-on-consent-screen' | translate}}</label>
  60. <div class="col-sm-6">
  61. <input ng-model="displayOnConsentScreen" ng-click="switchChange()" name="displayOnConsentScreen" id="displayOnConsentScreen" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  62. </div>
  63. <kc-tooltip>{{:: 'client.display-on-consent-screen.tooltip' | translate}}</kc-tooltip>
  64. </div>
  65. <div class="form-group" data-ng-show="clientEdit.consentRequired && protocol != 'docker-v2' && displayOnConsentScreen">
  66. <label class="col-md-2 control-label" for="consentScreenText">{{:: 'client.consent-screen-text' | translate}} </label>
  67. <div class="col-sm-6">
  68. <input class="form-control" type="text" id="consentScreenText" name="consentScreenText" data-ng-model="clientEdit.attributes['consent.screen.text']">
  69. </div>
  70. <kc-tooltip>{{:: 'client.consent-screen-text.tooltip' | translate}}</kc-tooltip>
  71. </div>
  72. <div class="form-group">
  73. <label class="col-md-2 control-label" for="loginTheme">{{:: 'login-theme' | translate}}</label>
  74. <div class="col-sm-6">
  75. <select class="form-control" id="loginTheme"
  76. ng-model="clientEdit.attributes['login_theme']"
  77. ng-options="o.name as o.name for o in serverInfo.themes.login">
  78. <option value="" selected></option>
  79. </select>
  80. </div>
  81. <kc-tooltip>{{:: 'login-theme.tooltip' | translate}}</kc-tooltip>
  82. </div>
  83. <div class="form-group">
  84. <label class="col-md-2 control-label" for="protocol">{{:: 'client-protocol' | translate}}</label>
  85. <div class="col-sm-6">
  86. <div>
  87. <select class="form-control" id="protocol"
  88. ng-change="changeProtocol()"
  89. ng-model="protocol"
  90. ng-options="aProtocol for aProtocol in protocols">
  91. </select>
  92. </div>
  93. </div>
  94. <kc-tooltip>{{:: 'client-protocol.tooltip' | translate}}</kc-tooltip>
  95. </div>
  96. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  97. <label class="col-md-2 control-label" for="accessType">{{:: 'access-type' | translate}}</label>
  98. <div class="col-sm-6">
  99. <div>
  100. <select class="form-control" id="accessType"
  101. ng-change="changeAccessType()"
  102. ng-model="accessType"
  103. ng-options="aType for aType in accessTypes">
  104. </select>
  105. </div>
  106. </div>
  107. <kc-tooltip>{{:: 'access-type.tooltip' | translate}}</kc-tooltip>
  108. </div>
  109. <div class="form-group" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  110. <label class="col-md-2 control-label" for="standardFlowEnabled">{{:: 'standard-flow-enabled' | translate}}</label>
  111. <kc-tooltip>{{:: 'standard-flow-enabled.tooltip' | translate}}</kc-tooltip>
  112. <div class="col-md-6">
  113. <input ng-model="clientEdit.standardFlowEnabled" name="standardFlowEnabled" id="standardFlowEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  114. </div>
  115. </div>
  116. <div class="form-group" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  117. <label class="col-md-2 control-label" for="implicitFlowEnabled">{{:: 'implicit-flow-enabled' | translate}}</label>
  118. <kc-tooltip>{{:: 'implicit-flow-enabled.tooltip' | translate}}</kc-tooltip>
  119. <div class="col-md-6">
  120. <input ng-model="clientEdit.implicitFlowEnabled" name="implicitFlowEnabled" id="implicitFlowEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  121. </div>
  122. </div>
  123. <div class="form-group" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  124. <label class="col-md-2 control-label" for="directAccessGrantsEnabled">{{:: 'direct-access-grants-enabled' | translate}}</label>
  125. <kc-tooltip>{{:: 'direct-access-grants-enabled.tooltip' | translate}}</kc-tooltip>
  126. <div class="col-md-6">
  127. <input ng-model="clientEdit.directAccessGrantsEnabled" name="directAccessGrantsEnabled" id="directAccessGrantsEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  128. </div>
  129. </div>
  130. <div class="form-group" data-ng-show="protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly">
  131. <label class="col-md-2 control-label" for="serviceAccountsEnabled">{{:: 'service-accounts-enabled' | translate}}</label>
  132. <kc-tooltip>{{:: 'service-accounts-enabled.tooltip' | translate}}</kc-tooltip>
  133. <div class="col-md-6">
  134. <input ng-model="clientEdit.serviceAccountsEnabled" name="serviceAccountsEnabled" id="serviceAccountsEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  135. </div>
  136. </div>
  137. <div class="form-group"
  138. data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  139. <label class="col-md-2 control-label" for="oauth2DeviceAuthorizationGrantEnabled">{{::
  140. 'oauth2-device-authorization-grant-enabled' | translate}}</label>
  141. <kc-tooltip>{{:: 'oauth2-device-authorization-grant-enabled.tooltip' | translate}}</kc-tooltip>
  142. <div class="col-md-6">
  143. <input ng-model="oauth2DeviceAuthorizationGrantEnabled" ng-click="switchChange()"
  144. name="oauth2DeviceAuthorizationGrantEnabled" id="oauth2DeviceAuthorizationGrantEnabled" onoffswitch
  145. on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
  146. </div>
  147. </div>
  148. <div class="form-group"
  149. data-ng-show="protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly && serverInfo.featureEnabled('CIBA')">
  150. <label class="col-md-2 control-label" for="oidcCibaGrantEnabled">{{::
  151. 'oidc-ciba-grant-enabled' | translate}}</label>
  152. <kc-tooltip>{{:: 'oidc-ciba-grant-enabled.tooltip' | translate}}</kc-tooltip>
  153. <div class="col-md-6">
  154. <input ng-model="oidcCibaGrantEnabled" ng-click="switchChange()"
  155. name="oidcCibaGrantEnabled" id="oidcCibaGrantEnabled" onoffswitch
  156. on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
  157. </div>
  158. </div>
  159. <div class="form-group" data-ng-show="serverInfo.featureEnabled('AUTHORIZATION') && protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly">
  160. <label class="col-md-2 control-label" for="authorizationServicesEnabled">{{:: 'authz-authorization-services-enabled' | translate}}</label>
  161. <kc-tooltip>{{:: 'authz-authorization-services-enabled.tooltip' | translate}}</kc-tooltip>
  162. <div class="col-md-6">
  163. <input ng-model="clientEdit.authorizationServicesEnabled" ng-click="confirmChangeAuthzSettings($event)" name="authorizationServicesEnabled" id="authorizationServicesEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  164. </div>
  165. </div>
  166. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  167. <label class="col-md-2 control-label" for="samlAuthnStatement">{{:: 'include-authnstatement' | translate}}</label>
  168. <div class="col-sm-6">
  169. <input ng-model="samlAuthnStatement" ng-click="switchChange()" name="samlAuthnStatement" id="samlAuthnStatement" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  170. </div>
  171. <kc-tooltip>{{:: 'include-authnstatement.tooltip' | translate}}</kc-tooltip>
  172. </div>
  173. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  174. <label class="col-md-2 control-label" for="samlOneTimeUseCondition">{{:: 'include-onetimeuse-condition' | translate}}</label>
  175. <div class="col-sm-6">
  176. <input ng-model="samlOneTimeUseCondition" ng-click="switchChange()" name="samlOneTimeUseCondition" id="samlOneTimeUseCondition" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  177. </div>
  178. <kc-tooltip>{{:: 'include-onetimeuse-condition.tooltip' | translate}}</kc-tooltip>
  179. </div>
  180. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  181. <label class="col-md-2 control-label" for="samlArtifactBinding">{{:: 'artifact-binding' | translate}}</label>
  182. <div class="col-sm-6">
  183. <input ng-model="samlArtifactBinding" ng-click="switchChange()" name="samlArtifactBinding" id="samlArtifactBinding" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  184. </div>
  185. <kc-tooltip>{{:: 'artifact-binding.tooltip' | translate}}</kc-tooltip>
  186. </div>
  187. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  188. <label class="col-md-2 control-label" for="samlServerSignature">{{:: 'sign-documents' | translate}}</label>
  189. <div class="col-sm-6">
  190. <input ng-model="samlServerSignature" ng-click="switchChange()" name="samlServerSignature" id="samlServerSignature" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  191. </div>
  192. <kc-tooltip>{{:: 'sign-documents.tooltip' | translate}}</kc-tooltip>
  193. </div>
  194. <div class="form-group clearfix block" data-ng-show="protocol == 'saml' && samlServerSignature == true">
  195. <label class="col-md-2 control-label" for="samlServerSignatureEnableKeyInfoExtension">{{:: 'sign-documents-redirect-enable-key-info-ext' | translate}}</label>
  196. <div class="col-sm-6">
  197. <input ng-model="samlServerSignatureEnableKeyInfoExtension" ng-click="switchChange()" name="samlServerSignatureEnableKeyInfoExtension" id="samlServerSignatureEnableKeyInfoExtension" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  198. </div>
  199. <kc-tooltip>{{:: 'sign-documents-redirect-enable-key-info-ext.tooltip' | translate}}</kc-tooltip>
  200. </div>
  201. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  202. <label class="col-md-2 control-label" for="samlAssertionSignature">{{:: 'sign-assertions' | translate}}</label>
  203. <div class="col-sm-6">
  204. <input ng-model="samlAssertionSignature" ng-click="switchChange()" name="samlAssertionSignature" id="samlAssertionSignature" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  205. </div>
  206. <kc-tooltip>{{:: 'sign-assertions.tooltip' | translate}}</kc-tooltip>
  207. </div>
  208. <div class="form-group" data-ng-show="(samlAssertionSignature || samlServerSignature) && protocol == 'saml'">
  209. <label class="col-md-2 control-label" for="signatureAlgorithm">{{:: 'signature-algorithm' | translate}}</label>
  210. <div class="col-sm-6">
  211. <div>
  212. <select class="form-control" id="signatureAlgorithm"
  213. ng-change="changeAlgorithm()"
  214. ng-model="signatureAlgorithm"
  215. ng-options="alg for alg in signatureAlgorithms">
  216. </select>
  217. </div>
  218. </div>
  219. <kc-tooltip>{{:: 'signature-algorithm.tooltip' | translate}}</kc-tooltip>
  220. </div>
  221. <div class="form-group clearfix block" data-ng-show="(samlAssertionSignature || samlServerSignature) && protocol == 'saml'">
  222. <label class="col-md-2 control-label" for="samlSigKeyNameTranformer">{{:: 'saml-signature-keyName-transformer' | translate}}</label>
  223. <div class="col-sm-6">
  224. <div>
  225. <select class="form-control" id="xmlKeyNameTranformer"
  226. ng-change="changeSamlSigKeyNameTranformer()"
  227. ng-model="samlXmlKeyNameTranformer"
  228. ng-options="alg for alg in xmlKeyNameTranformers">
  229. </select>
  230. </div>
  231. </div>
  232. <kc-tooltip>{{:: 'saml-signature-keyName-transformer.tooltip' | translate}}</kc-tooltip>
  233. </div>
  234. <div class="form-group" data-ng-show="(samlAssertionSignature || samlServerSignature) && protocol == 'saml'">
  235. <label class="col-md-2 control-label" for="canonicalization">{{:: 'canonicalization-method' | translate}}</label>
  236. <div class="col-sm-6">
  237. <div>
  238. <select class="form-control" id="canonicalization"
  239. ng-model="clientEdit.attributes['saml_signature_canonicalization_method']"
  240. ng-options="canon.value as canon.name for canon in canonicalization">
  241. </select>
  242. </div>
  243. </div>
  244. <kc-tooltip>{{:: 'canonicalization-method.tooltip' | translate}}</kc-tooltip>
  245. </div>
  246. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  247. <label class="col-md-2 control-label" for="samlEncrypt">{{:: 'encrypt-assertions' | translate}}</label>
  248. <div class="col-sm-6">
  249. <input ng-model="samlEncrypt" ng-click="switchChange()" name="samlEncrypt" id="samlEncrypt" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  250. </div>
  251. <kc-tooltip>{{:: 'encrypt-assertions.tooltip' | translate}}</kc-tooltip>
  252. </div>
  253. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  254. <label class="col-md-2 control-label" for="samlClientSignature">{{:: 'client-signature-required' | translate}}</label>
  255. <div class="col-sm-6">
  256. <input ng-model="samlClientSignature" ng-click="switchChange()" name="samlClientSignature" id="samlClientSignature" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  257. </div>
  258. <kc-tooltip>{{:: 'client-signature-required.tooltip' | translate}}</kc-tooltip>
  259. </div>
  260. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  261. <label class="col-md-2 control-label" for="samlForcePostBinding">{{:: 'force-post-binding' | translate}}</label>
  262. <div class="col-sm-6">
  263. <input ng-model="samlForcePostBinding" ng-click="switchChange()" name="samlForcePostBinding" id="samlForcePostBinding" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  264. </div>
  265. <kc-tooltip>{{:: 'force-post-binding.tooltip' | translate}}</kc-tooltip>
  266. </div>
  267. <div class="form-group clearfix block" data-ng-show="protocol == 'saml' || protocol == 'openid-connect'">
  268. <label class="col-md-2 control-label" for="frontchannelLogout">{{:: 'front-channel-logout' | translate}}</label>
  269. <div class="col-sm-6">
  270. <input ng-model="clientEdit.frontchannelLogout" name="frontchannelLogout" id="frontchannelLogout" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  271. </div>
  272. <kc-tooltip>{{:: 'front-channel-logout.tooltip' | translate}}</kc-tooltip>
  273. </div>
  274. <div class="form-group" data-ng-show="protocol == 'openid-connect' && clientEdit.frontchannelLogout">
  275. <label class="col-md-2 control-label" for="frontchannelLogoutUrl">{{:: 'front-channel-logout-url' | translate}}</label>
  276. <div class="col-sm-6">
  277. <input class="form-control" type="text" name="frontchannelLogoutUrl" id="frontchannelLogoutUrl" data-ng-model="clientEdit.attributes['frontchannel.logout.url']">
  278. </div>
  279. <kc-tooltip>{{:: 'front-channel-logout-url.tooltip' | translate}}</kc-tooltip>
  280. </div>
  281. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  282. <label class="col-md-2 control-label" for="samlForceNameIdFormat">{{:: 'force-name-id-format' | translate}}</label>
  283. <div class="col-sm-6">
  284. <input ng-model="samlForceNameIdFormat" ng-click="switchChange()" name="samlForceNameIdFormat" id="samlForceNameIdFormat" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  285. </div>
  286. <kc-tooltip>{{:: 'force-name-id-format.tooltip' | translate}}</kc-tooltip>
  287. </div>
  288. <div class="form-group" data-ng-show="protocol == 'saml'">
  289. <label class="col-md-2 control-label" for="samlNameIdFormat">{{:: 'name-id-format' | translate}}</label>
  290. <div class="col-sm-6">
  291. <div>
  292. <select class="form-control" id="samlNameIdFormat"
  293. ng-change="changeNameIdFormat()"
  294. ng-model="nameIdFormat"
  295. ng-options="format for format in nameIdFormats">
  296. </select>
  297. </div>
  298. </div>
  299. <kc-tooltip>{{:: 'name-id-format.tooltip' | translate}}</kc-tooltip>
  300. </div>
  301. <div class="form-group" data-ng-show="!clientEdit.bearerOnly && protocol != 'docker-v2'">
  302. <label class="col-md-2 control-label" for="rootUrl">{{:: 'root-url' | translate}}</label>
  303. <div class="col-sm-6">
  304. <input class="form-control" type="text" name="rootUrl" id="rootUrl" data-ng-model="clientEdit.rootUrl">
  305. </div>
  306. <kc-tooltip>{{:: 'root-url.tooltip' | translate}}</kc-tooltip>
  307. </div>
  308. <div class="form-group clearfix block" data-ng-hide="clientEdit.bearerOnly || (!clientEdit.standardFlowEnabled && !clientEdit.implicitFlowEnabled) || protocol == 'docker-v2'">
  309. <label class="col-md-2 control-label" for="newRedirectUri"><span class="required" data-ng-show="protocol != 'saml'">*</span> {{:: 'valid-redirect-uris' | translate}}</label>
  310. <div class="col-sm-6">
  311. <div class="input-group" ng-repeat="(i, redirectUri) in clientEdit.redirectUris track by $index">
  312. <input class="form-control" ng-model="clientEdit.redirectUris[i]">
  313. <div class="input-group-btn">
  314. <button class="btn btn-default" type="button" data-ng-click="deleteRedirectUri($index)"><span class="fa fa-minus"></span></button>
  315. </div>
  316. </div>
  317. <div class="input-group">
  318. <input class="form-control" ng-model="newRedirectUri" id="newRedirectUri">
  319. <div class="input-group-btn">
  320. <button class="btn btn-default" type="button" data-ng-click="newRedirectUri.length > 0 && addRedirectUri()"><span class="fa fa-plus"></span></button>
  321. </div>
  322. </div>
  323. </div>
  324. <kc-tooltip>{{:: 'valid-redirect-uris.tooltip' | translate}}</kc-tooltip>
  325. </div>
  326. <div class="form-group" data-ng-show="!clientEdit.bearerOnly && protocol != 'docker-v2'">
  327. <label class="col-md-2 control-label" for="baseUrl">{{:: 'base-url' | translate}}</label>
  328. <div class="col-sm-6">
  329. <input class="form-control" type="text" name="baseUrl" id="baseUrl" data-ng-model="clientEdit.baseUrl">
  330. </div>
  331. <kc-tooltip>{{:: 'base-url.tooltip' | translate}}</kc-tooltip>
  332. </div>
  333. <div class="form-group" data-ng-hide="protocol == 'saml' || protocol == 'docker-v2'">
  334. <label class="col-md-2 control-label" for="adminUrl">{{:: 'admin-url' | translate}}</label>
  335. <div class="col-sm-6">
  336. <input class="form-control" type="text" name="adminUrl" id="adminUrl"
  337. data-ng-model="clientEdit.adminUrl">
  338. </div>
  339. <kc-tooltip>{{:: 'admin-url.tooltip' | translate}}</kc-tooltip>
  340. </div>
  341. <div class="form-group" data-ng-show="protocol == 'saml'">
  342. <label class="col-md-2 control-label" for="masterSamlUrl">{{:: 'master-saml-processing-url' | translate}}</label>
  343. <div class="col-sm-6">
  344. <input class="form-control" type="text" name="masterSamlUrl" id="masterSamlUrl"
  345. data-ng-model="clientEdit.adminUrl">
  346. </div>
  347. <kc-tooltip>{{:: 'master-saml-processing-url.tooltip' | translate}}</kc-tooltip>
  348. </div>
  349. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  350. <label class="col-md-2 control-label" for="urlReferenceName">{{:: 'idp-sso-url-ref' | translate}}</label>
  351. <div class="col-sm-6">
  352. <input ng-model="clientEdit.attributes.saml_idp_initiated_sso_url_name" class="form-control" type="text" name="urlReferenceName" id="urlReferenceName" />
  353. <div data-ng-show="clientEdit.attributes.saml_idp_initiated_sso_url_name">
  354. {{:: 'idp-sso-url-ref.urlhint' | translate}} {{samlIdpInitiatedUrl(clientEdit.attributes.saml_idp_initiated_sso_url_name)}}
  355. </div>
  356. </div>
  357. <kc-tooltip>{{:: 'idp-sso-url-ref.tooltip' | translate}}</kc-tooltip>
  358. </div>
  359. <div class="form-group" data-ng-show="protocol == 'saml' || protocol == 'openid-connect'">
  360. <label class="col-md-2 control-label" for="logoUri">{{:: 'logo-uri' | translate}}</label>
  361. <div class="col-sm-6">
  362. <input class="form-control" type="text" name="logoUri" id="logoUri" data-ng-model="clientEdit.attributes.logoUri">
  363. </div>
  364. <kc-tooltip>{{:: 'logo-uri.tooltip' | translate}}</kc-tooltip>
  365. </div>
  366. <div class="form-group" data-ng-show="protocol == 'saml' || protocol == 'openid-connect'">
  367. <label class="col-md-2 control-label" for="policyUri">{{:: 'policy-uri' | translate}}</label>
  368. <div class="col-sm-6">
  369. <input class="form-control" type="text" name="policyUri" id="policyUri" data-ng-model="clientEdit.attributes.policyUri">
  370. </div>
  371. <kc-tooltip>{{:: 'policy-uri.tooltip' | translate}}</kc-tooltip>
  372. </div>
  373. <div class="form-group" data-ng-show="protocol == 'saml' || protocol == 'openid-connect'">
  374. <label class="col-md-2 control-label" for="tosUri">{{:: 'tos-uri' | translate}}</label>
  375. <div class="col-sm-6">
  376. <input class="form-control" type="text" name="tosUri" id="tosUri" data-ng-model="clientEdit.attributes.tosUri">
  377. </div>
  378. <kc-tooltip>{{:: 'tos-uri.tooltip' | translate}}</kc-tooltip>
  379. </div>
  380. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  381. <label class="col-md-2 control-label" for="idpInitiatedRelayState">{{:: 'idp-sso-relay-state' | translate}}</label>
  382. <div class="col-sm-6">
  383. <input ng-model="clientEdit.attributes.saml_idp_initiated_sso_relay_state" class="form-control" type="text" name="idpInitiatedRelayState" id="idpInitiatedRelayState" />
  384. </div>
  385. <kc-tooltip>{{:: 'idp-sso-relay-state.tooltip' | translate}}</kc-tooltip>
  386. </div>
  387. <div class="form-group" data-ng-show="(!clientEdit.bearerOnly && protocol == 'openid-connect') && (clientEdit.standardFlowEnabled || clientEdit.directAccessGrantsEnabled || clientEdit.implicitFlowEnabled)">
  388. <label class="col-md-2 control-label" for="newWebOrigin">{{:: 'web-origins' | translate}}</label>
  389. <div class="col-sm-6">
  390. <div class="input-group" ng-repeat="(i, webOrigin) in clientEdit.webOrigins track by $index">
  391. <input class="form-control" ng-model="clientEdit.webOrigins[i]">
  392. <div class="input-group-btn">
  393. <button class="btn btn-default" type="button" data-ng-click="deleteWebOrigin($index)"><span class="fa fa-minus"></span></button>
  394. </div>
  395. </div>
  396. <div class="input-group">
  397. <input class="form-control" ng-model="newWebOrigin" id="newWebOrigin">
  398. <div class="input-group-btn">
  399. <button class="btn btn-default" type="button" data-ng-click="newWebOrigin.length > 0 && addWebOrigin()"><span class="fa fa-plus"></span></button>
  400. </div>
  401. </div>
  402. </div>
  403. <kc-tooltip>{{:: 'web-origins.tooltip' | translate}}</kc-tooltip>
  404. </div>
  405. <div class="form-group" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  406. <label class="col-md-2 control-label" for="backchannelLogoutUrl">{{:: 'backchannel-logout-url' | translate}}</label>
  407. <div class="col-sm-6">
  408. <input class="form-control" type="text" name="backchannelLogoutUrl" id="backchannelLogoutUrl" data-ng-model="clientEdit.attributes['backchannel.logout.url']">
  409. </div>
  410. <kc-tooltip>{{:: 'backchannel-logout-url.tooltip' | translate}}</kc-tooltip>
  411. </div>
  412. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  413. <label class="col-md-2 control-label" for="backchannelLogoutSessionRequired">{{:: 'backchannel-logout-session-required' | translate}}</label>
  414. <div class="col-sm-6">
  415. <input ng-model="backchannelLogoutSessionRequired" name="backchannelLogoutSessionRequired" id="backchannelLogoutSessionRequired" onoffswitch ng-click="switchChange()" on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  416. </div>
  417. <kc-tooltip>{{:: 'backchannel-logout-session-required.tooltip' | translate}}</kc-tooltip>
  418. </div>
  419. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly">
  420. <label class="col-md-2 control-label" for="backchannelLogoutRevokeOfflineSessions">{{:: 'backchannel-logout-revoke-offline-sessions' | translate}}</label>
  421. <div class="col-sm-6">
  422. <input ng-model="backchannelLogoutRevokeOfflineSessions" name="backchannelLogoutRevokeOfflineSessions" id="backchannelLogoutRevokeOfflineSessions" onoffswitch ng-click="switchChange()" on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  423. </div>
  424. <kc-tooltip>{{:: 'backchannel-logout-revoke-offline-sessions.tooltip' | translate}}</kc-tooltip>
  425. </div>
  426. </fieldset>
  427. <fieldset data-ng-show="protocol == 'saml'">
  428. <legend collapsed><span class="text">{{:: 'fine-saml-endpoint-conf' | translate}}</span> <kc-tooltip>{{:: 'fine-saml-endpoint-conf.tooltip' | translate}}</kc-tooltip></legend>
  429. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  430. <label class="col-md-2 control-label" for="consumerServicePost">{{:: 'assertion-consumer-post-binding-url' | translate}}</label>
  431. <div class="col-sm-6">
  432. <input ng-model="clientEdit.attributes.saml_assertion_consumer_url_post" class="form-control" type="text" name="consumerServicePost" id="consumerServicePost" />
  433. </div>
  434. <kc-tooltip>{{:: 'assertion-consumer-post-binding-url.tooltip' | translate}}</kc-tooltip>
  435. </div>
  436. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  437. <label class="col-md-2 control-label" for="consumerServiceRedirect">{{:: 'assertion-consumer-redirect-binding-url' | translate}}</label>
  438. <div class="col-sm-6">
  439. <input ng-model="clientEdit.attributes.saml_assertion_consumer_url_redirect" class="form-control" type="text" name="consumerServiceRedirect" id="consumerServiceRedirect" />
  440. </div>
  441. <kc-tooltip>{{:: 'assertion-consumer-redirect-binding-url.tooltip' | translate}}</kc-tooltip>
  442. </div>
  443. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  444. <label class="col-md-2 control-label" for="logoutPostBinding">{{:: 'logout-service-post-binding-url' | translate}}</label>
  445. <div class="col-sm-6">
  446. <input ng-model="clientEdit.attributes.saml_single_logout_service_url_post" class="form-control" type="text" name="logoutPostBinding" id="logoutPostBinding" />
  447. </div>
  448. <kc-tooltip>{{:: 'logout-service-post-binding-url.tooltip' | translate}}</kc-tooltip>
  449. </div>
  450. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  451. <label class="col-md-2 control-label" for="logoutRedirectBinding">{{:: 'logout-service-redir-binding-url' | translate}}</label>
  452. <div class="col-sm-6">
  453. <input ng-model="clientEdit.attributes.saml_single_logout_service_url_redirect" class="form-control" type="text" name="logoutRedirectBinding" id="logoutRedirectBinding" />
  454. </div>
  455. <kc-tooltip>{{:: 'logout-service-redir-binding-url.tooltip' | translate}}</kc-tooltip>
  456. </div>
  457. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  458. <label class="col-md-2 control-label" for="logoutArtifactBinding">{{:: 'logout-service-artifact-binding-url' | translate}}</label>
  459. <div class="col-sm-6">
  460. <input ng-model="clientEdit.attributes.saml_single_logout_service_url_artifact" class="form-control" type="text" name="logoutRedirectBinding" id="logoutArtifactBinding" />
  461. </div>
  462. <kc-tooltip>{{:: 'logout-service-artifact-binding-url.tooltip' | translate}}</kc-tooltip>
  463. </div>
  464. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  465. <label class="col-md-2 control-label" for="artifactBindingUrl">{{:: 'artifact-binding-url' | translate}}</label>
  466. <div class="col-sm-6">
  467. <input ng-model="clientEdit.attributes.saml_artifact_binding_url" class="form-control" type="text" name="artifactBindingUrl" id="artifactBindingUrl" />
  468. </div>
  469. <kc-tooltip>{{:: 'artifact-binding-url.tooltip' | translate}}</kc-tooltip>
  470. </div>
  471. <div class="form-group clearfix block" data-ng-show="protocol == 'saml'">
  472. <label class="col-md-2 control-label" for="artifactResolutionServiceUrl">{{:: 'artifact-resolution-service-url' | translate}}</label>
  473. <div class="col-sm-6">
  474. <input ng-model="clientEdit.attributes.saml_artifact_resolution_service_url" class="form-control" type="text" name="artifactResolutionServiceUrl" id="artifactResolutionServiceUrl" />
  475. </div>
  476. <kc-tooltip>{{:: 'artifact-resolution-service-url.tooltip' | translate}}</kc-tooltip>
  477. </div>
  478. </fieldset>
  479. <fieldset data-ng-show="protocol == 'openid-connect'">
  480. <legend collapsed><span class="text">{{:: 'fine-oidc-endpoint-conf' | translate}}</span> <kc-tooltip>{{:: 'fine-oidc-endpoint-conf.tooltip' | translate}}</kc-tooltip></legend>
  481. <div class="form-group clearfix block">
  482. <label class="col-md-2 control-label" for="accessTokenSignedResponseAlg">{{:: 'access-token-signed-response-alg' | translate}}</label>
  483. <div class="col-sm-6">
  484. <div>
  485. <select class="form-control" id="accessTokenSignedResponseAlg"
  486. ng-change="changeAccessTokenSignedResponseAlg()"
  487. ng-model="accessTokenSignedResponseAlg">
  488. <option value=""></option>
  489. <option ng-repeat="provider in serverInfo.listProviderIds('signature')" value="{{provider}}">{{provider}}</option>
  490. </select>
  491. </div>
  492. </div>
  493. <kc-tooltip>{{:: 'access-token-signed-response-alg.tooltip' | translate}}</kc-tooltip>
  494. </div>
  495. <div class="form-group clearfix block">
  496. <label class="col-md-2 control-label" for="idTokenSignedResponseAlg">{{:: 'id-token-signed-response-alg' | translate}}</label>
  497. <div class="col-sm-6">
  498. <div>
  499. <select class="form-control" id="idTokenSignedResponseAlg"
  500. ng-change="changeIdTokenSignedResponseAlg()"
  501. ng-model="idTokenSignedResponseAlg">
  502. <option value=""></option>
  503. <option ng-repeat="provider in serverInfo.listProviderIds('signature')" value="{{provider}}">{{provider}}</option>
  504. </select>
  505. </div>
  506. </div>
  507. <kc-tooltip>{{:: 'id-token-signed-response-alg.tooltip' | translate}}</kc-tooltip>
  508. </div>
  509. <div class="form-group clearfix block">
  510. <label class="col-md-2 control-label" for="idTokenEncryptedResponseAlg">{{:: 'id-token-encrypted-response-alg' | translate}}</label>
  511. <div class="col-sm-6">
  512. <div>
  513. <select class="form-control" id="idTokenEncryptedResponseAlg"
  514. ng-change="changeIdTokenEncryptedResponseAlg()"
  515. ng-model="idTokenEncryptedResponseAlg">
  516. <option value=""></option>
  517. <option ng-repeat="provider in serverInfo.listProviderIds('cekmanagement')" value="{{provider}}">{{provider}}</option>
  518. </select>
  519. </div>
  520. </div>
  521. <kc-tooltip>{{:: 'id-token-encrypted-response-alg.tooltip' | translate}}</kc-tooltip>
  522. </div>
  523. <div class="form-group clearfix block">
  524. <label class="col-md-2 control-label" for="idTokenEncryptedResponseEnc">{{:: 'id-token-encrypted-response-enc' | translate}}</label>
  525. <div class="col-sm-6">
  526. <div>
  527. <select class="form-control" id="idTokenEncryptedResponseEnc"
  528. ng-change="changeIdTokenEncryptedResponseEnc()"
  529. ng-model="idTokenEncryptedResponseEnc">
  530. <option value=""></option>
  531. <option ng-repeat="provider in serverInfo.listProviderIds('contentencryption')" value="{{provider}}">{{provider}}</option>
  532. </select>
  533. </div>
  534. </div>
  535. <kc-tooltip>{{:: 'id-token-encrypted-response-enc.tooltip' | translate}}</kc-tooltip>
  536. </div>
  537. <div class="form-group clearfix block">
  538. <label class="col-md-2 control-label" for="userInfoSignedResponseAlg">{{:: 'user-info-signed-response-alg' | translate}}</label>
  539. <div class="col-sm-6">
  540. <div>
  541. <select class="form-control" id="userInfoSignedResponseAlg"
  542. ng-change="changeUserInfoSignedResponseAlg()"
  543. ng-model="userInfoSignedResponseAlg">
  544. <option value="unsigned">unsigned</option>
  545. <option ng-repeat="provider in serverInfo.listProviderIds('signature')" value="{{provider}}">{{provider}}</option>
  546. </select>
  547. </div>
  548. </div>
  549. <kc-tooltip>{{:: 'user-info-signed-response-alg.tooltip' | translate}}</kc-tooltip>
  550. </div>
  551. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  552. <label class="col-md-2 control-label" for="requestObjectSignatureAlg">{{:: 'request-object-signature-alg' | translate}}</label>
  553. <div class="col-sm-6">
  554. <div>
  555. <select class="form-control" id="requestObjectSignatureAlg"
  556. ng-change="changeRequestObjectSignatureAlg()"
  557. ng-model="requestObjectSignatureAlg">
  558. <option value="any">any</option>
  559. <option value="none">none</option>
  560. <option ng-repeat="provider in serverInfo.listProviderIds('clientSignature')" value="{{provider}}">{{provider}}</option>
  561. </select>
  562. </div>
  563. </div>
  564. <kc-tooltip>{{:: 'request-object-signature-alg.tooltip' | translate}}</kc-tooltip>
  565. </div>
  566. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  567. <label class="col-md-2 control-label" for="requestObjectEncryptionAlg">{{:: 'request-object-encryption-alg' | translate}}</label>
  568. <div class="col-sm-6">
  569. <div>
  570. <select class="form-control" id="requestObjectEncryptionAlg"
  571. ng-change="changeRequestObjectEncryptionAlg()"
  572. ng-model="requestObjectEncryptionAlg">
  573. <option value="any">any</option>
  574. <option ng-repeat="provider in serverInfo.listProviderIds('cekmanagement')" value="{{provider}}">{{provider}}</option>
  575. </select>
  576. </div>
  577. </div>
  578. <kc-tooltip>{{:: 'request-object-encryption-alg.tooltip' | translate}}</kc-tooltip>
  579. </div>
  580. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  581. <label class="col-md-2 control-label" for="requestObjectEncryptionEnc">{{:: 'request-object-encryption-enc' | translate}}</label>
  582. <div class="col-sm-6">
  583. <div>
  584. <select class="form-control" id="requestObjectEncryptionEnc"
  585. ng-change="changeRequestObjectEncryptionEnc()"
  586. ng-model="requestObjectEncryptionEnc">
  587. <option value="any">any</option>
  588. <option ng-repeat="provider in serverInfo.listProviderIds('contentencryption')" value="{{provider}}">{{provider}}</option>
  589. </select>
  590. </div>
  591. </div>
  592. <kc-tooltip>{{:: 'request-object-encryption-enc.tooltip' | translate}}</kc-tooltip>
  593. </div>
  594. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  595. <label class="col-md-2 control-label" for="changeRequestObjectRequired">{{:: 'request-object-required' | translate}}</label>
  596. <div class="col-sm-6">
  597. <div>
  598. <select class="form-control" id="requestObjectRequired"
  599. ng-change="changeRequestObjectRequired()"
  600. ng-model="requestObjectRequired"
  601. ng-options="sig for sig in requestObjectRequiredOptions">
  602. </select>
  603. </div>
  604. </div>
  605. <kc-tooltip>{{:: 'request-object-required.tooltip' | translate}}</kc-tooltip>
  606. </div>
  607. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly && serverInfo.featureEnabled('CIBA') && oidcCibaGrantEnabled == true">
  608. <label class="col-md-2 control-label" for="cibaBackchannelTokenDeliveryMode">{{:: 'ciba-backchannel-token-delivery-mode' | translate}}</label>
  609. <div class="col-sm-6">
  610. <div>
  611. <select class="form-control" id="cibaBackchannelTokenDeliveryMode"
  612. ng-change="changeCibaBackchannelTokenDeliveryMode()"
  613. ng-model="cibaBackchannelTokenDeliveryMode">
  614. <option value="poll">poll</option>
  615. <option value="ping">ping</option>
  616. </select>
  617. </div>
  618. </div>
  619. <kc-tooltip>{{:: 'ciba-backchannel-token-delivery-mode.tooltip' | translate}}</kc-tooltip>
  620. </div>
  621. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly && serverInfo.featureEnabled('CIBA') && oidcCibaGrantEnabled == true && cibaBackchannelTokenDeliveryMode == 'ping'">
  622. <label class="col-md-2 control-label" for="cibaBackchannelClientNotificationEndpoint">{{:: 'ciba-backchannel-client-notification-endpoint' | translate}}</label>
  623. <div class="col-sm-6">
  624. <input ng-model="clientEdit.attributes['ciba.backchannel.client.notification.endpoint']" class="form-control" type="text" name="cibaBackchannelClientNotificationEndpoint" id="cibaBackchannelClientNotificationEndpoint" />
  625. </div>
  626. <kc-tooltip>{{:: 'ciba-backchannel-client-notification-endpoint.tooltip' | translate}}</kc-tooltip>
  627. </div>
  628. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && !clientEdit.publicClient && !clientEdit.bearerOnly && serverInfo.featureEnabled('CIBA') && oidcCibaGrantEnabled == true">
  629. <label class="col-md-2 control-label" for="cibaBackchannelAuthRequestSigningAlg">{{:: 'ciba-backchannel-auth-request-signing-alg' | translate}}</label>
  630. <div class="col-sm-6">
  631. <div>
  632. <select class="form-control" id="cibaBackchannelAuthRequestSigningAlg"
  633. ng-change="changeCibaBackchannelAuthRequestSigningAlg()"
  634. ng-model="cibaBackchannelAuthRequestSigningAlg">
  635. <option value="any">any</option>
  636. <option ng-repeat="provider in serverInfo.listProviderIds('clientSignature')" value="{{provider}}">{{provider}}</option>
  637. </select>
  638. </div>
  639. </div>
  640. <kc-tooltip>{{:: 'ciba-backchannel-auth-request-signing-alg.tooltip' | translate}}</kc-tooltip>
  641. </div>
  642. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  643. <label class="col-md-2 control-label" for="newRequestUri">{{:: 'request-uris' | translate}}</label>
  644. <div class="col-sm-6">
  645. <div class="input-group" ng-repeat="(i, requestUri) in clientEdit.requestUris track by $index">
  646. <input class="form-control" ng-model="clientEdit.requestUris[i]">
  647. <div class="input-group-btn">
  648. <button class="btn btn-default" type="button" data-ng-click="deleteRequestUri($index)"><span class="fa fa-minus"></span></button>
  649. </div>
  650. </div>
  651. <div class="input-group">
  652. <input class="form-control" ng-model="newRequestUri" id="newRequestUri">
  653. <div class="input-group-btn">
  654. <button class="btn btn-default" type="button" data-ng-click="newRequestUri.length > 0 && addRequestUri()"><span class="fa fa-plus"></span></button>
  655. </div>
  656. </div>
  657. </div>
  658. <kc-tooltip>{{:: 'request-uris.tooltip' | translate}}</kc-tooltip>
  659. </div>
  660. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  661. <label class="col-md-2 control-label" for="authorizationSignedResponseAlg">{{:: 'authorization-signed-response-alg' | translate}}</label>
  662. <div class="col-sm-6">
  663. <div>
  664. <select class="form-control" id="authorizationSignedResponseAlg"
  665. ng-change="changeAuthorizationSignedResponseAlg()"
  666. ng-model="authorizationSignedResponseAlg">
  667. <option value=""></option>
  668. <option ng-repeat="provider in serverInfo.listProviderIds('signature')" value="{{provider}}">{{provider}}</option>
  669. </select>
  670. </div>
  671. </div>
  672. <kc-tooltip>{{:: 'authorization-signed-response-alg.tooltip' | translate}}</kc-tooltip>
  673. </div>
  674. <div class="form-group clearfix block">
  675. <label class="col-md-2 control-label" for="authorizationEncryptedResponseAlg">{{:: 'authorization-encrypted-response-alg' | translate}}</label>
  676. <div class="col-sm-6">
  677. <div>
  678. <select class="form-control" id="authorizationEncryptedResponseAlg"
  679. ng-change="changeAuthorizationEncryptedResponseAlg()"
  680. ng-model="authorizationEncryptedResponseAlg">
  681. <option value=""></option>
  682. <option ng-repeat="provider in serverInfo.listProviderIds('cekmanagement')" value="{{provider}}">{{provider}}</option>
  683. </select>
  684. </div>
  685. </div>
  686. <kc-tooltip>{{:: 'authorization-encrypted-response-alg.tooltip' | translate}}</kc-tooltip>
  687. </div>
  688. <div class="form-group clearfix block">
  689. <label class="col-md-2 control-label" for="authorizationEncryptedResponseEnc">{{:: 'authorization-encrypted-response-enc' | translate}}</label>
  690. <div class="col-sm-6">
  691. <div>
  692. <select class="form-control" id="authorizationEncryptedResponseEnc"
  693. ng-change="changeAuthorizationEncryptedResponseEnc()"
  694. ng-model="authorizationEncryptedResponseEnc">
  695. <option value=""></option>
  696. <option ng-repeat="provider in serverInfo.listProviderIds('contentencryption')" value="{{provider}}">{{provider}}</option>
  697. </select>
  698. </div>
  699. </div>
  700. <kc-tooltip>{{:: 'authorization-encrypted-response-enc.tooltip' | translate}}</kc-tooltip>
  701. </div>
  702. </fieldset>
  703. <fieldset data-ng-show="protocol == 'openid-connect'">
  704. <legend collapsed><span class="text">{{:: 'oidc-compatibility-modes' | translate}}</span> <kc-tooltip>{{:: 'oidc-compatibility-modes.tooltip' | translate}}</kc-tooltip></legend>
  705. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  706. <label class="col-md-2 control-label" for="excludeSessionStateFromAuthResponse">{{:: 'exclude-session-state-from-auth-response' | translate}}</label>
  707. <div class="col-md-6">
  708. <input ng-model="excludeSessionStateFromAuthResponse" ng-click="switchChange()" name="excludeSessionStateFromAuthResponse" id="excludeSessionStateFromAuthResponse" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  709. </div>
  710. <kc-tooltip>{{:: 'exclude-session-state-from-auth-response.tooltip' | translate}}</kc-tooltip>
  711. </div>
  712. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  713. <label class="col-md-2 control-label" for="useRefreshTokens">{{:: 'use-refresh-tokens' | translate}}</label>
  714. <div class="col-sm-6">
  715. <input ng-model="useRefreshTokens" ng-click="switchChange()" name="useRefreshTokens" id="useRefreshTokens"
  716. onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
  717. </div>
  718. <kc-tooltip>{{:: 'use-refresh-tokens.tooltip' | translate}}</kc-tooltip>
  719. </div>
  720. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  721. <label class="col-md-2 control-label" for="useRefreshTokenForClientCredentialsGrant">{{:: 'use-refresh-token-for-client-credentials-grant' | translate}}</label>
  722. <div class="col-md-6">
  723. <input ng-model="useRefreshTokenForClientCredentialsGrant" ng-click="switchChange()" name="useRefreshTokenForClientCredentialsGrant" id="useRefreshTokenForClientCredentialsGrant" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  724. </div>
  725. <kc-tooltip>{{:: 'use-refresh-token-for-client-credentials-grant.tooltip' | translate}}</kc-tooltip>
  726. </div>
  727. </fieldset>
  728. <fieldset>
  729. <legend collapsed><span class="text">{{:: 'advanced-client-settings' | translate}}</span> <kc-tooltip>{{:: 'advanced-client-settings.tooltip' | translate}}</kc-tooltip></legend>
  730. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  731. <label class="col-md-2 control-label" for="accessTokenLifespan">{{:: 'access-token-lifespan' | translate}}</label>
  732. <div class="col-md-6 time-selector">
  733. <input class="form-control" type="number" min="-1"
  734. max="31536000" data-ng-model="accessTokenLifespan.time"
  735. id="accessTokenLifespan" name="accessTokenLifespan"
  736. data-ng-change="updateTimeouts()"/>
  737. <select class="form-control" name="accessTokenLifespanUnit" data-ng-model="accessTokenLifespan.unit" data-ng-change="updateTimeouts()">
  738. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  739. <option value="Hours">{{:: 'hours' | translate}}</option>
  740. <option value="Days">{{:: 'days' | translate}}</option>
  741. </select>
  742. </div>
  743. <kc-tooltip>{{:: 'access-token-lifespan.tooltip' | translate}}</kc-tooltip>
  744. </div>
  745. <div class="form-group" data-ng-show="protocol == 'saml'">
  746. <label class="col-md-2 control-label" for="samlAssertionLifespan">{{:: 'saml-assertion-lifespan' | translate}}</label>
  747. <div class="col-md-6 time-selector">
  748. <input class="form-control" type="number" min="1"
  749. max="31536000" data-ng-model="samlAssertionLifespan.time"
  750. id="samlAssertionLifespan" name="samlAssertionLifespan"
  751. data-ng-change="updateAssertionLifespan()"/>
  752. <select class="form-control" name="samlAssertionLifespanUnit" data-ng-model="samlAssertionLifespan.unit" data-ng-change="updateAssertionLifespan()">
  753. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  754. <option value="Hours">{{:: 'hours' | translate}}</option>
  755. <option value="Days">{{:: 'days' | translate}}</option>
  756. </select>
  757. </div>
  758. <kc-tooltip>{{:: 'saml-assertion-lifespan.tooltip' | translate}}</kc-tooltip>
  759. </div>
  760. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  761. <label class="col-md-2 control-label" for="clientSessionIdleTimeout">{{:: 'client-session-idle' | translate}}</label>
  762. <div class="col-md-6 time-selector">
  763. <input class="form-control" type="number" min="0"
  764. max="31536000" data-ng-model="clientSessionIdleTimeout.time"
  765. id="clientSessionIdleTimeout" name="clientSessionIdleTimeout"
  766. data-ng-change="updateClientSessionIdleTimeout()"/>
  767. <select class="form-control" name="clientSessionIdleTimeoutUnit" data-ng-model="clientSessionIdleTimeout.unit" data-ng-change="updateClientSessionIdleTimeout()">
  768. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  769. <option value="Hours">{{:: 'hours' | translate}}</option>
  770. <option value="Days">{{:: 'days' | translate}}</option>
  771. </select>
  772. </div>
  773. <kc-tooltip>{{:: 'client-session-idle.tooltip' | translate}}</kc-tooltip>
  774. </div>
  775. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  776. <label class="col-md-2 control-label" for="clientSessionMaxLifespan">{{:: 'client-session-max' | translate}}</label>
  777. <div class="col-md-6 time-selector">
  778. <input class="form-control" type="number" min="0"
  779. max="31536000" data-ng-model="clientSessionMaxLifespan.time"
  780. id="clientSessionMaxLifespan" name="clientSessionMaxLifespan"
  781. data-ng-change="updateClientSessionMaxLifespan()"/>
  782. <select class="form-control" name="clientSessionMaxLifespanUnit" data-ng-model="clientSessionMaxLifespan.unit" data-ng-change="updateClientSessionMaxLifespan()">
  783. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  784. <option value="Hours">{{:: 'hours' | translate}}</option>
  785. <option value="Days">{{:: 'days' | translate}}</option>
  786. </select>
  787. </div>
  788. <kc-tooltip>{{:: 'client-session-max.tooltip' | translate}}</kc-tooltip>
  789. </div>
  790. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  791. <label class="col-md-2 control-label" for="clientOfflineSessionIdleTimeout">{{::
  792. 'client-offline-session-idle' | translate}}</label>
  793. <div class="col-md-6 time-selector">
  794. <input class="form-control" type="number" min="0" max="31536000"
  795. data-ng-model="clientOfflineSessionIdleTimeout.time" id="clientOfflineSessionIdleTimeout"
  796. name="clientOfflineSessionIdleTimeout" data-ng-change="updateClientOfflineSessionIdleTimeout()" /> <select
  797. class="form-control" name="clientOfflineSessionIdleTimeoutUnit"
  798. data-ng-model="clientOfflineSessionIdleTimeout.unit"
  799. data-ng-change="updateClientOfflineSessionIdleTimeout()">
  800. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  801. <option value="Hours">{{:: 'hours' | translate}}</option>
  802. <option value="Days">{{:: 'days' | translate}}</option>
  803. </select>
  804. </div>
  805. <kc-tooltip>{{:: 'client-offline-session-idle.tooltip' | translate}}</kc-tooltip>
  806. </div>
  807. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  808. <label class="col-md-2 control-label" for="clientOfflineSessionMaxLifespan">{{::
  809. 'client-offline-session-max' | translate}}</label>
  810. <div class="col-md-6 time-selector">
  811. <input class="form-control" type="number" min="0" max="31536000"
  812. data-ng-model="clientOfflineSessionMaxLifespan.time" id="clientOfflineSessionMaxLifespan"
  813. name="clientOfflineSessionMaxLifespan" data-ng-change="updateClientOfflineSessionMaxLifespan()" /> <select
  814. class="form-control" name="clientOfflineSessionMaxLifespanUnit"
  815. data-ng-model="clientOfflineSessionMaxLifespan.unit"
  816. data-ng-change="updateClientOfflineSessionMaxLifespan()">
  817. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  818. <option value="Hours">{{:: 'hours' | translate}}</option>
  819. <option value="Days">{{:: 'days' | translate}}</option>
  820. </select>
  821. </div>
  822. <kc-tooltip>{{:: 'client-offline-session-max.tooltip' | translate}}</kc-tooltip>
  823. </div>
  824. <div class="form-group"
  825. data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly && oauth2DeviceAuthorizationGrantEnabled == true">
  826. <label class="col-md-2 control-label" for="oauth2DeviceCodeLifespan">{{:: 'oauth2-device-code-lifespan'
  827. | translate}}</label>
  828. <div class="col-md-6 time-selector">
  829. <input class="form-control" type="number" min="1" max="31536000"
  830. data-ng-model="oauth2DeviceCodeLifespan.time" id="oauth2DeviceCodeLifespan"
  831. name="oauth2DeviceCodeLifespan" data-ng-change="updateOauth2DeviceCodeLifespan()" /> <select
  832. class="form-control" name="oauth2DeviceCodeLifespanUnit" data-ng-model="oauth2DeviceCodeLifespan.unit"
  833. data-ng-change="updateOauth2DeviceCodeLifespan()">
  834. <option value="Minutes">{{:: 'minutes' | translate}}</option>
  835. <option value="Hours">{{:: 'hours' | translate}}</option>
  836. <option value="Days">{{:: 'days' | translate}}</option>
  837. </select>
  838. </div>
  839. <kc-tooltip>{{:: 'oauth2-device-code-lifespan.tooltip' | translate}}</kc-tooltip>
  840. </div>
  841. <div class="form-group"
  842. data-ng-show="protocol == 'openid-connect' && !clientEdit.bearerOnly && oauth2DeviceAuthorizationGrantEnabled == true">
  843. <label class="col-md-2 control-label" for="oauth2DevicePollingInterval">{{::
  844. 'oauth2-device-polling-interval' | translate}}</label>
  845. <div class="col-md-6 time-selector">
  846. <input class="form-control" type="number" min="1" max="31536000" data-ng-model="oauth2DevicePollingInterval"
  847. id="oauth2DevicePollingInterval" name="oauth2DevicePollingInterval"
  848. data-ng-change="updateOauth2DevicePollingInterval()" />
  849. </div>
  850. <kc-tooltip>{{:: 'oauth2-device-polling-interval.tooltip' | translate}}</kc-tooltip>
  851. </div>
  852. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  853. <label class="col-md-2 control-label" for="tlsClientCertificateBoundAccessTokens">{{:: 'tls-client-certificate-bound-access-tokens' | translate}}</label>
  854. <div class="col-sm-6">
  855. <input ng-model="tlsClientCertificateBoundAccessTokens" ng-click="switchChange()" name="tlsClientCertificateBoundAccessTokens" id="tlsClientCertificateBoundAccessTokens" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  856. </div>
  857. <kc-tooltip>{{:: 'tls-client-certificate-bound-access-tokens.tooltip' | translate}}</kc-tooltip>
  858. </div>
  859. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect' && clientEdit.standardFlowEnabled && clientEdit.implicitFlowEnabled">
  860. <label class="col-md-2 control-label" for="useIdTokenAsDetachedSignature">{{:: 'use-idtoken-as-detached-signature' | translate}}</label>
  861. <div class="col-sm-6">
  862. <input ng-model="useIdTokenAsDetachedSignature" ng-click="switchChange()" name="useIdTokenAsDetachedSignature" id="useIdTokenAsDetachedSignature" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  863. </div>
  864. <kc-tooltip>{{:: 'use-idtoken-as-detached-signature.tooltip' | translate}}</kc-tooltip>
  865. </div>
  866. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  867. <label class="col-md-2 control-label" for="changePkceCodeChallengeMethod">{{:: 'pkce-code-challenge-method' | translate}}</label>
  868. <div class="col-sm-6">
  869. <div>
  870. <select class="form-control" id="pkceCodeChallengeMethod"
  871. ng-change="changePkceCodeChallengeMethod()"
  872. ng-model="pkceCodeChallengeMethod"
  873. ng-options="method for method in changePkceCodeChallengeMethodOptions">
  874. </select>
  875. </div>
  876. </div>
  877. <kc-tooltip>{{:: 'pkce-code-challenge-method.tooltip' | translate}}</kc-tooltip>
  878. </div>
  879. <div class="form-group clearfix block" data-ng-show="protocol == 'openid-connect'">
  880. <label class="col-md-2 control-label" for="requirePushedAuthorizationRequests">{{:: 'require-pushed-authorization-requests' | translate}}</label>
  881. <div class="col-sm-6">
  882. <input ng-model="requirePushedAuthorizationRequests" ng-click="switchChange()" name="requirePushedAuthorizationRequests" id="requirePushedAuthorizationRequests" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
  883. </div>
  884. <kc-tooltip>{{:: 'require-pushed-authorization-requests.tooltip' | translate}}</kc-tooltip>
  885. </div>
  886. </fieldset>
  887. <fieldset>
  888. <legend collapsed><span class="text">{{:: 'client-flow-bindings' | translate}}</span> <kc-tooltip>{{:: 'client-flow-bindings.tooltip' | translate}}</kc-tooltip></legend>
  889. <div class="form-group">
  890. <label for="browser" class="col-md-2 control-label">{{:: 'browser-flow' | translate}}</label>
  891. <div class="col-md-2">
  892. <div>
  893. <select id="browser" data-ng-model="clientEdit.authenticationFlowBindingOverrides['browser']" class="form-control" ng-options="flow.id as flow.alias for flow in flows">
  894. </select>
  895. </div>
  896. </div>
  897. <kc-tooltip>{{:: 'browser-flow.tooltip' | translate}}</kc-tooltip>
  898. </div>
  899. <div class="form-group" data-ng-show="protocol == 'openid-connect'">
  900. <label for="grant" class="col-md-2 control-label">{{:: 'direct-grant-flow' | translate}}</label>
  901. <div class="col-md-2">
  902. <div>
  903. <select id="grant" ng-model="clientEdit.authenticationFlowBindingOverrides['direct_grant']" class="form-control" ng-options="flow.id as flow.alias for flow in flows">
  904. </select>
  905. </div>
  906. </div>
  907. <kc-tooltip>{{:: 'direct-grant-flow.tooltip' | translate}}</kc-tooltip>
  908. </div>
  909. </fieldset>
  910. <div class="form-group">
  911. <div class="col-md-10 col-md-offset-2" data-ng-show="client.access.configure">
  912. <button kc-save data-ng-disabled="!changed">{{:: 'save' | translate}}</button>
  913. <button kc-reset data-ng-disabled="!changed">{{:: 'cancel' | translate}}</button>
  914. </div>
  915. </div>
  916. </form>
  917. </div>
  918. <kc-menu></kc-menu>