sshProfileSettings.component.pug 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. ul.nav-tabs(ngbNav, #nav='ngbNav')
  2. li(ngbNavItem)
  3. a(ngbNavLink, translate) General
  4. ng-template(ngbNavContent)
  5. .d-flex.w-100.mt-3
  6. .mb-3.me-2(
  7. ngbDropdown
  8. )
  9. label(translate) Connection
  10. button.btn.btn-secondary.d-block(ngbDropdownToggle) {{getConnectionDropdownTitle()}}
  11. div(ngbDropdownMenu)
  12. button.dropdown-item(
  13. (click)='connectionMode = "direct"',
  14. translate
  15. ) Direct
  16. button.dropdown-item(
  17. *ngIf='hostApp.platform !== Platform.Web',
  18. (click)='connectionMode = "proxyCommand"',
  19. )
  20. div Proxy command
  21. .text-muted(translate) Command's stdin/stdout is used instead of a network connection
  22. button.dropdown-item(
  23. (click)='connectionMode = "jumpHost"',
  24. )
  25. div(translate) Jump host
  26. .text-muted(translate) Connect to a different host first and use it as a proxy
  27. button.dropdown-item(
  28. (click)='connectionMode = "socksProxy"',
  29. )
  30. div(translate) SOCKS proxy
  31. .text-muted(translate) Connect through a proxy server
  32. button.dropdown-item(
  33. (click)='connectionMode = "httpProxy"',
  34. )
  35. div(translate) HTTP proxy
  36. .text-muted(translate) Using CONNECT method
  37. .mb-3.w-100(*ngIf='connectionMode === "proxyCommand"')
  38. label(translate) Proxy command
  39. input.form-control(
  40. type='text',
  41. [(ngModel)]='profile.options.proxyCommand',
  42. )
  43. .mb-3.w-100.me-2(*ngIf='connectionMode !== "proxyCommand"')
  44. label(translate) Host
  45. input.form-control(
  46. type='text',
  47. [(ngModel)]='profile.options.host',
  48. )
  49. .mb-3(*ngIf='connectionMode !== "proxyCommand"')
  50. label(translate) Port
  51. input.form-control(
  52. type='number',
  53. placeholder='22',
  54. [(ngModel)]='profile.options.port',
  55. )
  56. .mb-3(*ngIf='connectionMode === "jumpHost"')
  57. label(translate) Jump host
  58. select.form-control([(ngModel)]='profile.options.jumpHost')
  59. option([ngValue]='null', translate) Select
  60. option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{getJumpHostLabel(x)}}
  61. .d-flex.w-100(*ngIf='connectionMode === "socksProxy"')
  62. .mb-3.w-100.me-2
  63. label(translate) SOCKS proxy host
  64. input.form-control(
  65. type='text',
  66. [(ngModel)]='profile.options.socksProxyHost',
  67. )
  68. .mb-3
  69. label(translate) SOCKS proxy port
  70. input.form-control(
  71. type='number',
  72. placeholder='5000',
  73. [(ngModel)]='profile.options.socksProxyPort',
  74. )
  75. .d-flex.w-100(*ngIf='connectionMode === "httpProxy"')
  76. .mb-3.w-100.me-2
  77. label(translate) HTTP proxy host
  78. input.form-control(
  79. type='text',
  80. [(ngModel)]='profile.options.httpProxyHost',
  81. )
  82. .mb-3
  83. label(translate) HTTP proxy port
  84. input.form-control(
  85. type='number',
  86. placeholder='5000',
  87. [(ngModel)]='profile.options.httpProxyPort',
  88. )
  89. .mb-3
  90. label(translate) Username
  91. input.form-control(
  92. type='text',
  93. placeholder='Ask every time',
  94. [(ngModel)]='profile.options.user',
  95. )
  96. .mb-3
  97. label(translate) Authentication method
  98. .btn-group.mt-1.w-100
  99. input.btn-check(
  100. type='radio',
  101. name='auth',
  102. [(ngModel)]='profile.options.auth',
  103. id='authAuto',
  104. [value]='null'
  105. )
  106. label.btn.btn-secondary(
  107. for='authAuto'
  108. )
  109. i.far.fa-lightbulb
  110. .m-0(translate) Auto
  111. input.btn-check(
  112. type='radio',
  113. name='auth',
  114. [(ngModel)]='profile.options.auth',
  115. id='authPassword',
  116. [value]='"password"'
  117. )
  118. label.btn.btn-secondary(
  119. for='authPassword'
  120. )
  121. i.fas.fa-font
  122. .m-0(translate) Password
  123. input.btn-check(
  124. type='radio',
  125. name='auth',
  126. [(ngModel)]='profile.options.auth',
  127. id='authPublicKey',
  128. [value]='"publicKey"'
  129. )
  130. label.btn.btn-secondary(
  131. for='authPublicKey'
  132. )
  133. i.fas.fa-key
  134. .m-0(translate) Key
  135. input.btn-check(
  136. type='radio',
  137. name='auth',
  138. [(ngModel)]='profile.options.auth',
  139. id='authAgent',
  140. [value]='"agent"'
  141. )
  142. label.btn.btn-secondary(
  143. for='authAgent'
  144. , ng:if='hostApp.platform !== Platform.Web')
  145. i.fas.fa-user-secret
  146. .m-0(translate) Agent
  147. input.btn-check(
  148. type='radio',
  149. name='auth',
  150. [(ngModel)]='profile.options.auth',
  151. id='auth"keyboardInteractive"',
  152. [value]='"keyboardInteractive"'
  153. )
  154. label.btn.btn-secondary(
  155. for='auth"keyboardInteractive"'
  156. )
  157. i.far.fa-keyboard
  158. .m-0(translate) Interactive
  159. .form-line(*ngIf='profile.options.user && (!profile.options.auth || profile.options.auth === "password")')
  160. .header
  161. .title(translate) Password
  162. .description(*ngIf='!hasSavedPassword', translate) Save a password in the keychain
  163. .description(*ngIf='hasSavedPassword', translate) There is a saved password for this connection
  164. button.btn.btn-success.ms-4(*ngIf='!hasSavedPassword', (click)='setPassword()')
  165. i.fas.fa-key
  166. span(translate) Set password
  167. button.btn.btn-danger.ms-4(*ngIf='hasSavedPassword', (click)='clearSavedPassword()')
  168. i.fas.fa-trash-alt
  169. span(translate) Forget
  170. .mb-3(*ngIf='!profile.options.auth || profile.options.auth === "publicKey"')
  171. label(translate) Private keys
  172. .list-group.mb-2
  173. .list-group-item.d-flex.align-items-center.p-1.ps-3(*ngFor='let path of profile.options.privateKeys')
  174. i.fas.fa-key
  175. .no-wrap.me-auto {{path}}
  176. button.btn.btn-link((click)='removePrivateKey(path)')
  177. i.fas.fa-trash
  178. button.btn.btn-secondary((click)='addPrivateKey()')
  179. i.fas.fa-folder-open
  180. span(translate) Add a private key
  181. li(ngbNavItem)
  182. a(ngbNavLink, translate) Ports
  183. ng-template(ngbNavContent)
  184. ssh-port-forwarding-config(
  185. *ngIf='profile.options.forwardedPorts',
  186. [model]='profile.options.forwardedPorts',
  187. (forwardAdded)='onForwardAdded($event)',
  188. (forwardRemoved)='onForwardRemoved($event)'
  189. )
  190. li(ngbNavItem)
  191. a(ngbNavLink, translate) Advanced
  192. ng-template(ngbNavContent)
  193. .form-line(ng:if='hostApp.platform !== Platform.Web')
  194. .header
  195. .title(translate) X11 forwarding
  196. toggle([(ngModel)]='profile.options.x11')
  197. .form-line(ng:if='hostApp.platform !== Platform.Web')
  198. .header
  199. .title(translate) Agent forwarding
  200. toggle([(ngModel)]='profile.options.agentForward')
  201. .form-line
  202. .header
  203. .title(translate) Skip MoTD/banner
  204. .description(translate) Will prevent the SSH greeting from showing up
  205. toggle([(ngModel)]='profile.options.skipBanner')
  206. .form-line
  207. .header
  208. .title(translate) Reuse session for multiple tabs
  209. .description Multiplex multiple shells through the same connection
  210. toggle([(ngModel)]='profile.options.reuseSession')
  211. .form-line
  212. .header
  213. .title(translate) Keep Alive Interval (Milliseconds)
  214. input.form-control(
  215. type='number',
  216. placeholder='0',
  217. [(ngModel)]='profile.options.keepaliveInterval',
  218. )
  219. .form-line
  220. .header
  221. .title(translate) Max Keep Alive Count
  222. input.form-control(
  223. type='number',
  224. placeholder='3',
  225. [(ngModel)]='profile.options.keepaliveCountMax',
  226. )
  227. .form-line
  228. .header
  229. .title(translate) Ready Timeout (Milliseconds)
  230. input.form-control(
  231. type='number',
  232. placeholder='20000',
  233. [(ngModel)]='profile.options.readyTimeout',
  234. )
  235. li(ngbNavItem)
  236. a(ngbNavLink, translate) Ciphers
  237. ng-template(ngbNavContent)
  238. .form-line.align-items-start
  239. .header
  240. .title(translate) Ciphers
  241. .w-75
  242. div(*ngFor='let alg of supportedAlgorithms.cipher')
  243. checkbox([text]='alg', [(ngModel)]='algorithms.cipher[alg]')
  244. .form-line.align-items-start
  245. .header
  246. .title(translate) Key exchange
  247. .w-75
  248. div(*ngFor='let alg of supportedAlgorithms.kex')
  249. checkbox([text]='alg', [(ngModel)]='algorithms.kex[alg]')
  250. .form-line.align-items-start
  251. .header
  252. .title HMAC
  253. .w-75
  254. div(*ngFor='let alg of supportedAlgorithms.hmac')
  255. checkbox([text]='alg', [(ngModel)]='algorithms.hmac[alg]')
  256. .form-line.align-items-start
  257. .header
  258. .title(translate) Host key
  259. .w-75
  260. div(*ngFor='let alg of supportedAlgorithms.serverHostKey')
  261. checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]')
  262. li(ngbNavItem)
  263. a(ngbNavLink, translate) Colors
  264. ng-template(ngbNavContent)
  265. color-scheme-selector([(model)]='profile.terminalColorScheme')
  266. li(ngbNavItem)
  267. a(ngbNavLink, translate) Login scripts
  268. ng-template(ngbNavContent)
  269. login-scripts-settings([options]='profile.options', #loginScriptsSettings)
  270. li(ngbNavItem)
  271. a(ngbNavLink, translate) Input
  272. ng-template(ngbNavContent)
  273. input-processing-settings([options]='profile.options.input')
  274. div([ngbNavOutlet]='nav')