Author: Sergey Panteleev (saundefined)
Date: 2024-12-19T14:03:06+03:00

Commit: 
https://github.com/php/web-master/commit/4ceb79fed8441d64c418ca26f0667f635ba6ae12
Raw diff: 
https://github.com/php/web-master/commit/4ceb79fed8441d64c418ca26f0667f635ba6ae12.diff

Add GitHub support

Changed paths:
  D  public/manage/github.php
  M  include/functions.inc
  M  public/entry/svn-account.php
  M  public/manage/users.php


Diff:

diff --git a/include/functions.inc b/include/functions.inc
index b278a0f..2fd6f60 100644
--- a/include/functions.inc
+++ b/include/functions.inc
@@ -36,7 +36,6 @@ function head($title="", $config = []) {
         ["href" => "/manage/event.php",        "text" => "Events"],
         ["href" => "/manage/users.php",        "text" => "Users"],
         ["href" => "/manage/user-notes.php",   "text" => "Notes"],
-        ["href" => "/manage/github.php",       "text" => "Github"],
     ];
     $CSS = ["/styles/master.css"];
     $SEARCH = [];
diff --git a/public/entry/svn-account.php b/public/entry/svn-account.php
index 02a9c2b..638f4c2 100644
--- a/public/entry/svn-account.php
+++ b/public/entry/svn-account.php
@@ -6,12 +6,12 @@
 require __DIR__ . '/../../include/email-validation.inc';
 require __DIR__ . '/../../include/functions.inc';
 
-$valid_vars = ['name','email','username','passwd','note','group','yesno'];
+$valid_vars = 
['name','email','username','passwd','github','note','group','yesno'];
 foreach($valid_vars as $k) {
     if(isset($_REQUEST[$k])) $$k = $_REQUEST[$k];
 }
 
-if (empty($name) || empty($email) || empty($username) || empty($passwd) || 
empty($note) || empty($group))
+if (empty($name) || empty($email) || empty($username) || empty($passwd) || 
empty($github) || empty($note) || empty($group))
   die("missing some parameters");
 
 // Sophisticated security/spam protection question
@@ -75,15 +75,16 @@
 $svnpasswd = gen_pass($passwd);
 $note = hsc($note);
 
