From 7c328d03f5f6b079edb75b323be730646ed6c53a Mon Sep 17 00:00:00 2001 From: Daichimarukana Date: Sat, 3 May 2025 23:17:23 +0900 Subject: [PATCH] uwuzu v1.5.0 Combeny --- actor/index.php | 6 +- admin/setup_db_php.php | 26 +- api/favorite/change.php | 2 - api/favorite/get.php | 2 - api/sitemap-api.php | 34 + api/ueuse/create.php | 360 +++--- api/users/follow.php | 2 - api/users/unfollow.php | 2 - api/v1/instance.php | 2 +- bookmark/index.php | 23 +- css/color.css | 3 +- css/home.css | 624 ++++++---- css/style.css | 42 +- db.php | 23 +- delete/delete.php | 1 + errorpage/overcapacity.php | 56 + function/function.php | 1025 ++++++++++++++--- function/get_customemoji.php | 81 ++ function/get_userid.php | 79 ++ function/reuse.php | 4 +- function/settings.php | 234 ++++ function/ueuse.php | 105 ++ home/index.php | 165 +-- js/view_function.js | 774 +++++++++++++ nextpage/bookmark.php | 176 --- nextpage/bookmarktimeline.php | 288 +++++ nextpage/followtimeline.php | 285 +++++ nextpage/foryoupage.php | 293 ----- nextpage/foryoutimeline.php | 403 +++++++ nextpage/ftlpage.php | 175 --- nextpage/localtimeline.php | 267 +++++ nextpage/nextpage.php | 159 --- nextpage/notification.php | 2 +- nextpage/searchpage.php | 175 --- nextpage/searchtimeline.php | 347 ++++++ nextpage/ueusepage.php | 172 --- nextpage/ueusetimeline.php | 281 +++++ nextpage/user_view.php | 54 - nextpage/userlikepage.php | 173 --- nextpage/userliketimeline.php | 278 +++++ nextpage/usermediapage.php | 165 --- nextpage/usermediatimeline.php | 275 +++++ nextpage/userpage.php | 158 --- nextpage/usertimeline.php | 268 +++++ others/cache_clear.php | 14 +- others/index.php | 137 +-- search/index.php | 19 +- server/uwuzuinfo.txt | 4 +- server/uwuzurelease.txt | 40 + settings/index.php | 327 ++---- settings_admin/ad_admin.php | 1 - settings_admin/jobs_admin.php | 231 ++++ settings_admin/overview_admin.php | 8 + settings_admin/plugin_admin.php | 86 ++ .../plugin_settings/amazons3_settings.php | 14 + settings_admin/role_admin.php | 1 - settings_admin/settings_left_menu.php | 1 + settings_admin/update_admin.php | 4 +- settings_admin/useradmin.php | 2 - settings_admin/userinfo.php | 202 +--- sw.js | 113 +- ueuse/index.php | 153 ++- update.json | 74 +- user/index.php | 118 +- uwuzu_database.sql | 30 +- uwuzu_error_code.txt | 2 - 66 files changed, 6498 insertions(+), 3152 deletions(-) create mode 100644 api/sitemap-api.php create mode 100644 errorpage/overcapacity.php create mode 100644 function/get_customemoji.php create mode 100644 function/get_userid.php create mode 100644 function/settings.php create mode 100644 function/ueuse.php create mode 100644 js/view_function.js delete mode 100644 nextpage/bookmark.php create mode 100644 nextpage/bookmarktimeline.php create mode 100644 nextpage/followtimeline.php delete mode 100644 nextpage/foryoupage.php create mode 100644 nextpage/foryoutimeline.php delete mode 100644 nextpage/ftlpage.php create mode 100644 nextpage/localtimeline.php delete mode 100644 nextpage/nextpage.php delete mode 100644 nextpage/searchpage.php create mode 100644 nextpage/searchtimeline.php delete mode 100644 nextpage/ueusepage.php create mode 100644 nextpage/ueusetimeline.php delete mode 100644 nextpage/user_view.php delete mode 100644 nextpage/userlikepage.php create mode 100644 nextpage/userliketimeline.php delete mode 100644 nextpage/usermediapage.php create mode 100644 nextpage/usermediatimeline.php delete mode 100644 nextpage/userpage.php create mode 100644 nextpage/usertimeline.php create mode 100644 settings_admin/jobs_admin.php create mode 100644 settings_admin/plugin_settings/amazons3_settings.php diff --git a/actor/index.php b/actor/index.php index 0d47419..5a633f1 100644 --- a/actor/index.php +++ b/actor/index.php @@ -24,7 +24,11 @@ if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){ $error_message[] = $e->getMessage(); } - $user = safetext($_GET['actor']); + if(isset($_GET['actor'])){ + $user = safetext($_GET['actor']); + }else{ + $user = null; + } $userid = str_replace('@','', str_replace('@'.$domain.'', '', $user)); if( !empty($pdo) ) { diff --git a/admin/setup_db_php.php b/admin/setup_db_php.php index 372e4ea..28aaebc 100644 --- a/admin/setup_db_php.php +++ b/admin/setup_db_php.php @@ -105,20 +105,22 @@ if(!(empty($_POST['btn_submit']))){ } if(empty($error_message)){ - $DB_Settings = " - - "; +define( 'RATE_LM', '60'); // レートリミット(ユーズ/分) +define( 'STOP_LA', '4'); // 自動停止ロードアベレージ上限 + +// タイムゾーン設定 +date_default_timezone_set('Asia/Tokyo'); +?> +"; //設定上書き $file = fopen('../db.php', 'w'); diff --git a/api/favorite/change.php b/api/favorite/change.php index 5f07294..db3fd45 100644 --- a/api/favorite/change.php +++ b/api/favorite/change.php @@ -6,8 +6,6 @@ require('../../db.php'); //- Base64_mime require('../../function/function.php'); blockedIP($_SERVER['REMOTE_ADDR']); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $mojisizefile = "../../server/textsize.txt"; diff --git a/api/favorite/get.php b/api/favorite/get.php index b890478..b118792 100644 --- a/api/favorite/get.php +++ b/api/favorite/get.php @@ -6,8 +6,6 @@ require('../../db.php'); //- Base64_mime require('../../function/function.php'); blockedIP($_SERVER['REMOTE_ADDR']); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $mojisizefile = "../../server/textsize.txt"; diff --git a/api/sitemap-api.php b/api/sitemap-api.php new file mode 100644 index 0000000..a8881d8 --- /dev/null +++ b/api/sitemap-api.php @@ -0,0 +1,34 @@ + + + https://$domain/ + 1.0 + + + https://$domain/new.php + 0.8 + + + https://$domain/login.php + 0.8 + + +XML; + +$test_xml = new SimpleXMLElement($xml_text); + +echo $test_xml->asXML(); +?> \ No newline at end of file diff --git a/api/ueuse/create.php b/api/ueuse/create.php index f387565..5c44828 100644 --- a/api/ueuse/create.php +++ b/api/ueuse/create.php @@ -6,8 +6,6 @@ require('../../db.php'); //- Base64_mime require('../../function/function.php'); blockedIP($_SERVER['REMOTE_ADDR']); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $mojisizefile = "../../server/textsize.txt"; @@ -88,6 +86,14 @@ if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) { $ueuse = safetext($_GET['text']); }elseif(!(empty($post_json["text"]))){ $ueuse = safetext($post_json["text"]); + }else{ + $err = "input_not_found"; + $response = array( + 'error_code' => $err, + ); + + echo json_encode($response, JSON_UNESCAPED_UNICODE); + exit; } //リプライ先取得 if(!(empty($_GET['replyid']))){ @@ -97,6 +103,14 @@ if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) { }else{ $replyid = ""; } + //リユーズ先取得 + if(!(empty($_GET['reuseid']))){ + $reuseid = safetext($_GET['reuseid']); + }elseif(!(empty($post_json["reuseid"]))){ + $reuseid = safetext($post_json["reuseid"]); + }else{ + $reuseid = ""; + } //NSFWの有無 if(!(empty($_GET['nsfw']))){ @@ -117,211 +131,155 @@ if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) { $nsfw = "false"; } - //Base64での画像送信の確認(POSTのみ&デコードは関数(Base64_mime)側でやってくれる) - $img_uid = safetext($userData["userid"]);//UserID必須 if(!(empty($post_json["image1"]))){ - $image1 = safetext($post_json["image1"]); - $UploadPath1 = base64_mime($image1,$img_uid); - if($UploadPath1 == false){ - $UploadPath1 = "none"; - } - }else{ - $UploadPath1 = "none"; - } - if(!(empty($post_json["image2"]))){ - $image2 = safetext($post_json["image2"]); - $UploadPath2 = base64_mime($image2,$img_uid); - if($UploadPath2 == false){ - $UploadPath2 = "none"; - } - }else{ - $UploadPath2 = "none"; - } - if(!(empty($post_json["image3"]))){ - $image3 = safetext($post_json["image3"]); - $UploadPath3 = base64_mime($image3,$img_uid); - if($UploadPath3 == false){ - $UploadPath3 = "none"; - } - }else{ - $UploadPath3 = "none"; - } - if(!(empty($post_json["image4"]))){ - $image4 = safetext($post_json["image4"]); - $UploadPath4 = base64_mime($image4,$img_uid); - if($UploadPath4 == false){ - $UploadPath4 = "none"; - } - }else{ - $UploadPath4 = "none"; - } - //ここまで----------------------------------------- - - $old_datetime = date("Y-m-d H:i:00"); - $now_datetime = date("Y-m-d H:i:00",strtotime("+1 minute")); - $rate_Query = $pdo->prepare("SELECT * FROM ueuse WHERE account = :userid AND TIME(datetime) BETWEEN :old_datetime AND :now_datetime"); - $rate_Query->bindValue(':userid', $userData["userid"]); - $rate_Query->bindValue(':old_datetime', $old_datetime); - $rate_Query->bindValue(':now_datetime', $now_datetime); - $rate_Query->execute(); - $rate_count = $rate_Query->rowCount(); - if(!($rate_count > $max_ueuse_rate_limit-1)){ - if( empty($ueuse) ) { - $err = "input_not_found"; - $response = array( - 'error_code' => $err, - ); - echo json_encode($response, JSON_UNESCAPED_UNICODE); - exit; - } else { - // 文字数を確認 - if( (int)safetext(file_get_contents($mojisizefile)) < mb_strlen($ueuse, 'UTF-8') ) { - $err = "content_to_".safetext(file_get_contents($mojisizefile))."_characters"; - $response = array( - 'error_code' => $err, - ); - echo json_encode($response, JSON_UNESCAPED_UNICODE); - exit; - } - // 禁止url確認 - for($i = 0; $i < count($banurl); $i++) { - if(!($banurl[$i] == "")){ - if (false !== strpos($ueuse, 'https://'.$banurl[$i])) { - $err = "contains_prohibited_url"; - $response = array( - 'error_code' => $err, - ); - - echo json_encode($response, JSON_UNESCAPED_UNICODE); - exit; - } - } - } - } - if(!(empty($replyid))){ - $rpChkQuery = $pdo->prepare("SELECT * FROM ueuse WHERE uniqid = :rpuniqid"); - $rpChkQuery->bindValue(':rpuniqid', $replyid); - $rpChkQuery->execute(); - $rpChkcount = $rpChkQuery->rowCount(); - if(empty($rpChkcount)){ - $err = "no_reply_destination"; - $response = array( - 'error_code' => $err, - ); - - echo json_encode($response, JSON_UNESCAPED_UNICODE); - exit; - } - } - - // 書き込み日時を取得 - $username = safetext($userData["username"]); - $userid = safetext($userData["userid"]); - $datetime = safetext(date("Y-m-d H:i:s")); - $uniqid = safetext(createUniqId()); - $abi = "none"; - $nones = "none"; - $popularity = 0; - - // トランザクション開始 - $pdo->beginTransaction(); - - try { - - // SQL作成 - $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, rpuniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi, nsfw, popularity) VALUES (:username, :account, :uniqid, :rpuniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi, :nsfw, :popularity)"); + $imageData = base64_decode($post_json["image1"],true); - $stmt->bindParam(':username', $username, PDO::PARAM_STR); - $stmt->bindParam(':account', $userid, PDO::PARAM_STR); - $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); - $stmt->bindParam(':rpuniqid', $replyid, PDO::PARAM_STR); - $stmt->bindParam(':ueuse', $ueuse, PDO::PARAM_STR); + $tmpFilePath = tempnam(sys_get_temp_dir(), 'upload_'.createUniqId()); + file_put_contents($tmpFilePath, $imageData); + + $Img1Files = [ + 'name' => 'upload.png', + 'type' => check_mime($tmpFilePath), + 'tmp_name' => $tmpFilePath, + 'error' => UPLOAD_ERR_OK, + 'size' => strlen($imageData), + ]; + } else { + $Img1Files = array(); + } - $stmt->bindParam(':photo1', $UploadPath1, PDO::PARAM_STR); - $stmt->bindParam(':photo2', $UploadPath2, PDO::PARAM_STR); - $stmt->bindParam(':photo3', $UploadPath3, PDO::PARAM_STR); - $stmt->bindParam(':photo4', $UploadPath4, PDO::PARAM_STR); - $stmt->bindParam(':video1', $nones, PDO::PARAM_STR); + if(!(empty($post_json["image2"]))){ + $imageData = base64_decode($post_json["image2"],true); + + $tmpFilePath = tempnam(sys_get_temp_dir(), 'upload_'.createUniqId()); + file_put_contents($tmpFilePath, $imageData); + + $Img2Files = [ + 'name' => 'upload.png', + 'type' => check_mime($tmpFilePath), + 'tmp_name' => $tmpFilePath, + 'error' => UPLOAD_ERR_OK, + 'size' => strlen($imageData), + ]; + } else { + $Img2Files = array(); + } - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + if(!(empty($post_json["image3"]))){ + $imageData = base64_decode($post_json["image3"],true); + + $tmpFilePath = tempnam(sys_get_temp_dir(), 'upload_'.createUniqId()); + file_put_contents($tmpFilePath, $imageData); + + $Img3Files = [ + 'name' => 'upload.png', + 'type' => check_mime($tmpFilePath), + 'tmp_name' => $tmpFilePath, + 'error' => UPLOAD_ERR_OK, + 'size' => strlen($imageData), + ]; + } else { + $Img3Files = array(); + } - $stmt->bindParam(':abi', $abi, PDO::PARAM_STR); - $stmt->bindParam(':nsfw', $nsfw, PDO::PARAM_STR); - $stmt->bindParam(':popularity', $popularity, PDO::PARAM_INT); - - // SQLクエリの実行 - $res = $stmt->execute(); - - // コミット - $res = $pdo->commit(); - - $mentionedUsers = array_unique(get_mentions_userid($ueuse)); - - foreach ($mentionedUsers as $mentionedUser) { - - $pdo->beginTransaction(); - - try { - $fromuserid = safetext($userid); - $touserid = safetext($mentionedUser); - $datetime = safetext(date("Y-m-d H:i:s")); - $msg = "" . $ueuse . ""; - $title = "" . safetext($username) . "さんにメンションされました!"; - $url = "/!" . safetext($uniqid) . ""; - $userchk = 'none'; - - // 通知用SQL作成 - $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - - $stmt->bindParam(':fromuserid', $fromuserid, PDO::PARAM_STR); - $stmt->bindParam(':touserid', $touserid, PDO::PARAM_STR); - $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); - $stmt->bindParam(':url', $url, PDO::PARAM_STR); - $stmt->bindParam(':userchk', $userchk, PDO::PARAM_STR); - $stmt->bindParam(':title', $title, PDO::PARAM_STR); - - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); - - // SQLクエリの実行 - $res = $stmt->execute(); - - // コミット - $res = $pdo->commit(); - - } catch(Exception $e) { - - // エラーが発生した時はロールバック - $pdo->rollBack(); - } - - } - - } catch(Exception $e) { - - // エラーが発生した時はロールバック - $pdo->rollBack(); - } - - if( $res ) { - $response = array( - 'uniqid' => decode_yajirushi(htmlspecialchars_decode($uniqid)), - 'userid' => decode_yajirushi(htmlspecialchars_decode($userid)), - ); - - echo json_encode($response, JSON_UNESCAPED_UNICODE); - } else { - $err = "db_error_".$e->getMessage(); - $response = array( - 'error_code' => $err, - ); - - echo json_encode($response, JSON_UNESCAPED_UNICODE); - } - - // プリペアドステートメントを削除 - $stmt = null; + if(!(empty($post_json["image4"]))){ + $imageData = base64_decode($post_json["image4"],true); + + $tmpFilePath = tempnam(sys_get_temp_dir(), 'upload_'.createUniqId()); + file_put_contents($tmpFilePath, $imageData); + + $Img4Files = [ + 'name' => 'upload.png', + 'type' => check_mime($tmpFilePath), + 'tmp_name' => $tmpFilePath, + 'error' => UPLOAD_ERR_OK, + 'size' => strlen($imageData), + ]; + } else { + $Img4Files = array(); + } + + $settingsJson = getUserData($pdo, $userData["userid"])["other_settings"]; + if(!(empty($settingsJson))){ + $isAIBWM = val_OtherSettings("isAIBlockWaterMark", $settingsJson); }else{ - $err = "over_rate_limit"; + $isAIBWM = false; + } + + $video1 = array(); + + $ueuse_result = send_ueuse($userData["userid"],$replyid,$reuseid,$ueuse,$Img1Files,$Img2Files,$Img3Files,$Img4Files,$video1,$nsfw,$isAIBWM, "../"); + + + if($ueuse_result[0] == true){ + $response = array( + 'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueuse_result[1])), + 'userid' => decode_yajirushi(htmlspecialchars_decode($userData["userid"])), + ); + + echo json_encode($response, JSON_UNESCAPED_UNICODE); + }else{ + $errcode = $ueuse_result[1][0]; + switch (true) { + case strpos($errcode, 'ACCOUNT_HAS_BEEN_FROZEN' ) !==false: + $err = "this_account_has_been_frozen"; + break; + case strpos($errcode, 'INPUT_PLEASE' ) !==false: + $err = "input_not_found"; + break; + case strpos($errcode, 'INPUT_OVER_MAX_COUNT' ) !==false: + $err = "content_to_".safetext(file_get_contents($mojisizefile))."_characters"; + break; + case strpos($errcode, 'INPUT_CONTAINS_PROHIBITED_URL' ) !==false: + $err = "contains_prohibited_url"; + break; + case strpos($errcode, 'FILE_DEKASUGUI_PHP_INI_KAKUNIN' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'FILE_DEKASUGUI_HTML_KAKUNIN' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'FILE_SUKOSHIDAKE_UPLOAD' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'FILE_UPLOAD_DEKINAKATTA' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'TMP_FOLDER_NAI' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'FILE_KAKIKOMI_SIPPAI' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'PHPINFO()_KAKUNIN' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'S3ERROR' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'SORRY_FILE_HITAIOU' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'FILE_UPLOAD_DEKINAKATTA' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'PHOTO_SELECT_PLEASE' ) !==false: + $err = "upload_error"; + break; + case strpos($errcode, 'REGISTERED_DAME' ) !==false: + $err = "could_not_complete"; + break; + case strpos($errcode, 'OVER_RATE_LIMIT' ) !==false: + $err = "over_rate_limit"; + break; + case strpos($errcode, 'ERROR' ) !==false: + $err = "could_not_complete"; + break; + default: + $err = "could_not_complete"; + break; + } + $response = array( 'error_code' => $err, ); diff --git a/api/users/follow.php b/api/users/follow.php index 27dba26..7f52f72 100644 --- a/api/users/follow.php +++ b/api/users/follow.php @@ -6,8 +6,6 @@ require('../../db.php'); //- Base64_mime require('../../function/function.php'); blockedIP($_SERVER['REMOTE_ADDR']); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $mojisizefile = "../../server/textsize.txt"; diff --git a/api/users/unfollow.php b/api/users/unfollow.php index 82d8d97..0b04050 100644 --- a/api/users/unfollow.php +++ b/api/users/unfollow.php @@ -6,8 +6,6 @@ require('../../db.php'); //- Base64_mime require('../../function/function.php'); blockedIP($_SERVER['REMOTE_ADDR']); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $mojisizefile = "../../server/textsize.txt"; diff --git a/api/v1/instance.php b/api/v1/instance.php index f973d08..697c0a2 100644 --- a/api/v1/instance.php +++ b/api/v1/instance.php @@ -1,5 +1,5 @@ + @@ -237,27 +238,33 @@ $pdo = null; $(document).ready(function () { var userid = ''; var account_id = ''; - - loadPosts(); + view_ueuse_init(userid, account_id); var pageNumber = 1; var isLoading = false; + loadPosts(); function loadPosts() { if (isLoading) return; isLoading = true; $("#loading").show(); $.ajax({ - url: '../nextpage/bookmark.php', // PHPファイルへのパス - method: 'GET', + url: '../nextpage/bookmarktimeline.php', + method: 'POST', data: { page: pageNumber, userid: userid, account_id: account_id }, - dataType: 'html', - success: function (response) { - $('#postContainer').append(response); + dataType: 'json', + timeout: 300000, + success: function(response) { + renderUeuses(response); pageNumber++; isLoading = false; $("#loading").hide(); - } + }, + error: function(xhr, textStatus, errorThrown) { + isLoading = false; + $("#loading").hide(); + $("#error").show(); + }, }); } diff --git a/css/color.css b/css/color.css index 9f597d6..afc236a 100644 --- a/css/color.css +++ b/css/color.css @@ -4,7 +4,7 @@ --sub-color: #FFFAE6; --background-color: #F5F5F5; --tl-color: #F7F7F7; - --ueuse-color:#f5f5f5; + --ueuse-color:#F9F9F9; --text-color: #252525; --subtext-color: #999; --link-color: #4e4428; @@ -20,6 +20,7 @@ --dark-background-color: #0c0c0c; --dark-subtext-color: #CCC; --dark-text-color: #FFF; + --dark-border-color: #252525; /*HeadingFonts*/ --Head-fonts: "Zen Maru Gothic"; /*TextFonts*/ diff --git a/css/home.css b/css/home.css index e0bdf43..792d027 100644 --- a/css/home.css +++ b/css/home.css @@ -56,22 +56,20 @@ body{ text-align: center; border-radius: 50px; - color:var(--background-color); + color:var(--dark-text-color); font-size: 18px; font-family: var(--Head-fonts), sans-serif; font-weight: normal; text-decoration:none; text-align: center; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .15); transition: all 250ms ease-in-out; } .irobutton:hover{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); - padding: 6px 24px; + padding: 6px 22px; } .irobutton:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - padding: 6px 8px; + background-color: color-mix(in srgb, var(--main-color) 90%, #000); + padding: 6px 12px; } .sirobutton{ @@ -86,24 +84,22 @@ body{ text-align: center; - background-color: var(--sub-color); + background-color: var(--dark-subtext-color); + color: var(--dark-text-color); border-radius: 50px; - color:var(--main-color); font-size: 18px; font-family: var(--Head-fonts), sans-serif; font-weight: normal; text-decoration:none; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .15); transition: all 250ms ease-in-out; + border: transparent 1px solid; } .sirobutton:hover{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); - padding: 6px 24px; + padding: 6px 22px; } .sirobutton:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); - padding: 6px 8px; + padding: 6px 12px; } .inbox { @@ -359,16 +355,13 @@ textarea{ .userleftbox{ border-radius: 17px; margin-top: 12px; - margin-left: 12px; + margin-left: 0px; margin-right: 12px; margin-bottom: 12px; - background-color: var(--tl-color); width: 240px; height: 100%; margin-left: 0px; - padding: 32px; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - border: 1px solid var(--main-color); + padding: 0px; } .userleftbox h1{ @@ -400,44 +393,6 @@ textarea{ margin-bottom: -4px; } -.leftbutton_on{ - cursor: pointer; - border: none; - display: block; - width:80%; - margin: 16px; - padding: 8px auto; - margin-left: auto; - margin-right: auto; - - padding-left: 16px; - padding-top: 8px; - padding-bottom: 8px; - - - background-color: var(--sub-color); - - border-radius: 50px; - color:var(--main-color); - font-size: 20px; - font-family: var(--Head-fonts), sans-serif; - font-weight: bold; - text-decoration:none; - text-align: left; - align-items: center; - transition: all 250ms ease-out; -} -.leftbutton_on:hover{ - background-color: var(--main-color); - color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); - width:85%; -} -.leftbutton_on:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - width:78%; -} - .leftbutton{ cursor: pointer; @@ -453,8 +408,7 @@ textarea{ padding-top: 8px; padding-bottom: 8px; - - background-color: var(--background-color)FFF; + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -548,8 +502,8 @@ main{ margin-right: 12px; width: 60%; background-color: var(--tl-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - border: 1px solid var(--main-color); + box-shadow:0 0px 48px 0 rgba(0, 0, 0, .025); + border: 1px solid var(--border-color); } main h1{ @@ -769,11 +723,9 @@ main h1{ .fzone .follow .fbtn:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .fzone .follow .fbtn:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -811,11 +763,9 @@ main h1{ .fzone .follow .fbtn_no:hover{ background-color: var(--sub-color); color: var(--main-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .fzone .follow .fbtn_no:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -852,11 +802,9 @@ main h1{ .fzone .follow .fbtn_un:hover{ background-color: var(--sub-color); color: var(--text-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .fzone .follow .fbtn_un:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -893,11 +841,9 @@ main h1{ background-color: color-mix(in srgb, var(--tl-color) 90%, var(--error)); color: var(--error); border: 1px solid var(--error); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:32px; } .fzone .follow .report:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:22px; } .fzone .follow .report svg{ @@ -1032,20 +978,27 @@ main h1{ width: 100%; height: auto; vertical-align:top; + transition: all 0.5s ease; +} +.ads a img:hover{ + cursor: pointer; + filter: saturate(125%) brightness(110%); } .ueuse{ animation: slideInY 0.5s cubic-bezier(0.25, 1, 0.5, 1) 1 forwards; - margin: 12px; - border-radius: 10px; + margin: 0px; + border-radius: 0px; padding-left: 24px; padding-right: 24px; padding-top: 16px; padding-bottom: 16px; background-color: var(--ueuse-color); - border: 1px solid var(--border-color); + border-bottom: 1px solid var(--border-color); + box-shadow: 0 -1px 0 var(--border-color); width: auto; overflow: hidden; } + @keyframes slideInY { 0% { transform: translateY(24px); @@ -1131,12 +1084,15 @@ main h1{ font-size: 12px; color:var(--main-color); } +.ueuse .content{ + margin-left: 60px; +} .ueuse p{ line-height:20px; overflow-wrap: break-word; margin-top: auto; margin-bottom: auto; - margin-left: 60px; + margin-left: 0px; font-size: 16px; color:var(--text-color); text-decoration: none; @@ -1161,6 +1117,24 @@ main h1{ vertical-align: top; } +.ueuse .codeblock{ + width: calc(100% - 12px); + margin-left: 0px; + margin-right: 0px; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + padding-bottom: 3px; + background-color: #DDDDDD; + color: #323232; + border-radius: 5px; + font-size: calc(100% - 2px); + text-decoration: none; + font-family: var(--Mono-fonts), sans-serif; + font-weight: bold; + vertical-align: top; +} + .ueuse .quote{ width: fit-content; border-left: 5px solid; @@ -1219,7 +1193,7 @@ main h1{ overflow-wrap: break-word; margin-top: auto; margin-bottom: auto; - margin-left: 60px; + margin-left: 0px; font-size: 48px; color:var(--text-color); text-decoration: none; @@ -1231,7 +1205,7 @@ main h1{ overflow-wrap: break-word; margin-top: auto; margin-bottom: auto; - margin-left: 60px; + margin-left: 0px; font-size: 32px; color:var(--text-color); text-decoration: none; @@ -1243,7 +1217,7 @@ main h1{ overflow-wrap: break-word; margin-top: auto; margin-bottom: auto; - margin-left: 60px; + margin-left: 0px; font-size: 24px; color:var(--text-color); text-decoration: none; @@ -1376,12 +1350,16 @@ main h1{ } .ueuse .photo1 a img{ + background: linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%), linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%); + background-color: #FFF; + background-size: 20px 20px; + background-position: 0 0, 10px 10px; object-fit: cover; border-radius: 10px; margin-top: 12px; margin-left: auto; margin-right: auto; - width: 100%; + width: calc(100% - 2px); height: 350px; border: 1px solid var(--border-color); cursor: pointer; @@ -1393,12 +1371,16 @@ main h1{ } .ueuse .photo2 a img{ + background: linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%), linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%); + background-color: #FFF; + background-size: 20px 20px; + background-position: 0 0, 10px 10px; object-fit: cover; border-radius: 10px; margin-top: 12px; margin-left: auto; margin-right: auto; - width: 100%; + width: calc(100% - 2px); height: 350px; border: 1px solid var(--border-color); cursor: pointer; @@ -1414,23 +1396,31 @@ main h1{ width: 100%; } .ueuse .photo3 a img{ + background: linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%), linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%); + background-color: #FFF; + background-size: 20px 20px; + background-position: 0 0, 10px 10px; object-fit: cover; border-radius: 10px; margin-top: 12px; margin-left: auto; margin-right: auto; - width: 100%; + width: calc(100% - 2px); height: 200px; border: 1px solid var(--border-color); cursor: pointer; } .ueuse .photo3_btm a img{ + background: linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%), linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%); + background-color: #FFF; + background-size: 20px 20px; + background-position: 0 0, 10px 10px; object-fit: cover; border-radius: 10px; margin-top: 12px; margin-left: auto; margin-right: auto; - min-width: 100%; + min-width: calc(100% - 2px); height: 200px; border: 1px solid var(--border-color); cursor: pointer; @@ -1441,12 +1431,16 @@ main h1{ justify-content: space-between; } .ueuse .photo4 a img{ + background: linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%), linear-gradient(45deg, #EEE 25%, transparent 25%, transparent 75%, #EEE 75%); + background-color: #FFF; + background-size: 20px 20px; + background-position: 0 0, 10px 10px; object-fit: cover; border-radius: 10px; margin-top: 12px; margin-left: auto; margin-right: auto; - width: 100%; + width: calc(100% - 2px); height: 200px; border: 1px solid var(--border-color); cursor: pointer; @@ -1457,7 +1451,7 @@ main h1{ margin-top: 12px; margin-left: auto; margin-right: auto; - width: 100%; + width: calc(100% - 2px); height: 350px; border: 1px solid var(--border-color); } @@ -1598,8 +1592,7 @@ main h1{ padding-left: 12px; padding-right: 12px; - - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -1610,7 +1603,25 @@ main h1{ text-align: center; transition: all 250ms ease-out; } +.ueuse .favbox .favbtn:hover{ + cursor: pointer; + border: none; + display: block; + width:auto; + background-color: var(--main-color); + + border-radius: 50px; + color: var(--sub-color);; + font-size: 16px; + font-family: var(--Head-fonts), sans-serif; + font-weight: normal; + text-decoration:none; + text-align: center; + transition: box-shadow 250ms ease-in-out; + transition: width 250ms ease-out; + transition: all 250ms ease-out; +} .ueuse .favbox .favbtn_after{ cursor: pointer; border: none; @@ -1677,7 +1688,7 @@ main h1{ padding-right: 12px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -1688,7 +1699,6 @@ main h1{ text-align: center; transition: all 250ms ease-out; } - .ueuse .favbox .tuduki:hover{ cursor: pointer; border: none; @@ -1738,7 +1748,7 @@ main h1{ padding-right: 12px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -1780,7 +1790,7 @@ main h1{ margin-top: 2px; margin-bottom: 2px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color: var(--error); font-size: 16px; @@ -1828,7 +1838,7 @@ main h1{ margin-top: 2px; margin-bottom: 2px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color: var(--main-color); font-size: 16px; @@ -1874,7 +1884,7 @@ main h1{ padding-right: 12px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -2018,7 +2028,7 @@ main h1{ padding-right: 12px; - background-color: var(--sub-color); + background-color: transparent; border-radius: 50px; color:var(--main-color); @@ -2097,7 +2107,7 @@ main h1{ border: 1px solid var(--border-color); background-color: var(--background-color); padding: 12px; - border-radius: 8px; + border-radius: 10px; } .ueuse .nsfw .btnzone{ display: block; @@ -2154,7 +2164,6 @@ main h1{ width: 100%; height: 74px; border-radius: 7px; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); } .ueuse .flebox .user{ margin-bottom: 12px; @@ -2343,15 +2352,42 @@ main h1{ font-weight: bold; } +.send_progress{ + display: none; + width: 100%; + height: 2px; + margin: 0px; + overflow: hidden; + box-shadow: 0 -1px 0 var(--border-color); + animation: progressView 250ms ease-out 1 forwards; +} +.send_progress .per{ + width: 0px; + margin: 0px; + height: 2px; + background-color: var(--main-color); + transition: width 500ms ease-in; +} +@keyframes progressView { + 0% { + height: 0px; + opacity: 0; + } + 100% { + height: 2px; + opacity: 1; + } +} .sendbox{ - margin: 12px; - border-radius: 10px; + margin: 0px; + border-radius: 0px; padding-left: 24px; padding-right: 24px; padding-top: 24px; padding-bottom: 24px; background-color: var(--ueuse-color); - border: 1px solid var(--border-color); + border-top: solid 1px var(--border-color); + box-shadow: 0 1px 0 var(--border-color); width: auto; } @@ -2414,8 +2450,8 @@ main h1{ height: 24px; padding: 6px 6px; - margin-left: 6px; - margin-right: 6px; + margin-left: 0px; + margin-right: 12px; padding-top: 6px; padding-bottom: 6px; @@ -3005,11 +3041,9 @@ label>input { .imgbtn:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); padding: 4px 22px; } .imgbtn:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); padding: 4px 12px; } @@ -3039,11 +3073,9 @@ label>input { .imgbtn2:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); padding: 4px 22px; } .imgebtn2:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); padding: 4px 12px; } @@ -3166,11 +3198,9 @@ label>input { .modal-content .fbtn:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .modal-content .fbtn:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -3206,11 +3236,9 @@ label>input { .modal-content .fbtn_no:hover{ background-color: var(--sub-color); color: var(--main-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .modal-content .fbtn_no:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -3349,36 +3377,39 @@ label>input { top: 0; left: 0; width: 100%; - height: 44px; - padding-top: 0.0%; - padding-bottom: 0.2%; - padding-left: 23%; + height: 47px; background-color: var(--main-color); - box-shadow: 0px 0px 30px rgba(0,0,0,0.1); font-family: var(--Text-fonts), sans-serif; font-weight: bold; font-size: 2em; text-align: left; color: var(--background-color); - + border-bottom: 1px solid color-mix(in srgb, var(--main-color) 95%, #000); +} +.topbox .logo{ + width: 1080px; + max-width: 95%; + margin: 0px auto; } - .topbox .logo img{ margin-left: 0px; margin-right: auto; - margin-top: 2px; - height: 44px; + margin-top: 0px; + height: 47px; } .terms{ overflow-wrap: break-word; margin-left: auto; margin-right: auto; - width: 77%; + width: calc(1080px - 64px); margin-top: 64px; margin-bottom: 64px; - background-color: var(--background-color); + background-color: var(--ueuse-color); + border: solid 1px var(--border-color); + padding: 32px; + border-radius: 15px; } .terms h1{ @@ -3623,6 +3654,7 @@ label>input { text-align: center; margin-left: auto; margin-right: auto; + background: transparent; } .terms .err404 h1{ @@ -3649,16 +3681,13 @@ label>input { .rightbox{ position: relative; - border-radius: 17px; + border-radius: 0px; margin-top: 12px; margin-left: 12px; margin-right: 12px; - width: 260px; + width: 280px; height: 92.5dvh; - background-color: var(--tl-color); - padding: 12px; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - border: 1px solid var(--main-color); + padding: 0px; } .rightbox h1{ @@ -3688,7 +3717,7 @@ label>input { margin-left: auto; margin-right: auto; width: auto; - background-color: var(--background-color); + background-color: var(--ueuse-color); border: 1px solid var(--border-color); width: auto; padding: 12px; @@ -3904,8 +3933,8 @@ label>input { display: flex; flex-wrap: wrap; justify-content: space-between; - padding: 12px; - padding-top: 0px; + padding: 24px; + padding-top: 24px; } .emojizone .tokonone{ width: calc(50% - 32px); @@ -3921,15 +3950,16 @@ label>input { margin-bottom: 30px; } .emjtex{ - width: calc(50% - 32px); + width: calc(50% - 36px); background-color: var(--ueuse-color); margin-top: 0px; margin-left: 0px; margin-right: 0px; - margin-bottom: 12px; + margin-bottom: 24px; padding: 12px; border-radius: 10px; border: 1px solid var(--border-color); + box-shadow: none; transition: all 250ms ease-out; } .emjtex:hover{ @@ -3982,17 +4012,36 @@ label>input { font-weight: bold; } +.rp{ + display: flex; + width: 100%; + height: fit-content; +} .rp p{ overflow-wrap: break-word; margin-top: 0px; margin-bottom: 6px; - margin-left: 12px; - font-size: 16px; + margin-left: 6px; + font-size: 14px; color:var(--text-color); text-decoration: none; font-family: var(--Text-fonts), sans-serif; font-weight: bold; } +.rp .here{ + margin-right: 8px; + width: 12px; + height: 12px; + background-color: var(--main-color); + border-radius: 50%; +} +.rp .totop{ + width: 14px; + height: 8px; + border-left: 2px solid var(--text-color); + border-bottom: 2px solid var(--text-color); + border-bottom-left-radius: 6px; +} .ru{ display: flex; width: 100%; @@ -4039,16 +4088,19 @@ label>input { } .notification{ animation: slideInY 0.5s cubic-bezier(0.25, 1, 0.5, 1) 1 forwards; - margin: 12px; - border-radius: 10px; + margin: 0px; + border-radius: 0px; padding-left: 24px; padding-right: 24px; padding-top: 16px; padding-bottom: 16px; - background-color: var(--background-color); - border: 1px solid var(--border-color); + background-color: var(--ueuse-color); + border-bottom: 1px solid var(--border-color); width: auto; } +.notification:first-child{ + border-top: 1px solid var(--border-color); +} @keyframes slideInY { 0% { transform: translateY(24px); @@ -4321,7 +4373,7 @@ label>input { margin-top: auto; margin-bottom: auto; margin-left: auto; - margin-right: 12px; + margin-right: 0px; text-align: right; font-size: 12px; color:var(--subtext-color); @@ -4512,10 +4564,10 @@ hr{ } .tlchange{ - border-radius: 10px; - margin: 12px; + border-radius: 0px; + margin: 0px; background-color: var(--ueuse-color); - border: 1px solid var(--border-color); + box-shadow: 0 1px 0 var(--border-color); width: auto; text-align: center; display: flex; @@ -4538,6 +4590,8 @@ hr{ display: inline-block; border: none; cursor: pointer; + + padding: 0px; } .tlchange .on{ color: var(--main-color); @@ -4610,35 +4664,40 @@ hr{ cursor: pointer; } .switch_label { - width: 48px; - height: 24px; - background: var(--dark-subtext-color); + width: 50px; + height: 26px; + background: color-mix(in srgb, var(--background-color) 90%, #000); position: relative; display: inline-block; border-radius: 25px; transition: 0.4s; box-sizing: border-box; + border: solid 1px color-mix(in srgb, var(--background-color) 85%, #000); } .switch_label:after { content: ""; position: absolute; - margin-top: 2px; - margin-left: 2px; - width: 20px; - height: 20px; + margin-top: 4px; + margin-left: 4px; + width: 16px; + height: 16px; border-radius: 50%; left: 0; top: 0; z-index: 2; background: var(--background-color); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); transition: 0.2s; } .switch_input:checked + .switch_label { background-color: var(--main-color); + border: solid 1px var(--main-color); } .switch_input:checked + .switch_label:after { left: 24px; + margin-top: 2px; + margin-left: 2px; + width: 20px; + height: 20px; } .switch_button { position: relative; @@ -5155,7 +5214,7 @@ summary { width: 50%; background-color: var(--background-color); padding: 12px; - border-radius: 8px; + border-radius: 10px; border: 1px solid var(--border-color); } .overview_cnt_r{ @@ -5164,7 +5223,7 @@ summary { width: 50%; background-color: var(--background-color); padding: 12px; - border-radius: 8px; + border-radius: 10px; border: 1px solid var(--border-color); } .overview p{ @@ -5948,7 +6007,7 @@ noscript .noscript_modal .inner .center_text p{ } main{ - height: 100dvh; + height: 94dvh; overflow: auto; border-radius: 0px; margin-top: 0px; @@ -6082,6 +6141,7 @@ noscript .noscript_modal .inner .center_text p{ background-color: var(--tl-color); border-top: 1px solid var(--border-color); z-index: 9999; + height: 6dvh; } .botbox .lbtnzone{ @@ -6281,14 +6341,13 @@ noscript .noscript_modal .inner .center_text p{ } .ueuse{ animation: slideInY 0.5s cubic-bezier(0.25, 1, 0.5, 1) 1 forwards; - margin: 12px; - border-radius: 10px; + margin: 0px; + border-radius: 0px; padding-left: 12px; padding-right: 12px; padding-top: 12px; padding-bottom: 12px; background-color: var(--ueuse-color); - border: 1px solid var(--border-color); width: auto; } @@ -6411,11 +6470,9 @@ noscript .noscript_modal .inner .center_text p{ .imgbtn:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:35%; } .imgebtn:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:45%; } @@ -6449,11 +6506,9 @@ noscript .noscript_modal .inner .center_text p{ .imgbtn2:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:19%; } .imgebtn2:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:21%; } @@ -6466,18 +6521,18 @@ noscript .noscript_modal .inner .center_text p{ margin-left: 0px; margin-right: 0px; height: 44px; - padding-top: 0.0%; - padding-bottom: 0.2%; - padding-left: 0; margin-left: auto; margin-right: auto; } + .topbox .logo{ + width: 92%; + } .topbox .logo img{ margin-left: 0px; margin-right: auto; - margin-top: 2px; - width: 120px; + margin-top: 0px; + width: fit-content; } .terms{ @@ -6485,9 +6540,11 @@ noscript .noscript_modal .inner .center_text p{ margin-left: auto; margin-right: auto; width: 90%; + padding: 0px; margin-top: 64px; margin-bottom: 64px; - background-color: var(--background-color); + border: none !important; + background-color: transparent !important; } .terms h1{ @@ -6857,7 +6914,8 @@ noscript .noscript_modal .inner .center_text p{ overflow: scroll; padding: 24px; bottom: 0px; - left: 0; + left: 50%; + transform: translate(-50%, -50%); animation: SlideUp .5s ease-in-out forwards; } @@ -6940,34 +6998,36 @@ noscript .noscript_modal .inner .center_text p{ .modal-content.slideDown { animation: SlideDown .15s ease-in-out forwards; } + .modal-content .modal-follow-area{ + max-height: 40dvh; + } /*下から上*/ @keyframes SlideUp { 0% { - opacity: 0; - transform: translateY(-1%); + opacity: 0; + transform: translate(-50%, -1%); } 100% { - opacity: 1; - transform: translateY(-40%); + opacity: 1; + transform: translate(-50%, -40%); } } /*上から下*/ @keyframes SlideDown { 0% { - opacity: 1; - transform: translateY(-40%); + opacity: 1; + transform: translate(-50%, -40%); } 100% { - opacity: 0; - transform: translateY(-1%); + opacity: 0; + transform: translate(-50%, -1%); } } - .modal-content .modal-follow-area{ - max-height: 40dvh; - } + .Image_modal{ -moz-box-sizing: border-box; box-sizing: border-box; + height: 100dvh; } .Image_modal .modal-content { padding: 0px; @@ -6977,10 +7037,10 @@ noscript .noscript_modal .inner .center_text p{ max-width: 90%; max-height: 90dvh; position: absolute; - top: 45%; - right: 0; - bottom: 45%; - left: 0; + top: 50%; + left: 50%; + right: 0%; + transform: translate(-50%, -50%); margin: auto; margin-top: 0px; margin-bottom: 0px; @@ -6999,10 +7059,39 @@ noscript .noscript_modal .inner .center_text p{ vertical-align:top; object-fit: contain; } + .Image_modal .modal-content.slideUp { + animation: I-SlideUp .3s ease-out forwards; + } + .Image_modal .modal-content.slideDown { + animation: I-SlideDown .15s ease-in-out forwards; + } + /*下から上*/ + @keyframes I-SlideUp { + 0% { + opacity: 0; + transform: translate(-50%, -1%); + } + 100% { + opacity: 1; + transform: translate(-50%, calc(-50% - 6dvh)); + } + } + /*上から下*/ + @keyframes I-SlideDown { + 0% { + opacity: 1; + transform: translate(-50%, calc(-50% - 6dvh)); + } + 100% { + opacity: 0; + transform: translate(-50%, -1%); + } + } .tlchange{ - border-radius: 10px; - margin: 12px; + border-radius: 0px; + margin: 0px; + margin-top: 0px; margin-bottom: 0px; width: auto; text-align: center; @@ -7016,7 +7105,6 @@ noscript .noscript_modal .inner .center_text p{ overflow-wrap: break-word; margin-top: 12px; margin-bottom: 12px; - font-size: 24px; } .tlchange .on{ width: 30%; @@ -7026,7 +7114,6 @@ noscript .noscript_modal .inner .center_text p{ overflow-wrap: break-word; margin-top: 12px; margin-bottom: 12px; - font-size: 24px; } .hny{ @@ -7113,7 +7200,7 @@ noscript .noscript_modal .inner .center_text p{ cursor: pointer; border: none; display: block; - width:80%; + width: calc(100% - 48px); margin: 8px; padding: 8px auto; margin-left: auto; @@ -7124,7 +7211,7 @@ noscript .noscript_modal .inner .center_text p{ padding-bottom: 4px; - background-color: var(--background-color)FFF; + background-color: var(--background-color); border-radius: 50px; color:var(--main-color); @@ -7141,11 +7228,11 @@ noscript .noscript_modal .inner .center_text p{ background-color: var(--main-color); color: var(--sub-color); box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); - width:85%; + width: calc(100% - 24px); } .admin_leftbtn:active{ box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); - width:75%; + width: calc(100% - 64px); } .bot_menu_area{ @@ -7266,9 +7353,15 @@ noscript .noscript_modal .inner .center_text p{ .emojizone{ display: block; + padding: 0px; } .emjtex{ width: auto; + margin: 0px; + border: none; + border-top: var(--border-color) solid 1px; + box-shadow: 0 1px 0 var(--border-color); + border-radius: 0px; } .emjtex .fx{ display: block; @@ -7337,6 +7430,13 @@ noscript .noscript_modal .inner .center_text p{ body{ background-color: var(--dark-background-color); } + + .sirobutton{ + background-color: var(--dark-background-color); + color:var(--main-color); + border: solid 1px var(--dark-border-color); + } + .errmsg{ background-color: color-mix(in srgb, var(--dark-sub-color) 90%, var(--error)); color:var(--error); @@ -7348,12 +7448,12 @@ noscript .noscript_modal .inner .center_text p{ } .userleftbox{ - background-color: var(--dark-sub-color); + background-color: transparent; border: none; } .leftbutton{ - background-color: var(--dark-sub-color); + background-color: transparent; color:var(--sub-color); } .leftbutton:hover{ @@ -7366,8 +7466,9 @@ noscript .noscript_modal .inner .center_text p{ } main{ - background-color: var(--dark-background-color); - border: none; + background-color: var(--dark-sub-color); + box-shadow:0 0px 48px 0 rgba(0, 0, 0, .025); + border: 1px solid var(--dark-border-color); } main h1{ @@ -7379,7 +7480,8 @@ noscript .noscript_modal .inner .center_text p{ .ueuse{ background-color: var(--dark-sub-color); - border: none; + box-shadow: 0 -1px 0 var(--dark-border-color); + border-bottom: 1px solid var(--dark-border-color); } .ueuse .flebox a{ color:var(--sub-color); @@ -7452,21 +7554,29 @@ noscript .noscript_modal .inner .center_text p{ color:var(--dark-subtext-color); } - .ueuse .photo1 img{ - border: none; + .ueuse .photo1 a img{ + border: 1px solid var(--dark-border-color); } - .ueuse .photo2 img{ - border: none; + .ueuse .photo2 a img{ + border: 1px solid var(--dark-border-color); + } + + .ueuse .photo3 a img{ + border: 1px solid var(--dark-border-color); + } + + .ueuse .photo4 a img{ + border: 1px solid var(--dark-border-color); } .ueuse .video1 video{ - border: none; + border: 1px solid var(--dark-border-color); } .ueuse .abi{ background-color: var(--dark-background-color); - border: none; + border: 1px solid var(--dark-border-color); } .ueuse .abi p{ @@ -7496,86 +7606,109 @@ noscript .noscript_modal .inner .center_text p{ .ueuse .favbox .favbtn{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); + } + .ueuse .favbox .favbtn:hover{ + background-color: var(--main-color); + color:var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .favbtn_after{ background-color: var(--main-color); color:var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .tuduki{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .tuduki:hover{ background-color: var(--main-color); color:var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .reuse{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .reuse:hover{ background-color: var(--main-color); color:var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .reuse_after{ background-color: var(--main-color); color:var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .etcbtn{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .etcbtn:hover{ background-color: var(--main-color); color: var(--sub-color); + border: solid 1px var(--main-color); } .ueuse .favbox .delbtn{ background-color: var(--dark-background-color); color:var(--error); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .delbtn:hover{ background-color: var(--error); - color: var(--background-color);; + color: var(--background-color); + border: solid 1px var(--error); } .ueuse .favbox .addabi{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .addabi:hover{ background-color: var(--main-color); color: var(--sub-color);; + border: solid 1px var(--main-color); } .ueuse .favbox .share{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .share:hover{ background-color: var(--main-color); color: var(--sub-color);; + border: solid 1px var(--main-color); } .ueuse .favbox .bookmark{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .ueuse .favbox .bookmark:hover{ background-color: var(--main-color); color: var(--sub-color);; + border: solid 1px var(--main-color); } .ueuse .favbox .bookmark_after{ background-color: var(--main-color); color: var(--sub-color); + border: solid 1px var(--main-color); } .ueuse hr{ - border-top: 1px solid var(--dark-subtext-color); + border-top: 1px solid var(--dark-border-color); } .ueuse .nsfw{ - border: none; + border: 1px solid var(--dark-border-color); background-color: var(--dark-background-color); } .ueuse .nsfw_main{ - border: none; + border: 1px solid var(--dark-border-color); } .ueuse .profilebox p{ @@ -7601,7 +7734,7 @@ noscript .noscript_modal .inner .center_text p{ .ueuse .reuse_box{ background-color: var(--dark-background-color); - border: none; + border: 1px solid var(--dark-border-color); } .ueuse .reuse_box .reuse_flebox a { color:var(--sub-color); @@ -7614,6 +7747,9 @@ noscript .noscript_modal .inner .center_text p{ border: none; background-color: var(--dark-sub-color); } + .ueuse .youtube_and_nicovideo_player iframe{ + border: 1px solid var(--dark-border-color); + } .userheader h2{ color:var(--sub-color); @@ -7687,11 +7823,9 @@ noscript .noscript_modal .inner .center_text p{ .fzone .follow .fbtn_un:hover{ background-color: var(--dark-sub-color); color: var(--dark-text-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:125px; } .fzone .follow .fbtn_un:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:115px; } @@ -7772,9 +7906,14 @@ noscript .noscript_modal .inner .center_text p{ color:var(--main-color); } + .send_progress{ + box-shadow: 0 -1px 0 var(--dark-border-color); + } + .sendbox{ + border-top: solid 1px var(--dark-border-color); background-color: var(--dark-sub-color); - border:none; + box-shadow: 0 1px 0 var(--dark-border-color); } .sendbox p{ @@ -7791,7 +7930,7 @@ noscript .noscript_modal .inner .center_text p{ .sendbox .emoji_picker{ background-color: var(--dark-background-color); - border: none; + border: solid 1px var(--dark-border-color); } .sendbox .emoji_picker p{ color: var(--dark-subtext-color); @@ -7816,7 +7955,8 @@ noscript .noscript_modal .inner .center_text p{ .emjtex{ background-color: var(--dark-sub-color); - border: none; + border-color: var(--dark-border-color); + box-shadow: var(--dark-border-color); } .emjtex:hover{ background-color: color-mix(in srgb, var(--dark-sub-color) 95%, #FFF); @@ -7830,6 +7970,14 @@ noscript .noscript_modal .inner .center_text p{ color:var(--dark-subtext-color); } + .rp .totop{ + width: 14px; + height: 8px; + border-left: 2px solid var(--dark-text-color); + border-bottom: 2px solid var(--dark-text-color); + border-bottom-left-radius: 6px; + } + .formarea{ background-color: var(--dark-sub-color); } @@ -7904,7 +8052,7 @@ noscript .noscript_modal .inner .center_text p{ .inbox { background: var(--dark-background-color); color: var(--background-color); - border: none; + border: 1px solid var(--dark-border-color); } .inbox::placeholder { @@ -7944,7 +8092,7 @@ noscript .noscript_modal .inner .center_text p{ .server_code{ background-color: var(--dark-background-color); - border: none; + border: 1px solid var(--dark-border-color); } .server_code details{ color: var(--dark-subtext-color); @@ -7955,27 +8103,28 @@ noscript .noscript_modal .inner .center_text p{ .terms{ - background-color: var(--dark-background-color); + background-color: var(--dark-sub-color); + border: solid 1px var(--dark-border-color); } .terms h1{ - color: var(--dark-subtext-color); + color: var(--dark-text-color); } .terms h2{ - color: var(--background-color); + color: var(--dark-text-color); } .terms h3{ - color: var(--background-color); + color: var(--dark-text-color); } .terms h4{ - color: var(--background-color); + color: var(--dark-text-color); } .terms p{ - color: var(--background-color); + color: var(--dark-text-color); } .terms .code{ @@ -7991,36 +8140,39 @@ noscript .noscript_modal .inner .center_text p{ } .terms .p2c{ - color: var(--dark-subtext-color); + color: var(--dark-text-color); } .terms .p3{ - color: var(--background-color); + color: var(--dark-text-color); } .terms .sp2c{ - color: var(--dark-subtext-color); + color: var(--dark-text-color); } .terms .sp3{ - color: var(--background-color); + color: var(--dark-text-color); } .terms .err404 h1{ - color: var(--dark-subtext-color); + color: var(--dark-text-color); } .terms .err404 p{ - color: var(--background-color); + color: var(--dark-text-color); } .this{ background-color: color-mix(in srgb, var(--link-color) 30%, var(--dark-background-color))!important; - border: none !important; + border-top: solid 1px var(--dark-border-color); } .notification{ background-color: var(--dark-sub-color); - border: none; + border-bottom: solid 1px var(--dark-border-color); + } + .notification:first-child { + border-top: solid 1px var(--dark-border-color); } .notification .flebox a{ @@ -8128,11 +8280,11 @@ noscript .noscript_modal .inner .center_text p{ } .tlchange{ - background-color: var(--dark-background-color); - border: none; + background-color: var(--dark-sub-color); + box-shadow: 0 1px 0 var(--dark-border-color); } .tlchange .btn{ - background: var(--dark-background-color); + background: var(--dark-sub-color); color: var(--background-color); } .tlchange .on{ @@ -8142,11 +8294,11 @@ noscript .noscript_modal .inner .center_text p{ .select_utl{ - background-color: var(--dark-background-color); + background-color: var(--dark-sub-color); } .select_utl .btn{ - background: var(--dark-background-color); + background: var(--dark-sub-color); color: var(--border-color); } .select_utl .btmline{ @@ -8155,11 +8307,11 @@ noscript .noscript_modal .inner .center_text p{ } .admin_settings .admin_left{ - background-color: var(--dark-background-color); - border-right: none; + background-color: var(--dark-sub-color); + border-right: solid 1px var(--dark-border-color); } .admin_leftbtn{ - background-color: var(--dark-background-color); + background-color: var(--dark-sub-color); color:var(--main-color); } .admin_leftbtn:hover{ @@ -8229,11 +8381,11 @@ noscript .noscript_modal .inner .center_text p{ } .overview_cnt_l{ background-color: var(--dark-background-color); - border: none; + border: solid 1px var(--dark-border-color); } .overview_cnt_r{ background-color: var(--dark-background-color); - border: none; + border: solid 1px var(--dark-border-color); } .overview p{ color: var(--dark-text-color); @@ -8251,7 +8403,7 @@ noscript .noscript_modal .inner .center_text p{ box-shadow:none; } .f_c_area{ - background-color: var(--dark-background-color); + background-color: var(--dark-sub-color); } .f_c_area .fcnt p{ color: var(--dark-text-color); @@ -8353,7 +8505,7 @@ noscript .noscript_modal .inner .center_text p{ .actionlog { background-color: var(--dark-background-color); - border: solid 1px var(--dark-background-color); + border: solid 1px var(--dark-border-color); } .actionlog details { color: var(--dark-text-color); @@ -8376,4 +8528,8 @@ noscript .noscript_modal .inner .center_text p{ .actionlog p { color: var(--dark-text-color); } + .switch_label { + background: var(--dark-background-color); + border: solid 1px var(--dark-border-color); + } } \ No newline at end of file diff --git a/css/style.css b/css/style.css index a411bdf..ffb62e3 100644 --- a/css/style.css +++ b/css/style.css @@ -195,16 +195,18 @@ body{ display: flex; width: 100%; padding: 0px; + justify-content: space-between; } .textbox .cntzone .usercnt{ margin-top: 24px; - margin-left: 12px; - margin-right: 12px; - width: 43%; + margin-left: 0px; + margin-right: 0px; + width: calc(50% - 52px); height: 5dvh; border-radius: 15px; background-color: var(--sub-color); + border: solid 1px var(--border-color); padding: 18px; } @@ -243,8 +245,7 @@ body{ object-fit: cover; width: 100%; height: 180px; - border-radius: 10px; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); + border-radius: 15px; margin: 0px; } @@ -307,7 +308,6 @@ body{ text-align: center; margin-left: auto; margin-right: auto; - } label > input { @@ -334,15 +334,12 @@ label > input { font-weight: normal; text-decoration:none; text-align: center; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .15); transition: all 250ms ease-in-out; } .irobutton:hover{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); padding: 8px 22%; } .irobutton:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); padding: 8px 18%; } @@ -358,23 +355,20 @@ label > input { text-align: center; - background-color: var(--sub-color); + background-color: var(--dark-subtext-color); + color: var(--dark-text-color); border-radius: 50px; - color:var(--main-color); font-size: 22px; font-family: var(--Head-fonts), sans-serif; font-weight: normal; text-decoration:none; - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .15); transition: all 250ms ease-in-out; } .sirobutton:hover{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); padding: 8px 22%; } .sirobutton:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); padding: 8px 18%; } @@ -464,7 +458,7 @@ label > input { } .inbox { - width: calc(100% - 24px); + width: calc(100% - 20px); padding: 8px 10px; border: none; border-radius: 10px; @@ -474,7 +468,6 @@ label > input { font-size: 16px; line-height: 1.5; white-space: nowrap; - box-shadow: 0px 0px 25px rgba(0,0,0,0.03); overflow-x: scroll; overflow-y : scroll ; transition: border 350ms ease-in-out; @@ -846,11 +839,9 @@ main h1{ .fbtn:hover{ background-color: var(--main-color); color: var(--sub-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .2); width:55%; } .fbtn:active{ - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05); width:45%; } .textbox .authzone{ @@ -994,13 +985,9 @@ p img{ } .formarea{ - padding-top: 0px; - padding-bottom: 0px; - padding-left: 0px; - padding-right: 0px; + padding: 12px; border-radius: 15px; background-color: none; - border: none; margin-top: 32px; } @@ -1073,7 +1060,6 @@ p img{ padding-right: 12px; border-radius: 15px; background-color: var(--background-color); - box-shadow:0 0px 48px 0 rgba(0, 0, 0, .05) inset; margin-top: 32px; text-align: center; margin-left: auto; @@ -1239,6 +1225,7 @@ p img{ } .textbox .cntzone .usercnt{ background-color: var(--dark-sub-color); + border: solid 1px var(--dark-border-color); } .textbox .cntzone .usercnt .p1{ @@ -1251,7 +1238,7 @@ p img{ .btnbox{ background-color: var(--dark-sub-color); - border: none; + border: solid 1px var(--dark-border-color); } .irobutton{ background-color: var(--main-color); @@ -1260,11 +1247,12 @@ p img{ .sirobutton{ background-color: var(--dark-background-color); color:var(--main-color); + border: solid 1px var(--dark-border-color); } .formarea{ background-color: var(--dark-sub-color); - border: none; + border: 1px solid var(--dark-border-color); } .formarea label{ color:var(--dark-text-color); @@ -1284,7 +1272,7 @@ p img{ .inbox { background: var(--dark-background-color); color: var(--dark-text-color); - border: none; + border: 1px solid var(--dark-border-color); } .flexbtn .irobutton{ diff --git a/db.php b/db.php index 26e8f54..6fee8ba 100644 --- a/db.php +++ b/db.php @@ -1,14 +1,15 @@ + +define( 'RATE_LM', '60'); // レートリミット(ユーズ/分) +define( 'STOP_LA', '4'); // 自動停止ロードアベレージ上限 +// タイムゾーン設定 +date_default_timezone_set('Asia/Tokyo'); +?> \ No newline at end of file diff --git a/delete/delete.php b/delete/delete.php index 4872ee9..940bce4 100644 --- a/delete/delete.php +++ b/delete/delete.php @@ -16,6 +16,7 @@ if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && sa exit; } + $result = delete_ueuse($postUniqid, $postUserid, $loginid); if($result[0] === true){ echo json_encode(['success' => true]); diff --git a/errorpage/overcapacity.php b/errorpage/overcapacity.php new file mode 100644 index 0000000..6d83241 --- /dev/null +++ b/errorpage/overcapacity.php @@ -0,0 +1,56 @@ + + + + + + + + + + + + + +503 Service Unavailable - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?> + + + +
+ + + + + +
+ +
+
+
+
+ + + +

の処理能力の限界を超えました

+

ごめんなさい...!
+ 現在の処理能力では対応できないほどの負荷がかかっています。
+ 時間をおいてから再度アクセスをお願いいたします。
+ (503 Service Unavailable)

+
+ +
+ + \ No newline at end of file diff --git a/function/function.php b/function/function.php index 64198ab..1b2d000 100644 --- a/function/function.php +++ b/function/function.php @@ -67,6 +67,25 @@ function blockedIP($ip_addr) { } } } +function stopLoadAvg(){ + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $loadAve = 0; + } else { + if (function_exists("sys_getloadavg")) { + $load = sys_getloadavg(); + $loadAve = is_array($load) && isset($load[0]) ? $load[0] : 0; + } else { + $loadAve = 0; + } + } + + if (defined('STOP_LA') && (int)STOP_LA !== -1) { + if ($loadAve > (int)STOP_LA) { + include_once __DIR__ . '/../errorpage/overcapacity.php'; + exit; + } + } +} //通常のログイン処理 function uwuzuUserLogin($session, $cookie, $ip_addr, $operation_permission = "user") { //セッション,クッキー,IPアドレス,閲覧権限(userかadminかの二種類)を受け取る @@ -117,12 +136,15 @@ function uwuzuUserLogin($session, $cookie, $ip_addr, $operation_permission = "us $is_login = true; }else{ $is_login = false; + stopLoadAvg(); } }else{ $is_login = true; + stopLoadAvg(); } }else{ $is_login = false; + stopLoadAvg(); } }else{ if(isset($session['userid']) && isset($session['username'])){ @@ -132,12 +154,15 @@ function uwuzuUserLogin($session, $cookie, $ip_addr, $operation_permission = "us $is_login = true; }else{ $is_login = false; + stopLoadAvg(); } }else{ $is_login = true; + stopLoadAvg(); } }else{ $is_login = false; + stopLoadAvg(); } }else if(isset($cookie['userid']) && isset($cookie['username'])){ if($cookie['userid'] === $loginResponse["userid"] && $cookie['username'] === $loginResponse["username"]){ @@ -146,15 +171,19 @@ function uwuzuUserLogin($session, $cookie, $ip_addr, $operation_permission = "us $is_login = true; }else{ $is_login = false; + stopLoadAvg(); } }else{ $is_login = true; + stopLoadAvg(); } }else{ $is_login = false; + stopLoadAvg(); } }else{ $is_login = false; + stopLoadAvg(); } } @@ -211,6 +240,14 @@ function uwuzuUserLogin($session, $cookie, $ip_addr, $operation_permission = "us } } + //JobがあればJobを実行する--------------------------------------------------- + $job = getJob($pdo, $userid); + if(!(empty($job))){ + if($job["job"] == "deleteUser"){ + deleteUser($pdo, $job["userid"], $job["step"], $job["uniqid"]); + } + } + return $loginResponse; }else{ return false; @@ -387,6 +424,27 @@ function check_mime_video($tmp_name){ return false; } } +function convert_mime($mime_type){ + $safe_img_mime = array( + "image/gif" => 'gif', + "image/jpeg" => 'jpg', + "image/png" => 'png', + "image/svg+xml" => 'svg', + "image/webp" => 'webp', + "image/bmp" => 'bmp', + "image/x-icon" => 'ico', + "image/tiff" => 'tiff', + "video/mpeg" => 'mpeg', + "video/mp4" => 'mp4', + "video/webm" => 'webm', + "video/x-msvideo" => 'avi', + ); + if(isset($safe_img_mime[$mime_type])){ + return $safe_img_mime[$mime_type]; + }else{ + return false; + } +} //ファイル形式チェック(Base64の場合) function base64_mime($Base64,$userid){ $Base64 = base64_decode($Base64); @@ -519,6 +577,108 @@ function resizeImage($filePath, $maxWidth, $maxHeight) { } } +function uploadAmazonS3($tmp_name){ + if(check_mime_video($tmp_name) == false){ + $is_video = false; + }else{ + $is_video = true; + } + $credentials = [ + 'key' => AMS3_ACCESSKEY, + 'secret' => AMS3_SECRETKEY, + ]; + + $bucket = AMS3_BUCKET_NM; + $srcFilePath = $tmp_name; + if($is_video == true){ + $mime = check_mime_video($srcFilePath); + $extension = convert_mime($mime); + }else{ + $mime = check_mime($srcFilePath); + $extension = convert_mime($mime); + } + $key = AMS3_PREFIX_NM.'/'.createUniqId().'' . '.' . $extension; + + if(AMS3_IS_S3FPS_ == 'true'){ + $S3FPS = true; + }else{ + $S3FPS = false; + } + + try { + $s3Client = new Aws\S3\S3Client([ + 'endpoint' => AMS3_ENDPOINTS, + 'region' => AMS3_REGION_NM, + 'version' => 'latest', + 'credentials' => $credentials, + 'use_path_style_endpoint' => $S3FPS, + ]); + $result = $s3Client->putObject([ + 'Bucket' => $bucket, + 'Key' => $key, + 'SourceFile' => $srcFilePath, + 'ContentType' => $mime, + ]); + if($result){ + $url = AMS3_BASE_URLS . '/' . $key; + return $url; + }else{ + actionLog(null, "error", "uploadAmazonS3", null, "アップロードに失敗しました", 4); + return false; + } + } catch (Aws\S3\Exception\S3Exception $e) { + actionLog(null, "error", "uploadAmazonS3", null, $e->getMessage(), 4); + return false; + } +} + +function deleteAmazonS3($url){ + $key = explode("/", mb_substr(parse_url($url, PHP_URL_PATH), 1)); + array_shift($key);//最初の一個を消す + $key = implode("/", $key); + + $credentials = [ + 'key' => AMS3_ACCESSKEY, + 'secret' => AMS3_SECRETKEY, + ]; + + $bucket = AMS3_BUCKET_NM; + if(AMS3_IS_S3FPS_ == 'true'){ + $S3FPS = true; + }else{ + $S3FPS = false; + } + + try { + $s3Client = new Aws\S3\S3Client([ + 'endpoint' => AMS3_ENDPOINTS, + 'region' => AMS3_REGION_NM, + 'version' => 'latest', + 'credentials' => $credentials, + 'use_path_style_endpoint' => $S3FPS, + ]); + $is_hasfile = $s3Client->doesObjectExistV2($bucket, $key, false, []); + if($is_hasfile == true){ + $result = $s3Client->deleteObject([ + 'Bucket' => $bucket, + 'Key' => $key + ]); + if($result){ + return true; + }else{ + actionLog(null, "error", "deleteAmazonS3", null, "削除に失敗しました", 4); + return false; + } + }else{ + actionLog(null, "error", "deleteAmazonS3", null, $key."が既に削除されていました", 1); + return true; + } + } catch (Aws\S3\Exception\S3Exception $e) { + actionLog(null, "error", "deleteAmazonS3", null, $e->getMessage(), 4); + return false; + } +} + //文字装飾・URL変換など function processMarkdownAndWrapEmptyLines($markdownText) { $placeholders = []; @@ -800,6 +960,28 @@ function YouTube_and_nicovideo_Links($postText) { return $postText; } +function to_null($value) { + $null_conditions = [ + "ueuse" => "", + "photo1" => "none", + "photo2" => "none", + "photo3" => "none", + "photo4" => "none", + "video1" => "none", + "rpuniqid" => "", + "ruuniqid" => "", + "abi" => "none", + ]; + + foreach ($null_conditions as $key => $invalid_value) { + if (isset($value[$key]) && $value[$key] === $invalid_value) { + $value[$key] = null; + } + } + + return $value; +} + function UserAgent_to_Device($useragent) { if(preg_match('/Windows\sNT\s10.0/', $useragent)) { $device = "Windows 10/11"; @@ -1029,9 +1211,27 @@ function send_notification($to,$from,$title,$message,$url,$category){ } // ユーズするとき全部この関数 function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw,$aibwm){ - //AIBlockWaterMark-------------------------------------------- - require('../settings_admin/plugin_settings/aiblockwatermark_settings.php'); + // AIBlockWaterMark-------------------------------------------- + require_once(__DIR__ . '/../settings_admin/plugin_settings/aiblockwatermark_settings.php'); //------------------------------------------------------ + if ($aibwm === true && !empty(AIBWM_CHK) && AIBWM_CHK == "true") { + if (file_exists(__DIR__ . '/../plugin/AIBlockWaterMark/aiblockwatermark.php')) { + require(__DIR__ . '/../plugin/AIBlockWaterMark/aiblockwatermark.php'); + } + } + //------------------------------------------------------ + if (file_exists(__DIR__ . '/../settings_admin/plugin_settings/amazons3_settings.php')) { + require_once(__DIR__ . '/../settings_admin/plugin_settings/amazons3_settings.php'); + if (defined('AMS3_CHKS') && AMS3_CHKS == "true") { + if (file_exists(__DIR__ . '/../plugin/aws/aws-autoloader.php')) { + require_once(__DIR__ . '/../plugin/aws/aws-autoloader.php'); + } else { + actionLog(null, "error", "uploadAmazonS3", null, "AWS SDK for PHPが見つかりませんでした!", 4); + } + } + } else { + actionLog(null, "error", "uploadAmazonS3", null, "amazons3_settings.phpが見つかりませんでした!", 3); + } $rpUniqid = safetext($rpUniqid); $ruUniqid = safetext($ruUniqid); @@ -1040,12 +1240,16 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ $nsfw = safetext($nsfw); $error_message = array(); - $mojisizefile = "../server/textsize.txt"; + $mojisizefile = __DIR__ . "/../server/textsize.txt"; //投稿及び返信レート制限↓(分):デフォで60件/分まで - $max_ueuse_rate_limit = 60; + if(!((int)RATE_LM === -1)){ + $max_ueuse_rate_limit = (int)RATE_LM; + }else{ + $max_ueuse_rate_limit = PHP_INT_MAX; + } - $banurldomainfile = "../server/banurldomain.txt"; + $banurldomainfile = __DIR__ . "/../server/banurldomain.txt"; $banurl_info = file_get_contents($banurldomainfile); $banurl = array_filter(preg_split("/\r\n|\n|\r/", $banurl_info)); @@ -1059,7 +1263,7 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ $pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option); } catch(PDOException $e) { actionLog($userid, "error", "send_ueuse", null, $e, 4); - return false; + return [false, "DB_ERROR"]; } if(!(empty($pdo))){ @@ -1094,6 +1298,10 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ } } + // 改行ユーズ確認 + if(preg_match('/^[\n\r]+$/', $ueuse) === 1){ + $error_message[] = '内容を入力してください。(INPUT_PLEASE)'; + } } $old_datetime = date("Y-m-d H:i:00"); @@ -1115,28 +1323,41 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ if(!(empty($uploadedFile['tmp_name']))){ if(check_mime($uploadedFile['tmp_name'])){ // アップロードされたファイルの拡張子を取得 - $extension = strtolower(pathinfo($uploadedFile['name'], PATHINFO_EXTENSION)); - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename = createUniqId() . '-'.$userid.'.' . $extension; - // 保存先のパスを生成 - $uploadedPath = '../ueuseimages/' . $newFilename; - // EXIF削除 + $extension = convert_mime(check_mime($uploadedFile['tmp_name'])); delete_exif($extension, $uploadedFile['tmp_name']); - // ファイルを移動 - $result = move_uploaded_file($uploadedFile['tmp_name'], $uploadedPath); - - if ($result) { - $save_photo1 = $uploadedPath; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(1)エラーコード:' .$errcode.''; + if($aibwm === true){ + AIBlockWaterMark($uploadedFile['tmp_name'], $userid); + } + if(AMS3_CHKS == "true"){ + $s3result = uploadAmazonS3($uploadedFile['tmp_name']); + }else{ + // 新しいファイル名を生成(uniqid + 拡張子) + $newFilename = createUniqId() . '-'.$userid.'.' . $extension; + // 保存先のパスを生成 + $uploadedPath = '../ueuseimages/' . $newFilename; + // ファイルを移動 + $result = move_uploaded_file($uploadedFile['tmp_name'], __DIR__."/".$uploadedPath); + + if ($result) { + $save_photo1 = $uploadedPath; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(1)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(1)エラーコード: S3ERROR'; + }else{ + $save_photo1 = $s3result; // S3に保存されたファイルのパスを使用 + } } }else{ $error_message[] = "使用できない画像形式です。(SORRY_FILE_HITAIOU)"; @@ -1158,27 +1379,40 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ if(!(empty($uploadedFile2['tmp_name']))){ if(check_mime($uploadedFile2['tmp_name'])){ // アップロードされたファイルの拡張子を取得 - $extension2 = strtolower(pathinfo($uploadedFile2['name'], PATHINFO_EXTENSION)); - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename2 = createUniqId() . '-'.$userid.'.' . $extension2; - // 保存先のパスを生成 - $uploadedPath2 = '../ueuseimages/' . $newFilename2; - // EXIF削除 + $extension2 = convert_mime(check_mime($uploadedFile2['tmp_name'])); delete_exif($extension2, $uploadedFile2['tmp_name']); - // ファイルを移動 - $result2 = move_uploaded_file($uploadedFile2['tmp_name'], $uploadedPath2); - if ($result2) { - $save_photo2 = $uploadedPath2; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile2['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(2)エラーコード:' .$errcode.''; + if($aibwm === true){ + AIBlockWaterMark($uploadedFile2['tmp_name'], $userid); + } + if(AMS3_CHKS == "true"){ + $s3result = uploadAmazonS3($uploadedFile2['tmp_name']); + }else{ + // 新しいファイル名を生成(uniqid + 拡張子) + $newFilename2 = createUniqId() . '-'.$userid.'.' . $extension2; + // 保存先のパスを生成 + $uploadedPath2 = '../ueuseimages/' . $newFilename2; + // ファイルを移動 + $result2 = move_uploaded_file($uploadedFile2['tmp_name'], __DIR__."/".$uploadedPath2); + if ($result2) { + $save_photo2 = $uploadedPath2; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile2['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(2)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(2)エラーコード: S3ERROR'; + }else{ + $save_photo2 = $s3result; // S3に保存されたファイルのパスを使用 + } } }else{ $error_message[] = "使用できない画像形式です。(SORRY_FILE_HITAIOU)"; @@ -1200,27 +1434,40 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ if(!(empty($uploadedFile3['tmp_name']))){ if(check_mime($uploadedFile3['tmp_name'])){ // アップロードされたファイルの拡張子を取得 - $extension3 = strtolower(pathinfo($uploadedFile3['name'], PATHINFO_EXTENSION)); - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename3 = createUniqId() . '-'.$userid.'.' . $extension3; - // 保存先のパスを生成 - $uploadedPath3 = '../ueuseimages/' . $newFilename3; - // EXIF削除 + $extension3 = convert_mime(check_mime($uploadedFile3['tmp_name'])); delete_exif($extension3, $uploadedFile3['tmp_name']); - // ファイルを移動 - $result3 = move_uploaded_file($uploadedFile3['tmp_name'], $uploadedPath3); - if ($result3) { - $save_photo3 = $uploadedPath3; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile3['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(3)エラーコード:' .$errcode.''; + if($aibwm === true){ + AIBlockWaterMark($uploadedFile3['tmp_name'], $userid); + } + if(AMS3_CHKS == "true"){ + $s3result = uploadAmazonS3($uploadedFile3['tmp_name']); + }else{ + // 新しいファイル名を生成(uniqid + 拡張子) + $newFilename3 = createUniqId() . '-'.$userid.'.' . $extension3; + // 保存先のパスを生成 + $uploadedPath3 = '../ueuseimages/' . $newFilename3; + // ファイルを移動 + $result3 = move_uploaded_file($uploadedFile3['tmp_name'], __DIR__."/".$uploadedPath3); + if ($result3) { + $save_photo3 = $uploadedPath3; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile3['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(3)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(3)エラーコード: S3ERROR'; + }else{ + $save_photo3 = $s3result; // S3に保存されたファイルのパスを使用 + } } }else{ $error_message[] = "使用できない画像形式です。(SORRY_FILE_HITAIOU)"; @@ -1241,27 +1488,40 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ if(!(empty($uploadedFile4['tmp_name']))){ if(check_mime($uploadedFile4['tmp_name'])){ // アップロードされたファイルの拡張子を取得 - $extension4 = strtolower(pathinfo($uploadedFile4['name'], PATHINFO_EXTENSION)); - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename4 = createUniqId() . '-'.$userid.'.' . $extension4; - // 保存先のパスを生成 - $uploadedPath4 = '../ueuseimages/' . $newFilename4; - // EXIF削除 + $extension4 = convert_mime(check_mime($uploadedFile4['tmp_name'])); delete_exif($extension4, $uploadedFile4['tmp_name']); - // ファイルを移動 - $result4 = move_uploaded_file($uploadedFile4['tmp_name'], $uploadedPath4); - if ($result4) { - $save_photo4 = $uploadedPath4; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile4['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(4)エラーコード:' .$errcode.''; + if($aibwm === true){ + AIBlockWaterMark($uploadedFile4['tmp_name'], $userid); + } + if(AMS3_CHKS == "true"){ + $s3result = uploadAmazonS3($uploadedFile4['tmp_name']); + }else{ + // 新しいファイル名を生成(uniqid + 拡張子) + $newFilename4 = createUniqId() . '-'.$userid.'.' . $extension4; + // 保存先のパスを生成 + $uploadedPath4 = '../ueuseimages/' . $newFilename4; + // ファイルを移動 + $result4 = move_uploaded_file($uploadedFile4['tmp_name'], __DIR__."/".$uploadedPath4); + if ($result4) { + $save_photo4 = $uploadedPath4; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile4['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(4)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(1)エラーコード: S3ERROR'; + }else{ + $save_photo4 = $s3result; // S3に保存されたファイルのパスを使用 + } } }else{ $error_message[] = "使用できない画像形式です。(SORRY_FILE_HITAIOU)"; @@ -1279,26 +1539,37 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ if(!(empty($uploadedVideo['tmp_name']))){ if(check_mime_video($uploadedVideo['tmp_name'])){ - // アップロードされたファイルの拡張子を取得 - $extensionVideo = strtolower(pathinfo($uploadedVideo['name'], PATHINFO_EXTENSION)); // 小文字に変換 - // 正しい拡張子の場合、新しいファイル名を生成 - $newFilenameVideo = createUniqId() . '-'.$userid.'.' . $extensionVideo; - // 保存先のパスを生成 - $uploadedPathVideo = '../ueusevideos/' . $newFilenameVideo; - // ファイルを移動 - $resultVideo = move_uploaded_file($uploadedVideo['tmp_name'], $uploadedPathVideo); - if ($resultVideo) { - $save_video1 = $uploadedPathVideo; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedVideo['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(5)エラーコード:' .$errcode.''; + if(AMS3_CHKS == "true"){ + $s3result = uploadAmazonS3($uploadedVideo['tmp_name']); + }else{ + // アップロードされたファイルの拡張子を取得 + $extensionVideo = convert_mime(check_mime_video($uploadedVideo['tmp_name'])); + // 正しい拡張子の場合、新しいファイル名を生成 + $newFilenameVideo = createUniqId() . '-'.$userid.'.' . $extensionVideo; + // 保存先のパスを生成 + $uploadedPathVideo = '../ueusevideos/' . $newFilenameVideo; + // ファイルを移動 + $resultVideo = move_uploaded_file($uploadedVideo['tmp_name'], __DIR__."/".$uploadedPathVideo); + if ($resultVideo) { + $save_video1 = $uploadedPathVideo; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedVideo['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(5)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(5)エラーコード: S3ERROR'; + }else{ + $save_video1 = $s3result; // S3に保存されたファイルのパスを使用 + } } } else { $error_message[] = '対応していないファイル形式です!(SORRY_FILE_HITAIOU)'; @@ -1308,22 +1579,6 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ } } - if($aibwm === true && !empty(AIBWM_CHK && AIBWM_CHK == "true")){ - require('../plugin/AIBlockWaterMark/aiblockwatermark.php'); - if(!($save_photo1 == "none")){ - AIBlockWaterMark($save_photo1, $userid); - } - if(!($save_photo2 == "none")){ - AIBlockWaterMark($save_photo2, $userid); - } - if(!($save_photo3 == "none")){ - AIBlockWaterMark($save_photo3, $userid); - } - if(!($save_photo4 == "none")){ - AIBlockWaterMark($save_photo4, $userid); - } - } - if(empty($error_message)) { // 書き込み日時を取得 $datetime = date("Y-m-d H:i:s"); @@ -1494,35 +1749,48 @@ function send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$ } }else{ $error_message[] = '返信とリユーズを同時に行うことはできません。(ERROR)'; - return $error_message; + return [false, $error_message]; } if( $res ) { - return null; + return [true, $uniqid]; } else { $error_message[] = "ユーズに失敗しました。(REGISTERED_DAME)"; - return $error_message; + return [false, $error_message]; } // プリペアドステートメントを削除 $stmt = null; }else{ actionLog($userid, "error", "send_ueuse", null, $error_message, 0); - return $error_message; + return [false, $error_message]; } }else{ actionLog($userid, "error", "send_ueuse", null, $error_message, 0); - return $error_message; + return [false, $error_message]; } }else{ $error_message[] = "投稿回数のレート制限を超過しています。(OVER_RATE_LIMIT)"; actionLog($userid, "error", "send_ueuse", null, $error_message, 0); - return $error_message; + return [false, $error_message]; } } } function delete_ueuse($uniqid, $userid, $account_id){ + if(file_exists("../settings_admin/plugin_settings/amazons3_settings.php")){ + require_once '../settings_admin/plugin_settings/amazons3_settings.php'; + if(AMS3_CHKS == "true"){ + if(file_exists("../plugin/aws/aws-autoloader.php")){ + require_once '../plugin/aws/aws-autoloader.php'; + }else{ + actionLog(null, "error", "uploadAmazonS3", null, "AWS SDK for PHPが見つかりませんでした!", 4); + } + } + }else{ + actionLog(null, "error", "uploadAmazonS3", null, "amazons3_settings.phpが見つかりませんでした!", 3); + } + if (safetext(isset($uniqid)) && safetext(isset($userid)) && safetext(isset($account_id))){ $postUserid = safetext($userid); $postUniqid = safetext($uniqid); @@ -1558,42 +1826,72 @@ function delete_ueuse($uniqid, $userid, $account_id){ $photo_and_video = $photo_query->fetch(); if(!($photo_and_video["photo1"] == "none")){ - $photoDelete1 = glob($photo_and_video["photo1"]); // 「-ユーザーID.拡張子」というパターンを検索 - foreach ($photoDelete1 as $photo1) { - if (is_file($photo1)) { - unlink($photo1); + if(filter_var($photo_and_video["photo1"], FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($photo_and_video["photo1"]); + } + }else{ + $photoDelete1 = glob($photo_and_video["photo1"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete1 as $photo1) { + if (is_file($photo1)) { + unlink($photo1); + } } } } if(!($photo_and_video["photo2"] == "none")){ - $photoDelete2 = glob($photo_and_video["photo2"]); // 「-ユーザーID.拡張子」というパターンを検索 - foreach ($photoDelete2 as $photo2) { - if (is_file($photo2)) { - unlink($photo2); + if(filter_var($photo_and_video["photo2"], FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($photo_and_video["photo2"]); + } + }else{ + $photoDelete2 = glob($photo_and_video["photo2"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete2 as $photo2) { + if (is_file($photo2)) { + unlink($photo2); + } } } } if(!($photo_and_video["photo3"] == "none")){ - $photoDelete3 = glob($photo_and_video["photo3"]); // 「-ユーザーID.拡張子」というパターンを検索 - foreach ($photoDelete3 as $photo3) { - if (is_file($photo3)) { - unlink($photo3); + if(filter_var($photo_and_video["photo3"], FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($photo_and_video["photo3"]); + } + }else{ + $photoDelete3 = glob($photo_and_video["photo3"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete3 as $photo3) { + if (is_file($photo3)) { + unlink($photo3); + } } } } if(!($photo_and_video["photo4"] == "none")){ - $photoDelete4 = glob($photo_and_video["photo4"]); // 「-ユーザーID.拡張子」というパターンを検索 - foreach ($photoDelete4 as $photo4) { - if (is_file($photo4)) { - unlink($photo4); + if(filter_var($photo_and_video["photo4"], FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($photo_and_video["photo4"]); + } + }else{ + $photoDelete4 = glob($photo_and_video["photo4"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete4 as $photo4) { + if (is_file($photo4)) { + unlink($photo4); + } } } } if(!($photo_and_video["video1"] == "none")){ - $videoDelete1 = glob($photo_and_video["video1"]); // 「-ユーザーID.拡張子」というパターンを検索 - foreach ($videoDelete1 as $video1) { - if (is_file($video1)) { - unlink($video1); + if(filter_var($photo_and_video["video1"], FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($photo_and_video["video1"]); + } + }else{ + $videoDelete1 = glob($photo_and_video["video1"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($videoDelete1 as $video1) { + if (is_file($video1)) { + unlink($video1); + } } } } @@ -1603,6 +1901,8 @@ function delete_ueuse($uniqid, $userid, $account_id){ $result3 = $ruChkquery->fetch(); if($result3 > 0){ + // トランザクション開始 + $pdo->beginTransaction(); try { // 削除クエリを実行 $rudeleteQuery = $pdo->prepare("DELETE FROM ueuse WHERE ruuniqid = :uniqid AND ueuse = ''"); @@ -1635,6 +1935,8 @@ function delete_ueuse($uniqid, $userid, $account_id){ changePopularity($pdo, $result["rpuniqid"], $userid, -3); } + // トランザクション開始 + $pdo->beginTransaction(); try { // 削除クエリを実行 $deleteQuery = $pdo->prepare("DELETE FROM ueuse WHERE uniqid = :uniqid AND account = :userid"); @@ -1643,6 +1945,7 @@ function delete_ueuse($uniqid, $userid, $account_id){ $res = $deleteQuery->execute(); if ($res) { + $pdo->commit(); return [true, "削除に成功しました!"]; } else { $pdo->rollBack(); @@ -1912,6 +2215,272 @@ function unblock_user($pdo, $to_userid, $userid){ return false; } } +//--------------------アカウント削除-------------------- +function deleteUser($pdo, $userid, $step, $job_uniqid){ + $userdata = getUserData($pdo, $userid); + if(empty($userdata)){ + changeJob($pdo, $userid, $job_uniqid, "delete_account", "finished"); + return false; + }else{ + $userid = $userdata["userid"]; + if($step == "stop_account"){ + if(changeJob($pdo, $userid, $job_uniqid, "stop_account", "running")){ + $newrole = "ice"; + $newtoken = "ice"; + $newadmin = "none"; + // トランザクション開始 + $pdo->beginTransaction(); + + try { + $stmt = $pdo->prepare("UPDATE account SET role = :role,token = :newtoken,admin = :newadmin WHERE userid = :userid"); + + $stmt->bindValue(':role', $newrole, PDO::PARAM_STR); + $stmt->bindValue(':newtoken', $newtoken, PDO::PARAM_STR); + $stmt->bindValue(':newadmin', $newadmin, PDO::PARAM_STR); + + $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); + + $res = $stmt->execute(); + + if ($res) { + $pdo->commit(); + + send_notification($userid, "uwuzu-fromsys", "🗑️アカウントの削除が開始されました🗑️", "アカウントの削除が開始されました!\n今後、アカウントのデータは順次削除されます。\n削除には時間がかかります。\n\nログアウトしてお待ち下さい。\n\nアカウントの復旧はできません。", "/others", "system"); + if(changeJob($pdo, $userid, $job_uniqid, "delete_ueuse", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをdelete_image-waitingに変更失敗", 3); + return false; + } + } else { + $pdo->rollBack(); + actionLog($userid, "error", "deleteUser", $userid, "アカウントの削除前凍結に失敗しました", 4); + if(changeJob($pdo, $userid, $job_uniqid, "stop_account", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをstop_account-waitingに変更失敗", 3); + return false; + } + } + } catch (Exception $e) { + $pdo->rollBack(); + actionLog($userid, "error", "deleteUser", $userid, "iceError: ".$e, 4); + if(changeJob($pdo, $userid, $job_uniqid, "stop_account", "error")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをstop_account-errorに変更失敗", 3); + return false; + } + } + } + + } + + if($step == "delete_ueuse"){ + if(changeJob($pdo, $userid, $job_uniqid, "delete_ueuse", "running")){ + // ユーズを直近100件取得 + $getUeuse_query = $pdo->prepare("SELECT * FROM ueuse WHERE account = :userid ORDER BY datetime DESC LIMIT 50"); + $getUeuse_query->bindValue(':userid', $userid, PDO::PARAM_STR); + $getUeuse_query->execute(); + $getUeuse = $getUeuse_query->fetchAll(); + + foreach ($getUeuse as $ueuse) { + delete_ueuse($ueuse["uniqid"], $userid, $userdata["loginid"]); + } + + if(count($getUeuse) >= 50){ + if(changeJob($pdo, $userid, $job_uniqid, "delete_ueuse", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをdelete_ueuse-waitingに変更失敗", 3); + return false; + } + }else{ + if(changeJob($pdo, $userid, $job_uniqid, "delete_image", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをdelete_image-waitingに変更失敗", 3); + return false; + } + } + } + } + + if($step == "delete_image"){ + if(changeJob($pdo, $userid, $job_uniqid, "delete_image", "running")){ + // ユーザーの画像を削除 + $folderPath = "../ueuseimages/"; + $filesToDelete = glob($folderPath . "*-$userid.*"); + foreach ($filesToDelete as $file) { + if (is_file($file)) { + unlink($file); + } + } + // ユーザーの動画を削除 + $folderPath2 = "../ueusevideos/"; + $filesToDelete2 = glob($folderPath2 . "*-$userid.*"); + foreach ($filesToDelete2 as $file2) { + if (is_file($file2)) { + unlink($file2); + } + } + + if(changeJob($pdo, $userid, $job_uniqid, "delete_follow", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをdelete_follow-waitingに変更失敗", 3); + return false; + } + } + } + + if($step == "delete_follow"){ + if(changeJob($pdo, $userid, $job_uniqid, "delete_follow", "running")){ + // フォロー・フォロワー情報を削除したい全てのアカウントを取得 + $flw_query = $pdo->prepare("SELECT * + FROM account + WHERE FIND_IN_SET(:userid, follow) > 0 + OR FIND_IN_SET(:userid, follower) > 0; + "); + $flw_query->bindValue(':userid', $userid, PDO::PARAM_STR); + $flw_query->execute(); + $flw_accounts = $flw_query->fetchAll(); + + foreach ($flw_accounts as $account) { + unfollow_user($pdo, $account['userid'], $userid); + unfollow_user($pdo, $userid, $account['userid']); + } + + // ユーザーIDを削除したい全てのアカウントを取得 + $blk_query = $pdo->prepare("SELECT * + FROM account + WHERE FIND_IN_SET(:userid, blocklist) > 0; + "); + $blk_query->bindValue(':userid', $userid, PDO::PARAM_STR); + $blk_query->execute(); + $blk_accounts = $blk_query->fetchAll(); + + foreach ($blk_accounts as $account) { + unblock_user($pdo, $userid, $account['userid']); + } + + //いいねを外したいすべてのユーズを取得 + $fav_ueuse_query = $pdo->prepare("SELECT * + FROM ueuse + WHERE FIND_IN_SET(:userid, favorite) > 0; + "); + $fav_ueuse_query->bindValue(':userid', $userid, PDO::PARAM_STR); + $fav_ueuse_query->execute(); + $fav_ueuse_ueuses = $fav_ueuse_query->fetchAll(); + foreach ($fav_ueuse_ueuses as $ueuse) { + addFavorite($pdo, $ueuse['uniqid'], $userid); + } + + if(changeJob($pdo, $userid, $job_uniqid, "delete_account", "waiting")){ + return true; + }else{ + actionLog($userid, "error", "deleteAccount", null, "Job("+$job_uniqid+")のステータスをdelete_account-waitingに変更失敗", 3); + return false; + } + } + } + + if($step == "delete_account"){ + if(file_exists("../settings_admin/plugin_settings/amazons3_settings.php")){ + require_once '../settings_admin/plugin_settings/amazons3_settings.php'; + if(AMS3_CHKS == "true"){ + if(file_exists("../plugin/aws/aws-autoloader.php")){ + require_once '../plugin/aws/aws-autoloader.php'; + }else{ + actionLog(null, "error", "uploadAmazonS3", null, "AWS SDK for PHPが見つかりませんでした!", 4); + } + } + }else{ + actionLog(null, "error", "uploadAmazonS3", null, "amazons3_settings.phpが見つかりませんでした!", 3); + } + + if(changeJob($pdo, $userid, $job_uniqid, "delete_account", "running")){ + $usericonurl = $userdata["iconname"]; + if(filter_var($usericonurl, FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($usericonurl); + } + }else{ + $folderPath3 = "../usericons/"; + $filesToDelete3 = glob($folderPath3 . "*-$userid.*"); // 「-ユーザーID.拡張子」というパターンを検索 + // ファイルを順に削除 + foreach ($filesToDelete3 as $file3) { + if (is_file($file3)) { + unlink($file3); // ファイルを削除 + } + } + } + + $userheadurl = $userdata["headname"]; + if(filter_var($userheadurl, FILTER_VALIDATE_URL)){ + if(AMS3_CHKS == "true"){ + deleteAmazonS3($userheadurl); + } + }else{ + $folderPath4 = "../userheads/"; + $filesToDelete4 = glob($folderPath4 . "*-$userid.*"); // 「-ユーザーID.拡張子」というパターンを検索 + // ファイルを順に削除 + foreach ($filesToDelete4 as $file4) { + if (is_file($file4)) { + unlink($file4); + } + } + } + + $pdo->beginTransaction(); + try { + // 投稿削除クエリを実行 + $deleteQuery = $pdo->prepare("DELETE FROM ueuse WHERE account = :userid"); + $deleteQuery->bindValue(':userid', $userid, PDO::PARAM_STR); + $res = $deleteQuery->execute(); + + // 通知削除クエリを実行(自分宛ての通知) + $deleteQuery = $pdo->prepare("DELETE FROM notification WHERE touserid = :touserid"); + $deleteQuery->bindValue(':touserid', $userid, PDO::PARAM_STR); + $res = $deleteQuery->execute(); + + // 通知削除クエリを実行(自分からの通知) + $deleteQuery = $pdo->prepare("DELETE FROM notification WHERE fromuserid = :fromuserid"); + $deleteQuery->bindValue(':fromuserid', $userid, PDO::PARAM_STR); + $res = $deleteQuery->execute(); + + // アカウント削除クエリを実行 + $deleteQuery = $pdo->prepare("DELETE FROM account WHERE userid = :userid"); + $deleteQuery->bindValue(':userid', $userid, PDO::PARAM_STR); + $res = $deleteQuery->execute(); + + if($res) { + // コミット + $pdo->commit(); + changeJob($pdo, $userid, $job_uniqid, "delete_account", "finished"); + actionLog($userid, "success", "deleteAccount", null, "アカウント削除に成功", 1); + + return true; + } else { + // ロールバック + $pdo->rollBack(); + actionLog($userid, "error", "deleteAccount", null, "アカウント削除に失敗", 3); + changeJob($pdo, $userid, $job_uniqid, "delete_account", "error"); + + return false; + } + } catch (Exception $e) { + // エラーが発生した時はロールバック + $pdo->rollBack(); + actionLog($userid, "error", "deleteAccount", null, $e, 4); + changeJob($pdo, $userid, $job_uniqid, "delete_account", "error"); + + return false; + } + } + } + } +} function changePopularity($pdo, $uniqid, $userid, $change_range){ if (!(empty($pdo)) && !(empty($uniqid))){ if(is_numeric($change_range)){ @@ -2038,6 +2607,42 @@ function getUserData($pdo, $userid) { $query->execute(); return $query->fetch(); } +function getUeuseData($pdo, $uniqid) { + $query = $pdo->prepare("SELECT * FROM ueuse WHERE uniqid = :uniqid"); + $query->bindValue(':uniqid', $uniqid, PDO::PARAM_STR); + $query->execute(); + $ueuseDatas = $query->fetch(); + + if (empty($ueuseDatas)) { + return false; + } + + //リプライ数取得 + $rpQuery = $pdo->prepare("SELECT COUNT(*) as reply_count FROM ueuse WHERE rpuniqid = :rpuniqid"); + $rpQuery->bindValue(':rpuniqid', $ueuseDatas['uniqid']); + $rpQuery->execute(); + $rpData = $rpQuery->fetch(PDO::FETCH_ASSOC); + + if ($rpData){ + $ueuseDatas['reply_count'] = $rpData['reply_count']; + } + + //リユーズ数取得 + $ruQuery = $pdo->prepare("SELECT COUNT(*) as reuse_count FROM ueuse WHERE ruuniqid = :ruuniqid"); + $ruQuery->bindValue(':ruuniqid', $ueuseDatas['uniqid']); + $ruQuery->execute(); + $ruData = $ruQuery->fetch(PDO::FETCH_ASSOC); + + if ($ruData){ + $ueuseDatas['reuse_count'] = $ruData['reuse_count']; + } + + $fav = $ueuseDatas['favorite']; + $favIds = explode(',', $fav); + $ueuseDatas["favorite_conut"] = count($favIds)-1; + + return $ueuseDatas; +} function actionLog($userid, $type, $place, $target, $content, $importance){ if(empty($userid)){ @@ -2146,10 +2751,130 @@ function actionLog($userid, $type, $place, $target, $content, $importance){ } } } + +function addJob($pdo, $userid, $job, $step){ + $userid = getUserData($pdo, $userid)["userid"]; + if(empty($userid)){ + return false; + } + if(empty($job)){ + return false; + } + if(empty($step)){ + $step = "start"; + } + + if(!(empty($pdo))){ + $uniqid = createUniqId(); + $datetime = date('Y-m-d H:i:s'); + $status = "waiting"; + + // トランザクション開始 + $pdo->beginTransaction(); + + try { + // SQL作成 + $stmt = $pdo->prepare("INSERT INTO jobs (uniqid, userid, job, step, status, datetime) VALUES (:uniqid, :userid, :job, :step, :status, :datetime)"); + + $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); + $stmt->bindParam(':userid', $userid, PDO::PARAM_STR); + $stmt->bindParam(':job', $job, PDO::PARAM_STR); + $stmt->bindParam(':step', $step, PDO::PARAM_STR); + $stmt->bindParam(':status', $status, PDO::PARAM_STR); + $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $res = $stmt->execute(); + if($res){ + $pdo->commit(); + return true; + }else{ + actionLog($userid, "error", "addJob", null, "Jobを追加できませんでした!", 3); + $pdo->rollBack(); + return false; + } + } catch(Exception $e) { + actionLog($userid, "error", "addJob", null, $e, 4); + $pdo->rollBack(); + return false; + } + } +} + +function changeJob($pdo, $userid, $uniqid, $step, $status){ + if(empty($uniqid)){ + return false; + } + if(empty($step)){ + $step = "start"; + } + if(empty($status)){ + $status = "waiting"; + } + $status_list = ["waiting","running","finished","error"]; + if(in_array($status, $status_list)){ + if(!(empty($pdo))){ + $pdo->beginTransaction(); + + try { + $updateQuery = $pdo->prepare("UPDATE jobs SET step = :step, status = :status WHERE uniqid = :uniqid"); + $updateQuery->bindValue(':step', $step, PDO::PARAM_STR); + $updateQuery->bindValue(':status', $status, PDO::PARAM_STR); + $updateQuery->bindValue(':uniqid', $uniqid, PDO::PARAM_STR); + $res = $updateQuery->execute(); + + if($res){ + $pdo->commit(); + return true; + }else{ + $pdo->rollBack(); + actionLog($userid, "error", "is_OtherSettings", null, "ジョブを編集できませんでした", 3); + return false; + } + } catch(Exception $e) { + actionLog($userid, "error", "changeJob", null, $e, 4); + $pdo->rollBack(); + return false; + } + } + }else{ + actionLog($userid, "error", "changeJob", null, "不正なステータスです!", 3); + return false; + } +} + +function getJob($pdo, $userid){ + if(empty($userid)){ + return false; + } + + if(!(empty($pdo))){ + $query = $pdo->prepare("SELECT * FROM jobs WHERE status = 'waiting' ORDER BY datetime ASC LIMIT 1"); + $query->execute(); + $job = $query->fetch(PDO::FETCH_ASSOC); + + if($job){ + return $job; + }else{ + return false; + } + } +} + function safetext($text){ // テキストの安全化 - return htmlspecialchars($text, ENT_QUOTES, 'UTF-8', false); + return htmlspecialchars(preg_replace('/[\x00-\x08\x0b\x0c\x0e-\x1f]/', '', $text), ENT_QUOTES, 'UTF-8', false); } + +function to_array_safetext($value) { + foreach ($value as $key => $val) { + if (is_array($val)) { + $value[$key] = to_array_safetext($val); + } else { + $value[$key] = safetext($val); + } + } + return $value; +} + function decode_yajirushi($postText){ $postText = str_replace('←', '←', $postText); $postText = str_replace('↓', '↓', $postText); diff --git a/function/get_customemoji.php b/function/get_customemoji.php new file mode 100644 index 0000000..170da1c --- /dev/null +++ b/function/get_customemoji.php @@ -0,0 +1,81 @@ + false, 'error' => '認証に失敗しました。(AUTH_INVALID)']); + exit; + } + + // データベースに接続 + try { + $option = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_MULTI_STATEMENTS => false + ); + $pdo = new PDO('mysql:charset=utf8mb4;dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS, $option); + } catch (PDOException $e) { + // 接続エラーのときエラー内容を取得する + $error_message[] = $e->getMessage(); + } + + if (!empty($pdo)) { + // カンマ区切りまたは1つのユーザーID文字列を処理 + $emojis = array_unique(array_filter(explode(',', $emoji))); + + $results = []; + + if (count($emojis) > 0) { + // プレースホルダを作成 + $placeholders = implode(',', array_fill(0, count($emojis), '?')); + $stmt = $pdo->prepare("SELECT emojifile, emojiname FROM emoji WHERE emojiname IN ($placeholders)"); + $stmt->execute($emojis); + + $fetched = []; + while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $fetched[$row['emojiname']] = [ + 'emojipath' => filter_var($row["emojifile"], FILTER_VALIDATE_URL) ? $row["emojifile"] : "../" . $row["emojifile"], + 'emojiname' => $row['emojiname'] + ]; + } + + foreach ($emojis as $name) { + if (isset($fetched[$name])) { + $results[$name] = $fetched[$name]; + } else { + $results[$name] = null; + } + } + } + + echo json_encode([ + "success" => true, + "emojis" => $results + ], JSON_UNESCAPED_UNICODE); + } else { + $item = array( + "success" => false, + "emojipath" => null, + "emojiname" => null, + ); + echo json_encode($item, JSON_UNESCAPED_UNICODE); + } +}else{ + $item = array( + "success" => false, + "emojipath" => null, + "emojiname" => null, + ); + echo json_encode($item, JSON_UNESCAPED_UNICODE); +} +?> diff --git a/function/get_userid.php b/function/get_userid.php new file mode 100644 index 0000000..b4ab878 --- /dev/null +++ b/function/get_userid.php @@ -0,0 +1,79 @@ + false, 'error' => '認証に失敗しました。(AUTH_INVALID)']); + exit; + } + + // データベースに接続 + try { + $option = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_MULTI_STATEMENTS => false + ); + $pdo = new PDO('mysql:charset=utf8mb4;dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS, $option); + } catch (PDOException $e) { + // 接続エラーのときエラー内容を取得する + $error_message[] = $e->getMessage(); + } + + if (!empty($pdo)) { + // カンマ区切りまたは1つのユーザーID文字列を処理 + $usernames = array_unique(array_filter(explode(',', $get_account))); + + $results = []; + + if (count($usernames) > 0) { + // プレースホルダを作成 + $placeholders = implode(',', array_fill(0, count($usernames), '?')); + $stmt = $pdo->prepare("SELECT userid, username FROM account WHERE userid IN ($placeholders)"); + $stmt->execute($usernames); + + $fetched = []; + while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $fetched[$row['userid']] = [ + 'userid' => $row['userid'], + 'username' => $row['username'] + ]; + } + + foreach ($usernames as $name) { + if (isset($fetched[$name])) { + $results[$name] = $fetched[$name]; + } else { + $results[$name] = null; + } + } + } + + echo json_encode([ + "success" => true, + "users" => $results + ], JSON_UNESCAPED_UNICODE); + } else { + echo json_encode([ + "success" => false, + "users" => null + ], JSON_UNESCAPED_UNICODE); + } +}else{ + $item = array( + "success" => false, + "userid" => null, + "username" => null, + ); + echo json_encode($item, JSON_UNESCAPED_UNICODE); +} +?> diff --git a/function/reuse.php b/function/reuse.php index 20cb3e5..d78611b 100644 --- a/function/reuse.php +++ b/function/reuse.php @@ -60,11 +60,11 @@ if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['reusetext'])) && } $ueuse_result = send_ueuse($userid,$rpUniqid,$ruUniqid,$reusetext,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw_chk,$AIBWM); - if($ueuse_result == null){ + if($ueuse_result[0] == true){ echo json_encode(['success' => true]); exit; }else{ - echo json_encode(['success' => false, 'error' => $ueuse_result]); + echo json_encode(['success' => false, 'error' => $ueuse_result[1]]); exit; } }else{ diff --git a/function/settings.php b/function/settings.php new file mode 100644 index 0000000..3f1ce9a --- /dev/null +++ b/function/settings.php @@ -0,0 +1,234 @@ + PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_MULTI_STATEMENTS => false + ); + $pdo = new PDO('mysql:charset=utf8mb4;dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS, $option); + } catch (PDOException $e) { + // 接続エラーのときエラー内容を取得する + $error_message[] = $e->getMessage(); + } + + $userid = safetext($_POST['userid']); + $loginid = safetext($_POST['account_id']); + $loginkey = safetext($_COOKIE['loginkey']); + + $is_login = uwuzuUserLoginCheck($loginid, $loginkey, "user"); + if ($is_login === false) { + echo json_encode(['success' => false, 'error' => '認証に失敗しました。(AUTH_INVALID)']); + exit; + } + + $settings_type = safetext($_POST['settings_type']); + + if($settings_type == "icon"){ + if(isset($_FILES["data"])){ + if (!(empty($_FILES['data']['name']))) { + $uploadedFile = $_FILES['data']; + if(check_mime($uploadedFile['tmp_name'])){ + $extension = convert_mime(check_mime($uploadedFile['tmp_name'])); + delete_exif($extension, $uploadedFile['tmp_name']); + resizeImage($uploadedFile['tmp_name'], 512, 512); + + if(AMS3_CHKS == "true"){ + $usericonurl = getUserData($pdo, $userid)["iconname"]; + if(filter_var($usericonurl, FILTER_VALIDATE_URL)){ + $s3delresult = deleteAmazonS3($usericonurl); + }else{ + $s3delresult = true; + } + if($s3delresult == true){ + $s3result = uploadAmazonS3($uploadedFile['tmp_name']); + }else{ + $s3result = false; + } + }else{ + if(check_mime($uploadedFile['tmp_name']) == "image/webp"){ + $newFilename = createUniqId() . '-'.$userid.'.webp'; + }else{ + $newFilename = createUniqId() . '-'.$userid.'.' . $extension; + } + $uploadedPath = 'usericons/' . $newFilename; + $result = move_uploaded_file($uploadedFile['tmp_name'], '../'.$uploadedPath); + + if ($result) { + $iconName = $uploadedPath; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(1)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(1)エラーコード: S3ERROR'; + }else{ + $iconName = $s3result; // S3に保存されたファイルのパスを使用 + } + } + }else{ + $error_message[] = "使用できない画像形式です。(FILE_UPLOAD_DEKINAKATTA)"; + } + }else{ + $error_message[] = 'アイコン画像を選択してください(PHOTO_SELECT_PLEASE)'; + } + + if(empty($error_message)) { + $currentIconPath = getUserData($pdo, $userid)["iconname"]; + + $pdo->beginTransaction(); + try { + $stmt = $pdo->prepare("UPDATE account SET iconname = :iconname WHERE userid = :userid"); + $stmt->bindValue(':iconname', $iconName, PDO::PARAM_STR); + $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); + $res = $stmt->execute(); + $res = $pdo->commit(); + } catch (Exception $e) { + $pdo->rollBack(); + } + + if ($res) { + if ($currentIconPath) { + unlink('../' . $currentIconPath); + } + echo json_encode(['success' => true]); + exit; + } else { + echo json_encode(['success' => false, 'error' => '更新に失敗しました']); + exit; + } + + // プリペアドステートメントを削除 + $stmt = null; + }else{ + echo json_encode(['success' => false, 'error' => $error_message[0]]); + exit; + } + } + } + + if($settings_type == "header"){ + if(isset($_FILES["data"])){ + if (!(empty($_FILES['data']['name']))) { + $uploadedFile = $_FILES['data']; + if(check_mime($uploadedFile['tmp_name'])){ + $extension = pathinfo($uploadedFile['name'], PATHINFO_EXTENSION); + delete_exif($extension, $uploadedFile['tmp_name']); + resizeImage($uploadedFile['tmp_name'], 2048, 1024); + + if(AMS3_CHKS == "true"){ + $userheadurl = getUserData($pdo, $userid)["headname"]; + if(filter_var($userheadurl, FILTER_VALIDATE_URL)){ + $s3delresult = deleteAmazonS3($userheadurl); + }else{ + $s3delresult = true; + } + if($s3delresult == true){ + $s3result = uploadAmazonS3($uploadedFile['tmp_name']); + }else{ + $s3result = false; + } + }else{ + if(check_mime($uploadedFile['tmp_name']) == "image/webp"){ + $newFilename = createUniqId() . '-'.$userid.'.webp'; + }else{ + $newFilename = createUniqId() . '-'.$userid.'.' . $extension; + } + $uploadedPath = 'userheads/' . $newFilename; + $result = move_uploaded_file($uploadedFile['tmp_name'], '../'.$uploadedPath); + + if ($result) { + $headName = $uploadedPath; // 保存されたファイルのパスを使用 + } else { + $errnum = $uploadedFile['error']; + if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} + if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} + if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} + if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} + if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} + if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} + if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} + $error_message[] = 'アップロード失敗!(2)エラーコード:' .$errcode.''; + } + } + if(isset($s3result)){ + if($s3result == false){ + $error_message[] = 'アップロード失敗!(2)エラーコード: S3ERROR'; + }else{ + $headName = $s3result; // S3に保存されたファイルのパスを使用 + } + } + }else{ + $error_message[] = "使用できない画像形式です。(FILE_UPLOAD_DEKINAKATTA)"; + } + }else{ + $error_message[] = 'アイコン画像を選択してください(PHOTO_SELECT_PLEASE)'; + } + + if(empty($error_message)) { + $currentHeadPath = getUserData($pdo, $userid)["headname"]; + + $pdo->beginTransaction(); + try { + $stmt = $pdo->prepare("UPDATE account SET headname = :headname WHERE userid = :userid"); + $stmt->bindValue(':headname', $headName, PDO::PARAM_STR); + $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); + $res = $stmt->execute(); + $res = $pdo->commit(); + } catch (Exception $e) { + $pdo->rollBack(); + } + + if ($res) { + if ($currentHeadPath) { + unlink('../' . $currentHeadPath); + } + echo json_encode(['success' => true]); + exit; + } else { + echo json_encode(['success' => false, 'error' => '更新に失敗しました']); + exit; + } + + // プリペアドステートメントを削除 + $stmt = null; + }else{ + echo json_encode(['success' => false, 'error' => $error_message[0]]); + exit; + } + } + } + +} else { + echo json_encode(['success' => false, 'error' => '必要なパラメータが提供されていません。']); + exit; +} + +?> \ No newline at end of file diff --git a/function/ueuse.php b/function/ueuse.php new file mode 100644 index 0000000..31391f3 --- /dev/null +++ b/function/ueuse.php @@ -0,0 +1,105 @@ + PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_MULTI_STATEMENTS => false + ); + $pdo = new PDO('mysql:charset=utf8mb4;dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS, $option); + } catch (PDOException $e) { + // 接続エラーのときエラー内容を取得する + actionLog($userid, "error", "ueuse", null, $e, 4); + } + + $userid = safetext($_POST['userid']); + + $ueuse = safetext($_POST['ueuse']); + $nsfw_chk = safetext($_POST['nsfw_chk']); + $loginid = safetext($_POST['account_id']); + $loginkey = safetext($_COOKIE['loginkey']); + + $is_login = uwuzuUserLoginCheck($loginid, $loginkey, "user"); + if ($is_login === false) { + echo json_encode(['success' => false, 'error' => '認証に失敗しました。(AUTH_INVALID)']); + exit; + } + + //ユーザーの認証情報を取得 + $query = $pdo->prepare('SELECT * FROM account WHERE userid = :userid limit 1'); + $query->execute(array(':userid' => $userid)); + $result2 = $query->fetch(); + if($result2["loginid"] === $loginid){ + if(!($result2["role"] == "ice")){ + if(!(empty($result2["other_settings"]))){ + $isAIBWM = val_OtherSettings("isAIBlockWaterMark", $result2["other_settings"]); + }else{ + $isAIBWM = false; + } + + if(isset($nsfw_chk) && $nsfw_chk == "true"){ + $nsfw_chk = "true"; + }else{ + $nsfw_chk = "false"; + } + + if(isset($_FILES['upload_images'])){ + $photo1 = $_FILES['upload_images']; + }else{ + $photo1 = null; + } + if(isset($_FILES['upload_images2'])){ + $photo2 = $_FILES['upload_images2']; + }else{ + $photo2 = null; + } + if(isset($_FILES['upload_images3'])){ + $photo3 = $_FILES['upload_images3']; + }else{ + $photo3 = null; + } + if(isset($_FILES['upload_images4'])){ + $photo4 = $_FILES['upload_images4']; + }else{ + $photo4 = null; + } + if(isset($_FILES['upload_videos1'])){ + $video1 = $_FILES['upload_videos1']; + }else{ + $video1 = null; + } + + if(isset($_POST['rpuniqid'])){ + $rpUniqid = safetext($_POST['rpuniqid']); + }else{ + $rpUniqid = ""; + } + + $ruUniqid = ""; + $ueuse_result = send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw_chk,$isAIBWM); + + if($ueuse_result[0] == true){ + echo json_encode(['success' => true]); + exit; + }else{ + echo json_encode(['success' => false, 'error' => $ueuse_result[1]]); + exit; + } + }else{ + echo json_encode(['success' => false, 'error' => 'お使いのアカウントではユーズができません。']); + exit; + } + }else{ + echo json_encode(['success' => false, 'error' => 'ユーズに失敗しました。']); + exit; + } +} else { + echo json_encode(['success' => false, 'error' => '必要なパラメータが提供されていません。']); + exit; +} + +?> \ No newline at end of file diff --git a/home/index.php b/home/index.php index 66e9328..5d52d4c 100644 --- a/home/index.php +++ b/home/index.php @@ -10,9 +10,6 @@ $serversettings = parse_ini_file($serversettings_file, true); $mojisizefile = "../server/textsize.txt"; $mojisize = (int)safetext(file_get_contents($mojisizefile)); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; - $banurldomainfile = "../server/banurldomain.txt"; $banurl_info = file_get_contents($banurldomainfile); $banurl = preg_split("/\r\n|\n|\r/", $banurl_info); @@ -87,51 +84,6 @@ if(isset($_GET['text'])) { $ueuse = safetext($_COOKIE['ueuse']); } -//------------------------------------------- - -if( !empty($_POST['btn_submit']) ) { - $settingsJsonQuery = $pdo->prepare("SELECT userid, other_settings FROM account WHERE userid = :userid"); - $settingsJsonQuery->bindValue(':userid', $userid); - $settingsJsonQuery->execute(); - $settingsJson = $settingsJsonQuery->fetch(); - if(!(empty($settingsJson["other_settings"]))){ - $isAIBWM = val_OtherSettings("isAIBlockWaterMark", $settingsJson["other_settings"]); - }else{ - $isAIBWM = false; - } - - $ueuse = safetext($_POST['ueuse']); - - if(isset($_POST['nsfw_chk'])){ - $nsfw_chk = safetext($_POST['nsfw_chk']); - }else{ - $nsfw_chk = "false"; - } - - $photo1 = $_FILES['upload_images']; - $photo2 = $_FILES['upload_images2']; - $photo3 = $_FILES['upload_images3']; - $photo4 = $_FILES['upload_images4']; - $video1 = $_FILES['upload_videos1']; - - $rpUniqid = ""; - $ruUniqid = ""; - $ueuse_result = send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw_chk,$isAIBWM); - - if($ueuse_result == null){ - //一時保存していたユーズ内容の削除 - setcookie("ueuse", "", time() - 3600); - - $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']; - header("Location:".$url.""); - exit; - }else{ - $error_message = $ueuse_result; - } -} - - - require('../logout/logout.php'); @@ -148,6 +100,7 @@ $pdo = null; + + @@ -230,7 +231,9 @@ $pdo = null; $(document).ready(function() { var userid = ''; var account_id = ''; + view_ueuse_init(userid, account_id); var pageNumber = 1; + var isLoading = false; if(ueusetext.value){ $('#postContainer').empty(); @@ -252,8 +255,6 @@ $(document).ready(function() { } } - var isLoading = false; - function loadPosts() { if (isLoading) return; isLoading = true; @@ -264,18 +265,18 @@ $(document).ready(function() { // 新しいキーワードで検索を実行 $.ajax({ - url: '../nextpage/searchpage.php', // PHPファイルへのパス - method: 'GET', - data: {page: pageNumber, keyword: keyword, userid: userid , account_id: account_id}, - dataType: 'html', + url: '../nextpage/searchtimeline.php', + method: 'POST', + data: { page: pageNumber, userid: userid, account_id: account_id, keyword: keyword }, + dataType: 'json', timeout: 300000, success: function(response) { - $('#postContainer').append(response); - $("#loading").hide(); + renderUeuses(response); pageNumber++; isLoading = false; + $("#loading").hide(); }, - error: function (xhr, textStatus, errorThrown) { // エラーと判定された場合 + error: function(xhr, textStatus, errorThrown) { isLoading = false; $("#loading").hide(); $("#error").show(); diff --git a/server/uwuzuinfo.txt b/server/uwuzuinfo.txt index 7a9b01e..d174d8c 100644 --- a/server/uwuzuinfo.txt +++ b/server/uwuzuinfo.txt @@ -1,4 +1,4 @@ uwuzu -1.4.16 -2025/03/16 +1.5.0 +2025/05/03 daichimarukana,putonfps \ No newline at end of file diff --git a/server/uwuzurelease.txt b/server/uwuzurelease.txt index 8e3aa7f..fd95d0d 100644 --- a/server/uwuzurelease.txt +++ b/server/uwuzurelease.txt @@ -1,6 +1,46 @@ ## リリースノートだぜぇぇぇぇぇぇい!!!!!!! ここにはuwuzuの更新情報を載せてくぜぇ~!(いやまてテンションおかしいだろ...) +## Version 1.5.0 (Combeny) +2025/05/03 +chg: 大幅にUIを改良しました! +chg: ブックマークページ、フォロータイムラインを大幅に高速化しました! +chg: すべてのタイムラインを高速化しました! +chg: すべてのタイムラインの表示プログラムをサーバーサイドからクライアントサイドへ移行しました! +chg: アカウント削除をジョブ機能を通じて行うようにしました! + これにより、低負荷でのアカウント削除が可能です。 + アカウント削除を実行後は、削除を実行したアカウントにはログインしないでください。 + アカウントの削除が並行で進んでいます。 +chg: ServiceWorkerの機能を更新しました! + これにより、uwuzuを開いた際の読み込みなどが短縮されます。 + また、その他ページより行えるキャッシュクリアが確実に行われるようになります! +chg: cssにダークモード時のボーダーカラーを追加しました。 + color.cssに以下を追加してください。 + "--dark-border-color: #252525;"(色はご自由で大丈夫です。) +new: オブジェクトストレージに対応しました!利用するにはオブジェクトストレージプラグインを有効にする必要があります。 +new: ジョブ機能を実装しました! + この機能を使用するにはデータベースの更新が必要となります。 + データベースに新規でjobsというテーブルを追加してください。 + - sysid(int):AUTO_INCREMENT:システムID + - uniqid(varchar(256)):指定なし:ユニークID + - userid(varchar(512)):指定なし:実行ユーザーID + - job(varchar(1024)):指定なし:ジョブ名 + - step(varchar(256)):指定なし:ステップ名 + - status(varchar(256)):指定なし:ステータス + - datetime(datetime):指定なし:ジョブ作成日時 +new: ロードアベレージ上限超過による自動停止機能を実装しました! + db.phpに"define( 'STOP_LA', '[ロードアベレージ上限(int)]');"を追加することで、もしシステムのロードアベレージがそのロードアベレージを上回った際に、503を返し、一時的にサービスを停止します。 + なお、この機能では、管理者向けページとログインページは停止されません。 + 制限をかけない場合は、"-1"を設定してください。 +new: レートリミットの可変設定を実装しました! + db.phpに"define( 'RATE_LM', '[レートリミット(int)]');"を追加することで、そのレートリミットを超過した際にユーズができなくなります。 + 制限をかけない場合は、"-1"を設定してください。 +new: サイトマップ自動設定機能を追加しました! + /api/sitemap-api.phpから使用できます。 +new: ユーズの送信の進捗状況などを表示する機能を追加しました! +fix: 制御文字を投稿・表示できてしまう問題を修正しました。 +fix: 存在しないロールを参照してしまう問題を修正しました! + ## Version 1.4.16 (Funium) 2025/03/16 fix: モバイル向けUIで、メニューが表示されなくなる問題を修正しました! diff --git a/settings/index.php b/settings/index.php index a6be35f..afed26f 100644 --- a/settings/index.php +++ b/settings/index.php @@ -101,6 +101,18 @@ if( !empty($pdo) ) { }else{ $notification_settings_list = explode(',', $userData["notification_settings"]); } + + if(filter_var($userData['iconname'], FILTER_VALIDATE_URL)){ + $userData['iconname'] = $userData['iconname']; + }else{ + $userData['iconname'] = "../" . $userData['iconname']; + } + + if(filter_var($userData['headname'], FILTER_VALIDATE_URL)){ + $userData['headname'] = $userData['headname']; + }else{ + $userData['headname'] = "../" . $userData['headname']; + } } @@ -347,207 +359,6 @@ if( !empty($_POST['pass_submit']) ) { } } - -if( !empty($_POST['logout']) ) { - if (isset($_SERVER['HTTP_COOKIE'])) { - $cookies = explode(';', $_SERVER['HTTP_COOKIE']); - foreach($cookies as $cookie) { - $parts = explode('=', $cookie); - $name = trim($parts[0]); - setcookie($name, '', time()-1000); - setcookie($name, '', time()-1000, '/'); - } - } - // リダイレクト先のURLへ転送する - $url = '../index.php'; - header('Location: ' . $url, true, 303); - - // すべての出力を終了 - exit; -} - -if( !empty($_POST['img1btn_submit']) ) { - - if (!empty($_FILES['image2s']['name'])) { - // アップロードされたファイル情報 - $uploadedFile = $_FILES['image2s']; - - if(check_mime($uploadedFile['tmp_name'])){ - // アップロードされたファイルの拡張子を取得 - $extension = pathinfo($uploadedFile['name'], PATHINFO_EXTENSION); - - // EXIF削除 - delete_exif($extension, $uploadedFile['tmp_name']); - // リサイズ - resizeImage($uploadedFile['tmp_name'], 2048, 1024); - - if(check_mime($uploadedFile['tmp_name']) == "image/webp"){ - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename = createUniqId() . '-'.$userid.'.webp'; - }else{ - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename = createUniqId() . '-'.$userid.'.' . $extension; - } - // 保存先のパスを生成 - $uploadedPath = 'userheads/' . $newFilename; - - // ファイルを移動 - $result = move_uploaded_file($uploadedFile['tmp_name'], '../'.$uploadedPath); - - if ($result) { - $headName = $uploadedPath; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(2)エラーコード:' .$errcode.''; - } - }else{ - $error_message[] = "使用できない画像形式です。(FILE_UPLOAD_DEKINAKATTA)"; - } - }else{ - $error_message[] = 'ヘッダー画像を選択してください(PHOTO_SELECT_PLEASE)'; - } - - - if( empty($error_message) ) { - // トランザクション開始 - $pdo->beginTransaction(); - - try { - - // SQL作成 - $stmt = $pdo->prepare("UPDATE account SET headname = :headname WHERE userid = :userid"); - - // ヘッダー画像のバインド - $stmt->bindValue(':headname', $headName, PDO::PARAM_STR); - - // ユーザーIDのバインド(WHERE句に必要) - $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); - - // SQLクエリの実行 - $res = $stmt->execute(); - - // コミット - $res = $pdo->commit(); - - - } catch (Exception $e) { - - // エラーが発生した時はロールバック - $pdo->rollBack(); - } - - if ($res) { - $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - header("Location:".$url.""); - exit; - } else { - $error_message[] = '更新に失敗しました。(REGISTERED_DAME)'; - } - - // プリペアドステートメントを削除 - $stmt = null; - } -} - - -if( !empty($_POST['img2btn_submit']) ) { - - if (!empty($_FILES['image']['name'])) { - // アップロードされたファイル情報 - $uploadedFile = $_FILES['image']; - - if(check_mime($uploadedFile['tmp_name'])){ - // アップロードされたファイルの拡張子を取得 - $extension = pathinfo($uploadedFile['name'], PATHINFO_EXTENSION); - - // EXIF削除 - delete_exif($extension, $uploadedFile['tmp_name']); - // リサイズ - resizeImage($uploadedFile['tmp_name'], 512, 512); - - if(check_mime($uploadedFile['tmp_name']) == "image/webp"){ - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename = createUniqId() . '-'.$userid.'.webp'; - }else{ - // 新しいファイル名を生成(uniqid + 拡張子) - $newFilename = createUniqId() . '-'.$userid.'.' . $extension; - } - // 保存先のパスを生成 - $uploadedPath = 'usericons/' . $newFilename; - - // ファイルを移動 - $result = move_uploaded_file($uploadedFile['tmp_name'], '../'.$uploadedPath); - - if ($result) { - $iconName = $uploadedPath; // 保存されたファイルのパスを使用 - } else { - $errnum = $uploadedFile['error']; - if($errnum === 1){$errcode = "FILE_DEKASUGUI_PHP_INI_KAKUNIN";} - if($errnum === 2){$errcode = "FILE_DEKASUGUI_HTML_KAKUNIN";} - if($errnum === 3){$errcode = "FILE_SUKOSHIDAKE_UPLOAD";} - if($errnum === 4){$errcode = "FILE_UPLOAD_DEKINAKATTA";} - if($errnum === 6){$errcode = "TMP_FOLDER_NAI";} - if($errnum === 7){$errcode = "FILE_KAKIKOMI_SIPPAI";} - if($errnum === 8){$errcode = "PHPINFO()_KAKUNIN";} - $error_message[] = 'アップロード失敗!(2)エラーコード:' .$errcode.''; - } - }else{ - $error_message[] = "使用できない画像形式です。(FILE_UPLOAD_DEKINAKATTA)"; - } - }else{ - $error_message[] = 'アイコン画像を選択してください(PHOTO_SELECT_PLEASE)'; - } - - if( empty($error_message) ) { - // トランザクション開始 - $pdo->beginTransaction(); - - try { - - // SQL作成 - $stmt = $pdo->prepare("UPDATE account SET iconname = :iconname WHERE userid = :userid"); - - // アイコン画像のバインド - $stmt->bindValue(':iconname', $iconName, PDO::PARAM_STR); - - // ユーザーIDのバインド(WHERE句に必要) - $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); - - // SQLクエリの実行 - $res = $stmt->execute(); - - // コミット - $res = $pdo->commit(); - - - } catch (Exception $e) { - - // エラーが発生した時はロールバック - $pdo->rollBack(); - } - - if ($res) { - $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - header("Location:".$url.""); - exit; - } else { - $error_message[] = '更新に失敗しました。(REGISTERED_DAME)'; - } - - // プリペアドステートメントを削除 - $stmt = null; - } -} - -require('../logout/logout.php'); - if( !empty($_POST['auth_on_submit']) ) { $_SESSION['userid'] = $userid; // リダイレクト先のURLへ転送する @@ -704,11 +515,11 @@ $pdo = null;

