370 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			370 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
if (!LOGGED_IN) {
 | 
						|
    $title = "Log In";
 | 
						|
    $description = "Log in to update your existing submission for this vote.";
 | 
						|
    http_response_code(401);
 | 
						|
}
 | 
						|
 | 
						|
if (LOGGED_IN && isset($_GET["game"])) {
 | 
						|
    $sql = "SELECT * FROM submissions
 | 
						|
    WHERE game_id = :game_id AND member_id = :member_id";
 | 
						|
 | 
						|
    $stmt = $db["data"]->prepare($sql);
 | 
						|
    $stmt->execute([
 | 
						|
        "game_id" => $_GET["game"],
 | 
						|
        "member_id" => $_SESSION["account"]->id,
 | 
						|
    ]);
 | 
						|
 | 
						|
    $submission = $stmt->fetch(PDO::FETCH_OBJ);
 | 
						|
    if (!$submission) {
 | 
						|
        http_response_code(303);
 | 
						|
        header("Location: /games/" . $_GET["game"]);
 | 
						|
        die();
 | 
						|
    }
 | 
						|
 | 
						|
    $sql = "SELECT id, name, status_id FROM games
 | 
						|
    WHERE id = :id";
 | 
						|
 | 
						|
    $stmt = $db["data"]->prepare($sql);
 | 
						|
    $stmt->execute([
 | 
						|
        "id" => $_GET["game"],
 | 
						|
    ]);
 | 
						|
    $game = $stmt->fetch(PDO::FETCH_OBJ);
 | 
						|
 | 
						|
    define("GAME_IS_OPEN", $game->status_id === STATUS_ENROLLING);
 | 
						|
 | 
						|
    $title = "Update: {$game->name}";
 | 
						|
    $description = "Update your submission for the " . $game->name . " vote.";
 | 
						|
}
 | 
						|
 | 
						|
