'array', 'user_id' => 'int', 'r_' . AdminAcl::RESOURCE_USERS => 'int', 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'int', 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'int', 'r_' . AdminAcl::RESOURCE_SERVER_DATABASES => 'int', 'r_' . AdminAcl::RESOURCE_EGGS => 'int', 'r_' . AdminAcl::RESOURCE_LOCATIONS => 'int', 'r_' . AdminAcl::RESOURCE_NESTS => 'int', 'r_' . AdminAcl::RESOURCE_NODES => 'int', 'r_' . AdminAcl::RESOURCE_SERVERS => 'int', ]; /** * Fields that are mass assignable. * * @var array */ protected $fillable = [ 'identifier', 'token', 'allowed_ips', 'memo', 'last_used_at', ]; /** * Fields that should not be included when calling toArray() or toJson() * on this model. * * @var array */ protected $hidden = ['token']; /** * Rules to protect against invalid data entry to DB. * * @var array */ public static $validationRules = [ 'user_id' => 'required|exists:users,id', 'key_type' => 'present|integer|min:0|max:4', 'identifier' => 'required|string|size:16|unique:api_keys,identifier', 'token' => 'required|string', 'memo' => 'required|nullable|string|max:500', 'allowed_ips' => 'nullable|array', 'allowed_ips.*' => 'string', 'last_used_at' => 'nullable|date', 'r_' . AdminAcl::RESOURCE_USERS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_SERVER_DATABASES => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_EGGS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_LOCATIONS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_NESTS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_NODES => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_SERVERS => 'integer|min:0|max:3', ]; /** * @var array */ protected $dates = [ self::CREATED_AT, self::UPDATED_AT, 'last_used_at', ]; /** * Returns the user this token is assigned to. */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * Required for support with Laravel Sanctum. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo * * @see \Laravel\Sanctum\Guard::supportsTokens() */ public function tokenable() { return $this->user(); } /** * Finds the model matching the provided token. * * @param string $token * * @return self|null */ public static function findToken($token) { $id = Str::substr($token, 0, self::IDENTIFIER_LENGTH); $model = static::where('identifier', $id)->first(); if (!is_null($model) && decrypt($model->token) === Str::substr($token, strlen($id))) { return $model; } return null; } /** * Generates a new identifier for an API key. */ public static function generateTokenIdentifier(): string { return 'ptdl_' . Str::random(self::IDENTIFIER_LENGTH - 5); } }