Webbserverprogrammering 1

Show sourcecode

The following files exists in this folder. Click to view.

Webserver1/Ovningar/Slutprojekt/

.env
DEBUG/
Media/
account.js
account.php
callback_log.txt
change_account_details.php
composer.json
composer.lock
forgot_pass.php
forgot_pass_new_pass.php
header.php
index.php
login.php
mediaplayer.php
node_modules/
package-lock.json
package.json
signup.php
style.css
upload.js
upload_callback.php
upload_callback_simulated.php
upload_chunk.php
upload_errors.log
upload_form.php
upload_handler.php
upload_success.log
vendor/
verify_file.php
verifypage.php

account.php

409 lines UTF-8 Windows (CRLF)
<?php
session_start
();

ini_set('display_errors'1);
ini_set('display_startup_errors'1);
error_reporting(E_ALL);

if (isset(
$_GET['logout']) && $_GET['logout'] == 1) {
  
$_SESSION = [];
}

$user_id $_SESSION["userId"] ?? null;

if (!
$user_id) {
  
header("Location:login.php");
  exit;
}

/**
 * @var PDO $dbconn
 * @var bool $local
 * @var class DBManager
 */
include('../../incl/dbconnection.php');

$dbmanager = new DBManager();

$update_title $_POST['update-title'] ?? null;
$update_desc $_POST['update-desc'] ?? null;
$update_row_id $_POST['update-row-id'] ?? null;

$IS_ADMIN $_SESSION['isAdmin'] ?: false;

// Admin SQL konsol
if ($IS_ADMIN) {
  
$sql $_POST['ADMIN-SQL'] ?? null;
  if (
$sql) {
    try {
      
// Kolla om det är en SELECT
      
if (stripos(trim($sql), 'select') === 0) {
        
$stmt $dbconn->query($sql);
        
$rows $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo 
"<pre>";
        
print_r($rows);
        echo 
"</pre>";
      } else {
        
$affected $dbconn->exec($sql);
        echo 
"Påverkade rader: " $affected;
      }
    } catch (
PDOException $e) {
      echo 
"Fel: " $e->getMessage();
    }
  }
}

if (isset(
$_POST['delete'])) {
  
$delete_row_id $_POST['update-row-id'] ?? null;
  if (
$delete_row_id == "-1" || !$delete_row_id) {
    echo 
"Felaktigt id.";
  } else {
    
// Fetch the file paths before deleting
    
$media_row $dbmanager->fetch_from_table(
      [
"href_video""href_thumb"],
      
"bay_media",
      [
"id" => $delete_row_id]
    );
    if (
count($media_row) > 0) {
      
$href_video $media_row[0]['href_video'];
      
$href_thumb $media_row[0]['href_thumb'];

      
// Delete the files if they exist
      
if ($href_video && file_exists($href_video)) {
        
unlink($href_video);
      }
      if (
$href_thumb && file_exists($href_thumb)) {
        
unlink($href_thumb);
      }
    }

    
$dbmanager->remove_from_table("bay_media", ["id" => $delete_row_id]);
    
$_SESSION['flash_msg'] = "Raderade video med id $delete_row_id.";
    
header("Location: account.php"true303);
    exit;
  }
}

if (
$update_title || $update_desc) {
  if (
$update_row_id == "-1") {
    echo 
"Något gick fel, ogiltigt id. Inga ändringar har gjorts.";
  } else {
    
$dbmanager->update_table_values(
      
"bay_media",
      [
        
"title" => $update_title,
        
"description" => $update_desc
      
],
      [
        
"id" => $update_row_id
      
]
    );

    
$_SESSION['flash_msg'] = "Ändrade rad med id $update_row_id.";

    
// PRG
    
header("Location: account.php"true303);
    exit;
  }
}

