'int', 'username' => 'string', 'email' => 'string', 'google_2fa_secret' => 'string', 'api_key' => 'string', 'active' => 'bool', 'level' => 'int', ]; /** * The properties that cannot be mass assigned. * * @var string[] */ protected $guarded = []; /** * The hidden properties. * * These are excluded when we are serializing the model. * * @var string[] */ protected $hidden = ['password', 'remember_token', 'google_2fa_secret']; /** * The validation rules. * * @var string[] */ public $rules = [ 'username' => ['required', 'regex:/\A(?!.*[:;]-\))[ -~]+\z/'], 'email' => 'required|email', 'password' => 'required', ]; /** * Overrides the models boot method. */ public static function boot() { parent::boot(); self::creating(function ($user) { if (!$user->api_key) { $user->api_key = self::generateApiKey(); } }); } /** * Hash any password being inserted by default. * * @param string $password * * @return \CachetHQ\Cachet\Models\User */ public function setPasswordAttribute($password) { $this->attributes['password'] = Hash::make($password); return $this; } /** * Returns a Gravatar URL for the users email address. * * @param int $size * * @return string */ public function getGravatarAttribute($size = 200) { return sprintf('https://www.gravatar.com/avatar/%s?size=%d', md5($this->email), $size); } /** * Find by api_key, or throw an exception. * * @param string $token * @param string[] $columns * * @throws \Illuminate\Database\Eloquent\ModelNotFoundException * * @return \CachetHQ\Cachet\Models\User */ public static function findByApiToken($token, $columns = ['*']) { $user = static::where('api_key', $token)->first($columns); if (!$user) { throw new ModelNotFoundException(); } return $user; } /** * Returns an API key. * * @return string */ public static function generateApiKey() { return str_random(20); } /** * Returns whether a user is at admin level. * * @return bool */ public function getIsAdminAttribute() { return $this->level == self::LEVEL_ADMIN; } /** * Returns if a user has enabled two factor authentication. * * @return bool */ public function getHasTwoFactorAttribute() { return trim($this->google_2fa_secret) !== ''; } }