{"version":3,"sources":["utils/auth.js","utils/restClient.js","api.js","components/Auth/Login/index.jsx","components/Auth/Logout/index.jsx","components/Dashboard/UserDashboard/PasswordEdit/index.jsx","components/Dashboard/UserDashboard/index.jsx","components/Dashboard/AdminDashboard/UserEdit/index.jsx","components/Dashboard/AdminDashboard/NetworkEdit/index.jsx","components/Dashboard/AdminDashboard/UserPicker/index.jsx","components/Dashboard/AdminDashboard/index.jsx","components/Dashboard/index.jsx","components/Master/index.jsx","components/Auth/LoginRequired/index.jsx","App.jsx","serviceWorker.js","index.js"],"names":["storage","sessionStorage","GetAuthToken","key","getItem","SetAuthToken","token","setItem","ClearAuthToken","removeItem","IsAuthenticated","SetItem","value","constructor","String","JSON","stringify","Error","API","baseURL","endpoints","authToken","this","Object","endpointName","keysShouldExist","data","performAuth","onSuccess","onFailure","endpoint","callConf","method","url","format","path","headers","Authorization","axios","res","window","location","protocol","host","authenticate","authStatus","genConfig","userList","userCreate","userDelete","userUpdate","networkList","vpnStatus","vpnRestart","netDefine","netUndefine","netAssociate","netDissociate","Login","props","state","username","password","isAuthenticated","isAdmin","error","api","parse","GetItem","setState","call","handleGetUserInfoSuccess","bind","handleGetUserInfoFailure","e","target","user","setAuthToken","is_admin","console","log","response","status","handleAuthenticateSuccess","handleAuthenticateFailure","preventDefault","to","className","style","color","maxWidth","marginTop","marginLeft","onSubmit","handleFormSubmit","label","onChange","handleUsernameChange","floatingLabel","required","handlePasswordChange","type","React","Component","Logout","UserEdit","onSave","onCancel","title","onClick","handleFormCancel","saveData","a","document","createElement","body","appendChild","fileName","blob","Blob","URL","createObjectURL","href","download","click","revokeObjectURL","modalStyle","content","top","left","right","bottom","marginRight","transform","UserDashboard","isChangePasswordModalOpen","handleDownloadProfileSuccess","handleDownloadProfileFailure","client_config","handleAuthFailure","userObj","handleChangePasswordSuccess","handleChangePasswordFailure","handleCloseChangePasswordModal","passwordResetModal","isOpen","contentLabel","handleChangePasswordSave","variant","handleOpenChangePasswordModal","handleDownloadProfileClick","staticIP","ipAllocationMethod","pushGW","undefined","checked","staticIPInput","handleStaticIPChange","disabled","isUsernameDisabled","name","handleIPAllocationChange","handlePushGWChange","handleIsAdminChange","NetworkEdit","cidr","via","network","handleViaChange","handleNameChange","isNameDisabled","handleCidrChange","handleTypeChange","UserPicker","userNames","length","users","i","push","handleUserChange","width","height","padding","dot2num","dot","d","split","num2dot","num","Math","floor","AdminDashboard","logout","networks","vpn","modal","self","editedUser","genConfigUsername","assocNetworkName","dissocNetworkName","possibleAssocUsers","possibleDissocUsers","refresh","getAuthStatus","getUserList","getNetworkList","getVPNStatus","handleGetAuthStatusSuccess","handleGetAuthStatusFailure","handleGetUsersSuccess","handleGetUsersFailure","handleGetNetworksSuccess","handleGetNetworksFailure","handleGetVPNStatusSuccess","handleGetVPNStatusFailure","tab","ev","no_gw","host_id","admin_pref","static_pref","handleCreateUserSuccess","handleCreateUserFailure","updatedUser","gwpref","hostid","handleUpdateUserSuccess","handleUpdateUserFailure","handleRemoveUserSuccess","handleRemoveUserFailure","handleDefineNetworkSuccess","handleDefineNetworkFailure","handleUndefineNetworkSuccess","handleUndefineNetworkFailure","networkName","assocUsers","found","j","associated_usernames","dissocUsers","handleAssociateUserSuccess","handleAssociateUserFailure","handleDissociateUserSuccess","handleDissociateUserFailure","isStatic","data-toggle","noGW","isOnline","is_connected","onlineSince","moment","connected_since","fromNow","certExpiry","expires_at","isAfter","now","expiresIn","createdAt","created_at","ip_net","handleUpdateUser","handleRemoveUser","join","handleAssociateUser","handleDissociateUser","handleUndefineNetwork","handleLogout","handleCloseModal","handleNewUserSave","handleUpdateUserSave","handleDefineNetworkSave","handleAssociateUserSave","handleDissociateUserSave","handleTabChange","defaultSelectedIndex","handleCreateNewUser","handleDefineNewNetwork","handleRestartVPNServer","hostname","proto","port","net","mask","dns","ca_expires_at","Dashboard","handleGetUserSuccess","handleGetUserFailure","dashboard","Home","Master","component","WrappedComponent","nextProps","isLoggedIn","App","Boolean","match","ReactDOM","render","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.21336fd5.chunk.js","sourcesContent":["const storage = sessionStorage;\nconst prefix = \"ovpm_auth_\";\nexport function GetAuthToken() {\n let key = storage.getItem(\"authKey\");\n if (!key) {\n return \"\";\n }\n return key;\n}\n\nexport function SetAuthToken(token) {\n return storage.setItem(\"authKey\", token);\n}\n\nexport function ClearAuthToken() {\n storage.removeItem(\"authKey\");\n}\n\nexport function IsAuthenticated() {\n if (GetAuthToken() !== \"\") {\n return true;\n }\n return false;\n}\n\nexport function SetItem(key, value) {\n if (key.constructor === String) {\n return storage.setItem(JSON.stringify(prefix + key), JSON.stringify(value));\n }\n throw new Error(\"key should be a string: \" + key);\n}\n\nexport function GetItem(key) {\n if (key.constructor === String) {\n return JSON.parse(storage.getItem(JSON.stringify(prefix + key)));\n }\n throw new Error(\"key should be a string: \" + key);\n}\n","import axios from \"axios\";\nimport format from \"string-template\";\n\n// API is an object that acts like a client for remote REST APIs.\nexport class API {\n // @param {String} baseURL - base url for the api, that prefixes the endpoints (e.g. https://api.example.com/v1)\n // @param {Object{}} endpoints - endpoint objects. (e.g {\"login\": {\"path\": \"/items/{item_id}\", method: \"POST\"} ... etc})\n // @param {String} authToken - this token will be used (if provided) with authenticated resources\n constructor(baseURL, endpoints, authToken) {\n this.baseURL = baseURL;\n this.endpoints = endpoints;\n this.authToken = authToken;\n\n // validate endpoints\n if (this.endpoints.constructor !== Object) {\n throw new Error(\"endpoints must be an object: \" + this.baseURL);\n } else {\n for (let endpointName in this.endpoints) {\n if (endpoints[endpointName].constructor !== Object) {\n throw new Error(\n \"items of 'endpoints' should be endpoint object: \" +\n endpoints[endpointName]\n );\n }\n\n let keysShouldExist = [\"path\", \"method\"];\n for (let key in keysShouldExist) {\n if (!(keysShouldExist[key] in endpoints[endpointName])) {\n throw new Error(\n \"endpoint object should have a key called: \" +\n keysShouldExist[key]\n );\n }\n if (\n !(\n endpoints[endpointName][keysShouldExist[key]].constructor ===\n String\n )\n ) {\n throw new Error(\n \"endpoint object should have a key called: \" +\n keysShouldExist[key]\n );\n }\n }\n }\n }\n\n // validate authToken\n if (this.authToken && this.authToken.constructor !== String) {\n throw new Error(\"authToken should be a string: \" + this.authToken);\n }\n }\n\n // setAuthToken receives and stores an Authorization Token\n setAuthToken(authToken) {\n if (authToken.constructor !== String) {\n throw new Error(\"authToken should be a string: \" + authToken);\n }\n this.authToken = authToken;\n }\n\n // call receives the endpoint name, data and handlers then performs the api call.\n //\n // @param {String} endpointName - name of the endpoint which corresponds\n // to the key of the endpoints object that is provided when constructing API object\n // @param {object} data - data to pass\n // @param {bool} performAuth - if set to true, send Authorization header with the authToken\n // @param {func} onSuccess - success handler to call\n // @param {func} onFailure - failure handler to call\n async call(endpointName, data, performAuth, onSuccess, onFailure) {\n // validate endpointName\n if (!(endpointName in this.endpoints)) {\n throw new Error(endpointName + \" is not available in \" + this.endpoints);\n }\n\n let endpoint = this.endpoints[endpointName];\n\n let callConf = {\n method: endpoint.method,\n url: this.baseURL + format(endpoint.path, { ...data }),\n data: data\n };\n\n // if auth is true set auth headers\n if (performAuth) {\n callConf.headers = { Authorization: \"Bearer \" + this.authToken };\n }\n\n // actually perform the call\n // axios(callConf)\n // .then(onSuccess)\n // .catch(onFailure);\n\n try {\n const res = await axios(callConf);\n onSuccess(res);\n } catch (err) {\n onFailure(err);\n }\n }\n}\n","export var baseURL =\n window.location.protocol + \"//\" + window.location.host + \"/api/v1\";\n\nif (process.env.NODE_ENV !== \"production\") {\n // baseURL = \"http://172.16.16.53:8080/api/v1\" // local pc external ip\n baseURL = \"http://127.0.0.1:8080/api/v1\";\n}\n\nexport const endpoints = {\n authenticate: {\n path: \"/auth/authenticate\",\n\n method: \"POST\"\n },\n authStatus: {\n path: \"/auth/status\",\n method: \"GET\"\n },\n genConfig: {\n path: \"/user/genconfig\",\n method: \"POST\"\n },\n userList: {\n path: \"/user/list\",\n method: \"GET\"\n },\n userCreate: {\n path: \"/user/create\",\n method: \"POST\"\n },\n userDelete: {\n path: \"/user/delete\",\n method: \"POST\"\n },\n userUpdate: {\n path: \"/user/update\",\n method: \"POST\"\n },\n networkList: {\n path: \"/network/list\",\n method: \"GET\"\n },\n vpnStatus: {\n path: \"/vpn/status\",\n method: \"GET\"\n },\n vpnRestart: {\n path: \"/vpn/restart\",\n method: \"POST\"\n },\n netDefine: {\n path: \"/network/create\",\n method: \"POST\"\n },\n netUndefine: {\n path: \"/network/delete\",\n method: \"POST\"\n },\n netAssociate: {\n path: \"/network/associate\",\n method: \"POST\"\n },\n netDissociate: {\n path: \"/network/dissociate\",\n method: \"POST\"\n }\n};\n","import React from \"react\";\nimport Button from \"muicss/lib/react/button\";\nimport Input from \"muicss/lib/react/input\";\nimport Panel from \"muicss/lib/react/panel\";\nimport Container from \"muicss/lib/react/container\";\n\nimport { Redirect } from \"react-router\";\n\nimport {\n IsAuthenticated,\n SetAuthToken,\n ClearAuthToken,\n SetItem,\n GetItem\n} from \"../../../utils/auth.js\";\nimport { API } from \"../../../utils/restClient.js\";\nimport { baseURL, endpoints } from \"../../../api.js\";\n\nexport default class Login extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n username: \"\",\n password: \"\",\n isAuthenticated: false,\n isAdmin: false,\n error: null\n };\n this.api = new API(baseURL, endpoints);\n }\n\n componentWillMount() {\n let isAdmin = false;\n if (GetItem(\"isAdmin\")) {\n isAdmin = true;\n }\n this.setState({\n isAuthenticated: IsAuthenticated(),\n isAdmin: isAdmin\n });\n this.api.call(\n \"authStatus\",\n {},\n false,\n this.handleGetUserInfoSuccess.bind(this),\n this.handleGetUserInfoFailure.bind(this)\n );\n }\n\n handleUsernameChange(e) {\n this.setState({ username: e.target.value });\n }\n\n handlePasswordChange(e) {\n this.setState({ password: e.target.value });\n }\n\n handleGetUserInfoSuccess(res) {\n if (res.data.user.username === \"root\") {\n SetAuthToken(\"root\");\n this.setState({ isAuthenticated: true });\n this.api.setAuthToken(\"root\");\n SetItem(\"isAdmin\", true);\n SetItem(\"username\", \"root\");\n } else {\n SetItem(\"isAdmin\", res.data.user.is_admin);\n SetItem(\"username\", this.state.username);\n }\n }\n\n handleGetUserInfoFailure(error) {\n console.log(error);\n }\n\n handleAuthenticateSuccess(res) {\n SetAuthToken(res.data.token);\n this.setState({ isAuthenticated: true });\n console.log(\"authenticated\");\n this.api.setAuthToken(res.data.token);\n this.api.call(\n \"authStatus\",\n {},\n true,\n this.handleGetUserInfoSuccess.bind(this),\n this.handleGetUserInfoFailure.bind(this)\n );\n }\n\n handleAuthenticateFailure(error) {\n ClearAuthToken();\n this.setState({ isAuthenticated: false });\n console.log(\"authentication error\", error);\n if (error.response.status >= 400) {\n this.setState({ error: \"Your credentials are incorrect.\" });\n }\n }\n\n handleFormSubmit(e) {\n this.setState({ error: null });\n if (!this.state.username) {\n return;\n }\n if (!this.state.password) {\n return;\n }\n\n let data = {\n username: this.state.username,\n password: this.state.password\n };\n\n this.api.call(\n \"authenticate\",\n data,\n false,\n this.handleAuthenticateSuccess.bind(this),\n this.handleAuthenticateFailure.bind(this)\n );\n e.preventDefault();\n }\n render() {\n let error;\n if (this.state.isAuthenticated) {\n return ;\n }\n\n if (this.state.error) {\n error = (\n \n Authentication Error\n

{this.state.error}

\n \n );\n }\n return (\n \n \n {error}\n \n
\n \n \n \n \n
\n
\n \n );\n }\n}\n","import React from \"react\";\nimport { Redirect } from \"react-router\";\nimport { ClearAuthToken } from \"../../../utils/auth.js\";\nexport default class Logout extends React.Component {\n componentWillMount() {\n ClearAuthToken(); // Logout\n }\n\n render() {\n return ;\n }\n}\n","import React from 'react';\n\nimport Button from 'muicss/lib/react/button';\nimport Container from 'muicss/lib/react/container';\nimport Input from 'muicss/lib/react/input';\n\n\nexport default class UserEdit extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n password: \"\",\n }\n\n }\n\n componentWillMount() {\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value})\n }\n\n handleFormSubmit() {\n this.props.onSave(this.state.password)\n }\n\n handleFormCancel() {\n this.setState({error: null})\n this.props.onCancel()\n }\n\n render() {\n return (\n \n

