Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

configure.php 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. define('BASE', __DIR__);
  3. define('BASEURL', $_SERVER['SERVER_NAME']);
  4. require_once(BASE . '/inc/db.php');
  5. require_once(BASE . '/inc/user.php');
  6. $required = ['db-host', 'db-username', 'db-password', 'db-database', 'flyers-user', 'flyers-password'];
  7. function test_config($params) {
  8. global $required, $db, $user;
  9. if (!empty($params) && count($params) != count($required))
  10. return "All fields are required";
  11. mysqli_report(MYSQLI_REPORT_OFF);
  12. $mysql = mysqli_connect($params['db-host'], $params['db-username'], $params['db-password']);
  13. if (!$mysql)
  14. return "Unable to connect to the database.";
  15. mysqli_select_db($mysql, $params['db-database']);
  16. if (mysqli_error($mysql))
  17. return "Unable to access database '" . htmlspecialchars($params['db-database']) . "': " . mysqli_error($mysql);
  18. mysqli_multi_query($mysql, "
  19. CREATE TABLE IF NOT EXISTS `members` (
  20. `skymanager_id` integer NOT NULL PRIMARY KEY,
  21. `name` varchar(128) NOT NULL,
  22. `username` varchar(64) NOT NULL,
  23. `voting_id` int DEFAULT NULL UNIQUE,
  24. `email` varchar(128) DEFAULT NULL,
  25. `pollworker` BOOLEAN NOT NULL DEFAULT false,
  26. `checkedin` BOOLEAN NOT NULL DEFAULT false);
  27. CREATE TABLE IF NOT EXISTS `proxy` (
  28. `voting_id` integer NOT NULL,
  29. `delegate_id` integer NOT NULL,
  30. PRIMARY KEY (`voting_id`, `delegate_id`));
  31. CREATE TABLE IF NOT EXISTS `positions` (
  32. `position` varchar(64) NOT NULL PRIMARY KEY,
  33. `description` varchar(128) NOT NULL UNIQUE,
  34. `active` BOOLEAN NOT NULL DEFAULT false
  35. );
  36. CREATE TABLE IF NOT EXISTS `votes` (
  37. `candidate_id` integer NOT NULL,
  38. `position` varchar(64) NOT NULL,
  39. `member_id` integer NOT NULL,
  40. `vote_type` enum('IN PERSON','ONLINE','PROXY IN PERSON','PROXY ONLINE','UNANIMOUS') NOT NULL DEFAULT 'ONLINE',
  41. `submitted_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  42. `submitter_id` integer NOT NULL,
  43. PRIMARY KEY (`position`,`member_id`),
  44. FOREIGN KEY (`position`) REFERENCES `positions` (`position`) ON DELETE CASCADE)
  45. ");
  46. do {
  47. if (mysqli_error($mysql))
  48. return "Unable to set up tables: " . mysqli_error($mysql);
  49. } while (mysqli_next_result($mysql) || mysqli_error($mysql));
  50. $db = DBHandler::wrap($mysql);
  51. $success = $user->login($params['flyers-user'], $params['flyers-password']);
  52. if (!$success)
  53. return "Login Failed";
  54. $db->query("UPDATE members SET `pollworker`=TRUE where skymanager_id=" . ((int) $user->getUserId()));
  55. if ($db->getError())
  56. return "Failed to update user permissions";
  57. $conf = json_encode([
  58. 'host' => $params['db-host'],
  59. 'user' => $params['db-username'],
  60. 'pass' => $params['db-password'],
  61. 'db' => $params['db-database']
  62. ], JSON_PRETTY_PRINT);
  63. if (file_put_contents(BASE . "/inc/config.json", $conf) === false)
  64. return "Failed to write configuration.";
  65. return false;
  66. }
  67. $params = [];
  68. foreach ($required as $field) {
  69. if (array_key_exists($field, $_POST) && !empty($_POST[$field]))
  70. $params[$field] = $_POST[$field];
  71. }
  72. $error = null;
  73. if (!empty($params))
  74. $error = test_config($params);
  75. if ($error === false) {
  76. header('Location: /index.php');
  77. die();
  78. }
  79. ?>
  80. <!doctype html>
  81. <html>
  82. <head>
  83. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
  84. <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@400;600;800&display=swap" />
  85. <link rel="stylesheet" type="text/css" href="/styles/style.css" />
  86. </head>
  87. <body>
  88. <div id="container">
  89. <div class="header">
  90. <h1>Michigan Flyers</h1>
  91. <h2>Voting System Setup</h2>
  92. </div>
  93. <div class="content">
  94. <div class="page">
  95. <?php if(!empty($error)) echo "<span class=\"errormessage\">$error</span>"; ?>
  96. <form action="configure.php" method="POST">
  97. <div class="form-section">
  98. <h3>Database Setup</h3>
  99. <div class="form-row">
  100. <label for="db-host">Host</label>
  101. <input type="text" id="db-host" name="db-host" value="localhost" />
  102. </div>
  103. <div class="form-row">
  104. <label for="db-database">Database Name</label>
  105. <input type="text" id="db-database" name="db-database" />
  106. </div>
  107. <div class="form-row">
  108. <label for="db-username">Username</label>
  109. <input type="text" id="db-username" name="db-username" />
  110. </div>
  111. <div class="form-row">
  112. <label for="db-password">Password</label>
  113. <input type="password" id="db-password" name="db-password" />
  114. </div>
  115. </div>
  116. <div class="form-section">
  117. <h3>Flyers Access Setup</h3>
  118. <div class="form-row">
  119. <label for="flyers-user">Voting Administrator</label>
  120. <input type="text" id="flyers-user" name="flyers-user" />
  121. </div>
  122. <div class="form-row">
  123. <label for="flyers-password">Password</label>
  124. <input type="password" name="flyers-password" />
  125. </div>
  126. <div class="form-row">
  127. <input type="submit" name="login" value="Setup!" />
  128. </div>
  129. </div>
  130. </form>
  131. </div>
  132. </div>
  133. </div>
  134. </body>
  135. </html>