refactor validators and sanitizers
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
fb79350d3e
commit
956bfba2e2
|
@ -139,6 +139,61 @@ class AccountManager implements IAccountManager {
|
||||||
return $input;
|
return $input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function sanitizeLength(array &$propertyData, bool $throwOnData = false): void {
|
||||||
|
if (isset($propertyData) && isset($propertyData['value']) && strlen($propertyData['value']) > 2048) {
|
||||||
|
if ($throwOnData) {
|
||||||
|
throw new \InvalidArgumentException();
|
||||||
|
} else {
|
||||||
|
$propertyData['value'] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function testValueLengths(array &$data, bool $throwOnData = false): void {
|
||||||
|
try {
|
||||||
|
foreach ($data as $propertyName => &$propertyData) {
|
||||||
|
if ($this->isCollection($propertyName)) {
|
||||||
|
$this->testValueLengths($propertyData, $throwOnData);
|
||||||
|
} else {
|
||||||
|
$this->sanitizeLength($propertyData, $throwOnData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\InvalidArgumentException $e) {
|
||||||
|
throw new \InvalidArgumentException($propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function testPropertyScopes(array &$data, array $allowedScopes, bool $throwOnData = false, string $parentPropertyName = null): void {
|
||||||
|
foreach ($data as $propertyNameOrIndex => &$propertyData) {
|
||||||
|
if ($this->isCollection($propertyNameOrIndex)) {
|
||||||
|
$this->testPropertyScopes($propertyData, $allowedScopes, $throwOnData);
|
||||||
|
} else if (isset($propertyData['scope'])) {
|
||||||
|
$effectivePropertyName = $parentPropertyName ?? $propertyNameOrIndex;
|
||||||
|
|
||||||
|
if ($throwOnData && !in_array($propertyData['scope'], $allowedScopes, true)) {
|
||||||
|
throw new \InvalidArgumentException('scope');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
$propertyData['scope'] === self::SCOPE_PRIVATE
|
||||||
|
&& ($effectivePropertyName === self::PROPERTY_DISPLAYNAME || $effectivePropertyName === self::PROPERTY_EMAIL)
|
||||||
|
) {
|
||||||
|
if ($throwOnData) {
|
||||||
|
// v2-private is not available for these fields
|
||||||
|
throw new \InvalidArgumentException('scope');
|
||||||
|
} else {
|
||||||
|
// default to local
|
||||||
|
$data[$propertyNameOrIndex]['scope'] = self::SCOPE_LOCAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// migrate scope values to the new format
|
||||||
|
// invalid scopes are mapped to a default value
|
||||||
|
$data[$propertyNameOrIndex]['scope'] = AccountProperty::mapScopeToV2($propertyData['scope']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update user record
|
* update user record
|
||||||
*
|
*
|
||||||
|
@ -166,16 +221,7 @@ class AccountManager implements IAccountManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set a max length
|
$this->testValueLengths($data);
|
||||||
foreach ($data as $propertyName => $propertyData) {
|
|
||||||
if (isset($data[$propertyName]) && isset($data[$propertyName]['value']) && strlen($data[$propertyName]['value']) > 2048) {
|
|
||||||
if ($throwOnData) {
|
|
||||||
throw new \InvalidArgumentException($propertyName);
|
|
||||||
} else {
|
|
||||||
$data[$propertyName]['value'] = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($data[self::PROPERTY_WEBSITE]) && $data[self::PROPERTY_WEBSITE]['value'] !== '') {
|
if (isset($data[self::PROPERTY_WEBSITE]) && $data[self::PROPERTY_WEBSITE]['value'] !== '') {
|
||||||
try {
|
try {
|
||||||
|
@ -198,31 +244,7 @@ class AccountManager implements IAccountManager {
|
||||||
self::VISIBILITY_PUBLIC,
|
self::VISIBILITY_PUBLIC,
|
||||||
];
|
];
|
||||||
|
|
||||||
// validate and convert scope values
|
$this->testPropertyScopes($data, $allowedScopes, $throwOnData);
|
||||||
foreach ($data as $propertyName => $propertyData) {
|
|
||||||
if (isset($propertyData['scope'])) {
|
|
||||||
if ($throwOnData && !in_array($propertyData['scope'], $allowedScopes, true)) {
|
|
||||||
throw new \InvalidArgumentException('scope');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
$propertyData['scope'] === self::SCOPE_PRIVATE
|
|
||||||
&& ($propertyName === self::PROPERTY_DISPLAYNAME || $propertyName === self::PROPERTY_EMAIL)
|
|
||||||
) {
|
|
||||||
if ($throwOnData) {
|
|
||||||
// v2-private is not available for these fields
|
|
||||||
throw new \InvalidArgumentException('scope');
|
|
||||||
} else {
|
|
||||||
// default to local
|
|
||||||
$data[$propertyName]['scope'] = self::SCOPE_LOCAL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// migrate scope values to the new format
|
|
||||||
// invalid scopes are mapped to a default value
|
|
||||||
$data[$propertyName]['scope'] = AccountProperty::mapScopeToV2($propertyData['scope']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($userData)) {
|
if (empty($userData)) {
|
||||||
$this->insertNewUser($user, $data);
|
$this->insertNewUser($user, $data);
|
||||||
|
|
Loading…
Reference in New Issue