#3 Fix FE for download restore keys

Merged
jonathan merged 7 commits from kris/download_restore_key into master 4 years ago
  1. +5
    -3
      src/_components/TotpModal.vue
  2. +11
    -0
      src/_store/index.js
  3. +4
    -0
      src/_store/networks.module.js
  4. +4
    -2
      src/account/DevicesPage.vue
  5. +27
    -15
      src/account/NetworkPage.vue
  6. +4
    -2
      src/account/NewNetworkPage.vue
  7. +5
    -3
      src/account/profile/ChangePasswordPage.vue
  8. +5
    -3
      src/account/profile/PolicyPage.vue
  9. +4
    -2
      src/account/profile/ProfilePage.vue
  10. +4
    -2
      src/account/profile/SetPasswordPage.vue
  11. +4
    -2
      src/account/profile/SshKeysPage.vue
  12. +5
    -2
      src/auth/ActivationPage.vue
  13. +4
    -2
      src/auth/ForgotPasswordPage.vue
  14. +4
    -2
      src/auth/LoginPage.vue
  15. +4
    -2
      src/auth/RegisterPage.vue

+ 5
- 3
src/_components/TotpModal.vue View File

@@ -13,7 +13,7 @@
<button class="btn btn-primary" :disabled="status.authenticating || token === null || token.length < 6">
{{messages.button_label_submit_totp_code}}
</button>
<img v-show="status.authenticating" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="status.authenticating" :src="loadingImgSrc" />
</div>
</form>
</div>
@@ -21,7 +21,8 @@

<script>
import { mapState, mapActions } from 'vuex';
import { util } from '../_helpers'
import { util } from '../_helpers';
import { loadingImgSrc } from '../_store';