プロフィール

- +
- +

お使いのアカウントは凍結されているため設定を変更できません

@@ -721,11 +532,6 @@ $pdo = null; - -
- - -
@@ -798,7 +604,7 @@ $pdo = null;
- +
@@ -872,7 +678,7 @@ $pdo = null; - + @@ -884,6 +690,10 @@ $pdo = null; \ No newline at end of file diff --git a/settings_admin/ad_admin.php b/settings_admin/ad_admin.php index eebecaf..23aacea 100644 --- a/settings_admin/ad_admin.php +++ b/settings_admin/ad_admin.php @@ -248,7 +248,6 @@ if (!empty($pdo)) {
-

広告一覧

diff --git a/settings_admin/jobs_admin.php b/settings_admin/jobs_admin.php new file mode 100644 index 0000000..fb88682 --- /dev/null +++ b/settings_admin/jobs_admin.php @@ -0,0 +1,231 @@ + 0, + 'path' => '/', + 'domain' => '', + 'secure' => true, + 'httponly' => true, + 'samesite' => 'Lax' +]); +session_start(); +session_regenerate_id(true); + +try { + + $option = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_MULTI_STATEMENTS => false + ); + $pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option); + +} catch(PDOException $e) { + + // 接続エラーのときエラー内容を取得する + $error_message[] = $e->getMessage(); +} +//ログイン認証--------------------------------------------------- +blockedIP($_SERVER['REMOTE_ADDR']); +$is_login = uwuzuUserLogin($_SESSION, $_COOKIE, $_SERVER['REMOTE_ADDR'], "admin"); +if($is_login === false){ + header("Location: ../index.php"); + exit; +}else{ + $userid = safetext($is_login['userid']); + $username = safetext($is_login['username']); + $loginid = safetext($is_login["loginid"]); + $role = safetext($is_login["role"]); + $sacinfo = safetext($is_login["sacinfo"]); + $myblocklist = safetext($is_login["blocklist"]); + $myfollowlist = safetext($is_login["follow"]); + $is_Admin = safetext($is_login["admin"]); +} + +$notiQuery = $pdo->prepare("SELECT COUNT(*) as notification_count FROM notification WHERE touserid = :userid AND userchk = 'none'"); +$notiQuery->bindValue(':userid', $userid); +$notiQuery->execute(); +$notiData = $notiQuery->fetch(PDO::FETCH_ASSOC); + +$notificationcount = $notiData['notification_count']; + +require('../logout/logout.php'); + +if (!empty($pdo)) { + $sql = "SELECT * FROM jobs ORDER BY datetime DESC LIMIT 100"; + $alljobs = $pdo->query($sql); + + while ($row = $alljobs->fetch(PDO::FETCH_ASSOC)) { + $jobs[] = $row; + } +} + +?> + + + + + + + + + + + +ログ - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?> + + + + + +
+ + +
    + +

    + +
+ +
+ + +
+
+

ジョブ

+

直近100件のジョブを表示します。

+
この機能はベータ版機能であり、今後変更や削除が行われるおそれがあります。
+ + +
+
+ | +

ジョブ:

+

ステップ:

+

発生日時:

+

実行ユーザー:

+
+
+ + +

ジョブはありません

+ +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/settings_admin/overview_admin.php b/settings_admin/overview_admin.php index 920d01c..c51c8e7 100644 --- a/settings_admin/overview_admin.php +++ b/settings_admin/overview_admin.php @@ -317,6 +317,14 @@ require('../logout/logout.php');

過去1分間のロードアベレージ :


+

自動停止ロードアベレージ上限

+
uwuzuが自動停止するロードアベレージの上限です。
"-1"で無制限です。
+

+
+

ユーズのレートリミット

+
1分間にユーズできる上限です。
"-1"で無制限です。
+

ueuse/min

+

データベース

データベースの容量情報です。
diff --git a/settings_admin/plugin_admin.php b/settings_admin/plugin_admin.php index 1d43f65..551ec2a 100644 --- a/settings_admin/plugin_admin.php +++ b/settings_admin/plugin_admin.php @@ -41,6 +41,10 @@ require('plugin_settings/phpmailer_sender.php'); require('plugin_settings/aiblockwatermark_settings.php'); //------------------------------------------------------ +//AmazonS3-------------------------------------------- +require('plugin_settings/amazons3_settings.php'); +//------------------------------------------------------ + session_name('uwuzu_s_id'); session_set_cookie_params([ 'lifetime' => 0, @@ -136,6 +140,40 @@ if( !empty($_POST['btn_submit']) ) { fputs($file, $data); fclose($file); + //---------------------------------------------------------------------- + + $N_AMS3_CHKS = safetext($_POST['ams3chk_onoff']); + + $N_AMS3_BASE_URLS = safetext($_POST['N_AMS3_BASE_URLS']); + $N_AMS3_BUCKET_NM = safetext($_POST['N_AMS3_BUCKET_NM']); + $N_AMS3_PREFIX_NM = safetext($_POST['N_AMS3_PREFIX_NM']); + $N_AMS3_ENDPOINTS = safetext($_POST['N_AMS3_ENDPOINTS']); + $N_AMS3_REGION_NM = safetext($_POST['N_AMS3_REGION_NM']); + $N_AMS3_ACCESSKEY = safetext($_POST['N_AMS3_ACCESSKEY']); + $N_AMS3_SECRETKEY = safetext($_POST['N_AMS3_SECRETKEY']); + $N_AMS3_IS_S3FPS_ = safetext($_POST['N_AMS3_IS_S3FPS_']); + + $New_AMS3_Settings = " + + "; + + //設定上書き + $file = fopen('plugin_settings/amazons3_settings.php', 'w'); + $data = $New_AMS3_Settings; + fputs($file, $data); + fclose($file); + $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; header("Location:".$url.""); exit; @@ -278,6 +316,45 @@ require('../logout/logout.php'); + +
+ +

オブジェクトストレージプラグイン

+
Amazon S3及びAmazon S3互換オブジェクトストレージが使用できるようになるプラグインです。pluginフォルダに解凍済みのAWS SDK for PHPのファイル一式が入っていることが必須要件になります。
plugin/aws/README.MDなど一式
+

オブジェクトストレージのオンオフ

+
+ + + + + + + +
+
+

オブジェクトストレージ - 保存先設定

+
BaseURL
+ +
Bucket
+ +
Prefix
+ +
Endpoint
+ +
Region
+ +
Access Key
+ +
Secret Key
+ + +
s3ForcePathStyle設定
+
+ checked/> + +
+
+ @@ -324,4 +401,13 @@ require('../logout/logout.php'); $('#mail_plugin').toggle(); $('#mail_plugin_chk').toggle(); }); + + if ($("#ams3chk_onoff").prop("checked")) { + $('#ams3_plugin').show(); + }else{ + $('#ams3_plugin').hide(); + } + $('#ams3chk_onoff').change(function(){ + $('#ams3_plugin').toggle(); + }); \ No newline at end of file diff --git a/settings_admin/plugin_settings/amazons3_settings.php b/settings_admin/plugin_settings/amazons3_settings.php new file mode 100644 index 0000000..4ab49cb --- /dev/null +++ b/settings_admin/plugin_settings/amazons3_settings.php @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/settings_admin/role_admin.php b/settings_admin/role_admin.php index 046f061..929bd2b 100644 --- a/settings_admin/role_admin.php +++ b/settings_admin/role_admin.php @@ -401,7 +401,6 @@ if (!empty($pdo)) {
-

ロール付与

特定のユーザーにロール付与するときに使用してください。

diff --git a/settings_admin/settings_left_menu.php b/settings_admin/settings_left_menu.php index c4eb2fa..3f43c41 100644 --- a/settings_admin/settings_left_menu.php +++ b/settings_admin/settings_left_menu.php @@ -14,5 +14,6 @@ アップデート IPブロック ログ + ジョブ
\ No newline at end of file diff --git a/settings_admin/update_admin.php b/settings_admin/update_admin.php index 0846007..a6d1172 100644 --- a/settings_admin/update_admin.php +++ b/settings_admin/update_admin.php @@ -91,7 +91,7 @@ if (!empty($_POST['update_submit'])) { copy($sourceFile, $destinationFile); } else { - $error_message[] = "アップデート元のzipファイルに本来予定されていたファイルがありませんでしたが、アップデート作業は完了しました。(UPDATE_FILE_NOT_FOUND)"; + $error_message[] = "アップデート元のzipファイルに本来予定されていたファイルがありませんでしたが、アップデート作業は完了しました。(UPDATE_FILE_NOT_FOUND(".$sourceFile."))"; } } } @@ -103,7 +103,7 @@ if (!empty($_POST['update_submit'])) { if (file_exists($deleteFile)) { unlink($deleteFile); } else { - $error_message[] = "削除予定のファイルがありませんでしたが、アップデート作業は完了しました。(DELETE_FILE_NOT_FOUND)"; + $error_message[] = "削除予定のファイルがありませんでしたが、アップデート作業は完了しました。(DELETE_FILE_NOT_FOUND(".$deleteFile."))"; } } } diff --git a/settings_admin/useradmin.php b/settings_admin/useradmin.php index 094ee95..443b069 100644 --- a/settings_admin/useradmin.php +++ b/settings_admin/useradmin.php @@ -215,8 +215,6 @@ if (!empty($pdo)) { - -

通報

diff --git a/settings_admin/userinfo.php b/settings_admin/userinfo.php index 6046d13..9e7edf0 100644 --- a/settings_admin/userinfo.php +++ b/settings_admin/userinfo.php @@ -96,7 +96,7 @@ if (!empty($pdo)) { $view_ip_addr = $userdata["last_ip"]; } - $roles = explode(',', $userdata["role"]); + $roles = array_filter(explode(',', $userdata["role"])); $roleDataArray = array(); @@ -118,6 +118,7 @@ if (!empty($pdo)) { $result->execute(); $upload_cnt1 = $result->rowCount(); + $userdata['iconname'] = filter_var($userdata['iconname'], FILTER_VALIDATE_URL) ? $userdata['iconname'] : "../" . $userdata['iconname']; } if( !empty($_POST['send_notification_submit']) ) { @@ -344,162 +345,35 @@ if( !empty($_POST['send_water_submit']) ) { if( !empty($_POST['send_ban_submit']) ) { - $userId2 = $userdata['userid']; // 削除対象のユーザーID - $folderPath = "../ueuseimages/"; // フォルダのパス + try{ + $userId2 = $userdata['userid']; // 削除対象のユーザーID + $res = addJob($pdo, $userId2, "deleteUser", "stop_account"); - // 指定したフォルダ内でユーザーIDを含むファイルを検索 - $filesToDelete = glob($folderPath . "*-$userId2.*"); // 「-ユーザーID.拡張子」というパターンを検索 - - // ファイルを順に削除 - foreach ($filesToDelete as $file) { - if (is_file($file)) { - unlink($file); // ファイルを削除 - } - } - - $folderPath2 = "../ueusevideos/"; // フォルダのパス - - // 指定したフォルダ内でユーザーIDを含むファイルを検索 - $filesToDelete2 = glob($folderPath2 . "*-$userId2.*"); // 「-ユーザーID.拡張子」というパターンを検索 - - // ファイルを順に削除 - foreach ($filesToDelete2 as $file2) { - if (is_file($file2)) { - unlink($file2); // ファイルを削除 - } - } + if ($res) { + actionLog($userid, "info", "send_ban_submit", $userId2, $userid."さんが".$userId2."さんをBANしました", 4); + header("Location:useradmin"); + exit; - $folderPath3 = "../usericons/"; // フォルダのパス - - // 指定したフォルダ内でユーザーIDを含むファイルを検索 - $filesToDelete3 = glob($folderPath3 . "*-$userId2.*"); // 「-ユーザーID.拡張子」というパターンを検索 - - // ファイルを順に削除 - foreach ($filesToDelete3 as $file3) { - if (is_file($file3)) { - unlink($file3); // ファイルを削除 - } - } + //BAN通知メール + if(false !== strpos($userdata["mail_settings"], 'important')) { + if(!empty(MAIL_CHKS)){ + if(MAIL_CHKS == "true"){ + if( !empty($view_mailadds) ){ + if(filter_var($view_mailadds, FILTER_VALIDATE_EMAIL)){ + $mail_title = "お使いの".safetext($serversettings["serverinfo"]["server_name"])."アカウントはBANされました"; + $mail_text = "".$userdata["username"]."(".$userdata["userid"].")さん いつもuwuzuをご利用いただきありがとうございます。 この度、ご利用のアカウント(".$userdata["userid"].")が".safetext($serversettings["serverinfo"]["server_name"])."管理者によりBAN(削除)されたためお知らせいたします。 今後は今までご利用いただいた".safetext($serversettings["serverinfo"]["server_name"])."アカウントは利用できません。 ".safetext($serversettings["serverinfo"]["server_name"])."サーバー上から今までご利用いただいていたアカウントの情報は削除されたためログインなどもできません。 ご理解とご協力のほどよろしくお願いします。"; - $folderPath4 = "../userheads/"; // フォルダのパス - - // 指定したフォルダ内でユーザーIDを含むファイルを検索 - $filesToDelete4 = glob($folderPath4 . "*-$userId2.*"); // 「-ユーザーID.拡張子」というパターンを検索 - - // ファイルを順に削除 - foreach ($filesToDelete4 as $file4) { - if (is_file($file4)) { - unlink($file4); // ファイルを削除 - } - } - - - try { - // フォロー・フォロワー情報を削除したい全てのアカウントを取得 - $flw_query = $pdo->prepare("SELECT * - FROM account - WHERE follow LIKE :pattern1 - OR follow LIKE :pattern2 - OR follow LIKE :pattern3 - OR follower LIKE :pattern1 - OR follower LIKE :pattern2 - OR follower LIKE :pattern3 - "); - $flw_query->bindValue(':pattern1', "%,$userId2,%", PDO::PARAM_STR); // 中間に位置する場合 - $flw_query->bindValue(':pattern2', "%,$userId2", PDO::PARAM_STR); // 末尾に位置する場合 - $flw_query->bindValue(':pattern3', "$userId2,%", PDO::PARAM_STR); // 先頭に位置する場合 - $flw_query->execute(); - $flw_accounts = $flw_query->fetchAll(); - - foreach ($flw_accounts as $account) { - unfollow_user($pdo, $account['userid'], $userId2); - unfollow_user($pdo, $userId2, $account['userid']); - } - - // ユーザーIDを削除したい全てのアカウントを取得 - $blk_query = $pdo->prepare("SELECT * - FROM account - WHERE blocklist LIKE :pattern1 - OR blocklist LIKE :pattern2 - OR blocklist LIKE :pattern3 - "); - $blk_query->bindValue(':pattern1', "%,$userId2,%", PDO::PARAM_STR); // 中間に位置する場合 - $blk_query->bindValue(':pattern2', "%,$userId2", PDO::PARAM_STR); // 末尾に位置する場合 - $blk_query->bindValue(':pattern3', "$userId2,%", PDO::PARAM_STR); // 先頭に位置する場合 - $blk_query->execute(); - $blk_accounts = $blk_query->fetchAll(); - - foreach ($blk_accounts as $account) { - unblock_user($pdo, $userId2, $account['userid']); - } - - $pdo->beginTransaction(); - try { - // 投稿削除クエリを実行 - $deleteQuery = $pdo->prepare("DELETE FROM ueuse WHERE account = :userid"); - $deleteQuery->bindValue(':userid', $userId2, PDO::PARAM_STR); - $res = $deleteQuery->execute(); - - // 通知削除クエリを実行(自分宛ての通知) - $deleteQuery = $pdo->prepare("DELETE FROM notification WHERE touserid = :touserid"); - $deleteQuery->bindValue(':touserid', $userId2, PDO::PARAM_STR); - $res = $deleteQuery->execute(); - - // 通知削除クエリを実行(自分からの通知) - $deleteQuery = $pdo->prepare("DELETE FROM notification WHERE fromuserid = :fromuserid"); - $deleteQuery->bindValue(':fromuserid', $userId2, PDO::PARAM_STR); - $res = $deleteQuery->execute(); - - // いいねの削除 - $query = $pdo->prepare("SELECT * FROM ueuse WHERE favorite LIKE :pattern1 OR favorite LIKE :pattern2 OR favorite LIKE :pattern3"); - $query->bindValue(':pattern1', "%,$userId2,%", PDO::PARAM_STR); - $query->bindValue(':pattern2', "%,$userId2", PDO::PARAM_STR); - $query->bindValue(':pattern3', "$userId2,%", PDO::PARAM_STR); - $query->execute(); - $accounts = $query->fetchAll(); - - foreach ($accounts as $account) { - // いいねの更新 - if (strpos($account['favorite'], ",$userId2,") !== false || strpos($account['favorite'], ",$userId2") !== false || strpos($account['favorite'], "$userId2,") !== false) { - $favoriteList = explode(',', $account['favorite']); - $favoriteList = array_diff($favoriteList, array($userId2)); - $newFavoriteList = implode(',', $favoriteList); - - $updateFavoriteQuery = $pdo->prepare("UPDATE ueuse SET favorite = :favorite WHERE uniqid = :uniqid"); - $updateFavoriteQuery->bindValue(':favorite', $newFavoriteList, PDO::PARAM_STR); - $updateFavoriteQuery->bindValue(':uniqid', $account['uniqid'], PDO::PARAM_STR); - $updateFavoriteQuery->execute(); - } - } - - $deleteQuery = $pdo->prepare("DELETE FROM account WHERE userid = :userid"); - $deleteQuery->bindValue(':userid', $userId2, PDO::PARAM_STR); - $res = $deleteQuery->execute(); - - $pdo->commit(); - } catch (Exception $e) { - // エラーが発生した時はロールバック - $pdo->rollBack(); - actionLog($userId2, "error", "deleteAccount", null, $e, 4); - } - - //BAN通知メール - if(false !== strpos($userdata["mail_settings"], 'important')) { - if(!empty(MAIL_CHKS)){ - if(MAIL_CHKS == "true"){ - if( !empty($view_mailadds) ){ - if(filter_var($view_mailadds, FILTER_VALIDATE_EMAIL)){ - $mail_title = "お使いの".safetext($serversettings["serverinfo"]["server_name"])."アカウントはBANされました"; - $mail_text = "".$userdata["username"]."(".$userdata["userid"].")さん いつもuwuzuをご利用いただきありがとうございます。 この度、ご利用のアカウント(".$userdata["userid"].")が".safetext($serversettings["serverinfo"]["server_name"])."管理者によりBAN(削除)されたためお知らせいたします。 今後は今までご利用いただいた".safetext($serversettings["serverinfo"]["server_name"])."アカウントは利用できません。 ".safetext($serversettings["serverinfo"]["server_name"])."サーバー上から今までご利用いただいていたアカウントの情報は削除されたためログインなどもできません。 ご理解とご協力のほどよろしくお願いします。"; - - $error_message[] = send_html_mail($view_mailadds,$mail_title,$mail_text,"../"); + $error_message[] = send_html_mail($view_mailadds,$mail_title,$mail_text,"../"); + } } } } } + //------------ + } else { + $error_message[] = 'アカウント削除に失敗しました。(ACCOUNT_DELETE_DAME)'; + actionLog($userid, "error", "send_ban_submit", $userId2, $error_message[], 4); } - //------------ - } catch (Exception $e) { // エラーが発生した時はロールバック @@ -507,16 +381,6 @@ if( !empty($_POST['send_ban_submit']) ) { actionLog($userid, "error", "send_ban_submit", $userId2, $e, 4); } - if ($res) { - actionLog($userid, "info", "send_ban_submit", $userId2, $userid."さんが".$userId2."さんをBANしました", 4); - header("Location:useradmin"); - exit; - } else { - $error_message[] = 'アカウント削除に失敗しました。(ACCOUNT_DELETE_DAME)'; - actionLog($userid, "error", "send_ban_submit", $userId2, $error_message, 4); - } - - // プリペアドステートメントを削除 $stmt = null; } @@ -555,7 +419,7 @@ require('../logout/logout.php');
- +

@

@@ -566,13 +430,17 @@ require('../logout/logout.php'); diff --git a/sw.js b/sw.js index 1cebf65..4b4c11b 100644 --- a/sw.js +++ b/sw.js @@ -1,49 +1,88 @@ -var CACHE_NAME = "app_uwuzu"; -var urlsToCache = [ +var CACHE_VERSION = 'uwuzu-cache-v1'; + +var resources = [ + "/css/color.css", + "/css/font.css", + "/css/home.css", "/home/index.php", "/unsupported.php", + "/img/sysimage/menuicon/addemoji.svg", + "/img/sysimage/menuicon/addnotice.svg", + "/img/sysimage/menuicon/bookmark.svg", + "/img/sysimage/menuicon/emoji.svg", + "/img/sysimage/menuicon/home.svg", + "/img/sysimage/menuicon/info.svg", + "/img/sysimage/menuicon/logout.svg", + "/img/sysimage/menuicon/menu.svg", + "/img/sysimage/menuicon/notice.svg", + "/img/sysimage/menuicon/notification.svg", + "/img/sysimage/menuicon/notification2.svg", + "/img/sysimage/menuicon/others.svg", + "/img/sysimage/menuicon/privacypolicy.svg", + "/img/sysimage/menuicon/profile.svg", + "/img/sysimage/menuicon/search.svg", + "/img/sysimage/menuicon/server.svg", + "/img/sysimage/menuicon/settings.svg", + "/img/sysimage/menuicon/terms.svg", + "/img/sysimage/menuicon/useradmin.svg" ]; -self.addEventListener('install', function(event) { - event.waitUntil( - caches.open(CACHE_NAME) - .then(function(cache) { - return cache.addAll(urlsToCache); - }).catch(function(error) { - console.error("Failed to cache:", error); - }) +self.addEventListener('install', function (e) { + e.waitUntil( + caches.open(CACHE_VERSION).then(function (cache) { + return cache.addAll(resources); + }) ); }); -/* -self.addEventListener('fetch', function(event) { - event.respondWith( - caches.match(event.request) - .then(function(response) { +self.addEventListener('fetch', function (e) { + if (!(e.request.url.indexOf('http') === 0)) return; + + if (e.request.method !== 'GET') { + return; + } + + const url = new URL(e.request.url); + const pathname = url.pathname; + + if (resources.includes(pathname)) { + e.respondWith( + caches.match(e.request).then(function (response) { if (response) { return response; } - - var url = new URL(event.request.url); - - if (!url.pathname.includes(".")) { - if (!url.pathname.endsWith('/')) { - url.pathname += '/'; - } - return caches.match(url.pathname + "index.php"); - } - - return fetch(event.request) - .then(function(networkResponse) { - return caches.open("app_uwuzu").then(function(cache) { - cache.put(event.request, networkResponse.clone()); - return networkResponse; - }); - }) - .catch(function() { - return caches.match('/unsupported.php'); - }); + return fetch(e.request); }) - ); + ); + } else { + e.respondWith(fetch(e.request)); + } +}); + + +self.addEventListener('message', function (e) { + if (e.data && e.data.action === 'clearCache') { + caches.keys().then(function (cacheNames) { + Promise.all( + cacheNames.map(function (cacheName) { + if (cacheName === CACHE_VERSION) { + return caches.delete(cacheName); + } + }) + ).then(function (results) { + if (results.includes(true)) { + console.log('キャッシュを削除しました'); + caches.open(CACHE_VERSION).then(function (cache) { + cache.addAll(resources).then(function () { + console.log('リソースを再キャッシュしました'); + }).catch(function (error) { + console.error('リソースの再キャッシュに失敗しました:', error); + }); + }); + } else { + console.log('キャッシュ削除に失敗しました'); + } + }); + }); + } }); -*/ \ No newline at end of file diff --git a/ueuse/index.php b/ueuse/index.php index 472a172..6b02922 100644 --- a/ueuse/index.php +++ b/ueuse/index.php @@ -11,8 +11,6 @@ require('../function/function.php'); $mojisizefile = "../server/textsize.txt"; $mojisize = (int)safetext(file_get_contents($mojisizefile)); -//投稿及び返信レート制限↓(分):デフォで60件/分まで -$max_ueuse_rate_limit = 60; $banurldomainfile = "../server/banurldomain.txt"; $banurl_info = file_get_contents($banurldomainfile); @@ -109,48 +107,6 @@ if(isset($_GET['text'])) { $ueuse = safetext($_COOKIE['ueuse']); } -//------------------------------------------- - -if( !empty($_POST['btn_submit']) ) { - $settingsJsonQuery = $pdo->prepare("SELECT userid, other_settings FROM account WHERE userid = :userid"); - $settingsJsonQuery->bindValue(':userid', $userid); - $settingsJsonQuery->execute(); - $settingsJson = $settingsJsonQuery->fetch(); - if(!(empty($settingsJson["other_settings"]))){ - $isAIBWM = val_OtherSettings("isAIBlockWaterMark", $settingsJson["other_settings"]); - }else{ - $isAIBWM = false; - } - - $ueuse = safetext($_POST['ueuse']); - - if(isset($_POST['nsfw_chk'])){ - $nsfw_chk = safetext($_POST['nsfw_chk']); - }else{ - $nsfw_chk = "false"; - } - - $photo1 = $_FILES['upload_images']; - $photo2 = $_FILES['upload_images2']; - $photo3 = $_FILES['upload_images3']; - $photo4 = $_FILES['upload_images4']; - $video1 = $_FILES['upload_videos1']; - - $rpUniqid = $ueuseid; - $ruUniqid = ""; - $ueuse_result = send_ueuse($userid,$rpUniqid,$ruUniqid,$ueuse,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw_chk,$isAIBWM); - - if($ueuse_result == null){ - //一時保存していたユーズ内容の削除 - setcookie("ueuse", "", time() - 3600, "/!".$ueuseid); - - $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - header("Location:".$url.""); - exit; - }else{ - $error_message = $ueuse_result; - } -} if( !empty($_POST['logout']) ) { if (isset($_SERVER['HTTP_COOKIE'])) { @@ -185,6 +141,7 @@ $pdo = null; + @@ -227,6 +184,9 @@ $pdo = null;
+
+
+
@@ -265,7 +225,7 @@ $pdo = null;
- +