請求の確認
This commit is contained in:
@@ -38,6 +38,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
namespace Std\Lib;
|
||||
|
||||
use Std\Lib\Curl;
|
||||
use LogType;
|
||||
|
||||
/**
|
||||
* ActivityPubプロトコルの実装クラス
|
||||
@@ -434,7 +435,7 @@ class ActivityPub {
|
||||
$privFile = FEDIINFO['privkey'];
|
||||
$priv = file_get_contents($privFile);
|
||||
if ($priv === false) {
|
||||
logger(\LogType::ActivityPub, "エラー:秘密鍵「{$privFile}」の読込に失敗");
|
||||
logger(LogType::ActivityPub, "エラー:秘密鍵「{$privFile}」の読込に失敗");
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
header('Content-Type: application/activity+json');
|
||||
echo json_encode(['error' => '秘密鍵の読込に失敗']);
|
||||
@@ -454,11 +455,11 @@ class ActivityPub {
|
||||
];
|
||||
|
||||
$stringToSign = "host: {$headers['Host']}\n"."date: {$headers['Date']}\n"."digest: {$headers['Digest']}";
|
||||
logger(\LogType::ActivityPub, "署名対象: {$stringToSign}");
|
||||
logger(LogType::ActivityPub, "署名対象: {$stringToSign}");
|
||||
|
||||
if (!openssl_sign($stringToSign, $signature, $priv, OPENSSL_ALGO_SHA256)) {
|
||||
$error = openssl_error_string();
|
||||
logger(\LogType::ActivityPub, "エラー:署名に失敗: {$error}");
|
||||
logger(LogType::ActivityPub, "エラー:署名に失敗: {$error}");
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
header('Content-Type: application/activity+json');
|
||||
echo json_encode(['error' => '署名に失敗']);
|
||||
@@ -470,7 +471,7 @@ class ActivityPub {
|
||||
$headers['Signature'] .= 'algorithm="rsa-sha256",';
|
||||
$headers['Signature'] .= 'headers="host date digest",';
|
||||
$headers['Signature'] .= 'signature="'.$sigValue.'"';
|
||||
logger(\LogType::ActivityPub, "署名: {$headers['Signature']}\n送信データ: {$body}");
|
||||
logger(LogType::ActivityPub, "署名: {$headers['Signature']}\n送信データ: {$body}");
|
||||
|
||||
$curl = new Curl($inboxUrl);
|
||||
$curl->setMethod('POST')
|
||||
@@ -486,9 +487,9 @@ class ActivityPub {
|
||||
$err = $curl->getError();
|
||||
|
||||
var_dump(print_r($res));
|
||||
logger(\LogType::ActivityPub, "アクティビティは「{$inboxUrl}」に送信しました: HTTP {$code}");
|
||||
logger(\LogType::ActivityPub, "エラー: {$err}");
|
||||
logger(\LogType::ActivityPub, "レスポンス: {$res}");
|
||||
logger(LogType::ActivityPub, "アクティビティは「{$inboxUrl}」に送信しました: HTTP {$code}");
|
||||
logger(LogType::ActivityPub, "エラー: {$err}");
|
||||
logger(LogType::ActivityPub, "レスポンス: {$res}");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -571,10 +572,10 @@ class ActivityPub {
|
||||
->setMaxRedirects(5)
|
||||
->setCaInfo('/etc/ssl/cert.pem');
|
||||
|
||||
logger(\LogType::ActivityPub, "アクターURLにリクエスト: {$actor}");
|
||||
logger(LogType::ActivityPub, "アクターURLにリクエスト: {$actor}");
|
||||
$success = $curl->execute();
|
||||
if (!$success) {
|
||||
logger(\LogType::ActivityPub, "アクターリクエストに失敗: ".$curl->getError());
|
||||
logger(LogType::ActivityPub, "アクターリクエストに失敗: ".$curl->getError());
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -583,7 +584,7 @@ class ActivityPub {
|
||||
$err = $curl->getError();
|
||||
|
||||
if ($code !== 200) {
|
||||
logger(\LogType::ActivityPub, "アクター取得に失敗: HTTP {$code}, エラー: {$err}");
|
||||
logger(LogType::ActivityPub, "アクター取得に失敗: HTTP {$code}, エラー: {$err}");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,11 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
namespace Std\Lib;
|
||||
|
||||
use Gender;
|
||||
use LogType;
|
||||
use Result;
|
||||
use Roles;
|
||||
|
||||
class Auth {
|
||||
private int $id;
|
||||
|
||||
@@ -72,22 +77,22 @@ class Auth {
|
||||
unset($user->password);
|
||||
unset($user->tokens);
|
||||
$myself = $this->getUserData();
|
||||
if (!$myself || ($myself->id != $user->id && $myself->role < \Roles::STAFF)) $user->email = '(秘密)';
|
||||
if (!$myself || ($myself->id != $user->id && $myself->role < Roles::STAFF)) $user->email = '(秘密)';
|
||||
$user->name = namecolor($user);
|
||||
$user->regDate = date('Y年m月d日', $user->regDate);
|
||||
$user->gender = $user->gender === \Gender::MALE ? '男' : ($user->gender === \Gender::FEMALE ? '女' : '不明');
|
||||
$user->gender = $user->gender === Gender::MALE ? '男' : ($user->gender === Gender::FEMALE ? '女' : '不明');
|
||||
|
||||
switch (true) {
|
||||
case ($user->role & \Roles::ADMIN):
|
||||
case ($user->role & Roles::ADMIN):
|
||||
$user->role = '管理者';
|
||||
break;
|
||||
case ($user->role & \Roles::STAFF):
|
||||
case ($user->role & Roles::STAFF):
|
||||
$user->role = '076スタジオの会社員';
|
||||
break;
|
||||
case ($user->role & (\Roles::FSUBSCRIBER | \Roles::PSUBSCRIBER | \Roles::NSUBSCRIBER | \Roles::SUBSCRIBER)):
|
||||
case ($user->role & (Roles::FSUBSCRIBER | Roles::PSUBSCRIBER | Roles::NSUBSCRIBER | Roles::SUBSCRIBER)):
|
||||
$user->role = '支援者♡';
|
||||
break;
|
||||
case ($user->role & \Roles::BANNED):
|
||||
case ($user->role & Roles::BANNED):
|
||||
$user->role = 'BANされた';
|
||||
break;
|
||||
default:
|
||||
@@ -103,14 +108,14 @@ class Auth {
|
||||
return $user;
|
||||
}
|
||||
|
||||
public function setToken(string $username, #[SensitiveParameter] string $password): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
public function setToken(string $username, #[SensitiveParameter] string $password): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
$userData = $this->getUserData();
|
||||
if (!isset($userData->tokens) || !is_array($userData->tokens)) $userData->tokens = [];
|
||||
|
||||
$verify = $this->verifyLogin($username, $password);
|
||||
if (!$verify->isSuccess) {
|
||||
return \Result::error($verify->message);
|
||||
return Result::error($verify->message);
|
||||
}
|
||||
|
||||
$ip = $_SERVER['REMOTE_ADDR'];
|
||||
@@ -119,7 +124,9 @@ class Auth {
|
||||
$ip = trim($ipList[0]);
|
||||
}
|
||||
|
||||
$userData = $this->purgeOldTokens($userData);
|
||||
$res = $this->purgeOldTokens($userData);
|
||||
if (!$res->isSuccess) return Result::Error($res->message);
|
||||
$userData = $res->data;
|
||||
$token = bin2hex(random_bytes(64));
|
||||
$expire = time() + $this->tokenDuration;
|
||||
$newToken = [
|
||||
@@ -137,8 +144,8 @@ class Auth {
|
||||
$json = json_encode($userData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
if (file_put_contents($path, $json) === false) {
|
||||
logger(\LogType::Auth, '【setToken】JSONファイルにユーザーデータを保存出来なかった。パス:'.$path);
|
||||
return \Result::error('エラー:ユーザーデータの保存に失敗。');
|
||||
logger(LogType::Auth, '【setToken】JSONファイルにユーザーデータを保存出来なかった。パス:'.$path);
|
||||
return Result::error('エラー:ユーザーデータの保存に失敗。');
|
||||
}
|
||||
|
||||
if (!setcookie('kerozen', $token, [
|
||||
@@ -149,22 +156,24 @@ class Auth {
|
||||
'httponly' => true,
|
||||
'samesite' => 'Strict'
|
||||
])) {
|
||||
logger(\LogType::Auth, '【setToken】クッキーを設定出来なかった。トークン:'.$token);
|
||||
return \Result::error('エラー:クッキーを設定に失敗。');
|
||||
logger(LogType::Auth, '【setToken】クッキーを設定出来なかった。トークン:'.$token);
|
||||
return Result::error('エラー:クッキーを設定に失敗。');
|
||||
}
|
||||
|
||||
return \Result::success('ログイン成功');
|
||||
return Result::success('ログイン成功');
|
||||
}
|
||||
|
||||
public function getToken(): string {
|
||||
public function getToken(): ?string {
|
||||
if (!AUTH_ENABLED) return '';
|
||||
$userData = $this->getUserData();
|
||||
if (!isset($userData->tokens) || !is_array($userData->tokens)) $userData->tokens = [];
|
||||
$userData = $this->purgeOldTokens($userData);
|
||||
$res = $this->purgeOldTokens($userData);
|
||||
if (!$res->isSuccess) return null;
|
||||
$userData = $res->data;
|
||||
}
|
||||
|
||||
public function logout(?string $token = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
public function logout(?string $token = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
$userData = $this->getUserData();
|
||||
|
||||
if (!$token) {
|
||||
@@ -182,27 +191,27 @@ class Auth {
|
||||
'samesite' => 'Strict'
|
||||
]);
|
||||
|
||||
return \Result::success();
|
||||
return Result::success();
|
||||
}
|
||||
|
||||
public function isUserExist(?string $username = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $username) return \Result::Error('エラー:ユーザー名をご入力下さい。');
|
||||
public function isUserExist(?string $username = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $username) return Result::Error('エラー:ユーザー名をご入力下さい。');
|
||||
$userList = scandir($this->dataDir);
|
||||
|
||||
foreach ($userList as $list) {
|
||||
if ($list === '.kara' || $list === '.' || $list === '..') continue;
|
||||
$file = str_replace('.json', '', $list);
|
||||
$user = explode('.', $file)[1];
|
||||
if ($username === $user) return \Result::Success("ユーザー「{$username}」は既に存在します。");
|
||||
if ($username === $user) return Result::Success("ユーザー「{$username}」は既に存在します。");
|
||||
}
|
||||
|
||||
return \Result::Error('');
|
||||
return Result::Error('');
|
||||
}
|
||||
|
||||
public function mkUser(?string $username = null, #[SensitiveParameter] ?string $password = null, ?string $passwordVerify = null, ?string $email = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (!AUTH_REGISTER_ENABLED) return \Result::Error('ユーザー登録は無効です。');
|
||||
public function mkUser(?string $username = null, #[SensitiveParameter] ?string $password = null, ?string $passwordVerify = null, ?string $email = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (!AUTH_REGISTER_ENABLED) return Result::Error('ユーザー登録は無効です。');
|
||||
$resUsr = $this->verifyUsername($username);
|
||||
$resPwd = $this->verifyPassword($password, $passwordVerify);
|
||||
$resEml = $this->verifyEmail($email);
|
||||
@@ -213,12 +222,12 @@ class Auth {
|
||||
if (!$resPwd->isSuccess) $err .= $resPwd->message."<br />";
|
||||
if (!$resEml->isSuccess) $err .= $resEml->message."<br />";
|
||||
|
||||
if ($err != '') return \Result::Error($err);
|
||||
if ($err != '') return Result::Error($err);
|
||||
$err = '';
|
||||
|
||||
if (!mkdir($this->assDir.$username, 0755)) {
|
||||
logger(\LogType::Auth, '【mkUser】アセットディレクトリを作成出来なかった。chownをご確認下さい。パス:'.$this->assDir.$username);
|
||||
return \Result::Error('エラー:ユーザーのアイコンディレクトリの作成に失敗。');
|
||||
logger(LogType::Auth, '【mkUser】アセットディレクトリを作成出来なかった。chownをご確認下さい。パス:'.$this->assDir.$username);
|
||||
return Result::Error('エラー:ユーザーのアイコンディレクトリの作成に失敗。');
|
||||
}
|
||||
|
||||
$file = scandir($this->dataDir);
|
||||
@@ -246,29 +255,29 @@ class Auth {
|
||||
$user->regDate = time();
|
||||
$user->namecolor = '';
|
||||
$user->displayname = '';
|
||||
$user->gender = \Gender::UNKNOWN;
|
||||
$user->role = \Roles::MEMBER;
|
||||
$user->gender = Gender::UNKNOWN;
|
||||
$user->role = Roles::MEMBER;
|
||||
$user->tokens = [];
|
||||
|
||||
$path = "{$this->dataDir}{$lastId}.{$username}.json";
|
||||
$json = json_encode($user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
if (file_put_contents($path, $json) === false) {
|
||||
logger(\LogType::Auth, '【mkUser】JSONファイルを作成出来なかった。パス:'.$path);
|
||||
logger(LogType::Auth, '【mkUser】JSONファイルを作成出来なかった。パス:'.$path);
|
||||
rmdir($this->assDir.$username);
|
||||
return \Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
return Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
}
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
////////////////////
|
||||
|
||||
private function verifyLogin(string $username, #[SensitiveParameter] string $password): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
private function verifyLogin(string $username, #[SensitiveParameter] string $password): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
$userData = $this->getUserData();
|
||||
if ($username !== $userData->username || !password_verify($password, $userData->password)) {
|
||||
return \Result::Error('エラー:ユーザー名又はパスワードが一致していません。');
|
||||
return Result::Error('エラー:ユーザー名又はパスワードが一致していません。');
|
||||
}
|
||||
|
||||
if (password_needs_rehash($userData->password, $this->algo)) {
|
||||
@@ -277,31 +286,31 @@ class Auth {
|
||||
$json = json_encode($userData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
if (file_put_contents($path, $json) === false) {
|
||||
logger(\LogType::Auth, '【verifyLogin】JSONファイルを変更出来なかった。chownをご確認下さい。パス:'.$path);
|
||||
return \Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
logger(LogType::Auth, '【verifyLogin】JSONファイルを変更出来なかった。chownをご確認下さい。パス:'.$path);
|
||||
return Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
}
|
||||
}
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
private function purgeOldTokens(\stdClass $userData): \stdClass|\Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
private function purgeOldTokens(\stdClass $userData): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
// 有効期限切れたトークンの削除
|
||||
$out = $userData;
|
||||
$out->tokens = array_filter($userData->tokens, function($t): bool {
|
||||
return ($t->expDate ?? 0) > time();
|
||||
return Result::Success('', ($t->expDate ?? 0) > time());
|
||||
});
|
||||
|
||||
$path = $this->dataDir.$userData->id.'.'.$userData->username.'.json';
|
||||
$json = json_encode($userData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
if (file_put_contents($path, $json) === false) {
|
||||
logger(\LogType::Auth, '【purgeOldTokens】JSONファイルを変更出来なかった。chownをご確認下さい。パス:'.$path);
|
||||
return \Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
logger(LogType::Auth, '【purgeOldTokens】JSONファイルを変更出来なかった。chownをご確認下さい。パス:'.$path);
|
||||
return Result::Error('エラー:ユーザーデータの保存に失敗。');
|
||||
}
|
||||
|
||||
return $out;
|
||||
return Result::Success('', $out);
|
||||
}
|
||||
|
||||
private function getUserId(?string $username = null, ?string $token = null): int {
|
||||
@@ -396,8 +405,8 @@ class Auth {
|
||||
return json_decode($lines);
|
||||
}
|
||||
|
||||
private function isEmailExist(?string $email = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
private function isEmailExist(?string $email = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
$userList = scandir($this->dataDir);
|
||||
$matches = [];
|
||||
|
||||
@@ -410,67 +419,67 @@ class Auth {
|
||||
if (str_contains($content, '"email": "'.$email.'",')) {
|
||||
$matches[] = $email;
|
||||
}
|
||||
if (count($matches) > 0) return \Result::Error("ユーザー「{$email}」は既に存在します。");
|
||||
if (count($matches) > 0) return Result::Error("ユーザー「{$email}」は既に存在します。");
|
||||
}
|
||||
|
||||
return \Result::Success('エラー:メールアドレスが存在しません。');
|
||||
return Result::Success('エラー:メールアドレスが存在しません。');
|
||||
}
|
||||
|
||||
private function verifyEmail(?string $email = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $email || '' === $email) return \Result::Error('エラー:メールアドレスをご入力下さい。');
|
||||
if (strpos($email, '@') === false) return \Result::Error('エラー:メールアドレスは不正です。');
|
||||
private function verifyEmail(?string $email = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $email || '' === $email) return Result::Error('エラー:メールアドレスをご入力下さい。');
|
||||
if (strpos($email, '@') === false) return Result::Error('エラー:メールアドレスは不正です。');
|
||||
|
||||
$domain = explode('@', $email)[1];
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
return \Result::Error('エラー:メールアドレスは不正です。');
|
||||
return Result::Error('エラー:メールアドレスは不正です。');
|
||||
}
|
||||
|
||||
if (!checkdnsrr($domain, 'MX')) {
|
||||
return \Result::Error('エラー:メールアドレスは不正です。');
|
||||
return Result::Error('エラー:メールアドレスは不正です。');
|
||||
}
|
||||
|
||||
$res = $this->isEmailExist($email);
|
||||
if (!$res->isSuccess) return \Result::Error($res->message);
|
||||
if (!$res->isSuccess) return Result::Error($res->message);
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
private function verifyUsername(?string $username): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $username || '' === $username) return \Result::Error('エラー:ユーザー名をご入力下さい。');
|
||||
if (strlen($username) < 6) return \Result::Error('エラー:ユーザー名は6文字以上をご入力下さい。');
|
||||
private function verifyUsername(?string $username): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $username || '' === $username) return Result::Error('エラー:ユーザー名をご入力下さい。');
|
||||
if (strlen($username) < 6) return Result::Error('エラー:ユーザー名は6文字以上をご入力下さい。');
|
||||
|
||||
$res = $this->isUserExist($username);
|
||||
if ($res->isSuccess) return \Result::Error($res->message);
|
||||
if ($res->isSuccess) return Result::Error($res->message);
|
||||
|
||||
$accepted = 'A-Za-z0-9';
|
||||
if (preg_match("/[^{$accepted}]/", $username)) {
|
||||
return \Result::Error('エラー:ユーザー名に不正な文字が含みます。');
|
||||
return Result::Error('エラー:ユーザー名に不正な文字が含みます。');
|
||||
}
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
private function verifyPassword(#[SensitiveParameter] ?string $password = null, #[SensitiveParameter] ?string $passwordVerify = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $password || '' === $password) return \Result::Error('エラー:パスワードをご入力下さい。');
|
||||
if ($password !== $passwordVerify) return \Result::Error('エラー:パスワードは一致していません。');
|
||||
private function verifyPassword(#[SensitiveParameter] ?string $password = null, #[SensitiveParameter] ?string $passwordVerify = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (null === $password || '' === $password) return Result::Error('エラー:パスワードをご入力下さい。');
|
||||
if ($password !== $passwordVerify) return Result::Error('エラー:パスワードは一致していません。');
|
||||
|
||||
$res = $this->checkPasswordStandards($password);
|
||||
if (!$res->isSuccess) {
|
||||
return \Result::Error($res->message);
|
||||
return Result::Error($res->message);
|
||||
}
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
private function checkPasswordStandards(#[SensitiveParameter] ?string $password = null): \Result {
|
||||
if (!AUTH_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
if (strlen($password) < $this->minPassLen) return \Result::Error("エラー:パスワードは{$this->minPassLen}以上をご入力下さい。");
|
||||
private function checkPasswordStandards(#[SensitiveParameter] ?string $password = null): Result {
|
||||
if (!AUTH_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (strlen($password) < $this->minPassLen) return Result::Error("エラー:パスワードは{$this->minPassLen}以上をご入力下さい。");
|
||||
|
||||
if (!\countmatch($password)) {
|
||||
return \Result::Error('エラー:パスワードに不正な文字が含みます。');
|
||||
return Result::Error('エラー:パスワードに不正な文字が含みます。');
|
||||
}
|
||||
|
||||
$countUpper = preg_match_all('/[A-Z]/', $password) < 2;
|
||||
@@ -479,9 +488,9 @@ class Auth {
|
||||
$countSymbol = \count_special_chars($password) < 2;
|
||||
|
||||
if ($countUpper || $countLower || $countDigit || $countSymbol) {
|
||||
return \Result::Error('エラー:パスワードは2つ以上の大文字、2つ以上の小文字、2つ以上の数字、及び2つ以上の特別文字を含む事が必須です。');
|
||||
return Result::Error('エラー:パスワードは2つ以上の大文字、2つ以上の小文字、2つ以上の数字、及び2つ以上の特別文字を含む事が必須です。');
|
||||
}
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -37,6 +37,8 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
namespace Std\Lib;
|
||||
|
||||
use Result;
|
||||
|
||||
/**
|
||||
* php_curlへの依存を排除するための独自のCURL実装
|
||||
*/
|
||||
@@ -317,11 +319,11 @@ class Curl {
|
||||
*
|
||||
* @return Result 成功または失敗
|
||||
*/
|
||||
public function execute(): \Result {
|
||||
if (!CURL_ENABLED) return \Result::Error('エラー:認証システムは無効です。');
|
||||
public function execute(): Result {
|
||||
if (!CURL_ENABLED) return Result::Error('エラー:認証システムは無効です。');
|
||||
if (empty($this->url)) {
|
||||
$this->responseError = 'URLがありません';
|
||||
return \Result::Error($this->responseError);
|
||||
return Result::Error($this->responseError);
|
||||
}
|
||||
|
||||
// レスポンスデータのリセット
|
||||
@@ -355,7 +357,7 @@ class Curl {
|
||||
$parsed = parse_url($currentUrl);
|
||||
if (!$parsed) {
|
||||
$this->responseError = "無効なURL: {$currentUrl}";
|
||||
return \Result::Error($this->responseError);
|
||||
return Result::Error($this->responseError);
|
||||
}
|
||||
|
||||
$scheme = isset($parsed['scheme']) ? strtolower($parsed['scheme']) : 'http';
|
||||
@@ -476,7 +478,7 @@ class Curl {
|
||||
if ($this->verbose && $this->stderr) {
|
||||
fwrite($this->stderr, "* エラー: {$this->responseError}\n");
|
||||
}
|
||||
return \Result::Error($this->responseError);
|
||||
return Result::Error($this->responseError);
|
||||
}
|
||||
|
||||
// タイムアウトを設定
|
||||
@@ -497,7 +499,7 @@ class Curl {
|
||||
|
||||
if ($rawResponse === '') {
|
||||
$this->responseError = 'リスポンスエラー';
|
||||
return \Result::Error($this->responseError);
|
||||
return Result::Error($this->responseError);
|
||||
}
|
||||
|
||||
list($headerLines, $body) = $this->parseResponse($rawResponse);
|
||||
@@ -559,7 +561,7 @@ class Curl {
|
||||
$this->method = $originalMethod;
|
||||
$this->info['total_time'] = microtime(true) - $startTime;
|
||||
|
||||
return \Result::Success();
|
||||
return Result::Success();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,6 +38,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
namespace Std\Lib\Image;
|
||||
|
||||
use Std\Lib\Image\ImageInterface;
|
||||
use LogType;
|
||||
|
||||
class Png implements ImageInterface {
|
||||
public \stdClass $IHDR; // 画像ヘッダー
|
||||
@@ -629,7 +630,7 @@ exif_crc:
|
||||
fclose($fp);
|
||||
$err = '不明なチャンク:'.$nextChunk.'、HEX:'.bin2hex($nextChunk);
|
||||
kys($err);
|
||||
logger(\LogType::Image, '【PNG】'.$err);
|
||||
logger(LogType::Image, '【PNG】'.$err);
|
||||
return $png;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
namespace Std\Lib;
|
||||
|
||||
use LogType;
|
||||
|
||||
class Mailer {
|
||||
private $socket;
|
||||
private string $host;
|
||||
@@ -70,7 +72,7 @@ class Mailer {
|
||||
$this->socket = fsockopen($this->host, $this->port, $errno, $err, 30);
|
||||
if (!$this->socket) {
|
||||
$msg = "接続に失敗: {$err} ({$errno})";
|
||||
logger(\LogType::Mailer, $msg);
|
||||
logger(LogType::Mailer, $msg);
|
||||
throw new \Exception($msg);
|
||||
}
|
||||
|
||||
@@ -104,7 +106,7 @@ class Mailer {
|
||||
if (!stream_socket_enable_crypto(
|
||||
$this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
|
||||
$msg = "TLSハンドシェイクに失敗";
|
||||
logger(\LogType::Mailer, $msg);
|
||||
logger(LogType::Mailer, $msg);
|
||||
throw new \Exception($msg);
|
||||
}
|
||||
|
||||
@@ -198,7 +200,7 @@ class Mailer {
|
||||
$response = $this->readResponse();
|
||||
if (substr($response, 0, 3) != '250') {
|
||||
$msg = "メール送信に失敗: {$response}";
|
||||
logger(\LogType::Mailer, $msg);
|
||||
logger(LogType::Mailer, $msg);
|
||||
throw new \Exception($msg);
|
||||
}
|
||||
}
|
||||
@@ -235,7 +237,7 @@ class Mailer {
|
||||
$res = $this->readResponse();
|
||||
if (substr($res, 0, 3) != $retcode) {
|
||||
$msg = "「{$command}」に対する予期しないレスポンス: {$res}";
|
||||
logger(\LogType::Mailer, $msg);
|
||||
logger(LogType::Mailer, $msg);
|
||||
throw new \Exception($msg);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user