List of commits:
Subject Hash Author Date (UTC)
gpg functions and test ecb9e05c99a2b73edfba5014329e362d8c6e9246 Catalin(ux) M. BOIE 2020-11-09 07:38:11
Stats page is not rendered for bots. 29ca3f62ac460b64eb0a10fbb8bdfdf4a1767dc5 Catalin(ux) M. BOIE 2020-10-13 05:48:43
Added rate limit options 60e939a52577a01603f9f386ffaf1a9712f99ab6 Catalin(ux) M. BOIE 2020-10-07 05:02:25
Improved bots list and clean old entries 9da0a014040753734beabfecb298b8956fc25fe3 Catalin(ux) M. BOIE 2020-10-05 06:34:43
builder: use secrets only if available 4fe47afc60435508ad90f62c51d489ac3c20b4d0 Catalin(ux) M. BOIE 2020-08-28 07:29:14
worker: use secrets only if available 5371e918e294a46cc38c765371a1caf7a3083eef Catalin(ux) M. BOIE 2020-08-28 07:28:12
builder: do not break meta variable 1d8207b1a782ab039406dbd087cdc9bb5ea0b898 Catalin(ux) M. BOIE 2020-08-28 07:27:48
Whitespace 86086337c5323b073f517bc59c18aba0808fb4f3 Catalin(ux) M. BOIE 2020-08-24 07:22:13
Bump version to 0.73 7cac4d7a31116ac9ad86e0babeb0c1aace5dd852 Catalin(ux) M. BOIE 2020-08-23 15:32:03
duilder update f691d84aa0aa70ef60a7487f247ed1a9ab1e3ab1 Catalin(ux) M. BOIE 2020-08-23 15:31:38
Bot prevention should not be active for edit operation 371c60a486ea989fafb66266cab71ea9f7db0269 Catalin(ux) M. BOIE 2020-08-23 15:02:13
TODO update 32591f3b1cf054bd70411592e5a82f5898d7da2f Catalin(ux) M. BOIE 2020-08-23 15:01:51
Show also by which protocol a user is connecting d35b5b12103f9a72a3e8788e7c48532b9c1e5b89 Catalin(ux) M. BOIE 2020-08-23 15:01:30
Fixed a small locking issue (unlock without lock) 0d1e7915545de251eea7f3bce468647fc2df1bf9 Catalin(ux) M. BOIE 2020-08-23 15:00:58
Give up the cache if we cannot connect in 150ms dad6cf20f9f4bdbfe2026809a404e852e7cd8e53 Catalin(ux) M. BOIE 2020-08-23 15:00:20
Limit the number of repositories in the discover page a0de6d683b59934168ef8415c9ec716aef68b195 Catalin(ux) M. BOIE 2020-08-23 14:58:37
Added support for other branch then master (main prefered) 1108f43c3639ffcc06f1314d901640564fae7483 Catalin(ux) M. BOIE 2020-08-23 14:55:51
Added possibility for admin to mail users 05068314021bbdf6f26bc92bee47177b170b2a1c Catalin(ux) M. BOIE 2020-08-23 14:43:10
CSS: small fixes e4a39879513e000b5d9be588201916950fa629fc Catalin(ux) M. BOIE 2020-08-23 14:03:23
Cosmetic cbe42130692ed9b876746e6c97f4fb32439c6190 Catalin(ux) M. BOIE 2020-08-23 13:59:00
Commit ecb9e05c99a2b73edfba5014329e362d8c6e9246 - gpg functions and test
Author: Catalin(ux) M. BOIE
Author date (UTC): 2020-11-09 07:38
Committer name: Catalin(ux) M. BOIE
Committer date (UTC): 2020-11-09 07:38
Parent(s): 29ca3f62ac460b64eb0a10fbb8bdfdf4a1767dc5
Signer:
Signing key:
Signing status: N
Tree: 62c495735ceb4fec1b2327be481b5662d5313b7e
File Lines added Lines deleted
inc/gpg.inc.php 97 0
inc/user/repo/artifacts/search/search.php 0 60
inc/user/repo/artifacts/show/add_note.php 0 65
inc/user/repo/artifacts/show/show.php 0 184
tests/gpg.php 23 0
File inc/gpg.inc.php added (mode: 100644) (index 0000000..5a7d4fe)
1 <?php
2
3 function rg_gpg_set_error($s)
4 {
5 global $rg_gpg_error;
6 rg_log('gpg_set_error: ' . $s);
7 $rg_gpg_error = $s;
8 }
9
10 function rg_gpg_error()
11 {
12 global $rg_gpg_error;
13 return $rg_gpg_error;
14 }
15
16 /*
17 * Generates a key
18 */
19 function rg_gpg_key_gen($user_id)
20 {
21 $ret = array('ok' => 0);
22 do {
23 $r = rg_lock('gpg_keyring.lock', RG_LOCK_BLOCK);
24 if ($r === FALSE) {
25 $ret['errmsg'] = 'cannot lock';
26 break;
27 }
28
29 $kr = rg_tmp_path('gpg_keyring');
30 $ekr = escapeshellarg($kr);
31 $euser_id = escapeshellarg($user_id);
32
33 $a = array(
34 'cmds' => array(
35 'cmd1' => array(
36 'cmd' => 'gpg2'
37 . ' --keyring ' . $ekr
38 . ' --passphrase \'\''
39 . ' --no-default-keyring'
40 . ' --batch'
41 . ' --quick-generate-key'
42 . ' ' . $euser_id
43 . ' default default never'
44 )
45 )
46 );
47 $r = rg_exec2($a);
48 if (($r['ok'] != 1) || ($r['cmds']['cmd1']['exitcode'] != 0)) {
49 $ret['errmsg'] = $r['cmds']['cmd1']['last_errmsg'];
50 break;
51 }
52
53 $a = array(
54 'cmds' => array(
55 'cmd1' => array(
56 'cmd' => 'gpg2'
57 . ' --keyring ' . $ekr
58 . ' --no-default-keyring'
59 . ' --export-secret-keys'
60 . ' --armour'
61 )
62 )
63 );
64 $r = rg_exec2($a);
65 if (($r['ok'] != 1) || ($r['cmds']['cmd1']['exitcode'] != 0)) {
66 $ret['errmsg'] = $r['last_errmsg'];
67 break;
68 }
69 $ret['priv_key'] = $r['cmds']['cmd1']['in_buf'];
70
71 $a = array(
72 'cmds' => array(
73 'cmd1' => array(
74 'cmd' => 'gpg2'
75 . ' --keyring ' . $ekr
76 . ' --no-default-keyring'
77 . ' --export'
78 . ' --armour'
79 )
80 )
81 );
82 $r = rg_exec2($a);
83 if (($r['ok'] != 1) || ($r['cmds']['cmd1']['exitcode'] != 0)) {
84 $ret['errmsg'] = $r['last_errmsg'];
85 break;
86 }
87 $ret['pub_key'] = $r['cmds']['cmd1']['in_buf'];
88
89 @unlink($kr);
90
91 rg_unlock('gpg_keyring.lock');
92
93 $ret['ok'] = 1;
94 } while (0);
95
96 return $ret;
97 }
File inc/user/repo/artifacts/search/search.php deleted (index ceb8047..0000000)
1 <?php
2 rg_log("FILE: /inc/user/repo/bug/search/search");
3
4 $_bug_search = "";
5 $errmsg = array();
6
7 $_x = array();
8 if ($rg['doit'] == 0) {
9 // defaults
10 $_x['reported_by'] = "";
11 $_x['assigned_to'] = "";
12 $_x['state'] = 0;
13 $_x['order_by'] = "";
14 $_x['include'] = "";
15 $_x['exclude'] = "";
16 $_x['start'] = "";
17 $_x['end'] = "";
18 $_x['title_string'] = "";
19 $_x['body_string'] = "";
20 $_x['bugs_per_page'] = 25;
21 $_x['for_all_users'] = "off";
22 $_x['global'] = "off";
23 $_x['name'] = "";
24 } else {
25 $_x['reported_by'] = rg_var_str('bug_search::reported_by');
26 $_x['assigned_to'] = rg_var_str('bug_search::assigned_to');
27 $_x['state'] = rg_var_uint('bug_search::state');
28 $_x['order_by'] = rg_var_str('bug_search::order_by');
29 $_x['include'] = rg_var_str('bug_search::include');
30 $_x['exclude'] = rg_var_str('bug_search::exclude');
31 $_x['start'] = rg_var_str('bug_search::start');
32 $_x['end'] = rg_var_str('bug_search::end');
33 $_x['title_string'] = rg_var_str('bug_search::title_string');
34 $_x['body_string'] = rg_var_str('bug_search::body_string');
35 $_x['bugs_per_page'] = rg_var_uint('bug_search::bugs_per_page');
36 $_x['for_all_users'] = rg_var_str('bug_search::for_all_users');
37 $_x['global'] = rg_var_str('bug_search::global');
38 $_x['name'] = rg_var_str('bug_search::name');
39 $_x['standard'] = 0;
40
41 while (1) {
42 $bugs = rg_bug_search($db, $rg['ri']['repo_id'],
43 $rg['login_ui']['uid'], $_x);
44 if ($bugs === FALSE) {
45 $errmsg[] = "Cannot search bug (" . rg_bug_error() . ").";
46 break;
47 }
48
49 // Show bugs
50 $_bug_search .= rg_template_table("repo/bug/list", $bugs, $rg);
51 break;
52 }
53 }
54
55 $rg = rg_array_merge($rg, 'bug_search', $_x);
56 $rg['HTML:errmsg'] = rg_template_errmsg($errmsg);
57 $_exclude = array();
58 $rg['HTML:bug_search_state_select'] =
59 rg_bug_state_select($_x['state'], $_exclude);
60 $_bug_search .= rg_template('repo/bug/search/search.html', $rg, TRUE /*xss*/);
File inc/user/repo/artifacts/show/add_note.php deleted (index 4134fde..0000000)
1 <?php
2 rg_log("FILE: /inc/user/repo/bug/show/add_note");
3
4 $note_add_doit = rg_var_uint("note_add_doit");
5
6 $note = "";
7
8 $note_errmsg = array();
9 while (1) {
10 if ($note_add_doit == 0)
11 break;
12
13 $note = rg_var_str("note");
14
15 if (!rg_valid_referer()) {
16 $note_errmsg[] = "invalid referer; try again";
17 break;
18 }
19
20 if (!rg_token_valid($db, $rg, 'note_add', FALSE)) {
21 $note_errmsg[] = "Invalid token. Try again.";
22 break;
23 }
24
25 if (empty($note)) {
26 $note_errmsg[] = "note cannot be empty";
27 break;
28 }
29
30 $x = array();
31 $x['obj_id'] = $rg['ri']['repo_id'];
32 $x['type'] = 'repo';
33 $x['owner'] = $rg['ri']['uid'];
34 $x['uid'] = $rg['login_ui']['uid'];
35 $x['username'] = $rg['login_ui']['username'];
36 $x['needed_rights'] = 'B';
37 $x['ip'] = $rg['ip'];
38 $x['misc'] = '';
39 if (rg_rights_allow($db, $x) !== TRUE) {
40 $note_errmsg[] = rg_template("repo/bug/note/deny_add.html", $rg, TRUE /*xss*/);
41 break;
42 }
43
44 // add note
45 $_d = array();
46 $_d['note'] = $note;
47 $ret = rg_bug_note_add($db, $rg['ri']['repo_id'], $bug_id,
48 $rg['login_ui']['uid'], $_d);
49 if ($ret === FALSE) {
50 $note_errmsg[] = "Cannot add note (" . rg_bug_error() . ")";
51 break;
52 }
53
54 // allow another note to be added
55 $note = "";
56 break;
57 }
58
59 // add note form
60 $rg['HTML:note_errmsg'] = rg_template_errmsg($note_errmsg);
61 $rg['rg_form_token_tag'] = 'note_add';
62 $rg['rg_form_token'] = rg_token_get($db, $rg, 'note_add');
63 $rg['note'] = $note;
64 $rg['HTML:note_add'] = rg_template("repo/bug/note_add.html", $rg, TRUE /* xss */);
65 ?>
File inc/user/repo/artifacts/show/show.php deleted (index 6b55358..0000000)
1 <?php
2 rg_log("FILE: /inc/user/repo/bug/show/show");
3
4 // TODO: security checks
5
6 $_bug_show = '';
7
8 $rg['HTML:bug_edit'] = '';
9 $rg['HTML:button_error'] = '';
10 $rg['HTML:bug_edit_hints'] = '';
11
12 $ibug = rg_bug_info($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']);
13 if ($ibug === FALSE)
14 rg_fatal("Cannot lookup bug!");
15
16 $rg['bug'] = array_merge($rg['bug'], $ibug);
17
18 if ($ibug['exists'] != 1) {
19 $_bug_body .= rg_template("repo/bug/not_found.html", $rg, TRUE /*xss*/);
20 return;
21 }
22
23 $x = array();
24 $x['obj_id'] = $rg['ri']['repo_id'];
25 $x['type'] = 'repo';
26 $x['owner'] = $rg['ri']['uid'];
27 $x['uid'] = $rg['login_ui']['uid'];
28 $x['username'] = $rg['login_ui']['username'];
29 $x['ip'] = $rg['ip'];
30 $x['misc'] = '';
31
32 // If bug is deleted and the user does not have 'delete' rights, deny access.
33 if ($ibug['deleted'] > 0) {
34 $x['needed_rights'] = 'd';
35 if (rg_rights_allow($db, $x) !== TRUE) {
36 $_bug_body .= rg_template("repo/bug/deleted.html", $rg, TRUE /*xss*/);
37 return;
38 }
39 }
40
41 // load labels
42 $labels = rg_bug_label_get($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']);
43 if ($labels === FALSE)
44 $rg['HTML:labels_html'] = rg_warning('Cannot load labels!', $rg);
45 else
46 $rg['HTML:labels_html'] = rg_bug_label_html($db, $labels);
47 $rg['bug']['labels'] = implode(" ", $labels);
48
49 // edit
50 $rg['rg_form_token_tag'] = 'bug_edit_hl';
51 $rg['rg_form_token'] = rg_token_get($db, $rg, 'bug_edit_hl');
52 $rg['HTML:edit_form'] = rg_template("repo/bug/b_edit.html", $rg, TRUE /*xss*/);
53 if (rg_var_uint("edit") == 1)
54 $rg['HTML:bug_edit'] = rg_bug_edit_high_level($db, $rg);
55
56 // close/re-open
57 $close_reopen_error = '';
58 while (1) {
59 if (rg_var_uint("close_reopen") != 1)
60 break;
61
62 $ibug['state'] = rg_var_uint("state");
63 $ibug['state_text'] = rg_bug_state($ibug['state']);
64
65 if ($ibug['state'] == 1) { // reopen
66 $x['needed_rights'] = 'r';
67 if (rg_rights_allow($db, $x) !== TRUE) {
68 rg_template("repo/bug/deny_reopen.html", $rg, TRUE /*xss*/);
69 break;
70 }
71 } else { // close
72 $x['needed_rights'] = 'C';
73 if (rg_rights_allow($db, $x) !== TRUE) {
74 rg_template("repo/bug/deny_close.html", $rg, TRUE /*xss*/);
75 break;
76 }
77 }
78
79 if (!rg_valid_referer()) {
80 $close_reopen_error = rg_warning('Invalid referer; try again', $rg);
81 break;
82 }
83
84 if (!rg_token_valid($db, $rg, 'close_reopen', FALSE)) {
85 $close_reopen_error = rg_warning('Invalid token. Try again.', $rg);
86 break;
87 }
88
89 $ret = rg_bug_edit($db, $rg['login_ui'], $rg['ri'], $ibug);
90 if ($ret === FALSE) {
91 $close_reopen_error = rg_warning('Cannot edit bug (' . rg_bug_error() . ')', $rg);
92 break;
93 }
94
95 // TODO: do something with the error code
96 break;
97 }
98 if ($ibug['state'] == 1)
99 $t = "repo/bug/b_close.html";
100 else
101 $t = "repo/bug/b_reopen.html";
102 $rg['rg_form_token_tag'] = 'close_reopen';
103 $rg['rg_form_token'] = rg_token_get($db, $rg, 'close_reopen');
104 $rg['HTML:close_form'] = rg_template($t, $rg, TRUE /*xss*/);
105 if (!empty($close_reopen_error))
106 $rg['HTML:button_error'] = $close_reopen_error;
107
108
109 // 'add_note' must be unconditionally included because we must insert the form
110 if ($rg['allow_bug_add'] == 1) {
111 include($INC . "/user/repo/bug/show/add_note.php");
112 } else {
113 $rg['HTML:note_add'] = '';
114 }
115
116 // load notes
117 $notes = rg_bug_note_list($db, $rg['ri']['repo_id'],
118 $rg['bug']['bug_id'], 0);
119 if ($notes === FALSE)
120 $rg['HTML:notes'] = rg_warning('Cannot load notes!', $rg);
121 else
122 $rg['HTML:notes'] = rg_template_table("repo/bug/list_note", $notes, $rg);
123
124
125 rg_watch_hl_process($db, $rg, 'bug', $rg['ri']['repo_id'],
126 $rg['bug']['bug_id'], $rg['current_url']);
127
128
129 // delete/undelete
130 $delete_error = '';
131 $del = $rg['bug']['deleted'] > 0;
132 while (rg_var_uint('del_doit') == 1) {
133 // 1 = del, 2 = undel
134 $del_undel = rg_var_uint("del_undel");
135
136 if (($del_undel == 1) && $del)
137 break;
138
139 if (($del_undel == 2) && !$del)
140 break;
141
142 if (!rg_valid_referer()) {
143 $delete_error = rg_warning("Invalid referer; try again", $rg);
144 break;
145 }
146
147 if (!rg_token_valid($db, $rg, 'del_undel', FALSE)) {
148 $delete_error = rg_warning("Invalid token; try again.", $rg);
149 break;
150 }
151
152 $x['needed_rights'] = 'd';
153 if (rg_rights_allow($db, $x) !== TRUE) {
154 $delete_error = rg_template("repo/bug/deny_delete.html",
155 $rg, TRUE /*xss*/);
156 break;
157 }
158
159 $r = rg_bug_delete_undelete($db, $rg['login_ui']['uid'],
160 $rg['ri']['repo_id'], $ibug['bug_id'], $del_undel);
161 if ($r === FALSE) {
162 $delete_error = rg_warning(rg_bug_error(), $rg);
163 break;
164 }
165
166 $del = 1 - $del;
167 break;
168 }
169 $rg['rg_form_token_tag'] = 'del_undel:' . $rg['rg_form_token'];
170 $rg['rg_form_token'] = rg_token_get($db, $rg, 'del_undel');
171 $rg['bug']['del'] = 1 - $del;
172 $rg['HTML:del_form'] = rg_template('repo/bug/b_del.html', $rg, TRUE /*xss*/);
173 if (!empty($delete_error))
174 $rg['HTML:button_error'] = $delete_error;
175
176
177 // We must look it up again because it can be edited above; no prob, is in cache
178 $ibug = rg_bug_info($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']);
179 if ($ibug === FALSE)
180 rg_fatal("Cannot lookup bug!");
181 $rg = rg_array_merge($rg, "bug", $ibug);
182
183 $_bug_show .= rg_template("repo/bug/show.html", $rg, TRUE /*xss*/);
184 ?>
File tests/gpg.php added (mode: 100644) (index 0000000..1ceae39)
1 <?php
2 error_reporting(E_ALL | E_STRICT);
3 ini_set('track_errors', 'On');
4
5 require_once(__DIR__ . '/config.php');
6 require_once(__DIR__ . '/../inc/init.inc.php');
7 require_once(__DIR__ . '/../inc/log.inc.php');
8 require_once(__DIR__ . '/../inc/gpg.inc.php');
9
10 rg_log_set_file(__DIR__ . '/gpg.log');
11
12 $rg_no_db = TRUE;
13 require_once('common.php');
14
15 $r = rg_gpg_key_gen('bla');
16 rg_log_ml('r: ' . print_r($r, TRUE));
17 if ($r['ok'] != 1) {
18 rg_log_ml('Cannot generate key: ' . $r['errmsg'] . '!');
19 exit(1);
20 }
21
22
23 rg_log('Done!');
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/rocketgit

Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main