| File Makefile.in changed (mode: 100644) (index 5e9380e..310b5f5) |
| ... |
... |
install: all |
| 30 |
30 |
@mkdir -p $(I_VAR_LOG)/$(PRJ)-web |
@mkdir -p $(I_VAR_LOG)/$(PRJ)-web |
| 31 |
31 |
@-chown apache:apache $(I_VAR_LOG)/$(PRJ)-web |
@-chown apache:apache $(I_VAR_LOG)/$(PRJ)-web |
| 32 |
32 |
@chmod 0700 $(I_VAR_LOG)/$(PRJ)-web |
@chmod 0700 $(I_VAR_LOG)/$(PRJ)-web |
| 33 |
|
@mkdir -p $(I_VAR_LIB)/$(PRJ) $(I_VAR_LIB)/$(PRJ)/locks $(I_VAR_LIB)/$(PRJ)/repos |
|
|
33 |
|
@mkdir -p $(I_VAR_LIB)/$(PRJ) $(I_VAR_LIB)/$(PRJ)/locks $(I_VAR_LIB)/$(PRJ)/repos $(I_VAR_LIB)/$(PRJ)/q_merge_requests |
| 34 |
34 |
@-chown -R rocketgit:rocketgit $(I_VAR_LIB)/$(PRJ) |
@-chown -R rocketgit:rocketgit $(I_VAR_LIB)/$(PRJ) |
| File README changed (mode: 100644) (index 90bf862..69d280c) |
| 71 |
71 |
-A INPUT -m tcp -p tcp --dport http -j ACCEPT |
-A INPUT -m tcp -p tcp --dport http -j ACCEPT |
| 72 |
72 |
-A INPUT -m tcp -p tcp --dport https -j ACCEPT |
-A INPUT -m tcp -p tcp --dport https -j ACCEPT |
| 73 |
73 |
|
|
|
74 |
|
. PHP |
|
75 |
|
Adjust php.ini to allow enough RAM and execution time. |
|
76 |
|
|
| 74 |
77 |
|
|
| 75 |
78 |
== Thanks == |
== Thanks == |
| 76 |
79 |
. Special thanks to my family that supported me in this project. |
. Special thanks to my family that supported me in this project. |
| File TODO changed (mode: 100644) (index d8ad80b..7837153) |
| 6 |
6 |
[ ] All internal error should show a special page? |
[ ] All internal error should show a special page? |
| 7 |
7 |
[ ] Deleting a SSH key should be done with token. |
[ ] Deleting a SSH key should be done with token. |
| 8 |
8 |
[ ] All operations must be verified with tokens. |
[ ] All operations must be verified with tokens. |
| 9 |
|
[ ] |
|
|
9 |
|
[ ] If the confirmation code is truncated, an internal error is generated |
|
10 |
|
instead of a user error! |
|
11 |
|
[ ] Third option: anybody can create an account but must be validated by admin. |
|
12 |
|
[ ] After creating the account, keep the user logged in and allow login |
|
13 |
|
even if is not confirmed (option in config). |
| 10 |
14 |
|
|
| 11 |
15 |
|
|
| 12 |
16 |
== Medium == |
== Medium == |
|
17 |
|
[ ] Check if if we remove rocketgit, the repos stay! |
| 13 |
18 |
[ ] Bug rights: add note, anonymous add note, add label, add global search. |
[ ] Bug rights: add note, anonymous add note, add label, add global search. |
| 14 |
19 |
[ ] Allow user to specify if is on windows/linux/etc. to be able to give |
[ ] Allow user to specify if is on windows/linux/etc. to be able to give |
| 15 |
20 |
specific hints. Hm. THe user may have multiple OSs. |
specific hints. Hm. THe user may have multiple OSs. |
| File admin/init.php changed (mode: 100644) (index 5d7aade..c9a0e0f) |
| ... |
... |
require_once($INC . "/log.inc.php"); |
| 12 |
12 |
require_once($INC . "/sql.inc.php"); |
require_once($INC . "/sql.inc.php"); |
| 13 |
13 |
require_once($INC . "/struct.inc.php"); |
require_once($INC . "/struct.inc.php"); |
| 14 |
14 |
require_once($INC . "/state.inc.php"); |
require_once($INC . "/state.inc.php"); |
|
15 |
|
require_once($INC . "/rights.inc.php"); |
| 15 |
16 |
|
|
| 16 |
17 |
rg_log_set_file("init.log"); |
rg_log_set_file("init.log"); |
| 17 |
18 |
|
|
| |
| ... |
... |
$_u = array(); |
| 32 |
33 |
$_u['uid'] = 0; |
$_u['uid'] = 0; |
| 33 |
34 |
$_u['username'] = "admin"; |
$_u['username'] = "admin"; |
| 34 |
35 |
$_u['realname'] = "Master admin"; |
$_u['realname'] = "Master admin"; |
| 35 |
|
$_u['email'] = $_u['rg_admin_email; |
|
|
36 |
|
$_u['email'] = $rg_admin_email; |
| 36 |
37 |
$_u['is_admin'] = 1; |
$_u['is_admin'] = 1; |
| 37 |
38 |
$_u['disk_quota_mb'] = 0; |
$_u['disk_quota_mb'] = 0; |
| 38 |
39 |
$_u['rights'] = rg_rights_all("user"); |
$_u['rights'] = rg_rights_all("user"); |
| |
| ... |
... |
if ($first_install == 0) |
| 82 |
83 |
|
|
| 83 |
84 |
$install_id = rg_state_get($db, "install_id"); |
$install_id = rg_state_get($db, "install_id"); |
| 84 |
85 |
if (empty($install_id)) |
if (empty($install_id)) |
| 85 |
|
rg_state_set($db, "install_id", sha1sum(microtime(TRUE))); |
|
|
86 |
|
rg_state_set($db, "install_id", sha1(microtime(TRUE))); |
| 86 |
87 |
|
|
| 87 |
88 |
echo "Done!\n"; |
echo "Done!\n"; |
| 88 |
89 |
?> |
?> |
| File inc/bug.inc.php changed (mode: 100644) (index 1d2c24f..7e4f243) |
| ... |
... |
function rg_bug_search_load($db, $repo_id, $uid, $name) |
| 492 |
492 |
|
|
| 493 |
493 |
$e_name = rg_sql_escape($db, $name); |
$e_name = rg_sql_escape($db, $name); |
| 494 |
494 |
|
|
| 495 |
|
$sql = "SELECT name, data, for_all_users FROM bug_search" |
|
|
495 |
|
$sql = "SELECT uid, name, data, for_all_users" |
|
496 |
|
. " FROM bug_search" |
| 496 |
497 |
. " WHERE (repo_id = $repo_id OR repo_id = 0)" |
. " WHERE (repo_id = $repo_id OR repo_id = 0)" |
| 497 |
498 |
. " AND (uid = $uid OR for_all_users = 1)" |
. " AND (uid = $uid OR for_all_users = 1)" |
| 498 |
499 |
. " AND name = '$e_name'" |
. " AND name = '$e_name'" |
| File inc/repo.inc.php changed (mode: 100644) (index 957cca7..ed54763) |
| ... |
... |
function rg_repo_name2base($rr) |
| 93 |
93 |
return rg_user_name2path($rr) . "/repos/"; |
return rg_user_name2path($rr) . "/repos/"; |
| 94 |
94 |
} |
} |
| 95 |
95 |
|
|
|
96 |
|
$rg_repo_info_cache = array(); |
|
97 |
|
function rg_repo_invalidate_cache($rr) |
|
98 |
|
{ |
|
99 |
|
global $rg_repo_info_cache; |
|
100 |
|
|
|
101 |
|
$key = implode("__", $rr); |
|
102 |
|
if (isset($rg_repo_info_cache[$key])) |
|
103 |
|
unset($rg_repo_info_cache[$key]); |
|
104 |
|
} |
|
105 |
|
|
| 96 |
106 |
/* |
/* |
| 97 |
107 |
* Return info about a repo |
* Return info about a repo |
| 98 |
108 |
* @param rr contains data about user and repo |
* @param rr contains data about user and repo |
| 99 |
109 |
*/ |
*/ |
| 100 |
|
$rg_repo_info_cache = array(); |
|
| 101 |
110 |
function rg_repo_info($db, $rr) |
function rg_repo_info($db, $rr) |
| 102 |
111 |
{ |
{ |
| 103 |
112 |
global $rg_repo_info_cache; |
global $rg_repo_info_cache; |
| File inc/repo/repo.php changed (mode: 100644) (index 5116e0d..a9d24f6) |
| ... |
... |
$max_commit_size = rg_var_uint("max_commit_size"); |
| 13 |
13 |
$max_users = rg_var_uint("max_users"); |
$max_users = rg_var_uint("max_users"); |
| 14 |
14 |
$description = rg_var_str("description"); |
$description = rg_var_str("description"); |
| 15 |
15 |
$master_repo_id = rg_var_uint("master_repo_id"); |
$master_repo_id = rg_var_uint("master_repo_id"); |
| 16 |
|
$rights = isset($_REQUEST['rights']) ? rg_rights_a2s($_REQUEST['rights']) : $rg_repo_rights_default; |
|
|
16 |
|
$rights = isset($_REQUEST['rights']) ? rg_rights_a2s(rg_var_str("rights")) : $rg_repo_rights_default; |
| 17 |
17 |
$repo_id = rg_var_uint("repo_id"); |
$repo_id = rg_var_uint("repo_id"); |
| 18 |
18 |
|
|
| 19 |
19 |
if (empty($subop)) |
if (empty($subop)) |
| File inc/rights.inc.php changed (mode: 100644) (index 3afd2e7..dd6adbf) |
| ... |
... |
function rg_rights_get($db, $type, $obj_id, $uid) |
| 150 |
150 |
$ret['ok'] = 0; |
$ret['ok'] = 0; |
| 151 |
151 |
$ret['rights'] = ""; |
$ret['rights'] = ""; |
| 152 |
152 |
|
|
|
153 |
|
if ($uid == 0) { |
|
154 |
|
$ret['ok'] = 1; |
|
155 |
|
return $ret; |
|
156 |
|
} |
|
157 |
|
|
| 153 |
158 |
$sql = "SELECT rights FROM rights" |
$sql = "SELECT rights FROM rights" |
| 154 |
159 |
. " WHERE type = '$type'" |
. " WHERE type = '$type'" |
| 155 |
160 |
. " AND uid = $uid" |
. " AND uid = $uid" |
| |
| ... |
... |
function rg_rights_get($db, $type, $obj_id, $uid) |
| 172 |
177 |
$ret['exists'] = 1; |
$ret['exists'] = 1; |
| 173 |
178 |
} |
} |
| 174 |
179 |
|
|
| 175 |
|
rg_log("\tdb rights: " . $ret['rights'] . "."); |
|
|
180 |
|
rg_log("\tdb rights: [" . $ret['rights'] . "]."); |
| 176 |
181 |
|
|
| 177 |
182 |
return $ret; |
return $ret; |
| 178 |
183 |
} |
} |
| |
| ... |
... |
function rg_rights_mask($val, $mask) |
| 298 |
303 |
function rg_rights_allow($rights, $needed_rights) |
function rg_rights_allow($rights, $needed_rights) |
| 299 |
304 |
{ |
{ |
| 300 |
305 |
$r = rg_rights_mask($rights, $needed_rights); |
$r = rg_rights_mask($rights, $needed_rights); |
| 301 |
|
if (strcmp($r, $needed_rights) != 0) |
|
|
306 |
|
if (strcmp($r, $needed_rights) != 0) { |
|
307 |
|
rg_log("rights_allow: [$r] != [$needed_rights]!"); |
| 302 |
308 |
return FALSE; |
return FALSE; |
|
309 |
|
} |
| 303 |
310 |
|
|
| 304 |
311 |
return TRUE; |
return TRUE; |
| 305 |
312 |
} |
} |
| File inc/user/repo-page.php changed (mode: 100644) (index be8d7a9..a9ef6ab) |
| ... |
... |
while (1) { |
| 31 |
31 |
|
|
| 32 |
32 |
rg_log("git dir is not ready yet. Sleep 1 second and loop."); |
rg_log("git dir is not ready yet. Sleep 1 second and loop."); |
| 33 |
33 |
sleep(1); |
sleep(1); |
|
34 |
|
rg_repo_invalidate_cache($rr); |
| 34 |
35 |
} |
} |
| 35 |
36 |
|
|
| 36 |
37 |
$ui = rg_user_info($db, 0, $rr['user'], ""); |
$ui = rg_user_info($db, 0, $rr['user'], ""); |
| File inc/user/repo/admin.php changed (mode: 100644) (index 451cdde..606e967) |
| ... |
... |
$_url_admin = rg_re_repopage($rg_ui, $rr['repo']) . "/admin"; |
| 8 |
8 |
$_admin_more = array_merge($more, $ri); |
$_admin_more = array_merge($more, $ri); |
| 9 |
9 |
$_admin_more['url_admin'] = $_url_admin; |
$_admin_more['url_admin'] = $_url_admin; |
| 10 |
10 |
|
|
| 11 |
|
$_op = @$paras[0]; |
|
|
11 |
|
$_op = empty($paras) ? "" : $paras[0]; |
| 12 |
12 |
switch ($_op) { |
switch ($_op) { |
| 13 |
13 |
case 'edit': |
case 'edit': |
| 14 |
14 |
include($INC . "/user/repo/edit/edit.php"); |
include($INC . "/user/repo/edit/edit.php"); |
| File inc/util.inc.php changed (mode: 100644) (index 63abecc..7b95106) |
| ... |
... |
function rg_lock($file) |
| 68 |
68 |
global $rg_lock_dir; |
global $rg_lock_dir; |
| 69 |
69 |
|
|
| 70 |
70 |
if (!isset($rg_lock_dir)) |
if (!isset($rg_lock_dir)) |
| 71 |
|
$rg_lock_dir = "/var/lib/rocketgit"; |
|
|
71 |
|
$rg_lock_dir = "/var/lib/rocketgit/locks"; |
| 72 |
72 |
|
|
| 73 |
73 |
// Double locking? |
// Double locking? |
| 74 |
74 |
if (isset($_lock[$file])) |
if (isset($_lock[$file])) |
| |
| ... |
... |
function rg_var_str($name) |
| 213 |
213 |
|
|
| 214 |
214 |
if (isset($_COOKIE[$name])) |
if (isset($_COOKIE[$name])) |
| 215 |
215 |
$ret = $_COOKIE[$name]; |
$ret = $_COOKIE[$name]; |
| 216 |
|
|
|
| 217 |
|
if (isset($_POST[$name])) |
|
|
216 |
|
else if (isset($_POST[$name])) |
| 218 |
217 |
$ret = $_POST[$name]; |
$ret = $_POST[$name]; |
| 219 |
|
|
|
| 220 |
|
if (isset($_GET[$name])) |
|
|
218 |
|
else if (isset($_GET[$name])) |
| 221 |
219 |
$ret = $_GET[$name]; |
$ret = $_GET[$name]; |
| 222 |
220 |
|
|
| 223 |
|
return htmlspecialchars($ret, ENT_QUOTES); |
|
|
221 |
|
if (is_string($ret)) |
|
222 |
|
return htmlspecialchars($ret, ENT_QUOTES); |
|
223 |
|
|
|
224 |
|
if (is_array($ret)) { |
|
225 |
|
$ret2 = array(); |
|
226 |
|
foreach ($ret as $k => $v) |
|
227 |
|
$ret2[$k] = htmlspecialchars($v, ENT_QUOTES); |
|
228 |
|
return $ret; |
|
229 |
|
} |
|
230 |
|
|
|
231 |
|
return ""; |
| 224 |
232 |
} |
} |
| 225 |
233 |
|
|
| 226 |
234 |
function rg_var_int($name) |
function rg_var_int($name) |
| File rocketgit.spec.in changed (mode: 100644) (index 10be4e3..13b61a4) |
| ... |
... |
rm -rf ${RPM_BUILD_ROOT} |
| 60 |
60 |
%attr(0700,rocketgit,rocketgit) %dir /var/log/@PRJ@ |
%attr(0700,rocketgit,rocketgit) %dir /var/log/@PRJ@ |
| 61 |
61 |
%attr(0700,apache,apache) %dir /var/log/@PRJ@-web |
%attr(0700,apache,apache) %dir /var/log/@PRJ@-web |
| 62 |
62 |
%attr(0700,rocketgit,rocketgit) %dir /var/lib/@PRJ@ |
%attr(0700,rocketgit,rocketgit) %dir /var/lib/@PRJ@ |
|
63 |
|
%attr(0700,rocketgit,rocketgit) %dir /var/lib/@PRJ@/locks |
|
64 |
|
%attr(0700,rocketgit,rocketgit) %dir /var/lib/@PRJ@/repos |
|
65 |
|
%attr(0700,rocketgit,rocketgit) %dir /var/lib/@PRJ@/q_merge_requests |
| 63 |
66 |
%config(noreplace) /etc/logrotate.d/rocketgit |
%config(noreplace) /etc/logrotate.d/rocketgit |
| 64 |
67 |
|
|
| 65 |
68 |
%changelog |
%changelog |
| File scripts/remote.php changed (mode: 100644) (index 78e4c5f..3bcac66) |
| ... |
... |
if ($ret['ok'] !== 1) |
| 158 |
158 |
$rights = $ret['rights']; |
$rights = $ret['rights']; |
| 159 |
159 |
|
|
| 160 |
160 |
if (rg_rights_allow($rights, $needed_rights) === FALSE) |
if (rg_rights_allow($rights, $needed_rights) === FALSE) |
| 161 |
|
fatal("Repo does not exists."); |
|
|
161 |
|
fatal("You have no rights to access this repo!"); |
| 162 |
162 |
|
|
| 163 |
163 |
// TODO: limit per connection |
// TODO: limit per connection |
| 164 |
164 |
// TODO: limit time and/or cpu |
// TODO: limit time and/or cpu |