-$query = "INSERT INTO users (name,email,svnpasswd,username) VALUES (?, ?, ?, 
?)";
+$query = "INSERT INTO users (name,email,svnpasswd,username,$github) VALUES (?, 
?, ?, ?, ?)";
 try {
-  $pdo->safeQuery($query, [$name, $email, $svnpasswd, $username]);
+  $pdo->safeQuery($query, [$name, $email, $svnpasswd, $username, $github]);
 } catch (\PDOException $e) {
   mail($failto,"VCS Account Request: $username",
       "Failed to insert into database: ".$e->getMessage()."\n\n".
       "Full name: $name\n".
       "Email:     $email\n".
       "ID:        $username\n".
+      "GitHub:    $username\n".
       "Purpose:   $note",
        "From: \"VCS Account Request\" <$email>");
   exit;
diff --git a/public/manage/github.php b/public/manage/github.php
deleted file mode 100644
index d340be2..0000000
--- a/public/manage/github.php
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php // vim: et ts=2 sw=2
-
-// This script evolved from a quick'n'dirty shell script. If you are reading
-// this feel free to clean it!
-
-require __DIR__ . '/../../vendor/autoload.php';
-require __DIR__ . '/../../include/login.inc';
-
-@include __DIR__ . '/../../github-config.php';
-if (!defined('GITHUB_CLIENT_ID') || !defined('GITHUB_CLIENT_SECRET')) {
-  die('GITHUB_CLIENT_ID or GITHUB_CLIENT_SECRET not defined. Please verify 
./github-config.php');
-}
-
-define('GITHUB_PHP_OWNER_TEAM_ID', 65141);
-define('GITHUB_REPO_TEAM_ID', 138591);
-if (!defined('GITHUB_USER_AGENT')) {
-  define('GITHUB_USER_AGENT', 'php.net repository management (main.php.net, 
syst...@php.net, johan...@php.net)');
-}
-
-function github_api($endpoint, $method = 'GET', $options = [])
-{
-  $options['method'] = $method;
-  $options['user_agent'] = GITHUB_USER_AGENT;
-
-  $ctxt = stream_context_create(['http' => $options]);
-
-  $url = 'https://api.github.com'.$endpoint;
-  $s = @file_get_contents($url, false, $ctxt);
-  if ($s === false) {
-    die('Request to GitHub failed. Endpoint: '.$endpoint);
-  }
-
-  return json_decode($s);
-}
-
-function github_current_user($access_token = false)
-{
-  if (!$access_token) {
-    $access_token = $_SESSION['github']['access_token'];
-  }
-
-  if (empty($_SESSION['github']['current_user'])) {
-    $user = github_api('/user?access_token='.urlencode($access_token));
-    if (!$user->login) {
-      die('Failed to get current user');
-    }
-
-    $_SESSION['github']['current_user'] = $user;
-  }
-
-  return $_SESSION['github']['current_user'];
-}
-
-function github_require_valid_user()
-{
-  if (isset($_SESSION['github']['access_token'])) {
-    return true;
-  }
-
-  if (isset($_GET['code'])) {
-    $data = [
-      'client_id' => GITHUB_CLIENT_ID,
-      'client_secret' => GITHUB_CLIENT_SECRET,
-      'code' => $_GET['code']
-    ];
-    $data_encoded = http_build_query($data);
-    $opts = [
-      'method' => 'POST',
-      'user_agent' => GITHUB_USER_AGENT,
-      'header'  => 'Content-type: application/x-www-form-urlencoded',
-      'content' => $data_encoded,
-    ];
-    $ctxt = stream_context_create(['http' => $opts]);
-    $s = @file_get_contents('https://github.com/login/oauth/access_token', 
false, $ctxt);
-    if (!$s) {
-      die('Failed while checking with GitHub,either you are trying to hack us 
or our configuration is wrong (GITHUB_CLIENT_SECRET outdated?)');
-    }
-    $gh = [];
-    parse_str($s, $gh);
-    if (empty($gh['access_token'])) {
-      die("GitHub responded but didn't send an access_token");
-    }
-
-    $user = github_current_user($gh['access_token']);
-
-    $endpoint = 
'/teams/'.urlencode((string)GITHUB_PHP_OWNER_TEAM_ID).'/members/'.urlencode($user->login);
-    $opts = ['user_agent' => GITHUB_USER_AGENT];
-    $ctxt = stream_context_create(['http' => $opts]);
-    $is_member = 
file_get_contents('https://api.github.com'.$endpoint.'?access_token='.urlencode($gh['access_token']),
 false, $ctxt);
-
-    if ($is_member === false) {
-      head("github administration");
-      echo '<h1>You (Authenticated GitHub user: '.htmlentities($user->login). 
') are no member of the php organization on github.</h1>'.
-        '<p>Please contact an existing member if you see need.</p>';
-      foot();
-      exit;
-    }
-    // SUCCESS
-    $_SESSION['github']['access_token'] = $gh['access_token'];
-    header('Location: github.php');
-    exit;
-  }
-
-  // Start oauth
-  header('Location: 
https://github.com/login/oauth/authorize?scope=repo&client_id='.urlencode(GITHUB_CLIENT_ID));
-  exit;
-}
-
-if (isset($_POST['description']) && 
isset($_SESSION['github']['access_token'])) {
-  action_create_repo();
-} elseif (isset($_GET['login']) || isset($_GET['code']) || 
isset($_SESSION['github']['access_token'])) {
-  action_form();
-} else {
-  action_default();
-}
-
-function action_default()
-{
-  head("github administration");
-  echo '<p>This tool is for administrating PHP repos on GitHub. Currently it 
is used for adding repos only.</p>';
-  echo '<p><b>NOTE:</b> Only members of the PHP organisation on GitHub can use 
this tool. We try to keep the number of members limited.</p>';
-  echo '<p>In case you are a member you can <a href="github.php?login=1">login 
using GitHub</a>.</p>';
-  foot();
-}
-
-function action_form()
-{
-  github_require_valid_user();
-  $user = $_SESSION['github']['current_user'];
-  head("github administration");
-?>
-<p><b>GitHub user: </b> <?php echo htmlentities($user->login); ?></p>
-<p>Creating a GitHub repo using this form ensures the proper configuration. 
This
-includes disabling the GitHub wiki and issue tracker as well as enabling the
-php-pulls user to push changes made on git.php.net.</p>
-<p>The name, description and homepage should follow other existing 
repositories.</p>
-<form method="post" action="github.php">
-Github repo name: https://github.com/php/<input name="name"> (i.e. 
pecl-category-foobar)<br>
-Description: <input name="description"> (i.e. PECL foobar extension)<br>
-Homepage: <input name="homepage"> (i.e. http://pecl.php.net/package/foobar)<br>
-<input type="submit" value="Create Repository on GitHub">
-<input type="hidden" name="action" value="create">
-<?php
-  foot();
-}
-
-function action_create_repo()
-{
-  github_require_valid_user();
-
-  $data = [
-    'name' => $_POST['name'],
-    'description' => $_POST['description'],
-
-    'homepage' => $_POST['homepage'],
-    'private' => false,
-    'has_issues' => false,
-    'has_wiki' => false,
-    'has_downloads' => false,
-    'team_id' => GITHUB_REPO_TEAM_ID,
-  ];
-  $data_j = json_encode($data);
-  $opts = [
-    'content' => $data_j,
-  ];
-  $res = 
github_api('/orgs/php/repos?access_token='.urlencode($_SESSION['github']['access_token']),
 'POST', $opts);
-
-  head("github administration");
-  if (isset($res->html_url)) {
-    echo '<p>Repo created!</p><p><a href="'.htmlentities($res->html_url, 
ENT_QUOTES).'">Check on GitHub</a>.</p>';
-  } else {
-    echo "Error while creating repo.";
-  }
-  foot();
-}
-?>
diff --git a/public/manage/users.php b/public/manage/users.php
index f40c584..d1ff9a6 100644
--- a/public/manage/users.php
+++ b/public/manage/users.php
@@ -49,6 +49,7 @@ function csrf_validate(&$mydata, $name) {
   "use_sa"           => FILTER_VALIDATE_INT,
   "email"            => FILTER_SANITIZE_EMAIL,
   "name"             => FILTER_SANITIZE_SPECIAL_CHARS,
+  "github"           => FILTER_SANITIZE_SPECIAL_CHARS,
   "sshkey"           => FILTER_SANITIZE_SPECIAL_CHARS,
   "purpose"          => FILTER_SANITIZE_SPECIAL_CHARS,
   "profile_markdown" => FILTER_UNSAFE_RAW,
@@ -139,6 +140,9 @@ function csrf_validate(&$mydata, $name) {
           if (is_admin($_SESSION["username"])) {
               $query->add(',cvsaccess=?', [$cvsaccess]);
           }
+          if (!empty($in['github'])) {
+              $query->add(',github=?', [$in['github']]);
+          }
           $query->add(
             ',spamprotect=?, enable=?, use_sa=?, greylist=?',
             [$spamprotect, $enable, $use_sa, $greylist]);
@@ -198,6 +202,10 @@ function csrf_validate(&$mydata, $name) {
  <td><?php echo hsc($userdata['username']);?></td>
 <?php endif ?>
 </tr>
+<tr>
+ <th>VCS username:</th>
+ <td><input type="text" name="in[github]" value="<?php echo 
hsc($userdata['github']);?>" size="39" maxlength="39" /></td>
+</tr>
 <tr>
  <td colspan="2">Leave password fields blank to leave password unchanged.</td>
 </tr>

Reply via email to