has('username') && $input->has('nonce') && $input->has('totp')) { return Payload::create((object)[ 'id' => $input->get('username'), 'nonce' => $input->get('nonce'), 'token' => $input->get('totp'), 'json' => false, ]); } return null; } public static function create(object $data): ?Payload { /* if missing required fields id, nonce, or token */ if (strlen(trim($data->id ?? '')) < 1 || strlen(trim($data->nonce ?? '')) < 1 || strlen(trim($data->token ?? '')) < 1 ) { /* returns null as the input is invalid */ return null; } /* all input is limited */ $payload = new Payload(); $payload->id = mb_substr(trim($data->id), 0, AppConstants::MAX_INPUT_LENGTH); $payload->nonce = mb_substr(trim($data->nonce), 0, AppConstants::MAX_INPUT_LENGTH); $payload->json = ($data->json ?? true); $payload->scope = Scope::tryFrom($data->scope ?? '') ?? Scope::Cookie; $payload->token = mb_substr(trim($data->token), 0, AppConstants::MAX_INPUT_LENGTH); return Payload::constrict($payload); } public function toString(): string { return json_encode($this); } private static function constrict(Payload $payload): Payload { /* When scope is None, json will be considered false. */ if ($payload->scope === Scope::None) { $payload->json = false; } return $payload; } }