cvs: pearweb /include pear-auth.php pear-config.php pear-format-xmlrpc.php pear-prepend.php /public_html test.php xmlrpc.php /sql releases.sql
| From: | Stig Bakken | Date: | Fri, 20 Apr 2001 10:31:37 +0000 |
| Subject: | cvs: pearweb /include pear-auth.php pear-config.php pear-format-xmlrpc.php pear-prepend.php /public_html test.php xmlrpc.php /sql releases.sql | ||
| Groups: | php.pear.cvs | ||
| Request: | Send a blank email to pear-cvs+get-61@lists.php.net to get a copy of this message | ||
ssb Fri Apr 20 03:31:37 2001 EDT
Added files:
/pearweb/include pear-config.php pear-format-xmlrpc.php
/pearweb/public_html test.php
Modified files:
/pearweb/include pear-auth.php pear-prepend.php
/pearweb/public_html xmlrpc.php
/pearweb/sql releases.sql
Log:
* added XML-RPC to upload packages
Index: pearweb/include/pear-auth.php diff -u pearweb/include/pear-auth.php:1.3 pearweb/include/pear-auth.php:1.4 --- pearweb/include/pear-auth.php:1.3 Thu Apr 19 04:45:48 2001 +++ pearweb/include/pear-auth.php Fri Apr 20 03:31:36 2001 @@ -1,9 +1,13 @@ <?php -define('PEAR_AUTH_REALM', 'PEAR user'); - -function auth_reject($realm, $message = "Login Failed!") +function auth_reject($realm = null, $message = null) { + if ($realm === null) { + $realm = PEAR_AUTH_REALM; + } + if ($message === null) { + $message = "Login Failed!"; + } Header("HTTP/1.0 401 Unauthorized"); Header("WWW-authenticate: basic realm=\"$realm\""); response_header($message); @@ -12,14 +16,14 @@ exit; } -function auth_require($level = 0) +function auth_require($level = 0, $doexit = true) { global $PHP_AUTH_USER, $PHP_AUTH_PW, $dbh, $auth_user; $auth_user =& new PEAR_User(&$dbh, strtolower($PHP_AUTH_USER)); $auth_user->_readonly = true; if (DB::isError($auth_user) || md5($PHP_AUTH_PW) != $auth_user->password) { - auth_reject(PEAR_AUTH_REALM); + auth_reject(); } } Index: pearweb/include/pear-prepend.php diff -u pearweb/include/pear-prepend.php:1.8 pearweb/include/pear-prepend.php:1.9 --- pearweb/include/pear-prepend.php:1.8 Sun Apr 15 01:56:27 2001 +++ pearweb/include/pear-prepend.php Fri Apr 20 03:31:36 2001 @@ -2,39 +2,30 @@ require_once "DB.php"; require_once "DB/storage.php"; +require_once "pear-config.php"; +require_once "pear-auth.php"; +require_once "pear-database.php"; -require "pear-auth.php"; -require "pear-database.php"; +if (empty($format) && basename($PHP_SELF) == "xmlrpc.php") { + $format = "xmlrpc"; +} switch ($format) { -/* - case "nativephp": - break; case "xmlrpc": break; -*/ - case "xml": - break; case "html": break; default: $format = "html"; break; } - -include "pear-format-$format.php"; -$DSN = "mysql://pear:pear@localhost/pear"; - +include_once "pear-format-$format.php"; PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, "error_handler"); if (!is_object($dbh)) { - $dbh = DB::connect($DSN, array("debug" => 2)); -} - -if (DB::isError($dbh)) { - error_handler($dbh); + $dbh = DB::connect(PEAR_DATABASE_DSN, + array('persistent' => true)); } -$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, "error_handler"); ?> Index: pearweb/public_html/xmlrpc.php diff -u pearweb/public_html/xmlrpc.php:1.1 pearweb/public_html/xmlrpc.php:1.2 --- pearweb/public_html/xmlrpc.php:1.1 Thu Apr 19 04:45:50 2001 +++ pearweb/public_html/xmlrpc.php Fri Apr 20 03:31:36 2001 @@ -3,36 +3,33 @@ require_once "xmlrpc.inc"; require_once "xmlrpcs.inc"; -$test_sig = array(array($xmlrpcString)); -$test_doc = "Test XML-RPC method"; -function test_wrp($m) { - $marg = $m->getParam(0); - $arg = $marg->scalarval(); -} - -$release_upload_sig = array(array($xmlrpcStruct, // return type - $xmlrpcString, // package - $xmlrpcString, // version - $xmlrpcString, // release notes - $xmlrpcBase64, // tar ball - $xmlrpcString // md5sum - )); -$release_upload_doc = "Upload a new release for a package."; +ini_set("track_errors", true); -function release_upload($m) { +$GLOBALS['release_upload_sig'] = +array( + array($GLOBALS['xmlrpcString'], // return type + $GLOBALS['xmlrpcString'], // package + $GLOBALS['xmlrpcString'], // version + $GLOBALS['xmlrpcString'], // release notes + $GLOBALS['xmlrpcBase64'], // tar ball + $GLOBALS['xmlrpcString']),// md5sum + ); +$GLOBALS['release_upload_doc'] = "Upload a new release for a package."; + +function release_upload($m) +{ + global $_return_value, $xmlrpcerruser, $xmlrpcBoolean, $dbh, $auth_user; // parameters: package, version, releasenotes, tarball, md5sum // implicit: doneby, releasedate - // 1. verify that package exists - // 2. verify that user has access + // 1. verify that user has access + // 2. verify that package exists // 3. verify that version does not exist // 4. store tar ball to temp file // 5. verify md5 checksum // later: do lots of integrity checks on the tarball - global $xmlrpcerruser; - $mpackage = $m->getParam(0); $mversion = $m->getParam(1); $mrelnotes = $m->getParam(2); @@ -44,12 +41,62 @@ $relnotes = $mrelnotes->scalarval(); $distfile = $mdistfile->scalarval(); $md5sum = $mmd5sum->scalarval(); + + // (1) verify that user has access + auth_require(0); + if (isset($_return_value)) return $_return_value; + // XXX FIXME check acl table + + // (2) verify that package exists + $test = $dbh->getOne("SELECT name FROM packages WHERE name = ?", + array($package)); + if (isset($_return_value)) return $_return_value; + if (empty($test)) { + return xmlrpc_error("nonexistant package: $package"); + } + + // (3) verify that version does not exist + $test = $dbh->getOne("SELECT version FROM releases ". + "WHERE package = ? AND version = ?", + array($package, $version)); + if (isset($_return_value)) return $_return_value; + if ($test) { + return xmlrpc_error("already exists: $package $version"); + } - if (md5($distfile) != $md5sum) { - return new xmlrpcresp(0, $xmlrpcerruser, "bad md5 checksum"); + // (4) store tar ball to temp file + $tempfile = sprintf("%s/%s%s-%s.tgz", + PEAR_TARBALL_DIR, ".new.", $package,$version); + $file = sprintf("%s/%s-%s.tgz", PEAR_TARBALL_DIR, $package,$version); + $fp = @fopen($tempfile, "w"); + if (!$fp) { + return xmlrpc_error($php_errormsg); } + fwrite($fp, $distfile); + fclose($fp); + if (!@rename($tempfile, $file)) { + return xmlrpc_error("rename failed: $php_errormsg"); + } + + // (5) verify MD5 checksum + ob_start(); + readfile($file); + $data = ob_get_contents(); + ob_end_clean(); + if (md5($data) != $md5sum) { + return xmlrpc_error("bad md5 checksum"); + } + + // Update releases table + $query = "INSERT INTO releases VALUES(?,?,?,?,?,?,?)"; + $sth = $dbh->prepare($query); + $dbh->execute($sth, array($package, $version, $auth_user->handle, + gmdate('Y-m-d H:i'), $relnotes, $md5sum, + $file)); + if (isset($_return_value)) return $_return_value; - return new xmlrpcresp(new xmlrpcval("ok", "string")); + // success + return new xmlrpcresp(new xmlrpcval(1, $xmlrpcBoolean)); } $s = new xmlrpc_server(array("release.upload" => Index: pearweb/sql/releases.sql diff -u pearweb/sql/releases.sql:1.3 pearweb/sql/releases.sql:1.4 --- pearweb/sql/releases.sql:1.3 Thu Apr 19 04:45:51 2001 +++ pearweb/sql/releases.sql Fri Apr 20 03:31:36 2001 @@ -1,5 +1,4 @@ CREATE TABLE releases ( - id INTEGER NOT NULL AUTO_INCREMENT, package VARCHAR(80) NOT NULL REFERENCES packages(name), version VARCHAR(20) NOT NULL, doneby VARCHAR(20) NOT NULL REFERENCES users(handle), @@ -8,6 +7,5 @@ md5sum VARCHAR(32), distfile VARCHAR(200), - PRIMARY KEY(id), - UNIQUE INDEX(package, version) + PRIMARY KEY(package, version) ); Index: pearweb/include/pear-config.php +++ pearweb/include/pear-config.php <?php define('PEAR_AUTH_REALM', 'PEAR user'); define('PEAR_UPLOAD_TMPDIR', '/var/tmp/pear/uploads'); define('PEAR_TARBALL_DIR', '/var/lib/pear'); define('PEAR_DATABASE_DSN', 'mysql://pear:pear@localhost/pear'); ?> Index: pearweb/include/pear-format-xmlrpc.php +++ pearweb/include/pear-format-xmlrpc.php <?php require_once "xmlrpc.inc"; require_once "xmlrpcs.inc"; $GLOBALS['_return_value'] = null; function response_header($title = null, $style = null) { static $called; if ($called) { return; } $called = true; } function response_footer($style = false) { global $_return_value; static $called; if ($called) { return; } $called = true; } function menu_link($text, $url) { } function &xmlrpc_error($str) { global $xmlrpcerruser; $error = new xmlrpcresp(0, $xmlrpcerruser, $str); return $error; } function report_error($error) { global $_return_value, $xmlrpcerruser; if (PEAR::isError($error)) { $error = $error->getMessage(); } $_return_value = new xmlrpcresp(0, $xmlrpcerruser, $error); } function error_handler($errobj) { global $_return_value, $xmlrpcerruser; if (PEAR::isError($errobj)) { $msg = $errobj->getMessage(); $info = $errobj->getUserInfo(); } else { $msg = $errobj; $info = ''; } $report = "$msg"; if ($info) { $report .= " ** $info"; } report_error($report); } ?> Index: pearweb/public_html/test.php +++ pearweb/public_html/test.php <?php require_once "xmlrpc.inc"; response_header("XML-RPC test"); ob_start(); readfile("/home/ssb/cvs/php/pear/HTTP/HTTP-1.0.tgz"); $data = ob_get_contents(); ob_end_clean(); $f = new xmlrpcmsg('release.upload', array(new xmlrpcval("HTTP", $xmlrpcString), new xmlrpcval("1.0", $xmlrpcString), new xmlrpcval("Initial release", $xmlrpcString), new xmlrpcval($data, $xmlrpcBase64), new xmlrpcval(md5($data), $xmlrpcString))); $c = new xmlrpc_client("/xmlrpc.php", "pear.localdomain", 80); $c->setCredentials("ssb", "bing"); $c->setDebug(1); $r=$c->send($f); if (!$r) { die("send failed"); } $v=$r->value(); if (!$r->faultCode()) { print "return value is " . $v->scalarval() . "<BR>"; } else { print "Fault: "; print "Code: " . $r->faultCode() . " Reason '" .$r->faultString()."'<BR>"; } response_footer(); ?>
Index: pearweb/include/pear-auth.php diff -u pearweb/include/pear-auth.php:1.3 pearweb/include/pear-auth.php:1.4 --- pearweb/include/pear-auth.php:1.3 Thu Apr 19 04:45:48 2001 +++ pearweb/include/pear-auth.php Fri Apr 20 03:31:36 2001 @@ -1,9 +1,13 @@ <?php -define('PEAR_AUTH_REALM', 'PEAR user'); - -function auth_reject($realm, $message = "Login Failed!") +function auth_reject($realm = null, $message = null) { + if ($realm === null) { + $realm = PEAR_AUTH_REALM; + } + if ($message === null) { + $message = "Login Failed!"; + } Header("HTTP/1.0 401 Unauthorized"); Header("WWW-authenticate: basic realm=\"$realm\""); response_header($message); @@ -12,14 +16,14 @@ exit; } -function auth_require($level = 0) +function auth_require($level = 0, $doexit = true) { global $PHP_AUTH_USER, $PHP_AUTH_PW, $dbh, $auth_user; $auth_user =& new PEAR_User(&$dbh, strtolower($PHP_AUTH_USER)); $auth_user->_readonly = true; if (DB::isError($auth_user) || md5($PHP_AUTH_PW) != $auth_user->password) { - auth_reject(PEAR_AUTH_REALM); + auth_reject(); } } Index: pearweb/include/pear-prepend.php diff -u pearweb/include/pear-prepend.php:1.8 pearweb/include/pear-prepend.php:1.9 --- pearweb/include/pear-prepend.php:1.8 Sun Apr 15 01:56:27 2001 +++ pearweb/include/pear-prepend.php Fri Apr 20 03:31:36 2001 @@ -2,39 +2,30 @@ require_once "DB.php"; require_once "DB/storage.php"; +require_once "pear-config.php"; +require_once "pear-auth.php"; +require_once "pear-database.php"; -require "pear-auth.php"; -require "pear-database.php"; +if (empty($format) && basename($PHP_SELF) == "xmlrpc.php") { + $format = "xmlrpc"; +} switch ($format) { -/* - case "nativephp": - break; case "xmlrpc": break; -*/ - case "xml": - break; case "html": break; default: $format = "html"; break; } - -include "pear-format-$format.php"; -$DSN = "mysql://pear:pear@localhost/pear"; - +include_once "pear-format-$format.php"; PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, "error_handler"); if (!is_object($dbh)) { - $dbh = DB::connect($DSN, array("debug" => 2)); -} - -if (DB::isError($dbh)) { - error_handler($dbh); + $dbh = DB::connect(PEAR_DATABASE_DSN, + array('persistent' => true)); } -$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, "error_handler"); ?> Index: pearweb/public_html/xmlrpc.php diff -u pearweb/public_html/xmlrpc.php:1.1 pearweb/public_html/xmlrpc.php:1.2 --- pearweb/public_html/xmlrpc.php:1.1 Thu Apr 19 04:45:50 2001 +++ pearweb/public_html/xmlrpc.php Fri Apr 20 03:31:36 2001 @@ -3,36 +3,33 @@ require_once "xmlrpc.inc"; require_once "xmlrpcs.inc"; -$test_sig = array(array($xmlrpcString)); -$test_doc = "Test XML-RPC method"; -function test_wrp($m) { - $marg = $m->getParam(0); - $arg = $marg->scalarval(); -} - -$release_upload_sig = array(array($xmlrpcStruct, // return type - $xmlrpcString, // package - $xmlrpcString, // version - $xmlrpcString, // release notes - $xmlrpcBase64, // tar ball - $xmlrpcString // md5sum - )); -$release_upload_doc = "Upload a new release for a package."; +ini_set("track_errors", true); -function release_upload($m) { +$GLOBALS['release_upload_sig'] = +array( + array($GLOBALS['xmlrpcString'], // return type + $GLOBALS['xmlrpcString'], // package + $GLOBALS['xmlrpcString'], // version + $GLOBALS['xmlrpcString'], // release notes + $GLOBALS['xmlrpcBase64'], // tar ball + $GLOBALS['xmlrpcString']),// md5sum + ); +$GLOBALS['release_upload_doc'] = "Upload a new release for a package."; + +function release_upload($m) +{ + global $_return_value, $xmlrpcerruser, $xmlrpcBoolean, $dbh, $auth_user; // parameters: package, version, releasenotes, tarball, md5sum // implicit: doneby, releasedate - // 1. verify that package exists - // 2. verify that user has access + // 1. verify that user has access + // 2. verify that package exists // 3. verify that version does not exist // 4. store tar ball to temp file // 5. verify md5 checksum // later: do lots of integrity checks on the tarball - global $xmlrpcerruser; - $mpackage = $m->getParam(0); $mversion = $m->getParam(1); $mrelnotes = $m->getParam(2); @@ -44,12 +41,62 @@ $relnotes = $mrelnotes->scalarval(); $distfile = $mdistfile->scalarval(); $md5sum = $mmd5sum->scalarval(); + + // (1) verify that user has access + auth_require(0); + if (isset($_return_value)) return $_return_value; + // XXX FIXME check acl table + + // (2) verify that package exists + $test = $dbh->getOne("SELECT name FROM packages WHERE name = ?", + array($package)); + if (isset($_return_value)) return $_return_value; + if (empty($test)) { + return xmlrpc_error("nonexistant package: $package"); + } + + // (3) verify that version does not exist + $test = $dbh->getOne("SELECT version FROM releases ". + "WHERE package = ? AND version = ?", + array($package, $version)); + if (isset($_return_value)) return $_return_value; + if ($test) { + return xmlrpc_error("already exists: $package $version"); + } - if (md5($distfile) != $md5sum) { - return new xmlrpcresp(0, $xmlrpcerruser, "bad md5 checksum"); + // (4) store tar ball to temp file + $tempfile = sprintf("%s/%s%s-%s.tgz", + PEAR_TARBALL_DIR, ".new.", $package,$version); + $file = sprintf("%s/%s-%s.tgz", PEAR_TARBALL_DIR, $package,$version); + $fp = @fopen($tempfile, "w"); + if (!$fp) { + return xmlrpc_error($php_errormsg); } + fwrite($fp, $distfile); + fclose($fp); + if (!@rename($tempfile, $file)) { + return xmlrpc_error("rename failed: $php_errormsg"); + } + + // (5) verify MD5 checksum + ob_start(); + readfile($file); + $data = ob_get_contents(); + ob_end_clean(); + if (md5($data) != $md5sum) { + return xmlrpc_error("bad md5 checksum"); + } + + // Update releases table + $query = "INSERT INTO releases VALUES(?,?,?,?,?,?,?)"; + $sth = $dbh->prepare($query); + $dbh->execute($sth, array($package, $version, $auth_user->handle, + gmdate('Y-m-d H:i'), $relnotes, $md5sum, + $file)); + if (isset($_return_value)) return $_return_value; - return new xmlrpcresp(new xmlrpcval("ok", "string")); + // success + return new xmlrpcresp(new xmlrpcval(1, $xmlrpcBoolean)); } $s = new xmlrpc_server(array("release.upload" => Index: pearweb/sql/releases.sql diff -u pearweb/sql/releases.sql:1.3 pearweb/sql/releases.sql:1.4 --- pearweb/sql/releases.sql:1.3 Thu Apr 19 04:45:51 2001 +++ pearweb/sql/releases.sql Fri Apr 20 03:31:36 2001 @@ -1,5 +1,4 @@ CREATE TABLE releases ( - id INTEGER NOT NULL AUTO_INCREMENT, package VARCHAR(80) NOT NULL REFERENCES packages(name), version VARCHAR(20) NOT NULL, doneby VARCHAR(20) NOT NULL REFERENCES users(handle), @@ -8,6 +7,5 @@ md5sum VARCHAR(32), distfile VARCHAR(200), - PRIMARY KEY(id), - UNIQUE INDEX(package, version) + PRIMARY KEY(package, version) ); Index: pearweb/include/pear-config.php +++ pearweb/include/pear-config.php <?php define('PEAR_AUTH_REALM', 'PEAR user'); define('PEAR_UPLOAD_TMPDIR', '/var/tmp/pear/uploads'); define('PEAR_TARBALL_DIR', '/var/lib/pear'); define('PEAR_DATABASE_DSN', 'mysql://pear:pear@localhost/pear'); ?> Index: pearweb/include/pear-format-xmlrpc.php +++ pearweb/include/pear-format-xmlrpc.php <?php require_once "xmlrpc.inc"; require_once "xmlrpcs.inc"; $GLOBALS['_return_value'] = null; function response_header($title = null, $style = null) { static $called; if ($called) { return; } $called = true; } function response_footer($style = false) { global $_return_value; static $called; if ($called) { return; } $called = true; } function menu_link($text, $url) { } function &xmlrpc_error($str) { global $xmlrpcerruser; $error = new xmlrpcresp(0, $xmlrpcerruser, $str); return $error; } function report_error($error) { global $_return_value, $xmlrpcerruser; if (PEAR::isError($error)) { $error = $error->getMessage(); } $_return_value = new xmlrpcresp(0, $xmlrpcerruser, $error); } function error_handler($errobj) { global $_return_value, $xmlrpcerruser; if (PEAR::isError($errobj)) { $msg = $errobj->getMessage(); $info = $errobj->getUserInfo(); } else { $msg = $errobj; $info = ''; } $report = "$msg"; if ($info) { $report .= " ** $info"; } report_error($report); } ?> Index: pearweb/public_html/test.php +++ pearweb/public_html/test.php <?php require_once "xmlrpc.inc"; response_header("XML-RPC test"); ob_start(); readfile("/home/ssb/cvs/php/pear/HTTP/HTTP-1.0.tgz"); $data = ob_get_contents(); ob_end_clean(); $f = new xmlrpcmsg('release.upload', array(new xmlrpcval("HTTP", $xmlrpcString), new xmlrpcval("1.0", $xmlrpcString), new xmlrpcval("Initial release", $xmlrpcString), new xmlrpcval($data, $xmlrpcBase64), new xmlrpcval(md5($data), $xmlrpcString))); $c = new xmlrpc_client("/xmlrpc.php", "pear.localdomain", 80); $c->setCredentials("ssb", "bing"); $c->setDebug(1); $r=$c->send($f); if (!$r) { die("send failed"); } $v=$r->value(); if (!$r->faultCode()) { print "return value is " . $v->scalarval() . "<BR>"; } else { print "Fault: "; print "Code: " . $r->faultCode() . " Reason '" .$r->faultString()."'<BR>"; } response_footer(); ?>