throw new Exception(DI::l10n()->t('SERIOUS ERROR: Generation of security keys failed.'));
}
- $system = [];
- $system['uid'] = 0;
- $system['created'] = DateTimeFormat::utcNow();
- $system['self'] = true;
- $system['network'] = Protocol::ACTIVITYPUB;
- $system['name'] = 'System Account';
- $system['addr'] = $system_actor_name . '@' . DI::baseUrl()->getHostname();
- $system['nick'] = $system_actor_name;
- $system['url'] = DI::baseUrl() . '/friendica';
+ $system = [
+ 'uid' => 0,
+ 'created' => DateTimeFormat::utcNow(),
+ 'self' => true,
+ 'network' => Protocol::ACTIVITYPUB,
+ 'name' => 'System Account',
+ 'addr' => $system_actor_name . '@' . DI::baseUrl()->getHostname(),
+ 'nick' => $system_actor_name,
+ 'url' => DI::baseUrl() . '/friendica',
+ 'pubkey' => $keys['pubkey'],
+ 'prvkey' => $keys['prvkey'],
+ 'blocked' => 0,
+ 'pending' => 0,
+ 'contact-type' => Contact::TYPE_RELAY, // In AP this is translated to 'Application'
+ 'name-date' => DateTimeFormat::utcNow(),
+ 'uri-date' => DateTimeFormat::utcNow(),
+ 'avatar-date' => DateTimeFormat::utcNow(),
+ 'closeness' => 0,
+ 'baseurl' => DI::baseUrl(),
+ ];
$system['avatar'] = $system['photo'] = Contact::getDefaultAvatar($system, Proxy::SIZE_SMALL);
- $system['thumb'] = Contact::getDefaultAvatar($system, Proxy::SIZE_THUMB);
- $system['micro'] = Contact::getDefaultAvatar($system, Proxy::SIZE_MICRO);
-
- $system['nurl'] = Strings::normaliseLink($system['url']);
- $system['pubkey'] = $keys['pubkey'];
- $system['prvkey'] = $keys['prvkey'];
- $system['blocked'] = 0;
- $system['pending'] = 0;
- $system['contact-type'] = Contact::TYPE_RELAY; // In AP this is translated to 'Application'
- $system['name-date'] = DateTimeFormat::utcNow();
- $system['uri-date'] = DateTimeFormat::utcNow();
- $system['avatar-date'] = DateTimeFormat::utcNow();
- $system['closeness'] = 0;
- $system['baseurl'] = DI::baseUrl();
- $system['gsid'] = GServer::getID($system['baseurl']);
+ $system['thumb'] = Contact::getDefaultAvatar($system, Proxy::SIZE_THUMB);
+ $system['micro'] = Contact::getDefaultAvatar($system, Proxy::SIZE_MICRO);
+ $system['nurl'] = Strings::normaliseLink($system['url']);
+ $system['gsid'] = GServer::getID($system['baseurl']);
+
Contact::insert($system);
}
return password_hash($password, PASSWORD_DEFAULT);
}
+ /**
+ * Allowed characters are a-z, A-Z, 0-9 and special characters except white spaces, accentuated letters and colon (:).
+ *
+ * Password length is limited to 72 characters if the current default password hashing algorithm is Blowfish.
+ * From the manual: "Using the PASSWORD_BCRYPT as the algorithm, will result in the password parameter being
+ * truncated to a maximum length of 72 bytes."
+ *
+ * @see https://www.php.net/manual/en/function.password-hash.php#refsect1-function.password-hash-parameters
+ *
+ * @param string|null $delimiter Whether the regular expression is meant to be wrapper in delimiter characters
+ * @return string
+ */
+ public static function getPasswordRegExp(string $delimiter = null): string
+ {
+ $allowed_characters = '!"#$%&\'()*+,-./;<=>?@[\]^_`{|}~';
+
+ if ($delimiter) {
+ $allowed_characters = preg_quote($allowed_characters, $delimiter);
+ }
+
+ return '^[a-zA-Z0-9' . $allowed_characters . ']' . (PASSWORD_DEFAULT !== PASSWORD_BCRYPT ? '{1,72}' : '+') . '$';
+ }
+
/**
* Updates a user row with a new plaintext password
*
throw new Exception(DI::l10n()->t('The new password has been exposed in a public data dump, please choose another.'));
}
- $allowed_characters = '!"#$%&\'()*+,-./;<=>?@[\]^_`{|}~';
+ if (PASSWORD_DEFAULT === PASSWORD_BCRYPT && strlen($password) > 72) {
+ throw new Exception(DI::l10n()->t('The password length is limited to 72 characters.'));
+ }
- if (!preg_match('/^[a-z0-9' . preg_quote($allowed_characters, '/') . ']+$/i', $password)) {
+ if (!preg_match('/' . self::getPasswordRegExp('/') . '/', $password)) {
throw new Exception(DI::l10n()->t('The password can\'t contain accentuated letters, white spaces or colons (:)'));
}