helpdesk.php

main 94 lines · 3.1 KB Raw
Alex Alex Commit Initial commit 01/10/2026 09:20
1<?php
2require_once 'engine/init.php';
3protect_page();
4theme_open();
5
6$view = (isset($_GET['view']) && (int)$_GET['view'] > 0) ? (int)$_GET['view'] : false;
7if ($view !== false) {
8 if (!empty($_POST['reply_text'])) {
9
10 // Save ticket reply on database
11 $query = array(
12 'tid' => $view,
13 'username'=> getValue($_POST['username'] ?? null),
14 'message' => getValue($_POST['reply_text'] ?? null),
15 'created' => time(),
16 );
17 $fields = '`'. implode('`, `', array_keys($query)) .'`';
18 $placeholders = implode(', ', array_fill(0, count($query), '?'));
19 db()->execute("INSERT INTO `znote_tickets_replies` ($fields) VALUES ($placeholders)", array_values($query));
20 db()->execute("UPDATE `znote_tickets` SET `status` = 'Player-Reply' WHERE `id` = ? LIMIT 1;", [$view]);
21 }
22 $ticketData = db()->fetchOne("SELECT * FROM znote_tickets WHERE id = ? LIMIT 1;", [$view]);
23
24 if(!$ticketData || $ticketData['owner'] != $session_user_id) {
25 echo t('helpdesk.no_access');
26 theme_close();
27 die;
28 }
29 $replies = db()->fetchAll("SELECT * FROM znote_tickets_replies WHERE tid = ? ORDER BY `created`;", [$view]);
30 view('helpdesk_ticket');
31} else {
32
33 $account = db()->fetchOne("SELECT name,email FROM accounts WHERE id = ?", [$session_user_id]);
34 if (!is_array($account)) $account = array();
35 $account += array('name' => '', 'email' => '');
36 if (!empty($_POST)) {
37 $required_fields = array('username', 'email', 'subject', 'message');
38 foreach($_POST as $key=>$value) {
39 if (empty($value) && in_array($key, $required_fields) === true) {
40 $errors[] = t('reg.fill_all');
41 break 1;
42 }
43 }
44
45 // check errors (= user exist, pass long enough
46 if (empty($errors) === true) {
47 /* Token used for cross site scripting security */
48 if (!Token::isValid($_POST['token'])) {
49 $errors[] = t('login.token_invalid');
50 }
51 if ($config['use_captcha']) {
52 if(!verifyGoogleReCaptcha($_POST['g-recaptcha-response'])) {
53 $errors[] = t('reg.captcha');
54 }
55 }
56 // Reversed this if, so: first check if you need to validate, then validate.
57 if ($config['validate_IP'] === true && validate_ip(getIP()) === false) {
58 $errors[] = t('reg.bad_ip');
59 }
60 }
61 }
62 $tickets = db()->fetchAll("SELECT id,subject,creation,status FROM znote_tickets WHERE owner = ? ORDER BY creation DESC", [$session_user_id]);
63
64 $helpdeskCreated = isset($_GET['success']) && empty($_GET['success']);
65
66 if (!$helpdeskCreated && empty($_POST) === false && empty($errors) === true) {
67 if ($config['log_ip']) {
68 znote_visitor_insert_detailed_data(1);
69 }
70
71 //Save ticket on database
72 $query = array(
73 'owner' => $session_user_id,
74 'username'=> getValue($_POST['username'] ?? null),
75 'subject' => getValue($_POST['subject'] ?? null),
76 'message' => getValue($_POST['message'] ?? null),
77 'ip' => getIPLong(),
78 'creation' => time(),
79 'status' => 'Open'
80 );
81
82 $fields = '`'. implode('`, `', array_keys($query)) .'`';
83 $placeholders = implode(', ', array_fill(0, count($query), '?'));
84 db()->execute("INSERT INTO `znote_tickets` ($fields) VALUES ($placeholders)", array_values($query));
85
86 header('Location: helpdesk.php?success');
87 exit();
88 }
89
90 view('helpdesk_list', ['helpdeskCreated' => $helpdeskCreated]);
91}
92theme_close();
93?>
94
Top