admin-ssl.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template lang='pug'>
  2. v-container(fluid, grid-list-lg)
  3. v-layout(row wrap)
  4. v-flex(xs12)
  5. .admin-header
  6. img.animated.fadeInUp(src='/svg/icon-validation.svg', alt='SSL', style='width: 80px;')
  7. .admin-header-title
  8. .headline.primary--text.animated.fadeInLeft {{ $t('admin:ssl.title') }}
  9. .subtitle-1.grey--text.animated.fadeInLeft {{ $t('admin:ssl.subtitle') }}
  10. v-spacer
  11. v-btn.animated.fadeInDown(color='success', depressed, @click='save', large)
  12. v-icon(left) mdi-check
  13. span {{$t('common:actions.apply')}}
  14. v-form.pt-3
  15. v-layout(row wrap)
  16. v-flex(lg6 xs12)
  17. v-form
  18. v-card.animated.fadeInUp
  19. v-toolbar(color='primary', dark, dense, flat)
  20. v-toolbar-title.subtitle-1 {{ $t('admin:ssl.provider') }}
  21. v-card-text
  22. v-select(
  23. :items='providers'
  24. outlined
  25. :label='$t(`admin:ssl.provider`)'
  26. required
  27. :counter='255'
  28. v-model='config.provider'
  29. prepend-icon='mdi-handshake'
  30. :hint='$t(`admin:ssl.providerHint`)'
  31. persistent-hint
  32. )
  33. v-text-field.mt-3(
  34. outlined
  35. :label='$t(`admin:ssl.domain`)'
  36. required
  37. :counter='255'
  38. v-model='config.domain'
  39. prepend-icon='mdi-earth'
  40. :hint='$t(`admin:ssl.domainHint`)'
  41. persistent-hint
  42. :disabled='config.provider === ``'
  43. )
  44. v-card.animated.fadeInUp.wait-p2s.mt-3(v-if='config.provider !== ``')
  45. v-toolbar(color='primary', dark, dense, flat)
  46. v-toolbar-title.subtitle-1 {{$t('admin:ssl.providerOptions')}}
  47. v-card-text ---
  48. v-flex(lg6 xs12)
  49. v-card.animated.fadeInUp.wait-p2s
  50. v-toolbar(color='primary', dark, dense, flat)
  51. v-toolbar-title.subtitle-1 {{ $t('admin:ssl.ports') }}
  52. v-card-text
  53. v-row
  54. v-col(cols='6')
  55. v-text-field(
  56. outlined
  57. :label='$t(`admin:ssl.httpPort`)'
  58. v-model='config.httpPort'
  59. prepend-icon='mdi-lock-open-variant-outline'
  60. :hint='$t(`admin:ssl.httpPortHint`)'
  61. persistent-hint
  62. )
  63. v-col(cols='6')
  64. v-checkbox(
  65. :label='$t(`admin:ssl.httpPortRedirect`)'
  66. v-model='config.httpRedirect'
  67. :hint='$t(`admin:ssl.httpPortRedirectHint`)'
  68. :disabled='config.provider === ``'
  69. persistent-hint
  70. color='primary'
  71. )
  72. v-col(cols='6')
  73. v-text-field(
  74. outlined
  75. :label='$t(`admin:ssl.httpsPort`)'
  76. v-model='config.httpsPort'
  77. prepend-icon='mdi-lock'
  78. :hint='$t(`admin:ssl.httpsPortHint`)'
  79. persistent-hint
  80. :disabled='config.provider === ``'
  81. )
  82. v-card-text.grey(:class='$vuetify.theme.dark ? `darken-4-l5` : `lighten-4`')
  83. .caption {{$t(`admin:ssl.writableConfigFileWarning`)}}
  84. </template>
  85. <script>
  86. import _ from 'lodash'
  87. import siteConfigQuery from 'gql/admin/site/site-query-config.gql'
  88. import siteUpdateConfigMutation from 'gql/admin/site/site-mutation-save-config.gql'
  89. export default {
  90. data() {
  91. return {
  92. config: {
  93. provider: '',
  94. domain: '',
  95. httpPort: 3000,
  96. httpPortRedirect: true,
  97. httpsPort: 443
  98. }
  99. }
  100. },
  101. computed: {
  102. providers () {
  103. return [
  104. { text: this.$t('admin:ssl.providerDisabled'), value: '' },
  105. { text: this.$t('admin:ssl.providerLetsEncrypt'), value: 'letsencrypt' },
  106. { text: this.$t('admin:ssl.providerCustomCertificate'), value: 'custom' }
  107. ]
  108. }
  109. },
  110. methods: {
  111. async save () {
  112. try {
  113. await this.$apollo.mutate({
  114. mutation: siteUpdateConfigMutation,
  115. variables: {
  116. host: _.get(this.config, 'host', ''),
  117. title: _.get(this.config, 'title', ''),
  118. description: _.get(this.config, 'description', ''),
  119. robots: _.get(this.config, 'robots', []),
  120. analyticsService: _.get(this.config, 'analyticsService', ''),
  121. analyticsId: _.get(this.config, 'analyticsId', ''),
  122. company: _.get(this.config, 'company', ''),
  123. hasLogo: _.get(this.config, 'hasLogo', false),
  124. logoIsSquare: _.get(this.config, 'logoIsSquare', false),
  125. featurePageRatings: _.get(this.config, 'featurePageRatings', false),
  126. featurePageComments: _.get(this.config, 'featurePageComments', false),
  127. featurePersonalWikis: _.get(this.config, 'featurePersonalWikis', false),
  128. securityIframe: _.get(this.config, 'securityIframe', false),
  129. securityReferrerPolicy: _.get(this.config, 'securityReferrerPolicy', false),
  130. securityTrustProxy: _.get(this.config, 'securityTrustProxy', false),
  131. securitySRI: _.get(this.config, 'securitySRI', false),
  132. securityHSTS: _.get(this.config, 'securityHSTS', false),
  133. securityHSTSDuration: _.get(this.config, 'securityHSTSDuration', 0),
  134. securityCSP: _.get(this.config, 'securityCSP', false),
  135. securityCSPDirectives: _.get(this.config, 'securityCSPDirectives', '')
  136. },
  137. watchLoading (isLoading) {
  138. this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-site-update')
  139. }
  140. })
  141. this.$store.commit('showNotification', {
  142. style: 'success',
  143. message: 'Configuration saved successfully.',
  144. icon: 'check'
  145. })
  146. this.siteTitle = this.config.title
  147. this.company = this.config.company
  148. } catch (err) {
  149. this.$store.commit('pushGraphError', err)
  150. }
  151. }
  152. }
  153. // apollo: {
  154. // config: {
  155. // query: siteConfigQuery,
  156. // fetchPolicy: 'network-only',
  157. // update: (data) => _.cloneDeep(data.site.config),
  158. // watchLoading (isLoading) {
  159. // this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-site-refresh')
  160. // }
  161. // }
  162. // }
  163. }
  164. </script>
  165. <style lang='scss'>
  166. </style>