{this.props.title}

\n\n \n
\n \n \n
\n
\n )\n }\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport Panel from \"muicss/lib/react/panel\";\nimport Button from \"muicss/lib/react/button\";\nimport Container from \"muicss/lib/react/container\";\n\nimport { GetAuthToken, ClearAuthToken } from \"../../../utils/auth.js\";\nimport { API } from \"../../../utils/restClient.js\";\nimport { baseURL, endpoints } from \"../../../api.js\";\n\nimport Modal from \"react-modal\";\nimport PasswordEdit from \"./PasswordEdit\";\n\nlet saveData = (function() {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n a.style = \"display: none\";\n return function(data, fileName) {\n var json = data,\n blob = new Blob([json], { type: \"octet/stream\" }),\n url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = fileName;\n a.click();\n window.URL.revokeObjectURL(url);\n };\n})();\n\nconst modalStyle = {\n content: {\n top: \"50%\",\n left: \"50%\",\n right: \"auto\",\n bottom: \"auto\",\n marginRight: \"-50%\",\n transform: \"translate(-50%, -50%)\"\n }\n};\n\nexport default class UserDashboard extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n isChangePasswordModalOpen: false\n };\n let authToken = GetAuthToken();\n this.api = new API(baseURL, endpoints, authToken);\n }\n\n componentWillMount() {}\n\n handleDownloadProfileClick(e) {\n this.props.api.call(\n \"genConfig\",\n { username: this.props.username },\n true,\n this.handleDownloadProfileSuccess.bind(this),\n this.handleDownloadProfileFailure.bind(this)\n );\n }\n\n handleDownloadProfileSuccess(res) {\n let blob = res.data.client_config;\n saveData(blob, this.props.username + \".ovpn\");\n }\n\n handleDownloadProfileFailure(error) {\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleAuthFailure(error) {\n console.log(\"auth failure\", error);\n ClearAuthToken();\n }\n\n handleCloseModal() {\n this.setState({ isChangePasswordModalOpen: false });\n }\n handleOpenChangePasswordModal() {\n this.setState({ isChangePasswordModalOpen: true });\n }\n\n handleChangePasswordSave(password) {\n let userObj = {\n username: this.props.username,\n password: password\n };\n this.api.call(\n \"userUpdate\",\n userObj,\n true,\n this.handleChangePasswordSuccess.bind(this),\n this.handleChangePasswordFailure.bind(this)\n );\n this.handleCloseChangePasswordModal();\n }\n\n handleChangePasswordSuccess(res) {\n console.log(\"password changed\");\n }\n\n handleChangePasswordFailure(error) {\n console.log(error);\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n // handleAuthFailure(error) {\n // console.log(\"auth failure\", error)\n // ClearAuthToken()\n // }\n\n handleCloseChangePasswordModal() {\n this.setState({ isChangePasswordModalOpen: false });\n }\n\n render() {\n let passwordResetModal = (\n \n \n \n );\n\n return (\n \n {passwordResetModal}\n \n