export default {
data() {
@@ -29,7 +30,8 @@
submitted: false,
token: '',
refresher: null,
showTotpModal: false
showTotpModal: false,
loadingImgSrc: loadingImgSrc
};
},
created() {


+ 11
- 0
src/_store/index.js View File

@@ -40,6 +40,17 @@ export const store = new Vuex.Store({
});

export const safeEval = require('safe-eval');
export const loadingImgSrc = 'data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4'
+ 'wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2'
+ 'MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63'
+ 'P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAA'
+ 'EAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQo'
+ 'AAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TA'
+ 'AAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsG'
+ 'o/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3'
+ 'lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTA'
+ 'UkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMT'
+ 'CpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==';

function evalInContext(vue, string) {
try {


+ 4
- 0
src/_store/networks.module.js View File

@@ -243,6 +243,8 @@ const mutations = {

requestNetworkKeysRequest(state) {
state.loading.requestNetworkKeys = true;
state.networkKeysRequested = null;
state.networkKeys = null;
},
requestNetworkKeysSuccess(state, networkId) {
state.loading.requestNetworkKeys = false;
@@ -255,6 +257,8 @@ const mutations = {

retrieveNetworkKeysRequest(state) {
state.loading.retrieveNetworkKeys = true;
state.networkKeysRequested = null;
state.networkKeys = null;
},
retrieveNetworkKeysSuccess(state, keys) {
state.loading.retrieveNetworkKeys = false;


+ 4
- 2
src/account/DevicesPage.vue View File

@@ -86,7 +86,7 @@
<hr/>
<div class="form-group">
<button class="btn btn-primary" :disabled="loading || !addDeviceReady">{{messages.button_label_add_device}}</button>
<img v-show="loading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading" :src="loadingImgSrc" />
</div>
</form>

@@ -119,6 +119,7 @@
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../_helpers';
import config from 'config';
import { loadingImgSrc } from '../_store';

export default {
data () {
@@ -131,7 +132,8 @@
displayVpnConfig: {},
displayDeviceHelp: {},
config: config,
mitmLoading: true
mitmLoading: true,
loadingImgSrc: loadingImgSrc
};
},
computed: {


+ 27
- 15
src/account/NetworkPage.vue View File

@@ -54,10 +54,14 @@
</div>

<div v-if="network.state === 'running' && configs.networkUuid && network.uuid === configs.networkUuid">
<button @click="requestRestoreKey()">{{messages.link_network_action_request_keys}}</button>
<button class="btn btn-secondary" @click="requestRestoreKey()"
:disabled="loading && loading.requestNetworkKeys">
{{messages.link_network_action_request_keys}}
</button>
<img v-show="loading && loading.requestNetworkKeys" :src="loadingImgSrc" />
<div v-if="errors.has('networkKeys')" class="invalid-feedback d-block">{{ errors.first('networkKeys') }}</div>
<div v-if="networkKeysRequested && networkKeysRequested === networkId">{{messages.message_network_action_keys_requested}}</div>

<hr />
<h5>{{messages.message_network_action_retrieve_keys}}</h5>
<form @submit.prevent="retrieveRestoreKey()">
<div class="form-group">
@@ -67,17 +71,23 @@
</div>
<div class="form-group">
<label for="restoreKeyPassword">{{messages.field_network_key_download_password}}</label>
<input type="text" v-model="restoreKeyPassword" v-validate="'required'" name="restoreKeyPassword" class="form-control" :class="{ 'is-invalid': errors.has('password') }" />
<input type="text" v-model="restoreKeyPassword" v-validate="'required'" name="restoreKeyPassword"
class="form-control" :class="{ 'is-invalid': errors.has('password') }"
:autofocus="this.$route.query.hasOwnProperty('keys_code')"/>
<div v-if="errors.has('password')" class="invalid-feedback">{{ errors.first('password') }}</div>
</div>
<button>{{messages.button_label_retrieve_keys}}</button>
<button class="btn btn-secondary" :disabled="loading && loading.retrieveNetworkKeys">
{{ messages.button_label_retrieve_keys }}
</button>
<img v-show="loading && loading.retrieveNetworkKeys" :src="loadingImgSrc" />
</form>
<div v-if="networkKeys">
<hr />
<h4><b>{{messages.message_network_keys}}</b></h4>: {{networkKeys}}
<hr/>
<h4><b>{{ messages.message_network_keys }}</b></h4>
<textarea v-model="networkKeys.data" name="networkKeys" class="form-control" cols="50"
readonly="true" />
{{ messages.message_network_keys_description }}
</div>
</form>
</div>

<hr/>
@@ -92,13 +102,13 @@
<div v-if="errors.has('accountPlan')" class="invalid-feedback d-block">{{ errors.first('accountPlan') }}</div>
<div v-if="network.state === 'running' || network.state === 'starting'" style="border: 2px solid #000;">
<hr/>
<button @click="stopNet()" class="text-danger">{{messages.link_network_action_stop}}</button>
<button @click="stopNet()" class="btn btn-danger">{{messages.link_network_action_stop}}</button>
{{messages.link_network_action_stop_description}}
</div>
<div v-else></div>
<hr/>
<div v-if="network.state === 'stopped' || network.state === 'error_stopping'" style="border: 2px solid #000;">
<button @click="deleteNet()" class="text-danger">{{messages.link_network_action_delete}}</button>
<button @click="deleteNet()" class="btn btn-danger">{{messages.link_network_action_delete}}</button>
{{messages.link_network_action_delete_description}}
</div>
</div>
@@ -107,8 +117,9 @@
</template>

<script>
import { mapState, mapActions, mapGetters } from 'vuex'
import { util } from '../_helpers'
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../_helpers';
import { loadingImgSrc } from '../_store';

export default {
data() {
@@ -118,13 +129,14 @@
stats: null,
refresher: null,
restoreKeyCode: null,
restoreKeyPassword: null
restoreKeyPassword: null,
loadingImgSrc: loadingImgSrc
};
},
computed: {
...mapState('networks', [
'network', 'newNodeNotification', 'networkStatuses', 'networkNodes', 'networkKeysRequested',
'deletedNetwork', 'networkKeys'
'deletedNetwork', 'networkKeys', 'loading'
]),
...mapState('system', ['messages', 'configs']),
showSetupHelp () {
@@ -134,9 +146,8 @@
methods: {
...mapActions('networks', [
'getNetworkById', 'deleteNetwork', 'getStatusesByNetworkId', 'getNodesByNetworkId',
'stopNetwork', 'deleteNetwork', 'requestNetworkKeys'
'stopNetwork', 'deleteNetwork', 'requestNetworkKeys', 'retrieveNetworkKeys'
]),
...mapGetters('networks', ['loading']),
refreshStatus (userId) {
this.getNetworkById({userId: userId, networkId: this.networkId, messages: this.messages, errors: this.errors});
this.getStatusesByNetworkId({
@@ -200,6 +211,7 @@
const user = util.currentUser();
this.refreshStatus(user.uuid);
this.startStatusRefresher(user);
this.restoreKeyCode = this.$route.query.keys_code;
},
beforeDestroy () {
clearInterval(this.refresher);


+ 4
- 2
src/account/NewNetworkPage.vue View File

@@ -299,7 +299,7 @@

<div class="form-group">
<button class="btn btn-primary" :disabled="loading() || !isComplete" @click="launchBubble()">{{messages.button_label_create_new_network}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>
</form>
</div>
@@ -309,6 +309,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex'
import { util } from '../_helpers'
import { loadingImgSrc } from '../_store';

// convenience methods
import { isAuthenticator, isNotAuthenticator } from '../_store/users.module';
@@ -367,7 +368,8 @@
firstContact: null,
payMethods: null,
accountPayMethods: null,
selectedPaymentMethod: null
selectedPaymentMethod: null,
loadingImgSrc: loadingImgSrc
};
},
computed: {


+ 5
- 3
src/account/profile/ChangePasswordPage.vue View File

@@ -19,7 +19,7 @@
</div>
<div class="form-group">
<button class="btn btn-primary" :disabled="loading()">{{messages.button_label_request_password_reset}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>
</div>
<div v-else>
@@ -49,7 +49,7 @@

<div class="form-group">
<button class="btn btn-primary" :disabled="loading()">{{messages.button_label_change_password}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>
</div>

@@ -60,6 +60,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../../_helpers';
import { loadingImgSrc } from '../../_store';

export default {
data() {
@@ -75,7 +76,8 @@
totpToken: null,
hasRequiredAuthenticator: null,
hasRequiredExternalAuth: null,
requiredExternalAuthContacts: []
requiredExternalAuthContacts: [],
loadingImgSrc: loadingImgSrc
}
},
computed: {


+ 5
- 3
src/account/profile/PolicyPage.vue View File

@@ -55,7 +55,7 @@
<hr/>
<div class="form-group">
<button class="btn btn-primary" :disabled="loading()">{{messages.button_label_update_policy}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>

</form>
@@ -329,7 +329,7 @@
<hr/>
<div class="form-group">
<button class="btn btn-primary" :disabled="loading() || !newContactValid">{{messages.button_label_add_contact}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>
</form>

@@ -339,6 +339,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../../_helpers';
import { loadingImgSrc } from '../../_store';

// convenience methods
import { isAuthenticator, isNotAuthenticator } from '../../_store/users.module';
@@ -386,7 +387,8 @@
newContact: initNewContact(),
verifyingContact: null,
inboundAction: null,
watchedPolicy: null
watchedPolicy: null,
loadingImgSrc: loadingImgSrc
}
},
computed: {


+ 4
- 2
src/account/profile/ProfilePage.vue View File

@@ -99,7 +99,7 @@
<div class="form-group">
<button v-if="newUser === null || newUser === false || admin !== true" class="btn btn-primary" :disabled="loading()">{{messages.button_label_update_profile}}</button>
<button v-else class="btn btn-primary" :disabled="loading()">{{messages.button_label_create_account}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>
</form>
</div>
@@ -108,6 +108,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../../_helpers';
import { loadingImgSrc } from '../../_store';

const BLANK_SUBJECT = {
name: null,
@@ -136,7 +137,8 @@
admin: false,
newUser: null,
submitted: false,
subject: Object.assign({}, BLANK_SUBJECT)
subject: Object.assign({}, BLANK_SUBJECT),
loadingImgSrc: loadingImgSrc
};
},
computed: {


+ 4
- 2
src/account/profile/SetPasswordPage.vue View File

@@ -25,7 +25,7 @@

<div class="form-group">
<button class="btn btn-primary" :disabled="loading()">{{messages.button_label_set_password}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>

</form>
@@ -36,6 +36,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../../_helpers';
import { loadingImgSrc } from '../../_store';

export default {
data() {
@@ -46,7 +47,8 @@
newPasswordConfirm: null,
code: null,
showTotp: false,
totpToken: null
totpToken: null,
loadingImgSrc: loadingImgSrc
}
},
computed: {


+ 4
- 2
src/account/profile/SshKeysPage.vue View File

@@ -53,7 +53,7 @@

<div class="form-group">
<button class="btn btn-primary" :disabled="loading() || !newKeyValid">{{messages.button_label_add_ssh_key}}</button>
<img v-show="loading()" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="loading()" :src="loadingImgSrc" />
</div>

</form>
@@ -64,6 +64,7 @@
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../../_helpers';
import { Settings } from 'luxon';
import { loadingImgSrc } from '../../_store';

export default {
data() {
@@ -77,7 +78,8 @@
expiration: null,
sshPublicKey: null,
minExpiration: (new Date()).toISOString(),
timezone: null
timezone: null,
loadingImgSrc: loadingImgSrc
};
},
computed: {


+ 5
- 2
src/auth/ActivationPage.vue View File

@@ -84,7 +84,7 @@

<div class="form-group">
<button class="btn btn-primary" :disabled="status.activating">{{messages.button_label_activate}}</button>
<img v-show="status.activating" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="status.activating" :src="loadingImgSrc" />
</div>
</form>
</div>
@@ -92,6 +92,7 @@

<script>
import { mapState, mapActions } from 'vuex'
import { loadingImgSrc } from '../_store';

function toCredentialsMap(creds) {
const map = {};
@@ -127,7 +128,9 @@
domainName: null,
publicDns: null,

displayShowAllCheckbox: null
displayShowAllCheckbox: null,

loadingImgSrc: loadingImgSrc
};
},
computed: {


+ 4
- 2
src/auth/ForgotPasswordPage.vue View File

@@ -11,7 +11,7 @@
</div>
<div class="form-group">
<button class="btn btn-primary" :disabled="status.sendingResetPasswordMessage === true">{{messages.button_label_resetPassword}}</button>
<img v-show="status.sendingResetPasswordMessage === true" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="status.sendingResetPasswordMessage === true" :src="loadingImgSrc" />
</div>
</form>
</div>
@@ -20,12 +20,14 @@
<script>
import { mapState, mapActions } from 'vuex'
import { util } from '../_helpers'
import { loadingImgSrc } from '../_store';

export default {
data () {
return {
name: '',
submitted: false
submitted: false,
loadingImgSrc: loadingImgSrc
}
},
computed: {


+ 4
- 2
src/auth/LoginPage.vue View File

@@ -32,7 +32,7 @@
<div class="form-group">
<div><small v-html="messages.message_login_agreeToTerms"></small><hr/></div>
<button class="btn btn-primary" :disabled="status.loggingIn">{{messages.button_label_login}}</button>
<img v-show="status.loggingIn" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="status.loggingIn" :src="loadingImgSrc" />
<router-link v-if="configs && configs.allowRegistration" to="/register" class="btn btn-link">{{messages.button_label_register}}</router-link>
</div>
<div class="form-group">
@@ -44,6 +44,7 @@

<script>
import { mapState, mapActions } from 'vuex';
import { loadingImgSrc } from '../_store';

export default {
data () {
@@ -53,7 +54,8 @@ export default {
totpToken: null,
unlockKey: (this.$route.query && this.$route.query.k) ? this.$route.query.k : null,
showTotp: false,
submitted: false
submitted: false,
loadingImgSrc: loadingImgSrc
}
},
created () {


+ 4
- 2
src/auth/RegisterPage.vue View File

@@ -71,7 +71,7 @@
</div>
<div class="form-group">
<button class="btn btn-primary" :disabled="status.registering">{{messages.button_label_register}}</button>
<img v-show="status.registering" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
<img v-show="status.registering" :src="loadingImgSrc" />
<router-link to="/login" class="btn btn-link">{{messages.button_label_cancel}}</router-link>
</div>
</form>
@@ -81,6 +81,7 @@
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
import { util } from '../_helpers';
import { loadingImgSrc } from '../_store';

export default {
data () {
@@ -101,7 +102,8 @@ export default {
selectedPaymentMethod: null,
paymentMethodObject: null,
confirmPassword: '',
submitted: false
submitted: false,
loadingImgSrc: loadingImgSrc
}
},
computed: {


Loading…
Cancel
Save