[openSRS-PHP-CVS] CVS: opensrs-php CHANGELOG,1.12,1.13 OPS.php,1.1,1.2 README,1.12,1.13 TODO,1.8,1.9
Brought to you by:
cviebrock
Update of /cvsroot/opensrs-php/opensrs-php In directory usw-pr-cvs1:/tmp/cvs-serv27304 Modified Files: CHANGELOG OPS.php README TODO country_codes.php openSRS.php.default openSRS_base.php test.php Removed Files: XML_Codec.php Log Message: Version 2.4-beta Index: CHANGELOG =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/CHANGELOG,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- CHANGELOG 2001/06/11 15:25:21 1.12 +++ CHANGELOG 2001/12/18 02:16:10 1.13 @@ -5,6 +5,16 @@ # +Version 2.4-beta +17-Dec-2001 + - remove all DOMXML code and replace with an expat parser + (removes reliance on DOMXML extension, which is still + pretty buggy in PHP) + - most functionality is now in OPS.php + - XML_Codec.php is no longer needed + - move towards PEAR-style coding and documentation + + Version 2.3 10-Jun-2001 - re-rewrite of DOMXML code to be compatible with all current Index: OPS.php =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/OPS.php,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- OPS.php 2001/06/11 15:25:21 1.1 +++ OPS.php 2001/12/18 02:16:10 1.2 @@ -1,29 +1,42 @@ <?php -// $Id$ +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +/* $Id$ */ -class OPS { +class OPS extends PEAR { var $_OPS_VERSION = '0.9'; - var $_OPT = ''; - var $_SPACER = ' '; # indent character - var $_CRLF = "\n"; + var $_OPT = ''; + var $_SPACER = ' '; /* indent character */ + var $_CRLF = "\n"; var $_MSGTYPE_STD = 'standard'; var $_SESSID; var $_MSGCNT; - var $_XML_CODEC; - var $CRLF = "\r\n"; + var $CRLF = "\r\n"; - var $rawlog = ''; - var $xmllog = ''; + var $_log = array(); -# -# OPS() -# Class constructor -# + var $_data; + var $_pointers; + var $_last_was_data_block; + + - function OPS($args=false) { + /** + * Class constructor + * + * Initialize variables, logs, etc. + * + * @param array allows for setting various options (right now, just whether + * to use compression or not on the generated XML) + */ + + function OPS($args=false) + { + + $this->PEAR(); + if (is_array($args)) { if ($args['option']=='compress') { $this->_OPT = 'compress'; @@ -34,33 +47,208 @@ $this->_SESSID = getmypid(); $this->_MSGCNT = 0; + + $this->_log('raw','i','OPS Raw Log:'); + $this->_log('raw','i','Initialized '.date('r') ); + + $this->_log('xml','i','OPS XML Log:'); + $this->_log('xml','i','Initialized '.date('r') ); + + } + + + + + /** + * Writes a message to a socket (buffered IO) + * + * @param int socket handle + * + * @param string message to write + * + */ + + function writeData(&$fh,$msg) + { + $len = strlen($msg); + fputs($fh, 'Content-Length: ' . $len . $this->CRLF . $this->CRLF); + fputs($fh, $msg, $len ); + + $this->_log('raw', 'w', $msg, $len); + } + + + /** + * Encodes and writes a message to a socket + * + * @param int socket handle + * + * @param string message to encode and write + * + */ + + function writeMessage(&$fh, $hr ) + { + $msg = $this->encode( $hr ); + $this->writeData($fh, $msg ); + } + + + /** + * Reads data from a socket + * + * @param int socket handle + * + * @param int timeout for read + * + * @return mixed buffer with data, or an error for a short read + * + */ + + function readData(&$fh, $timeout=5) + { + $len = 0; + + /* PHP doesn't have timeout for fread ... we just set the timeout for the socket */ + + socket_set_timeout($fh, $timeout); + + $line = fgets($fh, 4000); + + if ($this->socketStatus($fh)) { + return false; + } + + if (!$len && preg_match('/^\s*Content-Length:\s+(\d+)\s*\r\n/i', $line, $matches ) ) { + $len = (int)$matches[1]; + } else { + $this->_log('raw', 'e', 'UNEXPECTED READ: No Content-Length' ); + $this->_log('raw', 'r', $line); + return false; + } + + /* wait till the empty line */ + + $line = fgets($fh, 2); + if ($this->socketStatus($fh)) { + return false; + } + + if ($line!=$this->CRLF) { + $this->_log('raw', 'e', 'UNEXPECTED READ: No CRLF'); + $this->_log('raw', 'r', $line); + return false; + } + + $line = fread($fh, $len); + if ($this->socketStatus($fh)) { + return false; + } + + if ($line) { + $buf = $line; + $this->_log('raw', 'r', $line); + } else { + $buf = false; + $this->_log('raw', 'e', 'NEXT LINE SHORT READ (should be '.$len.')' ); + $this->_log('raw', 'r', $line); + } + + return $buf; + } + + + /** + * Reads and decodes data from a socket + * + * @param int socket handle + * + * @param int timeout for read + * + * @return mixed associative array of data, or an error + * + */ + function readMessage(&$fh, $timeout=5) + { + $buf = $this->readData($fh, $timeout); + return ( $buf ? $this->decode($buf) : false ); + } + + + + /** + * Checks a socket for timeout or EOF + * + * @param int socket handle + * + * @return boolean true if the socket has timed out or is EOF + * + */ + + function socketStatus(&$fh) + { + $return = false; + if (is_resource($fh)) { + $temp = socket_get_status($fh); + if ($temp['timed_out']) { + $this->_log('raw', 'e', 'SOCKET TIMED OUT'); + $return = true; + } + if ($temp['eof']) { + $this->_log('raw', 'e', 'SOCKET EOF'); + $return = true; + } + unset($temp); + } + return $return; + } - $this->_XML_CODEC = new XML_Codec( array( 'option' => $this->_OPT) ); - $this->log = "OPS Raw Log:\n" . - "==========================================================\n" . - "Initialized: ".date('d-M-Y H:i:s') . "\n"; - - $this->xmllog = "OPS XML Log:\n" . - "==========================================================\n" . - "Initialized: ".date('d-M-Y H:i:s') . "\n" . - "----------------------------------------------------------\n"; + /** + * Internal method to generate error codes hashes + * + * @param int error code + * + * @param string error message + * + * @return array error hash + * + */ + + function _opsError($err_code,$err_text) + { + return array( + 'response_code' => $err_code, + 'response_text' => $err_text, + 'is_success' => 0 + ); } # -# decode() -# Accepts and OPS protocol message or an file handle -# and decodes the data into a PHP array +# DECODING METHODS +# Converts XML OPS messages into PHP data # + + + /** + * Accepts an OPS protocol message or an file handle + * and decodes the data into a PHP array + * + * @param string OPS message + * + * @return mixed PHP array, or error + * + */ - function decode($in) { + function decode($in) + { $ops_msg = ''; - # determine if we were passed a string or file handle + /* determine if we were passed a string or file handle */ if (is_resource($in)) { # read the file into a string, then process as usual @@ -72,74 +260,204 @@ } - # log it first + /* log it first */ - $this->_xmllog($ops_msg); + $this->_log('xml', 'r', $ops_msg); - # then strip the unneeded whitespace from the XML - # (makes traversing the tree *much* easier ... nay, *possible*) - $ops_msg = trim(preg_replace('/>\s+</m', '><', $ops_msg)); + /* decode and return */ + return $this->XML2PHP($ops_msg); - # this code is a bit different from the Perl library, - # using more XML, instead of "faking" it with regex :) - if (!$this->_XML_TREE = xmltree($ops_msg)) { + } - return $this->_ops_error("OPS_ERR", "OPS Decode Error: Message Not Valid XML"); - } else { + /** + * XML Parser that converts an OPS protocol message into a PHP array + * + * @param string OPS message + * + * @return mixed PHP array, or error + * + */ - $root = &$this->_XML_TREE->children[1]; + function XML2PHP($msg) { - if ($this->_XML_CODEC->_getTagName($root) != 'OPS_envelope') { + $this->_data = array(); + $this->_pointers = array(); + $this->_last_was_data_block = false; - return $this->_ops_error("OPS_ERR","OPS Decode Error: Envelope Protocol Not Supported"); + $xp = @xml_parser_create(); + if (!$xp) { + return $this->raiseError('Unable to create XML parser'); + } - } else { + xml_set_object($xp, $this); + xml_set_element_handler($xp, '_startElement', '_endElement'); + xml_set_character_data_handler($xp, '_characterData'); + xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); + xml_parser_set_option($xp, XML_OPTION_SKIP_WHITE, true); + xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING, 'UTF-8'); - list($xml_header,$xml_body) = $root->children; + $msg = trim(preg_replace('/>\s+</m', '><', $msg)); - $ops_header = array(); - foreach($xml_header->children as $child) { - $key = $this->_XML_CODEC->_getTagName($child); - $val = $child->children[0]->content; - $ops_header[$key] = $val; - } + if (!xml_parse($xp, $msg, 1)) { + $error = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($xp)), + xml_get_current_line_number($xp) + ); + xml_parser_free($xp); + return $this->raiseError($error); + } - list($data_block) = $xml_body->children; + xml_parser_free($xp); - if ($array = $this->_XML_CODEC->decode($data_block)) { + return ($this->_data); - # stick in the header variables + } - foreach($ops_header as $k=>$v) { - $array['_OPS_'.$k] = $v; - } - return $array; + /** + * Callback function for XML Parser + * + * @param int XML Parser resource + * @param string XML tag name + * @param array XML tag attributes + * + */ - } else { + function _startElement($parser, $name, $attributes) + { - return $this->_ops_error("OPS_ERR","OPS Decode Error: XML Parse Error"); + switch ($name) { + case 'header': + case 'body': + case 'data_block': + array_push($this->_pointers, &$this->_data ); + break; + + case 'version': + case 'msg_id': + case 'msg_type': + $key = '_OPS_' . $name; + $this->_data[$key] = ''; + array_push($this->_pointers, &$this->_data[$key] ); + break; + + case 'dt_scalar': + case 'dt_scalarref': + /* I have yet to see these in an OPS message, so we just ignore them for now */ + break; + + case 'dt_assoc': + case 'dt_array': + if ($this->_last_was_data_block) { + array_push($this->_pointers, &$this->_data ); + } else { + $c = sizeof($this->_pointers) - 1; + if (is_array($this->_pointers[$c])) { + $this->_pointers[$c][] = array(); + $d = sizeof($this->_pointers) - 1; + array_push($this->_pointers, &$this->_pointers[$c][$d] ); + } else { + $this->_pointers[$c] .= array(); + array_push($this->_pointers, &$this->_pointers[$c] ); + } + } + break; + + case 'item': + $c = sizeof($this->_pointers) - 1; + if (!is_array($this->_pointers[$c])) { + $this->_pointers[$c] = array(); + } + if(isset($attributes['key'])) { + if (isset($attributes['class'])) { /* classes wont work yet */ + $this->_pointers[$c][$attributes['key']] = new $attributes['class']; + } else { + $this->_pointers[$c][$attributes['key']] = ''; } + array_push($this->_pointers, &$this->_pointers[$c][$attributes['key']] ); } + break; + } + + $this->_last_was_data_block = ($name == 'data_block'); + } + /** + * Callback function for XML Parser + * + * @param int XML Parser resource + * @param string XML tag name + * + */ + + function _endElement($parser, $name) + { + switch ($name) { + case 'header': + case 'version': + case 'msg_id': + case 'msg_type': + case 'body': + case 'data_block': + case 'dt_assoc': + case 'dt_array': + case 'item': + array_pop($this->_pointers ); + break; + + case 'dt_scalar': + case 'dt_scalarref': + break; + + } + } + + + /** + * Callback function for XML Parser + * + * @param int XML Parser resource + * @param string XML tag data + * + */ + + function _characterData($parser, $data) { + $c = sizeof($this->_pointers) - 1; + $this->_pointers[$c] .= $data; + } + + + + # -# encode() -# Accepts an array and encodes it into an OPS protocol message +# ENCODING METHODS +# Converts PHP data into XML OPS messages # - function encode($array) { + /** + * Converts a PHP array into an OPS message + * + * @param array PHP array + * + * @return string OPS XML message + * + */ + + function encode($array) + { + $this->_MSGCNT++; - $msg_id = $this->_SESSID + $this->_MSGCNT; # addition removes the leading zero + $msg_id = $this->_SESSID + $this->_MSGCNT; /* addition removes the leading zero */ $msg_type = $this->_MSGTYPE_STD; @@ -153,7 +471,7 @@ $array['object'] = strtoupper($array['object']); } - $xml_data_block = $this->_XML_CODEC->encode($array); + $xml_data_block = $this->PHP2XML($array); $ops_msg = '<?xml version="1.0" encoding="UTF-8" standalone="no" ?>' . $this->_CRLF . '<!DOCTYPE OPS_envelope SYSTEM "ops.dtd">' . $this->_CRLF . @@ -170,7 +488,7 @@ # log it - $this->_xmllog($ops_msg); + $this->_log('xml', 'w', $ops_msg); return $ops_msg; @@ -178,205 +496,199 @@ -# -# write_data() -# writes a message to a socket (buffered IO) -# - - function write_data(&$fh,$msg) { - $len = strlen($msg); - fputs($fh, 'Content-Length: ' . $len . $this->CRLF . $this->CRLF); - fputs($fh, $msg, $len ); - - $this->_log('w',$len,$msg); - + /** + * Converts a PHP array into an OPS data_block tag + * + * @param array PHP array + * + * @return string OPS data_block tag + * + */ + + function PHP2XML($data) + { + return str_repeat($this->_SPACER,2) . '<data_block>' . + $this->_convertData($data, 3) . + $this->_CRLF . str_repeat($this->_SPACER,2) . '</data_block>'; } + /** + * Recursivly converts PHP data into XML + * + * @param mixed PHP array or data + * + * @param int ident level + * + * @return string XML string + * + */ + + function _convertData(&$array, $indent=0) + { + $string = ''; + $IND = str_repeat($this->_SPACER,$indent); + + if (is_array($array)) { + + if ($this->_is_assoc($array)) { # HASH REFERENCE + $string .= $this->_CRLF . $IND . '<dt_assoc>'; + $end = '</dt_assoc>'; + } else { # ARRAY REFERENCE + $string .= $this->_CRLF . $IND . '<dt_array>'; + $end = '</dt_array>'; + } -# -# write_message() -# Method to write a message to a socket (buffered IO) -# + foreach ($array as $k=>$v) { - function write_message(&$fh, $hr ) { - $msg = $this->encode( $hr ); - $this->write_data($fh, $msg ); - } - + $indent++; -# -# read_data() -# Reads data from a socket. -# Returns buffer with data (or false for a short read) -# + /* don't encode some types of stuff */ + if ((gettype($v)=='resource') || (gettype($v)=='user function') || (gettype($v)=='unknown type')) { + continue; + } - function read_data(&$fh, $timeout=20) { - $len = 0; + $string .= $this->_CRLF . $IND . '<item key="' . $k . '"'; - # PHP doesn't have timeout for fread ... we just set the timeout for the socket - socket_set_timeout($fh, $timeout); + if (gettype($v)=='object' && get_class($v)) { + $string .= ' class="' . get_class($v) . '"'; + } - $line = fgets($fh, 4000); + $string .= '>'; - if ($this->socket_status($fh)) { - return false; - } + if (is_array($v) || is_object($v)) { + $string .= $this->_convertData($v, $indent+1); + $string .= $this->_CRLF . $IND . '</item>'; + } else { + $string .= $this->_quoteXMLChars($v) . '</item>'; + } - if (!$len && preg_match('/^\s*Content-Length:\s+(\d+)\s*\r\n/i', $line, $matches ) ) { - $len = (int)$matches[1]; - } else { - $this->_log('e',strlen($line),'UNEXPECTED READ: No Content-Length'); - $this->_log('r',strlen($line),$line); - return false; - } + $indent--; + } - # wait till the empty line + $string .= $this->_CRLF . $IND . $end; - $line = fgets($fh, 2); - if ($this->socket_status($fh)) { - return false; - } + } else { # SCALAR - if ($line!=$this->CRLF) { - $this->_log('e',strlen($line),'UNEXPECTED READ: No CRLF'); - $this->_log('r',strlen($line),$line); - return false; + $string .= $this->_CRLF . $IND . '<dt_scalar>' . + $this->_quoteXMLChars($array) . '</dt_scalar>'; } - -# do { -# $line = fgets($fh, 4000); -# } while ($line!=$this->CRLF && !feof($fh)); -# -# if (feof($fh)) { -# $this->_log('e',0,'FEOF'); -# return false; -# } - $line = fread($fh, $len); - if ($this->socket_status($fh)) { - return false; - } + return $string; - if ($line) { - $buf = $line; - $this->_log('r',$len,$line); - } else { - $buf = false; - $this->_log('e','0','NEXT LINE SHORT READ (was only '.strlen($line).'):'); - $this->_log('r',$len,$line); - } - - return $buf; } -# -# read_message() -# Method to read message from a socket (buffer IO) -# Returns an associative array or false -# -# Default timeout on read: 5 seconds -# - function read_message(&$fh, $timeout=5) { - $buf = $this->read_data($fh, $timeout); - return ( $buf ? $this->decode($buf) : false ); - } - + /** + * Quotes special XML characters + * + * @param string string to quote + * + * @return string quoted string + * + */ - -# -# check_for_timeout() -# Check for socket timeout -# - - function socket_status(&$fh) { - $return = false; - if (is_resource($fh)) { - $temp = socket_get_status($fh); - if ($temp['timed_out']) { - $this->_log('e','0','SOCKET TIMED OUT'); - $return = true; - } - if ($temp['eof']) { - $this->_log('e','0','SOCKET EOF'); - $return = true; - } - unset($temp); - } - return $return; + function _quoteXMLChars($string) + { + $search = array ('&', '<', '>', "'", '"'); + $replace = array ('&', '<', '>', ''', '"'); + $string = str_replace($search, $replace, $string); +# $string = utf8_encode($string); + return $string; } -# -# _ops_error() -# Internal method to generate error code hashes -# - function _ops_error($err_code,$err_text){ - return array( - 'response_code' => $err_code, - 'response_text' => $err_text, - 'is_success' => 0 - ); + /** + * Determines if an array is associative or not, since PHP + * doesn't really distinguish between the two, but Perl/OPS does + * + * @param array array to check + * + * @return boolean true if the array is associative + * + */ + + function _is_assoc(&$array) + { + if (is_array($array)) { + foreach ($array as $k=>$v) { + if (!is_int($k)) { + return true; + } + } + } + return false; } -# -# _log() -# Internal logging method -# - function _log($type,$len,$msg) { + /** + * Internal loggging method + * + * @param string which log to log to + * + * @param string type of log message ('r'ead, 'w'rite, 'i'nfo or 'e'rror) + * + * @param int message + * + */ + + function _log($log, $type, $msg) + { $types = array( 'r' => 'read', 'w' => 'write', - 'e' => 'error' - ); - - $this->log .= sprintf("[% 6s:%06d] %s\n", - strtoupper($types[$type]), - $len, - $type=='e' ? $msg : bin2hex($msg) + 'e' => 'error', + 'i' => 'info' ); - } - - -# -# _xmllog() -# Internal XML method -# - function _xmllog($xml) { - $this->xmllog .= $xml . "\n" . - "----------------------------------------------------------\n"; + if ($log=='xml') { + $this->log[$log][] = sprintf("[% 6s:%06d] %s\n", + strtoupper($types[$type]), + ($type=='e' || $type=='i') ? 0 : strlen($msg), + $msg + ); + } else { + $this->log[$log][] = sprintf("[% 6s:%06d] %s\n", + strtoupper($types[$type]), + ($type=='e' || $type=='i') ? 0 : strlen($msg), + ($type=='e' || $type=='i') ? $msg : bin2hex($msg) + ); + } } -# -# showlog() -# Show internal log -# - - function showlog() { - echo "<PRE>" . htmlentities($this->log) . "</PRE>\n"; + /** + * Show internal log + * + * @param string which log to log show, 'raw' or 'xml' + * + * @param string format to display: 'html' (default) or 'raw' + * + */ + + function showLog($log, $format='html') + { + echo '<PRE>'; + foreach ($this->log[$log] as $line) { + switch ($format) { + case 'raw': + echo $line . "\n"; + break; + case 'html': + default: + echo htmlEntities($line) . "\n"; + break; + } + } + echo '</PRE>'; } -# -# showXMLlog() -# Show internal XML log -# - function showXMLlog() { - echo "<PRE>" . htmlentities($this->xmllog) . "</PRE>\n"; - } - - } - -?> Index: README =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/README,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- README 2001/06/11 15:25:21 1.12 +++ README 2001/12/18 02:16:10 1.13 @@ -1,6 +1,6 @@ OpenSRS Protocol Base Client Class - version 2.3 - 10-Jun-2001 + version 2.4-beta + 17-Dec-2001 @@ -39,22 +39,23 @@ An account with the OpenSRS Registry (http://www.opensrs.net/) PHP (http://www.php.net) - The class was developed using PHP version 4.0.5. It may - or may not be backwards compatible to 3.x versions. + The class is developed using the latest version of PHP, often the + CVS version current as of the date of this file. It is almost + certainly not backwards compatible to 3.x versions, nor is it + going to be. PHP 4 offers so much more functionality and stability + over PHP 3 that I encourage you to upgrade. It requires that support be compiled in for: - - PEAR extensions (use "--with-pear") - - the mcrypt library (use "--with-mcrypt") version 2.4.10 or higher - - DOMXML ("--with-dom") - - Perl regular expressions ("--with-pcre") + - PEAR extensions (use "--with-pear") + - the mcrypt library (use "--with-mcrypt"), as recent a stable + version as you can get (2.4.15 or higher should be safe) + - Perl regular expressions ("--with-pcre") PEAR is part of current PHP releases, but will eventually be found separately at http://pear.php.net/ mcrypt libraries can be found at http://mcrypt.hellug.gr/ or Freshmeat. - DOMXML libraries (libxml2) can be found at http://xmlsoft.org/ or Freshmeat. - PCRE libraries are part of James Clark's expat and should be part of the source to PHP 4.x. @@ -73,8 +74,7 @@ opensrs/OPS.php - the OPS message protocol class opensrs/README - this file opensrs/TODO - stuff to do - opensrs/XML_Codec.php - the XML_Codec class - opensrs/country_codes.php - list of2 and 3 letter ISO country codes + opensrs/country_codes.php - list of 2 and 3 letter ISO country codes opensrs/openSRS.php.default - a sample extended class (edit the file and remove the ".default" before using!) opensrs/openSRS_base.php - the base class file @@ -82,29 +82,34 @@ opensrs/test.php - a test PHP script opensrs/test.xml - some test XML data (not really needed) -Try running the test.php script in your browser. It should connect to -OpenSRS and output the session log. +After configuring the default class (see below), try running the test.php +script in your browser. It should connect to OpenSRS, do a lookup, and +output the session log. USAGE ----- Your first step should be to create a child class that extends the base -class, basically setting up your OpenSRS username, private key, and +class, basically setting up your OpenSRS username, private keys, and whether you want to use the test environment or live one. Something like: <?php require_once 'openSRS_base.php'; + class openSRS extends openSRS_base { - var $user = 'foobar'; # your OpenSRS username - var $private_key = 'abcdef1234567890'; # your private key goes here - var $ext_version = 'Foobar'; # anything you want - var $environment = 'TEST'; # 'TEST' or 'LIVE' + var $USERNAME = 'foobar'; # your OpenSRS username + var $TEST_PRIVATE_KEY = '1234567890abcdef'; # your private key on the live server + var $LIVE_PRIVATE_KEY = 'abcdef1234567890'; # your private key on the test (horizon) server + var $environment = 'TEST'; # 'TEST' or 'LIVE' + var $crypt_type = 'DES'; # 'DES' or 'BLOWFISH'; + var $ext_version = 'Foobar'; # anything you want } ?> + There is a sample file called "openSRS.php.default" in this distribution. Just edit the values in it, and rename it "openSRS.php". @@ -113,17 +118,16 @@ To start up a connection, just instantiate the class: - $O = new openSRS(); + $O = new openSRS; -Or override the environment like so: +Or, to override the environment, do: - $O->new openSRS('LIVE'); + $O = new openSRS('LIVE'); +From there, the important function is: -From there, the important functions are: + $response = $O->send_cmd($command); - $O->send_cmd($command); - This passes the command in $command to the server and returns the response. $O->showlog(); @@ -132,10 +136,21 @@ data passed to and from the server unencrypted ... so you probably shouldn't let your end users see its output. +You can also view the raw XML log: + + $O->_OPS->showLog('xml'); + +Or (for the truly hardcore) the raw binary log: + + $O->_OPS->showLog('raw'); + +There is also: + $O->validate($data, [$params] ); This validates the data in $data for new domain registrations. See the original -OpenSRS code for full details on it's usage. +OpenSRS code for full details on it's usage. It may or may not work: I've never +used it, personally. THANKS @@ -145,7 +160,7 @@ and general help - Victor Magdic at Tucows Inc. <vm...@tu...> who wrote the original Perl API -- the rest of the folks at OpenSRS (Ross, Dan, Charles, et al) +- the rest of the folks at OpenSRS (Ross, Dan, Charles, Erol, et al) - anyone else I forgot Index: TODO =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/TODO,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- TODO 2001/06/11 15:25:21 1.8 +++ TODO 2001/12/18 02:16:10 1.9 @@ -1,13 +1,10 @@ TODO LIST - test -- RACE encoding -- write better documentation -- test some more -- write a proper extended class that includes all the OpenSRS functions - (e.g. lookups, registrations, changes, etc.) -- did I mention test? +- ACE encoding +- complete PEAR/PHPDoc documentation +/* vim: set expandtab tabstop=4 shiftwidth=4: */ /* $Id$ */ Index: country_codes.php =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/country_codes.php,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- country_codes.php 2001/06/11 15:25:21 1.1 +++ country_codes.php 2001/12/18 02:16:10 1.2 @@ -1,5 +1,6 @@ <?php -// $Id$ +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +/* $Id$ */ $COUNTRY_CODES = array( 'ac' => 'Ascension', @@ -245,4 +246,4 @@ 'zw' => 'Zimbabwe', ); -?> + Index: openSRS.php.default =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/openSRS.php.default,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- openSRS.php.default 2001/06/11 15:25:21 1.1 +++ openSRS.php.default 2001/12/18 02:16:10 1.2 @@ -1,13 +1,16 @@ <?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ /* $Id$ */ -# -# OpenSRS Protocol Sample Extended Client Class -# +/** + * + * OpenSRS Protocol Sample Extended Client Class + * + */ -# We require the base class +/* We require the base class */ require_once 'openSRS_base.php'; @@ -24,22 +27,22 @@ var $connect_timeout = 20; # seconds var $read_timeout = 20; # seconds + var $RELATED_TLDS = array( + array( '.ca' ), + array( '.com', '.net', '.org' ), + array( '.co.uk', '.org.uk' ), + array( '.vc' ), + array( '.cc' ), + ); - var $RELATED_TLDS = array( - array( '.ca' ), - array( '.com', '.net', '.org' ), - array( '.co.uk', '.org.uk' ), - array( '.vc' ), - array( '.cc' ), - ); +/** + * You can put your own functions here to extend the class + * (e.g. convert your data structures to OpenSRS's, read + * your nameserver list out of a database, etc.) + * + */ -# -# You can put your own functions here to extend the class -# (e.g. convert your data structures to OpenSRS's, read -# your nameserver list out of a database, etc.) -# - function myFunction() { } @@ -47,4 +50,3 @@ } -?> Index: openSRS_base.php =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/openSRS_base.php,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- openSRS_base.php 2001/06/11 15:25:21 1.1 +++ openSRS_base.php 2001/12/18 02:16:10 1.2 @@ -1,85 +1,80 @@ <?php -// $Id$ +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +/* $Id$ */ -# -# OpenSRS Protocol Base Client Class -# version 2.3 -# 10-Jun-2001 -# -# -# -# REQUIREMENTS: -# OPS class 'OPS.php' (included) -# XML_Codec class 'XML_Codec.php' (included) -# PEAR's Crypt::CBC class -# PHP 4.x with PEAR, PCRE, DOMXML and mcrypt support (using libmcrypt 2.4.x) -# -# USAGE: -# see README file -# -# AUTHOR: -# Colin Viebrock <co...@ea...> -# easyDNS Technologies Inc. -# http://www.easyDNS.com -# -# BASED ON: -# XML_Client.pm and other code by OpenSRS/Tucows -# http://www.opensrs.org -# -# HISTORY: -# See CHANGELOG file -# - - +/** + * OpenSRS Protocol Base Client Class + * version 2.4 + * 17-Dec-2001 + * + * REQUIREMENTS: + * OPS class 'OPS.php' (included) + * PEAR's Crypt::CBC class + * PHP 4.x with PEAR, PCRE, XML and mcrypt support (using libmcrypt 2.4.x or later) + * + * USAGE: + * see README file + * + * AUTHOR: + * Colin Viebrock <co...@ea...> + * easyDNS Technologies Inc. + * http://www.easyDNS.com/ + * + * BASED ON: + * XML_Client.pm and other code by OpenSRS/Tucows + * http://www.opensrs.org + * + * HISTORY: + * see CHANGELOG file + * + */ -require_once 'OPS.php'; -require_once 'XML_Codec.php'; -require_once 'country_codes.php'; - # assuming that the PEAR directory is within your path, otherwise change the path here -require_once 'Crypt/CBC.php'; +require_once '/pear/PEAR.php'; +require_once '/pear/Crypt/CBC.php'; +# local requirements +require_once 'OPS.php'; +require_once 'country_codes.php'; -class openSRS_base { -# VARIABLES - var $USERNAME = ''; +class openSRS_base extends PEAR { - var $PRIVATE_KEY = ''; + var $USERNAME = ''; + var $PRIVATE_KEY = ''; var $TEST_PRIVATE_KEY = ''; var $LIVE_PRIVATE_KEY = ''; - var $VERSION = 'XML:pre0.1'; + var $VERSION = 'XML:pre0.1'; var $base_class_version = '2.2.3b'; - var $environment = 'TEST'; # 'TEST' or 'LIVE' + var $environment = 'TEST'; /* 'TEST' or 'LIVE' */ - var $LIVE_host = 'rr-n1-tor.opensrs.net'; - var $LIVE_port = 55000; - var $TEST_host = 'horizon.opensrs.net'; - var $TEST_port = 55000; + var $LIVE_host = 'rr-n1-tor.opensrs.net'; + var $LIVE_port = 55000; + var $TEST_host = 'horizon.opensrs.net'; + var $TEST_port = 55000; var $REMOTE_HOST; var $REMOTE_PORT; - var $connect_timeout = 20; # seconds - var $read_timeout = 20; # seconds + var $connect_timeout = 20; /* seconds */ + var $read_timeout = 20; /* seconds */ - var $log = ''; + var $log = array(); - var $_socket = false; + var $_socket = false; var $_socket_error_num = false; var $_socket_error_msg = false; + var $_session_key = false; - var $_session_key = false; - var $_OPS; var $_CBC; @@ -87,13 +82,11 @@ var $_CRYPT; var $_iv; - var $crypt_type = 'DES'; # 'DES' or 'BLOWFISH'; - var $crypt_mode = 'CBC'; # only 'CBC' - var $crypt_rand_source = MCRYPT_DEV_URANDOM; # or MCRYPT_DEV_RANDOM, - # or MCRYPT_RAND + var $crypt_type = 'DES'; /* 'DES' or 'BLOWFISH' */ + var $crypt_mode = 'CBC'; /* only 'CBC' */ + var $crypt_rand_source = MCRYPT_DEV_URANDOM; /* or MCRYPT_DEV_RANDOM or MCRYPT_RAND */ var $affiliate_id; - var $PERMISSIONS = array ( 'f_modify_owner' => 1, 'f_modify_admin' => 2, @@ -167,47 +160,47 @@ var $OPENSRS_ACTIONS = array ( - 'get_domain' => true, - 'get_userinfo' => true, + 'get_domain' => true, + 'get_userinfo' => true, - 'modify_domain' => true, - 'renew_domain' => true, - 'register_domain' => true, - - 'get_nameserver' => true, - 'create_nameserver' => true, - 'modify_nameserver' => true, - 'delete_nameserver' => true, - - 'get_subuser' => true, - 'add_subuser' => true, - 'modify_subuser' => true, - 'delete_subuser' => true, - - 'change_password' => true, - 'change_ownership' => true, - - 'set_cookie' => true, - 'delete_cookie' => true, - 'update_cookie' => true, - - 'sw_register_domain' => true, - 'bulk_transfer_domain' => true, - 'register_domain' => true, - - 'lookup_domain' => true, - 'get_price_domain' => true, - - 'check_transfer_domain' => true, - 'quit_session' => true, - - 'buy_webcert' => true, - 'refund_webcert' => true, - 'query_webcert' => true, - 'cprefget_webcert' => true, - 'cprefset_webcert' => true, - 'cancel_pending_webcert'=> true, - 'update_webcert' => true, + 'modify_domain' => true, + 'renew_domain' => true, + 'register_domain' => true, + + 'get_nameserver' => true, + 'create_nameserver' => true, + 'modify_nameserver' => true, + 'delete_nameserver' => true, + + 'get_subuser' => true, + 'add_subuser' => true, + 'modify_subuser' => true, + 'delete_subuser' => true, + + 'change_password' => true, + 'change_ownership' => true, + + 'set_cookie' => true, + 'delete_cookie' => true, + 'update_cookie' => true, + + 'sw_register_domain' => true, + 'bulk_transfer_domain' => true, + 'register_domain' => true, + + 'lookup_domain' => true, + 'get_price_domain' => true, + + 'check_transfer_domain' => true, + 'quit_session' => true, + + 'buy_webcert' => true, + 'refund_webcert' => true, + 'query_webcert' => true, + 'cprefget_webcert' => true, + 'cprefset_webcert' => true, + 'cancel_pending_webcert' => true, + 'update_webcert' => true, ); @@ -218,16 +211,22 @@ # -# -# openSRS_base() -# Constructor -# + /** + * Class constructor + * + * Initialize variables, logs, etc. + * + * @param string Which environment to use (live or test) + * + */ + + function openSRS_base( $environment=false ) + { - function openSRS_base($environment=false) { + $this->PEAR(); - $this->log = "OpenSRS Log:\n" . - "==========================================================\n"; - $this->_log('i', 'Initialized: '.date('d-M-Y H:i:s') ); + $this->_log('i', 'OpenSRS Log:'); + $this->_log('i', 'Initialized: '.date('r') ); $this->_OPS = new OPS; @@ -330,8 +329,7 @@ $request['registrant_ip'] = $HTTP_SERVER_VARS['REMOTE_ADDR']; if ( strstr($request['action'], 'lookup') ) { - # lookups are treated specially because XML_Client - # will automatically lookup related domain names + # lookups are treated specially $data = $this->lookup_domain( $request ); } else { # send request to server @@ -493,16 +491,6 @@ # -# showlog() -# output the debugging log -# - - function showlog() { - echo '<PRE>' . HTMLEntities($this->log) . '</PRE>'; - } - - -# # version() # return base class version # @@ -766,9 +754,9 @@ function close_socket() { fclose($this->_socket); - $this->_CBC = false; + $this->_CBC = false; $this->_authenticated = false; - $this->_socket = false; + $this->_socket = false; $this->_log('i','Socket closed'); } @@ -780,7 +768,7 @@ function read_data($args=array()) { - $buf = $this->_OPS->read_data($this->_socket, $this->read_timeout); + $buf = $this->_OPS->readData($this->_socket, $this->read_timeout); if (!$buf) { $data = array('error' => 'Read error'); @@ -824,7 +812,7 @@ $data_to_send = $this->_CBC->encrypt($data_to_send); } - return $this->_OPS->write_data( $this->_socket, $data_to_send ); + return $this->_OPS->writeData( $this->_socket, $data_to_send ); } @@ -920,19 +908,33 @@ 's' => 'Sent' ); - $this->log .= sprintf("[ %s%s ]\n", - $types[$type], + $temp = sprintf("[ %s%s ]\n", + strtoupper($types[$type]), (($type!='i' && $this->_CBC) ? ' - '.$this->crypt_type.' ENCRYPTED' : '') ); ob_start(); print_r($data); - $this->log .= ob_get_contents() . "\n\n"; + $temp .= ob_get_contents() . "\n"; ob_end_clean(); + $this->log[] = $temp; + } -} +# +# showlog() +# output the debugging log +# + + function showlog() { + echo '<PRE>'; + foreach ($this->log as $line) { + echo htmlEntities($line) . "\n"; + } + echo '</PRE>'; + } -?> + +} Index: test.php =================================================================== RCS file: /cvsroot/opensrs-php/opensrs-php/test.php,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- test.php 2001/06/11 15:25:21 1.9 +++ test.php 2001/12/18 02:16:10 1.10 @@ -1,7 +1,8 @@ -<PRE> <?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ /* $Id$ */ + require_once 'openSRS.php'; $O = new openSRS('test'); @@ -15,29 +16,23 @@ ) ); -$result = $O->send_cmd($cmd); - echo "<h1>Command</h1>\n"; print_r($cmd); + +$result = $O->send_cmd($cmd); -echo "<HR noshade>"; +echo "<HR />"; echo "<h1>Result</h1>\n"; print_r($result); - -/* -echo "<HR noshade>"; +echo "<HR />"; echo "<h1>Log</h1>\n"; $O->showlog(); - -echo "<HR noshade>"; -echo "<h1>OPS Log</h1>\n"; -$O->_OPS->showlog(); - -echo "<HR noshade>"; +echo "<HR />"; echo "<h1>OPS XML Log</h1>\n"; -$O->_OPS->showXMLlog(); -*/ +$O->_OPS->showlog('xml'); -?> +echo "<HR />"; +echo "<h1>OPS Raw Log</h1>\n"; +$O->_OPS->showlog('raw'); --- XML_Codec.php DELETED --- |