<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>ovpn-admin</title> </head> <body> <script src="dist/style.min.js"></script> <div id="app"> <vue-good-table :columns="columns" :rows="filteredRows" :line-numbers="true" :row-style-class="rowStyleClassFn" :search-options="{ enabled: true}" > <div slot="table-actions"> <button type="button" class="btn btn-sm btn-success el-square" v-show="serverRole == 'master'" v-on:click.stop="u.modalNewUserVisible=true">Add user</button> <b-badget class="btn btn-sm btn-info el-square" v-if="serverRole == 'slave'">Slave - last sync: {{ lastSync }}</b-badget> <button type="button" class="btn btn-sm btn-secondary el-square" v-on:click.stop="filters.hideRevoked=!filters.hideRevoked;this.$cookies.set('hideRevoked',!(this.$cookies.get('hideRevoked') == 'true'), -1);">{{ revokeFilterText }}</button> </div> <div slot="emptystate" class="d-flex justify-content-center"> <h4>No users have been created yet.</h4> <br> <button type="button" class="btn btn-sm btn-success el-square" v-if="serverRole == 'master'" v-on:click.stop="u.modalNewUserVisible=true">Add user</button> </div> <template slot="table-row" slot-scope="props"> <span v-if="props.column.field == 'actions'"> <button class="btn btn-sm el-square modal-el-margin" type="button" :title="action.label" :data-username="props.row.Identity" :data-name="action.name" :data-text="action.label" @click.left.stop="rowActionFn" v-for="action in actions" v-bind:class="action.class" v-if="action.showWhenStatus == props.row.AccountStatus && action.showForServerRole.includes(serverRole) && action.showForModule.some(p=> modulesEnabled.includes(p))"> {{ action.label }} </button> </span> </template> </vue-good-table> <!-- <div class="d-flex justify-content-md-end">--> <!-- <button type="button" class="btn btn-sm btn-success el-square new-user-btn" v-on:click.stop="u.ctxVisible=false;u.modalNewUserVisible=true">Add user</button>--> <!-- </div>--> <div class="modal-wrapper" v-if="u.modalNewUserVisible" v-bind:style="modalNewUserDisplay"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h4>Add new user</h4> </div> <div class="modal-body"> <input type="text" class="form-control el-square modal-el-margin" placeholder="Username [_a-zA-Z0-9\.-]" v-model="u.newUserName"> <input type="password" class="form-control el-square modal-el-margin" minlength="6" autocomplete="off" placeholder="Password [_a-zA-Z0-9\.-]" v-model="u.newUserPassword" v-if="modulesEnabled.includes('passwdAuth')"> </div> <div class="modal-footer justify-content-center" v-if="u.newUserCreateError.length > 0"> <div class="alert alert-danger" role="alert" > {{ u.newUserCreateError }} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-success el-square modal-el-margin" v-on:click.stop="createUser()">Create</button> <button type="button" class="btn btn-primary el-square d-flex justify-content-sm-end modal-el-margin" v-on:click.stop="u.newUserName='';u.newUserPassword='nopass';u.modalNewUserVisible=false">Close</button> </div> </div> </div> </div> <div class="modal-wrapper" v-if="u.modalChangePasswordVisible" v-bind:style="modalChangePasswordDisplay"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h4>Change password for: <strong>{{ username }}</strong></h4> </div> <div class="modal-body"> <input type="password" class="form-control el-square modal-el-margin" minlength="6" autocomplete="off" placeholder="Password [_a-zA-Z0-9\.-]" v-model="u.newPassword"> </div> <div class="modal-footer justify-content-center" v-if="u.passwordChangeMessage.length > 0"> <div class="alert" v-bind:class="passwordChangeStatusCssClass" role="alert" > {{ u.passwordChangeMessage }} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-success el-square modal-el-margin" v-on:click.stop="changeUserPassword(username)">Change password</button> <button type="button" class="btn btn-primary el-square d-flex justify-content-sm-end modal-el-margin" v-on:click.stop="u.newPassword='';u.passwordChangeMessage='';u.modalChangePasswordVisible=false">Close</button> </div> </div> </div> </div> <div class="modal-wrapper" v-if="u.modalShowConfigVisible" v-bind:style="modalShowConfigDisplay"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h4>ovpn config for: <strong>{{ username }}</strong></h4> </div> <div class="modal-body"> <div class="d-flex"> <pre class="modal-show-config-txt-box">{{ u.openvpnConfig }}</pre> </div> </div> <div class="modal-footer"> <div class="d-flex"> <button type="button" class="btn btn-success el-square modal-el-margin" v-clipboard:copy="u.openvpnConfig">Copy </button> <button type="button" class="btn btn-primary el-square modal-el-margin" v-on:click.stop="u.openvpnConfig='';u.modalShowConfigVisible=false">Cancel</button> </div> </div> </div> </div> </div> <div class="modal-wrapper" v-if="u.modalShowCcdVisible" v-bind:style="modalShowCcdDisplay"> <div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-content"> <div class="modal-header"> <h3 class="static-address-label ">Routes table for: <strong>{{ username }}</strong></h3> </div> <div class="modal-body"> <div class="input-group"> <h5 class="static-address-label ">Static address:</h5> <div class="input-group-prepend"> <div class="input-group-text"> <input id="enable-static" type="checkbox" @change="staticAddrCheckboxOnChange()" v-if="serverRole == 'master'" v-bind:checked="!customAddressDisabled"> </div> </div> <input id="static-address" type="text" class="form-control" v-model="u.ccd.ClientAddress" placeholder="127.0.0.1" v-bind:disabled="customAddressDisabled"> </div> </div> <div class="modal-body"> <div class="d-flex "> <table class="table table-bordered table-hover ccd-routes" > <thead> <tr> <th scope="col">Address</th> <th scope="col">Mask</th> <th scope="col">Description</th> <th scope="col" v-if="serverRole == 'master'">Action</th> </tr> </thead> <tbody> <tr v-for="(customRoute, index) in u.ccd.CustomRoutes"> <td> <div v-if="serverRole == 'slave'"> {{ customRoute.Address }} </div> <input v-if="serverRole == 'master'" v-model="customRoute.Address"> </td> <td> <div v-if="serverRole == 'slave'"> {{ customRoute.Mask }} </div> <input v-if="serverRole == 'master'" v-model="customRoute.Mask"> </td> <td> <div v-if="serverRole == 'slave'"> {{ customRoute.Description }} </div> <input v-if="serverRole == 'master'" v-model="customRoute.Description"> </td> <td class="text-right" v-if="serverRole == 'master'"> <button type="button" class="btn btn-danger btn-sm el-square modal-el-margin" v-if="serverRole == 'master'" v-on:click.stop="u.ccd.CustomRoutes.splice(index, 1)">Delete</button> </td> </tr> <tr v-if="serverRole == 'master'"> <td><input type="text" v-model="u.newRoute.Address"/></td> <td><input type="text" v-model="u.newRoute.Mask"/></td> <td><input type="text" v-model="u.newRoute.Description"/></td> <td class="text-right" v-if="serverRole == 'master'"> <button type="button" class="btn btn-success el-square modal-el-margin" v-on:click.stop="u.ccd.CustomRoutes.push(u.newRoute);u.newRoute={};">Add</button> </td> </tr> </tbody> </table> </div> </div> <div class="modal-footer justify-content-center" v-if="u.ccdApplyStatusMessage.length > 0"> <div class="alert" v-bind:class="ccdApplyStatusCssClass" role="alert"> {{ u.ccdApplyStatusMessage }} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-success el-square modal-el-margin" v-if="serverRole == 'master'" v-on:click.stop="ccdApply()">Save</button> <button type="button" class="btn btn-primary el-square modal-el-margin" v-on:click.stop="u.ccd={Name:'',ClientAddress:'',CustomRoutes:[]};u.ccdApplyStatusMessage='';u.ccdApplyStatus='';u.modalShowCcdVisible=false">Close</button> </div> </div> </div> </div> <notifications position="bottom left" :speed="900" /> </div> <script src="dist/bundle.min.js"></script> </body> </html>