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 5.0KB

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