?>
<!DOCTYPE html>
<html lang="sv">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Konto</title>
  <link rel="stylesheet" href="style.css">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <style>
    table,
    tbody,
    thead,
    td {
      border: 1px solid white;
    }

    tr:not(:has(th)) {
      cursor: pointer;
    }

    tr:not(:has(th)):hover {
      background-color: rgb(71, 77, 97);
    }
  </style>
</head>

<body>
  <?php include("./header.php"?>

  <?php
  
if (isset($_SESSION['flash_msg'])) {
    echo 
$_SESSION['flash_msg'];
    unset(
$_SESSION['flash_msg']);
  }
  
?>

  <main id="accountpage-main">
    <div>
      <h1>Hallå där, <?php echo $_SESSION['username']; ?></h1>
      <p>Vill du byta lösenord? <a style="background-color:lightgray" href="change_account_details.php">Byt lösenord</a></p>
      <p>Vill du logga ut? <a style="background-color:lightgray" href="account.php?logout=1">Logga ut</a></p>
      <h2>Dina uppladdade videos</h2>
      <table id="uploaded-media-table">
        <thead>
          <tr>
            <th>
              ID
            </th>
            <th>
              MEDIA_ID
            </th>
            <th>
              TITEL
            </th>
            <th>
              BESKRIVNING
            </th>
            <th>
              VÄNTAR PÅ GODKÄNNANDE?
            </th>
          </tr>
        </thead>
        <tbody>
          <?php
          $uploads 
$dbmanager->fetch_from_table(
            [
"*"],
            
"bay_media",
            [
              
"uploaded_by_user_id" => $_SESSION['userId']
            ]
          );
          if (
count($uploads) == 0) {
            echo 
"Du har inte laddat upp något än!";
          } else {
            foreach (
$uploads as $row) {
          
?>
              <tr class="row"
                data-row_id="<?php echo $row['id']; ?>"
                data-href_thumb="<?php echo $row['href_thumb']; ?>"
                data-title="<?php echo $row['title']; ?>"
                data-desc="<?php echo $row['description']; ?>">
                <?php
                
foreach ($row as $colname => $colval) {
                  if (
in_array($colname, ['href_video''href_thumb''uploaded_by_user_id'])) {
                    continue;
                  }
                  
$val $colval;
                  if (
$colname == "hidden") {
                    
$val $colval "JA" "NEJ";
                  }
                
?>
                  <td><?php echo $val ?></td>
                <?php
                
}
                
?>
              </tr>
          <?php
            
}
          }
          
?>
        </tbody>
      </table>
    </div>
    <form id="manage-window" class="hidden" method="post">
      <input id="update-row-id" name="update-row-id" type="hidden">
      <a id="manage-videolink" href="">
        <img id="manage-thumb" src="" alt="Tumnagel på video">
      </a>
      <div class="row">
        <label for="update-title">Titel:</label>
        <input id="update-title" maxlength="50" name="update-title" type="text">
      </div>
      <div class="row">
        <label for="update-desc">Beskrivning:</label>
        <textarea id="update-desc" maxlength="300" name="update-desc" type="text" rows="5"></textarea>
      </div>
      <input type="submit" value="Uppdatera">
      <input type="submit" name="delete" id="delete-btn" value="Ta bort">
    </form>

    <div id="watched-media-table">
      <h2>Din titthistorik</h2>
      <table>
        <thead>
          <tr>
            <th>
              VIDEO
            </th>
            <th>
              SKAPAD AV
            </th>
            <th>
              SENAST KOLLAT
            </th>
          </tr>
        </thead>
        <tbody>
          <?php
          $watched 
$dbmanager->fetch_from_table(
            [
              
"bay_watch_history.last_watched",
              
"m.title",
              
"m.id",
              
"u.username"
            
],
            
"bay_watch_history",
            [
              
"user_id" => $user_id
            
],
            [
              [
                
"type" => "INNER",
                
"table" => "bay_media",
                
"alias" => "m",
                
"condition" => "bay_watch_history.media_id = m.id"
              
],
              [
                
"type" => "INNER",
                
"table" => "bay_users",
                
"alias" => "u",
                
"condition" => "m.uploaded_by_user_id = u.id"
              
]
            ],
            -
1,
            
"bay_watch_history.last_watched DESC"
          
);
          if (
count($watched) == 0) {
            echo 
"Du har inte kollat på något än!";
          } else {
            foreach (
$watched as $row) {
          
?>
              <tr class="row"
                data-row_id="<?php echo $row['id']; ?>">
                <td>
                  <?php echo $row['title']; ?>
                </td>
                <td>
                  <?php echo $row['username']; ?>
                </td>
                <td>
                  <?php echo $row['last_watched']; ?>
                </td>
              </tr>
          <?php
            
}
          }
          
?>
        </tbody>
      </table>
    </div>

    <?php
    
if (isset($_SESSION['isAdmin']) && $_SESSION['isAdmin'] == true):
    
?>
      <form method="post" style="grid-column: span 2;">
        <div>
          <h2>Ännu ej godkända videos</h2>
          <table>
            <thead>
              <tr>
                <th>
                  ID
                </th>
                <th>
                  MEDIA_ID
                </th>
                <th>
                  TITEL
                </th>
                <th>
                  BESKRIVNING
                </th>
                <th>
                  VÄNTAR PÅ GODKÄNNANDE?
                </th>
              </tr>
            </thead>
            <tbody>
              <?php
              $uploads 
$dbmanager->fetch_from_table(
                [
"*"],
                
"bay_media",
                [
                  
"hidden" => 1
                
]
              );
              if (
count($uploads) == 0) {
                echo 
"Du har inte laddat upp något än!";
              } else {
                foreach (
$uploads as $row) {
              
?>
                  <tr class="row unapproved"
                    data-row_id="<?php echo $row['id']; ?>"
                    data-href_thumb="<?php echo $row['href_thumb']; ?>"
                    data-title="<?php echo $row['title']; ?>"
                    data-desc="<?php echo $row['description']; ?>">
                    <?php
                    
foreach ($row as $colname => $colval) {
                      if (
in_array($colname, ['href_video''href_thumb''uploaded_by_user_id'])) {
                        continue;
                      }
                      
$val $colval;
                      if (
$colname == "hidden") {
                        
$val $colval "JA" "NEJ";
                      }
                    
?>
                      <td><?php echo $val ?></td>
                    <?php
                    
}
                    
?>
                  </tr>
              <?php
                
}
              }
              
?>
            </tbody>
          </table>
        </div>
        <textarea name="ADMIN-SQL" id="ADMIN-SQL" cols="60" rows="10"
        placeholder="Möjlighet till att köra SQL kod (VAR FÖRSIKTIG!)
För att godkänna video:
UPDATE bay_media SET hidden=0 WHERE id=<id>"></textarea>
        <input type="submit" id="execute-SQL-btn" value="Kör SQL">
      </form>
      <script>
        const execBtn = document.getElementById("execute-SQL-btn");
        const SQLInput = document.getElementById("ADMIN-SQL");
        const unapprovedRows = document.querySelectorAll("tr.row.unapproved");

        execBtn.addEventListener("click", (e) => {
          const SQLCode = SQLInput.value;
          if (!confirm("Du har valt att köra kommandot: " + SQLCode + "\nÄr du säker?")) {
            e.preventDefault();
          }
          if (SQLCode.match('/DELETE|DROP|TRUNCATE/gi')) {
            if (!confirm("Ditt kommando kommer att ta bort värden eller en hel tabell, är du helt säker på att du vill fortsätta?")) {
              e.preventDefault();
            }
          }
        });

        unapprovedRows.forEach(row => {
          row.addEventListener("click", () => {
            window.location.href = MediaplayerURL + row.dataset.row_id || "";
          })
        });

      </script>
    <?php
    
endif
    
?>
  </main>

  <script src="account.js"></script>
</body>

</html>