- get_image redesign and its dependencies
This commit is contained in:
		
							parent
							
								
									0980abfdd4
								
							
						
					
					
						commit
						29b53025f9
					
				
							
								
								
									
										21
									
								
								controller.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								controller.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_once "globals.php";
 | 
				
			||||||
 | 
					require_once "common_func.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_once "usermgr.php";
 | 
				
			||||||
 | 
					require_once "groupmgr.php";
 | 
				
			||||||
 | 
					require_once "gamemgr.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function does_user_access_game($nickname, $gameid): bool {
 | 
				
			||||||
 | 
					    // get game and user data
 | 
				
			||||||
 | 
					    $game_data = get_game($gameid);
 | 
				
			||||||
 | 
					    $user_data = get_user($nickname);
 | 
				
			||||||
 | 
					    if ((count($game_data) === 0) || (count($user_data) === 0)) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // check if this user has permission to take this test
 | 
				
			||||||
 | 
					    // if the intersection of user's groups and game's assigned groups is zero, then the user has no access to this game
 | 
				
			||||||
 | 
					    return count(array_intersect($game_data["groups"], $user_data["groups"])) !== 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ini_set('display_startup_errors', '1');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require_once "globals.php";
 | 
					require_once "globals.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (!file_exists(INSTALL_INDICATOR)) {
 | 
					if (!file_exists(INSTALL_INDICATOR)) {
 | 
				
			||||||
@ -18,12 +20,18 @@ require_once "groupmgr.php";
 | 
				
			|||||||
require_once "gamemgr.php";
 | 
					require_once "gamemgr.php";
 | 
				
			||||||
require_once "testmgr.php";
 | 
					require_once "testmgr.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_once "controller.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const MISSING_IMAGE_PLACEHOLDER = "media/image-missing_120px.png";
 | 
				
			||||||
function patch_through_image(string $gameid, string $img_url)
 | 
					function patch_through_image(string $gameid, string $img_url)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    $game_dir = get_game_dir_by_gameid($gameid);
 | 
					    $game_dir = get_game_dir_by_gameid($gameid);
 | 
				
			||||||
    $image_fetch_url = $game_dir . DIRECTORY_SEPARATOR . $img_url;
 | 
					    $image_fetch_url = $game_dir . DIRECTORY_SEPARATOR . $img_url;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $img_fp = fopen($image_fetch_url, "r");
 | 
					    $img_fp = fopen($image_fetch_url, "r");
 | 
				
			||||||
 | 
					    if ($img_fp === false) {
 | 
				
			||||||
 | 
					        $img_fp = fopen(MISSING_IMAGE_PLACEHOLDER, "r");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    fpassthru($img_fp);
 | 
					    fpassthru($img_fp);
 | 
				
			||||||
    fclose($img_fp);
 | 
					    fclose($img_fp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -122,9 +130,12 @@ switch ($action) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// test-related queries
 | 
					// test-related queries
 | 
				
			||||||
if (isset($_REQUEST["testid"]) && (($testid = trim($_REQUEST["testid"])) !== "") &&
 | 
					$is_a_default_test_with_access = isset($_REQUEST["testid"]) && (($testid = trim($_REQUEST["testid"])) !== "") &&
 | 
				
			||||||
    ((count($test_data = get_test($testid))) > 0) &&
 | 
					    ((count($test_data = get_test($testid))) > 0) && (($test_data["nickname"] === $nickname));
 | 
				
			||||||
    (($test_data["nickname"] === $nickname) || $is_quizmaster || is_user_contributor_to_game($test_data["gameid"], $nickname))) {
 | 
					
 | 
				
			||||||
 | 
					$user_is_contributor_or_quizmaster = $is_quizmaster || is_user_contributor_to_game($test_data["gameid"], $nickname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // update the test if timed
 | 
					    // update the test if timed
 | 
				
			||||||
    update_timed_tests([$test_data]);
 | 
					    update_timed_tests([$test_data]);
 | 
				
			||||||
@ -137,18 +148,6 @@ if (isset($_REQUEST["testid"]) && (($testid = trim($_REQUEST["testid"])) !== "")
 | 
				
			|||||||
                $result = json_encode($test_data_with_current_time);
 | 
					                $result = json_encode($test_data_with_current_time);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case "get_image":
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                $img_url = trim($_REQUEST["image_url"] ?: "");
 | 
					 | 
				
			||||||
                if ($img_url !== "") {
 | 
					 | 
				
			||||||
                    $gameid = $test_data["gameid"];
 | 
					 | 
				
			||||||
                    patch_through_image($gameid, $img_url);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch ($action) {
 | 
					 | 
				
			||||||
        case "save_answer":
 | 
					        case "save_answer":
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                $chidx = $_REQUEST["challenge_index"];
 | 
					                $chidx = $_REQUEST["challenge_index"];
 | 
				
			||||||
@ -164,6 +163,19 @@ if (isset($_REQUEST["testid"]) && (($testid = trim($_REQUEST["testid"])) !== "")
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// $user_has_access_to_game = does_user_access_game($nickname, $gameid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// get_image needs special treatment
 | 
				
			||||||
 | 
					if ($action === "get_image") {
 | 
				
			||||||
 | 
					    if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) { // default case
 | 
				
			||||||
 | 
					        $img_url = trim($_REQUEST["img_url"] ?: "");
 | 
				
			||||||
 | 
					        if ($img_url !== "") {
 | 
				
			||||||
 | 
					            $gameid = $test_data["gameid"];
 | 
				
			||||||
 | 
					            patch_through_image($gameid, $img_url);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// creator or quizmaster actions
 | 
					// creator or quizmaster actions
 | 
				
			||||||
if (($privilege !== PRIVILEGE_CREATOR) && ($privilege !== PRIVILEGE_QUIZMASTER)) {
 | 
					if (($privilege !== PRIVILEGE_CREATOR) && ($privilege !== PRIVILEGE_QUIZMASTER)) {
 | 
				
			||||||
    goto print_result;
 | 
					    goto print_result;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
function unix_time_to_human_readable(tunix) {
 | 
					function unix_time_to_human_readable(tunix, date_delim = ". ") {
 | 
				
			||||||
    const date = new Date(Number(tunix) * 1000);
 | 
					    const date = new Date(Number(tunix) * 1000);
 | 
				
			||||||
    return date.getFullYear() + ". " + String(date.getMonth() + 1).padStart(2, "0") + ". " + String(date.getDate()).padStart(2, "0") + ". "
 | 
					    return date.getFullYear() + date_delim + String(date.getMonth() + 1).padStart(2, "0") + date_delim + String(date.getDate()).padStart(2, "0") + ". "
 | 
				
			||||||
        + String(date.getHours()).padStart(2, "0") + ":" + String(date.getMinutes()).padStart(2, "0") + ":" + String(date.getSeconds()).padStart(2, "0");
 | 
					        + String(date.getHours()).padStart(2, "0") + ":" + String(date.getMinutes()).padStart(2, "0") + ":" + String(date.getSeconds()).padStart(2, "0");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -56,13 +56,13 @@ function start_or_continue_test(gameid) {
 | 
				
			|||||||
    request(req).then(resp => {
 | 
					    request(req).then(resp => {
 | 
				
			||||||
        if (resp.length > 0) // response is non-zero
 | 
					        if (resp.length > 0) // response is non-zero
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            open_test(resp);
 | 
					            open_test(resp, gameid);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function open_test(testid) {
 | 
					function open_test(testid, gameid) {
 | 
				
			||||||
    window.open("testground.php?testid=" + testid, "_new");
 | 
					    window.open(`testground.php?testid=${testid}&gameid=${gameid}`, "_new");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function list_corresponding_results(gameid) {
 | 
					function list_corresponding_results(gameid) {
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ function populate_infobox(test_data, view_only) {
 | 
				
			|||||||
        clearInterval(INTERVAL_HANDLE);
 | 
					        clearInterval(INTERVAL_HANDLE);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let test_concluded = TEST_DATA["state"] === "concluded";
 | 
					    let test_concluded = test_data["state"] === "concluded";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let game_nameS = document.getElementById("game_name");
 | 
					    let game_nameS = document.getElementById("game_name");
 | 
				
			||||||
    let durationS = document.getElementById("duration");
 | 
					    let durationS = document.getElementById("duration");
 | 
				
			||||||
@ -70,14 +70,23 @@ function populate_infobox(test_data, view_only) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function populate_challenges(test_data, view_only = false) {
 | 
					function assemble_answer_radio_id(challenge_N, answer_N) {
 | 
				
			||||||
 | 
					    return challenge_N + "_" + answer_N;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mark_answers(challenges, view_only = false) {
 | 
				
			||||||
 | 
					    for (let i = 0; i < challenges.length; i++) {
 | 
				
			||||||
 | 
					       let marked_answerR = document.getElementById(assemble_answer_radio_id(i, challenges[i]["player_answer"]));
 | 
				
			||||||
 | 
					       marked_answerR.checked = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function populate_challenges(challenges, concluded, view_only = false, gameid) {
 | 
				
			||||||
    let test_display = document.getElementById("test_display");
 | 
					    let test_display = document.getElementById("test_display");
 | 
				
			||||||
    test_display.innerHTML = "";
 | 
					    test_display.innerHTML = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let test_concluded = TEST_DATA["state"] === "concluded";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let challenge_N = 0;
 | 
					    let challenge_N = 0;
 | 
				
			||||||
    test_data["challenges"].forEach((challenge) => {
 | 
					    challenges.forEach((challenge) => {
 | 
				
			||||||
        let challenge_N_snapshot = challenge_N;
 | 
					        let challenge_N_snapshot = challenge_N;
 | 
				
			||||||
        let challenge_box = document.createElement("section");
 | 
					        let challenge_box = document.createElement("section");
 | 
				
			||||||
        challenge_box.classList.add("challenge");
 | 
					        challenge_box.classList.add("challenge");
 | 
				
			||||||
@ -90,7 +99,7 @@ function populate_challenges(test_data, view_only = false) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if (challenge["image_url"] !== "") {
 | 
					        if (challenge["image_url"] !== "") {
 | 
				
			||||||
            let qimg = document.createElement("img");
 | 
					            let qimg = document.createElement("img");
 | 
				
			||||||
            qimg.src = `interface.php?action=get_image&testid=${test_data["_id"]}&image_url=${challenge["image_url"]}`;
 | 
					            qimg.src = `interface.php?action=get_image&gameid=${gameid}&img_url=${challenge["image_url"]}`;
 | 
				
			||||||
            qimg.classList.add("question-image")
 | 
					            qimg.classList.add("question-image")
 | 
				
			||||||
            challenge_box.insertBefore(qimg, answer_container);
 | 
					            challenge_box.insertBefore(qimg, answer_container);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -110,19 +119,16 @@ function populate_challenges(test_data, view_only = false) {
 | 
				
			|||||||
            answer_radio.type = "radio";
 | 
					            answer_radio.type = "radio";
 | 
				
			||||||
            answer_radio.id = `${challenge_N}_${answer_N}`;
 | 
					            answer_radio.id = `${challenge_N}_${answer_N}`;
 | 
				
			||||||
            answer_radio.name = `challenge_${challenge_N}`;
 | 
					            answer_radio.name = `challenge_${challenge_N}`;
 | 
				
			||||||
            answer_radio.disabled = test_concluded || view_only;
 | 
					            answer_radio.disabled = concluded || view_only;
 | 
				
			||||||
            let answer_N_snapshot = answer_N;
 | 
					            let answer_N_snapshot = answer_N;
 | 
				
			||||||
            answer_radio.addEventListener("input", () => {
 | 
					            answer_radio.addEventListener("input", () => {
 | 
				
			||||||
                save_answer(challenge_N_snapshot, answer_N_snapshot);
 | 
					                save_answer(challenge_N_snapshot, answer_N_snapshot);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            if (player_answer === answer_N) {
 | 
					 | 
				
			||||||
                answer_radio.checked = true;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let answer_text = document.createElement("label");
 | 
					            let answer_text = document.createElement("label");
 | 
				
			||||||
            answer_text.innerHTML = preprocess_inserts(answer);
 | 
					            answer_text.innerHTML = preprocess_inserts(answer);
 | 
				
			||||||
            answer_text.setAttribute("for", answer_radio.id);
 | 
					            answer_text.setAttribute("for", answer_radio.id);
 | 
				
			||||||
            if (test_concluded && (challenge["correct_answer"] === answer_N)) {
 | 
					            if (concluded && (challenge["correct_answer"] === answer_N)) {
 | 
				
			||||||
                answer_text.classList.add("correct-answer")
 | 
					                answer_text.classList.add("correct-answer")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (player_answer !== challenge["correct_answer"]) {
 | 
					                if (player_answer !== challenge["correct_answer"]) {
 | 
				
			||||||
@ -143,7 +149,7 @@ function populate_challenges(test_data, view_only = false) {
 | 
				
			|||||||
    MathJax.typeset();
 | 
					    MathJax.typeset();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function populate_all(test_id, view_only) {
 | 
					function populate_all(test_id, gameid, view_only) {
 | 
				
			||||||
    let req = {
 | 
					    let req = {
 | 
				
			||||||
        action: "get_test",
 | 
					        action: "get_test",
 | 
				
			||||||
        view_only: view_only,
 | 
					        view_only: view_only,
 | 
				
			||||||
@ -151,7 +157,8 @@ function populate_all(test_id, view_only) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    request(req).then(resp => {
 | 
					    request(req).then(resp => {
 | 
				
			||||||
        TEST_DATA = JSON.parse(resp);
 | 
					        TEST_DATA = JSON.parse(resp);
 | 
				
			||||||
        populate_challenges(TEST_DATA, view_only);
 | 
					        let concluded = TEST_DATA["state"] === "concluded";
 | 
				
			||||||
 | 
					        populate_challenges(TEST_DATA["challenges"], concluded, view_only, gameid);
 | 
				
			||||||
        populate_infobox(TEST_DATA, view_only);
 | 
					        populate_infobox(TEST_DATA, view_only);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,12 +10,12 @@ if (!get_autologin_state() || !isset($_REQUEST["testid"])) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
$testid = trim($_REQUEST["testid"] ?: "");
 | 
					$testid = trim($_REQUEST["testid"] ?: "");
 | 
				
			||||||
$view_only = trim($_REQUEST["view_only"] ?: "false") === "true" ? true : false;
 | 
					$view_only = trim($_REQUEST["view_only"] ?: "false") === "true" ? true : false;
 | 
				
			||||||
 | 
					$gameid = trim($_REQUEST["gameid"] ?: "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ($testid === "") {
 | 
					if ($testid === "") {
 | 
				
			||||||
    exit();
 | 
					    exit();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!DOCTYPE html>
 | 
					<!DOCTYPE html>
 | 
				
			||||||
@ -64,7 +64,7 @@ if ($testid === "") {
 | 
				
			|||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    populate_all("<?=$testid ?>", <?=$view_only ?>);
 | 
					    populate_all("<?=$testid ?>", "<?=$gameid ?>", <?=$view_only ?>);
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										14
									
								
								testmgr.php
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								testmgr.php
									
									
									
									
									
								
							@ -15,18 +15,14 @@ function create_or_continue_test(string $gameid, string $nickname): string
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    global $testdb;
 | 
					    global $testdb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // get game and user data
 | 
					    // check if user has access to the specific game
 | 
				
			||||||
    $game_data = get_game($gameid);
 | 
					    if (!does_user_access_game($nickname, $gameid)) {
 | 
				
			||||||
    $user_data = get_user($nickname);
 | 
					 | 
				
			||||||
    if ((count($game_data) === 0) || (count($user_data) === 0)) {
 | 
					 | 
				
			||||||
        return "";
 | 
					        return "";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // check if this user has permission to take this test
 | 
					    // fetch game data
 | 
				
			||||||
    // if the intersection of user's groups and game's assigned groups is zero, then the user has no access to this game
 | 
					    $game_data = get_game($gameid);
 | 
				
			||||||
    if (count(array_intersect($game_data["groups"], $user_data["groups"])) === 0) {
 | 
					    $user_data = get_user($nickname);
 | 
				
			||||||
        return "";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // check if the user had taken this test before
 | 
					    // check if the user had taken this test before
 | 
				
			||||||
    $fetch_criteria = [["gameid", "=", (int)$gameid], "AND", ["nickname", "=", $nickname]];
 | 
					    $fetch_criteria = [["gameid", "=", (int)$gameid], "AND", ["nickname", "=", $nickname]];
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,8 @@
 | 
				
			|||||||
require_once "globals.php";
 | 
					require_once "globals.php";
 | 
				
			||||||
require_once "common_func.php";
 | 
					require_once "common_func.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_once "controller.php";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$userdb = new \SleekDB\Store(USERDB, DATADIR, ["timeout" => false]);
 | 
					$userdb = new \SleekDB\Store(USERDB, DATADIR, ["timeout" => false]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const PRIVILEGE_PLAYER = "player";
 | 
					const PRIVILEGE_PLAYER = "player";
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user