1
0
mirror of https://github.com/Daichimarukana/uwuzu.git synced 2026-06-04 19:14:41 +00:00

uwuzu v1.6.14 Hapuego

This commit is contained in:
だいちまる
2026-05-04 01:30:16 +09:00
parent e365304a18
commit be989f826b
24 changed files with 527 additions and 420 deletions
+3 -33
View File
@@ -133,38 +133,8 @@ if( !empty($pdo) ) {
}
if($backuplogin === true || uwuzu_password_verify($userbackupcode,$row["backupcode"])){
$pdo->beginTransaction();
try {
$touserid = $userid;
$datetime = date("Y-m-d H:i:s");
$msg = "バックアップコードを使用しログインされました!\nバックアップコード変更のために二段階認証を再設定することを強くおすすめします。\nまた、もしバックアップコードを利用してログインした覚えがない場合は「その他」よりセッショントークンを再生成し、設定画面よりパスワードを変更し、二段階認証を再設定してください!\n\nログインした端末 : ".$device;
$title = '🔴バックアップコード使用のお知らせ🔴';
$url = '/settings';
$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', safetext("uwuzu-fromsys"), PDO::PARAM_STR);
$stmt->bindParam(':touserid', safetext($touserid), PDO::PARAM_STR);
$stmt->bindParam(':msg', safetext($msg), PDO::PARAM_STR);
$stmt->bindParam(':url', safetext($url), PDO::PARAM_STR);
$stmt->bindParam(':userchk', safetext($userchk), PDO::PARAM_STR);
$stmt->bindParam(':title', safetext($title), PDO::PARAM_STR);
$stmt->bindParam(':datetime', safetext($datetime), PDO::PARAM_STR);
// SQLクエリの実行
$res = $stmt->execute();
// コミット
$res = $pdo->commit();
} catch(Exception $e) {
// エラーが発生した時はロールバック
$pdo->rollBack();
}
send_notification($userid,"uwuzu-fromsys","🔴バックアップコード使用のお知らせ🔴",$msg,"/settings", "login");
clearstatcache();
@@ -199,7 +169,7 @@ if( !empty($pdo) ) {
$_SESSION['loginid'] = $userData["loginid"];
$_SESSION['loginkey'] = $userLoginKey;
$_SESSION['username'] = $username;
$_SESSION['username'] = $userData["username"];
$_SESSION['password'] = null;
$_SESSION["login_passtry"] = 0;
@@ -276,7 +246,7 @@ if( !empty($pdo) ) {
$_SESSION['loginid'] = $userData["loginid"];
$_SESSION['loginkey'] = $userLoginKey;
$_SESSION['username'] = $username;
$_SESSION['username'] = $userData["username"];
$_SESSION['password'] = null;
$_SESSION["login_passtry"] = 0;
+2
View File
@@ -17,6 +17,8 @@ $stmt = null;
$res = null;
$option = null;
$domain = $_SERVER['HTTP_HOST'];
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
+1 -1
View File
@@ -133,7 +133,7 @@ if( !empty($pdo) ) {
$_SESSION['loginid'] = $userData["loginid"];
$_SESSION['loginkey'] = $userLoginKey;
$_SESSION['username'] = $username;
$_SESSION['username'] = $userData["username"];
$_SESSION['password'] = null;
//ログイン失敗履歴のお掃除
+61 -11
View File
@@ -36,16 +36,9 @@ body {
margin-right: auto;
padding-top: 12px;
background-color: var(--background-color);
/* 画像を常に天地左右の中央に配置 */
background-position: center center;
/* 画像をタイル状に繰り返し表示しない */
background-repeat: no-repeat;
/* コンテンツの高さが画像の高さより大きい時、動かないように固定 */
background-attachment: fixed;
/* 表示するコンテナの大きさに基づいて、背景画像を調整 */
background-size: cover;
}
@@ -1130,6 +1123,7 @@ main h1 {
text-decoration: none;
font-family: var(--Text-fonts), sans-serif;
font-weight: bold;
position: relative;
}
.ueuse .flebox a .u_name img {
@@ -1143,7 +1137,28 @@ main h1 {
border-radius: 0px;
}
.ueuse .flebox a .status {
position: absolute;
left: calc(48px - 28px);
top: calc(48px - 16px);
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #CCC;
border: solid 4px var(--tl-color);
}
.ueuse .flebox a .green {
background-color: #00cc4e;
}
.ueuse .flebox a .yellow {
background-color: #ffc400;
}
.ueuse .flebox a .gray {
background-color: #CCC;
}
.ueuse .flebox .idbox {
@@ -1601,16 +1616,34 @@ main h1 {
.ueuse .youtube_and_nicovideo_player {
margin-top: 12px;
width: 100%;
width: calc(100% - 2px);
height: fit-content;
min-height: 152px;
background-color: var(--background-color);
text-align: center;
border-radius: 10px;
border: solid 1px var(--border-color);
overflow: hidden;
position: relative;
}
.ueuse .youtube_and_nicovideo_player p{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-family: var(--Mono-fonts);
color: var(--text-color);
font-size: 14px;
}
.ueuse .youtube_and_nicovideo_player iframe {
border: none;
width: 100%;
max-height: 50dvh;
aspect-ratio: 16 / 9;
border-radius: 10px;
border: 1px solid var(--border-color);
vertical-align: bottom;
}
.ueuse .abi {
@@ -6792,6 +6825,7 @@ noscript .noscript_modal .inner .center_text p {
margin-left: auto;
margin-right: auto;
padding-top: 0px;
overflow-x: hidden;
}
.userleftbox {
@@ -7331,6 +7365,13 @@ noscript .noscript_modal .inner .center_text p {
font-size: 12px;
}
.ueuse .youtube_and_nicovideo_player iframe {
max-height: 25dvh;
}
.youtube_and_nicovideo_player iframe[src*="spotify.com"] {
height: 152px;
}
.leftbox {
display: block;
border-radius: 17px;
@@ -8477,6 +8518,10 @@ noscript .noscript_modal .inner .center_text p {
color: var(--main-color);
}
.ueuse .flebox a .status {
border: solid 4px var(--dark-sub-color);
}
.ueuse p {
color: var(--dark-text-color);
}
@@ -8765,8 +8810,13 @@ noscript .noscript_modal .inner .center_text p {
background-color: var(--dark-sub-color);
}
.ueuse .youtube_and_nicovideo_player iframe {
border: 1px solid var(--dark-border-color);
.ueuse .youtube_and_nicovideo_player p{
color: var(--dark-text-color);
}
.ueuse .youtube_and_nicovideo_player {
background-color: var(--dark-background-color);
border: solid 1px var(--dark-border-color);
}
.userheader h2 {
+1 -2
View File
@@ -5,6 +5,7 @@ require('../db.php');
require("function.php");
blockedIP($_SERVER['REMOTE_ADDR']);
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id'])) && safetext(isset($_COOKIE['loginkey']))) {
$userid = safetext($_POST['userid']);
try {
$option = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
@@ -16,8 +17,6 @@ if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && sa
actionLog($userid, "error", "ueuse", null, $e, 4);
}
$userid = safetext($_POST['userid']);
$uniqid = safetext($_POST['uniqid']);
$loginid = safetext($_POST['account_id']);
$loginkey = safetext($_COOKIE['loginkey']);
+44 -7
View File
@@ -1179,6 +1179,7 @@ function x1024($byte){
}
function uwuzu_ver($select,$path){
$softwaredata = file_get_contents($path);
$software_info = array();
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
@@ -3633,6 +3634,7 @@ function uwuzu_password_verify($password, $hash){
//ユーザーのOther_Settings読み取り関数
function val_OtherSettings($dataname, $jsontext){
$other_settings = json_decode($jsontext, true);
$ret = false;
if(!(empty($other_settings[$dataname]))) {
if(is_bool($other_settings[$dataname]) === true){
if($other_settings[$dataname] == true){
@@ -3653,6 +3655,7 @@ function val_OtherSettings($dataname, $jsontext){
//ユーザーのOther_Settings追加関数
function val_AddOtherSettings($dataname, $data, $jsontext){
$other_settings = json_decode($jsontext, true);
$ret = false;
if(empty($other_settings)){
$new_data = [$dataname=>$data];
$ret = json_encode($new_data);
@@ -3719,6 +3722,33 @@ function is_OtherSettings($pdo, $userid, $add = true){
}
}
function getUserOnlineStatus(string $last_login_datetime, string $other_settings){
$isPublicOnlineStatus = val_OtherSettings("isPublicOnlineStatus", $other_settings);
if($isPublicOnlineStatus === true){
if (!(empty($last_login_datetime))) {
$lastLogin = new DateTime($last_login_datetime);
$now = new DateTime();
$interval = $now->diff($lastLogin);
$minutesPast = ($interval->days * 24 * 60) + ($interval->h * 60) + $interval->i;
if ($minutesPast <= 5) {
$OnlineStatus = "Online";
} elseif ($minutesPast <= 15) {
$OnlineStatus = "Away";
} else {
$OnlineStatus = "Offline";
}
} else {
$OnlineStatus = "Offline";
}
}else{
$OnlineStatus = "Private";
}
return $OnlineStatus;
}
function GetActivityPubJson($url) {
$ch = curl_init($url);
curl_setopt_array($ch, [
@@ -3824,16 +3854,18 @@ function GetActivityPubUser($userid, $domain) {
function FormatUeuseItem(array $value, string $myblocklist, string $mybookmark, $pdo, string $userId): ?array {
if ($value["role"] === "ice") return null;
if(isset($value["other_settings"])) {
$value["isAIBlock"] = val_OtherSettings("isAIBlock", $value["other_settings"]);
$value["OnlineStatus"] = getUserOnlineStatus($value["last_login_datetime"], $value["other_settings"]);
} else {
$value["isAIBlock"] = false;
$value["OnlineStatus"] = null;
}
$value['iconname'] = filter_var($value['iconname'], FILTER_VALIDATE_URL)
? $value['iconname']
: "../" . $value['iconname'];
if(isset($value["other_settings"])) {
$value["isAIBlock"] = val_OtherSettings("isAIBlock", $value["other_settings"]);
} else {
$value["isAIBlock"] = false;
}
$value = to_null($value);
$value = to_array_safetext($value);
$value["role"] = explode(',', $value["role"]);
@@ -3862,8 +3894,10 @@ function FormatUeuseItem(array $value, string $myblocklist, string $mybookmark,
if(isset($reusedUserData["other_settings"])) {
$reusedUserData["isAIBlock"] = val_OtherSettings("isAIBlock", $reusedUserData["other_settings"]);
$reusedUserData["OnlineStatus"] = getUserOnlineStatus($reusedUserData["last_login_datetime"], $reusedUserData["other_settings"]);
} else {
$reusedUserData["isAIBlock"] = false;
$reusedUserData["OnlineStatus"] = null;
}
$reused = to_null($reused);
@@ -3889,6 +3923,7 @@ function FormatUeuseItem(array $value, string $myblocklist, string $mybookmark,
"role" => $reusedUserData["role"],
"is_bot" => $reusedUserData["is_bot"],
"is_aiblock" => (bool)$reusedUserData["isAIBlock"],
"online_status" => $reusedUserData["OnlineStatus"],
],
"ueuse" => $reused["ueuse"],
"photo1" => $reused["photo1"],
@@ -3929,6 +3964,7 @@ function FormatUeuseItem(array $value, string $myblocklist, string $mybookmark,
"role" => $value["role"],
"is_bot" => $value["is_bot"],
"is_aiblock" => (bool)$value["isAIBlock"],
"online_status" => $value["OnlineStatus"],
],
"ueuse" => $value["ueuse"],
"photo1" => $value["photo1"],
@@ -4189,7 +4225,7 @@ function getDatasUeuse(PDO $pdo, array $messages): array {
$users = [];
if (!empty($userIds)) {
$placeholders = implode(',', array_fill(0, count($userIds), '?'));
$stmt = $pdo->prepare("SELECT userid, username, profile, role, iconname, headname, sacinfo, other_settings FROM account WHERE userid IN ($placeholders)");
$stmt = $pdo->prepare("SELECT userid, username, profile, role, iconname, headname, sacinfo, other_settings, last_login_datetime FROM account WHERE userid IN ($placeholders)");
$stmt->execute($userIds);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$users[$row['userid']] = $row;
@@ -4226,6 +4262,7 @@ function getDatasUeuse(PDO $pdo, array $messages): array {
$message['iconname'] = $userRow['iconname'] ?? ($message['iconname'] ?? null);
$message['headname'] = $userRow['headname'] ?? ($message['headname'] ?? null);
$message['sacinfo'] = $userRow['sacinfo'] ?? ($message['sacinfo'] ?? null);
$message['last_login_datetime'] = $userRow['last_login_datetime'] ?? ($message['last_login_datetime'] ?? null);
$message['other_settings'] = $userRow['other_settings'] ?? ($message['other_settings'] ?? null);
}
+2
View File
@@ -14,6 +14,8 @@ $banurldomainfile = "../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
$domain = $_SERVER['HTTP_HOST'];
// 変数の初期化
$datetime = array();
$user_name = null;
+2 -2
View File
File diff suppressed because one or more lines are too long
+51 -11
View File
@@ -421,6 +421,20 @@ async function YouTube_and_nicovideo_Links(postText) {
let embeddedOnce = false;
const fetchOEmbed = (url, providerName, placeholderId, endpoint) => {
$.ajax({
url: `${endpoint}?url=${encodeURIComponent(url)}&format=json`,
method: 'GET',
dataType: 'json'
}).then(response => {
if (response && response.html) {
$(`#${placeholderId}`).html(response.html);
}
}).catch(() => {
$(`#${placeholderId}`).html(`<p style="font-size: 0.8rem;">Failed to load ${providerName}.</p>`);
});
};
for (const url of urls) {
if (embeddedOnce) return;
@@ -470,17 +484,19 @@ async function YouTube_and_nicovideo_Links(postText) {
embedCode = `<div class="youtube_and_nicovideo_player"><iframe src="https://embed.nicovideo.jp/watch/${videoId}?from=${videoTime}" frameborder="0" allowfullscreen></iframe></div>`;
embeddedOnce = true;
}
}else if (['soundcloud.com', 'on.soundcloud.com'].includes(host)) {
const oembedUrl = `https://soundcloud.com/oembed?format=json&maxheight=400&url=${encodeURIComponent(url)}`;
} else {
const isSoundCloud = ['soundcloud.com', 'on.soundcloud.com'].includes(host);
const isSpotify = host === 'open.spotify.com';
const response = await $.ajax({
url: oembedUrl,
method: 'GET',
dataType: 'json'
});
if (isSoundCloud || isSpotify) {
const provider = isSoundCloud ? { name: 'SoundCloud', api: 'https://soundcloud.com/oembed' } : { name: 'Spotify', api: 'https://open.spotify.com/oembed' };
const placeholderId = `embed-${Math.random().toString(36).substring(2, 9)}`;
if (response && response.html) {
embedCode = `<div class="youtube_and_nicovideo_player">${response.html}</div>`;
embedCode = `<div id="${placeholderId}" class="youtube_and_nicovideo_player">
<p>Loading ${provider.name}...</p>
</div>`;
fetchOEmbed(url, provider.name, placeholderId, provider.api);
embeddedOnce = true;
}
}
@@ -527,6 +543,22 @@ function formatSmartDate(datetimeStr) {
return `${y}/${pad(m + 1)}/${pad(d)} ${hhmm}`;
}
function getOnlineStatus(userdata) {
if (userdata["online_status"]){
if(userdata["online_status"] == "Online") {
return `<div class="status green" title="オンライン"></div>`;
}else if(userdata["online_status"] == "Away"){
return `<div class="status yellow" title="離席中"></div>`;
}else if(userdata["online_status"] == "Offline"){
return `<div class="status gray" title="オフライン"></div>`;
}else{
return "";
}
}else{
return "";
}
}
function getCheckIcon(userdata) {
if (userdata["role"] && userdata["role"].includes("official")) {
return `<div class="checkicon"><div class="check"></div></div>`;
@@ -554,6 +586,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
let check = "";
let bot = "";
let AIBlock = "";
var online_status = "";
var reuse = "";
let contentHtml = "";
@@ -590,6 +623,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
check = getCheckIcon(ueuse["userdata"]);
bot = getBotIcon(ueuse["userdata"]);
AIBlock = getAIBlockFlag(ueuse["userdata"]);
online_status = getOnlineStatus(ueuse["userdata"]);
}
if (ueuse["ueuse"].length > 0) {
@@ -657,6 +691,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
check = getCheckIcon(ueuse["reuse"]["userdata"]);
bot = getBotIcon(ueuse["reuse"]["userdata"]);
AIBlock = getAIBlockFlag(ueuse["reuse"]["userdata"]);
online_status = getOnlineStatus(ueuse["reuse"]["userdata"]);
reuse = `<div class="ru">
<a href="/@`+ ueuse["userdata"]["userid"] + `">
<img src="`+ ueuse["userdata"]["iconurl"] + `" onerror="this.onerror=null;this.src='../img/sysimage/errorimage/icon_404.png'">
@@ -730,6 +765,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
check = getCheckIcon(ueuse["userdata"]);
bot = getBotIcon(ueuse["userdata"]);
AIBlock = getAIBlockFlag(ueuse["userdata"]);
online_status = getOnlineStatus(ueuse["userdata"]);
if (selectedUniqid != null && selectedUniqid == ueuse["uniqid"]) {
reuse = `<div class="rp"><div class="here"></div><div class="totop"></div><p>一番上のユーズに返信</p></div>`;
@@ -775,7 +811,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
<img src="`+ ueuse["userdata"]["iconurl"] + `" onerror="this.onerror=null;this.src='../img/sysimage/errorimage/icon_404.png'">
</a>
<div class="u_name">
<a href="/@`+ ueuse["userdata"]["userid"] + `">` + ueuse["userdata"]["username"] + `</a>
<a href="/@`+ ueuse["userdata"]["userid"] + `">` + await replaceCustomEmojis(ueuse["userdata"]["username"]) + `</a>
</div>
<div class="idbox">
<a href="/@`+ ueuse["userdata"]["userid"] + `">@` + ueuse["userdata"]["userid"] + `</a>
@@ -795,6 +831,7 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
check = getCheckIcon(ueuse["userdata"]);
bot = getBotIcon(ueuse["userdata"]);
AIBlock = getAIBlockFlag(ueuse["userdata"]);
online_status = getOnlineStatus(ueuse["userdata"]);
reuse = ``;
inyo = ``;
@@ -997,7 +1034,10 @@ async function createUeuseHtml(ueuse, selectedUniqid = null) {
<div class="ueuse" id="ueuse-`+ ueuse["uniqid"] + `">
`+ reuse + `
<div class="flebox">
<a href="/@`+ userid + `"><img src="` + iconurl + `" onerror="this.onerror=null;this.src='../img/sysimage/errorimage/icon_404.png'"></a>
<a href="/@`+ userid + `">
<img src="` + iconurl + `" onerror="this.onerror=null;this.src='../img/sysimage/errorimage/icon_404.png'">
`+ online_status +`
</a>
<a href="/@`+ userid + `"><div class="u_name">` + await replaceCustomEmojis(username) + `</div></a>
<div class="idbox">
<a href="/@`+ userid + `">@` + userid + `</a>
+76 -111
View File
@@ -114,7 +114,6 @@ if( !empty($_POST['btn_submit']) ) {
} else {
$error_message[] = 'この招待コード(' . $invitationcode . ')は使えません。(INVITATION_CODE_DEAD)';
}
}
}
@@ -207,119 +206,73 @@ if( !empty($_POST['btn_submit']) ) {
if ($json_account_data == false) {
$error_message[] = "アカウントの移行を最初からやり直してください。(MIGRATION_SORRY)";
} else {
//アイコン&ヘッダー
if (is_not_private_url("https://".$json_account_data["userdata"]["user_icon"]."/")) {
$icondata = file_get_contents($json_account_data["userdata"]["user_icon"]);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_buffer($finfo, $icondata);
$safe_img_mime = [
"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'
];
if(isset($safe_img_mime[$mime_type])){
$extension = $safe_img_mime[$mime_type];
$temp_file = tempnam(sys_get_temp_dir(), 'img');
file_put_contents($temp_file, $icondata);
$iconName = "";
$headName = "";
// 処理対象の項目(アイコンとヘッダー)をループで回すとスッキリします
$targets = [
'user_icon' => ['dir' => 'usericons', 'size' => 512, 'ref' => &$iconName],
'user_header' => ['dir' => 'userheads', 'size' => 2048, 'ref' => &$headName]
];
foreach ($targets as $key => $config) {
$img_url = $json_account_data["userdata"][$key] ?? '';
if (empty($img_url)) continue;
if (is_not_private_url($img_url)) {
$img_content = @file_get_contents($img_url);
if ($img_content === false) {
$error_message[] = "画像の取得に失敗しました。($key)";
continue;
}
// 一時ファイル作成
$temp_file = tempnam(sys_get_temp_dir(), 'mig');
file_put_contents($temp_file, $img_content);
// MIMEチェックと拡張子変換(後半のコードのスタイルに合わせる)
$mime = check_mime($temp_file);
if ($mime) {
$extension = convert_mime($mime);
delete_exif($extension, $temp_file);
// リサイズ
resizeImage($temp_file, 512, 512);
if(check_mime($temp_file) == "image/webp"){
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$new_userid.'.webp';
}else{
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$new_userid.'.' . $extension;
}
// 保存先のパスを生成
$uploadedPath = 'usericons/' . $newFilename;
// ファイルを移動
$result = copy($temp_file, "../".$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)エラーコード:' .$uploadedFile['error'].'';
}
}
}else{
$error_message[] = '入力されたドメインに接続できませんでした。(BAD_REQUEST)';
}
//------------------
if (is_not_private_url("https://".$json_account_data["userdata"]["user_header"]."/")) {
$headdata = file_get_contents($json_account_data["userdata"]["user_header"]);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_buffer($finfo, $headdata);
$safe_img_mime = [
"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'
];
if(isset($safe_img_mime[$mime_type])){
$extension = $safe_img_mime[$mime_type];
$temp_file = tempnam(sys_get_temp_dir(), 'img');
file_put_contents($temp_file, $headdata);
delete_exif($extension, $temp_file);
// リサイズ
// リサイズ(ヘッダーは 2048, アイコンは 512)
if ($key === 'user_header') {
resizeImage($temp_file, 2048, 1024);
if(check_mime($temp_file) == "image/webp"){
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$new_userid.'.webp';
} else {
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$new_userid.'.' . $extension;
resizeImage($temp_file, 512, 512);
}
// 保存先のパスを生成
$uploadedPath = 'userheads/' . $newFilename;
// ファイルを移動
$result = copy($temp_file, "../".$uploadedPath);
if ($result) {
$headName = $uploadedPath; // 保存されたファイルのパスを使用
// S3アップロード対応
if (defined('AMS3_CHKS') && AMS3_CHKS == "true") {
$s3result = uploadAmazonS3($temp_file);
if ($s3result == false) {
$error_message[] = "アップロード失敗!($key) エラーコード: S3ERROR";
} 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)エラーコード:' .$uploadedFile['error'].'';
$config['ref'] = $s3result;
}
} else {
// ローカル保存
$newFilename = createUniqId() . '-' . $new_userid . ($mime == "image/webp" ? '.webp' : '.' . $extension);
$uploadedPath = $config['dir'] . '/' . $newFilename;
if (copy($temp_file, "../" . $uploadedPath)) {
$config['ref'] = $uploadedPath;
} else {
$error_message[] = "ファイルの保存に失敗しました。($key)";
}
}
} else {
$error_message[] = "使用できない画像形式です。($key)";
}
if (file_exists($temp_file)) unlink($temp_file);
} else {
$error_message[] = '入力されたドメインに接続できませんでした。(BAD_REQUEST)';
}
}
$query = $pdo->prepare('SELECT * FROM account WHERE userid = :userid limit 1');
$query->execute(array(':userid' => $new_userid));
@@ -345,7 +298,7 @@ if( !empty($_POST['btn_submit']) ) {
$error_message[] = 'IDは20文字以内で入力してください。(USERID_OVER_MAX_COUNT)';
}
if(in_array(strtolower($userid), $banuserid) === true ){
if (in_array(strtolower($new_userid), $banuserid) === true) {
$error_message[] = 'そのIDは登録禁止になっています。(USERID_CONTAINS_PROHIBITED)';
}
@@ -356,7 +309,6 @@ if( !empty($_POST['btn_submit']) ) {
if (!(preg_match("/^[a-zA-Z0-9_]+$/", $new_userid))) {
$error_message[] = "IDは半角英数字で入力してください。(「_」は使用可能です。)(USERID_DONT_USE_WORD)";
}
}
// パスワードの入力チェック
if (empty($password)) {
@@ -519,7 +471,6 @@ if( !empty($_POST['btn_submit']) ) {
} else {
$error_message[] = "このサーバーではアカウントの移行登録を受け入れていません。(MIGRATION_SORRY)";
}
}
// データベースの接続を閉じる
@@ -528,6 +479,7 @@ $pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head prefix="og:http://ogp.me/ns#">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/style.css">
@@ -545,6 +497,7 @@ $pdo = null;
<title>アカウントの移行登録 - <?php echo safetext($serversettings["serverinfo"]["server_name"]); ?></title>
</head>
<script src="/js/back.js"></script>
<body>
@@ -575,28 +528,38 @@ $pdo = null;
<div>
<p>新しいユーザーID</p>
<div class="p2">このサーバーで使用するユーザーIDを入力してください。</div>
<input id="new_userid" type="text" placeholder="" class="inbox" name="new_userid" value="<?php if( !empty($_SESSION['form_data']['new_userid']) ){ echo safetext($_SESSION['form_data']['new_userid']); } ?>">
<input id="new_userid" type="text" placeholder="" class="inbox" name="new_userid" value="<?php if (!empty($_SESSION['form_data']['new_userid'])) {
echo safetext($_SESSION['form_data']['new_userid']);
} ?>">
</div>
<div>
<p>新しいパスワード</p>
<div class="p2">このサーバーで使用するパスワードを入力してください。</div>
<input id="password" type="text" placeholder="" class="inbox" name="password" value="<?php if( !empty($_SESSION['form_data']['password']) ){ echo safetext($_SESSION['form_data']['password']); } ?>">
<input id="password" type="text" placeholder="" class="inbox" name="password" value="<?php if (!empty($_SESSION['form_data']['password'])) {
echo safetext($_SESSION['form_data']['password']);
} ?>">
</div>
<div>
<p>アカウント移行元のuwuzuサーバーのドメイン</p>
<div class="p2">アカウント移行元のサーバードメインを入力してください。</div>
<input id="moto_server_domain" type="text" placeholder="uwuzu.example.com" class="inbox" name="moto_server_domain" value="<?php if( !empty($_SESSION['form_data']['moto_server_domain']) ){ echo safetext($_SESSION['form_data']['moto_server_domain']); } ?>">
<input id="moto_server_domain" type="text" placeholder="uwuzu.example.com" class="inbox" name="moto_server_domain" value="<?php if (!empty($_SESSION['form_data']['moto_server_domain'])) {
echo safetext($_SESSION['form_data']['moto_server_domain']);
} ?>">
</div>
<div>
<p>識別コード</p>
<div class="p2">アカウント移行元のサーバーで発行された識別コードを入力してください。</div>
<input id="moto_server_account_check" type="text" placeholder="" class="inbox" name="moto_server_account_check" value="<?php if( !empty($_SESSION['form_data']['moto_server_account_check']) ){ echo safetext($_SESSION['form_data']['moto_server_account_check']); } ?>">
<input id="moto_server_account_check" type="text" placeholder="" class="inbox" name="moto_server_account_check" value="<?php if (!empty($_SESSION['form_data']['moto_server_account_check'])) {
echo safetext($_SESSION['form_data']['moto_server_account_check']);
} ?>">
</div>
<div>
<p>認証コード</p>
<div class="p2">アカウント移行元のサーバーで発行された認証コードを入力してください。</div>
<input id="moto_server_account_auth" type="text" placeholder="" class="inbox" name="moto_server_account_auth" value="<?php if( !empty($_SESSION['form_data']['moto_server_account_auth']) ){ echo safetext($_SESSION['form_data']['moto_server_account_auth']); } ?>">
<input id="moto_server_account_auth" type="text" placeholder="" class="inbox" name="moto_server_account_auth" value="<?php if (!empty($_SESSION['form_data']['moto_server_account_auth'])) {
echo safetext($_SESSION['form_data']['moto_server_account_auth']);
} ?>">
</div>
<?php if (!empty(H_CAPTCHA_ONOFF && H_CAPTCHA_ONOFF == "true")) { ?>
<div class="captcha_zone">
@@ -613,7 +576,9 @@ $pdo = null;
<div>
<p>招待コード</p>
<div class="p2">招待コードがないとこのサーバーには登録できません。</div>
<input id="invitationcode" type="text" placeholder="" class="inbox" name="invitationcode" value="<?php if( !empty($_SESSION['form_data']['invitationcode']) ){ echo safetext($_SESSION['form_data']['invitationcode']); } ?>">
<input id="invitationcode" type="text" placeholder="" class="inbox" name="invitationcode" value="<?php if (!empty($_SESSION['form_data']['invitationcode'])) {
echo safetext($_SESSION['form_data']['invitationcode']);
} ?>">
</div>
<?php } ?>
@@ -632,7 +597,6 @@ $pdo = null;
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
@@ -654,4 +618,5 @@ window.addEventListener('DOMContentLoaded', function(){
});
</script>
</body>
</html>
+5
View File
@@ -8,6 +8,11 @@ $badpassfile = "server/badpass.txt";
$badpass_info = file_get_contents($badpassfile);
$badpass = preg_split("/\r\n|\n|\r/", $badpass_info);
$domain = $_SERVER['HTTP_HOST'];
$serverinfofile = 'server/info.txt';
$serverinfo = file_get_contents($serverinfofile);
require('db.php');
//関数呼び出し
//- EXIF
+3
View File
@@ -42,6 +42,9 @@ $domain = $_SERVER['HTTP_HOST'];
//------------------------
$serverinfofile = 'server/info.txt';
$serverinfo = file_get_contents($serverinfofile);
// データベースに接続
try {
$option = array(
+1 -1
View File
@@ -71,7 +71,7 @@ if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
"software" => array(
"name" => "uwuzu",
"version" => "".str_replace("\r", '', $uwuzuinfo[1])."",
"homepage" => "https://docs.uwuzu.xyz/",
"homepage" => "https://docs.uwuzu.com/",
"repository" => "https://github.com/Daichimarukana/uwuzu",
),
"protocols" => [
+9 -9
View File
@@ -130,21 +130,21 @@ if( !empty($_POST['migration_submit']) ) {
if($Check_result["server_info"]["account_migration"] == "true"){
$pdo->beginTransaction();
try {
$account = $userid;
$migration_code = createUniqId();
$account = safetext($userid);
$migration_code = safetext(createUniqId());
$encryption_key = random(32);
$encryption_ivkey = random(16);
$datetime = date("Y-m-d H:i:s");
$domain = $server_domain;
$domain = safetext($server_domain);
$stmt = $pdo->prepare("INSERT INTO migration (account, domain, migration_code, encryption_key, encryption_ivkey, datetime) VALUES (:account, :domain, :migration_code, :encryption_key, :encryption_ivkey, :datetime)");
$stmt->bindParam(':account', safetext($account), PDO::PARAM_STR);
$stmt->bindParam(':domain', safetext($domain), PDO::PARAM_STR);
$stmt->bindParam(':migration_code', safetext($migration_code), PDO::PARAM_STR);
$stmt->bindParam(':encryption_key', safetext($encryption_key), PDO::PARAM_STR);
$stmt->bindParam(':encryption_ivkey', safetext($encryption_ivkey), PDO::PARAM_STR);
$stmt->bindParam(':datetime', safetext($datetime), PDO::PARAM_STR);
$stmt->bindParam(':account', $account, PDO::PARAM_STR);
$stmt->bindParam(':domain', $domain, PDO::PARAM_STR);
$stmt->bindParam(':migration_code', $migration_code, PDO::PARAM_STR);
$stmt->bindParam(':encryption_key', $encryption_key, PDO::PARAM_STR);
$stmt->bindParam(':encryption_ivkey', $encryption_ivkey, PDO::PARAM_STR);
$stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR);
$res = $stmt->execute();
+1 -1
View File
@@ -292,7 +292,7 @@ require('../logout/logout.php');
<hr>
<h1>API</h1>
<p>APIの使用方法はdocs.uwuzu.xyzよりAPIドキュメントをご確認ください。</p>
<p>APIの使用方法はdocs.uwuzu.comよりAPIドキュメントをご確認ください。</p>
<?php if (empty($userData['token'])) { ?>
<p>以下のボタンよりアクセストークンを取得すると使用できます。<br>アクセストークンは一度発行すると作り直すまで再度確認はできません。また、絶対に他人に知られないように保護してください。<br>
+1 -1
View File
@@ -9,7 +9,7 @@
<p>JavaScriptを無効にしている状態での使用はできません。</p>
<p>詳細は下記のリンクよりご確認ください。</p>
<a href="https://docs.uwuzu.xyz/docs/uwuzusupport" class="infobtn">詳細</a>
<a href="https://docs.uwuzu.com/docs/uwuzusupport" class="infobtn">詳細</a>
<div class="p2">JS_BLOCKED_ERROR</div>
<div class="center_text">
+1 -1
View File
@@ -117,7 +117,7 @@
<div class="page" id="page8" style="display:none;">
<h1>お疲れ様でした!</h1>
<p style="text-align: center;">チュートリアルは終了です!<br>
まだ、このチュートリアルで紹介できていないuwuzuの機能や使い方も多くあるので、もっとuwuzuについて知りたい方はぜひdocs.uwuzu.xyzをご覧ください。</p>
まだ、このチュートリアルで紹介できていないuwuzuの機能や使い方も多くあるので、もっとuwuzuについて知りたい方はぜひdocs.uwuzu.comをご覧ください。</p>
<div class="btm_area">
<div class="iro_btn backcolor" id="back">戻る</div>
<div class="iro_btn" id="end">閉じる</div>
+1
View File
@@ -5,6 +5,7 @@ $serversettings = parse_ini_file($serversettings_file, true);
require('../db.php');
require("../function/function.php");
$domain = $_SERVER['HTTP_HOST'];
// 変数の初期化
$datetime = array();
+2 -2
View File
@@ -54,7 +54,7 @@ daichimarukanaと一緒に開発したいよ~って人は私のHPからメー
## 9. ライセンス
UPULライセンスです!
UPULライセンスに関しては同梱されているUPUL_License.txtを確認するか、uwuzu.xyzより詳細をご確認ください。
UPULライセンスに関しては同梱されているUPUL_License.txtを確認するか、uwuzu.comより詳細をご確認ください。
## 10. 利用させていただいているライブラリなどのライセンス
@@ -66,7 +66,7 @@ Redistribution and use in source and binary forms, with or without modification,
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
なお、使わせていただいているコードは改変させていただいでおります。
### jQuery 3.7.1
### jQuery 4.0.0
MITライセンスで提供されているようです。
詳細は以下のリンク先をご覧ください。
https://jquery.com/license/
+2 -2
View File
@@ -1,4 +1,4 @@
uwuzu
1.6.13
2026/04/22
1.6.14
2026/05/04
daichimarukana,putonfps
+14
View File
@@ -1,6 +1,20 @@
## リリースノートだぜぇぇぇぇぇぇい!!!!!!!
ここにはuwuzuの更新情報を載せてくぜぇ~!(いやまてテンションおかしいだろ...)
## Version 1.6.14 (Hapuego)
2026/05/04
fix: ホーム画面・ブックマークにて共有ボタンが正常に動作しなくなる恐れのある問題を修正しました!
fix: ログインやアカウント登録が正常にできなくなってしまう恐れのある問題を修正しました!
fix: 埋め込みを含むユーズを読み込んだ際のタイムラインの表示を高速化しました!
fix: アカウントの移行に関する処理を一部修正しました!
fix: 管理者向けページにてログの保存に失敗する恐れのある問題を修正しました。
fix: uwuzu.xyz宛のURLをuwuzu.comに変更しました!
fix: APIトークンの削除に関するエラーログの保存に失敗する恐れのある問題を修正しました!
chg: 一部UIを変更しました
chg: 同梱のjQueryをjQuery 4.0.0にアップデートしました!
new: Spotify埋め込みに対応しました!!!!
new: タイムラインへのオンラインステータス表示に対応しました!
## Version 1.6.13 (Hapuego)
2026/04/22
fix: カスタム絵文字が表示されなくなる(使用できなくなる)問題を修正しました!
+1 -1
View File
@@ -394,7 +394,7 @@ if( !empty($_POST['send_ban_submit']) ) {
//------------
} else {
$error_message[] = 'アカウント削除に失敗しました。(ACCOUNT_DELETE_DAME)';
actionLog($userid, "error", "send_ban_submit", $userId2, $error_message[], 4);
actionLog($userid, "error", "send_ban_submit", $userId2, $error_message, 4);
}
} catch (Exception $e) {
+1 -1
View File
@@ -88,7 +88,7 @@ if($errcode == "UNSUPPORTED_BROWSER"){
<br>詳細は下記のリンクよりご確認ください。</p>
</div>
<a href="https://docs.uwuzu.xyz/docs/uwuzusupport" class="infobtn">詳細</a>
<a href="https://docs.uwuzu.com/docs/uwuzusupport" class="infobtn">詳細</a>
<div class="maintext">
<h3>エラー内容</h3>
+23 -4
View File
@@ -1,12 +1,31 @@
{
"software": "uwuzu",
"version": "1.6.13",
"release_date": "2026/04/22",
"release_notes": "このアップデートには、カスタム絵文字の表示がされなくなる問題の修正が含まれます。\n詳細はリリースノートをご確認ください。",
"version": "1.6.14",
"release_date": "2026/05/04",
"release_notes": "このアップデートには、Spotify埋め込み機能、タイムラインへのオンラインステータス表示の対応とユーズの共有に関するバグを始めとする諸々のバグ修正が含まれます。\n詳細はリリースノートをご確認ください。",
"notices": "アップデート前にデータのバックアップを行うことをおすすめします!",
"files": {
"overwrite": [
"/function/get_customemoji.php",
"/authlogin.php",
"/check.php",
"/new_select.php",
"/new.php",
"/unsupported.php",
"/bookmark/index.php",
"/css/home.css",
"/function/delete_apitoken.php",
"/function/function.php",
"/home/index.php",
"/js/view_function.js",
"/js/jquery-min.js",
"/migration/index.php",
"/nodeinfo/2.1/index.php",
"/others/account_migration.php",
"/others/index.php",
"/require/noscript_modal.php",
"/require/tutorial.php",
"/search/index.php",
"/settings_admin/userinfo.php",
"/server/uwuzuabout.txt",
"/server/uwuzuinfo.txt",
"/server/uwuzurelease.txt"