diff --git a/app/classes/api_controller.php b/app/classes/api_controller.php index 99faa73..b23fbe4 100644 --- a/app/classes/api_controller.php +++ b/app/classes/api_controller.php @@ -18,6 +18,8 @@ use TheTempusProject\Hermes\Functions\Redirect; use TheTempusProject\Bedrock\Functions\Session; use TheTempusProject\Bedrock\Classes\Config; use TheTempusProject\Models\Token; +use TheTempusProject\Canary\Bin\Canary as Debug; +use TheTempusProject\Houdini\Classes\Views; class ApiController extends Controller { protected static $canAccessApplicationApi = false; @@ -26,16 +28,15 @@ class ApiController extends Controller { protected static $authToken; public function __construct( $secure = true ) { + header('Content-Type: application/json; charset=utf-8'); parent::__construct(); - $this->verifyApiRequest(); - if ( $secure && ! $this->canUseApi() ) { - Session::flash( 'error', 'You do not have permission to view this page.' ); - return Redirect::home(); - } + Template::setTemplate( 'api' ); Template::noFollow(); Template::noIndex(); - Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); - Template::setTemplate( 'api' ); + $res = $this->verifyApiRequest(); + if ( $secure && ! $this->canUseApi() ) { + exit( $res ); + } } protected function canUseApi() { @@ -72,16 +73,16 @@ class ApiController extends Controller { } else { $secret = $this->getSecretToken(); if ( empty( $secret ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'invalid secret' ], true )]); } $token = $tokens->findBySecret( $secret ); } if ( empty( $token ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'invalid token' ], true )]); } self::$authToken = $token; if ( $token->expiresAt <= time() && empty( $secret ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'token expired' ], true )]); } if ( $token->expiresAt <= time() ) { self::$canAccessAuthenticationApi = true; diff --git a/app/classes/forms.php b/app/classes/forms.php index d4402e7..1d6c4cb 100644 --- a/app/classes/forms.php +++ b/app/classes/forms.php @@ -114,6 +114,7 @@ class Forms extends Check { self::addHandler( 'install', __CLASS__, 'install' ); self::addHandler( 'adminCreateToken', __CLASS__, 'adminCreateToken' ); self::addHandler( 'apiLogin', __CLASS__, 'apiLogin' ); + self::addHandler( 'updatePreference', __CLASS__, 'updatePreference' ); self::addHandler( 'installStart', __CLASS__, 'install', [ 'start' ] ); self::addHandler( 'installAgreement', __CLASS__, 'install', [ 'agreement' ] ); self::addHandler( 'installCheck', __CLASS__, 'install', [ 'check' ] ); @@ -650,4 +651,16 @@ class Forms extends Check { } return true; } + + public static function updatePreference() { + if ( !Input::exists( 'prefName' ) ) { + self::addUserError( 'You must specify a name' ); + return false; + } + if ( !Input::exists( 'prefValue' ) ) { + self::addUserError( 'You must specify a value' ); + return false; + } + return true; + } } diff --git a/app/classes/preferences.php b/app/classes/preferences.php index 6b840f0..3bf15fa 100644 --- a/app/classes/preferences.php +++ b/app/classes/preferences.php @@ -201,6 +201,8 @@ class Preferences { $tempPrefsArray = $this->normalizePreferenceArray( $name, $details ); if ( isset( $populated[ $name ] ) ) { $tempPrefsArray['value'] = $populated[$name]; + } else { + $tempPrefsArray['value'] = $tempPrefsArray['default']; } // $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); if ( $tempPrefsArray['type'] == 'checkbox' ) { diff --git a/app/controllers/api/login.php b/app/controllers/api/login.php index 279a1cb..74536eb 100644 --- a/app/controllers/api/login.php +++ b/app/controllers/api/login.php @@ -27,15 +27,14 @@ class Login extends ApiController { parent::__construct( false ); self::$tokens = new Token; self::$user = new User; - // Template::addHeader( 'Access-Control-Allow-Origin: *' ); - // Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); + Template::addHeader( 'Access-Control-Allow-Origin: *' ); + Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); } public function index() { - header('Access-Control-Allow-Origin: *'); - if ( !Forms::check( 'apiLogin' ) ) { + if ( ! Forms::check( 'apiLogin' ) ) { $responseType = 'error'; - $response = 'malformed input1'; + $response = 'malformed input'; return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $response ], true )]); } $user = self::$user->authorize( Input::post( 'username' ), Input::post( 'password' ) ); @@ -45,7 +44,7 @@ class Login extends ApiController { return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $response ], true )]); } $responseType = 'token'; - $token = self::$tokens->findOrCreateUserToken( $user->ID ); + $token = self::$tokens->findOrCreateUserToken( $user->ID, true ); return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $token ], true )]); } } \ No newline at end of file diff --git a/app/controllers/usercp.php b/app/controllers/usercp.php index c1c9b15..c0b13cf 100644 --- a/app/controllers/usercp.php +++ b/app/controllers/usercp.php @@ -36,12 +36,12 @@ class Usercp extends Controller { Redirect::home(); } Template::noIndex(); - $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); - Navigation::activePageSelect( $menu, null, true, true ); } public function email() { self::$title = 'Email Settings'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); if ( App::$activeUser->confirmed != '1' ) { return Issues::add( 'notice', 'You need to confirm your email address before you can make modifications. If you would like to resend that confirmation link, please click here', true ); } @@ -68,11 +68,15 @@ class Usercp extends Controller { public function index() { self::$title = 'User Control Panel'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); Views::view( 'profile', App::$activeUser ); } public function password() { self::$title = 'Password Settings'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); if ( !Input::exists() ) { return Views::view( 'user_cp.password_change' ); } @@ -94,6 +98,8 @@ class Usercp extends Controller { public function settings() { self::$title = 'Preferences'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); $prefs = new Preferences; $fields = App::$activePrefs; if ( Input::exists( 'submit' ) ) { @@ -109,4 +115,39 @@ class Usercp extends Controller { Components::set( 'PREFERENCES_FORM', $prefs->getFormHtml( $fields ) ); Views::view( 'user_cp.settings', App::$activeUser ); } + + public function updatePref() { + Template::setTemplate( 'api' ); + if ( ! App::$isLoggedIn ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => 'Not Logged In' ], true )]); + } + if ( ! Forms::check( 'updatePreference' ) ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => Check::userErrors() ], true )]); + } + $name = Input::post( 'prefName' ); + $value = Input::post('prefValue' ); + + if ( 'false' === $value ) { + $value = false; + } elseif ( 'true' === $value ) { + $value = true; + } + + if ( empty( Preferences::get( $name ) ) ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => 'Unknown Preference' ], true )]); + } + + $prefs = new Preferences; + $fields1 = $prefs->convertFormToArray( true, false ); + $fields2 = []; + $fields3 = $fields1; + + if ( isset( $fields1[ $name ] ) ) { + $fields2[ $name ] = $value; + $fields3[ $name ] = $value; + } + $result = self::$user->updatePrefs( $fields3, App::$activeUser->ID ); + + return Views::view( 'api.response', ['response' => json_encode( $result, true )]); + } } diff --git a/app/js/main.js b/app/js/main.js index 5b38519..3173ece 100644 --- a/app/js/main.js +++ b/app/js/main.js @@ -119,35 +119,46 @@ document.addEventListener('DOMContentLoaded', function () { if ( enableButton ) { enableButton.addEventListener('click', function () { - if (darkModeStylesheet.disabled) { - darkModeStylesheet.disabled = false; - localStorage.setItem('darkMode', 'enabled'); - enableButton.innerText = 'Disable Now'; - } else { - darkModeStylesheet.disabled = true; - localStorage.setItem('darkMode', 'disabled'); - enableButton.innerText = 'Enable Now'; - } + if (darkModeStylesheet.disabled) { + darkModeStylesheet.disabled = false; + localStorage.setItem('darkMode', 'enabled'); + enableButton.innerText = 'Disable Now'; + } else { + darkModeStylesheet.disabled = true; + localStorage.setItem('darkMode', 'disabled'); + enableButton.innerText = 'Enable Now'; + } }); } toggleButton.addEventListener('click', function () { - if (darkModeStylesheet.disabled) { - darkModeStylesheet.disabled = false; - localStorage.setItem('darkMode', 'enabled'); - } else { - darkModeStylesheet.disabled = true; - localStorage.setItem('darkMode', 'disabled'); - } - - document.querySelectorAll('.table-striped').forEach((table) => { - if (localStorage.getItem('darkMode') === 'enabled') { - table.classList.add('table-dark'); - table.classList.remove('table-light'); + if (darkModeStylesheet.disabled) { + toggleDarkModePref( true ); + darkModeStylesheet.disabled = false; + localStorage.setItem('darkMode', 'enabled'); } else { - table.classList.add('table-light'); - table.classList.remove('table-dark'); + toggleDarkModePref( false ); + darkModeStylesheet.disabled = true; + localStorage.setItem('darkMode', 'disabled'); } + + document.querySelectorAll('.table-striped').forEach((table) => { + if (localStorage.getItem('darkMode') === 'enabled') { + table.classList.add('table-dark'); + table.classList.remove('table-light'); + } else { + table.classList.add('table-light'); + table.classList.remove('table-dark'); + } + }); }); - }); + + function toggleDarkModePref( value ) { + var fields = {}; + fields.prefName = 'darkMode'; + fields.prefValue = value; + $.post( '/usercp/updatePref', fields ).done(function(response) { + // alert('Timer updated successfully!'); + }); + } }); diff --git a/app/models/token.php b/app/models/token.php index 167e961..fe9198a 100644 --- a/app/models/token.php +++ b/app/models/token.php @@ -94,10 +94,15 @@ class Token extends DatabaseModel { return false; } - public function findOrCreateUserToken( $user_id ) { + public function findOrCreateUserToken( $user_id, $refresh = false ) { $test = $this->findUserToken( $user_id ); if ( ! empty( $test ) ) { - return $test->token; + if ( ! empty( $refresh ) ) { + $token = $this->refresh( $test->ID, 'user' ); + } else { + $token = $test->token; + } + return $token; } $expiration = Config::getValue( 'api/UserAccessTokenExpiration' ); diff --git a/app/models/user.php b/app/models/user.php index 5eb8a38..62012fa 100644 --- a/app/models/user.php +++ b/app/models/user.php @@ -121,6 +121,11 @@ class User extends DatabaseModel { '50', ], ], + 'darkMode' => [ + 'pretty' => 'Enable Dark-Mode viewing', + 'type' => 'checkbox', + 'default' => 'false', + ], ]; protected static $avatars; protected static $preferences; diff --git a/app/plugins/blog/views/sidebar.html b/app/plugins/blog/views/sidebar.html index 07ca483..7cdf184 100644 --- a/app/plugins/blog/views/sidebar.html +++ b/app/plugins/blog/views/sidebar.html @@ -5,7 +5,7 @@
    {LOOP} -
  1. {title}
  2. +
  3. {title}
  4. {/LOOP} {ALT}
  5. No Posts to show
  6. @@ -13,6 +13,6 @@
\ No newline at end of file diff --git a/app/plugins/blog/views/sidebar2.html b/app/plugins/blog/views/sidebar2.html index b135d93..8be0657 100644 --- a/app/plugins/blog/views/sidebar2.html +++ b/app/plugins/blog/views/sidebar2.html @@ -2,7 +2,7 @@

Archives