Skip to content

Commit

Permalink
Cập nhật lên 0.0.2
Browse files Browse the repository at this point in the history
  • Loading branch information
Belikhun committed Aug 28, 2018
1 parent 0f4bc3a commit 8d215df
Show file tree
Hide file tree
Showing 22 changed files with 712 additions and 370 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
data/css/* linguist-vendored
lib/* linguist-vendored=false
15 changes: 15 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:80",
"webRoot": "${workspaceFolder}"
}
]
}
37 changes: 28 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,41 @@
<img src="https://lh3.googleusercontent.com/GGuTHy37pp8qJTtirJQL-jQw4GHlsKfCTAt8_NHsmy3jTquS3AYcODCvEXvYH1hBz6Wm43NV__l6zTsAX9izIeiOe_aysK-LKYBtHZce5j5mkMp-yqfm270_NEmVLqoZLmn7pbpCPw=w2400">
</p>

Được viết bằng PHP và JavaScript. Dự án không sử dụng library khác như jQuery, Bootstrap, etc...
Được viết bằng PHP và JavaScript. Dự án không sử dụng library khác như jQuery, Bootstrap,...

- [Yêu cầu](##Yêu-cầu)
- [Tính năng](##Tính-năng)
- [Cài đặt](##Cài-đặt)
- [Cấu hình](##Cấu-hình)
- [config.php](###config.php)
- [Tài khoản](###Tài-khoản)
- [Cập nhật 0.0.2](###Thay-đổi-trong-0.0.2)

## Yêu cầu
- PHP/7 trở lên
- Apache/2 trở lên

## Tính năng
### Nộp bài làm bằng cách kéo-thả tệp
### Nộp nhiều bài cùng lúc với 1 lần kéo thả tệp

<p align="center"><img src="https://lh3.googleusercontent.com/eq1Abpp_hyOW9zYVYyeAkXfb-xA01JWuZ7lXoTHujMA4YqcAkv0PWRSjQXyrCwkdLjrV4pKkHCe6jmIYjAdKPk-1ys8xqZzSoGExIX2rK8-wCRAR5lw0VDr94LR-4lKKUwOpFwULyQ=w2400"></p>
<p align="center"><img src="https://lh3.googleusercontent.com/K4qASNz9XrcPx6LvGQzoKzq5ypenBTL9LmhKvENALO08O3t1XyNrvo4DT5W1iBzQAEi1mtkn6g9JrgADa12aw2DTMY5a_2989wNrq0D37s6BsEI5GwR8QBZ_N_Y91rgzx1VYYFQbTg=w2400"></p>

### Hiện thời gian làm bài của kỳ thi

<p align="center"><img src="https://lh3.googleusercontent.com/nWQj7AcZSnGXrquFEPTgtDDaylu70aRXy_hrcIv1WUtjDvUlpI7BVDibCTbJ4gktebBoKA5uulDjYW_Jn3HQ1sP6l8tc4KpL0cBGpN5wy4KLN8kqYgyeLZPRanOWIt5chfrLWqDuWw=w2400"></p>

### Nhật ký nộp bài và bảng xếp hạng được cập nhật tự động
### Nhật ký nộp bài hiển thị tình trạng nộp bài và kết quả sau khi chấm

<p align="center"><img src="https://lh3.googleusercontent.com/l_W7bR4g31DmM38foYihj7UfgGJ0dquxveTO2DDKDT4E3SROfM4ZnAjKQgw50bX51yxGJQijH4aEYowxMDjZOUoKxC5dgDEyWNoyUuiQUjhYOX5FnC1fonDM_xHBHCOO8N3RuLxCAQ=w2400">

### Bảng xếp hạng được cập nhật tự động và sắp xếp thí sinh theo tổng số điểm tất cả bài thi

<p align="center"><img src="https://lh3.googleusercontent.com/3441RgXTaNUqoi7gx0StDhhl9ODaQ1vPZuO4S5Cbj0MQs3LHPzMLDXHkhUpds_v2goUOf1NtOUSPjZ-6FunuteHBrH2rDIPEFCincv9z-QaebQPiPgQS2aHjA5HPJkO_oGezdD3Rnw=w2400">
<p align="center"><img src="https://lh3.googleusercontent.com/6pyA8354I1jpCOXyreTGZ_-CFna3AOeI6Ar7E11EhpatMUCX85aZkJtIqhF3NN6mTctImoeYdjXhCAkEWOWRTTfy44emkHtyCbzMFVKecdqjaaKkdR92NSaIP-boE-eoasKhdgVx5w=w2400">

### Người dùng có thể thay đổi ảnh đại diện, tên và mật khẩu (có thể tắt trong file config)

## Cài đặt
Bạn có thể tải trực tiếp phiên bản tích hợp sẵn UniServer tại [đây](https://github.com/belivipro9x99/themis-webinterface/releases/) hoặc ```git clone``` repositories này và thiết lập máy chủ riêng.
Bạn có thể tải trực tiếp phiên bản tích hợp sẵn UniServer tại [đây](https://github.com/belivipro9x99/themis-webinterface/releases/) hoặc ```git clone``` repository này và thiết lập máy chủ riêng.

Apache config:
```
Expand Down Expand Up @@ -66,13 +70,17 @@ ErrorDocument 502 /lib/error.php
Options -Indexes
Deny from all
</Directory>
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
```

## Cấu hình

### config.php

Hầu hết cấu hình đều có ở trong tệp ```config.php``` , trong tệp bao gồm:
Hầu hết cấu hình đều có ở trong tệp ```config.php``` , bao gồm:
* Tên kì thi
* Mô tả kì thi
* Thư mục lưu bài
Expand All @@ -87,9 +95,20 @@ Hầu hết cấu hình đều có ở trong tệp ```config.php``` , trong tệ

Tài khoản được lưu trong tệp ```api/xmldb/account.xml``` và có thể chỉnh sửa bằng excel.

## Thay đổi trong 0.0.2

* Cho phép tải nhiều bài cùng lúc và hiện các bài đang trong hàng chờ
* Hiển thị tình trạng hiện tại của bài đã nộp
* Xem tệp nhật kí trực tiếp trên trang mà không cần tải về

<p align="center"><img width="500px" src="https://lh3.googleusercontent.com/QQhIMvi7V8PTzXz_C-r6TZ21LgK73hTVUtX9VXgCoqWXkSZJVPRbJJPHug24Fce9nHY_a7ZXBpglli4cOdnlJ2vHKdwvNllMoHIDd-ZcwDaWR6PMCjjVewON1oqPt9CSlPgf1__joQ=w2400">

* Vá các lỗ hổng bảo mật:
* XSS
* LFI/RFI
* Slowloris DoS

## Todo

- [ ] Clean code
- [ ] Hiển thị các bài trong hàng chờ chấm điểm
- [ ] Xem trực tiếp tệp log trên web
- [ ] Tìm và vá các lỗ hổng bào mật
67 changes: 35 additions & 32 deletions api/test/download.php → api/test/getlog.php
Original file line number Diff line number Diff line change
@@ -1,32 +1,35 @@
<?php
// |====================================================|
// | download.php |
// | Copyright (c) 2018 Belikhun. |
// | This file is licensed under MIT license. |
// |====================================================|

require_once $_SERVER["DOCUMENT_ROOT"]."/lib/api_ecatch.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/ratelimit.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/belipack.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/config.php";

if (!islogedin())
stop(9, "Bạn chưa đăng nhập.", 403);

if (!isset($_GET["f"]))
stop(21, "Missing GET parameter f.", 400);

$file = $_GET["f"];
$file = str_replace("\"", "", $file);
$file = str_replace("/", "", $file);

$username = $_SESSION["username"];

if ((strpos($file, "[". $username ."]") > 0) && ($publish == 1)) {
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=\"". $file ."\"");
readfile($logsDir ."\\". $file);
die();
} else
stop(8, "Lỗi không xác định...", 500);
?>
<?php
// |====================================================|
// | getlog.php |
// | Copyright (c) 2018 Belikhun. |
// | This file is licensed under MIT license. |
// |====================================================|

require_once $_SERVER["DOCUMENT_ROOT"]."/lib/api_ecatch.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/ratelimit.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/belipack.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/config.php";

if (!islogedin())
stop(9, "Bạn chưa đăng nhập.", 403);

if (!isset($_GET["f"]))
stop(21, "Missing GET parameter f.", 400);

$file = $_GET["f"];
$file = str_replace("\"", "", $file);
$file = str_replace("/", "", $file);

$username = $_SESSION["username"];

if (!(strpos($file, "[". $username ."]") > 0) || $publish == false)
stop(8, "Lỗi không xác định...", 400);

$line = Array();

$logf = fopen($logsDir ."/". $file, "r");
while (($l = fgets($logf)) !== false)
array_push($line, str_replace(PHP_EOL, "", $l));

stop(0, "Success!", 200, $line);
?>
98 changes: 76 additions & 22 deletions api/test/logs.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,54 +9,108 @@
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/ratelimit.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/lib/belipack.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/config.php";

function getname(string $str) {
$n = null;
preg_match("/(\[\w{1,}\]\.[a-zA-Z1-9]{1,})/", $str, $t);
if (count($t) != 0 && isset($t[count($t) - 1]))
$n = str_replace("]", "", str_replace("[", "", $t[count($t) - 1]));
return $n;
}

if (!islogedin())
stop(9, "Bạn chưa đăng nhập.", 403);

$dir = glob($logsDir ."/*.log");
$username = $_SESSION["username"];
$hurl = "/api/test/download?f=";
$res = Array();

$i = -1;
foreach($dir as $file) {
$updir = glob($uploadDir ."/*.*");
$queues = Array();
$queuefiles = Array();

foreach ($updir as $file) {
if (!strpos($file, "[". $username ."]") > 0)
continue;
$i++;

$name = getname($file);
$lastm = date("d/m/Y H:i:s", filemtime($file));

array_push($queues, Array(
"name" => $name,
"lastmodify" => $lastm
));
array_push($queuefiles, $file);
}

$judging = (isset($_SESSION["logs-module"]["judging"]) ? $_SESSION["logs-module"]["judging"] : Array());

if (!isset($_SESSION["logs-module"]["lastqueuesfiles"])) {
$_SESSION["logs-module"]["lastqueuesfiles"] = $queuefiles;
} else {
$lqfs = $_SESSION["logs-module"]["lastqueuesfiles"];
foreach($lqfs as $i => $item)
if (!file_exists($item))
array_push($judging, Array(
"name" => getname($item),
"lastmodify" => date("d/m/Y H:i:s"),
"lastmtime" => time(),
));

$_SESSION["logs-module"]["lastqueuesfiles"] = $queuefiles;
}

$logdir = glob($logsDir ."/*.log");
$logres = Array();

foreach($logdir as $log) {
if (!strpos($log, "[". $username ."]") > 0)
continue;

$url = "#";

if ($publish == true)
$url = $hurl . basename($file);
$url = "/api/test/getlog?f=" . basename($log);

if (strpos(strtolower($file), ".log") > 0) {
if (strpos(strtolower($log), ".log") > 0) {
$out = "Đã chấm xong!";
$lastm = null;
$name = null;
$log = fopen($file, "r");
$name = getname($log);
$logtmp = $log .".tmp";
copy($log, $logtmp);
$flog = fopen($logtmp, "r");

// TODO: This part is not working correctly
foreach ($judging as $i => $item)
if ($item["name"] === $name && $item["lastmtime"] < filemtime($log))
unset($judging[$i]);

if ($publish == true) {
$lastm = date("d/m/Y H:i:s.", filemtime($file));
$l1 = str_replace(PHP_EOL, "", fgets($log));
$name = str_replace(PHP_EOL, "", fgets($log));
$out = substr($l1, strlen($username) + strlen(pathinfo($name, PATHINFO_FILENAME)) + 8);
$lastm = date("d/m/Y H:i:s", filemtime($log));
$out = str_replace(PHP_EOL, "", fgets($flog));
$out = substr($out, strlen($username) + strlen(pathinfo($name, PATHINFO_FILENAME)) + 8);
preg_match("/[0-9]{1,},[0-9]{1,}/", $out, $t);
if (isset($t[0]))
$out = $t[0];
if (count($t) != 0 && isset($t[count($t) - 1]))
$out = $t[count($t) - 1];
} else {
fgets($log);
$name = str_replace(PHP_EOL, "", fgets($log));
}

fclose($log);
fclose($flog);
unlink($logtmp);
}
else $out = "Đang đợi chấm...";

$res[$i] = Array(
array_push($logres, Array(
"name" => $name,
"out" => $out,
"lastmodify" => $lastm,
"url" => $url
);
));
}
stop(0, "Success!", 200, $res);

$_SESSION["logs-module"]["judging"] = $judging;

stop(0, "Success!", 200, Array(
"queues" => $queues,
"judging" => $judging,
"logs" => $logres,
));
?>
37 changes: 20 additions & 17 deletions api/test/rank.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,44 +11,47 @@
require_once $_SERVER["DOCUMENT_ROOT"]."/api/xmldb/account.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/config.php";

$llog = glob($logsDir ."/*.log");
$logdir = glob($logsDir ."/*.log");
$res = Array();
$namelist = Array();

foreach ($llog as $i => $lf) {
$user = getStringBetween(basename($lf), "[", "]");
$log = fopen($lf, "r");
$out = substr(str_replace(PHP_EOL, "", fgets($log)), strlen($user) + 6);
$name = str_replace(PHP_EOL, "", fgets($log));
fclose($log);

foreach ($logdir as $i => $log) {
$user = getStringBetween(basename($log), "[", "]");
$flog = fopen($log, "r");
$l1 = str_replace(PHP_EOL, "", fgets($flog));
$name = str_replace(PHP_EOL, "", fgets($flog));
$out = substr($l1, strlen($user) + strlen(pathinfo($name, PATHINFO_FILENAME)) + 8);
fclose($flog);

$point = 0;
preg_match("/[0-9]{1,},[0-9]{1,}/", $out, $t);
if (isset($t[0]))
$point = (float)str_replace(",", ".", $t[0]);
else
$point = 0;
if (count($t) != 0 && isset($t[count($t) - 1]))
$point = (float)str_replace(",", ".", $t[count($t) - 1]);

if ($publish == false) {
if ($publish == true) {
$namelist[$i] = $name;
$res[$user]["list"][$name] = $point;
}

$res[$user]["username"] = $user;
$res[$user]["name"] = getuserdata($user)["name"];
if (!isset($res[$user]["total"]))
$res[$user]["total"] = 0;
$res[$user]["total"] += $point;
}

if ($publish == false)
$namelist = remdubarr($namelist);
if ($publish == true) {
$nlr = arrayremdub($namelist);
$namelist = ((count($nlr) > 0) ? $nlr : Array());
}

usort($res, function($a, $b){
$a = $a["total"];
$b = $b["total"];

if ($a == $b) {
if ($a == $b)
return 0;
}

return ($a > $b) ? -1 : 1;
});

Expand Down
4 changes: 2 additions & 2 deletions api/test/upload.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

$file = $_FILES["file"]["name"];
$filename = explode(".", $file);
$acceptext = array("pas", "cpp", "py", "java");
$acceptext = array("pas", "cpp", "c", "pp", "exe", "class", "py", "java");
$extension = pathinfo($file, PATHINFO_EXTENSION);
if (in_array($extension, $acceptext) && ($_FILES["file"]["size"] <= $maxfilesize)) {
if ($_FILES["file"]["error"] > 0) {
Expand All @@ -50,7 +50,7 @@
"max" => $maxfilesize
));
} else {
stop(15, "Chỉ chấp nhận tệp pas, cpp, py và java!", 400);
stop(15, "Không chấp nhận tệp!", 400);
}
}

Expand Down
Loading

0 comments on commit 8d215df

Please sign in to comment.