[ 'actions' => [ 'index' => 'Crud.Index', 'add' => 'Crud.Add', 'edit' => 'Crud.Edit', 'view' => 'Crud.View', 'keyvalue' => 'Crud.List', 'category' => 'Crud.Category' ], 'listeners' => ['Api', 'ApiTransformation'] #], #'DebugKit.Toolbar' => [ # 'bootstrap' => true, 'routes' => true ] ]; // Global beforeFilter function //Zoneminder sets the username session variable // to the logged in user. If this variable is set // then you are logged in // its pretty simple to extend this to also check // for role and deny API access in future // Also checking to do this only if ZM_OPT_USE_AUTH is on public function beforeFilter() { if ( ! ZM_OPT_USE_API ) { throw new UnauthorizedException(__('API Disabled')); return; } # For use throughout the app. If not logged in, this will be null. global $user; if ( ZM_OPT_USE_AUTH ) { require_once __DIR__ .'/../../../includes/auth.php'; $mUser = $this->request->query('user') ? $this->request->query('user') : $this->request->data('user'); $mPassword = $this->request->query('pass') ? $this->request->query('pass') : $this->request->data('pass'); $mToken = $this->request->query('token') ? $this->request->query('token') : $this->request->data('token'); if ( $mUser and $mPassword ) { // log (user, pass, nothashed, api based login so skip recaptcha) $user = userLogin($mUser, $mPassword, false, true); if ( !$user ) { throw new UnauthorizedException(__('Incorrect credentials or API disabled')); return; } } else if ( $mToken ) { // if you pass a token to login, we should only allow // refresh tokens to regenerate new access and refresh tokens if ( !strcasecmp($this->params->action, 'login') ) { $only_allow_token_type='refresh'; } else { // for any other methods, don't allow refresh tokens // they are supposed to be infrequently used for security // purposes $only_allow_token_type='access'; } $ret = validateToken($mToken, $only_allow_token_type, true); $user = $ret[0]; $retstatus = $ret[1]; if ( !$user ) { throw new UnauthorizedException(__($retstatus)); return; } } else if ( $mAuth ) { $user = getAuthUser($mAuth, true); if ( !$user ) { throw new UnauthorizedException(__('Invalid Auth Key')); return; } } // We need to reject methods that are not authenticated // besides login and logout if ( strcasecmp($this->params->action, 'logout') ) { if ( !( $user and $user['Username'] ) ) { throw new UnauthorizedException(__('Not Authenticated')); return; } else if ( !( $user and $user['Enabled'] ) ) { throw new UnauthorizedException(__('User is not enabled')); return; } } # end if ! login or logout if ($user['APIEnabled'] == 0 ) { throw new UnauthorizedException(__('API Disabled')); return; } } # end if ZM_OPT_AUTH // make sure populated user object has APIs enabled } # end function beforeFilter() }