改造HUSTOJ

前些日子高中的竞赛老师想让我准备一套oj的搭建方案,准备给我的学弟们用,要求是有认证过的登录帐号的同学才能访问试题等内容。
综合考虑之后,提出了以下几种方案:
1.hustoj+修改端口
2.hustoj+php更改
由于没有php经验,觉得第一种方案比较合适,第二种方案可以试一试。于是着手php的修改。经过实验,需要修改如下几个文件:

/oj-header.php
/register.php
/admin/privilege_add.php
/admin/privilege_checkin.php
/admin/privilege_list.php

首先是oj-header.php的修改,在里面添上这么一段:
after line 1:

if (!(isset($_SESSION['administrator'])||
      isset($_SESSION['contest_creator'])||
      isset($_SESSION['problem_editor'])||
      isset($_SESSION['student']))&&
      $_SERVER['PHP_SELF']!='/loginpage.php'&&$_SERVER['PHP_SELF']!='/registerpage.php'){
     echo "<a href='../loginpage.php'>Please Login First!</a";  
     echo "<a >   Or   </a>";  
     echo "<a href='../registerpage.php'>Register First!</a>";  
     exit(1);  
 }  

作用是全站判断登陆者权限,是否可以访问当前页面;

之后是register.php的修改,同样添上一段:
after line 85:

$sql="insert into `privilege` values('$user_id','checkin','N')";

mysql_query($sql);

作用是默认添加checkin权限,等待管理员审核;

紧接着轮到admin文件夹下的文件修改,其中包括用户的审核和用户的管理。

第一个文件privilege_add.php:
line 23:

$rightarray=array("administrator","problem_editor","source_browser","contest_creator","http_judge","password_setter" );  

改为

$rightarray=array("administrator","problem_editor","source_browser","contest_creator","http_judge","student","password_setter" );

作用是增添一个student用户组;

第二个是一个新文件privilege_checkin.php:
line 1:

<?php require_once("admin-header.php");?>
<?php require_once("../include/check_get_key.php");
if (!(isset($_SESSION['administrator']))){
    echo "<a href='../loginpage.php'>Please Login First</a>";
    exit(1);
}
if(isset($_GET['uid'])){
    $user_id=mysql_real_escape_string($_GET['uid']);
    $rightstr =mysql_real_escape_string($_GET['rightstr']);
    $sql="delete from `privilege` where user_id='$user_id' and rightstr='$rightstr'";
    mysql_query($sql);
    $sql="insert into `privilege` values('$user_id','student','N')";
    mysql_query($sql);
    if (mysql_affected_rows()==1) echo "$user_id $rightstr checkin!";
    else echo "No such privilege!";
}
?>

<script language=javascript>
    window.setTimeOut(1000,"history.go(-1)");
</script>

作用是删除用户的默认checkin权限,增添student权限;
第三个文件privilege_list.php:
line 9:

$sql="select * FROM privilege where rightstr in ('administrator','source_browser','contest_creator','http_judge','problem_editor') ";

改为:

$sql="select * FROM privilege where rightstr in ('administrator','source_browser','contest_creator','checkin','student','http_judge','problem_editor') ";

after line 20:

if($row->rightstr=='checkin')echo "<td><a href=privilege_checkin.php?uid=$row->user_id&rightstr=$row->rightstr&getkey=".$_SESSION['getkey'].">Checkin</a>";

作用是显示用户权限列表,增添一个Checkin链接;

至此,第二种方案的文件更改完成。可惜的是高中服务器不让使用数据库,没法自己搭建oj了……坑爹的教育局……