-
Notifications
You must be signed in to change notification settings - Fork 0
/
accounts.php
97 lines (95 loc) · 4.22 KB
/
accounts.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
die('<h1>STALP HECKING</h1>');
}
function userinfo(int $id): ?object {
if (!is_dir(__DIR__ . "/users/data/$id")) return null;
return json_decode(file_get_contents(__DIR__ . "/users/data/$id/user.json"));
}
/*
Return codes:
true: success
false: faliure - username taken
*/
require_once __DIR__ . "/log/log.php";
function createAccount(string $username, string $password, array $groups = array()): bool {
$currentUID = json_decode(file_get_contents(__DIR__ . '/users/currentID.json'));
fwrite(fopen(__DIR__ . '/users/currentID.json', 'w+'), $currentUID + 1);
$name2id = json_decode(file_get_contents(__DIR__ . '/users/name2ID.json'));
if (isset($name2id->$username)) return false;
$name2id->$username = $currentUID;
fwrite(fopen(__DIR__ . '/users/name2ID.json', 'w+'), json_encode($name2id));
mkdir(__DIR__ . "/users/data/$currentUID", 0777, true);
$user = new stdClass;
$user->creationDate = time();
$user->username = $username;
$user->password = password_hash($password, PASSWORD_DEFAULT);
foreach ($groups as $group) {
$group2id = json_decode(file_get_contents(__DIR__ . "/users/group2ID.json"));
new logEntry($currentUID, $currentUID, null, "userGroupChange", "+$group", "Automatically added while creating account");
if (isset($group2id->$group)) {
$id = $group2id->$group;
$groupInfo = json_decode(file_get_contents(__DIR__ . "/users/groups/$id/info.json"));
array_push($groupInfo->members, $currentUID);
fwrite(fopen(__DIR__ . "/users/groups/$id/info.json", "w+"), json_encode($groupInfo));
continue;
}
new logEntry($currentUID, $currentUID, null, "userGroupCreated", "Name: $group", "Group created while creating account");
$currentGroupID = json_decode(file_get_contents(__DIR__ . "/users/currentGroupID.json"));
$group2id->$group = $currentGroupID;
fwrite(fopen(__DIR__ . "/users/group2ID.json", "w+"), json_encode($group2id));
fwrite(fopen(__DIR__ . "/users/currentGroupID.json", "w+"), $currentGroupID + 1);
mkdir(__DIR__ . "/users/groups/$currentGroupID", 0777, true);
$groupi = new stdClass;
$groupi->name = $group;
$groupi->created = time();
$groupi->members = array($currentUID);
fwrite(fopen(__DIR__ . "/users/groups/$currentGroupID/info.json", "w+"), json_encode($groupi));
}
new logEntry($currentUID, null, null, "userCreated", "User $username was created", "Created using the createAccount PHP function");
$group2id = json_decode(file_get_contents(__DIR__ . "/users/group2ID.json"));
$groupIDarray = array();
foreach ($groups as $group) array_push($groupIDarray, $group2id->$group);
$user->groups = $groupIDarray;
fwrite(fopen(__DIR__ . "/users/data/$currentUID/user.json", "w+"), json_encode($user));
return true;
}
/*
Return values:
0 - success
1 - bad username
2 - bad password
*/
function login(string $username, string $password): int {
$user2id = json_decode(file_get_contents(__DIR__ . '/users/name2ID.json'));
if (!isset($user2id->$username)) return 1;
$userid = $user2id->$username;
$passwordJSON = json_decode(file_get_contents(__DIR__ . "/users/data/$userid/user.json"));
$hash = $passwordJSON->password;
if (password_verify($password, $hash)) {
$_SESSION['username'] = $username;
$_SESSION['userid'] = $userid;
return 0;
}
return 2;
}
function userlink(string $username): string {
$user = htmlspecialchars($username);
require_once __DIR__ . "/markdown/parsedown/mediawikilike.php";
return wikilinks("[[User:$user|$user]] ([[User talk:$user|leave a message]])");
}
function getUserGroups(?int $user, bool $plain = false): ?array {
if (!isset($user)) return array();
if (!userinfo($user)) return null;
$groups = userinfo($user)->groups;
$gr = array();
foreach ($groups as $group) {
$info = json_decode(file_get_contents(__DIR__ . "/users/groups/$group/info.json"));
if ($plain) {
array_push($gr, $info->name);
continue;
}
array_push($gr, $info);
}
return $gr;
}