\n Welcome, {this.props.username} (\n logout)!\n

\n
\n \n Change Password\n \n \n Download VPN Profile\n \n
\n
\n
\n );\n }\n}\n","import React from \"react\";\n\nimport Button from \"muicss/lib/react/button\";\nimport Container from \"muicss/lib/react/container\";\nimport Input from \"muicss/lib/react/input\";\nimport Option from \"muicss/lib/react/option\";\nimport Select from \"muicss/lib/react/select\";\nimport Checkbox from \"muicss/lib/react/checkbox\";\n\nexport default class UserEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n username: this.props.username ? this.props.username : \"\",\n password: \"\",\n staticIP: this.props.staticIP ? this.props.staticIP : \"\",\n ipAllocationMethod: this.props.ipAllocationMethod\n ? this.props.ipAllocationMethod\n : \"dynamic\",\n pushGW: this.props.pushGW !== undefined ? this.props.pushGW : true,\n isAdmin: this.props.isAdmin ? this.props.isAdmin : false\n };\n }\n\n componentWillMount() {}\n\n handleUsernameChange(e) {\n this.setState({ username: e.target.value });\n }\n\n handlePasswordChange(e) {\n this.setState({ password: e.target.value });\n }\n\n handleStaticIPChange(e) {\n this.setState({ staticIP: e.target.value });\n }\n\n handleIPAllocationChange(e) {\n this.setState({ ipAllocationMethod: e.target.value });\n }\n\n handlePushGWChange(e) {\n this.setState({ pushGW: e.target.checked });\n }\n\n handleIsAdminChange(e) {\n this.setState({ isAdmin: e.target.checked });\n }\n\n handleFormSubmit() {\n this.props.onSave(this.state);\n }\n\n handleFormCancel() {\n this.setState({ error: null });\n this.props.onCancel();\n }\n\n render() {\n var staticIPInput;\n if (this.state.ipAllocationMethod === \"static\") {\n staticIPInput = (\n \n );\n }\n return (\n \n

