<?php // Some helper functions dealing with users/repos/bugs/etc. /* * Creating a user */ $_user_id = 1; $_testns = 'main'; function rg_test_create_user($db, &$rg_ui) { global $_testns; global $_user_id; if (!is_array($rg_ui)) $rg_ui = array(); $username = $_testns . '-user-' . $_user_id . '<xss>'; $new = array(); $new['uid'] = 0; $new['organization'] = 0; $new['username'] = $username; $new['realname'] = 'realname-' . $_user_id . '<xss>'; $new['email'] = 'email-' . $_user_id . '@embedromix.ro'; $new['is_admin'] = 0; $new['rights'] = ''; $new['session_time'] = 3600; $new['confirm_token'] = ''; $new['confirmed'] = 0; $new['plan_id'] = 0; $new['pass'] = 'pass-' . $_user_id; $new['pass2'] = 'pass-' . $_user_id; $_user_id++; // Delete old user $sql = 'DELETE FROM users WHERE username = \'' . $new['username'] . '\''; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_log("Cannot delete old user: " . rg_sql_error()); exit(1); } rg_sql_free_result($res); rg_cache_unset('username_to_uid::' . $username, RG_SOCKET_NO_WAIT); $rg_ui = array_merge($new, $rg_ui); $r = rg_user_edit($db, $rg_ui); if ($r === FALSE) { rg_log("Cannot create user (" . rg_user_error() . ")!"); exit(1); } $rg_ui['uid'] = $r; // delete associated bugs $sql = "SELECT * FROM repos WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); while (($row = rg_sql_fetch_array($res))) { $_t = array('bug_labels', 'bug_notes', 'bug_search', 'bugs', 'merge_requests', 'watch_bug', 'watch_repo'); foreach ($_t as $_table) { $sql = "DELETE FROM $_table WHERE repo_id = " . $row['repo_id']; $res2 = rg_sql_query($db, $sql); rg_sql_free_result($res2); } $sql = "DELETE FROM rights WHERE type = 'repo' AND obj_id = " . $row['repo_id']; $res2 = rg_sql_query($db, $sql); rg_sql_free_result($res2); } rg_sql_free_result($res); // delete associated repos $sql = "DELETE FROM repos WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); // Delete associated keys $sql = "DELETE FROM keys WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); // Delete given rights $sql = "DELETE FROM rights WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); // Delete login tokens $sql = "DELETE FROM login_tokens WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); // Delete login tokens ips $sql = "DELETE FROM login_tokens_ip WHERE uid = " . $rg_ui['uid']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); return TRUE; } /* * Creating a repo helper * You can enforce a repo-id by setting extra['repo_id']. */ $_repo_id = 1; function rg_test_create_repo($db, $rg_ui, &$extra) { global $_testns; global $_repo_id; if (!is_array($extra)) $extra = array(); $repo_id = isset($extra['repo_id']) ? $extra['repo_id'] : 0; rg_log("Creating a repo"); $new = array(); $new['master'] = 0; $new['name'] = $_testns . '-repo-' . $_repo_id . '<xss>'; $new['max_commit_size'] = 0; $new['description'] = 'desc line1\ndesc line2' . '<xss>'; $new['git_dir_done'] = 0; $new['public'] = 1; $new['license'] = 'GPL <xss>'; $_repo_id++; rg_log("Deleting repo " . $repo_id . "/" . $new['name']); $sql = 'DELETE FROM repos WHERE repo_id = ' . $repo_id . ' OR name = \'' . $new['name'] . '\''; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_log("Cannot delete old repo: " . rg_sql_error()); exit(1); } rg_sql_free_result($res); $extra = array_merge($new, $extra); $extra['repo_id'] = 0; $r = rg_repo_edit($db, $rg_ui, $extra); if ($r === FALSE) { rg_log("Cannot insert a repo (" . rg_repo_error() . ")!"); exit(1); } if ($repo_id > 0) { $sql = "UPDATE repos SET repo_id = $repo_id" . " WHERE repo_id = " . $extra['repo_id']; $res = rg_sql_query($db, $sql); rg_sql_free_result($res); $new['repo_id'] = $repo_id; rg_cache_unset('repo_by_name::' . $rg_ui['uid'], RG_SOCKET_NO_WAIT); } rg_log('Waiting for the repo git dir to be created...'); $key = 'repo_by_id' . '::' . $extra['repo_id']; $tries = 10; while ($tries-- > 0) { rg_cache_core_unset($key); $r = rg_cache_get($key); if ($r === FALSE) { rg_log('r is FALSE'); sleep(1); continue; } //rg_log_ml('DEBUG: r: ' . print_r($r, TRUE)); if ($r['git_dir_done'] == 1) break; sleep(1); } return TRUE; } /* * Helper for creating and uploading a ssh key * Returns the key. */ function rg_test_upload_ssh_key($db, $rg_ui, $key_name, $good_sid) { global $test_url; rg_log("Generating a SSH key [$key_name]"); @unlink("keys/" . $key_name); @unlink("keys/" . $key_name . ".pub"); $out = shell_exec("ssh-keygen -t rsa -N '' -C \"Key for RocketGit\"" . " -f keys/" . $key_name . " </dev/null"); if (!file_exists("keys/" . $key_name . ".pub")) { rg_log("Could not generate ssh key: " . $out); exit(1); } $key = file_get_contents("keys/" . $key_name . ".pub"); rg_log("Loading ssh key form..."); $data = array(); $headers = array("Cookie: sid=" . $good_sid); $r = do_req($test_url . "/op/settings/keys?t=ssh2", $data, $headers); if ($r === FALSE) { rg_log("Cannot load form!"); exit(1); } if (empty($r['tokens']['keys'])) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log('token not found!'); exit(1); } rg_log("Uploading the key..."); $data = array('add' => 1, 'token' => $r['tokens']['keys'], 'key' => $key); $headers = array('Cookie: sid=' . $good_sid); $r = do_req($test_url . '/op/settings/keys?t=upload_ssh_key', $data, $headers); if ($r === FALSE) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log_ml("Cannot upload key!"); exit(1); } rg_log("Waiting for key to be added to the authorized_keys file"); while (1) { $c = file_get_contents("/home/rocketgit/.ssh/authorized_keys"); if (strstr($c, $key)) break; sleep(1); } rg_log("Uploading done"); return $key; } /* * Helper for generating scratch codes * Returns the scratch codes. */ function rg_test_sc_generate($db, $rg_ui, $good_sid) { global $test_url; rg_log("Loading generate scratch codes form..."); $data = array(); $headers = array("Cookie: sid=" . $good_sid); $r = do_req($test_url . "/op/settings/totp/sc", $data, $headers); if ($r === FALSE) { rg_log("Cannot load form!"); exit(1); } if (empty($r['tokens']['sc'])) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log('token not found!'); exit(1); } rg_log("Generating scratch codes..."); $data = array('generate' => 1, 'token' => $r['tokens']['sc']); $headers = array('Cookie: sid=' . $good_sid); $r = do_req($test_url . '/op/settings/totp/sc', $data, $headers); if ($r === FALSE) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log_ml('Cannot generate scratch codes!'); exit(1); } rg_log("Generation done"); $t = explode('<div class="secret_token">', $r['body']); $t = explode('</div>', $t[1]); $t = explode("\n", $t[0]); $sc = explode(' ', trim($t[1])); rg_log_ml('DEBUG: sc: ' . print_r($sc, TRUE)); return $sc; } /* * Helper for adding a webhook */ function rg_test_wh_add_edit($db, $rg_ui, $good_sid, $htype, $extra) { global $test_url; rg_log("Loading webhook add form..."); $data = array('wh::htype' => $htype); $headers = array("Cookie: sid=" . $good_sid); if (!isset($extra['wh::id'])) $extra['wh::id'] = 0; if ($extra['wh::id'] == 0) $url = 'add'; else $url = 'edit/' . $extra['wh::id']; $r = do_req($test_url . "/op/settings/wh/" . $url, $data, $headers); if ($r === FALSE) { rg_log("Cannot load form!"); exit(1); } if (empty($r['tokens']['wh_add'])) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log_ml('Token not found!'); exit(1); } rg_log("Adding webhook..."); $data = array('add' => 1, 'token' => $r['tokens']['wh_add']); $data = array_merge($data, $extra); $headers = array('Cookie: sid=' . $good_sid); $r = do_req($test_url . '/op/settings/wh/' . $url, $data, $headers); if ($r === FALSE) { rg_log_ml('r: ' . print_r($r, TRUE)); rg_log_ml('Cannot add webhook!'); exit(1); } if (!strstr($r['body'], 'with success')) { rg_log_ml('r[body]: ' . print_r($r['body'], TRUE)); rg_log('Cannot add webhook (no \'with success\' message)!'); exit(1); } } ?>