Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/UsersController.php
Show All 39 Lines | class UsersController extends RelationController | ||||
protected $label = 'user'; | protected $label = 'user'; | ||||
/** @var string Resource model name */ | /** @var string Resource model name */ | ||||
protected $model = User::class; | protected $model = User::class; | ||||
/** @var array Common object properties in the API response */ | /** @var array Common object properties in the API response */ | ||||
protected $objectProps = ['email']; | protected $objectProps = ['email']; | ||||
/** @var ?\App\VerificationCode Password reset code to activate on user create/update */ | |||||
protected $passCode; | |||||
/** | /** | ||||
* Listing of users. | * Listing of users. | ||||
* | * | ||||
* The user-entitlements billed to the current user wallet(s) | * The user-entitlements billed to the current user wallet(s) | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return \Illuminate\Http\JsonResponse | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | public function show($id) | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
$response = $this->userResponse($user); | $response = $this->userResponse($user); | ||||
$response['skus'] = \App\Entitlement::objectEntitlementsSummary($user); | $response['skus'] = \App\Entitlement::objectEntitlementsSummary($user); | ||||
$response['config'] = $user->getConfig(); | $response['config'] = $user->getConfig(); | ||||
$code = $user->verificationcodes()->where('active', true) | |||||
->where('expires_at', '>', \Carbon\Carbon::now()) | |||||
->first(); | |||||
if ($code) { | |||||
$response['passwordLinkCode'] = $code->short_code . '-' . $code->code; | |||||
} | |||||
return response()->json($response); | return response()->json($response); | ||||
} | } | ||||
/** | /** | ||||
* User status (extended) information | * User status (extended) information | ||||
* | * | ||||
* @param \App\User $user User object | * @param \App\User $user User object | ||||
* | * | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | public function store(Request $request) | ||||
} | } | ||||
// Create user record | // Create user record | ||||
$user = User::create([ | $user = User::create([ | ||||
'email' => $request->email, | 'email' => $request->email, | ||||
'password' => $request->password, | 'password' => $request->password, | ||||
]); | ]); | ||||
$this->activatePassCode($user); | |||||
$owner->assignPackage($package, $user); | $owner->assignPackage($package, $user); | ||||
if (!empty($settings)) { | if (!empty($settings)) { | ||||
$user->setSettings($settings); | $user->setSettings($settings); | ||||
} | } | ||||
if (!empty($request->aliases)) { | if (!empty($request->aliases)) { | ||||
$user->setAliases($request->aliases); | $user->setAliases($request->aliases); | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | public function update(Request $request, $id) | ||||
$user->setSettings($settings); | $user->setSettings($settings); | ||||
} | } | ||||
if (!empty($request->password)) { | if (!empty($request->password)) { | ||||
$user->password = $request->password; | $user->password = $request->password; | ||||
$user->save(); | $user->save(); | ||||
} | } | ||||
$this->activatePassCode($user); | |||||
if (isset($request->aliases)) { | if (isset($request->aliases)) { | ||||
$user->setAliases($request->aliases); | $user->setAliases($request->aliases); | ||||
} | } | ||||
// TODO: Make sure that UserUpdate job is created in case of entitlements update | // TODO: Make sure that UserUpdate job is created in case of entitlements update | ||||
// and no password change. So, for example quota change is applied to LDAP | // and no password change. So, for example quota change is applied to LDAP | ||||
// TODO: Review use of $user->save() in the above context | // TODO: Review use of $user->save() in the above context | ||||
▲ Show 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | protected function validateUserRequest(Request $request, $user, &$settings = []) | ||||
'last_name' => 'string|nullable|max:128', | 'last_name' => 'string|nullable|max:128', | ||||
'organization' => 'string|nullable|max:512', | 'organization' => 'string|nullable|max:512', | ||||
'billing_address' => 'string|nullable|max:1024', | 'billing_address' => 'string|nullable|max:1024', | ||||
'country' => 'string|nullable|alpha|size:2', | 'country' => 'string|nullable|alpha|size:2', | ||||
'currency' => 'string|nullable|alpha|size:3', | 'currency' => 'string|nullable|alpha|size:3', | ||||
'aliases' => 'array|nullable', | 'aliases' => 'array|nullable', | ||||
]; | ]; | ||||
// Handle generated password reset code | |||||
if ($code = $request->input('passwordLinkCode')) { | |||||
// Accept <short-code>-<code> input | |||||
if (strpos($code, '-')) { | |||||
$code = explode('-', $code)[1]; | |||||
} | |||||
$this->passCode = $this->guard()->user()->verificationcodes() | |||||
->where('code', $code)->where('active', false)->first(); | |||||
// Generate a password for a new user with password reset link | |||||
// FIXME: Should/can we have a user with no password set? | |||||
if ($this->passCode && empty($user)) { | |||||
$request->password = $request->password_confirmation = Str::random(16); | |||||
$ignorePassword = true; | |||||
} | |||||
} | |||||
if (empty($user) || !empty($request->password) || !empty($request->password_confirmation)) { | if (empty($user) || !empty($request->password) || !empty($request->password_confirmation)) { | ||||
$rules['password'] = 'required|min:4|max:2048|confirmed'; | if (empty($ignorePassword)) { | ||||
$rules['password'] = 'required|min:6|max:255|confirmed'; | |||||
vanmeeuwen: `min:4` => `min:6`
`max:2048` => `max:255` | |||||
} | |||||
} | } | ||||
$errors = []; | $errors = []; | ||||
// Validate input | // Validate input | ||||
$v = Validator::make($request->all(), $rules); | $v = Validator::make($request->all(), $rules); | ||||
if ($v->fails()) { | if ($v->fails()) { | ||||
▲ Show 20 Lines • Show All 248 Lines • ▼ Show 20 Lines | public static function validateAlias(string $email, \App\User $user): ?string | ||||
// Check if a group with specified address already exists | // Check if a group with specified address already exists | ||||
if (Group::emailExists($email)) { | if (Group::emailExists($email)) { | ||||
return \trans('validation.entryexists', ['attribute' => 'alias']); | return \trans('validation.entryexists', ['attribute' => 'alias']); | ||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
/** | |||||
* Activate password reset code (if set), and assign it to a user. | |||||
* | |||||
* @param \App\User $user The user | |||||
*/ | |||||
protected function activatePassCode(User $user): void | |||||
{ | |||||
// Activate the password reset code | |||||
if ($this->passCode) { | |||||
$this->passCode->user_id = $user->id; | |||||
$this->passCode->active = true; | |||||
$this->passCode->save(); | |||||
} | |||||
} | |||||
} | } |
min:4 => min:6
max:2048 => max:255