{this.props.title}

\n\n \n \n \n
\n );\n }\n}\n","import React from \"react\";\n\nimport Button from \"muicss/lib/react/button\";\nimport Container from \"muicss/lib/react/container\";\nimport Input from \"muicss/lib/react/input\";\nimport Option from \"muicss/lib/react/option\";\nimport Select from \"muicss/lib/react/select\";\n\nexport default class NetworkEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n name: this.props.name ? this.props.name : \"\",\n type: this.props.type ? this.props.type : \"SERVERNET\",\n cidr: this.props.cidr ? this.props.cidr : \"\",\n via: this.props.via ? this.props.via : \"\"\n };\n }\n\n componentWillMount() {}\n\n handleNameChange(e) {\n this.setState({ name: e.target.value });\n }\n\n handleTypeChange(e) {\n this.setState({ type: e.target.value });\n }\n\n handleCidrChange(e) {\n this.setState({ cidr: e.target.value });\n }\n\n handleViaChange(e) {\n this.setState({ via: e.target.value });\n }\n\n handleFormSubmit() {\n console.log(this.state.type);\n let network = {\n name: this.state.name,\n cidr: this.state.cidr,\n type: this.state.type,\n via: this.state.via\n };\n\n this.props.onSave(network);\n }\n\n handleFormCancel() {\n this.setState({ error: null });\n this.props.onCancel();\n }\n\n render() {\n var via;\n if (this.state.type === \"ROUTE\") {\n via = (\n \n );\n }\n\n return (\n \n

