diff --git a/index.php b/index.php index 071de6b..c0bf4f9 100644 --- a/index.php +++ b/index.php @@ -52,11 +52,12 @@

-

+ +


-

+


-

Kérek automatikus képkorrekciót! (expozíció, élesítés)

A feltöltött tartalmamért teljes felelősséget vállalok.

@@ -65,14 +66,6 @@
Mehet!
-
-
- -
-
-
Mehet!
-
-
diff --git a/interface.php b/interface.php index 3b22644..c1796e0 100644 --- a/interface.php +++ b/interface.php @@ -21,12 +21,14 @@ function only_alpha_numeric($input) // felhasználó IP címének meghatározása... nem is olyan triviális // https://stackoverflow.com/a/2031935 -function get_client_ip(){ - foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){ - if (array_key_exists($key, $_SERVER) === true){ - foreach (explode(',', $_SERVER[$key]) as $ip){ +function get_client_ip() +{ + foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key) { + if (array_key_exists($key, $_SERVER) === true) { + foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); // just to be safe - if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){ + if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | + FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } @@ -56,7 +58,7 @@ function incoming_from_uid($uid) * -1: ismeretlen hiba * -2: MIME-hiba * -3: mérethiba - * -3: elérte a feltöltési limitet + * -4: elérte a feltöltési limitet * string: egyedi azonosító, a feltöltés sikerült */ @@ -71,7 +73,7 @@ function process_uploaded_file($file_info) $ip = mysqli_real_escape_string($dbconn, get_client_ip()); // escape, biztos ami biztos $query = "SELECT COUNT(No) FROM server_access WHERE Timestamp > TIMESTAMPADD(MINUTE, -10, CURRENT_TIMESTAMP) AND IP = '$ip';"; $ret = (int)mysqli_query($dbconn, $query)->fetch_assoc()["COUNT(No)"]; - if ($ret === false || $ret >= UPLOAD_LIMIT_10MIN){ + if ($ret === false || $ret >= UPLOAD_LIMIT_10MIN) { return LIMIT_ERROR; } @@ -108,7 +110,25 @@ function process_uploaded_file($file_info) return $tmp_uid; } +// csoportnév ellenőrzése +function verify_group($g) +{ + // EZ ÍGY NEM JÓ!! EZT LE KELLENE TÖLTENI A KÖZI OLDALÁRÓL!!! + $groups = ["bíbor", "tejszín", "borostyán", "azúr", "türkiz", "aquamarin", "burgundi", "zafír", "mangó", + "levendula", "bambusz", "csipkebogyó", "mustár", "parázs", "áfonya"]; + + return in_array($g, $groups); +} + // kép publikálása +// visszatérési értékek: +// 0: OK +// -1: a kép már fel van töltve +// -2: hibás csoportnév + +define("DUPLICATE_IMAGE", -1); +define("NONEXISTENT_GROUP", -2); + define("THUMB_LARGEST_SIDE", 400); function publish_image($artwork_details) { @@ -117,6 +137,23 @@ function publish_image($artwork_details) $MAX_THUMB_IMAGE_FILESIZE_STR = "100k"; // bélyegkép maximális mérete $THUMB_IMAGE_LARGEST_DIM = THUMB_LARGEST_SIDE; // bélyegkép hosszabb oldalának mérete + // ----------------------------- + + // adatbázis... + global $dbconn; + + // felhasználótól jött adatok, ellenőrizni kell + $author = mysqli_real_escape_string($dbconn, $artwork_details["author"]); + $title = mysqli_real_escape_string($dbconn, $artwork_details["title"]); + $desc = mysqli_real_escape_string($dbconn, $artwork_details["desc"]); + $group = mysqli_real_escape_string($dbconn, $artwork_details["group"]); + + // csoport ellenőrzése + if (!verify_group($group)) { + return NONEXISTENT_GROUP; + } + + // fájlnevek meghatározása $incoming_filename = incoming_from_uid(only_alpha_numeric($artwork_details["uid"])); $final_filename = date("Y_m_d_H_i_s") . bin2hex(openssl_random_pseudo_bytes(4)) . ".jpg"; @@ -126,16 +163,17 @@ function publish_image($artwork_details) // korrekciós parancs $autocorrect = $artwork_details["autocorrect"]; $img_autocorrect = $autocorrect ? "-normalize -sharpen 5" : ""; + $strip_exifdata = "-strip"; // ha a fájl nagyobb, mint 2MB, akkor visszatömörítjük $filesize = filesize($incoming_filename); if ($filesize > $MAX_LARGE_IMAGE_FILESIZE) { - $cmd = "convert -define jpeg:extent=$MAX_LARGE_IMAGE_FILESIZE_STR $img_autocorrect $incoming_filename $large_filename"; + $cmd = "convert -define jpeg:extent=$MAX_LARGE_IMAGE_FILESIZE_STR $img_autocorrect $strip_exifdata $incoming_filename $large_filename"; shell_exec($cmd); unlink($incoming_filename); // törlés az incoming-ból } else { //...ha nem volt túl nagy a fájl if ($autocorrect) { - $cmd = "convert $img_autocorrect $incoming_filename $large_filename"; + $cmd = "convert $img_autocorrect $strip_exifdata $incoming_filename $large_filename"; shell_exec($cmd); unlink($incoming_filename); // törlés az incoming-ból } else { @@ -145,27 +183,21 @@ function publish_image($artwork_details) // bélyegkép elkészítése $thumb_filename = THUMBNAIL_DIR . DIRECTORY_SEPARATOR . $final_filename; - $cmd = "convert -define jpeg:extent=$MAX_THUMB_IMAGE_FILESIZE_STR -resize \"$THUMB_IMAGE_LARGEST_DIM>\" $large_filename $thumb_filename"; + $cmd = "convert $strip_exifdata -define jpeg:extent=$MAX_THUMB_IMAGE_FILESIZE_STR -thumbnail \"$THUMB_IMAGE_LARGEST_DIM>\" $large_filename $thumb_filename"; shell_exec($cmd); // átlagszín kiszámítása $cmd = "convert $thumb_filename -resize 1x1\! -format \"rgb(%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)])\" info:-"; $color_mean = shell_exec($cmd); - // beírás az adatbázisba - global $dbconn; - //echo mysqli_error($dbconn); $img_sizes = getimagesize($thumb_filename); - // felhasználótól jött adatok, ellenőrizni kell - $author = mysqli_real_escape_string($dbconn, $artwork_details["author"]); - $title = mysqli_real_escape_string($dbconn, $artwork_details["title"]); - $desc = mysqli_real_escape_string($dbconn, $artwork_details["desc"]); $uid = md5_file($thumb_filename); // valami random... $aspect_ratio = $img_sizes[0] / $img_sizes[1]; - $query = "INSERT INTO publish_table (Author,Title,Description,Image_FileName,AspectRatio,ColorMean,Approved,Confirmed,UID,TS) VALUES('$author', '$title', '$desc', '$final_filename', $aspect_ratio, '$color_mean', 1, 0, '$uid', CURRENT_TIMESTAMP);"; + + $query = "INSERT INTO publish_table (Author,AuthorGroup,Title,Description,Image_FileName,AspectRatio,ColorMean,Approved,Confirmed,UID,TS) VALUES('$author', '$group', '$title', '$desc', '$final_filename', $aspect_ratio, '$color_mean', 1, 0, '$uid', CURRENT_TIMESTAMP);"; $res = mysqli_query($dbconn, $query); @@ -173,7 +205,7 @@ function publish_image($artwork_details) if ($res === false) { unlink($large_filename); unlink($thumb_filename); - return -1; + return DUPLICATE_IMAGE; } return 0; @@ -217,7 +249,8 @@ function get_batch($offset, $n) $batch = []; // kívánt mennyiségű képinformáció lekérdezése - $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,Title,Description,UID FROM publish_table WHERE Approved=1 ORDER BY No DESC Limit $n OFFSET $offset;"; + $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,AuthorGroup,Title,Description,UID FROM publish_table WHERE Approved=1 ORDER BY No DESC Limit $n OFFSET $offset;"; + $ret = mysqli_query($dbconn, $query); while (($row = $ret->fetch_assoc()) != NULL) { $batch[] = $row; @@ -237,7 +270,8 @@ function get_update_batch($last_uid) $batch = []; // az utolsó UID óta érkezett sorok kiválogatása - $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,Description,Title,UID FROM publish_table WHERE No > (SELECT No FROM publish_table WHERE UID = '$last_uid') AND Approved=1;"; + $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,AuthorGroup,Description,Title,UID FROM publish_table WHERE No > (SELECT No FROM publish_table WHERE UID = '$last_uid') AND Approved=1;"; + $ret = mysqli_query($dbconn, $query); while (($row = $ret->fetch_assoc()) != NULL) { $batch[] = $row; diff --git a/js/phw.js b/js/phw.js index 38ea13b..b8e4169 100644 --- a/js/phw.js +++ b/js/phw.js @@ -23,6 +23,7 @@ var upload_popup_id = "uploadpup"; var publish_btn_id = "publishbtn"; var image_uid = null; +var processing_busy = false; // feldolgozás folyamatban function determine_sliding_unit() { if (window.innerWidth > 600) { // számítógépes megjelenítés @@ -45,21 +46,24 @@ function pup_reset() { // mezők törlése o("author").value = ""; + o("author_group").value = ""; o("imgtitle").value = ""; o("description").value = ""; + o("fileselector").value = ""; } // kép publikálása function publish() { - if (image_uid == null) { // csak, ha érvényes... + if (processing_busy || image_uid == null) { // csak, ha érvényes... return; } // mezők kinyerése - let author = o("author").value; - let title = o("imgtitle").value; - let desc = o("description").value; + let author = o("author").value.trim(); + let title = o("imgtitle").value.trim(); + let desc = o("description").value.trim(); let autocorr = o("autocorrchkbox").checked; + let group = o("author_group").value.trim(); // ha a kötelező mezők nincsenek kitöltve, akkor nem lehet beküldeni if (author.trim() === "" || title.trim() === "") { @@ -78,7 +82,8 @@ function publish() { author: author, title: title, desc: desc, - autocorrect: autocorr + autocorrect: autocorr, + group: group } // küldés @@ -90,24 +95,43 @@ function publish() { req.onreadystatechange = state => { if (req.status === 200 && req.readyState === 4) { - close_upload_pup(); // popup resetelése + let close_if_needed = true; if (Number(req.response) === 0) { alert("Sikeres feltöltés!"); + + req_update(); // frissítés kérése } else if (Number(req.response) === -1) { alert("Ugyanezt képet már korábban feltöltötték!"); + } else if (Number(req.response) === -2) { + alert("A megadott csoport nem létezik!"); + + close_if_needed = false; // nem kell bezárni, mert valószínűleg csak elírta + o("author_group").focus(); // fókuszálás a csoport mezőre } else { alert("Valami nem stimmel!\nHa ismételten nem sikerül, kérlek jelezd a hibát!"); } + + // bezárás, ha szükséges + if (close_if_needed) { + // UID elfelejtése + image_uid = null; + + // popup resetelése + close_upload_pup(); + } + + processing_busy = false; + o(publish_btn_id).innerText = "Mehet!"; } }; req.open("POST", "interface.php"); req.send(formData); - // UID elfelejtése - image_uid = null; - o(publish_btn_id).innerText = "Türelem..." + // feldolgozás folyamatban + processing_busy = true; + o(publish_btn_id).innerHTML = "Türelem... "; } // feltöltés után kapott válasz feldolgozása @@ -172,6 +196,8 @@ function open_upload_pup() { let display = o("display"); display.style.filter = "blur(10px)"; scroll_enable(false); + + o("fileselector").value = ""; } // feltöltőablak bezárása @@ -222,7 +248,6 @@ var wall_height = 0; // a fal magassága, pixelben var dynamic_load_distance = 200; // ennyi pixellel a fal alja előtt indítja a dinamikus betöltést var dynamic_loading_under_way = false; // dinamikus töltés folyamatban, ne indítsunk új requestet var update_interval = 10000; // automatikus frissítés 10 másodpercenként -var max_scaled_size_factor = 1.2; // hányszorosa lehet a nagyított kép az eredetinek var thumbnails = []; @@ -247,7 +272,7 @@ function init_photowall() { // automatikus frissítés setInterval(() => { req_update(); - }, 10000); + }, update_interval); } // inicializálási lánc @@ -446,10 +471,15 @@ function compose_wall() { window.scrollTo(0, scroll_pos); } +// frissítés folyamatban +var update_in_progress = false; + // frissítés lekérése function req_update() { - async_req("update", recv_update, {last_uid: last_uid}); -} + if (!update_in_progress) { + update_in_progress = true; + async_req("update", recv_update, {last_uid: last_uid}); + }} // frissítés fogadása function recv_update(state, resp) { @@ -475,6 +505,9 @@ function recv_update(state, resp) { // fal összeállítása compose_wall(); + + // update kész + update_in_progress = false; } @@ -633,6 +666,7 @@ function place_artcaptions() { } var viewer_open = false; +var group_logo_repository = "https://mkkozi.hu/user/plugins/mkk-groups/logos"; // képnézegető megynitása function open_viewer(details) { @@ -652,6 +686,13 @@ function open_viewer(details) { captions_bgcolor.a = 0.6; o("artcaptions").style.backgroundColor = captions_bgcolor.to_rgba();*/ + // csoportlogó megjelenítése + let glogo = document.createElement("img"); + glogo.src = `${group_logo_repository}/${details.AuthorGroup}.png`; + glogo.alt = `(${details.AuthorGroup})`; + glogo.classList.add("art-author-group"); + o("artauthor").appendChild(glogo); + // nézegető visszaállítása change_viewer_magnification(1.0, true); change_viewer_offset({x: 0, y: 0}, true); diff --git a/phw.css b/phw.css index 0ed7a77..0ce8471 100644 --- a/phw.css +++ b/phw.css @@ -299,6 +299,12 @@ span.art-desc { margin-top: 0.5em; } +img.art-author-group { + height: 1.45em; + margin-left: 0.5em; + vertical-align: middle; +} + @keyframes hide-art-caption { 0% { max-height: 100vh; background-color: rgba(0, 0, 0, 0.6); } 80% { max-height: 100vh; background-color: rgba(0, 0, 0, 0.6); }