if ($_SERVER["REQUEST_METHOD"] === "POST"):
 | 
						|
    define("NEW_MANUSCRIPT", $_POST["keep-manuscript"] === "0");
 | 
						|
    define("EXISTING_MANUSCRIPT", $_POST["keep-manuscript"] === "1");
 | 
						|
    define(
 | 
						|
        "RULES_WERE_FOLLOWED",
 | 
						|
        isset($_POST["agree-toc"]) &&
 | 
						|
            $_POST["agree-toc"] === "1" &&
 | 
						|
            (isset($_POST["agree-guidelines"]) &&
 | 
						|
                $_POST["agree-guidelines"] === "1")
 | 
						|
    );
 | 
						|
    define("FILE_EMPTY", $_FILES["manuscript"]["size"] === 0);
 | 
						|
    define("FILE_TOO_BIG", $_FILES["manuscript"]["size"] > UPLOAD_MAX_FILESIZE);
 | 
						|
 | 
						|
    $stmt = $db["data"]->prepare("SELECT id FROM games WHERE id = :id");
 | 
						|
    $stmt->execute([
 | 
						|
        "id" => $_GET["game"],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $errors = [];
 | 
						|
 | 
						|
    if (!$stmt->fetch(PDO::FETCH_COLUMN)) {
 | 
						|
        $errors["game"] = "The chosen game doesn't exist.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (GAME_IS_OPEN && NEW_MANUSCRIPT && !RULES_WERE_FOLLOWED) {
 | 
						|
        $errors["agreements"] =
 | 
						|
            "Please accept the Terms & Conditions and the Submission Guidelines.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (GAME_IS_OPEN && NEW_MANUSCRIPT && FILE_EMPTY) {
 | 
						|
        $errors["filesize"] = "A file upload is required.";
 | 
						|
    } elseif (NEW_MANUSCRIPT && FILE_TOO_BIG) {
 | 
						|
        $errors["filesize"] = "Your document is too large.";
 | 
						|
    } elseif (GAME_IS_OPEN && NEW_MANUSCRIPT) {
 | 
						|
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
 | 
						|
        $mime_type = finfo_file($finfo, $_FILES["manuscript"]["tmp_name"]);
 | 
						|
        finfo_close($finfo);
 | 
						|
 | 
						|
        $PROPER_MIMETYPE = $mime_type === "application/pdf";
 | 
						|
    }
 | 
						|
 | 
						|
    if (isset($PROPER_MIMETYPE) && !$PROPER_MIMETYPE) {
 | 
						|
        $errors["mimetype"] = "Only PDF submissions are allowed.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (GAME_IS_OPEN && (!isset($_POST["title"]) || !trim($_POST["title"]))) {
 | 
						|
        $errors["title"] = "Please enter a title.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (GAME_IS_OPEN && !isset($_SESSION["account"])) {
 | 
						|
        $errors["account"] =
 | 
						|
            "We can't upload a document without knowing which account it belongs to.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (GAME_IS_OPEN && !isset($_POST["tx-id"])) {
 | 
						|
        $errors["payment"] = "You must submit a payment.";
 | 
						|
    }
 | 
						|
 | 
						|
    if (count($errors) > 0) {
 | 
						|
        http_response_code(400);
 | 
						|
        define(
 | 
						|
            "HAS_FILE_ERRORS",
 | 
						|
            isset($errors["filesize"]) || isset($errors["mimetype"])
 | 
						|
        );
 | 
						|
 | 
						|
        if (NEW_MANUSCRIPT && !HAS_FILE_ERRORS) {
 | 
						|
            $errors["upload"] =
 | 
						|
                "Fix all other errors and choose your file again.";
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
        $params = [
 | 
						|
            "submission_id" =>  $submission->id,
 | 
						|
            "title" => $_POST["title"],
 | 
						|
            "doc_is_public" => isset($_POST["public-doc"]) ? 1 : 0,
 | 
						|
            "name_is_public" => isset($_POST["public-name"]) ? 1 : 0,
 | 
						|
        ];
 | 
						|
 | 
						|
        if (GAME_IS_OPEN && NEW_MANUSCRIPT) {
 | 
						|
            $basename =
 | 
						|
                md5(microtime() . $game->id . $_SESSION["account"]->id) .
 | 
						|
                ".pdf";
 | 
						|
            $hash = md5(
 | 
						|
                $_SESSION["account"]->id . $game->id . microtime() . "salt"
 | 
						|
            );
 | 
						|
 | 
						|
            $file_destination = sprintf(
 | 
						|
                "%s/%s/%s",
 | 
						|
                DIRECTORY_DOCS,
 | 
						|
                $game->id,
 | 
						|
                $basename
 | 
						|
            );
 | 
						|
 | 
						|
            try {
 | 
						|
                $file_moved = move_uploaded_file(
 | 
						|
                    $_FILES["manuscript"]["tmp_name"],
 | 
						|
                    $file_destination
 | 
						|
                );
 | 
						|
 | 
						|
                if ($file_moved) {
 | 
						|
                    $stmt = $db["data"]->prepare(
 | 
						|
                        "SELECT basename FROM submissions WHERE id = :submission_id"
 | 
						|
                    );
 | 
						|
                    $stmt->execute([
 | 
						|
                        "submission_id" => $submission->id,
 | 
						|
                    ]);
 | 
						|
 | 
						|
                    $old_manuscript = sprintf(
 | 
						|
                        "%s/%s/%s",
 | 
						|
                        DIRECTORY_DOCS,
 | 
						|
                        $game->id,
 | 
						|
                        $stmt->fetch(PDO::FETCH_COLUMN)
 | 
						|
                    );
 | 
						|
                    unlink($old_manuscript);
 | 
						|
 | 
						|
                    $stmt = $db["data"]
 | 
						|
                        ->prepare("UPDATE submissions SET (title, basename, hash, doc_is_public, name_is_public, created_at)
 | 
						|
                        = (:title, :basename, :hash, :doc_is_public, :name_is_public, :created_at) WHERE id = :submission_id");
 | 
						|
 | 
						|
                    $params["basename"] = $basename;
 | 
						|
                    $params["hash"] = $hash;
 | 
						|
                    $params["created_at"] = date("Y-m-d\TH:i:s\Z");
 | 
						|
 | 
						|
                    $stmt->execute($params);
 | 
						|
 | 
						|
                    http_response_code(303);
 | 
						|
                    header("Location: /games/" . $_GET["game"]);
 | 
						|
                }
 | 
						|
            } catch (Exception $e) {
 | 
						|
                var_dump($e);
 | 
						|
                http_response_code(500);
 | 
						|
                unlink($file_destination);
 | 
						|
 | 
						|
                $errors["upload"] =
 | 
						|
                    "There was an error adding your submission to our database. Please try again.";
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (GAME_IS_OPEN && EXISTING_MANUSCRIPT) {
 | 
						|
            $stmt = $db["data"]
 | 
						|
                ->prepare("UPDATE submissions SET (title, doc_is_public, name_is_public)
 | 
						|
                = (:title, :doc_is_public, :name_is_public) WHERE id = :submission_id");
 | 
						|
 | 
						|
            $stmt->execute($params);
 | 
						|
 | 
						|
            http_response_code(303);
 | 
						|
            header("Location: /games/" . $_GET["game"]);
 | 
						|
        }
 | 
						|
        if (!GAME_IS_OPEN) {
 | 
						|
            $stmt = $db["data"]
 | 
						|
                ->prepare("UPDATE submissions SET (doc_is_public, name_is_public)
 | 
						|
                = (:doc_is_public, :name_is_public) WHERE id = :submission_id");
 | 
						|
 | 
						|
            $stmt->execute([
 | 
						|
                "submission_id" => $submission->id,
 | 
						|
                "doc_is_public" => isset($_POST["public-doc"]) ? 1 : 0,
 | 
						|
                "name_is_public" => isset($_POST["public-name"]) ? 1 : 0,
 | 
						|
            ]);
 | 
						|
 | 
						|
            http_response_code(303);
 | 
						|
            header("Location: /games/" . $_GET["game"]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
endif;
 | 
						|
 | 
						|
include "partials/head.php";
 | 
						|
?>
 | 
						|
    <body>
 | 
						|
        <?php include "partials/header.php"; ?>
 | 
						|
        <main id="main" class="flow">
 | 
						|
        <header>
 | 
						|
            <h1><?= $title ?></h1>
 | 
						|
        </header>
 | 
						|
            <?php if (!LOGGED_IN) {
 | 
						|
                include "partials/login-form.php";
 | 
						|
            } else {
 | 
						|
                if (GAME_IS_OPEN) { ?>
 | 
						|
                    <p><b>If you would like to withdraw your submission, please email us at <a href="mailto:sixfold@sixfold.org?subject=Withdraw Submission: <?= $game->name ?>">sixfold@sixfold.org</a>.</b></p>
 | 
						|
                <?php } else { ?>
 | 
						|
                    <p><b>This game's submissions are now locked, and you may only edit your work's public visibility.</b></p>
 | 
						|
                <?php } ?>
 | 
						|
                <div role="region" aria-labelledby="table-caption" tabindex="0">
 | 
						|
                <table>
 | 
						|
                    <caption id='table-caption'>Submission Details</caption>
 | 
						|
                    <thead>
 | 
						|
                        <tr>
 | 
						|
                            <th scope='col'>Submission ID</th>
 | 
						|
                            <th scope='col'>Transaction ID</th>
 | 
						|
                            <th scope='col'>Account ID</th>
 | 
						|
                        </tr>
 | 
						|
                    </thead>
 | 
						|
                    <tbody>
 | 
						|
                        <tr>
 | 
						|
                            <td><?= $submission->id ?></td>
 | 
						|
                            <td><?= $submission->transaction_id ?></td>
 | 
						|
                            <td><?= $_SESSION["account"]->id ?></td>
 | 
						|
                        </tr>
 | 
						|
                    </tbody>
 | 
						|
                </table>
 | 
						|
                </div>
 | 
						|
                <?php if (
 | 
						|
                    http_response_code() === 400 ||
 | 
						|
                    http_response_code() === 500
 | 
						|
                ) { ?>
 | 
						|
                     <aside class='alert'>
 | 
						|
                         <p>We found <?= count(
 | 
						|
                             $errors
 | 
						|
                         ) ?> error(s) with your submission. Please correct the errors provided by each field.</p>
 | 
						|
                     </aside>
 | 
						|
                 <?php } ?>
 | 
						|
                <?php
 | 
						|
                $doc_is_public = isset($_POST["public-doc"])
 | 
						|
                    ? (bool) $_POST["public-doc"]
 | 
						|
                    : $submission->doc_is_public;
 | 
						|
                $name_is_public = isset($_POST["public-name"])
 | 
						|
                    ? (bool) $_POST["public-name"]
 | 
						|
                    : $submission->name_is_public;
 | 
						|
                ?>
 | 
						|
                <form action="<?= $_SERVER[
 | 
						|
                    "REQUEST_URI"
 | 
						|
                ] ?>" method="post" enctype="multipart/form-data" class="flow">
 | 
						|
                    <?php if (
 | 
						|
                        isset($errors) &&
 | 
						|
                        isset($errors["account"])
 | 
						|
                    ) { ?><p><mark><?= $errors[
 | 
						|
    "account"
 | 
						|
] ?></mark></p><?php } ?>
 | 
						|
                <?php if (GAME_IS_OPEN) { ?>
 | 
						|
                    <fieldset class="flow">
 | 
						|
                        <legend>Manuscript details</legend>
 | 
						|
                    <label>
 | 
						|
                        <span>Title of Work</span>
 | 
						|
                        <?php if (
 | 
						|
                            isset($errors) &&
 | 
						|
                            isset($errors["title"])
 | 
						|
                        ) { ?><span><mark><?= $errors[
 | 
						|
    "title"
 | 
						|
] ?></mark></span><?php } ?>
 | 
						|
                        <input type="text" name="title" value='<?= $_POST[
 | 
						|
                            "title"
 | 
						|
                        ] ?? $submission->title ?>'/>
 | 
						|
                    </label>
 | 
						|
                    <input type='radio' name='keep-manuscript' id='keep-existing' value='1' <?= !isset(
 | 
						|
                        $_POST["keep-manuscript"]
 | 
						|
                    ) ||
 | 
						|
                    (isset($_POST["keep-manuscript"]) &&
 | 
						|
                        $_POST["keep-manuscript"] === "1")
 | 
						|
                        ? "checked"
 | 
						|
                        : "" ?>/><label for='keep-existing'>Keep existing manuscript</label><br/>
 | 
						|
                    <input type='radio' name='keep-manuscript' id='upload-new' value='0' <?= isset(
 | 
						|
                        $_POST["keep-manuscript"]
 | 
						|
                    ) && NEW_MANUSCRIPT
 | 
						|
                        ? "checked"
 | 
						|
                        : "" ?>/><label for='upload-new'>Upload new manuscript</label>
 | 
						|
                    <label id='manuscript'>
 | 
						|
                        <span>Manuscript PDF <small>(6MB limit)</small></span>
 | 
						|
                        <?php if (
 | 
						|
                            isset($errors) &&
 | 
						|
                            isset($errors["upload"])
 | 
						|
                        ) { ?><span><mark><?= $errors[
 | 
						|
    "upload"
 | 
						|
] ?></mark></span><?php } ?>
 | 
						|
                        <?php if (
 | 
						|
                            isset($errors) &&
 | 
						|
                            isset($errors["filesize"])
 | 
						|
                        ) { ?><span><mark><?= $errors[
 | 
						|
    "filesize"
 | 
						|
] ?></mark></span><?php } ?>
 | 
						|
                        <?php if (
 | 
						|
                            isset($errors) &&
 | 
						|
                            isset($errors["mimetype"])
 | 
						|
                        ) { ?><span><mark><?= $errors[
 | 
						|
    "mimetype"
 | 
						|
] ?></mark></span><?php } ?>
 | 
						|
                        <input type="file" name="manuscript" accept="application/pdf"/>
 | 
						|
                    </label>
 | 
						|
                    <div id='guidelines'>
 | 
						|
                        <?php if (
 | 
						|
                            isset($errors) &&
 | 
						|
                            isset($errors["agreements"])
 | 
						|
                        ) { ?><span><mark><?= $errors[
 | 
						|
    "agreements"
 | 
						|
] ?></mark></span><?php } ?>
 | 
						|
                        <label>
 | 
						|
                            <input type="checkbox" name="agree-toc" value="1" <?= isset(
 | 
						|
                                $_POST["agree-toc"]
 | 
						|
                            )
 | 
						|
                                ? "checked"
 | 
						|
                                : "" ?>/>
 | 
						|
                            <span>I agree to <i>Sixfold</i>'s <a href="/terms-and-conditions" target="_blank">terms and conditions</a></span>
 | 
						|
                        </label>
 | 
						|
                        <label>
 | 
						|
                            <input type="checkbox" name="agree-guidelines" value="1" <?= isset(
 | 
						|
                                $_POST["agree-guidelines"]
 | 
						|
                            )
 | 
						|
                                ? "checked"
 | 
						|
                                : "" ?>/>
 | 
						|
                            <span>I confirm that the submitted manuscript meets the <strong></strong><a href="/how-it-works/submission-guidelines" target="_blank">submission guidelines</a></span>
 | 
						|
                        </label>
 | 
						|
                    </div>
 | 
						|
                    </fieldset>
 | 
						|
                    <?php } ?>
 | 
						|
                    <fieldset>
 | 
						|
                        <legend>Privacy settings</legend>
 | 
						|
                        <label>
 | 
						|
                            <input type="checkbox" name="public-name" value="1" <?= $name_is_public
 | 
						|
                                ? "checked"
 | 
						|
                                : "" ?>/>
 | 
						|
                            <span>Display my name in the public results</span>
 | 
						|
                            </label>
 | 
						|
                            <label>
 | 
						|
                            <input type='checkbox' name='public-doc' value='1' <?= $doc_is_public
 | 
						|
                                ? "checked"
 | 
						|
                                : "" ?>/>
 | 
						|
                            <span>Display my document in the public results</span>
 | 
						|
                            </label>
 | 
						|
                    </fieldset>
 | 
						|
                     <?php if (GAME_IS_OPEN) { ?>
 | 
						|
                    <fieldset>
 | 
						|
                        <legend>Payment</legend>
 | 
						|
                    <div class="flow">
 | 
						|
                        <p><b>You have already paid for this submission.</b> (Transaction ID: <?= $submission->transaction_id ?>)</p>
 | 
						|
                        <input type="hidden" name="tx-id" value="<?= $submission->transaction_id ?>"/>
 | 
						|
                    </fieldset>
 | 
						|
                     <?php } ?>
 | 
						|
                    <button type="submit">Update submission</button>
 | 
						|
                </form>
 | 
						|
            <?php
 | 
						|
            } ?>
 | 
						|
        </main>
 | 
						|
    <?php include "partials/footer.php"; ?>
 |