{this.props.title}

\n\n \n \n \n
\n );\n }\n}\n","import React from \"react\";\n\nimport Button from \"muicss/lib/react/button\";\nimport Container from \"muicss/lib/react/container\";\nimport Option from \"muicss/lib/react/option\";\nimport Select from \"muicss/lib/react/select\";\n\nexport default class UserPicker extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n username: this.props.userNames.length > 0 ? this.props.userNames[0] : \"\"\n };\n }\n\n componentWillMount() {}\n\n handleUserChange(e) {\n this.setState({ username: e.target.value });\n }\n\n handleFormSubmit() {\n this.props.onSave(this.state.username);\n console.log(this.state.username);\n }\n\n handleFormCancel() {\n this.setState({ error: null });\n this.props.onCancel();\n }\n\n render() {\n let users = [];\n for (let i in this.props.userNames) {\n users.push(\n \n );\n }\n return (\n \n

{this.props.title}

\n\n \n {users}\n \n
\n \n Save\n \n \n Cancel\n \n
\n
\n );\n }\n}\n","import React from \"react\";\n\nimport { GetAuthToken, ClearAuthToken } from \"../../../utils/auth.js\";\nimport { API } from \"../../../utils/restClient.js\";\nimport { baseURL, endpoints } from \"../../../api.js\";\nimport { Redirect } from \"react-router\";\nimport Panel from \"muicss/lib/react/panel\";\nimport Button from \"muicss/lib/react/button\";\nimport Container from \"muicss/lib/react/container\";\nimport Tabs from \"muicss/lib/react/tabs\";\nimport Tab from \"muicss/lib/react/tab\";\nimport Modal from \"react-modal\";\nimport UserEdit from \"./UserEdit\";\nimport NetworkEdit from \"./NetworkEdit\";\nimport UserPicker from \"./UserPicker\";\n\nimport moment from \"moment\";\n\nconst modalStyle = {\n content: {\n width: \"50%\",\n height: \"600px\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n padding: 0\n }\n};\nconst CREATINGNEWUSER = \"CREATINGNEWUSER\";\nconst EDITINGUSER = \"EDITINGUSER\";\nconst DEFININGNEWNETWORK = \"DEFININGNEWNETWORK\";\n// const EDITINGNETWORK = \"EDITINGNETWORK\";\nconst ASSOCIATINGUSER = \"ASSOCIATINGUSER\";\nconst DISSOCIATINGUSER = \"DISSOCIATINGUSER\";\n\nlet saveData = (function() {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n a.style = \"display: none\";\n return function(data, fileName) {\n var json = data,\n blob = new Blob([json], { type: \"octet/stream\" }),\n url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = fileName;\n a.click();\n window.URL.revokeObjectURL(url);\n };\n})();\n\nfunction dot2num(dot) {\n var d = dot.split(\".\");\n return ((+d[0] * 256 + +d[1]) * 256 + +d[2]) * 256 + +d[3];\n}\n\nfunction num2dot(num) {\n var d = num % 256;\n for (let i = 3; i > 0; i--) {\n num = Math.floor(num / 256);\n d = (num % 256) + \".\" + d;\n }\n return d;\n}\n\nexport default class AdminDashboard extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n logout: false,\n users: [],\n networks: [],\n vpn: {},\n modal: \"\",\n self: {},\n editedUser: {},\n genConfigUsername: \"\",\n assocNetworkName: \"\",\n dissocNetworkName: \"\",\n possibleAssocUsers: [],\n possibleDissocUsers: []\n };\n let authToken = GetAuthToken();\n this.api = new API(baseURL, endpoints, authToken);\n }\n\n componentWillMount() {\n this.refresh();\n }\n\n refresh() {\n this.getAuthStatus();\n this.getUserList();\n this.getNetworkList();\n this.getVPNStatus();\n }\n\n getAuthStatus() {\n this.api.call(\n \"authStatus\",\n {},\n true,\n this.handleGetAuthStatusSuccess.bind(this),\n this.handleGetAuthStatusFailure.bind(this)\n );\n }\n\n getUserList() {\n this.api.call(\n \"userList\",\n {},\n true,\n this.handleGetUsersSuccess.bind(this),\n this.handleGetUsersFailure.bind(this)\n );\n }\n\n getNetworkList() {\n this.api.call(\n \"networkList\",\n {},\n true,\n this.handleGetNetworksSuccess.bind(this),\n this.handleGetNetworksFailure.bind(this)\n );\n }\n\n getVPNStatus() {\n this.api.call(\n \"vpnStatus\",\n {},\n true,\n this.handleGetVPNStatusSuccess.bind(this),\n this.handleGetVPNStatusFailure.bind(this)\n );\n }\n\n handleTabChange(i, value, tab, ev) {\n this.refresh();\n }\n\n handleGetUsersSuccess(res) {\n this.setState({ users: res.data.users });\n }\n\n handleGetUsersFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n this.setState({ users: [] });\n }\n\n handleGetNetworksSuccess(res) {\n this.setState({ networks: res.data.networks });\n }\n\n handleGetNetworksFailure(error) {\n console.log(error);\n this.setState({ networks: [] });\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleGetVPNStatusSuccess(res) {\n this.setState({ vpn: res.data });\n }\n\n handleGetVPNStatusFailure(error) {\n console.log(error);\n this.setState({ vpn: {} });\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleGetAuthStatusSuccess(res) {\n this.setState({ self: res.data.user });\n }\n\n handleGetAuthStatusFailure(error) {\n console.log(error);\n this.setState({ self: {} });\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleAuthFailure(error) {\n console.log(\"auth failure\", error);\n ClearAuthToken();\n this.setState({ logout: true });\n }\n\n handleCreateNewUser(e) {\n console.log(\"create new user\");\n this.setState({ modal: CREATINGNEWUSER });\n }\n\n handleDefineNewNetwork(e) {\n this.setState({ modal: DEFININGNEWNETWORK });\n }\n\n handleUpdateUser(username, e) {\n for (let i in this.state.users) {\n if (this.state.users[i].username === username) {\n this.setState({ modal: EDITINGUSER, editedUser: this.state.users[i] });\n console.log(i);\n console.log(\"updating user:\", this.state.users[i].username);\n return;\n }\n }\n }\n\n handleCloseModal() {\n this.setState({ modal: \"\" });\n }\n\n handleNewUserSave(user) {\n let userObj = {\n username: user.username,\n password: user.password,\n no_gw: user.pushGW,\n host_id: 0, // handle this host_id problem\n is_admin: user.isAdmin\n };\n userObj.no_gw = !user.pushGW;\n userObj.admin_pref = user.isAdmin ? \"ADMIN\" : \"NOADMIN\";\n userObj.host_id =\n user.ipAllocationMethod === \"static\" ? dot2num(user.staticIP) : 0;\n userObj.static_pref =\n user.ipAllocationMethod === \"static\" ? \"STATIC\" : \"NOSTATIC\";\n\n console.log(\"creating new user:\", user.username);\n this.api.call(\n \"userCreate\",\n userObj,\n true,\n this.handleCreateUserSuccess.bind(this),\n this.handleCreateUserFailure.bind(this)\n );\n this.setState({ modal: \"\" });\n }\n\n handleCreateUserSuccess(res) {\n this.refresh();\n }\n\n handleCreateUserFailure(error) {\n console.log(error);\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleUpdateUserSave(user) {\n let updatedUser = {\n password: \"\",\n username: user.username,\n gwpref: \"NOPREF\",\n admin_pref: \"NOPREFADMIN\",\n static_pref: \"NOPREFSTATIC\",\n hostid: 0\n };\n\n if (user.password !== \"\") {\n updatedUser.password = user.password;\n }\n\n updatedUser.gwpref = user.pushGW ? \"GW\" : \"NOGW\";\n updatedUser.admin_pref = user.isAdmin ? \"ADMIN\" : \"NOADMIN\";\n updatedUser.host_id =\n user.ipAllocationMethod === \"static\" ? dot2num(user.staticIP) : 0;\n updatedUser.static_pref =\n user.ipAllocationMethod === \"static\" ? \"STATIC\" : \"NOSTATIC\";\n console.log(\"updating user:\", updatedUser.username);\n this.api.call(\n \"userUpdate\",\n updatedUser,\n true,\n this.handleUpdateUserSuccess.bind(this),\n this.handleUpdateUserFailure.bind(this)\n );\n\n this.setState({ modal: \"\" });\n }\n\n handleUpdateUserSuccess(res) {\n this.refresh();\n }\n\n handleUpdateUserFailure(error) {\n console.log(error);\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleRemoveUser(username) {\n if (username === this.state.self.username) {\n // Don't remove yourself.\n return;\n }\n this.api.call(\n \"userDelete\",\n { username: username },\n true,\n this.handleRemoveUserSuccess.bind(this),\n this.handleRemoveUserFailure.bind(this)\n );\n }\n\n handleRemoveUserSuccess(res) {\n this.refresh();\n }\n\n handleRemoveUserFailure(error) {\n console.log(error);\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n }\n\n handleDownloadProfileClick(username, e) {\n this.setState({ genConfigUsername: username });\n this.api.call(\n \"genConfig\",\n { username: username },\n true,\n this.handleDownloadProfileSuccess.bind(this),\n this.handleDownloadProfileFailure.bind(this)\n );\n }\n\n handleDownloadProfileSuccess(res) {\n let blob = res.data.client_config;\n saveData(blob, this.state.genConfigUsername + \".ovpn\");\n }\n\n handleDownloadProfileFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleDefineNetworkSave(network) {\n this.api.call(\n \"netDefine\",\n network,\n true,\n this.handleDefineNetworkSuccess.bind(this),\n this.handleDefineNetworkFailure.bind(this)\n );\n this.setState({ modal: \"\" });\n }\n\n handleDefineNetworkSuccess(res) {\n this.refresh();\n }\n\n handleDefineNetworkFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleUndefineNetwork(name) {\n this.api.call(\n \"netUndefine\",\n { name: name },\n true,\n this.handleUndefineNetworkSuccess.bind(this),\n this.handleUndefineNetworkFailure.bind(this)\n );\n }\n\n handleUndefineNetworkSuccess(res) {\n this.refresh();\n }\n\n handleUndefineNetworkFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleAssociateUser(networkName) {\n let assocUsers = [];\n let network;\n for (let i in this.state.networks) {\n if (this.state.networks[i].name === networkName) {\n network = this.state.networks[i];\n break;\n }\n }\n for (let i in this.state.users) {\n let found = false;\n for (let j in network.associated_usernames) {\n if (this.state.users[i].username === network.associated_usernames[j]) {\n found = true;\n }\n }\n if (!found) {\n assocUsers.push(this.state.users[i].username);\n }\n }\n this.setState({\n modal: ASSOCIATINGUSER,\n assocNetworkName: networkName,\n possibleAssocUsers: assocUsers\n });\n }\n\n handleDissociateUser(networkName) {\n let dissocUsers = [];\n let network;\n for (let i in this.state.networks) {\n if (this.state.networks[i].name === networkName) {\n network = this.state.networks[i];\n break;\n }\n }\n for (let i in this.state.users) {\n let found = false;\n for (let j in network.associated_usernames) {\n if (this.state.users[i].username === network.associated_usernames[j]) {\n found = true;\n }\n }\n if (found) {\n dissocUsers.push(this.state.users[i].username);\n }\n }\n this.setState({\n modal: DISSOCIATINGUSER,\n dissocNetworkName: networkName,\n possibleDissocUsers: dissocUsers\n });\n }\n\n handleAssociateUserSave(username) {\n //call\n //refresh\n this.api.call(\n \"netAssociate\",\n { name: this.state.assocNetworkName, username: username },\n true,\n this.handleAssociateUserSuccess.bind(this),\n this.handleAssociateUserFailure.bind(this)\n );\n this.setState({ modal: \"\" });\n }\n\n handleDissociateUserSave(username) {\n this.api.call(\n \"netDissociate\",\n { name: this.state.dissocNetworkName, username: username },\n true,\n this.handleDissociateUserSuccess.bind(this),\n this.handleDissociateUserFailure.bind(this)\n );\n this.setState({ modal: \"\" });\n }\n\n handleAssociateUserSuccess(res) {\n this.refresh();\n }\n\n handleAssociateUserFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleDissociateUserSuccess(res) {\n this.refresh();\n }\n\n handleDissociateUserFailure(error) {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }\n\n handleRestartVPNServer() {\n this.api.call(\n \"vpnRestart\",\n {},\n true,\n function() {\n this.refresh();\n }.bind(this),\n function() {\n if (\"response\" in error && error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n console.log(error);\n }.bind(this)\n );\n }\n\n handleLogout() {\n ClearAuthToken();\n this.setState({ logout: true });\n }\n\n render() {\n if (this.state.logout) {\n return ;\n }\n\n let users = [];\n for (let i = 0; i < this.state.users.length; i++) {\n let isStatic = \"\";\n if (this.state.users[i].host_id !== 0) {\n isStatic = (\n \n \n \n );\n }\n\n let isAdmin;\n if (this.state.users[i].is_admin) {\n isAdmin = (\n \n \n \n );\n }\n\n let noGW = (\n \n );\n if (!this.state.users[i].no_gw) {\n noGW = (\n \n );\n }\n\n let isOnline = (\n \n ◦\n \n );\n if (this.state.users[i].is_connected) {\n let onlineSince =\n \"Online, since \" +\n moment(this.state.users[i].connected_since).fromNow() +\n \".\";\n console.log(onlineSince);\n isOnline = (\n \n •\n \n );\n }\n\n let certExpiry = (\n \n );\n if (moment(this.state.users[i].expires_at).isAfter(moment.now())) {\n let expiresIn =\n \"expires \" + moment(this.state.users[i].expires_at).fromNow();\n certExpiry = (\n \n {expiresIn}\n \n );\n }\n\n let createdAt = (\n \n {moment(this.state.users[i].created_at).fromNow()}\n \n );\n\n users.push(\n \n {i + 1}\n \n {isOnline} {this.state.users[i].username} {isAdmin}\n \n \n {this.state.users[i].ip_net} {isStatic}\n \n {createdAt}\n {certExpiry}\n {noGW}\n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n\n let networks = [];\n for (let i = 0; i < this.state.networks.length; i++) {\n let via;\n if (this.state.networks[i].type === \"ROUTE\") {\n via = \"via vpn-server\";\n\n if (this.state.networks[i].via && this.state.networks[i].via !== \"\") {\n via = \"via \" + this.state.networks[i].via;\n }\n }\n networks.push(\n \n {i + 1}\n {this.state.networks[i].name}\n \n {this.state.networks[i].cidr} {via}\n \n {this.state.networks[i].type}\n {this.state.networks[i].created_at}\n {this.state.networks[i].associated_usernames.join(\", \")}\n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n\n return (\n \n \n \n Logout\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
\n \n \n \n + Create User\n \n \n \n \n \n \n \n \n \n \n \n \n \n {users}\n
USERNAMEIPCREATED ATCERTPUSH GATEWAYACTIONS
\n
\n \n \n + Define Net\n \n \n \n \n \n \n \n \n \n \n \n \n \n {networks}\n
#NAMECIDRTYPECREATED ATASSOC USERSACTIONS
\n
\n \n \n Restart VPN Server\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\" \"}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
KEYVALUE
Hostname {this.state.vpn.hostname}
Proto {this.state.vpn.proto}
Port {this.state.vpn.port}
Network\n {this.state.vpn.net} ({this.state.vpn.mask})\n
DNS {this.state.vpn.dns}
Created At{this.state.vpn.created_at}
Expires At{this.state.vpn.expires_at}
CA Expires At{this.state.vpn.ca_expires_at}
\n
\n \n
\n
\n
\n
\n );\n }\n}\n","import React from \"react\";\n\nimport { GetAuthToken, ClearAuthToken } from \"../../utils/auth.js\";\nimport { API } from \"../../utils/restClient.js\";\nimport { baseURL, endpoints } from \"../../api.js\";\nimport UserDashboard from \"./UserDashboard\";\nimport AdminDashboard from \"./AdminDashboard\";\n\nexport default class Dashboard extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n username: \"\",\n isAdmin: false\n };\n let authToken = GetAuthToken();\n this.api = new API(baseURL, endpoints, authToken);\n }\n\n handleGetUserSuccess(res) {\n this.setState({\n username: res.data.user.username,\n isAdmin: res.data.user.is_admin\n });\n }\n\n componentWillMount() {\n this.api.call(\n \"authStatus\",\n {},\n true,\n this.handleGetUserSuccess.bind(this),\n this.handleGetUserFailure.bind(this)\n );\n }\n\n handleGetUserFailure(error) {\n if (error.response.status === 401) {\n this.handleAuthFailure(error);\n }\n\n console.log(\"get user failure\", error);\n }\n\n handleAuthFailure(error) {\n console.log(\"auth failure\", error);\n ClearAuthToken();\n }\n\n render() {\n let dashboard;\n if (!this.state.isAdmin) {\n dashboard = (\n \n );\n } else {\n dashboard = (\n \n );\n }\n return
{dashboard}
;\n }\n}\n","import React from \"react\";\nimport \"./style.css\";\n\nimport { BrowserRouter as Router, Route, Redirect } from \"react-router-dom\";\n\nimport Login from \"../Auth/Login\";\nimport Logout from \"../Auth/Logout\";\nimport LoginRequired from \"../Auth/LoginRequired\";\n\nimport Dashboard from \"../Dashboard\";\n\nfunction Home(props) {\n return ;\n}\n\nconst Master = props => (\n \n
\n \n \n \n \n
\n
\n);\nexport default Master;\n","import React from \"react\";\n\nimport { Redirect } from \"react-router\";\n\nimport { IsAuthenticated } from \"../../../utils/auth.js\";\n\nexport default function loginRequired(WrappedComponent) {\n return class extends React.Component {\n componentWillReceiveProps(nextProps) {\n console.log(\"Current props: \", this.props);\n console.log(\"Next props: \", nextProps);\n this.setState({ isLoggedIn: false });\n }\n componentWillMount() {\n this.setState({ isLoggedIn: IsAuthenticated() });\n }\n render() {\n if (!this.state.isLoggedIn) {\n return ;\n }\n return ;\n }\n };\n}\n","import React from \"react\";\nimport Master from \"./components/Master\";\n\nfunction App() {\n return (\n
\n \n
\n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}