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

uwuzu v1.4.10 Funium

This commit is contained in:
Daichimarukana
2024-12-27 18:11:13 +09:00
commit b6069366d1
495 changed files with 70483 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteRule ^\.htaccess$ - [F]
RewriteRule ^db\.php$ - [F]
RewriteRule ^settings_admin/CloudflareTurnstile_settings/ - [F]
RewriteRule ^settings_admin/hCaptcha_settings/ - [F]
RewriteRule ^settings_admin/plugin_settings/ - [F]
RewriteBase /
RewriteRule ^(@\w+)$ /user/index.php?uwuzuid=$1 [QSA,L]
RewriteRule ^!(\w+)~(\w+)$ /ueuse/index.php?ueuseid=$1&touser=$2 [QSA,L]
RewriteRule ^!(\w+)$ /ueuse/index.php?ueuseid=$1 [QSA,L]
ErrorDocument 400 /errorpage/httperror.php
ErrorDocument 401 /errorpage/httperror.php
ErrorDocument 403 /errorpage/httperror.php
ErrorDocument 404 /errorpage/httperror.php
ErrorDocument 413 /errorpage/httperror.php
ErrorDocument 500 /errorpage/httperror.php
ErrorDocument 503 /errorpage/httperror.php
Header set X-FRAME-OPTIONS "DENY"
+21
View File
@@ -0,0 +1,21 @@
<?php
$serversettings_file = "../../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require("../../function/function.php");
if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
header("Content-Type: application/xml");
header("charset=UTF-8");
header("Access-Control-Allow-Origin: *");
$domain = $_SERVER['HTTP_HOST'];
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">';
echo '<Link rel="lrdd" type="application/xrd+xml" template="https://'.$domain.'/.well-known/webfinger?resource={uri}"/>';
echo '</XRD>';
}else{
header("HTTP/1.1 410 Gone");
}
?>
+27
View File
@@ -0,0 +1,27 @@
<?php
$serversettings_file = "../../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require("../../function/function.php");
if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
header("Content-Type: application/activity+json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$domain = $_SERVER['HTTP_HOST'];
$item = array(
"links" => [
array(
"rel" => "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href" => "https://".$domain."/nodeinfo/2.1",
),
],
);
echo json_encode($item, JSON_UNESCAPED_UNICODE);
}else{
header("HTTP/1.1 410 Gone");
}
?>
+48
View File
@@ -0,0 +1,48 @@
<?php
$serversettings_file = "../../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require("../../function/function.php");
if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
header("Content-Type: application/jrd+json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
// データベースに接続
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(isset($_GET['resource'])){
$user = htmlentities($_GET['resource']);
$userid = str_replace('acct:','', str_replace('@'.$domain.'', '', $user));
$item = array(
"subject" => "acct:".$userid.'@'.$domain.'',
"links" => [
array(
"rel" => "self",
"type" => "application/activity+json",
"href" => "https://".$domain."/actor/?actor=@".$userid.'',
),
],
);
echo json_encode($item, JSON_UNESCAPED_UNICODE);
}
}else{
header("HTTP/1.1 410 Gone");
}
?>
+157
View File
@@ -0,0 +1,157 @@
# [<img src="/img/uwuzucolorlogo.svg" width=140px>](https://docs.uwuzu.xyz)
**[ServerList](https://uwuzu-serverlist.emptybox.win)**
**[Document](https://docs.uwuzu.xyz)**
**[Community](https://discordapp.com/invite/mNdGApnBFk)**
uwuzuは、新しくて、楽しくて、そんなSNSです。
基礎的なマイクロブログSNSとしての機能を兼ね備えています!
## Introduction
どんなSNSなの?
uwuzuは簡潔に言えばシンプルなマイクロブログSNSです。
基本的なSNSを楽しむための機能と**独自のお楽しみ機能**が備わっています!
もちろん画像や動画の添付も可能、カスタム絵文字機能などもあります...
### 見た目
![みため](https://docs.uwuzu.xyz/img/shot/top_on_pc.png)
### 機能比較
見た目だけ見せられても困るそんなあなたに!
| 一般名? | uwuzu | Twitter | Misskey | Mastodon |
| ------------------ | ---------------------------- | -------------------- | ---------------------------------------- | ---------------------- |
| 投稿 | ユーズ | ツイート(ポスト) | ノート | トゥート |
| 拡散 | リユーズ | リツイート(リポスト) | リノート | ブースト |
| すき | いいね | いいね | リアクション | お気に入り |
| センシティブな投稿 | NSFW | センシティブな投稿 | NSFW | NSFW/CW |
| サービス | サーバー | Twitter(X) | サーバー・インスタンス | インスタンス |
| ブックマーク | ブックマーク | ブックマーク | お気に入り | ブックマーク |
| 文字数制限 | 管理者設定(最大16777216文字) | 280文字 | 3000文字 | 500文字 |
| タイムライン | ローカル・フォロー | おすすめ・フォロー中 | ホーム・ローカル・ソーシャル・グローバル | ホーム・ローカル・連合 |
## Get started
uwuzuを使いたいそんなあなたに!
簡単にuwuzuを始めるならこっち! → [ServerList](https://uwuzu-serverlist.emptybox.win)
もしuwuzuサーバーを構築しようとしているのであれば...続けて読んでください...
### 技術スタック
php - バックエンド全体を支えています。
MySQL - データの保存を主な仕事として取り扱っています。
jQuery - バックエンドとフロントエンドの架け橋です。
どうです?このシンプルさ✨
### 最低要件
Software
- Apache 2
- php 8
- MySQL 8.0 or MariaDB 10.4
Machine
- Memory 1GB
- Storage 500MB(ユーザーデータのある程度の保存含め)
### インストール
ここではMySQL, Apache2, php8.0が導入されている前提で進めます。
#### ダウンロード
Githubの[リリース](https://github.com/Daichimarukana/uwuzu/releases)より最新リリースをダウンロードしてください。
#### 展開
以下のような適当な場所(ApacheよりWebサーバーとして動作させる場所)に展開してください!
`/user/home/web/`
#### 権限設定
以下のようにコマンドラインを開き、uwuzuを展開したフォルダ内のすべてのファイルに権限を与えてください!
```
sudo chmod -R 755 /user/home/web/.
```
#### phpの設定
以下のコマンドでphpの設定(php.ini)を開き、開いたら「↓」キーでひたすら下に移動して`;extension=なんとかかんとか`が何十行かあるところまで移動して、そしたらその中から以下のものの`;`を消してください。
要するにプラグインの有効化です!
```
sudo nano /etc/php/{phpバージョン}/cli/php.ini
extension=fileinfo
extension=gd
extension=pdo_mysql
extension=mysqli
extension=mbstring
extension=zip
```
変更か書き込めたら保存して閉じてください。
#### MySQLの設定
まず、MySQLにログインします。
```
sudo mysql -u root
```
このタイミングでrootアカウントにもパスワードを設定できると望ましいです!
それでは次にuwuzuを操作するアカウントを作成します。
`id``password`はuwuzuからMySQLを操作するアカウントに必要なので、これも覚えられるものを設定してください!
```
create user 'id'@'localhost' identified by 'password';
```
アカウントが作れたら、権限を与えてください!
```
grant all on *.* to 'id'@'localhost';
flush privileges;
```
終わったら次にデータベースを作成します!
データベース名は覚えられるものであれば何でも大丈夫です!
```
CREATE DATABASE uwuzu_db;
```
これらの設定が完了したら
```
exit
```
でMySQLを閉じてください。
続いては、MySQLの設定ファイルより、モードの設定を行います。
```
sudo nano /etc/mysql/my.cnf
```
このコマンドを実行し、SQLモードから"STRICT_TRANS_TABLES"を削除してください
```
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION
```
変更できたら保存して閉じてください。
#### Apache2の設定
まず、Apache2の設定ファイルを開きます。
```
sudo nano /etc/apache2/apache2.conf
```
開けたら、以下のような項目があるので、uwuzuを展開したフォルダにパスを変更してください。
```
<Directory "/user/home/web/">
Options Indexes FollowSymLinks
AllowOverride ALL
Require all granted
</Directory>
```
一度保存して閉じ、もう一つパスを設定しているファイルを開いて、以下の設定を書き換えてください!
```
sudo nano /etc/apache2/sites-available/000-default.conf
```
```
ServerAdmin webmaster@localhost
DocumentRoot /user/home/web/
```
最後に.htaccessを機能させるための設定です!
```
sudo a2enmod rewrite
sudo a2enmod headers
```
これらのコマンドを実行してください!
#### 最後の再起動
すべての手順が完了したら、Apache2とMySQLを再起動します!
```
sudo systemctl restart apache2
sudo systemctl restart mysql
```
#### 初期設定
ブラウザを立ち上げ、[localhost/admin](http://localhost/admin)を開いて早速初期設定を開始しましょう!
初期設定後、各種サーバー設定は左側メニューの"サーバー設定"より行えます。
もしインストールでつまづいたら... → [Discordコミュニティ](https://discordapp.com/invite/mNdGApnBFk)か[Document](https://docs.uwuzu.xyz)を確認してください!
+55
View File
@@ -0,0 +1,55 @@
---------<uwuzu公衆利用ライセンス(UPUL)>---------
ライセンス名 : uwuzu公衆利用ライセンス(英: uwuzu Public Use License)
バージョン : 1.0.0
ライセンス著作権 : uwuzu
本ライセンス使用著作者帰属先 : daichimarukana,putonfps
本ライセンス使用著作者連絡先 : support@uwuzu.com,daichimarukana@gmail.com
この文書を完全にコピーして利用、2-15以降に追記することは許可されていますが、この文書の2-14以前の改変、保存・利用することは許可されていません。
0. まえがき
uwuzu公衆利用ライセンスは本ライセンスを使用する全ての著作物の利用条件を明確にするためのライセンスです。
主にコンピューターで実行されるソフトウェアに対して使用しやすいように作成されています。
本ライセンスでは、ソフトウェアの作成者、利用者、改変者、それぞれが負担なく利用できるように考えられています。
1. 定義
ここにある定義はこの文書全体に適用されます。
「本ライセンス」とはuwuzu公衆利用ライセンス バージョン1.0.0を指します。
「著作権」とはベルヌ条約で示されている著作権及び各国の法律により示されている著作権を指します。
「著作物」とは上記の著作権に基づく作成された物を指します。
「著作者」とは本ライセンスの適用されている著作物を作成した人物を指します。
2. 利用条件
2-1. 本ライセンスが適用されている著作物は完全無料で閲覧・利用・改変が可能なものとします。
2-1-1. 改変し、公開する場合、本ライセンスが適用されている著作物のライセンスを変更することはできないものとします。
2-1-2. 改変する場合、著作物の原型を残す必要があります。
2-1-3. 改変する場合、「本ライセンス使用著作者帰属先」「本ライセンス使用著作者連絡先」を含め、本文書を引き継いで適用し、著作者の情報を削除しない必要があります。
2-1-3-1. 改変者の情報を追記することが可能ですが、著作者の権利を侵害しない範囲に限ります。
2-2. 本ライセンスが適用されている著作物を改変した場合、改変者は著作者による内容の開示を請求された場合に開示する必要があります。
2-2-1. 改変者は、改変した著作物を自身で公開する場合、著作者の同意を得る必要はありません。
2-3. 本ライセンスが適用されている著作物を改変して自身で利用する場合は、改変内容を開示する必要はありません。ただし、著作者から開示要求があった場合は、これに応じる必要があります。
2-3-1. 改変してから改変者が著作者以外の他人に譲渡・共有・配布する際は改変した著作物を誰でも使用できるものとします。
2-3-2. もし改変者が改変済の著作物を他人に譲渡・共有・配布せずに改変者自身で利用してサービスを提供する場合はサービス利用者に改変した著作物を公開する必要はありません。
2-4. 本ライセンスが適用されている著作物を二次配布したり改変したものを配布することは可能とします。
2-5. 本ライセンスはいかなる著作物にも著作者が適用することが可能です。
2-6. 著作物に本ライセンスを適用した著作者はいつでもこのライセンスの適用を取り消し、別のライセンスに変更することが可能なものとします。
2-6-1. 本ライセンスを適用した著作物のライセンスを変更した場合著作者はライセンスを変更したことを著作物内に明記する必要があります。
2-7. 本ライセンスが適用されている場合でも著作権は著作者に帰属します。
2-7-1. 著作者が本ライセンスが適用されている著作物の著作権の放棄を明記しない限り著作権は保護されます。
2-8. 著作者は本文書の「本ライセンス使用著作者帰属先」欄に著作者を判別できる文字列を記入する必要があります。
2-8-1. 可能であれば著作者は本文書の「本ライセンス使用著作者連絡先」に連絡先を記入する必要があります。
2-9. 本ライセンスが適用されている著作物の取り扱いは本ライセンス及び法律に則って扱う必要があります。
2-10. 本ライセンスが適用されている著作物を著作者が公開を停止し、著作者が利用者・改変者などに削除を求める旨の文章を公開していて、利用者・改変者などの関係者がそれに気づくことができた場合は削除する必要があるものとします。
2-11. 本ライセンスが適用されている著作物を使用し、何らかの損害が発生した場合に著作者は責任を負う必要はありません。
2-11-1. 本ライセンスが適用されている著作物を使用する際の責任は全て使用者にあるものとします。
2-12. 本ライセンスが適用されている著作物から本ライセンスを無効化するには著作者の許可、もしくは著作者によるライセンス変更が必要となります。
2-13. 本ライセンスが適用されている著作物は、営利目的を含む、いかなる利用目的であっても利用が可能です。
2-14. 本ライセンスはどなたでも自由にご利用いただけます。
2-15. 著作者は本ライセンスに追記して独自の規約を作成することが可能なものとし、利用者・改変者はその規約に従う必要があるものとします。
/----------(以下追記欄)----------/
独自の規約はありません。
上記の利用条件に従って利用してください。
-------------------<以上>-------------------
+130
View File
@@ -0,0 +1,130 @@
<?php
$mojisizefile = "../server/textsize.txt";
$banurldomainfile = "../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = array_filter(preg_split("/\r\n|\n|\r/", $banurl_info));
require('../db.php');
require("../function/function.php");
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['abitext'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id']))) {
$userid = safetext($_POST['userid']);
$postUniqid = safetext($_POST['uniqid']);
$abitext = safetext($_POST['abitext']);
$loginid = safetext($_POST['account_id']);
$abidate = date("Y-m-d H:i:s");
// データベース接続の設定
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
));
$query = $dbh->prepare('SELECT * FROM ueuse WHERE uniqid = :uniqid limit 1');
$query->execute(array(':uniqid' => $postUniqid));
$result = $query->fetch();
if($result["account"] === $userid){
// データベース接続の設定
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
));
$query = $dbh->prepare('SELECT * FROM account WHERE userid = :userid limit 1');
$query->execute(array(':userid' => $userid));
$result2 = $query->fetch();
if($result2["loginid"] === $loginid){
if($result["abi"] == "none" && (!($result2["role"] == "ice"))){
// 文字数を確認
if( (int)safetext(file_get_contents($mojisizefile)) < mb_strlen($abitext, '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確認
if(!(empty($banurl))){
for($i = 0; $i < count($banurl); $i++) {
if (false !== strpos($abitext, 'https://'.$banurl[$i])) {
$err = "contains_prohibited_url";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
}
try {
$pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS);
$pdo->beginTransaction();
$stmt = $pdo->prepare("UPDATE ueuse SET abi = :abi, abidate = :abidate WHERE uniqid = :uniqid AND account = :userid");
$stmt->bindValue(':abi', $abitext, PDO::PARAM_STR);
$stmt->bindValue(':abidate', $abidate, PDO::PARAM_STR);
$stmt->bindValue(':uniqid', $postUniqid, PDO::PARAM_STR);
$stmt->bindValue(':userid', $userid, PDO::PARAM_STR);
// SQLクエリの実行
$res = $stmt->execute();
// コミット
$pdo->commit();
$mentionedUsers = get_mentions_userid($abitext);
foreach ($mentionedUsers as $mentionedUser) {
$touserid = safetext($mentionedUser);
$datetime = date("Y-m-d H:i:s");
$msg = safetext("" . $abitext . "");
$title = safetext("" . $result2["username"] . "さんにメンションされました!");
$url = safetext("/!" . $postUniqid . "~" . $userid . "");
$userchk = 'none';
$category = 'mention';
send_notification($touserid,$userid,$title,$msg,$url,$category);
}
if ($res) {
header('Content-Type: application/json');
echo json_encode(['success' => true]);
exit;
} else {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'error' => '追加に失敗しました。']);
exit;
}
} catch(PDOException $e) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'error' => 'データベースエラー:' . $e->getMessage()]);
exit;
}
}else{
header('Content-Type: application/json');
echo json_encode(['success' => false, 'error' => 'すでに追記済みです。']);
exit;
}
}
}
}
?>
+102
View File
@@ -0,0 +1,102 @@
<?php
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require("../function/function.php");
if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
header("Content-Type: application/activity+json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$domain = $_SERVER['HTTP_HOST'];
require('../db.php');
// データベースに接続
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();
}
$user = safetext($_GET['actor']);
$userid = str_replace('@','', str_replace('@'.$domain.'', '', $user));
if( !empty($pdo) ) {
// データベース接続の設定
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
));
$userQuery = $dbh->prepare("SELECT username, userid, profile, follow, follower, iconname, headname,datetime FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $userid);
$userQuery->execute();
$userData = $userQuery->fetch();
}
if(!empty($userData)){
$icon_kakucho_ci = pathinfo($userData["iconname"], PATHINFO_EXTENSION);
$head_kakucho_ci = pathinfo($userData["headname"], PATHINFO_EXTENSION);
$item = array(
"@context" => [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
array(
"schema" => "http://schema.org#",
"PropertyValue" => "schema:PropertyValue",
"value" => "schema:value",
),
],
"id" => "https://".$domain."/actor/?actor=@".$userid."",
"type" => "Person",
"preferredUsername" => "".$userData["userid"]."",
"name" => "".$userData["username"]."",
"summary" => "".nl2br($userData["profile"])."",
"followers" => "https://".$domain."/user/followers/?actor=@".$userid."",
"following" => "https://".$domain."/user/following/?actor=@".$userid."",
"inbox" => "https://".$domain."/user/inbox/?actor=@".$userid."",
"outbox" => "https://".$domain."/user/outbox/?actor=@".$userid."",
"published" => "".date(DATE_ATOM, strtotime($userData["datetime"]))."",
"discoverable" => true,
"url" => "https://".$domain."/@".$userid."",
"icon" => array(
"type" => "Image",
"mediaType" => "image/".$icon_kakucho_ci."",
"url" => "https://".$domain."/".$userData["iconname"]."",
),
"image" => array(
"type" => "Image",
"mediaType" => "image/".$icon_kakucho_ci."",
"url" => "https://".$domain."/".$userData["headname"]."",
),
/*"publicKey" => array(
"id" => "https://".$domain."/actor/?actor=@".$userid."#main-key",
"owner" => "https://".$domain."/actor/?actor=@".$userid."",
"publicKeyPem" => "ここにHTTP-Signature",
),*/
);
echo json_encode($item, JSON_UNESCAPED_UNICODE);
}else{
$item = array(
"user_not_found",
);
echo json_encode($item, JSON_UNESCAPED_UNICODE);
}
}else{
header("HTTP/1.1 410 Gone");
}
?>
+320
View File
@@ -0,0 +1,320 @@
<?php
function random($length = 12)
{
return substr(str_shuffle('23456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz'), 0, $length);
}
require('db.php');
require("function/function.php");
$serversettings_file = "server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$authcode = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
$userid = $_SESSION['userid'];
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(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true && isset($_COOKIE['loginid']) && isset($_SESSION['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_SESSION['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_SESSION['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true && isset($_COOKIE['loginid']) && isset($_COOKIE['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_COOKIE['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_COOKIE['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
}
require_once 'authcode/GoogleAuthenticator.php';
if(empty($_SESSION['secretcode'])){
$authcode = new PHPGangsta_GoogleAuthenticator();
$secret = $authcode->createSecret();
$_SESSION['secretcode'] = $secret;
}else{
$authcode = new PHPGangsta_GoogleAuthenticator();
$secret = $_SESSION['secretcode'];
}
if(!(empty($pdo))){
// ユーザーデータ取得
$userQuery = $pdo->prepare("SELECT * FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $userid);
$userQuery->execute();
$userData = $userQuery->fetch();
}
if( !empty($_POST['btn_submit']) ) {
$chkauthcode = new PHPGangsta_GoogleAuthenticator();
//二段階認証の確認
$userauthcode = $_POST['usercode'];
$discrepancy = 2;
$checkResult = $chkauthcode->verifyCode($secret, $userauthcode, $discrepancy);
if ($checkResult) {
if( empty($error_message) ) {
$backupcode = random();
$hashbackupcode = uwuzu_password_hash($backupcode);
$secret = $_SESSION['secretcode'];
if(!(empty($userData["encryption_ivkey"]))){
$userEnckey = GenUserEnckey($userData["datetime"]);
$enc_seacret = EncryptionUseEncrKey($secret, $userEnckey, $userData["encryption_ivkey"]);
}else{
$ivLength = openssl_cipher_iv_length('aes-256-cbc');
$randomBytes = random_bytes($ivLength);
$randomhash = hash('sha3-512', $randomBytes);
$iv = substr($randomhash, 0, $ivLength);
// トランザクション開始
$pdo->beginTransaction();
try {
// SQL作成
$stmt = $pdo->prepare("UPDATE account SET encryption_ivkey = :encryption_ivkey WHERE userid = :userid;");
$stmt->bindParam(':encryption_ivkey', $iv, PDO::PARAM_STR);
$stmt->bindValue(':userid', $userid, PDO::PARAM_STR);
$res = $stmt->execute();
$res = $pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
}
if (!($res)) {
$error_message[] = "アカウント操作に失敗しました(ERROR)";
}
$stmt = null;
$userEnckey = GenUserEnckey($userData["datetime"]);
$enc_seacret = EncryptionUseEncrKey($secret, $userEnckey, $iv);
}
// トランザクション開始
$pdo->beginTransaction();
try {
// SQL作成
$stmt = $pdo->prepare("UPDATE account SET authcode = :authcode,backupcode = :backupcode WHERE userid = :userid");
$stmt->bindValue(':authcode', $enc_seacret, PDO::PARAM_STR);
$stmt->bindValue(':backupcode', $hashbackupcode, 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) {
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, '/');
}
}
$userid = "";
$_SESSION['backupcode'] = $backupcode;
// リダイレクト先のURLへ転送する
$url = 'success.php';
header('Location: ' . $url, true, 303);
exit;
} else {
$error_message[] = '更新に失敗しました。(REGISTERED_DAME)';
}
// プリペアドステートメントを削除
$stmt = null;
}
} else {
$error_message[] = "二段階認証が出来ませんでした。再度お試しください。(AUTHCODE_CHECK_DAME)";
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="js/jquery-min.js"></script>
<script src="js/unsupported.js"></script>
<link rel="apple-touch-icon" type="image/png" href="favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>アカウント登録 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="js/back.js"></script>
<body>
<div class="leftbox">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="index.php"><img src="img/uwuzulogo.svg"></a>
</div>
<?php }?>
<div class="textbox">
<h1>二段階認証</h1>
<p>以下の二次元コードより二段階認証をセットアップしてください。</p>
<p>セットアップが完了したら入力ボックスにコードを入力して「次へ」ボタンを押してください!<br>注意:まだ二段階認証の設定は終わっていません。次へを押すと設定が完了します。</p>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p>・ <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?php
$title = safetext($serversettings["serverinfo"]["server_name"]);
$name = $userid;
$qrCodeUrl = $authcode->getQRCodeUrl($name, $secret, $title);
?>
<div class="authzone">
<img src="qr/php/qr_img.php?d=<?php echo $qrCodeUrl?>">
</div>
<form class="formarea" enctype="multipart/form-data" method="post">
<div>
<p>二段階認証コード</p>
<div class="p2">先程セットアップして出力された6桁のコードを入力してください。</div>
<input id="profile" type="text" placeholder="123456" class="inbox" name="usercode" value="">
</div>
<input type="submit" class = "irobutton" name="btn_submit" value="次へ">
</form>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
window.addEventListener('DOMContentLoaded', function(){
// ファイルが選択されたら実行
document.getElementById("file_upload").addEventListener('change', function(e){
var file_reader = new FileReader();
// ファイルの読み込みを行ったら実行
file_reader.addEventListener('load', function(e) {
console.log(e.target.result);
const element = document.querySelector('#wrap');
const createElement = '<p>画像を選択しました。</p>';
element.insertAdjacentHTML('afterend', createElement);
});
file_reader.readAsText(e.target.files[0]);
});
});
</script>
</body>
</html>
+564
View File
@@ -0,0 +1,564 @@
<?php
require('../db.php');
//関数呼び出し
//- EXIF
require('../function/function.php');
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
$badpassfile = "../server/badpass.txt";
$badpass_info = file_get_contents($badpassfile);
$badpass = preg_split("/\r\n|\n|\r/", $badpass_info);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
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();
}
$aduser = "yes";
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$query = $dbh->prepare('SELECT * FROM account WHERE admin = :adminuser limit 1');
$query->execute(array(':adminuser' => $aduser));
$result2 = $query->fetch();
if($result2 > 0){
header("Location: ../login.php");
exit;
}
if( !empty($_POST['btn_submit']) ) {
$_SESSION['form_data'] = $_POST;
// 空白除去
$username = safetext($_POST['username']);
$userid = safetext($_POST['userid']);
$password = safetext($_POST['password']);
$chkpass = safetext($_POST['chkpass']);
$mailadds = safetext($_POST['mailadds']);
if(!(empty($mailadds))){
if(!(filter_var($mailadds, FILTER_VALIDATE_EMAIL))){
$error_message[] = 'メールアドレスが正しい形式ではありません。(MAILADDS_CHECK_DAME)';
}
}
$profile = safetext($_POST['profile']);
if( 1024 < mb_strlen($profile, 'UTF-8') ) {
$error_message[] = 'プロフィールは1024文字以内で入力してください。(INPUT_OVER_MAX_COUNT)';
}
if(safetext($serversettings["serverinfo"]["server_invitation"]) === "true"){
$invitationcode = safetext($_POST['invitationcode']);
}
//----------------[icon image]-------------------------------
if (empty($_FILES['image']['name'])) {
$localFilePathhead = '../img/deficon/icon.png';
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$userid.'.png';
// 保存先のパスを生成
$uploadedPath = 'usericons/' . $newFilename;
// ファイルを移動
$result = copy($localFilePathhead, '../'.$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 {
// アップロードされたファイル情報
$uploadedFile = $_FILES['image'];
if(!(empty($uploadedFile['tmp_name']))){
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[] = 'アップロード失敗!(1)エラーコード:' .$uploadedFile['error'].'';
}
}else{
$error_message[] = "使用できない画像形式です。(SORRY_FILE_HITAIOU)";
}
}else{
$error_message[] = "ファイルがアップロードできませんでした。(FILE_UPLOAD_DEKINAKATTA)";
}
}
//----------------[header image]-------------------------------
$localFilePathhead = '../img/defhead/head.png';
// 新しいファイル名を生成(uniqid + 拡張子)
$newFilename = createUniqId() . '-'.$userid.'.png';
// 保存先のパスを生成
$uploadedPath = 'userheads/' . $newFilename;
// ファイルを移動
$result = copy($localFilePathhead, '../'.$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)エラーコード:' .$uploadedFile['error'].'';
}
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
if(safetext($serversettings["serverinfo"]["server_invitation"]) === "true"){
$query = $dbh->prepare('SELECT * FROM invitation WHERE code = :code limit 1');
$query->execute(array(':code' => $invitationcode));
$result = $query->fetch();
// 招待コードの入力チェック
if( empty($invitationcode) ) {
$error_message[] = '招待コードを入力してください。(INVITATION_CODE_INPUT_PLEASE)';
} else {
if($result > 0){
if($result["used"] === "true"){
$error_message[] = 'この招待コード('.$invitationcode.')は既に使用されています。(INVITATION_CODE_SHIYOUZUMI)';
}
}else{
$error_message[] = 'この招待コード('.$invitationcode.')は使えません。(INVITATION_CODE_DEAD)';
}
}
}
$query = $dbh->prepare('SELECT * FROM account WHERE userid = :userid limit 1');
$query->execute(array(':userid' => $userid));
$result = $query->fetch();
// ユーザーネームの入力チェック
if( empty($username) ) {
$error_message[] = '表示名を入力してください。(USERNAME_INPUT_PLEASE)';
} else {
// 文字数を確認
if( 50 < mb_strlen($username, 'UTF-8') ) {
$error_message[] = 'ユーザーネームは50文字以内で入力してください。(USERNAME_OVER_MAX_COUNT)';
}
}
// IDの入力チェック
if( empty($userid) ) {
$error_message[] = 'ユーザーIDを入力してください。(USERID_INPUT_PLEASE)';
} else {
// 文字数を確認
if( 20 < mb_strlen($userid, 'UTF-8') ) {
$error_message[] = 'IDは20文字以内で入力してください。(USERID_OVER_MAX_COUNT)';
}
if($result > 0){
$error_message[] = 'このID('.$userid.')は既に使用されています。他のIDを作成してください。(USERID_SHIYOUZUMI)';
}
if(!(preg_match("/^[a-zA-Z0-9_]+$/", $userid))){
$error_message[] = "IDは半角英数字で入力してください。(「_」は使用可能です。)(USERID_DONT_USE_WORD)";
}
}
// パスワードの入力チェック
if( empty($password) ) {
$error_message[] = 'パスワードを入力してください。(PASSWORD_INPUT_PLEASE)';
} else {
if(in_array($password, $badpass) === true ){
$error_message[] = "パスワードが弱いです。セキュリティ上変更してください。(PASSWORD_ZEIJAKU)";
}
if (!($chkpass == $password)){
$error_message[] = '確認用パスワードが違います。(PASSWORD_CHIGAUYANKE)';
}
if( 4 > mb_strlen($password, 'UTF-8') ) {
$error_message[] = 'パスワードは4文字以上である必要があります。(PASSWORD_TODOITENAI_MIN_COUNT)';
}
// 文字数を確認
if( 256 < mb_strlen($password, 'UTF-8') ) {
$error_message[] = 'パスワードは256文字以内で入力してください。(PASSWORD_OVER_MAX_COUNT)';
}
}
if( empty($error_message) ) {
// トランザクション開始
$pdo->beginTransaction();
$datetime = date("Y-m-d H:i:s");
$userEnckey = GenUserEnckey($datetime);
$ivLength = openssl_cipher_iv_length('aes-256-cbc');
$randomBytes = random_bytes($ivLength);
$randomhash = hash('sha3-512', $randomBytes);
$iv = substr($randomhash, 0, $ivLength);
// メアドを暗号化する
if(!(empty($mailadds))){
$enc_mailadds = EncryptionUseEncrKey($mailadds, $userEnckey, $iv);
}else{
$enc_mailadds = "";
}
$other_settings = [];
$other_settings_json = json_encode($other_settings);
try {
$role = "official";
$admin = "yes";
$hashpassword = uwuzu_password_hash($password);
$LoginIdBytes = random_bytes(64);
$loginid = hash('sha3-512', $LoginIdBytes);
// SQL作成
$stmt = $pdo->prepare("INSERT INTO account (username, userid, password, loginid, mailadds, profile, iconname, headname, role, datetime, admin, encryption_ivkey, other_settings) VALUES (:username, :userid, :password, :loginid, :mailadds, :profile, :iconname, :headname, :role, :datetime, :admin, :encryption_ivkey, :other_settings)");
// アイコン画像
$stmt->bindValue(':iconname', $iconName, PDO::PARAM_STR);
// ヘッダー画像
$stmt->bindValue(':headname', $headName, PDO::PARAM_STR);
// 他の値をセット
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':userid', $userid, PDO::PARAM_STR);
$stmt->bindParam(':password', $hashpassword, PDO::PARAM_STR);
$stmt->bindParam(':loginid', $loginid, PDO::PARAM_STR);
$stmt->bindParam(':mailadds', $enc_mailadds, PDO::PARAM_STR);
$stmt->bindParam(':profile', $profile, PDO::PARAM_STR);
$stmt->bindParam(':role', $role, PDO::PARAM_STR);
$stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR);
$stmt->bindParam(':other_settings', $other_settings_json, PDO::PARAM_STR);
$stmt->bindParam(':encryption_ivkey', $iv, PDO::PARAM_STR);
$stmt->bindParam(':admin', $admin, PDO::PARAM_STR);
// SQLクエリの実行
$res = $stmt->execute();
// コミット
$res = $pdo->commit();
if(safetext($serversettings["serverinfo"]["server_invitation"]) === "true"){
$pdo->beginTransaction();
$stmt = $pdo->prepare("UPDATE invitation SET used = :used, datetime = :datetime WHERE code = :code;");
$true = "true";
$stmt->bindParam(':used', $true, PDO::PARAM_STR);
$stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR);
$stmt->bindValue(':code', $invitationcode, PDO::PARAM_STR);
// SQLクエリの実行
$res = $stmt->execute();
// コミット
$res = $pdo->commit();
}
} catch (Exception $e) {
// エラーが発生した時はロールバック
$pdo->rollBack();
}
if ($res) {
// リダイレクト先のURLへ転送する
$_SESSION['form_data'] = array();
$_SESSION['userid'] = $userid;
$url = 'success';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
} else {
$error_message[] = '登録に失敗しました。(REGISTERED_DAME)';
}
// プリペアドステートメントを削除
$stmt = null;
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/style.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/zxcvbn.js"></script>
<link rel="apple-touch-icon" type="../image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>管理者アカウント登録 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="back.js"></script>
<body>
<div class="leftbox">
<div class="logo">
<img src="../img/uwuzulogo.svg">
</div>
<div class="textbox">
<h1>アカウント登録</h1>
<p>管理者アカウント登録です。</p>
<p>必須項目には「*」があります。
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p>・ <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form class="formarea" enctype="multipart/form-data" method="post">
<div id="wrap">
<div class="iconimg">
<img id="iconimg" src="../img/deficon/icon.png">
</div>
<label class="irobutton" for="file_upload">ファイル選択
<input type="file" id="file_upload" name="image" accept="image/*">
</label>
<p id="img_select" style="display:none;">画像を選択しました</p>
</div>
<script src="js/back.js"></script>
<!--ユーザーネーム関係-->
<div>
<p>ユーザーネーム *</p>
<div class="p2">プロフィールページに掲載され公開されます。<br>※サービス管理者が確認できます。</div>
<input id="username" placeholder="" class="inbox" type="text" name="username" value="<?php if( !empty($_SESSION['form_data']['username']) ){ echo safetext($_SESSION['form_data']['username']); } ?>">
</div>
<div>
<p>ユーザーID *</p>
<div class="p2">後から変更はできません。<br>プロフィールページに掲載され公開されます。<br>※サービス管理者が確認できます。</div>
<input onInput="checkForm(this)" placeholder="" class="inbox" id="userid" type="text" name="userid" value="<?php if( !empty($_SESSION['form_data']['userid']) ){ echo safetext($_SESSION['form_data']['userid']); } ?>">
</div>
<!--アカウント関連-->
<div>
<p>パスワード *</p>
<div class="p2">ログイン時に必要となります。<br>最大256文字まで使用可能です。<br>※サービス管理者が確認できません。</div>
<input placeholder="" class="inbox" id="password" type="text" name="password" value="<?php if( !empty($_SESSION['form_data']['password']) ){ echo safetext($_SESSION['form_data']['password']); } ?>">
<div class="p2" id="password_zxcvbn" style="display: none;"></div>
</div>
<div>
<p>パスワード再確認 *</p>
<input placeholder="" class="inbox" oncopy="return false" onpaste="return false" oncontextmenu="return false" id="chkpass" type="text" style="-webkit-text-security:disc;" name="chkpass" value="<?php if( !empty($_SESSION['form_data']['chkpass']) ){ echo safetext($_SESSION['form_data']['chkpass']); } ?>">
</div>
<div>
<p>メールアドレス</p>
<div class="p2">設定しておくとアカウント復旧に利用できます。<br>※サービス管理者が確認できます。</div>
<input id="mailadds" type="text" placeholder="" class="inbox" name="mailadds" value="<?php if( !empty($_SESSION['form_data']['mailadds']) ){ echo safetext($_SESSION['form_data']['mailadds']); } ?>">
</div>
<!--プロフィール関連-->
<div>
<p>プロフィール</p>
<div class="p2">プロフィールページに掲載され公開されます。<br>※サービス管理者が確認できます。</div>
<input id="profile" type="text" placeholder="" class="inbox" name="profile" value="<?php if( !empty($_SESSION['form_data']['profile']) ){ echo safetext($_SESSION['form_data']['profile']); } ?>">
</div>
<?php if(safetext($serversettings["serverinfo"]["server_invitation"]) === "true"){?>
<div>
<p>招待コード</p>
<div class="p2">招待コードがないとこのサーバーには登録できません。</div>
<input id="profile" type="text" placeholder="" class="inbox" name="invitationcode" value="<?php if( !empty($_SESSION['form_data']['invitationcode']) ){ echo safetext($_SESSION['form_data']['invitationcode']); } ?>">
</div>
<input type="submit" class = "irobutton" name="btn_submit" value="登録">
<?php }else{?>
<input type="submit" class = "irobutton" name="btn_submit" value="登録">
<?php }?>
</form>
<div class="btnbox">
<a href="index.php" class="sirobutton">戻る</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
window.addEventListener('DOMContentLoaded', function(){
$('#password').on('input', function () {
var safetypass = $('#password').val();
if(String(safetypass).length > 0){
$("#password_zxcvbn").show();
var point = zxcvbn(safetypass);
if(point.score == 0){
$("#password_zxcvbn").text("パスワードがめっちゃ弱いです!");
$("#password_zxcvbn").css('color', 'var(--error)');
}else if(point.score == 1){
$("#password_zxcvbn").text("弱いパスワードです!");
$("#password_zxcvbn").css('color', 'var(--danger)');
}else if(point.score == 2){
$("#password_zxcvbn").text("危ないパスワードです!");
$("#password_zxcvbn").css('color', 'var(--warn)');
}else if(point.score == 3){
$("#password_zxcvbn").text("普通のパスワードです");
$("#password_zxcvbn").css('color', 'var(--good)');
}else if(point.score == 4){
$("#password_zxcvbn").text("おめでとうございます!強いパスワードです!");
$("#password_zxcvbn").css('color', 'var(--success)');
}
}else{
$("#password_zxcvbn").hide();
}
});
$('#file_upload').change(function(e) {
var file_reader = new FileReader();
file_reader.addEventListener('load', function(e) {
$('#img_select').show();
$('#iconimg').attr('src', file_reader.result);
});
file_reader.readAsDataURL(e.target.files[0]);
});
});
</script>
</body>
</html>
+206
View File
@@ -0,0 +1,206 @@
<?php
require('../db.php');
require("../function/function.php");
$softwarefile = "../server/uwuzuinfo.txt";
$softwaredata = file_get_contents($softwarefile);
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
for( $i=0;$i<$cnt;$i++ ){
$uwuzuinfo[$i] = ($softwaredata[$i]);
}
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
if(!(empty(DB_NAME) && empty(DB_HOST) && empty(DB_USER) && empty(DB_PASS))){
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();
}
$aduser = "yes";
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$query = $dbh->prepare('SELECT * FROM account WHERE admin = :adminuser limit 1');
$query->execute(array(':adminuser' => $aduser));
$result2 = $query->fetch();
if($result2 > 0){
header("Location: ../login.php");
exit;
}
$db_php = true;
}else{
$db_php = false;
}
if (in_array("gd", get_loaded_extensions())) {
$check_gd = true;
} else {
$check_gd = false;
}
if (in_array("fileinfo", get_loaded_extensions())) {
$check_fileinfo = true;
} else {
$check_fileinfo = false;
}
if (in_array("mbstring", get_loaded_extensions())) {
$check_mbstring = true;
} else {
$check_mbstring = false;
}
if (in_array("pdo_mysql", get_loaded_extensions())) {
$check_pdo_mysql = true;
} else {
$check_pdo_mysql = false;
}
if (in_array("mysqli", get_loaded_extensions())) {
$check_mysqli = true;
} else {
$check_mysqli = false;
}
if (in_array("zip", get_loaded_extensions())) {
$check_zip = true;
} else {
$check_zip = false;
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/style.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<link rel="apple-touch-icon" type="../image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>uwuzuへようこそ!!! - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="../js/back.js"></script>
<body>
<div class="leftbox">
<div class="logo">
<img src="../img/uwuzulogo.svg">
</div>
<div class="textbox">
<h1>uwuzuへようこそ!!!</h1>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p>・ <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<script src="back.js"></script>
<p>おめでとうございます!!!</p>
<p>uwuzuの導入が完了しました!</p>
<p>これよりuwuzuのセットアップを開始します!<br>
セットアップを始める前に、PHPの必須モジュールがインストールされているか、以下の欄をみてご確認ください。<br>
Not setが一つでもある場合は再度モジュールの設定を行ってください!<br>
<br>
<?php if($db_php == true){?>
db.phpの設定は済んでいるようですね、それでは早速セットアップを開始しましょう!
<?php }else{?>
また、uwuzuのセットアップを始める前に、以下の情報をあなたが知っている必要があります!<br>
- データベース名(空のデータベースを用意してください。)<br>
- データベースを管理できるユーザー名<br>
- データベースへアクセスできるユーザーのパスワード<br>
- データベースのホストアドレス<br>
これらの情報はuwuzuがデータベースを使用するために必要で、uwuzu導入フォルダ内のdb.phpに保存されます。<br>
もしこのあとうまくセットアップが継続できなければ手動でdb.phpに上の情報を保存してください!<br>
これらのデータをあなたが知っているのであれば早速セットアップを開始しましょう!<br>
<?php }?>
<br>
セットアップ中にエラーに遭遇した場合はdocs.uwuzu.xyzを確認し、解消に向けて取り組みましょう!</p>
<div class="module_chk">
<div class="p2">Already setが設定済みでNot setが未設定です。</div>
<p>GD : <?php if($check_gd == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
<p>Fileinfo : <?php if($check_fileinfo == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
<p>mbstring : <?php if($check_mbstring == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
<p>pdo_mysql : <?php if($check_pdo_mysql == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
<p>mysqli : <?php if($check_mysqli == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
<p>ZipArchive : <?php if($check_zip == true){echo "Already set✅";}else{echo "Not set🟥";}?></p>
</div>
<p>uwuzu<br>Version : <?php echo $uwuzuinfo[1]?></p>
<div class="btnbox">
<a href="setup_db_php.php" class="irobutton">セットアップ開始!</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
</script>
</body>
</html>
+239
View File
@@ -0,0 +1,239 @@
<?php
require('../db.php');
require("../function/function.php");
$softwarefile = "../server/uwuzuinfo.txt";
$softwaredata = file_get_contents($softwarefile);
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
for( $i=0;$i<$cnt;$i++ ){
$uwuzuinfo[$i] = ($softwaredata[$i]);
}
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
if(!(empty(DB_NAME) && empty(DB_HOST) && empty(DB_USER) && empty(DB_PASS))){
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();
}
$aduser = "yes";
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$query = $dbh->prepare('SELECT * FROM account WHERE admin = :adminuser limit 1');
$query->execute(array(':adminuser' => $aduser));
$result2 = $query->fetch();
if($result2 > 0){
header("Location: ../login.php");
exit;
}else{
header("Location: setup_uwuzu_db.php");
exit;
}
$db_php = true;
}else{
$db_php = false;
}
if(!(empty($_POST['btn_submit']))){
$DataBase_Name = safetext($_POST['db_name']);
$DataBase_User = safetext($_POST['db_user']);
$DataBase_Pass = safetext($_POST['db_pass']);
$DataBase_Host = safetext($_POST['db_host']);
$Encryption_KEY = safetext(hash("sha3-512", bin2hex(random_bytes(64))));
try {
$option = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_MULTI_STATEMENTS => false
);
$pdo = new PDO('mysql:charset=utf8mb4;dbname='.$DataBase_Name.';host='.$DataBase_Host , $DataBase_User, $DataBase_Pass, $option);
} catch(PDOException $e) {
$error_message[] = "データベースに接続できませんでした。\n設定は間違っていませんか?";
}
if(empty($error_message)){
$DB_Settings = "
<?php // データベースの接続情報
define( 'DB_HOST', '".$DataBase_Host."');
define( 'DB_USER', '".$DataBase_User."');
define( 'DB_PASS', '".$DataBase_Pass."');
define( 'DB_NAME', '".$DataBase_Name."');
// ENC_KEYは操作しないでください。ユーザーデータを使用できなくなるおそれがあります。
define( 'ENC_KEY', '".$Encryption_KEY."');
// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');
?>
";
//設定上書き
$file = fopen('../db.php', 'w');
$data = $DB_Settings;
fputs($file, $data);
fclose($file);
header("Location: setup_uwuzu_db.php");
exit;
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/style.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<link rel="apple-touch-icon" type="../image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>db.phpのセットアップ - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="../js/back.js"></script>
<body>
<div class="leftbox">
<div class="logo">
<img src="../img/uwuzulogo.svg">
</div>
<div class="textbox">
<h1>db.phpのセットアップ</h1>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p>・ <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<script src="back.js"></script>
<p>db.phpのセットアップを行います。<br>
db.phpはuwuzuがデータベースへ接続するための設定ファイルです。<br>
これが設定されていないとuwuzuはデータベースに接続できません。</p>
<form class="formarea" enctype="multipart/form-data" method="post">
<div>
<p>データベース名</p>
<div class="p2">空のデータベースを用意してください</div>
<input id="db_name" type="text" placeholder="uwuzu_db" class="inbox" name="db_name" value="<?php echo safetext(DB_NAME)?>">
</div>
<div>
<p>ユーザー名</p>
<div class="p2">データベースを操作できるユーザー名を入力してください。</div>
<input id="db_user" type="text" placeholder="root" class="inbox" name="db_user" value="<?php echo safetext(DB_USER)?>">
</div>
<div>
<p>パスワード</p>
<div class="p2">上のユーザーのパスワードを入力してください。</div>
<input id="db_pass" type="password" placeholder="********" class="inbox" name="db_pass" value="<?php echo safetext(DB_PASS)?>">
</div>
<div class="switch_flexbox">
<div class="switch_button">
<input id="passview" class="switch_input" type='checkbox' name="passview" value=""/>
<label for="passview" class="switch_label"></label>
</div>
<p>パスワードを表示する</p>
</div>
<div>
<p>データベースのホスト名</p>
<div class="p2">データベースのホスト名を入力してください。<br>localhostであることが多いです。</div>
<input id="db_host" type="text" placeholder="localhost" class="inbox" name="db_host" value="<?php echo safetext(DB_HOST)?>">
</div>
<input type="submit" class = "irobutton" name="btn_submit" value="次へ">
</form>
<div class="btnbox">
<a href="index.php" class="sirobutton">戻る</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
$("#passview").click(function () {
if ($("#passview").prop("checked") == true) {
$('#db_pass').get(0).type = 'text';
} else {
$('#db_pass').get(0).type = 'password';
}
});
</script>
</body>
</html>
+212
View File
@@ -0,0 +1,212 @@
<?php
require('../db.php');
require("../function/function.php");
$softwarefile = "../server/uwuzuinfo.txt";
$softwaredata = file_get_contents($softwarefile);
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
for( $i=0;$i<$cnt;$i++ ){
$uwuzuinfo[$i] = ($softwaredata[$i]);
}
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
if(!(empty(DB_NAME) && empty(DB_HOST) && empty(DB_USER) && empty(DB_PASS))){
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();
}
$aduser = "yes";
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
try{
$table_query = $dbh->prepare('SELECT 1 FROM role LIMIT 1;');
$table_query->execute();
$table_result = $table_query->fetch();
if($table_result > 0){
$query = $dbh->prepare('SELECT * FROM account WHERE admin = :adminuser limit 1');
$query->execute(array(':adminuser' => $aduser));
$result2 = $query->fetch();
if($result2 > 0){
header("Location: ../login.php");
exit;
}
header("Location: addadmin.php");
exit;
}
} catch(PDOException $e) {
}
$db_php = true;
}else{
$db_php = false;
}
if(!(empty($_POST['btn_submit']))){
$sqlfile = "../uwuzu_database.sql";
$sqldata = file_get_contents($sqlfile);
if ($sqldata === false) {
$error_message[] = "SQLファイルの読み込みに失敗しました。";
exit();
}
if(empty($error_message)){
try {
$option = array(
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
);
$pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$pdo->exec($sqldata);
$db_setup = true;
$role_sql = "insert into role (rolename, roleauth, rolecolor, roleidname) VALUES ('凍結済み', 'ice', 'CCCCCC', 'ice');
insert into role (rolename, roleauth, rolecolor, roleidname) VALUES ('公式', 'official', 'CCCCCC', 'official');
insert into role (rolename, roleauth, rolecolor, roleidname) VALUES ('ゆーざー', 'user', 'CCCCCC', 'user');";
$pdo->exec($role_sql);
$role_setup = true;
} catch (PDOException $e) {
$error_message[] = 'SQL実行エラー: ' . $e->getMessage();
}
if(empty($error_message)){
header("Location: addadmin.php");
exit;
}
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/style.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<link rel="apple-touch-icon" type="../image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>データベースのセットアップ - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="../js/back.js"></script>
<body>
<div class="leftbox">
<div class="logo">
<img src="../img/uwuzulogo.svg">
</div>
<div class="textbox">
<h1>データベースのセットアップ</h1>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p>・ <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<script src="back.js"></script>
<p>データベースのセットアップを行います。<br>
データベース内にテーブルというデータを保存する場所と必須ロールを作成します!<br>
作成にあたり、uwuzuにデフォルトで同梱されているuwuzu_database.sqlというファイルを使用します。<br>
このファイルに悪質な命令などが含まれているとあなたのサーバーが死んでしまうおそれがあります!<br>
<br>
uwuzuをuwuzuの公式ダウンロードページ(Github)からダウンロードしているならおそらく安全かと思われますが、<br>
uwuzu_database.sqlが安全なことを確認したうえで以下のデータベースのセットアップを実行してください。<br>
<br>
また、このセットアップには時間がかかる事があります!<br>
処理が終わるまで再起動などはせずに、そのままお待ち下さい!<br>
<br>
データベースのセットアップが完了すると、管理者アカウントの登録へ進みます。</p>
<form class="formarea" enctype="multipart/form-data" method="post">
<input type="submit" class = "irobutton" name="btn_submit" value="セットアップ実行">
</form>
<div class="btnbox">
<a href="index.php" class="sirobutton">戻る</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
$("#passview").click(function () {
if ($("#passview").prop("checked") == true) {
$('#db_pass').get(0).type = 'text';
} else {
$('#db_pass').get(0).type = 'password';
}
});
</script>
</body>
</html>
+115
View File
@@ -0,0 +1,115 @@
<?php
require('../db.php');
require("../function/function.php");
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
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();
}
$aduser = "yes";
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$query = $dbh->prepare('SELECT * FROM account WHERE admin = :adminuser limit 1');
$query->execute(array(':adminuser' => $aduser));
$result2 = $query->fetch();
if($result2 > 0){
header("Location: ../login.php");
exit;
}
$_SESSION = array();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-1000, '/');
}
session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../css/style.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<link rel="apple-touch-icon" type="image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>管理者アカウント登録完了!!! - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="back.js"></script>
<body>
<div class="leftbox2">
<div class="logo">
<img src="../img/uwuzulogo.svg">
</div>
<div class="textbox">
<h1>管理者アカウント登録完了!</h1>
<p><br>いぇ~い!</p>
<p>🎉🎉🎉🎊🎊🎊✨✨✨</p>
<p>管理者アカウントの登録が完了しました!</p>
<p>以下のログインボタンよりログインしてください!<br>ログイン後は画面左側メニューの「サーバー設定」よりサーバーの情報を設定することをおすすめします!<br>また、左側メニューの「設定」から二段階認証の設定をすることもおすすめします。</p>
<div class="btnbox">
<a href="../login.php" class="sirobutton">ログイン</a>
</div>
</div>
</div>
</body>
</html>
+13
View File
@@ -0,0 +1,13 @@
<?php
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$err = "API_has_been_deleted";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>
+127
View File
@@ -0,0 +1,127 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
//関数呼び出し
//- Base64_mime
require('../../function/function.php');
//投稿及び返信レート制限↓(分):デフォで60件/分まで
$max_ueuse_rate_limit = 60;
$mojisizefile = "../../server/textsize.txt";
$banurldomainfile = "../../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role, follow, follower FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
//本文取得
if(!(empty($_GET['uniqid']))){
$fav_uniqid = safetext($_GET['uniqid']);
}elseif(!(empty($post_json["uniqid"]))){
$fav_uniqid = safetext($post_json["uniqid"]);
}
if(!(empty($fav_uniqid))){
$res = addFavorite($pdo, $fav_uniqid, $userData["userid"]);
if($res[0] === true){
$response = array(
'favorite_list' => decode_yajirushi(htmlspecialchars_decode($res[2])),
'success' => true
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+127
View File
@@ -0,0 +1,127 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
//関数呼び出し
//- Base64_mime
require('../../function/function.php');
//投稿及び返信レート制限↓(分):デフォで60件/分まで
$max_ueuse_rate_limit = 60;
$mojisizefile = "../../server/textsize.txt";
$banurldomainfile = "../../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role, follow, follower FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
//本文取得
if(!(empty($_GET['uniqid']))){
$fav_uniqid = safetext($_GET['uniqid']);
}elseif(!(empty($post_json["uniqid"]))){
$fav_uniqid = safetext($post_json["uniqid"]);
}
if(!(empty($fav_uniqid))){
$res = getFavorite($pdo, $fav_uniqid);
if($res[0] === true){
$response = array(
'favorite_list' => decode_yajirushi(htmlspecialchars_decode($res[2])),
'success' => true
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+189
View File
@@ -0,0 +1,189 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$DataQuery = $pdo->prepare("SELECT username,userid,profile,datetime,follow,follower,iconname,headname,role,sacinfo,admin FROM account WHERE userid = :userid");
$DataQuery->bindValue(':userid', $userData["userid"]);
$DataQuery->execute();
$userdata = $DataQuery->fetch();
if (empty($userdata)){
$response = array(
'error_code' => "critical_error_userdata_not_found",
);
}else{
$roles = explode(',', $userdata["role"]);
if(!(empty($roles))){
foreach ($roles as $roleId) {
$Getrole = $pdo->prepare("SELECT roleidname, rolename, roleauth, rolecolor, roleeffect FROM role WHERE roleidname = :role");
$Getrole->bindValue(':role', $roleId);
$Getrole->execute();
$roleData[$roleId] = $Getrole->fetch();
if($roleData[$roleId]['roleeffect'] == '' || $roleData[$roleId]['roleeffect'] == 'none'){
$role_view_effect = "none";
}elseif($roleData[$roleId]['roleeffect'] == 'shine'){
$role_view_effect = "shine";
}elseif($roleData[$roleId]['roleeffect'] == 'rainbow'){
$role_view_effect = "rainbow";
}else{
$role_view_effect = "none";
}
$roleinfo = array(
"name" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['rolename'])),
"color" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['rolecolor'])),
"effect" => decode_yajirushi(htmlspecialchars_decode($role_view_effect)),
"id" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['roleidname'])),
);
$role[] = $roleinfo;
}
}else{
$role[] = "";
}
if(!(empty($userdata["sacinfo"]))){
if($userdata["sacinfo"] == "bot"){
$isBot = true;
}else{
$isBot = false;
}
}else{
$isBot = false;
}
if(!(empty($userdata["admin"]))){
if($userdata["admin"] == "yes"){
$isAdmin = true;
}else{
$isAdmin = false;
}
}else{
$isAdmin = false;
}
if(!(empty($userdata["follow"]))){
$followee = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($userdata["follow"])));
array_shift($followee);
}else{
$followee = array();
}
if(!(empty($userdata["follower"]))){
$follower = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($userdata["follower"])));
array_shift($follower);
}else{
$follower = array();
}
$followcnts = explode(',', $userdata["follow"]);
$userdata["follow_cnt"] = (int)count($followcnts)-1;
$followercnts = explode(',', $userdata["follower"]);
$userdata["follower_cnt"] = (int)count($followercnts)-1;
$allueuse = $pdo->prepare("SELECT account FROM ueuse WHERE account = :userid");
$allueuse->bindValue(':userid', $userdata["userid"]);
$allueuse->execute();
$All_ueuse = $allueuse->rowCount();
$response = array(
'username' => decode_yajirushi(htmlspecialchars_decode($userdata["username"])),
'userid' => decode_yajirushi(htmlspecialchars_decode($userdata["userid"])),
'profile' => decode_yajirushi(htmlspecialchars_decode($userdata["profile"])),
'user_icon' => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userdata["iconname"])),
'user_header' => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userdata["headname"])),
'registered_date' => decode_yajirushi(htmlspecialchars_decode($userdata["datetime"])),
'followee' => $followee,
'followee_cnt' => $userdata["follow_cnt"],
'follower' => $follower,
'follower_cnt' => $userdata["follower_cnt"],
'ueuse_cnt' => $All_ueuse,
'isBot' => $isBot,
'isAdmin' => $isAdmin,
'role' => $role,
'language' => "ja-JP",
);
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+227
View File
@@ -0,0 +1,227 @@
<?php
require("../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
function random_iv($length = 16){
return substr(str_shuffle('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'), 0, $length);
}
$domain = $_SERVER['HTTP_HOST'];
require('../db.php');
$datetime = array();
$pdo = null;
session_start();
// データベースに接続
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(isset($_GET['migration_code'])) {
if(isset($_GET['check'])) {
//移行後-----------------------------------------------------------------------------------------------
$migration_code = safetext($_GET['migration_code']);
$check = urldecode($_GET['check']);
$request_domain = safetext($_SERVER['REMOTE_ADDR']);
$migrationQuery = $pdo->prepare("SELECT * FROM migration WHERE migration_code = :migration_code");
$migrationQuery->bindValue(':migration_code', $migration_code);
$migrationQuery->execute();
$migrationData = $migrationQuery->fetch(PDO::FETCH_ASSOC);
if(!(empty($migrationData))){
$UserdataQuery = $pdo->prepare("SELECT userid FROM account WHERE userid = :userid");
$UserdataQuery->bindValue(':userid', $migrationData['account'], PDO::PARAM_STR);
$UserdataQuery->execute();
$UserData = $UserdataQuery->fetch(PDO::FETCH_ASSOC);
$done_chk = openssl_decrypt($check, "AES-256-CBC", $migrationData['encryption_key'], 0, $migrationData['encryption_ivkey']);
//下の文字列はアカウント移行が完了しているかの確認用!変えないで!!!
if($done_chk == "QYrLCSQIHqOLHuhJ"){
$account = safetext($UserData["userid"]);
$pdo->beginTransaction();
try {
$deleteQuery = $pdo->prepare("DELETE FROM migration WHERE account = :account");
$deleteQuery->bindValue(':account',$account, PDO::PARAM_STR);
$res = $deleteQuery->execute();
$res = $pdo->commit();
} catch(Exception $e) {
$pdo->rollBack();
}
$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', $account, PDO::PARAM_STR);
// SQLクエリの実行
$res = $stmt->execute();
// コミット
$res = $pdo->commit();
} catch (Exception $e) {
// エラーが発生した時はロールバック
$pdo->rollBack();
}
//メール送信はナシ
//------------
$msg = "アカウントの移行が完了したためこのアカウントの不正コピーを防ぐためアカウントを凍結しました!\n引き続きこのアカウントを利用するには管理者に凍結を解除してもらってください!";
$title = "✨アカウントの移行が完了しました!🔄️";
$url = "/rule/serverabout";
$from_userid = "uwuzu-fromsys";
$category = "system";
send_notification($from_userid,$account,$title,$msg,$url,$category);
if ($res) {
$item = array(
'done' => 'success',
);
$noencriptjson = json_encode($item, JSON_UNESCAPED_UNICODE);
$encriptjson = openssl_encrypt($noencriptjson, "AES-256-CBC", $migrationData['encryption_key'], 0, $migrationData['encryption_ivkey']);
$response = array(
'data' => $encriptjson,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "migration_bad_success";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else {
$err = "migration_bad_success";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "migration_notfound";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
//移行データ
$migration_code = safetext($_GET['migration_code']);
$request_domain = safetext($_SERVER['REMOTE_ADDR']);
$migrationQuery = $pdo->prepare("SELECT * FROM migration WHERE migration_code = :migration_code");
$migrationQuery->bindValue(':migration_code', $migration_code);
$migrationQuery->execute();
$migrationData = $migrationQuery->fetch(PDO::FETCH_ASSOC);
if(!(empty($migrationData))){
$UserdataQuery = $pdo->prepare("SELECT * FROM account WHERE userid = :userid");
$UserdataQuery->bindValue(':userid', $migrationData['account'], PDO::PARAM_STR);
$UserdataQuery->execute();
$UserData = $UserdataQuery->fetch(PDO::FETCH_ASSOC);
/*
// 投稿内容の取得(新しい順に1000件取得)
$ueuseQuery = $pdo->prepare("SELECT * FROM ueuse WHERE account = :userid AND rpuniqid = '' ORDER BY datetime DESC LIMIT 1000");
$ueuseQuery->bindValue(':userid', $migrationData['account'], PDO::PARAM_STR);
$ueuseQuery->execute();
$ueuse_array = $ueuseQuery->fetchAll();
*/
if(!(empty($UserData))){
if(!(empty($UserData["encryption_ivkey"]))){
$view_mailadds = DecryptionUseEncrKey($UserData["mailadds"], GenUserEnckey($UserData["datetime"]), $UserData["encryption_ivkey"]);
}else{
$view_mailadds = $UserData["mailadds"];
}
/*
if(!(empty($ueuse_array))){
foreach ($ueuse_array as $value) {
$ueuses = array(
"username" => decode_yajirushi(htmlentities($value['username'], ENT_QUOTES, 'UTF-8', false)),
"account" => decode_yajirushi(htmlentities($value['account'], ENT_QUOTES, 'UTF-8', false)),
"uniqid" => decode_yajirushi(htmlentities($value['uniqid'], ENT_QUOTES, 'UTF-8', false)),
"ueuse" => decode_yajirushi(htmlentities($value['ueuse'], ENT_QUOTES, 'UTF-8', false)),
"datetime" => decode_yajirushi(htmlentities($value['datetime'], ENT_QUOTES, 'UTF-8', false)),
"abi" => decode_yajirushi(htmlentities($value['abi'], ENT_QUOTES, 'UTF-8', false)),
"abidate" => decode_yajirushi(htmlentities($value['abidate'], ENT_QUOTES, 'UTF-8', false)),
"nsfw" => decode_yajirushi(htmlentities($value['nsfw'], ENT_QUOTES, 'UTF-8', false)),
);
$ueuse[] = $ueuses;
}
}else{
$ueuse[] = "";
}
*/
$item = [
"userdata" => array(
"user_name" => safetext($UserData["username"]),
"user_id" => safetext($UserData["userid"]),
"user_icon" => (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$domain."/".safetext($UserData["iconname"]),
"user_header" => (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$domain."/".safetext($UserData["headname"]),
"user_profile" => safetext($UserData["profile"]),
"mail_adds" => safetext($view_mailadds),
),
];
$noencriptjson = json_encode($item, JSON_UNESCAPED_UNICODE);
$encriptjson = openssl_encrypt($noencriptjson, "AES-256-CBC", $migrationData['encryption_key'], 0, $migrationData['encryption_ivkey']);
$response = array(
'data' => $encriptjson,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}else{
$err = "data_notfound";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "migration_notfound";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}else{
$err = "migration_code_notfound";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+133
View File
@@ -0,0 +1,133 @@
<?php
require("../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$mojisizefile = "../server/textsize.txt";
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
$serverinfofile = '../server/info.txt';
$serverinfo = file_get_contents($serverinfofile);
$domain = $_SERVER['HTTP_HOST'];
$softwarefile = "../server/uwuzuinfo.txt";
$softwaredata = file_get_contents($softwarefile);
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
for( $i=0;$i<$cnt;$i++ ){
$uwuzuinfo[$i] = ($softwaredata[$i]);
}
require('../db.php');
$datetime = array();
$pdo = null;
session_start();
// データベースに接続
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();
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$result = $mysqli->query("SELECT userid FROM account ORDER BY datetime");
/* 結果セットの行数を取得します */
$count1 = $result->num_rows;
$result2 = $mysqli->query("SELECT uniqid FROM ueuse ORDER BY datetime");
/* 結果セットの行数を取得します */
$count2 = $result2->num_rows;
/*-------------------*/
$sql = "SELECT title, note, account, datetime FROM notice ORDER BY datetime DESC";
$notice_array = $pdo->query($sql);
while ($row = $notice_array->fetch(PDO::FETCH_ASSOC)) {
$notices[] = $row;
}
if(safetext($serversettings["serverinfo"]["server_invitation"]) === "true"){
$invitation_code = true;
}else{
$invitation_code = false;
}
if(safetext($serversettings["serverinfo"]["server_account_migration"]) === "true"){
$account_migration = true;
}else{
$account_migration = false;
}
if(!(empty($notices))){
foreach ($notices as $value) {
$notices = array(
"title" => decode_yajirushi(htmlspecialchars_decode($value['title'])),
"note" => decode_yajirushi(htmlspecialchars_decode($value['note'])),
"editor" => decode_yajirushi(htmlspecialchars_decode($value['account'])),
"datetime" => decode_yajirushi(htmlspecialchars_decode($value['datetime'])),
);
$notice[] = $notices;
}
}else{
$notice[] = "";
}
$item = [
"server_info" => array(
"server_name" => safetext($serversettings["serverinfo"]["server_name"]),
"server_icon" => safetext($serversettings["serverinfo"]["server_icon"]),
"server_description" => $serverinfo,
"adminstor" => array(
"name" => safetext($serversettings["serverinfo"]["server_admin"]),
"email" => safetext($serversettings["serverinfo"]["server_admin_mailadds"]),
),
"terms_url" => "https://".$domain."/rule/terms",
"privacy_policy_url" => "https://".$domain."/rule/privacypolicy",
"max_ueuse_length" => (int)safetext(file_get_contents($mojisizefile)),
"invitation_code" => $invitation_code,
"account_migration" => $account_migration,
"usage" => [
"users" => $count1,
"ueuse" => $count2,
],
),
"software" => array(
"name" => "uwuzu",
"version" => "".str_replace("\r", '', $uwuzuinfo[1])."",
"repository" => "https://github.com/Daichimarukana/uwuzu",
),
"server_notice" => $notice,
];
$response = $item; // ループ内で $response にデータを追加
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>
+339
View File
@@ -0,0 +1,339 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
//関数呼び出し
//- Base64_mime
require('../../function/function.php');
//投稿及び返信レート制限↓(分):デフォで60件/分まで
$max_ueuse_rate_limit = 60;
$mojisizefile = "../../server/textsize.txt";
$banurldomainfile = "../../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
//本文取得
if(!(empty($_GET['text']))){
$ueuse = safetext($_GET['text']);
}elseif(!(empty($post_json["text"]))){
$ueuse = safetext($post_json["text"]);
}
//リプライ先取得
if(!(empty($_GET['replyid']))){
$replyid = safetext($_GET['replyid']);
}elseif(!(empty($post_json["replyid"]))){
$replyid = safetext($post_json["replyid"]);
}else{
$replyid = "";
}
//NSFWの有無
if(!(empty($_GET['nsfw']))){
$nsfwchk = safetext($_GET['nsfw']);
if($nsfwchk == "true"){
$nsfw = "true";
}else{
$nsfw = "false";
}
}elseif(!(empty($post_json["nsfw"]))){
$nsfwchk = safetext($post_json["nsfw"]);
if($nsfwchk == true){
$nsfw = "true";
}else{
$nsfw = "false";
}
}else{
$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";
// トランザクション開始
$pdo->beginTransaction();
try {
// SQL作成
$stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, rpuniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi, nsfw) VALUES (:username, :account, :uniqid, :rpuniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi, :nsfw)");
$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);
$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);
$stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR);
$stmt->bindParam(':abi', $abi, PDO::PARAM_STR);
$stmt->bindParam(':nsfw', $nsfw, PDO::PARAM_STR);
// 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;
}else{
$err = "over_rate_limit";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+131
View File
@@ -0,0 +1,131 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['uniqid']))){
$ueuseid = $_GET['uniqid'];
}elseif(!(empty($post_json["uniqid"]))){
$ueuseid = $post_json["uniqid"];
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role, loginid FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
if (safetext(isset($ueuseid)) && safetext(isset($userData["userid"])) && safetext(isset($userData["loginid"]))){
$postUserid = safetext($userData["userid"]);
$postUniqid = safetext($ueuseid);
$loginid = safetext($userData["loginid"]);
$result = delete_ueuse($postUniqid, $postUserid, $loginid);
if($result[0] === true){
$response = array(
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueuseid)),
'userid' => decode_yajirushi(htmlspecialchars_decode($userData["userid"])),
'success' => true
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$response = array(
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueuseid)),
'userid' => decode_yajirushi(htmlspecialchars_decode($userData["userid"])),
'success' => false
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+174
View File
@@ -0,0 +1,174 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['uniqid']))){
$ueuseid = $_GET['uniqid'];
}elseif(!(empty($post_json["uniqid"]))){
$ueuseid = $post_json["uniqid"];
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$sql = "SELECT * FROM ueuse WHERE uniqid = :ueuseid ORDER BY datetime ASC LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':ueuseid', $ueuseid, PDO::PARAM_STR);
$stmt->execute();
$message_array = $stmt;
while ($row = $message_array->fetch(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
if (!empty($messages)) {
$response = array(); // ループ外で $response を初期化
foreach ($messages as $ueusedata) {
if(!(empty($ueusedata["favorite"]))){
$favorite = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite"])));
array_shift($favorite);
}else{
$favorite = array();
}
$favcnts = explode(',', $ueusedata["favorite"]);
$ueusedata["favorite_cnt"] = count($favcnts) - 1;
$userQuery = $pdo->prepare("SELECT username, userid, iconname, headname, role FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $ueusedata["account"]);
$userQuery->execute();
$userData = $userQuery->fetch();
if ($userData) {
$now_userdata = array(
"username" => decode_yajirushi(htmlspecialchars_decode($userData['username'])),
"userid" => decode_yajirushi(htmlspecialchars_decode($userData['userid'])),
"user_icon" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['iconname'])),
"user_head" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['headname'])),
);
}
if($ueusedata["nsfw"] == "true"){
$nsfw = true;
}else{
$nsfw = false;
}
$item = [
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["uniqid"])),
'replyid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["rpuniqid"])),
'text' => decode_yajirushi(htmlspecialchars_decode($ueusedata["ueuse"])),
'account' => $now_userdata,
'photo1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo1"]))),
'photo2' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo2"]))),
'photo3' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo3"]))),
'photo4' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo4"]))),
'video1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["video1"]))),
'favorite' => $favorite,
'favorite_cnt' => decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite_cnt"])),
'datetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["datetime"])),
'abi' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abi"])),
'abidatetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abidate"])),
'nsfw' => $nsfw,
];
$response[] = $item; // ループ内で $response にデータを追加
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "ueuse_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+188
View File
@@ -0,0 +1,188 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['limit']))){
$limit = (int)$_GET['limit'];
}elseif(!(empty($post_json["limit"]))){
$limit = (int)$post_json["limit"];
}else{
$limit = 25;
}
if($limit > 100){
$limit = 100;
}
if(!(empty($_GET['page']))){
$page = (int)$_GET['page'];
}elseif(!(empty($post_json["page"]))){
$page = (int)$post_json["page"];
}else{
$page = 1;
}
$offset = ($page - 1) * $limit;
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$sql = "SELECT ueuse.*
FROM ueuse
LEFT JOIN account ON ueuse.account = account.userid
WHERE ueuse.rpuniqid = '' AND account.role != 'ice'
ORDER BY ueuse.datetime DESC
LIMIT :offset, :itemsPerPage";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':itemsPerPage', $limit, PDO::PARAM_INT);
$stmt->execute();
$message_array = $stmt;
while ($row = $message_array->fetch(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
if (!empty($messages)) {
$response = array(); // ループ外で $response を初期化
foreach ($messages as $ueusedata) {
if(!(empty($ueusedata["favorite"]))){
$favorite = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite"])));
array_shift($favorite);
}else{
$favorite = array();
}
$favcnts = explode(',', $ueusedata["favorite"]);
$ueusedata["favorite_cnt"] = count($favcnts) - 1;
$userQuery = $pdo->prepare("SELECT username, userid, iconname, headname, role FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $ueusedata["account"]);
$userQuery->execute();
$userData = $userQuery->fetch();
if ($userData) {
$now_userdata = array(
"username" => decode_yajirushi(htmlspecialchars_decode($userData['username'])),
"userid" => decode_yajirushi(htmlspecialchars_decode($userData['userid'])),
"user_icon" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['iconname'])),
"user_head" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['headname'])),
);
}
if($ueusedata["nsfw"] == "true"){
$nsfw = true;
}else{
$nsfw = false;
}
$item = [
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["uniqid"])),
'replyid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["rpuniqid"])),
'text' => decode_yajirushi(htmlspecialchars_decode($ueusedata["ueuse"])),
'account' => $now_userdata,
'photo1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo1"]))),
'photo2' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo2"]))),
'photo3' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo3"]))),
'photo4' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo4"]))),
'video1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["video1"]))),
'favorite' => $favorite,
'favorite_cnt' => decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite_cnt"])),
'datetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["datetime"])),
'abi' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abi"])),
'abidatetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abidate"])),
'nsfw' => $nsfw,
];
$response[] = $item; // ループ内で $response にデータを追加
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "ueuse_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+186
View File
@@ -0,0 +1,186 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['limit']))){
$limit = (int)$_GET['limit'];
}elseif(!(empty($post_json["limit"]))){
$limit = (int)$post_json["limit"];
}else{
$limit = 25;
}
if($limit > 100){
$limit = 100;
}
if(!(empty($_GET['page']))){
$page = (int)$_GET['page'];
}elseif(!(empty($post_json["page"]))){
$page = (int)$post_json["page"];
}else{
$page = 1;
}
$offset = ($page - 1) * $limit;
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$Userid = $userData["userid"];
$sql = "SELECT * FROM ueuse WHERE ueuse LIKE :keyword OR abi LIKE :keyword ORDER BY datetime DESC LIMIT :offset, :itemsPerPage";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':itemsPerPage', $limit, PDO::PARAM_INT);
$stmt->bindValue(':keyword', '%@' . $Userid . '%', PDO::PARAM_STR);
$stmt->execute();
$message_array = $stmt;
while ($row = $message_array->fetch(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
if (!empty($messages)) {
$response = array(); // ループ外で $response を初期化
foreach ($messages as $ueusedata) {
if(!(empty($ueusedata["favorite"]))){
$favorite = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite"])));
array_shift($favorite);
}else{
$favorite = array();
}
$favcnts = explode(',', $ueusedata["favorite"]);
$ueusedata["favorite_cnt"] = count($favcnts) - 1;
$userQuery = $pdo->prepare("SELECT username, userid, iconname, headname, role FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $ueusedata["account"]);
$userQuery->execute();
$userData = $userQuery->fetch();
if ($userData) {
$now_userdata = array(
"username" => decode_yajirushi(htmlspecialchars_decode($userData['username'])),
"userid" => decode_yajirushi(htmlspecialchars_decode($userData['userid'])),
"user_icon" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['iconname'])),
"user_head" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['headname'])),
);
}
if($ueusedata["nsfw"] == "true"){
$nsfw = true;
}else{
$nsfw = false;
}
$item = [
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["uniqid"])),
'replyid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["rpuniqid"])),
'text' => decode_yajirushi(htmlspecialchars_decode($ueusedata["ueuse"])),
'account' => $now_userdata,
'photo1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo1"]))),
'photo2' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo2"]))),
'photo3' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo3"]))),
'photo4' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo4"]))),
'video1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["video1"]))),
'favorite' => $favorite,
'favorite_cnt' => decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite_cnt"])),
'datetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["datetime"])),
'abi' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abi"])),
'abidatetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abidate"])),
'nsfw' => $nsfw,
];
$response[] = $item; // ループ内で $response にデータを追加
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "ueuse_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+197
View File
@@ -0,0 +1,197 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['uniqid']))){
$ueuseid = $_GET['uniqid'];
}elseif(!(empty($post_json["uniqid"]))){
$ueuseid = $post_json["uniqid"];
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['limit']))){
$limit = (int)$_GET['limit'];
}elseif(!(empty($post_json["limit"]))){
$limit = (int)$post_json["limit"];
}else{
$limit = 25;
}
if($limit > 100){
$limit = 100;
}
if(!(empty($_GET['page']))){
$page = (int)$_GET['page'];
}elseif(!(empty($post_json["page"]))){
$page = (int)$post_json["page"];
}else{
$page = 1;
}
$offset = ($page - 1) * $limit;
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$sql = "SELECT * FROM ueuse WHERE uniqid = :ueuseid OR rpuniqid = :ueuseid ORDER BY datetime ASC LIMIT :offset, :itemsPerPage";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':ueuseid', $ueuseid, PDO::PARAM_STR);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':itemsPerPage', $limit, PDO::PARAM_INT);
$stmt->execute();
$message_array = $stmt;
while ($row = $message_array->fetchAll(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
if (!empty($messages)) {
$response = array(); // ループ外で $response を初期化
foreach ($messages as $ueusedata) {
if(!(empty($ueusedata["favorite"]))){
$favorite = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite"])));
array_shift($favorite);
}else{
$favorite = array();
}
$favcnts = explode(',', $ueusedata["favorite"]);
$ueusedata["favorite_cnt"] = count($favcnts) - 1;
$userQuery = $pdo->prepare("SELECT username, userid, iconname, headname, role FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $ueusedata["account"]);
$userQuery->execute();
$userData = $userQuery->fetch();
if ($userData) {
$now_userdata = array(
"username" => decode_yajirushi(htmlspecialchars_decode($userData['username'])),
"userid" => decode_yajirushi(htmlspecialchars_decode($userData['userid'])),
"user_icon" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['iconname'])),
"user_head" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['headname'])),
);
}
if($ueusedata["nsfw"] == "true"){
$nsfw = true;
}else{
$nsfw = false;
}
$item = [
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["uniqid"])),
'replyid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["rpuniqid"])),
'text' => decode_yajirushi(htmlspecialchars_decode($ueusedata["ueuse"])),
'account' => $now_userdata,
'photo1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo1"]))),
'photo2' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo2"]))),
'photo3' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo3"]))),
'photo4' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo4"]))),
'video1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["video1"]))),
'favorite' => $favorite,
'favorite_cnt' => decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite_cnt"])),
'datetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["datetime"])),
'abi' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abi"])),
'abidatetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abidate"])),
'nsfw' => $nsfw,
];
$response[] = $item; // ループ内で $response にデータを追加
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "ueuse_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+200
View File
@@ -0,0 +1,200 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['keyword']))){
$keyword = $_GET['keyword'];
}elseif(!(empty($post_json["keyword"]))){
$keyword = $post_json["keyword"];
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['limit']))){
$limit = (int)$_GET['limit'];
}elseif(!(empty($post_json["limit"]))){
$limit = (int)$post_json["limit"];
}else{
$limit = 25;
}
if($limit > 100){
$limit = 100;
}
if(!(empty($_GET['page']))){
$page = (int)$_GET['page'];
}elseif(!(empty($post_json["page"]))){
$page = (int)$post_json["page"];
}else{
$page = 1;
}
$offset = ($page - 1) * $limit;
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$Userid = $userData["userid"];
$sql = "SELECT * FROM ueuse WHERE ueuse LIKE :keyword OR abi LIKE :keyword ORDER BY datetime DESC LIMIT :offset, :itemsPerPage";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':itemsPerPage', $limit, PDO::PARAM_INT);
$stmt->bindValue(':keyword', '%' . $keyword . '%', PDO::PARAM_STR);
$stmt->execute();
$message_array = $stmt;
while ($row = $message_array->fetch(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
if (!empty($messages)) {
$response = array(); // ループ外で $response を初期化
foreach ($messages as $ueusedata) {
if(!(empty($ueusedata["favorite"]))){
$favorite = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite"])));
array_shift($favorite);
}else{
$favorite = array();
}
$favcnts = explode(',', $ueusedata["favorite"]);
$ueusedata["favorite_cnt"] = count($favcnts) - 1;
$userQuery = $pdo->prepare("SELECT username, userid, iconname, headname, role FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $ueusedata["account"]);
$userQuery->execute();
$userData = $userQuery->fetch();
if ($userData) {
$now_userdata = array(
"username" => decode_yajirushi(htmlspecialchars_decode($userData['username'])),
"userid" => decode_yajirushi(htmlspecialchars_decode($userData['userid'])),
"user_icon" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['iconname'])),
"user_head" => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userData['headname'])),
);
}
if($ueusedata["nsfw"] == "true"){
$nsfw = true;
}else{
$nsfw = false;
}
$item = [
'uniqid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["uniqid"])),
'replyid' => decode_yajirushi(htmlspecialchars_decode($ueusedata["rpuniqid"])),
'text' => decode_yajirushi(htmlspecialchars_decode($ueusedata["ueuse"])),
'account' => $now_userdata,
'photo1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo1"]))),
'photo2' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo2"]))),
'photo3' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo3"]))),
'photo4' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["photo4"]))),
'video1' => decode_yajirushi(htmlspecialchars_decode(str_replace('../', 'https://' . $_SERVER['HTTP_HOST'] . '/', $ueusedata["video1"]))),
'favorite' => $favorite,
'favorite_cnt' => decode_yajirushi(htmlspecialchars_decode($ueusedata["favorite_cnt"])),
'datetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["datetime"])),
'abi' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abi"])),
'abidatetime' => decode_yajirushi(htmlspecialchars_decode($ueusedata["abidate"])),
'nsfw' => $nsfw,
];
$response[] = $item; // ループ内で $response にデータを追加
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
$err = "ueuse_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+151
View File
@@ -0,0 +1,151 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
//関数呼び出し
//- Base64_mime
require('../../function/function.php');
//投稿及び返信レート制限↓(分):デフォで60件/分まで
$max_ueuse_rate_limit = 60;
$mojisizefile = "../../server/textsize.txt";
$banurldomainfile = "../../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role, follow, follower FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
//本文取得
if(!(empty($_GET['userid']))){
$follow_userid = safetext($_GET['userid']);
}elseif(!(empty($post_json["userid"]))){
$follow_userid = safetext($post_json["userid"]);
}
if(!(empty($follow_userid))){
$DataQuery = $pdo->prepare("SELECT username,userid,follow,follower FROM account WHERE userid = :userid");
$DataQuery->bindValue(':userid', $follow_userid);
$DataQuery->execute();
$Follow_userdata = $DataQuery->fetch();
$userid = $userData["userid"];
if(!(empty($Follow_userdata))){
if(!($userid == $Follow_userdata['userid'])){
$res = follow_user($pdo, $Follow_userdata['userid'], $userid);
if($res === true){
//フォロー完了
$response = array(
'userid' => decode_yajirushi(htmlspecialchars_decode($Follow_userdata["userid"])),
'success' => true
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}else{
$err = "could_not_complete";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "you_cant_it_to_yourself";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "critical_error_userdata_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+205
View File
@@ -0,0 +1,205 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
require("../../function/function.php");
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
if(!(empty($_GET['userid']))){
$userid = $_GET['userid'];
}elseif(!(empty($post_json["userid"]))){
$userid = $post_json["userid"];
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
$DataQuery = $pdo->prepare("SELECT username,userid,profile,datetime,follow,follower,iconname,headname,role,sacinfo,admin FROM account WHERE userid = :userid");
$DataQuery->bindValue(':userid', $userid);
$DataQuery->execute();
$userdata = $DataQuery->fetch();
if (empty($userdata)){
$response = array(
'error_code' => "critical_error_userdata_not_found",
);
}else{
$roles = explode(',', $userdata["role"]);
if(!(empty($roles))){
foreach ($roles as $roleId) {
$Getrole = $pdo->prepare("SELECT roleidname, rolename, roleauth, rolecolor, roleeffect FROM role WHERE roleidname = :role");
$Getrole->bindValue(':role', $roleId);
$Getrole->execute();
$roleData[$roleId] = $Getrole->fetch();
if($roleData[$roleId]['roleeffect'] == '' || $roleData[$roleId]['roleeffect'] == 'none'){
$role_view_effect = "none";
}elseif($roleData[$roleId]['roleeffect'] == 'shine'){
$role_view_effect = "shine";
}elseif($roleData[$roleId]['roleeffect'] == 'rainbow'){
$role_view_effect = "rainbow";
}else{
$role_view_effect = "none";
}
$roleinfo = array(
"name" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['rolename'])),
"color" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['rolecolor'])),
"effect" => decode_yajirushi(htmlspecialchars_decode($role_view_effect)),
"id" => decode_yajirushi(htmlspecialchars_decode($roleData[$roleId]['roleidname'])),
);
$role[] = $roleinfo;
}
}else{
$role[] = "";
}
if(!(empty($userdata["sacinfo"]))){
if($userdata["sacinfo"] == "bot"){
$isBot = true;
}else{
$isBot = false;
}
}else{
$isBot = false;
}
if(!(empty($userdata["admin"]))){
if($userdata["admin"] == "yes"){
$isAdmin = true;
}else{
$isAdmin = false;
}
}else{
$isAdmin = false;
}
if(!(empty($userdata["follow"]))){
$followee = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($userdata["follow"])));
array_shift($followee);
}else{
$followee = array();
}
if(!(empty($userdata["follower"]))){
$follower = preg_split("/,/", decode_yajirushi(htmlspecialchars_decode($userdata["follower"])));
array_shift($follower);
}else{
$follower = array();
}
$followcnts = explode(',', $userdata["follow"]);
$userdata["follow_cnt"] = (int)count($followcnts)-1;
$followercnts = explode(',', $userdata["follower"]);
$userdata["follower_cnt"] = (int)count($followercnts)-1;
$allueuse = $pdo->prepare("SELECT account FROM ueuse WHERE account = :userid");
$allueuse->bindValue(':userid', $userdata["userid"]);
$allueuse->execute();
$All_ueuse = $allueuse->rowCount();
$response = array(
'username' => decode_yajirushi(htmlspecialchars_decode($userdata["username"])),
'userid' => decode_yajirushi(htmlspecialchars_decode($userdata["userid"])),
'profile' => decode_yajirushi(htmlspecialchars_decode($userdata["profile"])),
'user_icon' => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userdata["iconname"])),
'user_header' => decode_yajirushi(htmlspecialchars_decode("https://".$domain."/".$userdata["headname"])),
'registered_date' => decode_yajirushi(htmlspecialchars_decode($userdata["datetime"])),
'followee' => $followee,
'followee_cnt' => $userdata["follow_cnt"],
'follower' => $follower,
'follower_cnt' => $userdata["follower_cnt"],
'ueuse_cnt' => $All_ueuse,
'isBot' => $isBot,
'isAdmin' => $isAdmin,
'role' => $role,
'language' => "ja-JP",
);
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
?>
+157
View File
@@ -0,0 +1,157 @@
<?php
$domain = $_SERVER['HTTP_HOST'];
require('../../db.php');
//関数呼び出し
//- Base64_mime
require('../../function/function.php');
//投稿及び返信レート制限↓(分):デフォで60件/分まで
$max_ueuse_rate_limit = 60;
$mojisizefile = "../../server/textsize.txt";
$banurldomainfile = "../../server/banurldomain.txt";
$banurl_info = file_get_contents($banurldomainfile);
$banurl = preg_split("/\r\n|\n|\r/", $banurl_info);
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$pdo = null;
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();
}
$Get_Post_Json = file_get_contents("php://input");
if(isset($_GET['token']) || (!(empty($Get_Post_Json)))) {
//トークン取得
if(!(empty($_GET['token']))){
$token = safetext($_GET['token']);
}else{
$post_json = json_decode($Get_Post_Json, true);
if(isset($post_json["token"])){
$token = safetext($post_json["token"]);
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
if($token == ""){
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
session_start();
if( !empty($pdo) ) {
$userQuery = $pdo->prepare("SELECT username, userid, role, follow, follower FROM account WHERE token = :token");
$userQuery->bindValue(':token', $token);
$userQuery->execute();
$userData = $userQuery->fetch();
if(empty($userData["userid"])){
$err = "token_invalid";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}elseif($userData["role"] === "ice"){
$err = "this_account_has_been_frozen";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}else{
//本文取得
if(!(empty($_GET['userid']))){
$unfollow_userid = safetext($_GET['userid']);
}elseif(!(empty($post_json["userid"]))){
$unfollow_userid = safetext($post_json["userid"]);
}
if(!(empty($unfollow_userid))){
$DataQuery = $pdo->prepare("SELECT username,userid,follow,follower FROM account WHERE userid = :userid");
$DataQuery->bindValue(':userid', $unfollow_userid);
$DataQuery->execute();
$Follow_userdata = $DataQuery->fetch();
$userid = $userData["userid"];
$myfollowlist = $userData["follow"];
if(!(empty($Follow_userdata))){
if(!($userid == $Follow_userdata['userid'])){
$res = follow_user($pdo, $Follow_userdata['userid'], $userid);
if($res === true){
//フォロー完了
$response = array(
'userid' => decode_yajirushi(htmlspecialchars_decode($Follow_userdata["userid"])),
'success' => true
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}else{
$err = "could_not_complete";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
}
}else{
$err = "you_cant_it_to_yourself";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}else{
$err = "critical_error_userdata_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
}
}
}else{
$err = "input_not_found";
$response = array(
'error_code' => $err,
);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
?>
+5
View File
@@ -0,0 +1,5 @@
<?php
$url = "instance";
header("Location:".$url."");
exit;
?>
+58
View File
@@ -0,0 +1,58 @@
<?php
require("../../function/function.php");
$serversettings_file = "../../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
if(safetext($serversettings["serverinfo"]["server_activitypub"]) === "true"){
header("Content-Type: application/json");
header("charset=utf-8");
header("Access-Control-Allow-Origin: *");
$mojisizefile = "../../server/textsize.txt";
$adminfile = safetext($serversettings["serverinfo"]["server_admin"]);
$servernamefile = safetext($serversettings["serverinfo"]["server_name"]);
$serverinfofile = '../../server/info.txt';
$serverinfo = safetext(file_get_contents($serverinfofile));
$contactfile = safetext($serversettings["serverinfo"]["server_admin_mailadds"]);
$domain = $_SERVER['HTTP_HOST'];
$softwarefile = "../../server/uwuzuinfo.txt";
$softwaredata = safetext(file_get_contents($softwarefile));
$onlyuser = safetext($serversettings["serverinfo"]["server_invitation"]);
$server_head = safetext($serversettings["serverinfo"]["server_head"]);
$softwaredata = explode( "\n", $softwaredata );
$cnt = count( $softwaredata );
for( $i=0;$i<$cnt;$i++ ){
$uwuzuinfo[$i] = ($softwaredata[$i]);
}
if($onlyuser === "true"){
$openregit = false;
}elseif($onlyuser === "false"){
$openregit = true;
}else{
$openregit = false;
}
$item = array(
"uri" => $domain,
"email" => $contactfile,
"title" => "uwuzu",
"version" =>str_replace("\r", '', $uwuzuinfo[1]),
"thumbnail" => $server_head,
"description" => $serverinfo,
);
echo json_encode($item, JSON_UNESCAPED_UNICODE);
}else{
header("HTTP/1.1 410 Gone");
}
?>
+252
View File
@@ -0,0 +1,252 @@
<?php
/**
* PHP Class for handling Google Authenticator 2-factor authentication.
*
* @author Michael Kliewe
* @copyright 2012 Michael Kliewe
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
*
* @link http://www.phpgangsta.de/
*/
class PHPGangsta_GoogleAuthenticator
{
protected $_codeLength = 6;
/**
* Create new secret.
* 16 characters, randomly chosen from the allowed base32 characters.
*
* @param int $secretLength
*
* @return string
*/
public function createSecret($secretLength = 16)
{
$validChars = $this->_getBase32LookupTable();
// Valid secret lengths are 80 to 640 bits
if ($secretLength < 16 || $secretLength > 128) {
throw new Exception('Bad secret length');
}
$secret = '';
$rnd = false;
if (function_exists('random_bytes')) {
$rnd = random_bytes($secretLength);
} elseif (function_exists('mcrypt_create_iv')) {
$rnd = mcrypt_create_iv($secretLength, MCRYPT_DEV_URANDOM);
} elseif (function_exists('openssl_random_pseudo_bytes')) {
$rnd = openssl_random_pseudo_bytes($secretLength, $cryptoStrong);
if (!$cryptoStrong) {
$rnd = false;
}
}
if ($rnd !== false) {
for ($i = 0; $i < $secretLength; ++$i) {
$secret .= $validChars[ord($rnd[$i]) & 31];
}
} else {
throw new Exception('No source of secure random');
}
return $secret;
}
/**
* Calculate the code, with given secret and point in time.
*
* @param string $secret
* @param int|null $timeSlice
*
* @return string
*/
public function getCode($secret, $timeSlice = null)
{
if ($timeSlice === null) {
$timeSlice = floor(time() / 30);
}
$secretkey = $this->_base32Decode($secret);
// Pack time into binary string
$time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice);
// Hash it with users secret key
$hm = hash_hmac('SHA1', $time, $secretkey, true);
// Use last nipple of result as index/offset
$offset = ord(substr($hm, -1)) & 0x0F;
// grab 4 bytes of the result
$hashpart = substr($hm, $offset, 4);
// Unpak binary value
$value = unpack('N', $hashpart);
$value = $value[1];
// Only 32 bits
$value = $value & 0x7FFFFFFF;
$modulo = pow(10, $this->_codeLength);
return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT);
}
/**
* Get QR-Code URL for image, from google charts.
*
* @param string $name
* @param string $secret
* @param string $title
* @param array $params
*
* @return string
*/
public function getQRCodeUrl($name, $secret, $title = null, $params = array())
{
$width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;
$height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;
$level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';
$urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'');
if (isset($title)) {
$urlencoded .= urlencode('&issuer='.urlencode($title));
}
return "$urlencoded";
}
/**
* Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now.
*
* @param string $secret
* @param string $code
* @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after)
* @param int|null $currentTimeSlice time slice if we want use other that time()
*
* @return bool
*/
public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)
{
if ($currentTimeSlice === null) {
$currentTimeSlice = floor(time() / 30);
}
if (strlen($code) != 6) {
return false;
}
for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
$calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
if ($this->timingSafeEquals($calculatedCode, $code)) {
return true;
}
}
return false;
}
/**
* Set the code length, should be >=6.
*
* @param int $length
*
* @return PHPGangsta_GoogleAuthenticator
*/
public function setCodeLength($length)
{
$this->_codeLength = $length;
return $this;
}
/**
* Helper class to decode base32.
*
* @param $secret
*
* @return bool|string
*/
protected function _base32Decode($secret)
{
if (empty($secret)) {
return '';
}
$base32chars = $this->_getBase32LookupTable();
$base32charsFlipped = array_flip($base32chars);
$paddingCharCount = substr_count($secret, $base32chars[32]);
$allowedValues = array(6, 4, 3, 1, 0);
if (!in_array($paddingCharCount, $allowedValues)) {
return false;
}
for ($i = 0; $i < 4; ++$i) {
if ($paddingCharCount == $allowedValues[$i] &&
substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) {
return false;
}
}
$secret = str_replace('=', '', $secret);
$secret = str_split($secret);
$binaryString = '';
for ($i = 0; $i < count($secret); $i = $i + 8) {
$x = '';
if (!in_array($secret[$i], $base32chars)) {
return false;
}
for ($j = 0; $j < 8; ++$j) {
$x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
}
$eightBits = str_split($x, 8);
for ($z = 0; $z < count($eightBits); ++$z) {
$binaryString .= (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
}
}
return $binaryString;
}
/**
* Get array with all 32 characters for decoding from/encoding to base32.
*
* @return array
*/
protected function _getBase32LookupTable()
{
return array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
'=', // padding char
);
}
/**
* A timing safe equals comparison
* more info here: http://blog.ircmaxell.com/2014/11/its-all-about-time.html.
*
* @param string $safeString The internal (safe) value to be checked
* @param string $userString The user submitted (unsafe) value
*
* @return bool True if the two strings are identical
*/
private function timingSafeEquals($safeString, $userString)
{
if (function_exists('hash_equals')) {
return hash_equals($safeString, $userString);
}
$safeLen = strlen($safeString);
$userLen = strlen($userString);
if ($userLen != $safeLen) {
return false;
}
$result = 0;
for ($i = 0; $i < $userLen; ++$i) {
$result |= (ord($safeString[$i]) ^ ord($userString[$i]));
}
// They are only identical strings if $result is exactly 0...
return $result === 0;
}
}
+11
View File
@@ -0,0 +1,11 @@
Copyright (c) 2012, Michael Kliewe All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1.Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
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.
なお、このフォルダにあるコードは改変させていただいでおります。
+212
View File
@@ -0,0 +1,212 @@
<?php
require('db.php');
require("function/function.php");
$serversettings_file = "server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
$userid = $_SESSION['userid'];
// データベースに接続
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(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true && isset($_COOKIE['loginid']) && isset($_SESSION['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_SESSION['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_SESSION['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true && isset($_COOKIE['loginid']) && isset($_COOKIE['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_COOKIE['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_COOKIE['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
}
if( !empty($_POST['btn_submit']) ) {
$_SESSION['userid'] = $userid;
// リダイレクト先のURLへ転送する
$url = 'addauthcode.php';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}
if( !empty($_POST['skip_submit']) ) {
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, '/');
}
}
$userid = "";
// リダイレクト先のURLへ転送する
$url = 'success.php';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="js/jquery-min.js"></script>
<script src="js/unsupported.js"></script>
<link rel="apple-touch-icon" type="image/png" href="favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>アカウント登録 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="js/back.js"></script>
<body>
<div class="leftbox2">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="index.php"><img src="img/uwuzulogo.svg"></a>
</div>
<?php }?>
<div class="textbox">
<h1>二段階認証</h1>
<p>二段階認証を設定しますか?</p>
<p>二段階認証を設定することによりログイン時の一時キーが必要となりセキュリティを強化することが出来ます。<br>設定にはGoogleAuthenticatorなどの二段階認証アプリが必要です。</p>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p> <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form class="formarea" enctype="multipart/form-data" method="post">
<input type="submit" class = "irobutton" name="btn_submit" value="登録">
<input type="submit" class = "sirobutton" name="skip_submit" value="スキップ">
</form>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
window.addEventListener('DOMContentLoaded', function(){
// ファイルが選択されたら実行
document.getElementById("file_upload").addEventListener('change', function(e){
var file_reader = new FileReader();
// ファイルの読み込みを行ったら実行
file_reader.addEventListener('load', function(e) {
console.log(e.target.result);
const element = document.querySelector('#wrap');
const createElement = '<p>画像を選択しました。</p>';
element.insertAdjacentHTML('afterend', createElement);
});
file_reader.readAsText(e.target.files[0]);
});
});
</script>
</body>
</html>
+428
View File
@@ -0,0 +1,428 @@
<?php
$serversettings_file = "server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require('db.php');
//関数呼び出し
//- ユーザーエージェントからdevice名とるやつ
require('function/function.php');
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
$row["loginid"] = "";
$row["authcode"] = "";
$ruserid = "";
$rpassword = "";
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
session_regenerate_id(true);
$userid = $_SESSION['userid'];
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(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true && isset($_COOKIE['loginid']) && isset($_SESSION['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_SESSION['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_SESSION['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true && isset($_COOKIE['loginid']) && isset($_COOKIE['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_COOKIE['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_COOKIE['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
}
if( !empty($_POST['btn_submit']) ) {
$useragent = safetext($_SERVER['HTTP_USER_AGENT']);
$device = UserAgent_to_Device($useragent);
$userbackupcode = $_POST['userbackupcode'];
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $options);
require_once 'authcode/GoogleAuthenticator.php';
$result = $dbh->prepare("SELECT * FROM account WHERE userid = :userid");
$result->bindValue(':userid', $userid);
// SQL実行
$result->execute();
if(!(empty($userbackupcode))){
$row = $result->fetch();
$backuplogin = false;
if(mb_strlen($row["backupcode"]) === 32 && mb_strlen($userbackupcode) === 32){
if($row["backupcode"] === $userbackupcode){
$backuplogin = true;
}else{
$backuplogin = false;
}
}else{
$backuplogin = false;
}
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();
}
clearstatcache();
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('userid', $userid,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $row["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $row["username"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['loginid'] = $row["loginid"];
$_SESSION['username'] = $row["username"];
$_SESSION['password'] = "";
// リダイレクト先のURLへ転送する
$url = '/home';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}else{
$error_message[] = "そのバックアップコードは使用できません。(BACKUPCODE_DAME)";
}
}else{
if($result->rowCount() > 0) {
$row = $result->fetch();
if(!(empty($row["encryption_ivkey"])) && (!(mb_strlen($row["authcode"]) === 16))){
$tousercode = DecryptionUseEncrKey($row["authcode"], GenUserEnckey($row["datetime"]), $row["encryption_ivkey"]);
}else{
$tousercode = $row["authcode"];
}
$chkauthcode = new PHPGangsta_GoogleAuthenticator();
$userauthcode = $_POST['usercode'];
if(empty($userauthcode)){
$error_message[] = "コードを入力してください。(AUTHCODE_INPUT_PLEASE)";
}else{
$discrepancy = 2;
$checkResult = $chkauthcode->verifyCode($tousercode, $userauthcode, $discrepancy);
if ($checkResult) {
$pdo->beginTransaction();
try {
$touserid = $userid;
$datetime = date("Y-m-d H:i:s");
$msg = "アカウントにログインがありました。\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();
}
clearstatcache();
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('userid', $userid,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $row["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $row["username"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['loginid'] = $row["loginid"];
$_SESSION['username'] = $row["username"];
$_SESSION['password'] = null;
// リダイレクト先のURLへ転送する
$url = '/home';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}else {
$error_message[] = '二段階認証が出来ませんでした。再度お試しください。(AUTHCODE_CHECK_DAME)';
}
}
}else{
$error_message[] = 'データの取得が出来ませんでした。再度お試しください。(AUTHCODE_GET_ACCOUNT_NOT_FOUND)';
}
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="js/jquery-min.js"></script>
<script src="js/unsupported.js"></script>
<link rel="apple-touch-icon" type="image/png" href="favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="favicon/icon-192x192.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>ログイン - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="js/back.js"></script>
<body>
<div class="leftbox">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="index.php"><img src="img/uwuzulogo.svg"></a>
</div>
<?php }?>
<div class="textbox">
<h1>二段階認証</h1>
<p>二段階認証コードを入力してください。</p>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p> <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form class="formarea" enctype="multipart/form-data" method="post">
<div>
<p>二段階認証コード</p>
<div class="p2">6桁のコードを入力してください。</div>
<input id="profile" type="number" placeholder="123456" class="inbox" name="usercode" value="">
</div>
<div>
<p>バックアップコード</p>
<div class="p2">もし二段階認証が出来ない場合は32桁英数字のバックアップコードを入力してください。</div>
<input id="profile" type="text" placeholder="通常は入力しなくて大丈夫です。" class="inbox" name="userbackupcode" value="">
</div>
<input type="submit" class = "irobutton" name="btn_submit" value="次へ">
</form>
<div class="btnbox">
<a href="index.php" class="sirobutton">戻る</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
</script>
</body>
</html>
+86
View File
@@ -0,0 +1,86 @@
<?php
require('../db.php');
require("../function/function.php");
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id']))) {
$postUniqid = safetext($_POST['uniqid']);
$userId = safetext($_POST['userid']);
$loginid = safetext($_POST['account_id']);
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();
}
// データベース接続の設定
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASS, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
));
$query = $dbh->prepare('SELECT * FROM account WHERE userid = :userid limit 1');
$query->execute(array(':userid' => $userId));
$result2 = $query->fetch();
if($result2["loginid"] === $loginid){
try {
$pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS);
// Bookmark情報を取得
$stmt = $pdo->prepare("SELECT bookmark FROM account WHERE userid = :userid");
$stmt->bindValue(':userid', $userId, PDO::PARAM_STR);
$stmt->execute();
$post = $stmt->fetch(PDO::FETCH_ASSOC);
if ($post) {
$bookmarkList = explode(',', $post['bookmark']);
$index = array_search($postUniqid, $bookmarkList);
if ($index === false) {
// ユーザーIDを追加
$bookmarkList[] = $postUniqid;
} else {
// ユーザーIDを削除
array_splice($bookmarkList, $index, 1);
}
// 新しいいいね情報を更新
$newbookmark = implode(',', $bookmarkList);
$updateQuery = $pdo->prepare("UPDATE account SET bookmark = :bookmark WHERE userid = :userid");
$updateQuery->bindValue(':bookmark', $newbookmark, PDO::PARAM_STR);
$updateQuery->bindValue(':userid', $userId, PDO::PARAM_STR);
$res = $updateQuery->execute();
if ($res) {
echo json_encode(['success' => true, 'newbookmark' => 'success']);
exit;
} else {
echo json_encode(['success' => false, 'error' => 'いいねの更新に失敗しました。']);
exit;
}
} else {
echo json_encode(['success' => false, 'error' => 'アカウントが見つかりません。']);
exit;
}
} catch(PDOException $e) {
echo json_encode(['success' => false, 'error' => 'データベースエラー:' . $e->getMessage()]);
exit;
}
}
} else {
echo json_encode(['success' => false, 'error' => '必要なパラメータが提供されていません。']);
exit;
}
?>
+803
View File
@@ -0,0 +1,803 @@
<?php
require("../function/function.php");
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require('../db.php');
// 変数の初期化
$datetime = array();
$user_name = null;
$message = array();
$message_data = null;
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 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=UTF8;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
} catch(PDOException $e) {
// 接続エラーのときエラー内容を取得する
$error_message[] = $e->getMessage();
}
if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] == true) {
$passQuery = $pdo->prepare("SELECT username,userid,loginid,follow,admin,role,sacinfo,blocklist FROM account WHERE userid = :userid");
$passQuery->bindValue(':userid', safetext($_SESSION['userid']));
$passQuery->execute();
$res = $passQuery->fetch();
if(empty($res["userid"])){
header("Location: ../login.php");
exit;
}elseif($_SESSION['loginid'] === $res["loginid"] && $_SESSION['userid'] == $res["userid"]){
// セッションに値をセット
$userid = safetext($res['userid']); // セッションに格納されている値をそのままセット
$username = safetext($res['username']); // セッションに格納されている値をそのままセット
$loginid = safetext($res["loginid"]);
$role = safetext($res["role"]);
$sacinfo = safetext($res["sacinfo"]);
$myblocklist = safetext($res["blocklist"]);
$myfollowlist = safetext($res["follow"]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['username'] = $username;
$_SESSION['loginid'] = $res["loginid"];
setcookie('userid', $userid, [
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $username,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $res["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
}else{
header("Location: ../login.php");
exit;
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) {
$passQuery = $pdo->prepare("SELECT username,userid,loginid,follow,admin,role,sacinfo,blocklist FROM account WHERE userid = :userid");
$passQuery->bindValue(':userid', safetext($_COOKIE['userid']));
$passQuery->execute();
$res = $passQuery->fetch();
if(empty($res["userid"])){
header("Location: ../login.php");
exit;
}elseif($_COOKIE['loginid'] === $res["loginid"] && $_COOKIE['userid'] == $res["userid"]){
// セッションに値をセット
$userid = safetext($res['userid']); // クッキーから取得した値をセット
$username = safetext($res['username']); // クッキーから取得した値をセット
$loginid = safetext($res["loginid"]);
$role = safetext($res["role"]);
$sacinfo = safetext($res["sacinfo"]);
$myblocklist = safetext($res["blocklist"]);
$myfollowlist = safetext($res["follow"]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['username'] = $username;
$_SESSION['loginid'] = $res["loginid"];
setcookie('userid', $userid,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $username,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $res["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
}else{
header("Location: ../login.php");
exit;
}
} else {
// ログインが許可されていない場合、ログインページにリダイレクト
header("Location: ../login.php");
exit;
}
if(empty($userid)){
header("Location: ../login.php");
exit;
}
if(empty($username)){
header("Location: ../login.php");
exit;
}
$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($_POST['delete_all_bookmark']) ) {
$updateQuery = $pdo->prepare("UPDATE account SET bookmark = :bookmark WHERE userid = :userid");
$updateQuery->bindValue(':bookmark', '', PDO::PARAM_STR);
$updateQuery->bindValue(':userid', $userid, PDO::PARAM_STR);
$res = $updateQuery->execute();
if ($res) {
$url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];;
header("Location:".$url."");
exit;
} else {
$error_message[] = "BOOKMARK_NOT_DELETED";
}
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<script src="../js/nsfw_event.js"></script>
<link rel="stylesheet" href="../css/home.css">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="apple-touch-icon" type="image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<title>ブックマーク - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<body>
<?php require('../require/leftbox.php');?>
<div>
<div id="new_ueuse" class="new_ueuse" style="display:none;">
<a onclick="window.location.reload(true);"><p>🍊新しいユーズがあります!</p></a>
</div>
<div id="notify" class="new_ueuse" style="display:none;">
<p>お知らせです</p>
</div>
<div id="clipboard" class="online" style="display:none;">
<p>🗒️📎 ユーズのURLをコピーしました!</p>
</div>
<div id="offline" class="offline" style="display:none;">
<p>🦖💨 インターネットへの接続が切断されました...</p>
</div>
<div id="online" class="online" style="display:none;">
<p>🌐💫 インターネットへの接続が復帰しました!!!</p>
</div>
</div>
<main class="outer">
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p> <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<div class="emojibox_flex">
<h1>ブックマーク</h1>
<div class="right_box">
<button name="del_bookmark" id="del_bookmark" class="emojibox_button" title="ブックマークの一括削除"><svg><use xlink:href="../img/sysimage/delete_1.svg#delete"></use></svg></a>
</div>
</div>
<section class="inner">
<div id="postContainer">
</div>
</section>
<div id="loading" class="loading" style="display: none;">
🤔
</div>
<div id="error" class="error" style="display: none;">
<h1>エラー</h1>
<p>サーバーの応答がなかったか不完全だったようです。<br>ネットワークの接続が正常かを確認の上再読み込みしてください。<br>(NETWORK_HUKANZEN_STOP)</p>
</div>
<!--ブックマーク全削除-->
<div id="Del_all_bookmark" class="modal">
<div class="modal-content">
<h1>ブックマークを全て削除しますか?</h1>
<p>削除後の復元はできません。</p>
<form class="btn_area" method="post" id="Del_bookmark_Form">
<input type="submit" id="Del_bookmark_Button" class="fbtn_no" name="delete_all_bookmark" value="削除">
<input type="button" id="Del_bookmark_Cancel" class="fbtn" value="キャンセル">
</form>
</div>
</div>
<!--ブックマーク全削除-->
<div id="myDelModal" class="modal">
<div class="modal-content">
<p>ユーズを削除しますか?</p>
<form class="btn_area" method="post" id="deleteForm">
<input type="button" id="deleteButton" class="fbtn_no" name="delete" value="削除">
<input type="button" id="cancelButton" class="fbtn" value="キャンセル">
</form>
</div>
</div>
<div id="myAbiModal" class="modal">
<div class="modal-content">
<h1>ユーズに追記しますか?</h1>
<p>※追記は削除出来ません。</p>
<form method="post" id="AbiForm">
<textarea id="abitexts" placeholder="なに追記する~?" name="abi"><?php if( !empty($_SESSION['abi']) ){ echo safetext( $_SESSION['abi']); } ?></textarea>
<div class="btn_area">
<input type="submit" id="AbiAddButton" class="fbtn_no" name="abi" value="追記">
<input type="button" id="AbiCancelButton" class="fbtn" value="キャンセル">
</div>
</form>
</div>
</div>
<div id="myQuoteReuseModal" class="modal">
<div class="modal-content">
<h1>引用リユーズ</h1>
<p></p>
<textarea id="reusetexts" placeholder="引用を追加" name="reuse"></textarea>
<div class="btn_area">
<input type="button" id="ReuseButton" class="fbtn_no" name="abi" value="リユーズ">
<input type="button" id="ReuseCancelButton" class="fbtn" value="キャンセル">
</div>
</div>
</div>
<div id="Big_ImageModal" class="Image_modal">
<div class="modal-content">
<img id="Big_ImageMain" href="">
</div>
</div>
<div id="ueuse_popup_back" class="ueuse_popup_back" style="display: none;">
<div id="ueuse_popup" class="ueuse_popup_menu" style="display: none;">
<button name="share" id="share" class="popbtn"><svg><use xlink:href="../img/sysimage/share_1.svg#share_1"></use></svg><span>シェア</span></button>
<button name="delete" id="delete" class="popbtn delbtn"><svg><use xlink:href="../img/sysimage/delete_1.svg#delete"></use></svg><span>削除</span></button>
</div>
<div id="reuse_popup" class="ueuse_popup_menu" style="display: none;">
<button name="normal_reuse_btn" id="normal_reuse_btn" class="popbtn"><svg><use xlink:href="../img/sysimage/reuse_1.svg#reuse_1"></use></svg><span>リユーズ</span></button>
<button name="quote_reuse_btn" id="quote_reuse_btn" class="popbtn"><svg><use xlink:href="../img/sysimage/quote_1.svg#quote_1"></use></svg><span>引用</span></button>
<button name="delete_reuse_btn" id="delete_reuse_btn" class="popbtn delbtn"><svg><use xlink:href="../img/sysimage/delete_1.svg#delete"></use></svg><span>取り消し</span></button>
</div>
</div>
</div>
</main>
<?php require('../require/rightbox.php');?>
<?php require('../require/botbox.php');?>
<?php require('../require/noscript_modal.php');?>
</body>
<script>
$(document).ready(function () {
var userid = '<?php echo $userid; ?>';
var account_id = '<?php echo $loginid; ?>';
loadPosts();
var pageNumber = 1;
var isLoading = false;
function loadPosts() {
if (isLoading) return;
isLoading = true;
$("#loading").show();
$.ajax({
url: '../nextpage/bookmark.php', // PHPファイルへのパス
method: 'GET',
data: { page: pageNumber, userid: userid, account_id: account_id },
dataType: 'html',
success: function (response) {
$('#postContainer').append(response);
pageNumber++;
isLoading = false;
$("#loading").hide();
}
});
}
$('.outer').on('scroll', function () {
var innerHeight = $('.inner').innerHeight(), //内側の要素の高さ
outerHeight = $('.outer').innerHeight(), //外側の要素の高さ
outerBottom = innerHeight - outerHeight; //内側の要素の高さ - 外側の要素の高さ
if (outerBottom <= $('.outer').scrollTop()) {
var elem = document.getElementById("noueuse");
if (elem === null) {
// 存在しない場合の処理
loadPosts();
} else {
// 存在する場合の処理
return;
}
}
});
$(document).on('click', '.favbtn, .favbtn_after', function (event) {
event.preventDefault();
var postUniqid = $(this).data('uniqid');
var likeCountElement = $(this).find('.like-count'); // いいね数を表示する要素
var isLiked = $(this).hasClass('favbtn_after'); // 現在のいいねの状態を判定
var $this = $(this); // ボタン要素を変数に格納
$.ajax({
url: '../favorite/favorite.php',
method: 'POST',
data: { uniqid: postUniqid, userid: userid, account_id: account_id }, // ここに自分のユーザーIDを指定
dataType: 'json',
success: function (response) {
if (response.success) {
// いいね成功時の処理
if (isLiked) {
$this.removeClass('favbtn_after'); // クラスを削除していいねを取り消す
$this.find('use').attr('xlink:href', '../img/sysimage/favorite_1.svg#favorite'); // 画像を元の画像に戻す
} else {
$this.addClass('favbtn_after'); // クラスを追加していいねを追加する
$this.find('use').attr('xlink:href', '../img/sysimage/favorite_2.svg#favorite'); // 画像を新しい画像に置き換える
}
var newFavoriteList = response.newFavorite.split(',');
var likeCount = newFavoriteList.length - 1;
likeCountElement.text(likeCount); // いいね数を更新
} else {
// いいね失敗時の処理
}
}.bind(this), // コールバック内でthisが適切な要素を指すようにbindする
error: function () {
// エラー時の処理
}
});
});
$(document).on('click', '.bookmark, .bookmark_after', function (event) {
event.preventDefault();
var postUniqid = $(this).data('uniqid');
var likeCountElement = $(this).find('.like-count'); // いいね数を表示する要素
var isLiked = $(this).hasClass('bookmark_after'); // 現在のいいねの状態を判定
var $this = $(this); // ボタン要素を変数に格納
$.ajax({
url: '../bookmark/bookmark.php',
method: 'POST',
data: { uniqid: postUniqid, userid: userid, account_id: account_id }, // ここに自分のユーザーIDを指定
dataType: 'json',
success: function (response) {
if (response.success) {
// いいね成功時の処理
if (isLiked) {
$this.removeClass('bookmark_after'); // クラスを削除していいねを取り消す
} else {
$this.addClass('bookmark_after'); // クラスを追加していいねを追加する
}
} else {
// いいね失敗時の処理
}
}.bind(this), // コールバック内でthisが適切な要素を指すようにbindする
error: function () {
// エラー時の処理
}
});
});
var modal = document.getElementById('myDelModal');
var deleteButton = document.getElementById('deleteButton');
var cancelButton = document.getElementById('cancelButton'); // 追加
var modalMain = $('.modal-content');
$(document).on('click', '#delete', function (event) {
modal.style.display = 'block';
modalMain.addClass("slideUp");
modalMain.removeClass("slideDown");
var uniqid = $(this).parents().attr('data-uniqid');
var postElement = $("#ueuse-"+uniqid);
deleteButton.addEventListener('click', () => {
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
modal.style.display = 'none';
}, 150);
$.ajax({
url: '../delete/delete.php',
method: 'POST',
data: { uniqid: uniqid, userid: userid, account_id: account_id },
dataType: 'json',
success: function (response) {
if (response.success) {
postElement.remove();
} else {
// 削除失敗時の処理
}
},
error: function () {
// エラー時の処理
}
});
});
cancelButton.addEventListener('click', () => { // 追加
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
modal.style.display = 'none';
}, 150);
});
});
var abimodal = document.getElementById('myAbiModal');
var AbiAddButton = document.getElementById('AbiAddButton');
var AbiCancelButton = document.getElementById('AbiCancelButton');
var modalMain = $('.modal-content');
$(document).on('click', '.addabi', function (event) {
abimodal.style.display = 'block';
modalMain.addClass("slideUp");
modalMain.removeClass("slideDown");
var uniqid2 = $(this).attr('data-uniqid2');
var postAbiElement = $(this).closest('.addabi');
AbiCancelButton.addEventListener('click', () => {
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function () {
abimodal.style.display = 'none';
}, 150);
});
$('#AbiForm').off('submit').on('submit', function (event) {
event.preventDefault();
var abitext = document.getElementById("abitexts").value;
var usernames = '<?php echo $username; ?>';
if (abitext == "") {
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function () {
abimodal.style.display = 'none';
}, 150);
} else {
$.ajax({
url: '../abi/addabi.php',
method: 'POST',
data: { uniqid: uniqid2, abitext: abitext, username: usernames, userid: userid, account_id: account_id },
dataType: 'json',
success: function (response) {
if (response.success) {
abimodal.style.display = 'none';
postAbiElement.remove();
} else {
abimodal.style.display = 'none';
postAbiElement.remove();
}
},
error: function (xhr, status, error) {
abimodal.style.display = 'none';
postAbiElement.remove();
}
});
}
});
});
//--------------------リユーズ---------------
$(document).on('click', '#quote_reuse_btn', function (event) {
var modalMain = $('.modal-content');
var reuseModal = $('#myQuoteReuseModal');
reuseModal.show();
modalMain.addClass("slideUp");
modalMain.removeClass("slideDown");
var uniqid = $(this).parents().attr('data-uniqid');
$('#ReuseCancelButton').on('click', function (event) {
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
reuseModal.hide();
}, 150);
});
$('#ReuseButton').on('click', function (event) {
event.preventDefault();
var reusetext = $("#reusetexts").val();
if(reusetext == ""){
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
reuseModal.hide();
}, 150);
}else{
$.ajax({
url: '../function/reuse.php',
method: 'POST',
data: { uniqid: uniqid, reusetext: reusetext, userid: userid, account_id: account_id},
dataType: 'json',
success: function (response) {
if (response.success) {
reuseModal.hide();
view_notify("引用リユーズしました");
} else {
reuseModal.hide();
view_notify("引用リユーズに失敗しました");
}
},
error: function (xhr, status, error) {
reuseModal.hide();
view_notify("引用リユーズに失敗しました");
}
});
}
});
});
$(document).on('click', '#normal_reuse_btn', function (event) {
event.preventDefault();
var uniqid = $(this).parents().attr('data-uniqid');
var reusetext = "";
$.ajax({
url: '../function/reuse.php',
method: 'POST',
data: { uniqid: uniqid, reusetext: reusetext, userid: userid, account_id: account_id},
dataType: 'json',
success: function (response) {
if (response.success) {
view_notify("リユーズしました");
} else {
view_notify("リユーズに失敗しました");
}
},
error: function (xhr, status, error) {
view_notify("リユーズに失敗しました");
}
});
});
$(document).on('click', '#delete_reuse_btn', function (event) {
event.preventDefault();
var uniqid = $(this).parents().attr('data-uniqid');
var reusetext = "";
var postElement = $("#ueuse-"+uniqid);
$.ajax({
url: '../delete/delete.php',
method: 'POST',
data: { uniqid: uniqid, userid: userid, account_id: account_id },
dataType: 'json',
success: function (response) {
if (response.success) {
postElement.remove();
} else {
view_notify("リユーズの取り消しに失敗しました");
}
},
error: function () {
view_notify("リユーズの取り消しに失敗しました");
}
});
});
var bookmark_modal = document.getElementById('Del_all_bookmark');
var bookmark_deleteButton = document.getElementById('Del_bookmark_Button');
var bookmark_cancelButton = document.getElementById('Del_bookmark_Cancel'); // 追加
var modalMain = $('.modal-content');
$(document).on('click', '.emojibox_button', function (event) {
bookmark_modal.style.display = 'block';
modalMain.addClass("slideUp");
modalMain.removeClass("slideDown");
bookmark_deleteButton.addEventListener('click', () => {
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
bookmark_modal.style.display = 'none';
}, 150);
});
bookmark_cancelButton.addEventListener('click', () => { // 追加
modalMain.removeClass("slideUp");
modalMain.addClass("slideDown");
window.setTimeout(function(){
bookmark_modal.style.display = 'none';
}, 150);
});
});
window.addEventListener('online', function () {
checkOnline();
});
window.addEventListener('offline', function () {
checkOnline();
});
function checkOnline() {
if (navigator.onLine) {
$("#online").show();
$("#offline").hide();
} else {
$("#online").hide();
$("#offline").show();
}
}
$(document).on('click', '#share', function (event) {
var domain = "<?php echo $domain;?>";
var share_uniqid = $(this).parents().attr('data-uniqid');
var share_userid = $(this).parents().attr('data-userid');
if (typeof navigator.share === 'undefined') {
navigator.clipboard.writeText("https://"+domain+"/!"+share_uniqid+"")
$("#clipboard").show();
window.setTimeout(function(){
$("#clipboard").hide();
}, 5000);
return;
}
var shareData = {
title: ''+share_userid+'さんのID '+share_uniqid+' のユーズ - uwuzu',
text: '',
url: "https://"+domain+"/!"+share_uniqid+"",
};
navigator.share(shareData)
.then(function () {
// シェア完了後の処理
})
.catch(function (error) {
// シェア失敗時の処理
});
});
$(document).on('click', '#reusebtn', function(event) {
$('#reuse_popup').css({
left: event.pageX - 80,
top: event.pageY
});
var reusebtncss = $(this).attr('class');
if(reusebtncss.indexOf('reuse_after') >= 0){
$("#delete_reuse_btn").show();
}else{
$("#delete_reuse_btn").hide();
}
$("#reuse_popup").attr('data-uniqid',$(this).attr('data-uniqid'));
$("#reuse_popup").attr('data-userid',$(this).attr('data-userid'));
$("#ueuse_popup_back").show();
$("#reuse_popup").show();
});
$(document).on('click', '#popup', function(event) {
$('#ueuse_popup').css({
left: event.pageX - 80,
top: event.pageY
});
$("#ueuse_popup").attr('data-uniqid',$(this).attr('data-uniqid'));
$("#ueuse_popup").attr('data-userid',$(this).attr('data-userid'));
if(!(userid == $(this).attr('data-userid'))){
$("#ueuse_popup").children("#delete").hide();
}else{
$("#ueuse_popup").children("#delete").show();
}
$("#ueuse_popup_back").show();
$("#ueuse_popup").show();
});
$(document).on('click', '#ueuse_popup_back, .popbtn', function(event) {
$('#ueuse_popup').addClass("bye");
$('#reuse_popup').addClass("bye");
setTimeout(function(){
$("#ueuse_popup_back").hide();
$('#ueuse_popup').hide();
$('#reuse_popup').hide();
$('#ueuse_popup').removeClass("bye");
$('#reuse_popup').removeClass("bye");
}, 250);
});
});
</script>
</html>
+350
View File
@@ -0,0 +1,350 @@
<?php
$serversettings_file = "server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require('db.php');
//関数呼び出し
//- ユーザーエージェントからdevice名とるやつ
require('function/function.php');
// 変数の初期化
$current_date = null;
$message_array = array();
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
$error_message = array();
$row["userid"] = array();
$row["password"] = array();
$ruserid = array();
$rpassword = array();
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 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);
$userid = $_SESSION['userid'];
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$result = $dbh->prepare("SELECT userid, username, profile, role FROM account WHERE userid = :userid");
$result->bindValue(':userid', $userid);
// SQL実行
$result->execute();
$row = $result->fetch(); // ここでデータベースから取得した値を $row に代入する
$username = $row["username"];
$role = $row["role"];
//--------------------------------------
$userQuery = $dbh->prepare("SELECT username, userid, loginid, profile, role, iconname FROM account WHERE userid = :userid");
$userQuery->bindValue(':userid', $userid);
$userQuery->execute();
$userData = $userQuery->fetch();
$roles = explode(',', $userData["role"]); // カンマで区切られたロールを配列に分割
$roleDataArray = array();
foreach ($roles as $roleId) {
$rerole = $dbh->prepare("SELECT rolename, roleauth, rolecolor, roleeffect FROM role WHERE roleidname = :role");
$rerole->bindValue(':role', $roleId);
$rerole->execute();
$roleDataArray[$roleId] = $rerole->fetch();
}
} catch(PDOException $e) {
// 接続エラーのときエラー内容を取得する
$error_message[] = $e->getMessage();
}
if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true && isset($_COOKIE['loginid']) && isset($_SESSION['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_SESSION['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_SESSION['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true && isset($_COOKIE['loginid']) && isset($_COOKIE['userid'])) {
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);
$acck = $dbh->prepare("SELECT userid, loginid FROM account WHERE userid = :userid");
$acck->bindValue(':userid', $_COOKIE['userid']);
$acck->execute();
$acck_data = $acck->fetch();
if(!empty($acck_data)){
if($_COOKIE['loginid'] === $acck_data["loginid"] && $_COOKIE['userid'] === $acck_data["userid"] ){
header("Location: home/index.php");
exit;
}
}
}
if( !empty($_POST['btn_submit']) ) {
$useragent = safetext($_SERVER['HTTP_USER_AGENT']);
$device = UserAgent_to_Device($useragent);
$pdo->beginTransaction();
try {
$touserid = $userid;
$datetime = date("Y-m-d H:i:s");
$msg = "アカウントにログインがありました。\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();
}
clearstatcache();
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('userid', $userid,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $userData["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $username,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['loginid'] = $userData["loginid"];
$_SESSION['username'] = $username;
$_SESSION['password'] = null;
// リダイレクト先のURLへ転送する
$url = '/home';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}
if( !empty($_POST['btn_submit2']) ) {
$_SESSION['admin_login'] = false;
$_SESSION['userid'] = "";
$_SESSION['username'] = "";
// リダイレクト先のURLへ転送する
$url = 'index.php';
header('Location: ' . $url, true, 303);
// すべての出力を終了
exit;
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="js/jquery-min.js"></script>
<script src="js/unsupported.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="apple-touch-icon" type="image/png" href="favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="favicon/icon-192x192.png">
<title>確認 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<script src="js/back.js"></script>
<body>
<div class="leftbox">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="index.php"><img src="img/uwuzulogo.svg"></a>
</div>
<?php }?>
<div class="textbox">
<h1>確認</h1>
<p>あなたは <?php if( !empty($row["username"]) ){ echo replaceProfileEmojiImages(safetext( $row["username"])); } ?> ですか?</p>
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p> <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<div class="myarea">
<img src="<?php echo safetext($userData['iconname']); ?>">
<p>ユーザー名</p>
<h2><?php if( !empty($row["username"]) ){ echo replaceProfileEmojiImages(safetext( $row["username"])); } ?></h2>
<div class="roleboxes">
<?php foreach ($roles as $roleId): ?>
<?php $roleData = $roleDataArray[$roleId]; ?>
<?php
if(safetext($roleData["roleeffect"]) == '' || safetext($roleData["roleeffect"]) == 'none'){
$role_view_effect = "";
}elseif(safetext($roleData["roleeffect"]) == 'shine'){
$role_view_effect = "shine";
}elseif(safetext($roleData["roleeffect"]) == 'rainbow'){
$role_view_effect = "rainbow";
}else{
$role_view_effect = "";
}
?>
<div class="rolebox <?php echo safetext($role_view_effect); ?>" style="border: 1px solid <?php echo '#' . safetext($roleData["rolecolor"]); ?>;">
<p style="color: <?php echo '#' . $roleData["rolecolor"]; ?>;">
<?php if (!empty($roleData["rolename"])) { echo safetext($roleData["rolename"]); }else{ echo("ロールが正常に設定されていません。");} ?>
</p>
</div>
<?php endforeach; ?>
</div>
<hr>
<p>プロフィール</p>
<h3><?php if( !empty($row["profile"]) ){ echo safetext( $row["profile"]); } ?></h3>
</div>
<form id ="form1" method="post" class="btnbox">
<input type="submit" name="btn_submit" class="irobutton" value="はい">
<input type="submit" name="btn_submit2" class="sirobutton" value="いいえ">
</div>
</div>
</div>
<script type="text/javascript">
function checkForm(inputElement) {
var str = inputElement.value;
while (str.match(/[^A-Za-z\d_]/)) {
str = str.replace(/[^A-Za-z\d_]/, "");
}
inputElement.value = str;
}
</script>
</body>
</html>
+29
View File
@@ -0,0 +1,29 @@
:root {
/*Maincolor*/
--main-color: #FFC832;
--sub-color: #FFFAE6;
--background-color: #F5F5F5;
--tl-color: #F7F7F7;
--ueuse-color:#f5f5f5;
--text-color: #252525;
--subtext-color: #999;
--link-color: #4e4428;
--border-color: #EEE;
/*Infocolor*/
--error: #FF4848;
--danger: #ff6a00;
--warn: #ffc400;
--good: #99cc00;
--success: #00cc4e;
/*Darkmode*/
--dark-sub-color: #181616;
--dark-background-color: #0c0c0c;
--dark-subtext-color: #CCC;
--dark-text-color: #FFF;
/*HeadingFonts*/
--Head-fonts: "Zen Maru Gothic";
/*TextFonts*/
--Text-fonts: "BIZ UDPGothic";
/*MonospacedFonts*/
--Mono-fonts: "BIZ UDGothic";
}
+17
View File
@@ -0,0 +1,17 @@
/*GoogleFontsから使用*/
@import url('https://fonts.googleapis.com/css2?family=BIZ+UDGothic:wght@400;700&family=BIZ+UDPGothic:wght@400;700&family=Zen+Maru+Gothic:wght@500&display=swap')
/*
ローカルから独自フォントを読み込む際はこれを使用
color.cssの方のフォント変数にも同じ名前を書いて
@font-face {
font-family: 'HeadingFont';
src: url(/Fonts/HeadingFont.woff);
font-family: 'TextFont';
src: url(/Fonts/TextFont.woff);
font-family: 'MonospacedFont';
src: url(/Fonts/MOnospacedtFont.woff);
}
*/
+8340
View File
File diff suppressed because it is too large Load Diff
+1323
View File
File diff suppressed because it is too large Load Diff
+121
View File
@@ -0,0 +1,121 @@
@import url("color.css");
body{
max-width: 640px;
height: auto;
margin:0px;
margin-top: 128px;
margin-left: auto;
margin-right: auto;
background-color:#f5f5f5;
display: block;
}
main{
max-width: 640px;
margin-left: auto;
margin-right: auto;
}
main .server_icon_zone{
margin:12px;
margin-left: auto;
margin-right: auto;
text-align: center;
}
main .server_icon_zone img{
width: 64px;
height: 64px;
object-fit: cover;
border-radius: 12px;
}
h1{
margin-top: 0px;
margin-bottom: 0px;
margin-left: auto;
margin-right: auto;
text-align: center;
color:#252525;
font-size: 32px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: bold;
}
h3{
line-height: 28px;
margin-top: 6px;
margin-bottom: 6px;
margin-left: 0px;
margin-right: auto;
text-align: left;
color:#252525;
font-size: 20px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: bold;
}
p{
line-height: 20px;
margin-top: 0px;
margin-bottom: 0px;
text-align: left;
color:#252525;
font-size: 16px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: normal;
}
.maintext{
margin-top: 16px;
margin-bottom: 16px;
}
.infobtn{
display: block;
width: 128px;
padding: 6px;
text-align: center;
margin-left: auto;
margin-right: auto;
display: block;
background-color:#FFC832;
color:#ffffff;
border-radius: 32px;
font-size: 20px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: normal;
text-decoration: none;
}
.center_text{
margin-top: 32px;
display: block;
}
.center_text p{
line-height: 20px;
margin-top: 6px;
margin-bottom: 6px;
text-align: center;
color:#252525;
font-size: 16px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: normal;
}
.center_text .p2{
line-height: 20px;
margin-top: 6px;
margin-bottom: 6px;
text-align: center;
color:#777;
font-size: 16px;
font-family: 'BIZ UDGothic', 'Yu Mincho Regular', 'ヒラギノ角ゴシック', sans-serif;
font-weight: normal;
}
hr{
height: 0;
margin-top: 12px;
margin-bottom: 12px;
padding: 0;
border: 0;
border-top: 1px solid #252525;
}
@media screen and (max-width:640px) {
body{
margin:24px;
margin-top: 32px;
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php // データベースの接続情報
define( 'DB_HOST', '');
define( 'DB_USER', '');
define( 'DB_PASS', '');
define( 'DB_NAME', '');
// ENC_KEYは操作しないでください。ユーザーデータを使用できなくなるおそれがあります。
define( 'ENC_KEY', '');
// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');
?>
+22
View File
@@ -0,0 +1,22 @@
<?php
require('../db.php');
require("../function/function.php");
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id']))){
$postUserid = safetext($_POST['userid']);
$postUniqid = safetext($_POST['uniqid']);
$loginid = safetext($_POST['account_id']);
$result = delete_ueuse($postUniqid, $postUserid, $loginid);
if($result[0] === true){
echo json_encode(['success' => true]);
exit;
}else{
echo json_encode(['success' => false, 'error' => '削除に失敗しました。']);
exit;
}
}else{
echo json_encode(['success' => false, 'error' => '削除に失敗しました。(sess_err)']);
exit;
}
?>
+350
View File
@@ -0,0 +1,350 @@
<?php
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
require('../db.php');
require("../function/function.php");
// 変数の初期化
$datetime = array();
$user_name = null;
$message = array();
$message_data = null;
$error_message = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;
session_name('uwuzu_s_id');
session_set_cookie_params([
'lifetime' => 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();
}
if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] == true) {
$passQuery = $pdo->prepare("SELECT username,userid,loginid,follow,admin,role,sacinfo,blocklist FROM account WHERE userid = :userid");
$passQuery->bindValue(':userid', safetext($_SESSION['userid']));
$passQuery->execute();
$res = $passQuery->fetch();
if(empty($res["userid"])){
header("Location: ../login.php");
exit;
}elseif($_SESSION['loginid'] === $res["loginid"] && $_SESSION['userid'] == $res["userid"]){
// セッションに値をセット
$userid = safetext($res['userid']); // セッションに格納されている値をそのままセット
$username = safetext($res['username']); // セッションに格納されている値をそのままセット
$loginid = safetext($res["loginid"]);
$role = safetext($res["role"]);
$sacinfo = safetext($res["sacinfo"]);
$myblocklist = safetext($res["blocklist"]);
$myfollowlist = safetext($res["follow"]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['username'] = $username;
$_SESSION['loginid'] = $res["loginid"];
setcookie('userid', $userid, [
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $username,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $res["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
}else{
header("Location: ../login.php");
exit;
}
} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) {
$passQuery = $pdo->prepare("SELECT username,userid,loginid,follow,admin,role,sacinfo,blocklist FROM account WHERE userid = :userid");
$passQuery->bindValue(':userid', safetext($_COOKIE['userid']));
$passQuery->execute();
$res = $passQuery->fetch();
if(empty($res["userid"])){
header("Location: ../login.php");
exit;
}elseif($_COOKIE['loginid'] === $res["loginid"] && $_COOKIE['userid'] == $res["userid"]){
// セッションに値をセット
$userid = safetext($res['userid']); // クッキーから取得した値をセット
$username = safetext($res['username']); // クッキーから取得した値をセット
$loginid = safetext($res["loginid"]);
$role = safetext($res["role"]);
$sacinfo = safetext($res["sacinfo"]);
$myblocklist = safetext($res["blocklist"]);
$myfollowlist = safetext($res["follow"]);
$_SESSION['admin_login'] = true;
$_SESSION['userid'] = $userid;
$_SESSION['username'] = $username;
$_SESSION['loginid'] = $res["loginid"];
setcookie('userid', $userid,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('username', $username,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('loginid', $res["loginid"],[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
setcookie('admin_login', true,[
'expires' => time() + 60 * 60 * 24 * 28,
'path' => '/',
'samesite' => 'lax',
'secure' => true,
'httponly' => true,
]);
}else{
header("Location: ../login.php");
exit;
}
} else {
// ログインが許可されていない場合、ログインページにリダイレクト
header("Location: ../login.php");
exit;
}
if(empty($userid)){
header("Location: ../login.php");
exit;
}
if(empty($username)){
header("Location: ../login.php");
exit;
}
$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'];
if (!empty($pdo)) {
$sql = "SELECT emojifile,emojiname,emojiinfo,emojidate FROM emoji ORDER BY emojidate DESC";
$message_array = $pdo->query($sql);
while ($row = $message_array->fetch(PDO::FETCH_ASSOC)) {
$messages[] = $row;
}
}
require('../logout/logout.php');
if(isset($_GET['q'])){
$keyword = safetext($_GET['q']);
}else{
$keyword = "";
}
// データベースの接続を閉じる
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="apple-touch-icon" type="image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<link rel="stylesheet" href="../css/home.css">
<title>絵文字一覧 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<body>
<?php require('../require/leftbox.php');?>
<div>
<div id="clipboard" class="online" style="display:none;">
<p>🗒️📎 コピーしました!</p>
</div>
</div>
<main class="outer">
<?php if( !empty($error_message) ): ?>
<ul class="errmsg">
<?php foreach( $error_message as $value ): ?>
<p> <?php echo $value; ?></p>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<section class="inner">
<div class="emojibox">
<h1>絵文字一覧</h1>
</div>
<div class="sendbox">
<input class="inbox" placeholder="絵文字検索" id="emoji_searchword" type="text" value="<?php if( !empty($keyword) ){ echo safetext($keyword); } ?>">
<button class="search_btn" id="search_btn">検索</button>
</div>
<div class="emojizone" id="emojizone">
</div>
</section>
<div id="loading" class="loading" style="display: none;">
🤔
</div>
<div id="error" class="error" style="display: none;">
<h1>エラー</h1>
<p>サーバーの応答がなかったか不完全だったようです。<br>ネットワークの接続が正常かを確認の上再読み込みしてください。<br>(NETWORK_HUKANZEN_STOP)</p>
</div>
</main>
<?php require('../require/rightbox.php');?>
<?php require('../require/botbox.php');?>
<?php require('../require/noscript_modal.php');?>
</body>
<script>
$(document).ready(function() {
$(document).on('click', '.search_btn', function(event) {
if ($("#emoji_searchword").val() != ''){
$('#emojizone').empty();
loadEmojis();
} else {
return;
}
});
window.document.onkeydown = function(event){
if (event.key === 'Enter') {
if ($("#emoji_searchword").val() != ''){
$('#emojizone').empty();
loadEmojis();
} else {
return;
}
}
}
$(document).on('click','.emjtex',function(){
var children = $(this).children("div").children("div").children("h3");
navigator.clipboard.writeText(children.text());
$("#clipboard").show();
window.setTimeout(function(){
$("#clipboard").hide();
}, 5000);
});
loadEmojis();
var Emoji_pageNumber = 1;
var isLoading = false;
function loadEmojis() {
if (isLoading) return;
isLoading = true;
$("#loading").show();
var userid = '<?php echo $userid; ?>';
var account_id = '<?php echo $loginid; ?>';
var search_query = $("#emoji_searchword").val();
var viewmode = 'page'
$.ajax({
url: '../nextpage/emojiview.php', // PHPファイルへのパス
method: 'GET',
data: { page: Emoji_pageNumber, userid: userid , account_id: account_id , search_query: search_query, view_mode: viewmode},
dataType: 'html',
timeout: 300000,
success: function(response) {
$('#emojizone').append(response);
Emoji_pageNumber++;
isLoading = false;
$("#loading").hide();
},
error: function (xhr, textStatus, errorThrown) { // エラーと判定された場合
isLoading = false;
$("#loading").hide();
$("#error").show();
},
});
}
$('.outer').on('scroll', function() {
var innerHeight = $('.inner').innerHeight(), //内側の要素の高さ
outerHeight = $('.outer').innerHeight(), //外側の要素の高さ
outerBottom = innerHeight - outerHeight; //内側の要素の高さ - 外側の要素の高さ
if (outerBottom <= $('.outer').scrollTop()) {
var elem = document.getElementById("noemoji");
if (elem === null){
// 存在しない場合の処理
loadEmojis();
} else {
// 存在する場合の処理
return;
}
}
});
});
</script>
</html>
+195
View File
@@ -0,0 +1,195 @@
<!DOCTYPE html>
<?php
require("../function/function.php");
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
$custom404file = "../server/404imagepath.txt";
$custom503file = "../server/503imagepath.txt";
//-------------------------------------
$domain = $_SERVER['HTTP_HOST'];
//------------------------
$error_code = (int)http_response_code();
$error_name = "200 OK";
$error_msg = "エラーはありません。";
switch ($error_code) {
case 200:
$error_name = "200 OK";
$error_msg = "エラーはありません。\n正常に表示されています。";
break;
case 400:
$error_name = "400 Bad Request";
$error_msg = "<(_ _)>\nはいっ!エラーです!!!\n原因はわかりません!!!!!!!!";
break;
case 401:
$error_name = "401 Unauthorized";
$error_msg = "...(* ̄0 ̄)ノ< アクセス権が無いようです\nサービス管理者によってアクセス権の変更をされた可能性がございます。";
break;
case 403:
$error_name = "403 Forbidden";
$error_msg = "...(* ̄0 ̄)ノ< 閲覧権限が無いようです\nサービス管理者によって閲覧権限の変更をされた可能性がございます。";
break;
case 404:
$error_name = "404 Not found";
$error_msg = "申し訳ございませんがお探しのページは見つかりませんでした!\nページの移動や削除が行われた可能性がございます。";
break;
case 413:
$error_name = "413 Payload Too Large";
$error_msg = "アップロードするファイルサイズが大きすぎる可能性があります!\nファイルを圧縮するなどして再度お試しください。";
break;
case 500:
$error_name = "500 Internal Server Error";
$error_msg = "サーバーが死にました";
break;
case 502:
$error_name = "502 Bad Gateway";
$error_msg = "通信の中継機器でエラーが発生した可能性があります!\n再度お試しください!";
break;
case 503:
$error_name = "503 Service Unavailable";
$error_msg = "(´。_。`;)< サーバーに過負荷がかかっているようです...\n時間をおいてから再度アクセスしてください!";
break;
default:
$error_name = "Other error";
$error_msg = "エラーメッセージが用意されていません。\nHTTPステータスコード: ".$error_code;
break;
}
?>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="/css/home.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="../js/console_notice.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="apple-touch-icon" type="image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<title><?php echo safetext($error_name)?> - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<body>
<div class="topbox">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="/index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="/index.php"><img src="/img/uwuzulogo.svg"></a>
</div>
<?php }?>
</div>
<div class="terms">
<div class="p3"><?php echo safetext($serversettings["serverinfo"]["server_name"]);?></div>
<div class="p2c"><?php echo $domain;?></div>
<div class="err404">
<?php
if($error_code === 404){
if(!(empty($custom404file))){
?>
<img src="<?php echo file_get_contents($custom404file);?>">
<?php
}
}elseif($error_code === 503){
if(!(empty($custom503file))){?>
<img src="<?php echo file_get_contents($custom503file);?>">
<?php
}
}
?>
<h1><?php echo safetext($error_name)?></h1>
<p><?php echo nl2br(safetext($error_msg))?></p>
<p><?php
if($error_code = 404){
if (rand(1, 100) === 1) {
echo "さがすのがんばれよ...";
}
}
?></p>
</div>
<a href="/home/" class="irobutton">ホームへ行く</a>
</div>
</body>
</html>
<?php
if($error_code === 404){
?>
<script>
const nowTime = new Date().getHours();
const $background = $("body");
if(nowTime >= 0 && nowTime < 4){
$background.addClass("night")
}
</script>
<style>
.night .terms{
padding: 12px;
background:linear-gradient(#000315, #4c5f78);
border-radius:12px;
}
.night .terms .err404 h1{
margin-top: 64px;
line-height:64px;
font-family: 'BIZ UDPGothic', sans-serif;
font-weight: bold;
font-size: 64px;
text-align: center;
color: #f5f5f5;
}
.night .terms .err404 p{
margin-top: 2px;
margin-bottom: 2px;
line-height:32px;
font-family: 'BIZ UDPGothic', sans-serif;
font-weight: normal;
font-size: 16px;
text-align: center;
color: #f5f5f5;
}
.night .terms .p2c{
margin-top: 0px;
margin-bottom: 10px;
text-align: left;
word-wrap: break-word;
line-height: 20px;
color: #CCC;
font-size: 12px;
font-family: 'BIZ UDPGothic', sans-serif;
font-weight: normal;
}
.night .terms .p3{
margin-top: 24px;
text-align: left;
word-wrap: break-word;
line-height: 24px;
color: #f5f5f5;
font-size: 22px;
font-family: 'BIZ UDPGothic', sans-serif;
font-weight: bold;
}
</style>
<?php
}
?>
+70
View File
@@ -0,0 +1,70 @@
<?php
require("../function/function.php");
$serverstopfile = "../server/serverstop.txt";
$serversettings_file = "../server/serversettings.ini";
$serversettings = parse_ini_file($serversettings_file, true);
$domain = $_SERVER['HTTP_HOST'];
if(!empty(file_get_contents($serverstopfile))){
$serverstop = safetext(file_get_contents($serverstopfile));
}else{
$serverstop = "現在原因不明の問題によりサーバーを停止しております。";
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="/css/home.css">
<script src="../js/jquery-min.js"></script>
<script src="../js/unsupported.js"></script>
<script src="/js/console_notice.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="apple-touch-icon" type="image/png" href="../favicon/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="../favicon/icon-192x192.png">
<title>サーバー停止中 - <?php echo safetext($serversettings["serverinfo"]["server_name"]);?></title>
</head>
<body>
<div class="topbox">
<?php if(!empty(safetext($serversettings["serverinfo"]["server_logo_login"]))){ ?>
<div class="logo">
<a href="/index.php"><img src=<?php echo safetext($serversettings["serverinfo"]["server_logo_login"]);?>></a>
</div>
<?php }else{?>
<div class="logo">
<a href="/index.php"><img src="/img/uwuzulogo.svg"></a>
</div>
<?php }?>
</div>
<div class="terms">
<div class="p3"><?php echo safetext($serversettings["serverinfo"]["server_name"]);?></div>
<div class="p2c"><?php echo $domain;?></div>
<div class="err404">
<h1>サーバー停止中</h1>
<p>現在サーバーが管理者によって停止されています...<br>停止の理由は以下の通りです。<br>(ADMIN_SERVER_STOP)</p>
<hr>
<p><?php
$s_stop = explode("\n", $serverstop);
foreach ($s_stop as $info) {
echo $info.'<br>';
}?></p>
</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

+43
View File
@@ -0,0 +1,43 @@
<?php
require('../db.php');
require('../function/function.php');
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id']))) {
$postUniqid = safetext($_POST['uniqid']);
$userId = safetext($_POST['userid']);
$loginid = safetext($_POST['account_id']);
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();
}
// データベース接続の設定
$query = $pdo->prepare('SELECT * FROM account WHERE userid = :userid limit 1');
$query->execute(array(':userid' => $userId));
$result2 = $query->fetch();
if($result2["loginid"] === $loginid){
$res = addFavorite($pdo, $postUniqid, $userId);
if ($res[0] === true) {
echo json_encode(['success' => true, 'newFavorite' => $res[2]]);
exit;
} else {
echo json_encode(['success' => false, 'error' => 'いいねの更新に失敗しました。']);
exit;
}
}
} else {
echo json_encode(['success' => false, 'error' => '必要なパラメータが提供されていません。']);
exit;
}
?>
File diff suppressed because it is too large Load Diff
+75
View File
@@ -0,0 +1,75 @@
<?php
header('Content-Type: application/json');
require('../db.php');
require("function.php");
if (safetext(isset($_POST['uniqid'])) && safetext(isset($_POST['reusetext'])) && safetext(isset($_POST['userid'])) && safetext(isset($_POST['account_id']))) {
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();
}
$userid = safetext($_POST['userid']);
$postUniqid = safetext($_POST['uniqid']);
$reusetext = safetext($_POST['reusetext']);
$loginid = safetext($_POST['account_id']);
$reusedate = date("Y-m-d H:i:s");
//ユーズの情報を取得
$query = $pdo->prepare('SELECT * FROM ueuse WHERE uniqid = :uniqid limit 1');
$query->execute(array(':uniqid' => $postUniqid));
$result = $query->fetch();
//ユーザーの認証情報を取得
$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")){
$nsfw_chk = "false";
$photo1 = "";
$photo2 = "";
$photo3 = "";
$photo4 = "";
$video1 = "";
$rpUniqid = "";
$AIBWM = false;
if(!(empty($result["ueuse"]))){
$ruUniqid = $postUniqid;
}else{
$ruUniqid = $result["ruuniqid"];
}
$ueuse_result = send_ueuse($userid,$rpUniqid,$ruUniqid,$reusetext,$photo1,$photo2,$photo3,$photo4,$video1,$nsfw_chk,$AIBWM);
if($ueuse_result == null){
echo json_encode(['success' => true]);
exit;
}else{
echo json_encode(['success' => false, 'error' => $ueuse_result]);
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;
}
?>
+5
View File
@@ -0,0 +1,5 @@
<?php
$url = "index";
header("Location:".$url."");
exit;
?>
+1210
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
<?php
$url = "index";
header("Location:".$url."");
exit;
?>
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+32
View File
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 135.46666 135.46667"
version="1.1"
id="svg5"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs2" />
<g
id="layer1">
<circle
id="path113"
cx="27.380554"
cy="64.918472"
r="12.001809" />
<circle
id="path113-4"
cx="67.068047"
cy="64.918472"
r="12.001809" />
<circle
id="path113-9"
cx="108.19543"
cy="64.918472"
r="12.001809" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 666 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="addabi_1" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 760" width="24"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h360v80H200v560h560v-360h80v360q0 33-23.5 56.5T760-120H200Zm120-160v-80h320v80H320Zm0-120v-80h320v80H320Zm0-120v-80h320v80H320Zm360-80v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z"/></svg>

After

Width:  |  Height:  |  Size: 371 B

+1
View File
@@ -0,0 +1 @@
<svg id="block" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q54 0 104-17.5t92-50.5L228-676q-33 42-50.5 92T160-480q0 134 93 227t227 93Zm252-124q33-42 50.5-92T800-480q0-134-93-227t-227-93q-54 0-104 17.5T284-732l448 448Z"/></svg>

After

Width:  |  Height:  |  Size: 468 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="bookmark_1" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M200-120v-640q0-33 23.5-56.5T280-840h400q33 0 56.5 23.5T760-760v640L480-240 200-120Zm80-122 200-86 200 86v-518H280v518Zm0-518h400-400Z"/></svg>

After

Width:  |  Height:  |  Size: 270 B

+1
View File
@@ -0,0 +1 @@
<svg id="delete" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg>

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="etc_1" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 760" width="24"><path d="M240-400q-33 0-56.5-23.5T160-480q0-33 23.5-56.5T240-560q33 0 56.5 23.5T320-480q0 33-23.5 56.5T240-400Zm240 0q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm240 0q-33 0-56.5-23.5T640-480q0-33 23.5-56.5T720-560q33 0 56.5 23.5T800-480q0 33-23.5 56.5T720-400Z"/></svg>

After

Width:  |  Height:  |  Size: 433 B

+1
View File
@@ -0,0 +1 @@
<svg id="eye" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m644-428-58-58q9-47-27-88t-93-32l-58-58q17-8 34.5-12t37.5-4q75 0 127.5 52.5T660-500q0 20-4 37.5T644-428Zm128 126-58-56q38-29 67.5-63.5T832-500q-50-101-143.5-160.5T480-720q-29 0-57 4t-55 12l-62-62q41-17 84-25.5t90-8.5q151 0 269 83.5T920-500q-23 59-60.5 109.5T772-302Zm20 246L624-222q-35 11-70.5 16.5T480-200q-151 0-269-83.5T40-500q21-53 53-98.5t73-81.5L56-792l56-56 736 736-56 56ZM222-624q-29 26-53 57t-41 67q50 101 143.5 160.5T480-280q20 0 39-2.5t39-5.5l-36-38q-11 3-21 4.5t-21 1.5q-75 0-127.5-52.5T300-500q0-11 1.5-21t4.5-21l-84-82Zm319 93Zm-151 75Z"/></svg>

After

Width:  |  Height:  |  Size: 665 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="favorite" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z"/></svg>

After

Width:  |  Height:  |  Size: 472 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="favorite" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>

After

Width:  |  Height:  |  Size: 303 B

+1
View File
@@ -0,0 +1 @@
<svg id="image" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M185.087-105.869q-32.507 0-55.862-23.356-23.356-23.355-23.356-55.862v-589.826q0-32.74 23.356-56.262 23.355-23.521 55.862-23.521h589.826q32.74 0 56.262 23.521 23.521 23.522 23.521 56.262v589.826q0 32.507-23.521 55.862-23.522 23.356-56.262 23.356H185.087Zm0-79.218h589.826v-589.826H185.087v589.826Zm43.565-86.826h503.696L578-481.479l-132 171-93-127-124.348 165.566Zm-43.565 86.826v-589.826 589.826Z"/></svg>

After

Width:  |  Height:  |  Size: 513 B

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="addemoji" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 371.0 447.5 C 383.82944 441.54593 393.86905 429.72958 397.6451 416.11136 C 400.949 401.54117 396.51587 385.70105 386.86746 374.41476 C 386.579 374.11032 386.2886 373.8041 386.0 373.5 C 406.36914 355.51355 425.66666 335.6184 436.4141 310.11652 C 472.46893 232.91884 451.26266 133.20938 385.79736 78.18324 C 349.13266 46.307648 297.0831 31.957466 249.643 44.585747 C 203.55522 56.24133 165.29659 91.35914 146.89279 134.77103 C 109.71139 216.31958 137.76341 323.03412 212.27237 373.70316 C 230.93095 386.78714 252.43797 395.5788 274.8371 399.6525 C 280.10446 401.5006 287.89102 399.39484 291.59396 402.79883 C 294.2143 410.30618 292.35403 419.82855 297.2116 428.3266 C 300.52463 435.95566 305.84933 442.5858 312.56195 447.5414 C 320.52515 453.02985 330.11597 455.40936 339.67468 455.91876 C 347.71176 456.03296 348.54526 465.5562 351.865 470.53592 C 361.3105 488.17908 373.40967 504.13123 386.77725 518.9609 C 405.97885 539.81934 428.0937 557.709 450.43506 575.0501 C 458.92615 581.1331 466.76913 588.13446 475.3673 594.04333 C 481.99966 598.6624 495.49533 598.8715 497.5716 586.7858 C 499.23035 577.41595 491.0201 570.9781 484.98868 566.63715 C 440.52496 534.1717 395.45056 498.421 371.0 447.5 Z M 520.0 94.0 C 531.1669 93.93184 545.62036 94.09653 554.36316 87.67961 C 563.9762 81.02523 564.0697 65.72951 554.9592 58.638306 C 544.9217 48.621136 530.3451 56.162334 519.7302 52.9261 C 517.47797 52.70246 517.55 48.69365 517.09735 47.056572 C 516.67596 36.991985 517.89124 26.723635 515.19434 16.873634 C 512.3448 2.6135693 491.2872 -2.117141 482.32776 9.268859 C 472.6814 20.08405 477.39935 38.852066 476.97113 51.549404 C 476.9929 52.696495 476.99884 53.860035 477.0 55.0 C 463.02805 55.530537 445.0038 52.62877 434.9603 60.723255 C 422.931 70.05929 426.32672 88.11173 439.01297 93.45203 C 451.07495 98.42248 464.9997 91.74666 477.27078 96.04059 C 479.56577 96.22926 479.46622 100.33398 479.90256 101.94135 C 480.59286 111.41028 478.938 121.225174 481.5111 130.5104 C 485.82056 143.71603 505.09406 147.38983 513.7914 136.57974 C 522.73676 126.49743 519.2885 108.951164 520.0 96.96597 C 520.0 95.96569 520.0 94.98607 520.0 94.0 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="addnotice" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 274.0 474.0 C 279.3236 505.0356 286.891 535.736 292.70084 566.6823 C 297.89114 589.4847 301.63583 612.58673 306.99194 635.3505 C 309.31314 651.62836 318.14743 667.38885 332.61606 675.8251 C 343.65936 682.4879 356.96793 685.3732 369.73035 683.1192 C 388.223 679.8631 404.12885 666.6151 410.7472 649.07635 C 418.3308 630.19183 410.91507 610.01 407.3527 591.3269 C 398.94672 552.5176 391.64725 513.15076 383.0 474.5 C 392.27505 472.48593 406.70358 477.8692 411.37048 464.36438 C 413.00247 452.37393 411.20737 440.0474 412.0 428.0 C 412.49933 428.0 413.00662 428.0 413.5 428.0 C 433.13092 445.5535 453.3995 462.42358 473.52737 479.3946 C 488.6251 492.43234 503.96228 505.19632 518.629 518.71313 C 529.48566 528.2615 543.9784 537.675 552.5219 547.948 C 555.8328 551.5755 560.7521 555.95544 566.23175 556.525 C 575.93335 550.0152 572.1483 536.60693 572.68097 527.8311 C 571.92737 494.41748 571.84564 461.00107 572.0 427.5856 C 572.0 374.4874 572.0 321.3556 572.0 268.27338 C 571.0019 243.5295 573.2193 218.56418 571.33636 193.89828 C 569.2223 183.75645 559.4358 180.87141 551.1564 184.19865 C 538.34625 190.17421 528.07465 200.59659 515.92834 207.7027 C 481.83893 231.52652 447.7923 255.49977 413.5 279.0 C 411.36075 276.20886 412.29276 271.2465 412.0 267.3177 C 412.05225 260.38553 413.0974 251.10056 408.26227 245.98807 C 404.0531 241.14908 397.14862 240.92867 391.2593 241.00134 C 367.6788 240.99751 344.13882 241.00203 320.56702 241.0 C 308.77808 241.0 296.9971 241.0 285.22412 241.0 C 273.98984 241.54993 259.3599 238.22151 253.14836 248.2498 C 249.68346 256.16977 251.61794 265.32175 251.0 273.64923 C 251.0 282.4352 251.0 291.22534 251.0 300.0 C 236.40894 300.0 221.79106 300.0 207.2 300.0 C 196.27289 300.42368 185.2634 299.45358 174.36716 300.36826 C 166.98051 301.33618 161.603 308.12485 162.01277 315.3784 C 161.97635 339.90967 162.0194 364.4743 162.0 389.0002 C 162.0 402.90292 162.0 416.78485 162.0 430.68488 C 162.54025 440.49463 160.99121 452.41934 163.40561 461.20746 C 167.62885 468.17117 174.54265 469.4646 181.55751 468.99988 C 204.7713 468.88315 227.98778 468.95547 251.17703 470.01627 C 254.96283 470.1435 258.21555 472.3379 261.77094 473.29504 C 265.76602 474.23413 269.9389 473.92938 274.0 474.0 Z M 625.0 263.0 C 640.6972 256.57678 654.2348 245.4263 669.44165 237.99564 C 675.9263 233.6706 683.99976 229.98827 689.7688 225.09856 C 692.36615 216.06267 690.04425 206.24043 691.0 197.0 C 675.4335 203.27818 662.1537 214.48338 647.00995 221.71178 C 640.33276 226.54012 631.33777 229.49171 626.3735 235.07031 C 624.30347 238.40012 625.2783 243.79509 625.0 248.34099 C 625.0 253.2318 625.0 258.11853 625.0 263.0 Z M 625.0 347.0 C 646.99414 347.0 669.0219 347.0 691.0 347.0 C 691.0 338.66327 691.0 330.32605 691.0 322.0 C 668.99 322.0 647.01 322.0 625.0 322.0 C 625.0 330.33456 625.0 338.67633 625.0 347.0 Z M 690.5 519.0 C 691.80524 508.46686 690.36145 497.6031 691.0 487.0 C 684.962 485.2046 679.5702 479.55917 674.6267 476.82388 C 666.7794 471.23312 658.80664 465.8029 650.9554 460.22403 C 643.69653 454.35577 633.51886 449.3921 627.6875 443.0 C 626.78827 443.0 625.8934 443.0 625.0 443.0 C 625.0 448.08786 625.0 453.17175 625.0 458.25412 C 624.8704 462.66293 624.9461 467.05988 625.5521 471.40698 C 633.91864 481.86545 648.8887 488.54388 658.0883 496.29776 C 669.1312 503.54547 679.97784 511.02957 690.5 519.0 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg version="1.1" id="bookmark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path
d="M 123.0 346.29227 C 123.0 382.72842 123.0 418.91037 123.0 455.1 C 123.0 482.308 123.0 509.508 123.0 536.7 C 121.414474 554.3934 131.56677 573.50995 149.6362 578.3502 C 163.43123 582.8523 177.79533 577.7443 189.78503 571.06866 C 223.18863 551.6027 257.80328 534.1559 291.0678 514.39197 C 300.09244 509.14188 309.3134 504.27472 318.36746 499.07666 C 322.3138 496.77518 326.33176 494.6167 330.2785 492.33252 C 334.0176 490.71252 338.19977 486.93658 342.63388 486.72327 C 374.43427 502.5596 404.6061 522.02655 436.06085 538.60986 C 447.4583 544.93524 460.70438 552.62427 471.23273 558.2778 C 490.6521 567.8273 513.7729 588.5096 539.45703 576.44885 C 547.0712 572.7499 553.4046 566.6803 557.0342 558.75934 C 561.40015 551.19476 561.4582 542.5698 561.0 534.05585 C 561.0 471.26404 561.0 408.52185 561.0 345.74603 C 561.0 309.77716 561.0 273.76663 561.0 237.79773 C 561.42267 210.96733 560.25934 184.12463 560.192 157.30394 C 562.8581 139.50899 553.9923 120.54065 537.1086 113.28929 C 523.56805 107.88681 508.6871 109.13489 494.43503 109.0 C 449.22772 109.003105 404.02924 108.78634 358.8358 109.63168 C 320.25262 110.30426 281.645 108.64432 243.07033 109.0 C 214.30174 109.899635 185.29768 108.117744 156.61505 110.7815 C 137.64922 113.55554 121.869865 131.18866 123.0 150.79042 C 123.0 215.88974 123.0 280.97073 123.0 346.29227 Z M 196.0 339.7527 C 196.0 383.39685 196.0 426.81714 196.0 470.2 C 196.05473 472.57263 196.02454 476.07217 197.60342 477.3964 C 201.42853 481.48596 206.46455 476.92856 209.60754 475.65057 C 235.75739 461.0549 261.80276 446.33188 287.86047 431.56442 C 300.65976 425.04816 312.65823 416.96768 325.6287 410.80167 C 337.88544 404.93274 352.2533 406.42548 363.71075 413.4204 C 401.48355 434.27805 438.80896 455.95877 476.55402 476.84372 C 481.19254 480.15118 488.62424 479.86826 487.97565 471.7068 C 488.03558 427.63583 487.63156 383.58713 487.5468 339.5189 C 487.4497 315.63007 487.35266 291.75113 487.25558 267.8745 C 487.18246 249.8888 487.1094 231.91107 487.03635 213.94133 C 487.1509 207.71892 487.13306 201.03413 483.5473 195.61748 C 476.92545 185.46762 467.4943 182.21231 456.57755 183.0044 C 421.68292 183.0956 386.78564 183.30772 351.90326 183.42477 C 326.35022 183.53214 300.80835 183.63947 275.25772 183.74681 C 255.94308 184.02916 236.61176 183.66385 217.30849 184.12279 C 205.11444 185.77145 195.39241 198.12938 196.0 210.18584 C 196.0 253.2982 196.0 296.38995 196.0 339.7527 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="emoji" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 371.0 447.5 C 383.82944 441.54593 393.86905 429.72958 397.6451 416.11136 C 400.949 401.54117 396.51587 385.70105 386.86746 374.41476 C 386.579 374.11032 386.2886 373.8041 386.0 373.5 C 406.36914 355.51355 425.66666 335.6184 436.4141 310.11652 C 472.46893 232.91884 451.26266 133.20938 385.79736 78.18324 C 349.13266 46.307648 297.0831 31.957466 249.643 44.585747 C 203.55522 56.24133 165.29659 91.35914 146.89279 134.77103 C 109.71139 216.31958 137.76341 323.03412 212.27237 373.70316 C 230.93095 386.78714 252.43797 395.5788 274.8371 399.6525 C 280.10446 401.5006 287.89102 399.39484 291.59396 402.79883 C 294.2143 410.30618 292.35403 419.82855 297.2116 428.3266 C 300.52463 435.95566 305.84933 442.5858 312.56195 447.5414 C 320.52515 453.02985 330.11597 455.40936 339.67468 455.91876 C 347.71176 456.03296 348.54526 465.5562 351.865 470.53592 C 361.3105 488.17908 373.40967 504.13123 386.77725 518.9609 C 405.97885 539.81934 428.0937 557.709 450.43506 575.0501 C 458.92615 581.1331 466.76913 588.13446 475.3673 594.04333 C 481.99966 598.6624 495.49533 598.8715 497.5716 586.7858 C 499.23035 577.41595 491.0201 570.9781 484.98868 566.63715 C 440.52496 534.1717 395.45056 498.421 371.0 447.5 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg version="1.1" id="info" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path
d="M 36.0 348.93124 C 35.666733 433.58746 70.79879 517.9621 130.87007 577.37006 C 190.369 638.56476 275.22858 672.52454 360.14355 672.861 C 382.86203 672.657 405.49582 670.80396 427.67548 665.7796 C 463.91885 657.6469 499.0512 644.37256 530.5302 624.3701 C 576.2831 596.58777 613.92145 557.1071 640.88025 511.0299 C 668.6416 461.72232 685.3417 405.04144 684.0 348.12607 C 684.54474 304.5324 675.09174 260.7542 658.08716 220.71588 C 645.70557 192.34683 629.5711 165.50949 609.7692 141.6742 C 595.05695 123.68262 578.2236 107.74955 559.918 93.34298 C 503.59204 47.72092 431.467 24.95519 359.56573 24.052458 C 315.9735 25.593784 272.09363 32.589466 232.12862 50.947617 C 175.48724 75.055046 126.284256 116.09455 91.86122 166.9954 C 55.366768 220.07762 36.071663 284.5189 36.0 348.93124 Z M 113.00009 348.20874 C 113.315704 412.76453 139.1106 477.39804 185.10225 522.60223 C 230.70343 568.2971 295.3347 596.6575 360.36816 595.0 C 425.63843 596.97876 490.01544 568.13074 535.87006 522.62994 C 580.32324 476.5128 608.96356 412.65598 607.0 347.6239 C 608.1291 283.56686 580.29895 219.4818 535.12994 174.62993 C 489.7207 127.12931 423.42877 101.116905 358.14804 102.0 C 294.0522 101.7383 230.83879 128.62993 185.62993 173.87007 C 138.99226 219.16255 113.90137 283.52786 113.00009 348.20874 Z M 313.04303 217.4401 C 312.10455 243.0105 335.93704 265.4914 361.33035 262.563 C 385.39908 261.06235 404.3648 238.1562 401.96353 214.43272 C 401.34726 190.51146 377.61002 171.11916 354.2519 173.2578 C 331.74484 174.72243 312.91537 194.78456 313.04303 217.4401 Z M 320.00082 409.1901 C 320.46008 428.4129 320.5255 447.3825 321.5868 466.28177 C 323.39645 487.47876 322.52676 521.2958 349.98935 531.0583 C 362.33862 535.06616 376.68625 531.153 385.14035 521.20715 C 393.3975 511.47363 395.4434 498.26254 396.82697 486.00836 C 398.53473 460.4119 399.4107 434.77563 398.9999 409.11792 C 398.23743 384.90808 398.31418 356.14084 394.17972 334.22614 C 393.0763 319.35782 384.5467 304.81546 369.90372 299.65494 C 358.91513 296.2197 345.846 298.4299 337.28964 306.30133 C 324.4499 318.18216 322.69443 337.1674 321.62225 353.52676 C 321.19495 371.50903 320.4188 392.47168 320.00082 409.1901 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="settings" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 198.0 397.84525 C 198.0 436.04596 198.0 474.0151 198.0 512.0 C 198.0 526.3983 198.0 540.8017 198.0 555.2 C 198.73798 575.705 192.11551 604.51044 213.5688 620.3053 C 229.58684 633.0387 246.55182 631.2496 264.28528 631.0 C 319.9807 631.0 375.67615 631.0 431.37158 631.0 C 448.13422 631.0 464.93048 631.0 481.67715 631.0 C 496.23233 630.67474 514.05347 632.49994 526.8036 627.4672 C 538.5172 623.2169 548.49396 614.10834 552.58044 602.20715 C 556.61066 589.2291 554.19586 575.26465 555.0 561.8955 C 554.5279 536.3919 555.79944 510.83475 554.0179 485.3805 C 552.5833 475.99072 548.0596 465.08356 541.9837 458.78387 C 528.14746 445.87015 506.7001 441.14084 489.37518 450.40735 C 474.37262 457.77695 465.11996 473.87186 466.00537 490.49777 C 465.1688 505.7997 467.0854 523.99243 465.23215 537.95654 C 464.08743 543.8188 458.6139 548.953 453.59537 551.0005 C 447.37836 552.8312 440.6476 551.502 434.28687 552.0 C 409.53375 552.0 384.8222 552.0 360.0691 552.0 C 341.66678 551.76184 323.25223 552.50006 304.893 551.21423 C 289.82697 549.97504 286.34686 532.44916 287.0 521.91656 C 287.0 480.5446 287.0 439.1806 287.0 397.82465 C 287.0 368.0426 287.0 338.26852 287.0 308.50247 C 287.0 296.71274 287.0 284.923 287.0 273.13327 C 287.76828 263.63654 284.61218 248.02048 295.39844 245.08778 C 317.22308 242.99225 339.28522 244.64516 361.16968 244.0 C 381.94617 244.0 402.71463 244.0 423.47513 244.0 C 432.74384 244.40973 443.79932 243.31848 452.21417 244.81535 C 461.87814 246.72766 465.9632 254.82634 464.7954 263.30533 C 464.40225 277.9529 460.85873 296.506 472.60284 311.3215 C 481.39163 324.0059 497.1832 330.327 512.25195 328.8571 C 526.88715 328.68027 539.6294 320.25952 547.689 308.34906 C 555.8156 296.68195 554.7611 281.53418 555.0 268.1647 C 555.0 254.00876 555.0 239.86078 555.0 225.72076 C 554.8342 213.52754 556.6138 200.38686 550.58405 189.19183 C 545.6803 179.46025 536.659 171.78233 526.3323 168.27864 C 515.90405 164.15755 504.58978 164.88199 493.6282 165.0 C 450.24634 165.0 406.86447 165.0 363.4826 165.0 C 331.08813 165.0 298.70166 165.0 266.3232 165.0 C 254.92563 165.4358 241.0983 163.92767 230.9074 166.90958 C 212.90604 171.22205 197.33629 187.92545 198.0 207.18935 C 198.0 270.68295 198.0 334.14664 198.0 397.84525 Z M 582.5 397.0 C 583.0099 397.16998 583.49506 397.3317 584.0 397.5 C 575.88416 402.84848 566.0494 409.56912 559.8399 415.9931 C 552.1457 424.32614 557.7259 439.41254 568.9185 441.01227 C 579.84845 443.1504 590.1457 431.67136 598.606 426.93112 C 606.3797 421.31586 614.2106 415.7662 622.0446 410.22403 C 628.9448 404.508 638.71454 399.64703 644.2471 393.46677 C 650.71216 386.33044 651.5557 374.47583 646.17145 366.45377 C 641.08264 359.14688 632.6515 355.19897 625.91364 349.70804 C 618.8672 344.73364 611.8489 339.71628 604.7752 334.80453 C 597.80963 329.9763 590.77026 325.26624 583.95685 320.2197 C 572.3405 309.8784 554.58997 319.1663 556.34845 333.3511 C 558.2695 346.1725 575.08405 351.63388 583.0 359.5 C 551.506 360.92593 519.5939 359.24075 488.0245 360.0 C 464.3743 360.57623 440.6865 359.29453 417.06686 360.38773 C 407.90463 360.66946 402.08414 365.59314 399.40103 373.44565 C 398.47696 379.24915 398.8393 387.41855 404.52454 392.2232 C 413.22452 399.70062 429.8293 395.88852 442.13403 397.0 C 482.84427 397.0 523.5881 397.0 564.28235 397.0 C 570.3681 397.0 576.42596 397.0 582.5 397.0 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1024 1024" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 135.10014 261.76584 C 135.88863 281.9272 143.10472 302.10645 158.23271 315.7327 C 172.61064 330.8369 193.77208 337.93262 214.2589 337.0 C 339.75922 337.0 465.30118 337.0 590.8015 337.0 C 653.5447 337.0 716.3296 337.0 779.07275 337.0 C 794.18414 336.49866 812.05054 337.75153 825.85876 336.2494 C 846.2525 332.55884 865.39734 320.66638 876.54706 302.8964 C 888.4119 284.9397 891.546 262.0605 885.84174 241.45285 C 878.5426 216.8039 858.16205 195.88255 832.9972 189.4408 C 820.6477 185.68124 807.4179 187.51292 794.75134 187.0 C 598.49036 187.0817 402.22546 186.90038 205.97005 187.0538 C 166.96121 187.98091 135.5205 223.65862 135.10014 261.76584 Z M 135.10014 511.76584 C 135.88863 531.9272 143.10472 552.10645 158.23271 565.7327 C 172.61064 580.8369 193.77208 587.9326 214.2589 587.0 C 339.7672 587.0 465.30917 587.0 590.8015 587.0 C 653.5586 587.0 716.3157 587.0 779.07275 587.0 C 794.18414 586.49866 812.05054 587.7515 825.85876 586.2494 C 846.2525 582.55884 865.39734 570.6664 876.54706 552.89636 C 888.4119 534.9397 891.546 512.0605 885.84174 491.45285 C 878.5426 466.8039 858.16205 445.88257 832.9972 439.4408 C 820.6477 435.68124 807.4179 437.51294 794.75134 437.0 C 598.49036 437.0817 402.22546 436.90036 205.97005 437.0538 C 166.96121 437.9809 135.5205 473.65863 135.10014 511.76584 Z M 135.10014 761.7658 C 135.88863 781.9272 143.10472 802.10645 158.23271 815.7327 C 172.61064 830.8369 193.77208 837.9326 214.2589 837.0 C 339.7672 837.0 465.30917 837.0 590.8015 837.0 C 653.5586 837.0 716.3157 837.0 779.07275 837.0 C 794.18414 836.49866 812.05054 837.7515 825.85876 836.2494 C 846.2525 832.55884 865.39734 820.6664 876.54706 802.89636 C 888.4119 784.9397 891.546 762.0605 885.84174 741.4528 C 878.5426 716.8039 858.16205 695.88257 832.9972 689.4408 C 820.6477 685.6812 807.4179 687.51294 794.75134 687.0 C 598.49036 687.0817 402.22546 686.9004 205.97005 687.0538 C 166.96121 687.9809 135.5205 723.6586 135.10014 761.7658 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+7
View File
@@ -0,0 +1,7 @@
<svg version="1.1" id="notice" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path
d="m 274,474 c 5.3236,31.0356 12.891,61.736 18.70084,92.6823 5.1903,22.8024 8.93499,45.90443 14.2911,68.6682 2.3212,16.27786 11.15549,32.03835 25.62412,40.4746 11.0433,6.6628 24.35187,9.5481 37.11429,7.2941 18.49265,-3.2561 34.3985,-16.5041 41.01685,-34.04285 7.5836,-18.88452 0.16787,-39.06635 -3.3945,-57.74945 C 398.94672,552.5176 391.64725,513.15076 383,474.5 c 9.27505,-2.01407 23.70358,3.3692 28.37048,-10.13562 C 413.00247,452.37393 411.20737,440.0474 412,428 c 0.49933,0 1.00662,0 1.5,0 19.63092,17.5535 39.8995,34.42358 60.02737,51.3946 15.09773,13.03774 30.43491,25.80172 45.10163,39.31853 10.85666,9.54837 25.3494,18.96187 33.8929,29.23487 3.3109,3.6275 8.2302,8.00744 13.70985,8.577 9.7016,-6.5098 5.91655,-19.91807 6.44922,-28.6939 -0.7536,-33.41362 -0.83533,-66.83003 -0.68097,-100.2455 0,-53.0982 0,-106.23 0,-159.31222 -0.9981,-24.74388 1.2193,-49.7092 -0.66364,-74.3751 -2.11406,-10.14183 -11.90056,-13.02687 -20.17996,-9.69963 -12.81015,5.97556 -23.08175,16.39794 -35.22806,23.50405 C 481.83893,231.52652 447.7923,255.49977 413.5,279 c -2.13925,-2.79114 -1.20724,-7.7535 -1.5,-11.6823 0.0523,-6.93217 1.0974,-16.21714 -3.73773,-21.32963 -4.20917,-4.83899 -11.11365,-5.0594 -17.00297,-4.98673 -23.5805,-0.004 -47.12048,6.9e-4 -70.69228,-0.001 -11.78894,0 -23.56992,0 -35.3429,0 -11.23428,0.54993 -25.86422,-2.77849 -32.07576,7.2498 -3.4649,7.91997 -1.53042,17.07195 -2.14836,25.39943 0,8.78597 0,17.57611 0,26.35077 -14.59106,0 -29.20894,0 -43.8,0 -10.92711,0.42368 -21.9366,-0.54642 -32.83284,0.36826 -7.38665,0.96792 -12.76416,7.75659 -12.35439,15.01014 -0.0364,24.53127 0.007,49.0959 -0.0128,73.6218 0,13.90272 0,27.78465 0,41.68468 0.54025,9.80975 -1.00879,21.73446 1.40561,30.52258 4.22324,6.96371 11.13704,8.25714 18.1519,7.79242 23.21379,-0.11673 46.43027,-0.0444 69.61952,1.01639 3.7858,0.12723 7.03852,2.32163 10.59391,3.27877 3.99508,0.93909 8.16796,0.63434 12.22906,0.70496 z"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+7
View File
@@ -0,0 +1,7 @@
<svg version="1.1" id="notification" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path
d="m 274.35721,544.30707 c -1.99213,13.1396 5.71057,29.96193 14.00843,39.46413 8.08116,10.03736 33.61978,20.75537 46.10998,22.09077 17.08125,1.2368 34.95503,1.17082 51.71241,-2.83839 17.60552,-4.80226 37.23117,-18.86132 44.25676,-32.90844 3.78639,-7.14273 3.87003,-21.18235 3.86863,-23.09715 44.86005,-2.94885 75.17306,-9.75629 118.38686,-23.08429 9.1901,-2.7217 21.4307,-8.27257 22.02864,-20.65724 -1.42414,-16.23569 -7.01314,-31.92594 -10.16528,-47.85788 -4.52356,-15.54788 -8.06921,-31.345 -12.66386,-46.86661 -14.11416,-52.97385 -27.66807,-99.49099 -39.37835,-153.04762 -1.36765,-6.789 -4.27166,-16.28731 -5.86281,-23.01283 -0.95121,-5.83649 -2.48637,-11.43039 -3.15461,-17.31392 -2.13207,-12.2982 -9.15386,-23.43337 -16.79113,-30.58698 -20.61843,-21.62895 -43.29722,-37.41342 -71.85334,-46.13292 -54.99256,-17.81 -117.8331,-5.47943 -162.61542,30.7388 -10.82613,8.50772 -17.88394,14.64398 -26.36128,25.48342 -6.30756,7.91113 -10.12608,16.97563 -13.43092,26.7994 -3.27921,15.95717 -8.42434,35.59331 -11.39544,51.239 -3.58606,15.64898 -7.47369,31.19513 -11.19738,46.80798 -14.45289,56.42393 -30.32775,112.50324 -44.09644,169.0906 -1.63319,6.61717 -3.31006,14.92274 -0.77652,20.88115 4.70566,11.15069 22.14583,15.099 31.27384,17.56445 37.75281,10.42737 59.32398,13.64673 98.09723,17.24457 z m -84.24839,-57.81801 c 61.68307,17.79456 103.05211,19.95459 167.59751,19.72979 65.10708,-1.87158 116.29533,-3.97854 171.41312,-19.72979 -3.53894,-23.78726 -10.42263,-36.9448 -15.81787,-60.33203 -11.18286,-40.66397 -20.80042,-71.59275 -30.85259,-112.54996 -8.09025,-30.68149 -12.35049,-48.80619 -20.56268,-79.43942 -4.56879,-13.84283 -10.54254,-21.96627 -25.63799,-34.06912 -35.51834,-28.47704 -53.14989,-23.7603 -75.25967,-23.58568 -20.77942,0.16412 -42.80172,5.89956 -60.79409,16.11866 -8.2427,4.83682 -14.95791,7.80388 -21.97748,14.3271 -7.42111,6.28002 -12.55916,11.06615 -18.61053,18.74249 -5.79463,13.30325 -10.02811,22.80556 -13.5713,34.26766 -9.04821,42.81032 -17.42178,75.3586 -28.7275,117.61403 -10.3882,41.65891 -18.57047,66.87447 -27.19893,108.90627 z m 129.47401,62.35723 c -3.67988,1.72776 -3.11926,9.05219 2.2645,14.28317 5.39999,4.0319 25.16202,11.99066 35.012,12.2527 9.79526,-0.55933 28.97063,-5.46645 35.44438,-14.17127 3.58102,-6.20339 3.25699,-13.22013 1.0019,-14.37531 -18.62374,-5.67417 -57.51362,-5.24552 -73.72278,2.01071 z"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg version="1.1" id="notification" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path
d="m 274.35721,544.30707 c -1.99213,13.1396 5.71057,29.96193 14.00843,39.46413 8.08116,10.03736 33.61978,20.75537 46.10998,22.09077 17.08125,1.2368 34.95503,1.17082 51.71241,-2.83839 17.60552,-4.80226 37.23117,-18.86132 44.25676,-32.90844 3.78639,-7.14273 3.87003,-21.18235 3.86863,-23.09715 44.86005,-2.94885 75.17306,-9.75629 118.38686,-23.08429 9.1901,-2.7217 21.4307,-8.27257 22.02864,-20.65724 -1.42414,-16.23569 -7.01314,-31.92594 -10.16528,-47.85788 -4.52356,-15.54788 -8.06921,-31.345 -12.66386,-46.86661 -14.11416,-52.97385 -27.66807,-99.49099 -39.37835,-153.04762 -1.36765,-6.789 -4.27166,-16.28731 -5.86281,-23.01283 -0.95121,-5.83649 -2.48637,-11.43039 -3.15461,-17.31392 -2.13207,-12.2982 -9.15386,-23.43337 -16.79113,-30.58698 -20.61843,-21.62895 -43.29722,-37.41342 -71.85334,-46.13292 -54.99256,-17.81 -117.8331,-5.47943 -162.61542,30.7388 -10.82613,8.50772 -17.88394,14.64398 -26.36128,25.48342 -6.30756,7.91113 -10.12608,16.97563 -13.43092,26.7994 -3.27921,15.95717 -8.42434,35.59331 -11.39544,51.239 -3.58606,15.64898 -7.47369,31.19513 -11.19738,46.80798 -14.45289,56.42393 -30.32775,112.50324 -44.09644,169.0906 -1.63319,6.61717 -3.31006,14.92274 -0.77652,20.88115 4.70566,11.15069 22.14583,15.099 31.27384,17.56445 37.75281,10.42737 59.32398,13.64673 98.09723,17.24457 z m -84.24839,-57.81801 c 61.68307,17.79456 103.05211,19.95459 167.59751,19.72979 65.10708,-1.87158 116.29533,-3.97854 171.41312,-19.72979 -3.53894,-23.78726 -10.42263,-36.9448 -15.81787,-60.33203 -11.18286,-40.66397 -20.80042,-71.59275 -30.85259,-112.54996 -8.09025,-30.68149 -12.35049,-48.80619 -20.56268,-79.43942 -4.56879,-13.84283 -10.54254,-21.96627 -25.63799,-34.06912 -35.51834,-28.47704 -53.14989,-23.7603 -75.25967,-23.58568 -20.77942,0.16412 -42.80172,5.89956 -60.79409,16.11866 -8.2427,4.83682 -14.95791,7.80388 -21.97748,14.3271 -7.42111,6.28002 -12.55916,11.06615 -18.61053,18.74249 -5.79463,13.30325 -10.02811,22.80556 -13.5713,34.26766 -9.04821,42.81032 -17.42178,75.3586 -28.7275,117.61403 -10.3882,41.65891 -18.57047,66.87447 -27.19893,108.90627 z m 129.47401,62.35723 c -3.67988,1.72776 -3.11926,9.05219 2.2645,14.28317 5.39999,4.0319 25.16202,11.99066 35.012,12.2527 9.79526,-0.55933 28.97063,-5.46645 35.44438,-14.17127 3.58102,-6.20339 3.25699,-13.22013 1.0019,-14.37531 -18.62374,-5.67417 -57.51362,-5.24552 -73.72278,2.01071 z"/>
<circle
cx="583.42706"
cy="116.68542"
r="57.728573" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="others" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 101.0 185.0 C 118.520195 329.43872 135.70976 473.9391 153.06053 618.3911 C 155.99454 636.6814 175.20963 647.3669 192.53061 646.0 C 262.52097 646.0 332.51196 646.0 402.4953 646.0 C 437.48865 646.0 472.5157 646.0 507.493 646.0 C 516.2182 645.80945 524.9429 646.27216 533.6537 645.75525 C 539.8468 645.5515 546.3119 646.9798 552.20386 644.04474 C 570.3652 636.84985 567.8249 613.65137 570.3239 598.43115 C 578.72577 529.6602 586.7453 460.86703 595.1191 392.09332 C 599.2315 357.67676 603.40344 323.26486 607.5158 288.85373 C 609.44147 271.62878 611.78424 254.45256 613.7086 237.22833 C 615.0111 219.7879 618.966 202.52545 619.0 185.0 C 631.7037 184.5839 648.41675 188.14395 660.5105 176.79034 C 669.8542 167.46317 671.6546 151.0254 663.5102 140.34016 C 653.2273 124.28198 633.0299 128.00935 618.5444 128.0 C 599.383 128.0 580.188 128.0 561.04254 128.0 C 505.025 128.0 449.0089 128.0 393.0 128.0 C 395.5405 114.991356 394.3317 98.313446 389.064 87.345955 C 382.6819 75.28421 369.45718 67.9959 355.9531 68.49808 C 331.75928 69.5868 318.48544 90.26666 320.0 111.1421 C 320.72412 116.512886 318.94452 123.26407 321.0 127.5 C 260.86624 128.92592 200.38127 127.24074 140.18651 128.0 C 124.99728 128.0 109.8576 128.0 94.68432 128.0 C 85.40669 128.13002 73.40994 126.179695 64.41629 134.19795 C 52.92965 143.30151 49.520515 161.36638 58.8082 173.22139 C 69.6587 189.31187 87.36157 184.3476 101.0 185.0 Z M 161.0 186.25 C 170.18124 251.47539 176.38605 317.98975 185.08434 383.46564 C 192.83174 450.66113 201.57089 517.78735 209.0 585.0 C 266.02188 585.0 322.9941 585.0 380.0 585.0 C 422.78964 584.80133 465.60098 585.24225 508.38016 584.8692 C 512.91974 584.8869 513.35126 580.64716 513.36536 577.3046 C 526.4984 464.81903 540.59247 352.44067 553.7767 239.96967 C 555.57007 221.62315 558.69464 203.38637 560.0 185.0 C 493.4 185.0 426.8 185.0 360.2 185.0 C 326.8 185.0 293.4 185.0 260.0 185.0 C 243.2 185.0 226.4 185.0 209.6 185.0 C 201.2 185.0 192.8 185.0 184.4 185.0 C 176.67282 185.90146 167.25517 183.7652 161.0 186.0 C 161.0 186.09 161.0 186.17334 161.0 186.25 Z M 245.10893 272.2493 C 250.03056 310.85754 255.6688 349.143 260.86856 387.45422 C 264.68518 415.79755 268.54272 444.13202 272.56284 472.4342 C 274.27216 482.27948 274.3112 495.0147 279.93732 502.80475 C 285.05743 510.13083 293.2403 515.7411 302.42056 515.93024 C 318.4635 517.3307 334.42294 504.95752 336.60635 488.83115 C 337.83102 476.29538 334.74973 463.8207 333.25705 451.46097 C 328.66895 415.02792 322.91574 378.7711 318.26212 342.34888 C 314.86273 318.49213 311.69534 294.62057 308.34265 270.77023 C 307.91727 253.9107 293.9649 238.11162 276.23575 239.4114 C 259.53247 240.62753 245.65512 255.32709 245.10893 272.2493 Z M 361.2582 271.96204 C 365.76648 310.1979 371.71097 348.10208 376.76892 386.08932 C 380.6171 414.6726 384.61935 443.22125 388.6265 471.771 C 390.23236 482.35663 390.2688 493.75946 396.25287 503.07794 C 408.60913 520.4444 431.72928 519.23804 444.57455 505.67496 C 455.13257 493.75232 453.96295 480.32654 451.48016 466.7698 C 445.9432 424.60095 439.7796 382.52124 434.04535 340.38327 C 431.22012 316.85663 427.2732 293.48856 424.37268 269.9823 C 424.0885 252.93494 409.12173 237.42859 391.4369 239.49876 C 374.92816 240.97502 361.97464 255.50237 361.2582 271.96204 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="privacypolicy" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 56.0 209.82521 C 55.517548 217.75914 57.89049 225.07372 60.47588 232.19368 C 76.08677 286.7041 97.62354 339.24997 121.08526 390.72992 C 138.39935 427.65692 157.22063 463.82016 178.45885 498.67892 C 210.64148 551.28595 247.56293 602.475 296.00955 641.4103 C 318.55392 657.84534 350.197 677.6673 384.32495 665.2648 C 413.5022 654.95715 437.4955 634.03033 458.9751 612.5249 C 511.0154 558.7049 549.6463 493.54172 583.8527 427.52426 C 601.7652 393.45636 616.7162 357.83228 631.1495 322.19922 C 638.0402 303.87997 645.6513 285.80273 651.2094 267.02206 C 654.67633 257.41357 657.65234 247.64647 660.8626 237.96286 C 663.6631 228.61429 667.51306 219.32707 666.99994 209.37335 C 667.88165 195.85805 658.4737 182.51212 645.427 178.73329 C 631.53094 174.10582 620.4638 180.50867 608.1544 185.87865 C 562.45135 204.15715 509.80405 201.17116 464.89777 182.10506 C 448.58133 175.2148 432.98572 166.44905 418.98965 155.57947 C 413.18704 150.6526 406.84375 146.3895 401.05103 141.47154 C 391.0025 132.10406 381.29172 116.41859 367.60916 114.5033 C 361.35886 113.450745 353.72272 114.2448 348.26965 116.16561 C 337.45703 121.45666 331.89758 133.419 322.69382 140.59686 C 291.8326 166.86102 255.62418 188.66943 214.8391 194.86433 C 192.95305 198.84413 170.4763 199.06113 148.53581 195.41986 C 138.22421 194.18628 128.3995 190.88791 118.68581 187.37596 C 108.99779 184.00845 98.183044 177.84583 88.62509 177.29932 C 71.130936 176.0377 54.448395 191.88728 56.0 209.82521 Z M 258.03745 403.26102 C 257.42337 415.4746 267.7702 422.13574 274.3226 428.8895 C 284.00125 440.35623 294.83716 450.85806 303.57956 463.1158 C 311.67786 474.6238 322.4061 487.71454 341.13516 483.32217 C 359.27597 477.08615 370.4793 459.87732 381.7953 445.5899 C 392.62036 430.48917 403.03247 415.09616 414.266 400.29144 C 436.64777 370.92172 465.68814 337.50592 494.3251 318.82675 C 505.49506 309.50583 502.75446 288.9813 488.68637 283.91287 C 475.02933 277.8938 462.50406 288.9647 453.21567 295.59787 C 419.42575 323.29645 391.81744 357.5513 366.70212 393.08853 C 360.58417 401.83182 354.4889 410.59875 348.15292 419.16977 C 345.5889 422.41577 343.2463 425.82724 340.68008 429.05984 C 335.24603 437.6099 329.32736 426.59647 325.94775 422.5606 C 318.97867 414.48856 311.73474 406.69077 304.61435 398.7687 C 298.11957 390.51233 288.53857 382.69687 277.44098 383.07755 C 266.9812 383.03296 257.67224 392.60104 258.03745 403.26102 Z M 349.0 61.0 C 350.0157 61.0 350.9843 61.0 352.0 61.0 C 352.0 59.662983 352.0 58.33655 352.0 57.0 C 350.98978 57.0 350.0069 57.0 349.0 57.0 C 349.0 58.3344 349.0 59.666992 349.0 61.0 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="profile" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 118.0 245.0 C 116.80021 260.79257 116.209915 276.69244 119.74173 292.28192 C 126.62818 330.1374 173.9731 372.51828 221.87204 353.52417 C 240.22212 345.1135 254.95413 329.67804 263.25928 311.44113 C 272.2822 291.58438 272.2568 269.0672 269.6927 247.85507 C 269.06006 240.88487 277.42996 239.07684 279.67117 233.48355 C 285.2174 223.34068 281.5028 209.42526 270.92075 204.6867 C 263.00336 200.8969 254.12375 200.7866 245.56187 201.0 C 218.17693 201.0 190.79996 201.0 163.431 201.0 C 148.4495 201.0 133.43436 201.0 118.46884 201.0 C 103.895 201.0 89.27952 201.0 74.70567 201.0 C 58.954525 201.80899 39.233387 198.92331 25.506721 204.8031 C 15.19557 208.84175 10.147135 222.14212 15.668416 232.04561 C 23.528444 247.83241 50.04858 242.28645 63.048676 243.41473 C 81.35725 244.23 99.68285 244.54488 118.0 245.0 Z M 283.0266 518.8658 C 282.35648 532.9835 296.56317 540.5195 307.20074 542.02905 C 332.1284 546.57715 357.89188 553.18823 383.3475 548.0241 C 395.9165 545.3331 409.00546 544.80835 421.2467 540.671 C 431.31766 536.94226 442.5218 529.3575 439.53845 514.6479 C 437.58353 500.8371 424.02286 497.106 412.2646 498.1269 C 394.38904 498.89655 374.00638 507.47498 357.42688 505.36063 C 338.9646 504.21982 321.01437 497.6619 302.39325 498.13382 C 292.00543 498.41827 282.36472 509.3252 283.0266 518.8658 Z M 456.0 244.5 C 445.00644 276.59366 455.25735 315.88458 479.51752 339.38004 C 494.75018 354.0709 516.5806 362.6533 537.69 357.54172 C 558.0123 352.89316 575.7622 340.08743 588.48334 323.83307 C 605.75934 301.76276 608.25757 271.6545 604.0 245.0 C 620.411 245.01163 636.80804 243.81438 653.2124 243.57336 C 665.65826 242.96927 678.13837 243.11177 690.5825 242.87231 C 710.2963 241.60266 714.99866 215.75005 700.8389 206.43645 C 693.76794 201.52798 683.1583 201.15984 675.66235 201.0 C 666.27515 201.0 656.88794 201.0 647.50073 201.0 C 632.73474 201.0 617.9271 201.0 603.16113 201.0 C 588.1735 201.0 573.1939 201.0 558.2223 201.0 C 530.0388 201.0 501.90488 201.0 473.73737 201.0 C 462.28497 200.84735 446.61526 200.8224 441.62796 216.6808 C 435.82648 230.29057 446.93677 237.55415 456.0 244.5 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="search" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 421.5 498.0 C 434.58582 510.86346 447.47815 523.8672 459.87024 537.37024 C 469.5231 546.3743 479.60712 559.0613 490.7834 564.3671 C 509.39716 573.37616 534.0041 569.2053 547.87006 553.62994 C 562.76013 540.1901 566.2507 513.3917 557.8263 497.65405 C 554.7732 489.84927 549.11414 483.82687 542.89777 478.39774 C 525.753 461.25302 508.6018 444.1018 491.45993 426.95993 C 491.31113 426.81113 491.13654 426.63654 491.0 426.5 C 511.99066 389.0592 519.4572 343.84393 512.1096 301.5783 C 505.38324 261.45398 485.37537 223.71866 455.5249 196.0249 C 419.95032 160.75085 369.31204 142.42644 319.6313 143.16904 C 269.6047 144.47351 219.96202 165.95894 185.76726 202.73274 C 150.40308 238.7641 132.37398 289.49457 133.30731 339.41418 C 135.04604 389.2183 156.14091 438.6786 193.10226 472.60226 C 222.22115 500.96313 260.9249 518.8838 301.2079 523.8264 C 342.54892 528.5488 385.86993 519.65814 421.5 498.0 Z M 218.0 333.93558 C 217.04677 361.95493 229.57526 388.99713 248.39444 408.89444 C 268.45258 428.1199 295.8782 440.53253 323.94638 440.0 C 351.58994 440.3898 379.58603 429.431 398.975 409.525 C 420.0468 390.05048 429.99008 361.6023 430.64905 333.55637 C 429.8874 305.93195 419.51355 278.5726 399.52512 259.02512 C 379.7841 239.02792 351.71756 227.15234 323.50842 228.0 C 295.44888 227.11684 268.24124 239.97072 248.4003 259.10236 C 229.84244 279.05966 216.94858 305.96252 218.0 333.93558 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1024 1024" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 76.0 253.74638 C 76.0 270.80435 76.0 287.61078 76.0 304.4 C 75.27057 316.30206 75.99194 328.80856 83.29525 338.90503 C 92.11438 353.9812 109.83434 362.04654 126.88691 361.0 C 145.68481 361.0 164.48273 361.0 183.28064 361.0 C 328.0645 361.0 472.84842 361.0 617.6323 361.0 C 690.22424 361.0 762.81616 361.0 835.4081 361.0 C 853.6279 361.0 871.79816 361.0 890.002 361.0 C 902.3682 361.007 915.6736 362.4736 926.90186 356.03677 C 943.7456 348.5697 953.4615 330.38086 953.6823 312.58557 C 954.522 292.5478 953.5839 272.4664 954.0 252.423 C 953.859 234.21152 954.1724 216.02579 953.9057 197.82697 C 953.7232 183.05801 949.0092 167.51312 937.01624 157.83081 C 925.66974 147.59935 910.281 145.08527 895.6223 146.0 C 658.2486 146.0 420.88287 146.0 183.52518 146.0 C 166.33356 146.0 149.10826 146.0 131.93263 146.0 C 120.08126 145.237 108.04283 146.9879 97.98537 153.72632 C 83.68445 162.6528 74.89377 179.30917 76.0 196.16174 C 76.0 215.28062 76.0 234.3821 76.0 253.74638 Z M 76.0 515.747 C 76.0 533.004 76.0 550.011 76.0 567.0 C 75.311905 578.8501 76.14479 591.3651 83.591934 601.30756 C 92.54537 615.7855 109.424965 623.9886 126.26561 622.9998 C 145.26971 623.00037 164.25435 622.9997 183.25427 623.0 C 327.61176 623.0 472.0029 623.0 616.34436 623.0 C 688.7201 623.0 761.1295 623.0 833.48926 623.0 C 851.69855 623.0 869.86615 623.0 888.07544 623.0 C 900.9223 623.12616 914.5106 624.406 926.36127 618.286 C 943.0149 610.8798 953.3255 593.0422 953.6347 575.1856 C 954.57745 555.07324 953.5443 534.93866 954.0 514.81885 C 953.8889 496.64117 954.13574 478.47205 953.92596 460.30838 C 953.911 445.02997 948.8579 429.2461 936.54706 419.2861 C 925.2696 409.31195 910.08514 407.13165 895.635 408.0 C 658.12537 408.0 420.6237 408.0 183.13004 408.0 C 166.13707 408.0 149.1441 408.0 132.15115 408.0 C 120.379555 407.56815 107.959 408.58014 97.93872 415.5586 C 83.49397 424.46808 74.826645 441.1983 76.0 458.1619 C 76.0 477.28058 76.0 496.38367 76.0 515.747 Z M 76.0 777.2962 C 76.0 794.5176 76.0 811.52045 76.0 828.5 C 75.30375 840.5096 76.019226 853.22 83.591934 863.30756 C 92.80086 878.0986 110.328835 886.1263 127.489105 885.0 C 146.29707 885.0 165.0634 885.0 183.87138 885.0 C 328.234 885.0 472.58865 885.0 616.9353 885.0 C 689.29865 885.0 761.7037 885.0 834.0671 885.0 C 852.26135 885.0 870.4556 885.0 888.6499 885.0 C 901.4239 885.0999 915.05066 886.33887 926.78394 880.0558 C 943.5927 871.99335 953.7279 854.0645 953.74146 835.67615 C 954.44037 815.59625 953.6458 795.4643 954.0 775.38245 C 953.8451 757.43994 954.19 739.5233 953.89465 721.59625 C 953.7319 706.3821 948.4644 690.73334 936.16394 680.9458 C 923.33136 669.63104 909.2142 669.51996 894.3163 670.0 C 657.16187 670.0 420.0572 670.0 182.91881 670.0 C 165.92365 670.0 148.92848 670.0 131.93332 670.0 C 120.1362 669.4402 107.6214 670.2861 97.69241 677.5919 C 83.30177 686.6182 74.842995 703.4823 76.0 720.35706 C 76.0 739.27014 76.0 758.1647 76.0 777.2962 Z M 132.00552 260.23706 C 131.5036 288.3045 156.96925 313.62515 184.88303 311.99414 C 213.26517 312.93765 236.85686 286.405 235.6454 258.9262 C 235.42346 231.10242 209.69429 206.48074 181.67693 209.00853 C 167.82706 208.33914 155.00917 215.11423 146.12994 225.37006 C 136.70596 234.16145 131.79443 247.12006 132.00552 260.23706 Z M 132.0129 521.23566 C 131.5274 535.995 137.6076 549.9209 148.32753 559.58435 C 158.4196 569.26746 171.97783 574.7692 186.08351 573.5497 C 214.17819 572.98224 237.48758 546.6391 235.4699 518.9368 C 235.19351 490.69714 208.20709 467.80826 180.69316 470.0741 C 154.343 470.97736 131.94522 494.8324 132.0129 521.23566 Z M 132.00552 783.23706 C 131.39201 811.5346 157.04424 836.3964 184.99419 834.98553 C 213.51115 835.4979 237.04463 809.36127 235.59027 781.4786 C 235.2065 753.2923 209.46771 730.1908 181.77516 731.48016 C 154.4867 731.50635 131.66637 756.2344 132.00552 783.23706 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.5 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg version="1.1" id="terms" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 720 720" style="fill-rule:evenodd;stroke:none" xml:space="preserve">
<g>
<path d="M 158.0 339.74612 C 158.0303 377.02374 157.96304 414.02502 158.01996 451.04327 C 158.7533 464.48724 158.0392 477.90436 158.00046 491.39322 C 158.04257 503.366 158.46811 515.3454 158.65565 527.3154 C 158.58463 535.9222 157.3199 547.10455 165.98537 554.45605 C 172.6744 562.02704 181.03258 561.4961 189.6327 561.2806 C 253.08499 562.5999 316.49826 561.6399 380.01968 562.0 C 412.9178 561.90454 445.81158 562.1765 478.70142 561.75696 C 490.981 561.6015 503.27844 561.44586 515.55365 561.29047 C 525.58826 560.8975 538.24445 562.3618 546.6157 557.61926 C 553.853 553.4908 559.4558 546.04987 560.79694 537.78345 C 562.5187 471.845 561.8824 405.84943 562.0 339.8952 C 562.9285 307.89523 561.0723 270.36484 561.9974 241.07622 C 562.1082 228.46233 561.92944 215.85973 561.5695 203.26656 C 560.5699 193.47998 562.5136 179.15991 558.89825 171.57205 C 554.6768 163.97289 546.83563 158.50552 538.0901 158.8858 C 471.87134 157.42963 405.6758 158.2751 339.38126 158.0 C 309.65103 158.14189 279.92047 157.81467 250.20647 158.1303 C 227.96184 158.57419 205.74403 158.49516 183.51668 159.08136 C 165.72977 161.26913 157.65979 177.00948 159.0 192.02724 C 158.46297 241.18492 157.2037 290.2524 158.0 339.74612 Z M 211.15068 463.24765 C 212.29605 475.82675 208.9168 492.2583 221.53131 501.58582 C 226.61633 505.51132 232.77083 508.10895 239.25568 508.05072 C 246.23659 508.59442 253.21309 509.2686 260.2038 508.54388 C 310.18304 506.99533 360.24478 508.82336 410.22733 508.0 C 422.82178 508.00015 435.42166 507.99982 448.01465 508.0001 C 464.45135 507.96838 486.11948 511.47162 499.00037 501.16757 C 506.76776 495.21637 508.74924 487.51428 508.0 478.8674 C 508.0 469.4895 508.0 460.1116 508.0 450.73367 C 508.0 400.03925 508.0 349.38638 508.0 298.69196 C 508.37546 286.08948 507.45395 273.3951 508.51178 260.82693 C 508.60217 251.67905 507.55295 242.48723 507.76013 233.31418 C 506.3202 221.46866 492.5266 212.25273 482.3613 212.02455 C 468.82455 210.66695 455.29105 211.5433 441.7322 212.0 C 401.74448 212.0 361.7567 212.0 321.76898 212.0 C 306.7597 212.0 291.79208 212.0 276.78278 212.0 C 264.11652 211.73784 251.45686 210.7003 238.81503 211.9612 C 228.67693 212.09439 219.3152 218.43915 214.37692 227.02599 C 210.1159 235.0149 213.09178 246.9409 212.0 255.49977 C 212.0 290.41327 212.0 325.36035 212.0 360.25787 C 212.0 377.63162 212.0 394.96384 212.0 412.33762 C 211.6118 428.69702 212.67247 448.04315 211.15068 463.24765 Z M 235.05788 258.77466 C 234.79831 268.21478 242.18158 273.51804 250.15271 273.08295 C 292.6524 274.0582 335.16806 274.24747 377.66284 274.0 C 399.24832 274.13226 420.81802 274.0183 442.39017 273.52597 C 452.99933 272.94373 463.70172 273.70184 474.28204 272.68613 C 485.07 270.40295 488.1768 257.13898 481.66913 249.83498 C 474.2385 242.96632 464.3762 245.45581 455.11014 245.0 C 386.05118 245.27216 316.95468 244.6681 247.90596 245.17923 C 241.74236 245.77782 234.7423 250.81326 235.05788 258.77466 Z M 235.05788 318.77466 C 234.79831 328.21478 242.18158 333.51804 250.15271 333.08295 C 292.6524 334.0582 335.16806 334.24747 377.66284 334.0 C 399.24832 334.13226 420.81802 334.0183 442.39017 333.52597 C 452.99933 332.94373 463.70172 333.70184 474.28204 332.68613 C 485.07 330.40295 488.1768 317.13898 481.66913 309.835 C 474.2385 302.96634 464.3762 305.4558 455.11014 305.0 C 386.05118 305.27216 316.95468 304.6681 247.90596 305.17923 C 241.74236 305.7778 234.7423 310.81326 235.05788 318.77466 Z M 235.05788 378.77466 C 234.79831 388.21478 242.18158 393.51804 250.15271 393.08295 C 292.6524 394.0582 335.16806 394.24747 377.66284 394.0 C 399.24832 394.13226 420.81802 394.0183 442.39017 393.52597 C 452.99933 392.94373 463.70172 393.70184 474.28204 392.68613 C 485.07 390.40295 488.1768 377.13898 481.66913 369.835 C 474.2385 362.96634 464.3762 365.4558 455.11014 365.0 C 386.05118 365.27216 316.95468 364.6681 247.90596 365.17923 C 241.74236 365.7778 234.7423 370.81326 235.05788 378.77466 Z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="quote_1" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="m228-240 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T458-480L320-240h-92Zm360 0 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480L680-240h-92ZM320-500q25 0 42.5-17.5T380-560q0-25-17.5-42.5T320-620q-25 0-42.5 17.5T260-560q0 25 17.5 42.5T320-500Zm360 0q25 0 42.5-17.5T740-560q0-25-17.5-42.5T680-620q-25 0-42.5 17.5T620-560q0 25 17.5 42.5T680-500Zm0-60Zm-360 0Z"/></svg>

After

Width:  |  Height:  |  Size: 569 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="reply_1" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 760" width="24"><path d="M757.13-191.869V-360q0-47.848-33.326-81.174Q690.478-474.5 642.63-474.5H285.435l138.5 138.5-64.413 63.652L111.869-520l247.653-247.652L423.935-704l-138.5 138.5H642.63q85.153 0 145.327 60.174Q848.131-445.152 848.131-360v168.131H757.13Z"/></svg>

After

Width:  |  Height:  |  Size: 365 B

+1
View File
@@ -0,0 +1 @@
<svg id="report" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240ZM330-120 120-330v-300l210-210h300l210 210v300L630-120H330Zm34-80h232l164-164v-232L596-760H364L200-596v232l164 164Zm116-280Z"/></svg>

After

Width:  |  Height:  |  Size: 368 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="reuse_1" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="M280-80 120-240l160-160 56 58-62 62h406v-160h80v240H274l62 62-56 58Zm-80-440v-240h486l-62-62 56-58 160 160-160 160-56-58 62-62H280v160h-80Z"/></svg>

After

Width:  |  Height:  |  Size: 276 B

+1
View File
@@ -0,0 +1 @@
<svg version="1.1" id="share_1" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M720-80q-50 0-85-35t-35-85q0-7 1-14.5t3-13.5L322-392q-17 15-38 23.5t-44 8.5q-50 0-85-35t-35-85q0-50 35-85t85-35q23 0 44 8.5t38 23.5l282-164q-2-6-3-13.5t-1-14.5q0-50 35-85t85-35q50 0 85 35t35 85q0 50-35 85t-85 35q-23 0-44-8.5T638-672L356-508q2 6 3 13.5t1 14.5q0 7-1 14.5t-3 13.5l282 164q17-15 38-23.5t44-8.5q50 0 85 35t35 85q0 50-35 85t-85 35Zm0-640q17 0 28.5-11.5T760-760q0-17-11.5-28.5T720-800q-17 0-28.5 11.5T680-760q0 17 11.5 28.5T720-720ZM240-440q17 0 28.5-11.5T280-480q0-17-11.5-28.5T240-520q-17 0-28.5 11.5T200-480q0 17 11.5 28.5T240-440Zm480 280q17 0 28.5-11.5T760-200q0-17-11.5-28.5T720-240q-17 0-28.5 11.5T680-200q0 17 11.5 28.5T720-160Zm0-600ZM240-480Zm480 280Z"/></svg>

After

Width:  |  Height:  |  Size: 804 B

+1
View File
@@ -0,0 +1 @@
<svg id="block" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q65 0 123 19t107 53l-58 59q-38-24-81-37.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160q133 0 226.5-93.5T800-480q0-18-2-36t-6-35l65-65q11 32 17 66t6 70q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm-56-216L254-466l56-56 114 114 400-401 56 56-456 457Z"/></svg>

After

Width:  |  Height:  |  Size: 478 B

+1
View File
@@ -0,0 +1 @@
<svg id="video" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m145.087-814.696 74 152h130l-74-152h89l74 152h130l-74-152h89l74 152h130l-74-152h101.826q32.74 0 56.262 23.521 23.521 23.522 23.521 56.262v509.826q0 32.507-23.521 55.862-23.522 23.356-56.262 23.356H145.087q-32.507 0-55.862-22.804-23.356-22.805-23.356-55.284v-510.956q0-32.74 23.356-56.262 23.355-23.521 55.862-23.521Zm0 231.783v357.826h669.826v-357.826H145.087Zm0 0v357.826-357.826Z"/></svg>

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Some files were not shown because too many files have changed in this diff Show More