-
@@ -28,38 +28,31 @@
diff --git a/resources/assets/scripts/components/dashboard/account/TwoFactorAuthentication.vue b/resources/assets/scripts/components/dashboard/account/TwoFactorAuthentication.vue
new file mode 100644
index 000000000..387f275e8
--- /dev/null
+++ b/resources/assets/scripts/components/dashboard/account/TwoFactorAuthentication.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
diff --git a/resources/assets/scripts/components/dashboard/account/UpdateEmail.vue b/resources/assets/scripts/components/dashboard/account/UpdateEmail.vue
new file mode 100644
index 000000000..a228480a1
--- /dev/null
+++ b/resources/assets/scripts/components/dashboard/account/UpdateEmail.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
diff --git a/resources/assets/scripts/helpers/axios.js b/resources/assets/scripts/helpers/axios.js
index 9fd0cbbc2..376179118 100644
--- a/resources/assets/scripts/helpers/axios.js
+++ b/resources/assets/scripts/helpers/axios.js
@@ -1,5 +1,3 @@
-import User from './../models/user';
-
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
@@ -9,7 +7,6 @@ import User from './../models/user';
let axios = require('axios');
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
axios.defaults.headers.common['Accept'] = 'application/json';
-axios.defaults.headers.common['Authorization'] = `Bearer ${User.getToken()}`;
if (typeof phpdebugbar !== 'undefined') {
axios.interceptors.response.use(function (response) {
diff --git a/resources/assets/scripts/helpers/ziggy.js b/resources/assets/scripts/helpers/ziggy.js
index b8306532c..978af1a28 100644
--- a/resources/assets/scripts/helpers/ziggy.js
+++ b/resources/assets/scripts/helpers/ziggy.js
@@ -1,8 +1,8 @@
var Ziggy = {
- namedRoutes: JSON.parse('{"debugbar.openhandler":{"uri":"_debugbar\/open","methods":["GET","HEAD"],"domain":null},"debugbar.clockwork":{"uri":"_debugbar\/clockwork\/{id}","methods":["GET","HEAD"],"domain":null},"debugbar.assets.css":{"uri":"_debugbar\/assets\/stylesheets","methods":["GET","HEAD"],"domain":null},"debugbar.assets.js":{"uri":"_debugbar\/assets\/javascript","methods":["GET","HEAD"],"domain":null},"debugbar.cache.delete":{"uri":"_debugbar\/cache\/{key}\/{tags?}","methods":["DELETE"],"domain":null},"index":{"uri":"\/","methods":["GET","HEAD"],"domain":null},"account":{"uri":"account","methods":["GET","HEAD"],"domain":null},"account.api":{"uri":"account\/api","methods":["GET","HEAD"],"domain":null},"account.api.new":{"uri":"account\/api\/new","methods":["GET","HEAD"],"domain":null},"account.api.revoke":{"uri":"account\/api\/revoke\/{identifier}","methods":["DELETE"],"domain":null},"account.security":{"uri":"account\/security","methods":["GET","HEAD"],"domain":null},"account.security.revoke":{"uri":"account\/security\/revoke\/{id}","methods":["GET","HEAD"],"domain":null},"account.security.totp":{"uri":"account\/security\/totp","methods":["PUT"],"domain":null},"account.security.totp.set":{"uri":"account\/security\/totp","methods":["POST"],"domain":null},"account.security.totp.disable":{"uri":"account\/security\/totp","methods":["DELETE"],"domain":null},"admin.index":{"uri":"admin","methods":["GET","HEAD"],"domain":null},"admin.statistics":{"uri":"admin\/statistics","methods":["GET","HEAD"],"domain":null},"admin.api.index":{"uri":"admin\/api","methods":["GET","HEAD"],"domain":null},"admin.api.new":{"uri":"admin\/api\/new","methods":["GET","HEAD"],"domain":null},"admin.api.delete":{"uri":"admin\/api\/revoke\/{identifier}","methods":["DELETE"],"domain":null},"admin.locations":{"uri":"admin\/locations","methods":["GET","HEAD"],"domain":null},"admin.locations.view":{"uri":"admin\/locations\/view\/{location}","methods":["GET","HEAD"],"domain":null},"admin.databases":{"uri":"admin\/databases","methods":["GET","HEAD"],"domain":null},"admin.databases.view":{"uri":"admin\/databases\/view\/{host}","methods":["GET","HEAD"],"domain":null},"admin.settings":{"uri":"admin\/settings","methods":["GET","HEAD"],"domain":null},"admin.settings.mail":{"uri":"admin\/settings\/mail","methods":["GET","HEAD"],"domain":null},"admin.settings.advanced":{"uri":"admin\/settings\/advanced","methods":["GET","HEAD"],"domain":null},"admin.users":{"uri":"admin\/users","methods":["GET","HEAD"],"domain":null},"admin.users.json":{"uri":"admin\/users\/accounts.json","methods":["GET","HEAD"],"domain":null},"admin.users.new":{"uri":"admin\/users\/new","methods":["GET","HEAD"],"domain":null},"admin.users.view":{"uri":"admin\/users\/view\/{user}","methods":["GET","HEAD"],"domain":null},"admin.servers":{"uri":"admin\/servers","methods":["GET","HEAD"],"domain":null},"admin.servers.new":{"uri":"admin\/servers\/new","methods":["GET","HEAD"],"domain":null},"admin.servers.view":{"uri":"admin\/servers\/view\/{server}","methods":["GET","HEAD"],"domain":null},"admin.servers.view.details":{"uri":"admin\/servers\/view\/{server}\/details","methods":["GET","HEAD"],"domain":null},"admin.servers.view.build":{"uri":"admin\/servers\/view\/{server}\/build","methods":["GET","HEAD"],"domain":null},"admin.servers.view.startup":{"uri":"admin\/servers\/view\/{server}\/startup","methods":["GET","HEAD"],"domain":null},"admin.servers.view.database":{"uri":"admin\/servers\/view\/{server}\/database","methods":["GET","HEAD"],"domain":null},"admin.servers.view.manage":{"uri":"admin\/servers\/view\/{server}\/manage","methods":["GET","HEAD"],"domain":null},"admin.servers.view.delete":{"uri":"admin\/servers\/view\/{server}\/delete","methods":["GET","HEAD"],"domain":null},"admin.servers.view.manage.toggle":{"uri":"admin\/servers\/view\/{server}\/manage\/toggle","methods":["POST"],"domain":null},"admin.servers.view.manage.rebuild":{"uri":"admin\/servers\/view\/{server}\/manage\/rebuild","methods":["POST"],"domain":null},"admin.servers.view.manage.suspension":{"uri":"admin\/servers\/view\/{server}\/manage\/suspension","methods":["POST"],"domain":null},"admin.servers.view.manage.reinstall":{"uri":"admin\/servers\/view\/{server}\/manage\/reinstall","methods":["POST"],"domain":null},"admin.servers.view.database.delete":{"uri":"admin\/servers\/view\/{server}\/database\/{database}\/delete","methods":["DELETE"],"domain":null},"admin.nodes":{"uri":"admin\/nodes","methods":["GET","HEAD"],"domain":null},"admin.nodes.new":{"uri":"admin\/nodes\/new","methods":["GET","HEAD"],"domain":null},"admin.nodes.view":{"uri":"admin\/nodes\/view\/{node}","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.settings":{"uri":"admin\/nodes\/view\/{node}\/settings","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.configuration":{"uri":"admin\/nodes\/view\/{node}\/configuration","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.allocation":{"uri":"admin\/nodes\/view\/{node}\/allocation","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.servers":{"uri":"admin\/nodes\/view\/{node}\/servers","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.configuration.token":{"uri":"admin\/nodes\/view\/{node}\/settings\/token","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.allocation.removeBlock":{"uri":"admin\/nodes\/view\/{node}\/allocation\/remove","methods":["POST"],"domain":null},"admin.nodes.view.allocation.setAlias":{"uri":"admin\/nodes\/view\/{node}\/allocation\/alias","methods":["POST"],"domain":null},"admin.nodes.view.delete":{"uri":"admin\/nodes\/view\/{node}\/delete","methods":["DELETE"],"domain":null},"admin.nodes.view.allocation.removeSingle":{"uri":"admin\/nodes\/view\/{node}\/allocation\/remove\/{allocation}","methods":["DELETE"],"domain":null},"admin.nests":{"uri":"admin\/nests","methods":["GET","HEAD"],"domain":null},"admin.nests.new":{"uri":"admin\/nests\/new","methods":["GET","HEAD"],"domain":null},"admin.nests.view":{"uri":"admin\/nests\/view\/{nest}","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.new":{"uri":"admin\/nests\/egg\/new","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.view":{"uri":"admin\/nests\/egg\/{egg}","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.export":{"uri":"admin\/nests\/egg\/{egg}\/export","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.variables":{"uri":"admin\/nests\/egg\/{egg}\/variables","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.scripts":{"uri":"admin\/nests\/egg\/{egg}\/scripts","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.import":{"uri":"admin\/nests\/import","methods":["POST"],"domain":null},"admin.nests.egg.variables.edit":{"uri":"admin\/nests\/egg\/{egg}\/variables\/{variable}","methods":["PATCH"],"domain":null},"admin.packs":{"uri":"admin\/packs","methods":["GET","HEAD"],"domain":null},"admin.packs.new":{"uri":"admin\/packs\/new","methods":["GET","HEAD"],"domain":null},"admin.packs.new.template":{"uri":"admin\/packs\/new\/template","methods":["GET","HEAD"],"domain":null},"admin.packs.view":{"uri":"admin\/packs\/view\/{pack}","methods":["GET","HEAD"],"domain":null},"admin.packs.view.export":{"uri":"admin\/packs\/view\/{pack}\/export\/{files?}","methods":["POST"],"domain":null},"auth.login":{"uri":"auth\/login","methods":["GET","HEAD"],"domain":null},"auth.forgot-password":{"uri":"auth\/password","methods":["GET","HEAD"],"domain":null},"auth.reset":{"uri":"auth\/password\/reset\/{token}","methods":["GET","HEAD"],"domain":null},"auth.login-checkpoint":{"uri":"auth\/login\/checkpoint","methods":["POST"],"domain":null},"auth.reset-password":{"uri":"auth\/password\/reset","methods":["POST"],"domain":null},"auth.logout":{"uri":"auth\/logout","methods":["GET","HEAD"],"domain":null},"server.index":{"uri":"server\/{server}","methods":["GET","HEAD"],"domain":null},"server.console":{"uri":"server\/{server}\/console","methods":["GET","HEAD"],"domain":null},"server.settings.allocation":{"uri":"server\/{server}\/settings\/allocation","methods":["GET","HEAD"],"domain":null},"server.settings.name":{"uri":"server\/{server}\/settings\/name","methods":["GET","HEAD"],"domain":null},"server.settings.sftp":{"uri":"server\/{server}\/settings\/sftp","methods":["GET","HEAD"],"domain":null},"server.settings.startup":{"uri":"server\/{server}\/settings\/startup","methods":["GET","HEAD"],"domain":null},"server.databases.index":{"uri":"server\/{server}\/databases","methods":["GET","HEAD"],"domain":null},"server.databases.new":{"uri":"server\/{server}\/databases\/new","methods":["POST"],"domain":null},"server.databases.password":{"uri":"server\/{server}\/databases\/password","methods":["PATCH"],"domain":null},"server.databases.delete":{"uri":"server\/{server}\/databases\/delete\/{database}","methods":["DELETE"],"domain":null},"server.files.index":{"uri":"server\/{server}\/files","methods":["GET","HEAD"],"domain":null},"server.files.add":{"uri":"server\/{server}\/files\/add","methods":["GET","HEAD"],"domain":null},"server.files.edit":{"uri":"server\/{server}\/files\/download\/{file}","methods":["GET","HEAD"],"domain":null},"server.files.directory-list":{"uri":"server\/{server}\/files\/directory-list","methods":["POST"],"domain":null},"server.files.save":{"uri":"server\/{server}\/files\/save","methods":["POST"],"domain":null},"server.subusers":{"uri":"server\/{server}\/users","methods":["GET","HEAD"],"domain":null},"server.subusers.new":{"uri":"server\/{server}\/users\/new","methods":["GET","HEAD"],"domain":null},"server.subusers.view":{"uri":"server\/{server}\/users\/view\/{subuser}","methods":["GET","HEAD"],"domain":null},"server.schedules":{"uri":"server\/{server}\/schedules","methods":["GET","HEAD"],"domain":null},"server.schedules.new":{"uri":"server\/{server}\/schedules\/new","methods":["GET","HEAD"],"domain":null},"server.schedules.view":{"uri":"server\/{server}\/schedules\/view\/{schedule}","methods":["GET","HEAD"],"domain":null},"server.schedules.toggle":{"uri":"server\/{server}\/schedules\/view\/{schedule}\/toggle","methods":["POST"],"domain":null},"server.schedules.trigger":{"uri":"server\/{server}\/schedules\/view\/{schedule}\/trigger","methods":["POST"],"domain":null},"api.application.users":{"uri":"api\/application\/users","methods":["GET","HEAD"],"domain":null},"api.application.users.view":{"uri":"api\/application\/users\/{user}","methods":["GET","HEAD"],"domain":null},"api.application.users.external":{"uri":"api\/application\/users\/external\/{external_id}","methods":["GET","HEAD"],"domain":null},"api.application.nodes":{"uri":"api\/application\/nodes","methods":["GET","HEAD"],"domain":null},"api.application.nodes.view":{"uri":"api\/application\/nodes\/{node}","methods":["GET","HEAD"],"domain":null},"api.application.allocations":{"uri":"api\/application\/nodes\/{node}\/allocations","methods":["GET","HEAD"],"domain":null},"api.application.allocations.view":{"uri":"api\/application\/nodes\/{node}\/allocations\/{allocation}","methods":["DELETE"],"domain":null},"api.applications.locations":{"uri":"api\/application\/locations","methods":["GET","HEAD"],"domain":null},"api.application.locations.view":{"uri":"api\/application\/locations\/{location}","methods":["GET","HEAD"],"domain":null},"api.application.servers":{"uri":"api\/application\/servers","methods":["GET","HEAD"],"domain":null},"api.application.servers.view":{"uri":"api\/application\/servers\/{server}","methods":["GET","HEAD"],"domain":null},"api.application.servers.external":{"uri":"api\/application\/servers\/external\/{external_id}","methods":["GET","HEAD"],"domain":null},"api.application.servers.details":{"uri":"api\/application\/servers\/{server}\/details","methods":["PATCH"],"domain":null},"api.application.servers.build":{"uri":"api\/application\/servers\/{server}\/build","methods":["PATCH"],"domain":null},"api.application.servers.startup":{"uri":"api\/application\/servers\/{server}\/startup","methods":["PATCH"],"domain":null},"api.application.servers.suspend":{"uri":"api\/application\/servers\/{server}\/suspend","methods":["POST"],"domain":null},"api.application.servers.unsuspend":{"uri":"api\/application\/servers\/{server}\/unsuspend","methods":["POST"],"domain":null},"api.application.servers.reinstall":{"uri":"api\/application\/servers\/{server}\/reinstall","methods":["POST"],"domain":null},"api.application.servers.rebuild":{"uri":"api\/application\/servers\/{server}\/rebuild","methods":["POST"],"domain":null},"api.application.servers.databases":{"uri":"api\/application\/servers\/{server}\/databases","methods":["GET","HEAD"],"domain":null},"api.application.servers.databases.view":{"uri":"api\/application\/servers\/{server}\/databases\/{database}","methods":["GET","HEAD"],"domain":null},"api.application.nests":{"uri":"api\/application\/nests","methods":["GET","HEAD"],"domain":null},"api.application.nests.view":{"uri":"api\/application\/nests\/{nest}","methods":["GET","HEAD"],"domain":null},"api.application.nests.eggs":{"uri":"api\/application\/nests\/{nest}\/eggs","methods":["GET","HEAD"],"domain":null},"api.application.nests.eggs.view":{"uri":"api\/application\/nests\/{nest}\/eggs\/{egg}","methods":["GET","HEAD"],"domain":null},"api.client.index":{"uri":"api\/client","methods":["GET","HEAD"],"domain":null},"api.client.account":{"uri":"api\/client\/account","methods":["GET","HEAD"],"domain":null},"api.client.servers.view":{"uri":"api\/client\/servers\/{server}","methods":["GET","HEAD"],"domain":null},"api.client.servers.resources":{"uri":"api\/client\/servers\/{server}\/utilization","methods":["GET","HEAD"],"domain":null},"api.client.servers.command":{"uri":"api\/client\/servers\/{server}\/command","methods":["POST"],"domain":null},"api.client.servers.power":{"uri":"api\/client\/servers\/{server}\/power","methods":["POST"],"domain":null},"api.remote.authenticate":{"uri":"api\/remote\/authenticate\/{token}","methods":["GET","HEAD"],"domain":null},"api.remote.download_file":{"uri":"api\/remote\/download-file","methods":["POST"],"domain":null},"api.remote.eggs":{"uri":"api\/remote\/eggs","methods":["GET","HEAD"],"domain":null},"api.remote.eggs.download":{"uri":"api\/remote\/eggs\/{uuid}","methods":["GET","HEAD"],"domain":null},"api.remote.scripts":{"uri":"api\/remote\/scripts\/{uuid}","methods":["GET","HEAD"],"domain":null},"api.remote.sftp":{"uri":"api\/remote\/sftp","methods":["POST"],"domain":null},"daemon.pack.pull":{"uri":"daemon\/packs\/pull\/{uuid}","methods":["GET","HEAD"],"domain":null},"daemon.pack.hash":{"uri":"daemon\/packs\/pull\/{uuid}\/hash","methods":["GET","HEAD"],"domain":null},"daemon.configuration":{"uri":"daemon\/configure\/{token}","methods":["GET","HEAD"],"domain":null},"daemon.install":{"uri":"daemon\/install","methods":["POST"],"domain":null}}'),
- baseUrl: 'http://pterodactyl.test/',
+ namedRoutes: JSON.parse('{"debugbar.openhandler":{"uri":"_debugbar\/open","methods":["GET","HEAD"],"domain":null},"debugbar.clockwork":{"uri":"_debugbar\/clockwork\/{id}","methods":["GET","HEAD"],"domain":null},"debugbar.assets.css":{"uri":"_debugbar\/assets\/stylesheets","methods":["GET","HEAD"],"domain":null},"debugbar.assets.js":{"uri":"_debugbar\/assets\/javascript","methods":["GET","HEAD"],"domain":null},"debugbar.cache.delete":{"uri":"_debugbar\/cache\/{key}\/{tags?}","methods":["DELETE"],"domain":null},"index":{"uri":"\/","methods":["GET","HEAD"],"domain":null},"account":{"uri":"account","methods":["GET","HEAD"],"domain":null},"account.api":{"uri":"account\/api","methods":["GET","HEAD"],"domain":null},"account.api.new":{"uri":"account\/api\/new","methods":["GET","HEAD"],"domain":null},"account.api.revoke":{"uri":"account\/api\/revoke\/{identifier}","methods":["DELETE"],"domain":null},"account.two_factor":{"uri":"account\/two_factor","methods":["GET","HEAD"],"domain":null},"account.two_factor.enable":{"uri":"account\/two_factor\/totp","methods":["POST"],"domain":null},"account.two_factor.disable":{"uri":"account\/two_factor\/totp\/disable","methods":["POST"],"domain":null},"admin.index":{"uri":"admin","methods":["GET","HEAD"],"domain":null},"admin.statistics":{"uri":"admin\/statistics","methods":["GET","HEAD"],"domain":null},"admin.api.index":{"uri":"admin\/api","methods":["GET","HEAD"],"domain":null},"admin.api.new":{"uri":"admin\/api\/new","methods":["GET","HEAD"],"domain":null},"admin.api.delete":{"uri":"admin\/api\/revoke\/{identifier}","methods":["DELETE"],"domain":null},"admin.locations":{"uri":"admin\/locations","methods":["GET","HEAD"],"domain":null},"admin.locations.view":{"uri":"admin\/locations\/view\/{location}","methods":["GET","HEAD"],"domain":null},"admin.databases":{"uri":"admin\/databases","methods":["GET","HEAD"],"domain":null},"admin.databases.view":{"uri":"admin\/databases\/view\/{host}","methods":["GET","HEAD"],"domain":null},"admin.settings":{"uri":"admin\/settings","methods":["GET","HEAD"],"domain":null},"admin.settings.mail":{"uri":"admin\/settings\/mail","methods":["GET","HEAD"],"domain":null},"admin.settings.advanced":{"uri":"admin\/settings\/advanced","methods":["GET","HEAD"],"domain":null},"admin.users":{"uri":"admin\/users","methods":["GET","HEAD"],"domain":null},"admin.users.json":{"uri":"admin\/users\/accounts.json","methods":["GET","HEAD"],"domain":null},"admin.users.new":{"uri":"admin\/users\/new","methods":["GET","HEAD"],"domain":null},"admin.users.view":{"uri":"admin\/users\/view\/{user}","methods":["GET","HEAD"],"domain":null},"admin.servers":{"uri":"admin\/servers","methods":["GET","HEAD"],"domain":null},"admin.servers.new":{"uri":"admin\/servers\/new","methods":["GET","HEAD"],"domain":null},"admin.servers.view":{"uri":"admin\/servers\/view\/{server}","methods":["GET","HEAD"],"domain":null},"admin.servers.view.details":{"uri":"admin\/servers\/view\/{server}\/details","methods":["GET","HEAD"],"domain":null},"admin.servers.view.build":{"uri":"admin\/servers\/view\/{server}\/build","methods":["GET","HEAD"],"domain":null},"admin.servers.view.startup":{"uri":"admin\/servers\/view\/{server}\/startup","methods":["GET","HEAD"],"domain":null},"admin.servers.view.database":{"uri":"admin\/servers\/view\/{server}\/database","methods":["GET","HEAD"],"domain":null},"admin.servers.view.manage":{"uri":"admin\/servers\/view\/{server}\/manage","methods":["GET","HEAD"],"domain":null},"admin.servers.view.delete":{"uri":"admin\/servers\/view\/{server}\/delete","methods":["GET","HEAD"],"domain":null},"admin.servers.view.manage.toggle":{"uri":"admin\/servers\/view\/{server}\/manage\/toggle","methods":["POST"],"domain":null},"admin.servers.view.manage.rebuild":{"uri":"admin\/servers\/view\/{server}\/manage\/rebuild","methods":["POST"],"domain":null},"admin.servers.view.manage.suspension":{"uri":"admin\/servers\/view\/{server}\/manage\/suspension","methods":["POST"],"domain":null},"admin.servers.view.manage.reinstall":{"uri":"admin\/servers\/view\/{server}\/manage\/reinstall","methods":["POST"],"domain":null},"admin.servers.view.database.delete":{"uri":"admin\/servers\/view\/{server}\/database\/{database}\/delete","methods":["DELETE"],"domain":null},"admin.nodes":{"uri":"admin\/nodes","methods":["GET","HEAD"],"domain":null},"admin.nodes.new":{"uri":"admin\/nodes\/new","methods":["GET","HEAD"],"domain":null},"admin.nodes.view":{"uri":"admin\/nodes\/view\/{node}","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.settings":{"uri":"admin\/nodes\/view\/{node}\/settings","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.configuration":{"uri":"admin\/nodes\/view\/{node}\/configuration","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.allocation":{"uri":"admin\/nodes\/view\/{node}\/allocation","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.servers":{"uri":"admin\/nodes\/view\/{node}\/servers","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.configuration.token":{"uri":"admin\/nodes\/view\/{node}\/settings\/token","methods":["GET","HEAD"],"domain":null},"admin.nodes.view.allocation.removeBlock":{"uri":"admin\/nodes\/view\/{node}\/allocation\/remove","methods":["POST"],"domain":null},"admin.nodes.view.allocation.setAlias":{"uri":"admin\/nodes\/view\/{node}\/allocation\/alias","methods":["POST"],"domain":null},"admin.nodes.view.delete":{"uri":"admin\/nodes\/view\/{node}\/delete","methods":["DELETE"],"domain":null},"admin.nodes.view.allocation.removeSingle":{"uri":"admin\/nodes\/view\/{node}\/allocation\/remove\/{allocation}","methods":["DELETE"],"domain":null},"admin.nests":{"uri":"admin\/nests","methods":["GET","HEAD"],"domain":null},"admin.nests.new":{"uri":"admin\/nests\/new","methods":["GET","HEAD"],"domain":null},"admin.nests.view":{"uri":"admin\/nests\/view\/{nest}","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.new":{"uri":"admin\/nests\/egg\/new","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.view":{"uri":"admin\/nests\/egg\/{egg}","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.export":{"uri":"admin\/nests\/egg\/{egg}\/export","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.variables":{"uri":"admin\/nests\/egg\/{egg}\/variables","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.scripts":{"uri":"admin\/nests\/egg\/{egg}\/scripts","methods":["GET","HEAD"],"domain":null},"admin.nests.egg.import":{"uri":"admin\/nests\/import","methods":["POST"],"domain":null},"admin.nests.egg.variables.edit":{"uri":"admin\/nests\/egg\/{egg}\/variables\/{variable}","methods":["PATCH"],"domain":null},"admin.packs":{"uri":"admin\/packs","methods":["GET","HEAD"],"domain":null},"admin.packs.new":{"uri":"admin\/packs\/new","methods":["GET","HEAD"],"domain":null},"admin.packs.new.template":{"uri":"admin\/packs\/new\/template","methods":["GET","HEAD"],"domain":null},"admin.packs.view":{"uri":"admin\/packs\/view\/{pack}","methods":["GET","HEAD"],"domain":null},"admin.packs.view.export":{"uri":"admin\/packs\/view\/{pack}\/export\/{files?}","methods":["POST"],"domain":null},"auth.login":{"uri":"auth\/login","methods":["GET","HEAD"],"domain":null},"auth.forgot-password":{"uri":"auth\/password","methods":["GET","HEAD"],"domain":null},"auth.reset":{"uri":"auth\/password\/reset\/{token}","methods":["GET","HEAD"],"domain":null},"auth.login-checkpoint":{"uri":"auth\/login\/checkpoint","methods":["POST"],"domain":null},"auth.reset-password":{"uri":"auth\/password\/reset","methods":["POST"],"domain":null},"auth.logout":{"uri":"auth\/logout","methods":["GET","HEAD"],"domain":null},"server.index":{"uri":"server\/{server}","methods":["GET","HEAD"],"domain":null},"server.console":{"uri":"server\/{server}\/console","methods":["GET","HEAD"],"domain":null},"server.settings.allocation":{"uri":"server\/{server}\/settings\/allocation","methods":["GET","HEAD"],"domain":null},"server.settings.name":{"uri":"server\/{server}\/settings\/name","methods":["GET","HEAD"],"domain":null},"server.settings.sftp":{"uri":"server\/{server}\/settings\/sftp","methods":["GET","HEAD"],"domain":null},"server.settings.startup":{"uri":"server\/{server}\/settings\/startup","methods":["GET","HEAD"],"domain":null},"server.databases.index":{"uri":"server\/{server}\/databases","methods":["GET","HEAD"],"domain":null},"server.databases.new":{"uri":"server\/{server}\/databases\/new","methods":["POST"],"domain":null},"server.databases.password":{"uri":"server\/{server}\/databases\/password","methods":["PATCH"],"domain":null},"server.databases.delete":{"uri":"server\/{server}\/databases\/delete\/{database}","methods":["DELETE"],"domain":null},"server.files.index":{"uri":"server\/{server}\/files","methods":["GET","HEAD"],"domain":null},"server.files.add":{"uri":"server\/{server}\/files\/add","methods":["GET","HEAD"],"domain":null},"server.files.edit":{"uri":"server\/{server}\/files\/download\/{file}","methods":["GET","HEAD"],"domain":null},"server.files.directory-list":{"uri":"server\/{server}\/files\/directory-list","methods":["POST"],"domain":null},"server.files.save":{"uri":"server\/{server}\/files\/save","methods":["POST"],"domain":null},"server.subusers":{"uri":"server\/{server}\/users","methods":["GET","HEAD"],"domain":null},"server.subusers.new":{"uri":"server\/{server}\/users\/new","methods":["GET","HEAD"],"domain":null},"server.subusers.view":{"uri":"server\/{server}\/users\/view\/{subuser}","methods":["GET","HEAD"],"domain":null},"server.schedules":{"uri":"server\/{server}\/schedules","methods":["GET","HEAD"],"domain":null},"server.schedules.new":{"uri":"server\/{server}\/schedules\/new","methods":["GET","HEAD"],"domain":null},"server.schedules.view":{"uri":"server\/{server}\/schedules\/view\/{schedule}","methods":["GET","HEAD"],"domain":null},"server.schedules.toggle":{"uri":"server\/{server}\/schedules\/view\/{schedule}\/toggle","methods":["POST"],"domain":null},"server.schedules.trigger":{"uri":"server\/{server}\/schedules\/view\/{schedule}\/trigger","methods":["POST"],"domain":null},"api.application.users":{"uri":"api\/application\/users","methods":["GET","HEAD"],"domain":null},"api.application.users.view":{"uri":"api\/application\/users\/{user}","methods":["GET","HEAD"],"domain":null},"api.application.users.external":{"uri":"api\/application\/users\/external\/{external_id}","methods":["GET","HEAD"],"domain":null},"api.application.nodes":{"uri":"api\/application\/nodes","methods":["GET","HEAD"],"domain":null},"api.application.nodes.view":{"uri":"api\/application\/nodes\/{node}","methods":["GET","HEAD"],"domain":null},"api.application.allocations":{"uri":"api\/application\/nodes\/{node}\/allocations","methods":["GET","HEAD"],"domain":null},"api.application.allocations.view":{"uri":"api\/application\/nodes\/{node}\/allocations\/{allocation}","methods":["DELETE"],"domain":null},"api.applications.locations":{"uri":"api\/application\/locations","methods":["GET","HEAD"],"domain":null},"api.application.locations.view":{"uri":"api\/application\/locations\/{location}","methods":["GET","HEAD"],"domain":null},"api.application.servers":{"uri":"api\/application\/servers","methods":["GET","HEAD"],"domain":null},"api.application.servers.view":{"uri":"api\/application\/servers\/{server}","methods":["GET","HEAD"],"domain":null},"api.application.servers.external":{"uri":"api\/application\/servers\/external\/{external_id}","methods":["GET","HEAD"],"domain":null},"api.application.servers.details":{"uri":"api\/application\/servers\/{server}\/details","methods":["PATCH"],"domain":null},"api.application.servers.build":{"uri":"api\/application\/servers\/{server}\/build","methods":["PATCH"],"domain":null},"api.application.servers.startup":{"uri":"api\/application\/servers\/{server}\/startup","methods":["PATCH"],"domain":null},"api.application.servers.suspend":{"uri":"api\/application\/servers\/{server}\/suspend","methods":["POST"],"domain":null},"api.application.servers.unsuspend":{"uri":"api\/application\/servers\/{server}\/unsuspend","methods":["POST"],"domain":null},"api.application.servers.reinstall":{"uri":"api\/application\/servers\/{server}\/reinstall","methods":["POST"],"domain":null},"api.application.servers.rebuild":{"uri":"api\/application\/servers\/{server}\/rebuild","methods":["POST"],"domain":null},"api.application.servers.databases":{"uri":"api\/application\/servers\/{server}\/databases","methods":["GET","HEAD"],"domain":null},"api.application.servers.databases.view":{"uri":"api\/application\/servers\/{server}\/databases\/{database}","methods":["GET","HEAD"],"domain":null},"api.application.nests":{"uri":"api\/application\/nests","methods":["GET","HEAD"],"domain":null},"api.application.nests.view":{"uri":"api\/application\/nests\/{nest}","methods":["GET","HEAD"],"domain":null},"api.application.nests.eggs":{"uri":"api\/application\/nests\/{nest}\/eggs","methods":["GET","HEAD"],"domain":null},"api.application.nests.eggs.view":{"uri":"api\/application\/nests\/{nest}\/eggs\/{egg}","methods":["GET","HEAD"],"domain":null},"api.client.index":{"uri":"api\/client","methods":["GET","HEAD"],"domain":null},"api.client.account":{"uri":"api\/client\/account","methods":["GET","HEAD"],"domain":null},"api.client.account.update-email":{"uri":"api\/client\/account\/email","methods":["PUT"],"domain":null},"api.client.account.update-password":{"uri":"api\/client\/account\/password","methods":["PUT"],"domain":null},"api.client.servers.view":{"uri":"api\/client\/servers\/{server}","methods":["GET","HEAD"],"domain":null},"api.client.servers.resources":{"uri":"api\/client\/servers\/{server}\/utilization","methods":["GET","HEAD"],"domain":null},"api.client.servers.command":{"uri":"api\/client\/servers\/{server}\/command","methods":["POST"],"domain":null},"api.client.servers.power":{"uri":"api\/client\/servers\/{server}\/power","methods":["POST"],"domain":null},"api.remote.authenticate":{"uri":"api\/remote\/authenticate\/{token}","methods":["GET","HEAD"],"domain":null},"api.remote.download_file":{"uri":"api\/remote\/download-file","methods":["POST"],"domain":null},"api.remote.eggs":{"uri":"api\/remote\/eggs","methods":["GET","HEAD"],"domain":null},"api.remote.eggs.download":{"uri":"api\/remote\/eggs\/{uuid}","methods":["GET","HEAD"],"domain":null},"api.remote.scripts":{"uri":"api\/remote\/scripts\/{uuid}","methods":["GET","HEAD"],"domain":null},"api.remote.sftp":{"uri":"api\/remote\/sftp","methods":["POST"],"domain":null},"daemon.pack.pull":{"uri":"daemon\/packs\/pull\/{uuid}","methods":["GET","HEAD"],"domain":null},"daemon.pack.hash":{"uri":"daemon\/packs\/pull\/{uuid}\/hash","methods":["GET","HEAD"],"domain":null},"daemon.configuration":{"uri":"daemon\/configure\/{token}","methods":["GET","HEAD"],"domain":null},"daemon.install":{"uri":"daemon\/install","methods":["POST"],"domain":null}}'),
+ baseUrl: 'http://pterodactyl.local/',
baseProtocol: 'http',
- baseDomain: 'pterodactyl.test',
+ baseDomain: 'pterodactyl.local',
basePort: false
};
diff --git a/resources/assets/scripts/models/user.js b/resources/assets/scripts/models/user.js
index 149afd818..cfd4e4830 100644
--- a/resources/assets/scripts/models/user.js
+++ b/resources/assets/scripts/models/user.js
@@ -1,39 +1,4 @@
-import isString from 'lodash/isString';
-import jwtDecode from 'jwt-decode';
-
export default class User {
- /**
- * Get a new user model from the JWT.
- *
- * @return {User | null}
- */
- static fromToken(token) {
- if (!isString(token)) {
- token = localStorage.getItem('token');
- }
-
- if (!isString(token) || token.length < 1) {
- return null;
- }
-
- const data = jwtDecode(token);
- if (data.user) {
- return new User(data.user);
- }
-
- return null;
- }
-
- /**
- * Return the JWT for the authenticated user.
- *
- * @returns {string | null}
- */
- static getToken()
- {
- return localStorage.getItem('token');
- }
-
/**
* Create a new user model.
*
@@ -45,14 +10,14 @@ export default class User {
* @param {String} language
*/
constructor({
- admin,
+ root_admin,
username,
email,
first_name,
last_name,
language,
}) {
- this.admin = admin;
+ this.admin = root_admin;
this.username = username;
this.email = email;
this.name = `${first_name} ${last_name}`;
diff --git a/resources/assets/scripts/router.js b/resources/assets/scripts/router.js
new file mode 100644
index 000000000..d03c6b47a
--- /dev/null
+++ b/resources/assets/scripts/router.js
@@ -0,0 +1,66 @@
+import VueRouter from 'vue-router';
+import store from './store/index';
+import compareDate from 'date-fns/compare_asc'
+import addHours from 'date-fns/add_hours'
+import dateParse from 'date-fns/parse'
+const route = require('./../../../vendor/tightenco/ziggy/src/js/route').default;
+
+// Base Vuejs Templates
+import Login from './components/auth/Login';
+import Dashboard from './components/dashboard/Dashboard';
+import Account from './components/dashboard/Account';
+import ResetPassword from './components/auth/ResetPassword';
+import User from './models/user';
+
+const routes = [
+ { name: 'login', path: '/auth/login', component: Login },
+ { name: 'forgot-password', path: '/auth/password', component: Login },
+ { name: 'checkpoint', path: '/auth/checkpoint', component: Login },
+ {
+ name: 'reset-password',
+ path: '/auth/password/reset/:token',
+ component: ResetPassword,
+ props: function (route) {
+ return { token: route.params.token, email: route.query.email || '' };
+ }
+ },
+
+ { name : 'dashboard', path: '/', component: Dashboard },
+ { name : 'account', path: '/account', component: Account },
+ { name : 'account.api', path: '/account/api', component: Account },
+ { name : 'account.security', path: '/account/security', component: Account },
+
+ {
+ name: 'server',
+ path: '/server/:id',
+ // component: Server,
+ // children: [
+ // { path: 'files', component: ServerFileManager }
+ // ],
+ }
+];
+
+const router = new VueRouter({
+ mode: 'history', routes
+});
+
+// Redirect the user to the login page if they try to access a protected route and
+// have no JWT or the JWT is expired and wouldn't be accepted by the Panel.
+router.beforeEach((to, from, next) => {
+ if (to.path === route('auth.logout')) {
+ return window.location = route('auth.logout');
+ }
+
+ const user = store.getters['auth/getUser'];
+
+ // Check that if we're accessing a non-auth route that a user exists on the page.
+ if (!to.path.startsWith('/auth') && !(user instanceof User)) {
+ store.commit('auth/logout');
+ return window.location = route('auth.logout');
+ }
+
+ // Continue on through the pipeline.
+ return next();
+});
+
+export default router;
diff --git a/resources/assets/scripts/store/index.js b/resources/assets/scripts/store/index.js
index f2393d6e7..ca8a44630 100644
--- a/resources/assets/scripts/store/index.js
+++ b/resources/assets/scripts/store/index.js
@@ -1,20 +1,24 @@
+import Vue from 'vue';
import Vuex from 'vuex';
-import { sync } from 'vuex-router-sync';
import { serverModule } from "./modules/server";
import { userModule } from './modules/user';
import { authModule } from "./modules/auth";
-const createStore = (router) => {
- const store = new Vuex.Store({
- strict: process.env.NODE_ENV !== 'production',
- modules: {
- userModule,
- serverModule,
- authModule,
- },
- });
- sync(store, router);
- return store;
-};
+Vue.use(Vuex);
-export default createStore;
+const store = new Vuex.Store({
+ strict: process.env.NODE_ENV !== 'production',
+ modules: { userModule, serverModule, authModule },
+});
+
+if (module.hot) {
+ module.hot.accept(['./modules/auth'], () => {
+ const newAuthModule = require('./modules/auth').default;
+
+ store.hotUpdate({
+ modules: { newAuthModule },
+ });
+ });
+}
+
+export default store;
diff --git a/resources/assets/scripts/store/modules/auth.js b/resources/assets/scripts/store/modules/auth.js
index 8aaf16ec0..7e095723a 100644
--- a/resources/assets/scripts/store/modules/auth.js
+++ b/resources/assets/scripts/store/modules/auth.js
@@ -1,10 +1,11 @@
import User from './../../models/user';
+
const route = require('./../../../../../vendor/tightenco/ziggy/src/js/route').default;
export const authModule = {
namespaced: true,
state: {
- user: User.fromToken(),
+ user: typeof window.PterodactylUser === 'object' ? new User(window.PterodactylUser) : null,
},
getters: {
/**
@@ -13,12 +14,20 @@ export const authModule = {
* @param state
* @returns {User|null}
*/
- currentUser: function (state) {
+ getUser: function (state) {
return state.user;
- }
+ },
},
setters: {},
actions: {
+ /**
+ * Log a user into the Panel.
+ *
+ * @param commit
+ * @param {String} user
+ * @param {String} password
+ * @returns {Promise
}
+ */
login: ({commit}, {user, password}) => {
return new Promise((resolve, reject) => {
window.axios.post(route('auth.login'), {user, password})
@@ -32,7 +41,7 @@ export const authModule = {
}
if (response.data.complete) {
- commit('login', {jwt: response.data.jwt});
+ commit('login', response.data.user);
return resolve({
complete: true,
intended: response.data.intended,
@@ -47,24 +56,40 @@ export const authModule = {
.catch(reject);
});
},
- logout: function ({commit}) {
+
+ /**
+ * Update a user's email address on the Panel and store the updated result in Vuex.
+ *
+ * @param commit
+ * @param {String} email
+ * @param {String} password
+ * @return {Promise}
+ */
+ updateEmail: function ({commit}, {email, password}) {
return new Promise((resolve, reject) => {
- window.axios.get(route('auth.logout'))
- .then(() => {
- commit('logout');
+ window.axios.put(route('api.client.account.update-email'), {email, password})
+ .then(response => {
+ // If there is a 302 redirect or some other odd behavior (basically, response that isnt
+ // in JSON format) throw an error and don't try to continue with the login.
+ if (!(response.data instanceof Object) && response.status !== 201) {
+ return reject(new Error('An error was encountered while processing this request.'));
+ }
+
+ commit('setEmail', email);
return resolve();
})
.catch(reject);
- })
+ });
},
},
mutations: {
- login: function (state, {jwt}) {
- localStorage.setItem('token', jwt);
- state.user = User.fromToken(jwt);
+ setEmail: function (state, email) {
+ state.user.email = email;
+ },
+ login: function (state, data) {
+ state.user = new User(data);
},
logout: function (state) {
- localStorage.removeItem('token');
state.user = null;
},
},
diff --git a/resources/assets/styles/components/animations.css b/resources/assets/styles/components/animations.css
index a081fb4f7..a3daa6722 100644
--- a/resources/assets/styles/components/animations.css
+++ b/resources/assets/styles/components/animations.css
@@ -34,3 +34,15 @@
@apply .bg-red-dark;
}
}
+
+/*
+ * transition="modal"
+ */
+.modal-enter, .modal-leave-active {
+ opacity: 0;
+}
+
+.modal-enter .modal-container,
+.modal-leave-active .modal-container {
+ animation: opacity 250ms linear;
+}
diff --git a/resources/assets/styles/components/authentication.css b/resources/assets/styles/components/authentication.css
index 63111a0d3..1f99a29f7 100644
--- a/resources/assets/styles/components/authentication.css
+++ b/resources/assets/styles/components/authentication.css
@@ -1,3 +1,9 @@
.login-box {
@apply .bg-white .shadow-lg .rounded-lg .pt-10 .px-8 .pb-6 .mb-4;
+
+ @screen xsx {
+ @apply .rounded-none;
+ margin-top: 25%;
+ box-shadow: 0 15px 30px 0 rgba(0, 0, 0, .2), 0 -15px 30px 0 rgba(0, 0, 0, .2);
+ }
}
diff --git a/resources/assets/styles/components/buttons.css b/resources/assets/styles/components/buttons.css
index dcc5fe55a..0171adda6 100644
--- a/resources/assets/styles/components/buttons.css
+++ b/resources/assets/styles/components/buttons.css
@@ -12,18 +12,41 @@
}
}
+ &.btn-green {
+ @apply .bg-green .border-green-dark .border .text-white;
+
+ &:hover:enabled {
+ @apply .bg-green-dark .border-green-darker;
+ }
+ }
+
&.btn-red {
@apply .bg-red .border-red-dark .border .text-white;
&:hover:enabled {
- @apply .bg-red-dark .border-red-darker;
- }
- }
- /* Button Sizes */
+ @apply .bg-red-dark .border-red-darker;
+ }
+ }
+
+ &.btn-secondary {
+ @apply .border .border-grey-light .text-grey-dark;
+
+ &:hover:enabled {
+ @apply .border-grey .text-grey-darker;
+ }
+ }
+
+ /**
+ * Button Sizes
+ */
&.btn-jumbo {
@apply .p-4 .w-full .uppercase .tracking-wide .text-sm;
}
+ &.btn-sm {
+ @apply .px-6 .py-3 .uppercase .tracking-wide .text-sm;
+ }
+
&:disabled, &.disabled {
opacity: 0.55;
cursor: default;
diff --git a/resources/assets/styles/components/forms.css b/resources/assets/styles/components/forms.css
index f9de27916..85fe6cf64 100644
--- a/resources/assets/styles/components/forms.css
+++ b/resources/assets/styles/components/forms.css
@@ -1,3 +1,17 @@
+textarea, select, input, button {
+ outline: none;
+}
+
+input[type=number]::-webkit-outer-spin-button,
+input[type=number]::-webkit-inner-spin-button {
+ -webkit-appearance: none !important;
+ margin: 0;
+}
+
+input[type=number] {
+ -moz-appearance: textfield !important;
+}
+
/**
* Styles for the login form open input boxes. Label floats up above it when content
* is input and then sinks back down into the field if left empty.
@@ -30,3 +44,35 @@
top: 14px;
transition: transform 200ms ease-out;
}
+
+/**
+ * Styling for other forms throughout the Panel.
+ */
+.input:not(.open-label) {
+ @apply .appearance-none .p-3 .rounded .border .text-grey-darker .w-full;
+ transition: all 100ms linear;
+
+ &:focus {
+ @apply .border-blue-light;
+ }
+
+ &:required, &:invalid {
+ box-shadow: none;
+ }
+
+ &.error {
+ @apply .text-red-dark .border-red;
+ }
+}
+
+.input-label {
+ @apply .block .uppercase .tracking-wide .text-grey-darkest .text-xs .font-bold .mb-2;
+}
+
+.input-help {
+ @apply .text-xs .text-grey .pt-2;
+
+ &.error {
+ @apply .text-red-dark;
+ }
+}
diff --git a/resources/assets/styles/components/miscellaneous.css b/resources/assets/styles/components/miscellaneous.css
index 527281106..48ae381b9 100644
--- a/resources/assets/styles/components/miscellaneous.css
+++ b/resources/assets/styles/components/miscellaneous.css
@@ -42,6 +42,13 @@ code {
}
}
+/**
+ * Styling for elements that contain the core page content.
+ */
+.content-box {
+ @apply .bg-white .p-6 .border .border-grey-light .rounded;
+}
+
/**
* Flex boxes for server listing on user dashboard.
*/
diff --git a/resources/assets/styles/components/modal.css b/resources/assets/styles/components/modal.css
new file mode 100644
index 000000000..9c81e79c1
--- /dev/null
+++ b/resources/assets/styles/components/modal.css
@@ -0,0 +1,20 @@
+.modal-mask {
+ @apply .fixed .pin .z-50 .overflow-auto .flex;
+ background: rgba(0, 0, 0, 0.7);
+ transition: opacity 250ms ease;
+
+ & > .modal-container {
+ @apply .relative .p-8 .bg-white .w-full .max-w-md .m-auto .flex-col .flex;
+ transition: all 250ms ease;
+ margin-top: 15%;
+
+ /**
+ * On tiny phone screens make sure there is a margin on the sides and also
+ * center the modal rather than putting it towards the top of the screen.
+ */
+ @screen smx {
+ margin-top: auto;
+ width: 90%;
+ }
+ }
+}
diff --git a/resources/assets/styles/components/navigation.css b/resources/assets/styles/components/navigation.css
index 00ef892e0..c6bdaf8b6 100644
--- a/resources/assets/styles/components/navigation.css
+++ b/resources/assets/styles/components/navigation.css
@@ -27,10 +27,6 @@
&:hover {
@apply .bg-blue-dark;
}
-
- & .feather {
- @apply .h-4;
- }
}
}
}
diff --git a/resources/assets/styles/components/spinners.css b/resources/assets/styles/components/spinners.css
index b509c5a4c..d55c8e350 100644
--- a/resources/assets/styles/components/spinners.css
+++ b/resources/assets/styles/components/spinners.css
@@ -31,11 +31,11 @@
/**
* Spinner Colors
*/
- &.blue:after {
+ &.blue:after, &.text-blue:after {
@apply .border-blue;
}
- &.white:after {
+ &.white:after, &.text-white:after {
@apply .border-white;
}
diff --git a/resources/assets/styles/main.css b/resources/assets/styles/main.css
index 081064077..3f7ccff25 100644
--- a/resources/assets/styles/main.css
+++ b/resources/assets/styles/main.css
@@ -13,6 +13,7 @@
@import "components/containers.css";
@import "components/forms.css";
@import "components/miscellaneous.css";
+@import "components/modal.css";
@import "components/navigation.css";
@import "components/notifications.css";
@import "components/spinners.css";
diff --git a/resources/lang/de/strings.php b/resources/lang/de/strings.php
index 2e2f2a751..299a7d67e 100644
--- a/resources/lang/de/strings.php
+++ b/resources/lang/de/strings.php
@@ -48,7 +48,7 @@ return [
'select_none' => 'Alles abwählen',
'alias' => 'Alias',
'primary' => 'Primär',
- 'make_primary' => 'Primät machen',
+ 'make_primary' => 'Primär machen',
'none' => 'Nichts',
'cancel' => 'Abbrechen',
'created_at' => 'Erstellt am',
diff --git a/resources/lang/en/base.php b/resources/lang/en/base.php
index 01ac79b1e..2646dc4f1 100644
--- a/resources/lang/en/base.php
+++ b/resources/lang/en/base.php
@@ -54,35 +54,4 @@ return [
],
],
],
- 'account' => [
- 'details_updated' => 'Your account details have been successfully updated.',
- 'invalid_password' => 'The password provided for your account was not valid.',
- 'header' => 'Your Account',
- 'header_sub' => 'Manage your account details.',
- 'update_pass' => 'Update Password',
- 'update_email' => 'Update Email Address',
- 'current_password' => 'Current Password',
- 'new_password' => 'New Password',
- 'new_password_again' => 'Repeat New Password',
- 'new_email' => 'New Email Address',
- 'first_name' => 'First Name',
- 'last_name' => 'Last Name',
- 'update_identity' => 'Update Identity',
- 'username_help' => 'Your username must be unique to your account, and may only contain the following characters: :requirements.',
- ],
- 'security' => [
- 'session_mgmt_disabled' => 'Your host has not enabled the ability to manage account sessions via this interface.',
- 'header' => 'Account Security',
- 'header_sub' => 'Control active sessions and 2-Factor Authentication.',
- 'sessions' => 'Active Sessions',
- '2fa_header' => '2-Factor Authentication',
- '2fa_token_help' => 'Enter the 2FA Token generated by your app (Google Authenticator, Authy, etc.).',
- 'disable_2fa' => 'Disable 2-Factor Authentication',
- '2fa_enabled' => '2-Factor Authentication is enabled on this account and will be required in order to login to the panel. If you would like to disable 2FA, simply enter a valid token below and submit the form.',
- '2fa_disabled' => '2-Factor Authentication is disabled on your account! You should enable 2FA in order to add an extra level of protection on your account.',
- 'enable_2fa' => 'Enable 2-Factor Authentication',
- '2fa_qr' => 'Configure 2FA on Your Device',
- '2fa_checkpoint_help' => 'Use the 2FA application on your phone to take a picture of the QR code to the left, or manually enter the code under it. Once you have done so, generate a token and enter it below.',
- '2fa_disable_error' => 'The 2FA token provided was not valid. Protection has not been disabled for this account.',
- ],
];
diff --git a/resources/lang/en/dashboard/account.php b/resources/lang/en/dashboard/account.php
new file mode 100644
index 000000000..85411ef65
--- /dev/null
+++ b/resources/lang/en/dashboard/account.php
@@ -0,0 +1,28 @@
+ [
+ 'title' => 'Update your email',
+ 'updated' => 'Your email address has been updated.',
+ ],
+ 'password' => [
+ 'title' => 'Change your password',
+ 'requirements' => 'Your new password should be at least 8 characters in length.',
+ 'updated' => 'Your password has been updated.',
+ ],
+ 'two_factor' => [
+ 'button' => 'Configure 2-Factor Authentication',
+ 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.',
+ 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.',
+ 'invalid' => 'The token provided was invalid.',
+ 'setup' => [
+ 'title' => 'Setup two-factor authentication',
+ 'help' => 'Can\'t scan the code? Enter the code below into your application:',
+ 'field' => 'Enter token',
+ ],
+ 'disable' => [
+ 'title' => 'Disable two-factor authentication',
+ 'field' => 'Enter token',
+ ],
+ ],
+];
diff --git a/resources/lang/en/strings.php b/resources/lang/en/strings.php
index ebdd60d23..c9fbb6349 100644
--- a/resources/lang/en/strings.php
+++ b/resources/lang/en/strings.php
@@ -2,9 +2,11 @@
return [
'email' => 'Email',
+ 'email_address' => 'Email address',
'user_identifier' => 'Username or Email',
'password' => 'Password',
- 'confirm_password' => 'Confirm Password',
+ 'new_password' => 'New password',
+ 'confirm_password' => 'Confirm new password',
'login' => 'Login',
'home' => 'Home',
'servers' => 'Servers',
@@ -85,7 +87,8 @@ return [
'sat' => 'Saturday',
],
'last_used' => 'Last Used',
-
- // Copyright Line
+ 'enable' => 'Enable',
+ 'disable' => 'Disable',
+ 'save' => 'Save',
'copyright' => '© 2015 - :year Pterodactyl Software',
];
diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php
index 201880ec9..a82aaa1be 100644
--- a/resources/lang/en/validation.php
+++ b/resources/lang/en/validation.php
@@ -101,5 +101,6 @@ return [
// Internal validation logic for Pterodactyl
'internal' => [
'variable_value' => ':env variable',
+ 'invalid_password' => 'The password provided was invalid for this account.',
],
];
diff --git a/resources/themes/pterodactyl/admin/servers/view/delete.blade.php b/resources/themes/pterodactyl/admin/servers/view/delete.blade.php
index ec1ccaebe..ec33ef037 100644
--- a/resources/themes/pterodactyl/admin/servers/view/delete.blade.php
+++ b/resources/themes/pterodactyl/admin/servers/view/delete.blade.php
@@ -62,7 +62,7 @@
Force Delete Server