diff --git a/bootstrap.php b/bootstrap.php index d91679af855da07e45a6f0b94e3d18b8b7fb859e..7c2f1135ac00c12ee4b696ac1819049260c45509 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -112,6 +112,8 @@ class Bootstrap { define('FILTER_TABLE', $prefix.'filter'); define('FILTER_RULE_TABLE', $prefix.'filter_rule'); + define('PLUGIN_TABLE', $prefix.'plugin'); + define('API_KEY_TABLE',$prefix.'api_key'); define('TIMEZONE_TABLE',$prefix.'timezone'); } @@ -170,8 +172,7 @@ class Bootstrap { function loadCode() { #include required files - require(INCLUDE_DIR.'class.ostsession.php'); - require(INCLUDE_DIR.'class.usersession.php'); + require(INCLUDE_DIR.'class.auth.php'); require(INCLUDE_DIR.'class.pagenate.php'); //Pagenate helper! require(INCLUDE_DIR.'class.log.php'); require(INCLUDE_DIR.'class.crypto.php'); diff --git a/include/ajax.users.php b/include/ajax.users.php index a1096d6f5604f3f749311de45fb0b8ca5f92b343..e73c0b054894af1bdecf2a0f2af2d2a514ec0ce8 100644 --- a/include/ajax.users.php +++ b/include/ajax.users.php @@ -106,5 +106,26 @@ class UsersAjaxAPI extends AjaxController { return $resp; } + function searchStaff() { + global $thisstaff; + + if (!$thisstaff) + Http::response(403, 'Login required for searching'); + elseif (!$thisstaff->isAdmin()) + Http::response(403, + 'Administrative privilege is required for searching'); + elseif (!isset($_REQUEST['q'])) + Http::response(400, 'Query argument is required'); + + $users = array(); + foreach (AuthenticationBackend::allRegistered() as $ab) { + if (!$ab->supportsSearch()) + continue; + + foreach ($ab->search($_REQUEST['q']) as $u) + $users[] = $u; + } + return $this->json_encode($users); + } } ?> diff --git a/include/class.auth.php b/include/class.auth.php new file mode 100644 index 0000000000000000000000000000000000000000..51474a5f6158c9b4357a35e9b656eca6fd1c4c5f --- /dev/null +++ b/include/class.auth.php @@ -0,0 +1,295 @@ +<?php +require(INCLUDE_DIR.'class.ostsession.php'); +require(INCLUDE_DIR.'class.usersession.php'); + +class AuthenticatedUser { + // How the user was authenticated + var $backend; + + // Get basic information + function getId() {} + function getUsername() {} +} + +/** + * Authentication backend + * + * Authentication provides the basis of abstracting the link between the + * login page with a username and password and the staff member, + * administrator, or client using the system. + * + * The system works by allowing the AUTH_BACKENDS setting from + * ost-config.php to determine the list of authentication backends or + * providers and also specify the order they should be evaluated in. + * + * The authentication backend should define a authenticate() method which + * receives a username and optional password. If the authentication + * succeeds, an instance deriving from <User> should be returned. + */ +class AuthenticationBackend { + static private $registry = array(); + static $name; + static $id; + + /* static */ + static function register($class) { + if (is_string($class)) + $class = new $class(); + static::$registry[] = $class; + } + + static function allRegistered() { + return static::$registry; + } + + /* static */ + function process($username, $password=null, &$errors) { + if (!$username) + return false; + + $backend = static::_getAllowedBackends($username); + + foreach (static::$registry as $bk) { + if ($backend && $bk->supportsAuthentication() && $bk::$id != $backend) + // User cannot be authenticated against this backend + continue; + // All backends are queried here, even if they don't support + // authentication so that extensions like lockouts and audits + // can be supported. + $result = $bk->authenticate($username, $password); + if ($result instanceof AuthenticatedUser) { + static::_login($result, $username, $bk); + $result->backend = $bk; + return $result; + } + // TODO: Handle permission denied, for instance + elseif ($result instanceof AccessDenied) { + $errors['err'] = $result->reason; + break; + } + } + $info = array('username'=>$username, 'password'=>$password); + Signal::send('auth.login.failed', null, $info); + } + + function singleSignOn(&$errors) { + global $ost; + + foreach (static::$registry as $bk) { + // All backends are queried here, even if they don't support + // authentication so that extensions like lockouts and audits + // can be supported. + $result = $bk->signOn(); + if ($result instanceof AuthenticatedUser) { + // Ensure staff members are allowed to be authenticated + // against this backend + if ($result instanceof Staff + && !static::_isBackendAllowed($result, $bk)) + continue; + static::_login($result, $result->getUserName(), $bk); + $result->backend = $bk; + return $result; + } + // TODO: Handle permission denied, for instance + elseif ($result instanceof AccessDenied) { + $errors['err'] = $result->reason; + break; + } + } + } + + function _isBackendAllowed($staff, $bk) { + $sql = 'SELECT backend FROM '.STAFF_TABLE + .' WHERE staff_id='.db_input($staff->getId()); + $backend = db_result(db_query($sql)); + return !$backend || strcasecmp($bk, $backend) === 0; + } + + function _getAllowedBackends($username) { + $username = trim($_POST['userid']); + $sql = 'SELECT backend FROM '.STAFF_TABLE + .' WHERE username='.db_input($username) + .' OR email='.db_input($username); + return db_result(db_query($sql)); + } + + function _login($user, $username, $bk) { + global $ost; + + if ($user instanceof Staff) { + //Log debug info. + $ost->logDebug('Staff login', + sprintf("%s logged in [%s], via %s", $user->getUserName(), + $_SERVER['REMOTE_ADDR'], get_class($bk))); //Debug. + + $sql='UPDATE '.STAFF_TABLE.' SET lastlogin=NOW() ' + .' WHERE staff_id='.db_input($user->getId()); + db_query($sql); + //Now set session crap and lets roll baby! + $_SESSION['_staff'] = array(); //clear. + $_SESSION['_staff']['userID'] = $username; + + $user->refreshSession(); //set the hash. + + $_SESSION['TZ_OFFSET'] = $user->getTZoffset(); + $_SESSION['TZ_DST'] = $user->observeDaylight(); + } + + //Regenerate session id. + $sid = session_id(); //Current id + session_regenerate_id(true); + // Destroy old session ID - needed for PHP version < 5.1.0 + // DELME: remove when we move to php 5.3 as min. requirement. + if(($session=$ost->getSession()) && is_object($session) + && $sid!=session_id()) + $session->destroy($sid); + + Signal::send('auth.login.succeeded', $user); + + $user->cancelResetTokens(); + } + + /** + * Fetches the friendly name of the backend + */ + function getName() { + return static::$name; + } + + /** + * Indicates if the backed supports authentication. Useful if the + * backend is used for logging or lockout only + */ + function supportsAuthentication() { + return true; + } + + /** + * Indicates if the backend can be used to search for user information. + * Lookup is performed to find user information based on a unique + * identifier. + */ + function supportsLookup() { + return false; + } + + /** + * Indicates if the backend supports searching for usernames. This is + * distinct from information lookup in that lookup is intended to lookup + * information based on a unique identifier + */ + function supportsSearch() { + return false; + } + + /** + * Indicates if the backend supports changing a user's password. This + * would be done in two fashions. Either the currently-logged in user + * want to change its own password or a user requests to have their + * password reset. This requires an administrative privilege which this + * backend might not possess, so it's defined in supportsPasswordReset() + */ + function supportsPasswordChange() { + return false; + } + + function supportsPasswordReset() { + return false; + } + + /* abstract */ + function authenticate($username, $password) { + return false; + } + + /* abstract */ + function signOn() { + return false; + } +} + +class RemoteAuthenticationBackend { + var $create_unknown_user = false; +} + +/** + * This will be an exception in later versions of PHP + */ +class AccessDenied { + function AccessDenied() { + call_user_func_array(array($this, '__construct'), func_get_args()); + } + function __construct($reason) { + $this->reason = $reason; + } +} + +/** + * Simple authentication backend which will lock the login form after a + * configurable number of attempts + */ +class AuthLockoutBackend extends AuthenticationBackend { + + function authenticate($username, $password=null) { + global $cfg, $ost; + + if($_SESSION['_staff']['laststrike']) { + if((time()-$_SESSION['_staff']['laststrike'])<$cfg->getStaffLoginTimeout()) { + $_SESSION['_staff']['laststrike'] = time(); //reset timer. + return new AccessDenied('Max. failed login attempts reached'); + } else { //Timeout is over. + //Reset the counter for next round of attempts after the timeout. + $_SESSION['_staff']['laststrike']=null; + $_SESSION['_staff']['strikes']=0; + } + } + + $_SESSION['_staff']['strikes']+=1; + if($_SESSION['_staff']['strikes']>$cfg->getStaffMaxLogins()) { + $_SESSION['_staff']['laststrike']=time(); + $alert='Excessive login attempts by a staff member?'."\n". + 'Username: '.$username."\n" + .'IP: '.$_SERVER['REMOTE_ADDR']."\n" + .'TIME: '.date('M j, Y, g:i a T')."\n\n" + .'Attempts #'.$_SESSION['_staff']['strikes']."\n" + .'Timeout: '.($cfg->getStaffLoginTimeout()/60)." minutes \n\n"; + $ost->logWarning('Excessive login attempts ('.$username.')', $alert, + $cfg->alertONLoginError()); + return new AccessDenied('Forgot your login info? Contact Admin.'); + //Log every other failed login attempt as a warning. + } elseif($_SESSION['_staff']['strikes']%2==0) { + $alert='Username: '.$username."\n" + .'IP: '.$_SERVER['REMOTE_ADDR']."\n" + .'TIME: '.date('M j, Y, g:i a T')."\n\n" + .'Attempts #'.$_SESSION['_staff']['strikes']; + $ost->logWarning('Failed staff login attempt ('.$username.')', $alert, false); + } + } + + function supportsAuthentication() { + return false; + } +} +AuthenticationBackend::register(AuthLockoutBackend); + +class osTicketAuthentication extends AuthenticationBackend { + static $name = "Local Authenication"; + static $id = "local"; + + function authenticate($username, $password) { + if (($user = new StaffSession($username)) && $user->getId() && + $user->check_passwd($password)) { + + //update last login && password reset stuff. + $sql='UPDATE '.STAFF_TABLE.' SET lastlogin=NOW() '; + if($user->isPasswdResetDue() && !$user->isAdmin()) + $sql.=',change_passwd=1'; + $sql.=' WHERE staff_id='.db_input($user->getId()); + db_query($sql); + + return $user; + } + } +} +AuthenticationBackend::register(osTicketAuthentication); +?> diff --git a/include/class.config.php b/include/class.config.php index ac60110e8f2ad06423f2fd551ac109247b8e425d..6930bf14e656ff937e50bce2b78b9c21e53761e0 100644 --- a/include/class.config.php +++ b/include/class.config.php @@ -14,8 +14,6 @@ vim: expandtab sw=4 ts=4 sts=4: **********************************************************************/ -require_once(INCLUDE_DIR.'class.email.php'); - class Config { var $config = array(); @@ -105,7 +103,9 @@ class Config { } function update($key, $value) { - if (!isset($this->config[$key])) + if (!$key) + return false; + elseif (!isset($this->config[$key])) return $this->create($key, $value); $setting = &$this->config[$key]; diff --git a/include/class.cron.php b/include/class.cron.php index 3aa0357c198ce61e25a22dae6bc9ea982954877e..999bf437dd60b281d00d8c9e2c6c55e1ef220dd4 100644 --- a/include/class.cron.php +++ b/include/class.cron.php @@ -3,7 +3,7 @@ class.cron.php Nothing special...just a central location for all cron calls. - + Peter Rotich <peter@osticket.com> Copyright (c) 2006-2013 osTicket http://www.osticket.com @@ -12,10 +12,12 @@ See LICENSE.TXT for details. TODO: The plan is to make cron jobs db based. - + vim: expandtab sw=4 ts=4 sts=4: **********************************************************************/ //TODO: Make it DB based! +require_once INCLUDE_DIR.'class.signal.php'; + class Cron { function MailFetcher() { @@ -27,7 +29,7 @@ class Cron { require_once(INCLUDE_DIR.'class.ticket.php'); require_once(INCLUDE_DIR.'class.lock.php'); Ticket::checkOverdue(); //Make stale tickets overdue - TicketLock::cleanup(); //Remove expired locks + TicketLock::cleanup(); //Remove expired locks } function PurgeLogs() { @@ -55,6 +57,8 @@ class Cron { self::PurgeLogs(); self::CleanOrphanedFiles(); self::PurgeDrafts(); + + Signal::send('cron'); } } ?> diff --git a/include/class.forms.php b/include/class.forms.php index 0654a2648c9d1cb2438e35c0357927dc7d2588b7..67b05e16ddf8aaae0f6e37056b2cade65b5595db 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -82,9 +82,12 @@ class Form { if (!$this->_clean) { $this->_clean = array(); foreach ($this->getFields() as $key=>$field) { + if (!$field->hasData()) + continue; $this->_clean[$key] = $this->_clean[$field->get('name')] = $field->getClean(); } + unset($this->_clean[""]); } return $this->_clean; } @@ -129,14 +132,14 @@ class FormField { static $types = array( 'Basic Fields' => array( - 'text' => array('Short Answer', TextboxField), - 'memo' => array('Long Answer', TextareaField), - 'thread' => array('Thread Entry', ThreadEntryField, false), - 'datetime' => array('Date and Time', DatetimeField), - 'phone' => array('Phone Number', PhoneField), - 'bool' => array('Checkbox', BooleanField), - 'choices' => array('Choices', ChoiceField), - 'break' => array('Section Break', SectionBreakField), + 'text' => array('Short Answer', 'TextboxField'), + 'memo' => array('Long Answer', 'TextareaField'), + 'thread' => array('Thread Entry', 'ThreadEntryField', false), + 'datetime' => array('Date and Time', 'DatetimeField'), + 'phone' => array('Phone Number', 'PhoneField'), + 'bool' => array('Checkbox', 'BooleanField'), + 'choices' => array('Choices', 'ChoiceField'), + 'break' => array('Section Break', 'SectionBreakField'), ), ); static $more_types = array(); @@ -441,7 +444,8 @@ class FormField { if (!static::$widget) throw new Exception('Widget not defined for this field'); if (!isset($this->_widget)) { - $this->_widget = new static::$widget($this); + $wc = $this->get('widget') ? $this->get('widget') : static::$widget; + $this->_widget = new $wc($this); $this->_widget->parseValue(); } return $this->_widget; @@ -500,6 +504,18 @@ class TextboxField extends FormField { } } +class PasswordField extends TextboxField { + static $widget = 'PasswordWidget'; + + function to_database($value) { + return Crypto::encrypt($value, SECRET_SALT, $this->getFormName()); + } + + function to_php($value) { + return Crypto::decrypt($value, SECRET_SALT, $this->getFormName()); + } +} + class TextareaField extends FormField { static $widget = 'TextareaWidget'; @@ -841,6 +857,8 @@ class Widget { } class TextboxWidget extends Widget { + static $input_type = 'text'; + function render() { $config = $this->field->getConfiguration(); if (isset($config['size'])) @@ -853,7 +871,8 @@ class TextboxWidget extends Widget { $autocomplete = 'autocomplete="'.($config['autocomplete']?'on':'off').'"'; ?> <span style="display:inline-block"> - <input type="text" id="<?php echo $this->name; ?>" + <input type="<?php echo static::$input_type; ?>" + id="<?php echo $this->name; ?>" <?php echo $size . " " . $maxlength; ?> <?php echo $classes.' '.$autocomplete; ?> name="<?php echo $this->name; ?>" @@ -863,6 +882,19 @@ class TextboxWidget extends Widget { } } +class PasswordWidget extends TextboxWidget { + static $input_type = 'password'; + + function parseValue() { + // Show empty box unless failed POST + if ($_SERVER['REQUEST_METHOD'] == 'POST' + && $this->field->getForm()->isValid()) + parent::parseValue(); + else + $this->value = ''; + } +} + class TextareaWidget extends Widget { function render() { $config = $this->field->getConfiguration(); diff --git a/include/class.nav.php b/include/class.nav.php index 5a391ff553967c1338828ab6796ea079a615a6dd..799c76a8b4dc0a78b74374c2b2aa673cf74c5132 100644 --- a/include/class.nav.php +++ b/include/class.nav.php @@ -213,6 +213,7 @@ class AdminNav extends StaffNav{ $subnav[]=array('desc'=>'Pages', 'href'=>'pages.php','title'=>'Pages','iconclass'=>'pages'); $subnav[]=array('desc'=>'Forms','href'=>'forms.php','iconclass'=>'forms'); $subnav[]=array('desc'=>'Lists','href'=>'lists.php','iconclass'=>'lists'); + $subnav[]=array('desc'=>'Plugins','href'=>'plugins.php','iconclass'=>'api'); break; case 'emails': $subnav[]=array('desc'=>'Emails','href'=>'emails.php', 'title'=>'Email Addresses', 'iconclass'=>'emailSettings'); diff --git a/include/class.osticket.php b/include/class.osticket.php index 875dc13bf8e2e6217a881db22448c0251a019cc5..0e76fe3e6f4f02c6c79b72081182e90d2c002c91 100644 --- a/include/class.osticket.php +++ b/include/class.osticket.php @@ -20,6 +20,7 @@ require_once(INCLUDE_DIR.'class.csrf.php'); //CSRF token class. require_once(INCLUDE_DIR.'class.migrater.php'); +require_once(INCLUDE_DIR.'class.plugin.php'); define('LOG_WARN',LOG_WARNING); @@ -46,6 +47,7 @@ class osTicket { var $session; var $csrf; var $company; + var $plugins; function osTicket() { @@ -59,6 +61,8 @@ class osTicket { $this->csrf = new CSRF('__CSRFToken__'); $this->company = new Company(); + + $this->plugins = new PluginManager(); } function isSystemOnline() { @@ -432,6 +436,9 @@ class osTicket { $_SESSION['TZ_OFFSET'] = $ost->getConfig()->getTZoffset(); $_SESSION['TZ_DST'] = $ost->getConfig()->observeDaylightSaving(); + // Bootstrap installed plugins + $ost->plugins->bootstrap(); + return $ost; } } diff --git a/include/class.plugin.php b/include/class.plugin.php new file mode 100644 index 0000000000000000000000000000000000000000..107ff4f46d8b451c038ae4b850f4731a6ada8b7e --- /dev/null +++ b/include/class.plugin.php @@ -0,0 +1,351 @@ +<?php + +require_once(INCLUDE_DIR.'/class.config.php'); +class PluginConfig extends Config { + var $table = CONFIG_TABLE; + var $form; + + function __construct($name) { + // Use parent constructor to place configurable information into the + // central config table in a namespace of "plugin.<id>" + parent::Config("plugin.$name"); + } + + /* abstract */ + function getOptions() { + return array(); + } + + /** + * Retreive a Form instance for the configurable options offered in + * ::getOptions + */ + function getForm() { + if (!isset($this->form)) { + $this->form = new Form($this->getOptions()); + if ($_SERVER['REQUEST_METHOD'] != 'POST') + $this->form->data($this->getInfo()); + } + return $this->form; + } + + /** + * commit + * + * Used in the POST request of the configuration process. The + * ::getForm() method should be used to retrieve a configuration form + * for this plugin. That form should be submitted via a POST request, + * and this method should be called in that request. The data from the + * POST request will be interpreted and will adjust the configuration of + * this field + * + * Parameters: + * errors - (OUT array) receives validation errors of the parsed + * configuration form + * + * Returns: + * (bool) true if the configuration was updated, false if there were + * errors. If false, the errors were written into the received errors + * array. + */ + function commit(&$errors=array()) { + $f = $this->getForm(); + $commit = false; + if ($f->isValid()) { + $config = $f->getClean(); + $commit = $this->pre_save($config, $errors); + } + $errors += $f->errors(); + if ($commit && count($errors) === 0) + return $this->updateAll($config); + return false; + } + + /** + * Pre-save hook to check configuration for errors (other than obvious + * validation errors) prior to saving. Add an error to the errors list + * or return boolean FALSE if the config commit should be aborted. + */ + function pre_save($config, &$errors) { + return true; + } + + /** + * Remove all configuration for this plugin -- used when the plugin is + * uninstalled + */ + function purge() { + $sql = 'DELETE FROM '.$this->table + .' WHERE `namespace`='.db_input($this->getNamespace()); + return (db_query($sql) && db_affected_rows()); + } +} + +class PluginManager { + static private $plugin_info = array(); + static private $plugin_list = array(); + + /** + * boostrap + * + * Used to bootstrap the plugin subsystem and initialize all the plugins + * currently enabled. + */ + function bootstrap() { + foreach ($this->allActive() as $p) + $p->bootstrap(); + } + + /** + * allActive + * + * Scans the plugin registry to find all installed and active plugins. + * Those plugins are included, instanciated, and cached in a list. + * + * Returns: + * Array<Plugin> a cached list of instanciated plugins for all installed + * and active plugins + */ + static function allInstalled() { + if (static::$plugin_list) + return static::$plugin_list; + + $sql = 'SELECT * FROM '.PLUGIN_TABLE; + if (!($res = db_query($sql))) + return static::$plugin_list; + + $infos = static::allInfos(); + while ($ht = db_fetch_array($res)) { + // XXX: Only read active plugins here. allInfos() will + // read all plugins + if (isset($infos[$ht['install_path']])) { + $info = $infos[$ht['install_path']]; + if ($ht['isactive']) { + list($path, $class) = explode(':', $info['plugin']); + if (!$class) + $class = $path; + else + require_once(INCLUDE_DIR . $ht['install_path'] + . '/' . $path); + static::$plugin_list[$ht['install_path']] + = new $class($ht['id']); + } + else { + static::$plugin_list[$ht['install_path']] = $ht; + } + } + } + return static::$plugin_list; + } + + static function allActive() { + $plugins = array(); + foreach (static::allInstalled() as $p) + if ($p instanceof Plugin && $p->isActive()) + $plugins[] = $p; + return $plugins; + } + + /** + * allInfos + * + * Scans the plugin folders for installed plugins. For each one, the + * plugin.php file is included and the info array returned in added to + * the list returned. + * + * Returns: + * Information about all available plugins. The registry will have to be + * queried to determine if the plugin is installed + */ + static function allInfos() { + static $defaults = array( + 'include' => 'include/', + 'stream' => false, + ); + + if (static::$plugin_info) + return static::$plugin_info; + + foreach (glob(INCLUDE_DIR . 'plugins/*', GLOB_ONLYDIR) as $p) { + if (!is_file($p . '/plugin.php')) + // Invalid plugin -- must define "/plugin.php" + continue; + // plugin.php is require to return an array of informaiton about + // the plugin. + $info = array_merge($defaults, (include $p . '/plugin.php')); + $info['install_path'] = str_replace(INCLUDE_DIR, '', $p); + + // XXX: Ensure 'id' key isset + static::$plugin_info[$info['install_path']] = $info; + } + return static::$plugin_info; + } + + static function getInfoForPath($path) { + $infos = static::allInfos(); + if (isset($infos[$path])) + return $infos[$path]; + return null; + } + + function getInstance($path) { + static $instances = array(); + if (!isset($instances[$path]) + && ($ps = static::allInstalled()) + && ($ht = $ps[$path]) + && ($info = static::getInfoForPath($path))) { + // $ht may be the plugin instance + if ($ht instanceof Plugin) + return $ht; + // Usually this happens when the plugin is being enabled + list($path, $class) = explode(':', $info['plugin']); + if (!$class) + $class = $path; + else + require_once(INCLUDE_DIR . $info['install_path'] . '/' . $path); + $instances[$path] = new $class($ht['id']); + } + return $instances[$path]; + } + + /** + * install + * + * Used to install a plugin that is in-place on the filesystem, but not + * registered in the plugin registry -- the %plugin table. + */ + function install($path) { + if (!($info = $this->getInfoForPath($path))) + return false; + + $sql='INSERT INTO '.PLUGIN_TABLE.' SET installed=NOW() ' + .', install_path='.db_input($path) + .', name='.db_input($info['name']); + if (!db_query($sql) || !db_affected_rows()) + return false; + + static::$plugin_list = array(); + return true; + } +} + +/** + * Class: Plugin (abstract) + * + * Base class for plugins. Plugins should inherit from this class and define + * the useful pieces of the + */ +class Plugin { + /** + * Configuration manager for the plugin. Should be the name of a class + * that inherits from PluginConfig. This is abstract and must be defined + * by the plugin subclass. + */ + var $config_class = null; + var $id; + var $info; + + function Plugin($id) { + $this->id = $id; + $this->load(); + } + + function load() { + $sql = 'SELECT * FROM '.PLUGIN_TABLE.' WHERE + `id`='.db_input($this->id); + if (($res = db_query($sql)) && ($ht=db_fetch_array($res))) + $this->ht = $ht; + $this->info = PluginManager::getInfoForPath($this->ht['install_path']); + } + + function getId() { return $this->id; } + function getName() { return $this->info['name']; } + function isActive() { return $this->ht['isactive']; } + function isPhar() { return $this->ht['isphar']; } + function getInstallDate() { return $this->ht['installed']; } + + function getIncludePath() { + return realpath(INCLUDE_DIR . $this->info['install_path'] . '/' + . $this->info['include_path']) . '/'; + } + + /** + * uninstall + * + * Removes the plugin from the plugin registry. The files remain on the + * filesystem which would allow the plugin to be reinstalled. The + * configuration for the plugin is also removed. If the plugin is + * reinstalled, it will have to be reconfigured. + */ + function uninstall() { + if ($this->pre_uninstall() === false) + return false; + + $sql = 'DELETE FROM '.PLUGIN_TABLE + .' WHERE id='.db_input($this->getId()); + if (db_query($sql) && db_affected_rows()) + return $this->getConfig()->purge(); + return false; + } + + /** + * pre_uninstall + * + * Hook function to veto the uninstallation request. Return boolean + * FALSE if the uninstall operation should be aborted. + * TODO: Recommend a location to stash an error message if aborting + */ + function pre_uninstall() { + return true; + } + + function enable() { + $sql = 'UPDATE '.PLUGIN_TABLE + .' SET isactive=1 WHERE id='.db_input($this->getId()); + return (db_query($sql) && db_affected_rows()); + } + + function disable() { + $sql = 'UPDATE '.PLUGIN_TABLE + .' SET isactive=0 WHERE id='.db_input($this->getId()); + return (db_query($sql) && db_affected_rows()); + } + + /** + * upgrade + * + * Upgrade the plugin. This is used to migrate the database pieces of + * the plugin using the database migration stream packaged with the + * plugin. + */ + function upgrade() { + } + + function getConfig() { + static $config = null; + if ($config === null && $this->config_class) + $config = new $this->config_class($this->getId()); + + return $config; + } + + function source($what) { + $what = str_replace('\\', '/', $what); + if ($what && $what[0] != '/') + $what = $this->getIncludePath() . $what; + include_once $what; + } + + static function lookup($id) { //Assuming local ID is the only lookup used! + $path = false; + if ($id && is_numeric($id)) { + $sql = 'SELECT install_path FROM '.PLUGIN_TABLE + .' WHERE id='.db_input($id); + $path = db_result(db_query($sql)); + } + if ($path) + return PluginManager::getInstance($path); + } +} + +?> diff --git a/include/class.staff.php b/include/class.staff.php index 93708bc0cccfbd71120f321f22e722f7af98834e..f2e3d6b384fbc5b846155d3108792aff24c6021e 100644 --- a/include/class.staff.php +++ b/include/class.staff.php @@ -20,8 +20,9 @@ include_once(INCLUDE_DIR.'class.team.php'); include_once(INCLUDE_DIR.'class.group.php'); include_once(INCLUDE_DIR.'class.passwd.php'); include_once(INCLUDE_DIR.'class.user.php'); +include_once(INCLUDE_DIR.'class.auth.php'); -class Staff { +class Staff extends AuthenticatedUser { var $ht; var $id; @@ -762,13 +763,17 @@ class Staff { $errors['mobile']='Valid number required'; if($vars['passwd1'] || $vars['passwd2'] || !$id) { - if(!$vars['passwd1'] && !$id) { + if($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) { + $errors['passwd2']='Password(s) do not match'; + } + elseif ($vars['backend'] != 'local') { + // Password can be omitted + } + elseif(!$vars['passwd1'] && !$id) { $errors['passwd1']='Temp. password required'; $errors['temppasswd']='Required'; } elseif($vars['passwd1'] && strlen($vars['passwd1'])<6) { $errors['passwd1']='Must be at least 6 characters'; - } elseif($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) { - $errors['passwd2']='Password(s) do not match'; } } @@ -798,6 +803,7 @@ class Staff { .' ,firstname='.db_input($vars['firstname']) .' ,lastname='.db_input($vars['lastname']) .' ,email='.db_input($vars['email']) + .' ,backend='.db_input($vars['backend']) .' ,phone="'.db_input(Format::phone($vars['phone']),false).'"' .' ,phone_ext='.db_input($vars['phone_ext']) .' ,mobile="'.db_input(Format::phone($vars['mobile']),false).'"' diff --git a/include/pear/Net/DNS2.php b/include/pear/Net/DNS2.php new file mode 100644 index 0000000000000000000000000000000000000000..bffe0d45eb72d195e7bfc62504eb69bca1efd943 --- /dev/null +++ b/include/pear/Net/DNS2.php @@ -0,0 +1,1228 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DNS2.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/* + * register the auto-load function + * + */ +spl_autoload_register('Net_DNS2::autoload'); + +/** + * This is the base class for the Net_DNS2_Resolver and Net_DNS2_Updater + * classes. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Resolver, Net_DNS2_Updater + * + */ +class Net_DNS2 +{ + /* + * the current version of this library + */ + const VERSION = '1.3.1'; + + /* + * the default path to a resolv.conf file + */ + const RESOLV_CONF = '/etc/resolv.conf'; + + /* + * use TCP only (true/false) + */ + public $use_tcp = false; + + /* + * DNS Port to use (53) + */ + public $dns_port = 53; + + /* + * the ip/port for use as a local socket + */ + public $local_host = ''; + public $local_port = 0; + + /* + * timeout value for socket connections + */ + public $timeout = 5; + + /* + * randomize the name servers list + */ + public $ns_random = false; + + /* + * default domains + */ + public $domain = ''; + + /* + * domain search list - not actually used right now + */ + public $search_list = array(); + + /* + * enable cache; either "shared", "file" or "none" + */ + public $cache_type = 'none'; + + /* + * file name to use for shared memory segment or file cache + */ + public $cache_file = '/tmp/net_dns2.cache'; + + /* + * the max size of the cache file (in bytes) + */ + public $cache_size = 10000; + + /* + * the method to use for storing cache data; either "serialize" or "json" + * + * json is faster, but can't remember the class names (everything comes back + * as a "stdClass Object"; all the data is the same though. serialize is + * slower, but will have all the class info. + * + * defaults to 'serialize' + */ + public $cache_serializer = 'serialize'; + + /* + * by default, according to RFC 1034 + * + * CNAME RRs cause special action in DNS software. When a name server + * fails to find a desired RR in the resource set associated with the + * domain name, it checks to see if the resource set consists of a CNAME + * record with a matching class. If so, the name server includes the CNAME + * record in the response and restarts the query at the domain name + * specified in the data field of the CNAME record. + * + * this can cause "unexpected" behavious, since i'm sure *most* people + * don't know DNS does this; there may be cases where Net_DNS2 returns a + * positive response, even though the hostname the user looked up did not + * actually exist. + * + * strict_query_mode means that if the hostname that was looked up isn't + * actually in the answer section of the response, Net_DNS2 will return an + * empty answer section, instead of an answer section that could contain + * CNAME records. + * + */ + public $strict_query_mode = false; + + /* + * if we should set the recursion desired bit to 1 or 0. + * + * by default this is set to true, we want the DNS server to perform a recursive + * request. If set to false, the RD bit will be set to 0, and the server will + * not perform recursion on the request. + */ + public $recurse = true; + + /* + * request DNSSEC values, by setting the DO flag to 1; this actually makes + * the resolver add a OPT RR to the additional section, and sets the DO flag + * in this RR to 1 + * + */ + public $dnssec = false; + + /* + * set the DNSSEC AD (Authentic Data) bit on/off; the AD bit on the request + * side was previously undefined, and resolvers we instructed to always clear + * the AD bit when sending a request. + * + * RFC6840 section 5.7 defines setting the AD bit in the query as a signal to + * the server that it wants the value of the AD bit, without needed to request + * all the DNSSEC data via the DO bit. + * + */ + public $dnssec_ad_flag = false; + + /* + * set the DNSSEC CD (Checking Disabled) bit on/off; turning this off, means + * that the DNS resolver will perform it's own signature validation- so the DNS + * servers simply pass through all the details. + * + */ + public $dnssec_cd_flag = false; + + /* + * the EDNS(0) UDP payload size to use when making DNSSEC requests + * see RFC 2671 section 6.2.3 for more details + * + * http://tools.ietf.org/html/draft-ietf-dnsext-rfc2671bis-edns0-10 + * + */ + public $dnssec_payload_size = 1280; + + /* + * local sockets + */ + protected $sock = array('udp' => array(), 'tcp' => array()); + + /* + * name server list + */ + protected $nameservers = array(); + + /* + * if the socket extension is loaded + */ + protected $sockets_enabled = false; + + /* + * the TSIG or SIG RR object for authentication + */ + protected $auth_signature = null; + + /* + * the shared memory segment id for the local cache + */ + protected $cache = null; + + /* + * internal setting for enabling cache + */ + protected $use_cache = false; + + /* + * the last erro message returned by the sockets class + */ + private $_last_socket_error = ''; + + /** + * Constructor - base constructor for the Resolver and Updater + * + * @param mixed $options array of options or null for none + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct(array $options = null) + { + // + // check for the sockets extension + // + $this->sockets_enabled = extension_loaded('sockets'); + + // + // load any options that were provided + // + if (!empty($options)) { + + foreach ($options as $key => $value) { + + if ($key == 'nameservers') { + + $this->setServers($value); + } else { + + $this->$key = $value; + } + } + } + + // + // if we're set to use the local shared memory cache, then + // make sure it's been initialized + // + switch($this->cache_type) { + case 'shared': + if (extension_loaded('shmop')) { + + $this->cache = new Net_DNS2_Cache_Shm; + $this->use_cache = true; + } else { + + throw new Net_DNS2_Exception( + 'shmop library is not available for cache', + Net_DNS2_Lookups::E_CACHE_SHM_UNAVAIL + ); + } + break; + case 'file': + + $this->cache = new Net_DNS2_Cache_File; + $this->use_cache = true; + + break; + case 'none': + $this->use_cache = false; + break; + default: + + throw new Net_DNS2_Exception( + 'un-supported cache type: ' . $this->cache_type, + Net_DNS2_Lookups::E_CACHE_UNSUPPORTED + ); + } + } + + /** + * autoload call-back function; used to auto-load classes + * + * @param string $name the name of the class + * + * @return void + * @access public + * + */ + static public function autoload($name) + { + // + // only auto-load our classes + // + if (strncmp($name, 'Net_DNS2', 8) == 0) { + + include str_replace('_', '/', $name) . '.php'; + } + + return; + } + + /** + * sets the name servers to be used + * + * @param mixed $nameservers either an array of name servers, or a file name + * to parse, assuming it's in the resolv.conf format + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function setServers($nameservers) + { + // + // if it's an array, then use it directly + // + // otherwise, see if it's a path to a resolv.conf file and if so, load it + // + if (is_array($nameservers)) { + + $this->nameservers = $nameservers; + + } else { + + // + // check to see if the file is readable + // + if (is_readable($nameservers) === true) { + + $data = file_get_contents($nameservers); + if ($data === false) { + throw new Net_DNS2_Exception( + 'failed to read contents of file: ' . $nameservers, + Net_DNS2_Lookups::E_NS_INVALID_FILE + ); + } + + $lines = explode("\n", $data); + + foreach ($lines as $line) { + + $line = trim($line); + + // + // ignore empty lines, and lines that are commented out + // + if ( (strlen($line) == 0) + || ($line[0] == '#') + || ($line[0] == ';') + ) { + continue; + } + + list($key, $value) = preg_split('/\s+/', $line, 2); + + $key = trim(strtolower($key)); + $value = trim(strtolower($value)); + + switch($key) { + case 'nameserver': + + // + // nameserver can be a IPv4 or IPv6 address + // + if ( (self::isIPv4($value) == true) + || (self::isIPv6($value) == true) + ) { + + $this->nameservers[] = $value; + } else { + + throw new Net_DNS2_Exception( + 'invalid nameserver entry: ' . $value, + Net_DNS2_Lookups::E_NS_INVALID_ENTRY + ); + } + break; + + case 'domain': + $this->domain = $value; + break; + + case 'search': + $this->search_list = preg_split('/\s+/', $value); + break; + + default: + ; + } + } + + // + // if we don't have a domain, but we have a search list, then + // take the first entry on the search list as the domain + // + if ( (strlen($this->domain) == 0) + && (count($this->search_list) > 0) + ) { + $this->domain = $this->search_list[0]; + } + + } else { + throw new Net_DNS2_Exception( + 'resolver file file provided is not readable: ' . $nameservers, + Net_DNS2_Lookups::E_NS_INVALID_FILE + ); + } + } + + // + // check the name servers + // + $this->checkServers(); + + return true; + } + + /** + * checks the list of name servers to make sure they're set + * + * @param mixed $default a path to a resolv.conf file or an array of servers. + * + * @return boolean + * @throws Net_DNS2_Exception + * @access protected + * + */ + protected function checkServers($default = null) + { + if (empty($this->nameservers)) { + + if (isset($default)) { + + $this->setServers($default); + } else { + + throw new Net_DNS2_Exception( + 'empty name servers list; you must provide a list of name '. + 'servers, or the path to a resolv.conf file.', + Net_DNS2_Lookups::E_NS_INVALID_ENTRY + ); + } + } + + return true; + } + + /** + * adds a TSIG RR object for authentication + * + * @param string $keyname the key name to use for the TSIG RR + * @param string $signature the key to sign the request. + * @param string $algorithm the algorithm to use + * + * @return boolean + * @access public + * @since function available since release 1.1.0 + * + */ + public function signTSIG( + $keyname, $signature = '', $algorithm = Net_DNS2_RR_TSIG::HMAC_MD5 + ) { + // + // if the TSIG was pre-created and passed in, then we can just used + // it as provided. + // + if ($keyname instanceof Net_DNS2_RR_TSIG) { + + $this->auth_signature = $keyname; + + } else { + + // + // otherwise create the TSIG RR, but don't add it just yet; TSIG needs + // to be added as the last additional entry- so we'll add it just + // before we send. + // + $this->auth_signature = Net_DNS2_RR::fromString( + strtolower(trim($keyname)) . + ' TSIG '. $signature + ); + + // + // set the algorithm to use + // + $this->auth_signature->algorithm = $algorithm; + } + + return true; + } + + /** + * adds a SIG RR object for authentication + * + * @param string $filename the name of a file to load the signature from. + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * @since function available since release 1.1.0 + * + */ + public function signSIG0($filename) + { + // + // check for OpenSSL + // + if (extension_loaded('openssl') === false) { + + throw new Net_DNS2_Exception( + 'the OpenSSL extension is required to use SIG(0).', + Net_DNS2_Lookups::E_OPENSSL_UNAVAIL + ); + } + + // + // if the SIG was pre-created, then use it as-is + // + if ($filename instanceof Net_DNS2_RR_SIG) { + + $this->auth_signature = $filename; + + } else { + + // + // otherwise, it's filename which needs to be parsed and processed. + // + $private = new Net_DNS2_PrivateKey($filename); + + // + // create a new Net_DNS2_RR_SIG object + // + $this->auth_signature = new Net_DNS2_RR_SIG(); + + // + // reset some values + // + $this->auth_signature->name = $private->signname; + $this->auth_signature->ttl = 0; + $this->auth_signature->class = 'ANY'; + + // + // these values are pulled from the private key + // + $this->auth_signature->algorithm = $private->algorithm; + $this->auth_signature->keytag = $private->keytag; + $this->auth_signature->signname = $private->signname; + + // + // these values are hard-coded for SIG0 + // + $this->auth_signature->typecovered = 'SIG0'; + $this->auth_signature->labels = 0; + $this->auth_signature->origttl = 0; + + // + // generate the dates + // + $t = time(); + + $this->auth_signature->sigincep = gmdate('YmdHis', $t); + $this->auth_signature->sigexp = gmdate('YmdHis', $t + 500); + + // + // store the private key in the SIG object for later. + // + $this->auth_signature->private_key = $private; + } + + // + // only RSAMD5 and RSASHA1 are supported for SIG(0) + // + switch($this->auth_signature->algorithm) { + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5: + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1: + break; + default: + throw new Net_DNS2_Exception( + 'only asymmetric algorithms work with SIG(0)!', + Net_DNS2_Lookups::E_OPENSSL_INV_ALGO + ); + } + + return true; + } + + /** + * a simple function to determine if the RR type is cacheable + * + * @param stream $_type the RR type string + * + * @return bool returns true/false if the RR type if cachable + * @access public + * + */ + public function cacheable($_type) + { + switch($_type) { + case 'AXFR': + case 'OPT': + return false; + } + + return true; + } + + /** + * PHP doesn't support unsigned integers, but many of the RR's return + * unsigned values (like SOA), so there is the possibility that the + * value will overrun on 32bit systems, and you'll end up with a + * negative value. + * + * 64bit systems are not affected, as their PHP_IN_MAX value should + * be 64bit (ie 9223372036854775807) + * + * This function returns a negative integer value, as a string, with + * the correct unsigned value. + * + * @param string $_int the unsigned integer value to check + * + * @return string returns the unsigned value as a string. + * @access public + * + */ + public static function expandUint32($_int) + { + if ( ($_int < 0) && (PHP_INT_MAX == 2147483647) ) { + return sprintf('%u', $_int); + } else { + return $_int; + } + } + + /** + * returns true/false if the given address is a valid IPv4 address + * + * @param string $_address the IPv4 address to check + * + * @return boolean returns true/false if the address is IPv4 address + * @access public + * + */ + public static function isIPv4($_address) + { + // + // use filter_var() if it's available; it's faster than preg + // + if (extension_loaded('filter') == true) { + + if (filter_var( + $_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 + ) == false) { + return false; + } + } else { + + // + // do the main check here; + // + if (inet_pton($_address) === false) { + return false; + } + + // + // then make sure we're not a IPv6 address + // + if (preg_match( + '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', + $_address + ) == 0) { + return false; + } + } + + return true; + } + + /** + * returns true/false if the given address is a valid IPv6 address + * + * @param string $_address the IPv6 address to check + * + * @return boolean returns true/false if the address is IPv6 address + * @access public + * + */ + public static function isIPv6($_address) + { + // + // use filter_var() if it's available; it's faster than preg + // + if (extension_loaded('filter') == true) { + if (filter_var( + $_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 + ) == false) { + return false; + } + } else { + + // + // do the main check here + // + if (inet_pton($_address) === false) { + return false; + } + + // + // then make sure it doesn't match a IPv4 address + // + if (preg_match( + '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $_address + ) == 1) { + return false; + } + } + + return true; + } + + /** + * formats the given IPv6 address as a fully expanded IPv6 address + * + * @param string $_address the IPv6 address to expand + * + * @return string the fully expanded IPv6 address + * @access public + * + */ + public static function expandIPv6($_address) + { + if (strpos($_address, '::') !== false) { + + $part = explode('::', $_address); + $part[0] = explode(':', $part[0]); + $part[1] = explode(':', $part[1]); + + $missing = array(); + + $x = (8 - (count($part[0]) + count($part[1]))); + for ($i = 0; $i < $x; $i++) { + + array_push($missing, '0000'); + } + + $missing = array_merge($part[0], $missing); + $part = array_merge($missing, $part[1]); + + } else { + + $part = explode(':', $_address); + } + + foreach ($part as &$p) { + while (strlen($p) < 4) { + $p = '0' . $p; + } + } + + unset($p); + + $result = implode(':', $part); + + if (strlen($result) == 39) { + return $result; + } else { + return false; + } + } + + /** + * sends a standard Net_DNS2_Packet_Request packet + * + * @param Net_DNS2_Packet $request a Net_DNS2_Packet_Request object + * @param boolean $use_tcp true/false if the function should + * use TCP for the request + * + * @return mixed returns a Net_DNS2_Packet_Response object, or false on error + * @throws Net_DNS2_Exception + * @access protected + * + */ + protected function sendPacket(Net_DNS2_Packet $request, $use_tcp) + { + // + // get the data from the packet + // + $data = $request->get(); + if (strlen($data) < Net_DNS2_Lookups::DNS_HEADER_SIZE) { + + throw new Net_DNS2_Exception( + 'invalid or empty packet for sending!', + Net_DNS2_Lookups::E_PACKET_INVALID, + null, + $request + ); + } + + reset($this->nameservers); + + // + // randomize the name server list if it's asked for + // + if ($this->ns_random == true) { + + shuffle($this->nameservers); + } + + // + // loop so we can handle server errors + // + $response = null; + $ns = ''; + $socket_type = null; + $tcp_fallback = false; + + while (1) { + + // + // grab the next DNS server + // + if ($tcp_fallback == false) { + + $ns = each($this->nameservers); + if ($ns === false) { + + throw new Net_DNS2_Exception( + 'every name server provided has failed: ' . + $this->_last_socket_error, + Net_DNS2_Lookups::E_NS_FAILED + ); + } + + $ns = $ns[1]; + } + + // + // if the use TCP flag (force TCP) is set, or the packet is bigger + // than 512 bytes, use TCP for sending the packet + // + if ( ($use_tcp == true) + || (strlen($data) > Net_DNS2_Lookups::DNS_MAX_UDP_SIZE) + || ($tcp_fallback == true) + ) { + $tcp_fallback = false; + $socket_type = Net_DNS2_Socket::SOCK_STREAM; + + // + // create the socket object + // + if ( (!isset($this->sock['tcp'][$ns])) + || (!($this->sock['tcp'][$ns] instanceof Net_DNS2_Socket)) + ) { + if ($this->sockets_enabled === true) { + + $this->sock['tcp'][$ns] = new Net_DNS2_Socket_Sockets( + Net_DNS2_Socket::SOCK_STREAM, + $ns, + $this->dns_port, + $this->timeout + ); + } else { + + $this->sock['tcp'][$ns] = new Net_DNS2_Socket_Streams( + Net_DNS2_Socket::SOCK_STREAM, + $ns, + $this->dns_port, + $this->timeout + ); + } + } + + // + // if a local IP address / port is set, then add it + // + if (strlen($this->local_host) > 0) { + + $this->sock['tcp'][$ns]->bindAddress( + $this->local_host, $this->local_port + ); + } + + // + // open it; if it fails, continue in the while loop + // + if ($this->sock['tcp'][$ns]->open() === false) { + + $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error; + continue; + } + + // + // write the data to the socket; if it fails, continue on + // the while loop + // + if ($this->sock['tcp'][$ns]->write($data) === false) { + + $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error; + continue; + } + + // + // read the content, using select to wait for a response + // + $size = 0; + $result = null; + + // + // handle zone transfer requests differently than other requests. + // + if ($request->question[0]->qtype == 'AXFR') { + + $soa_count = 0; + + while (1) { + + // + // read the data off the socket + // + $result = $this->sock['tcp'][$ns]->read($size); + if ( ($result === false) + || ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE) + ) { + $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error; + break; + } + + // + // parse the first chunk as a packet + // + $chunk = new Net_DNS2_Packet_Response($result, $size); + + // + // if this is the first packet, then clone it directly, then + // go through it to see if there are two SOA records + // (indicating that it's the only packet) + // + if (is_null($response) == true) { + + $response = clone $chunk; + + // + // look for a failed response; if the zone transfer + // failed, then we don't need to do anything else at this + // point, and we should just break out. + // + if ($response->header->rcode != Net_DNS2_Lookups::RCODE_NOERROR) { + break; + } + + // + // go through each answer + // + foreach ($response->answer as $index => $rr) { + + // + // count the SOA records + // + if ($rr->type == 'SOA') { + $soa_count++; + } + } + + // + // if we have 2 or more SOA records, then we're done; + // otherwise continue out so we read the rest of the + // packets off the socket + // + if ($soa_count >= 2) { + break; + } else { + continue; + } + + } else { + + // + // go through all these answers, and look for SOA records + // + foreach ($chunk->answer as $index => $rr) { + + // + // count the number of SOA records we find + // + if ($rr->type == 'SOA') { + $soa_count++; + } + + // + // add the records to a single response object + // + $response->answer[] = $rr; + } + + // + // if we've found the second SOA record, we're done + // + if ($soa_count >= 2) { + break; + } + } + } + + } else { + + $result = $this->sock['tcp'][$ns]->read($size); + if ( ($result === false) + || ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE) + ) { + $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error; + continue; + } + + // + // create the packet object + // + $response = new Net_DNS2_Packet_Response($result, $size); + } + + break; + + } else { + + $socket_type = Net_DNS2_Socket::SOCK_DGRAM; + + // + // create the socket object + // + if ( (!isset($this->sock['udp'][$ns])) + || (!($this->sock['udp'][$ns] instanceof Net_DNS2_Socket)) + ) { + if ($this->sockets_enabled === true) { + + $this->sock['udp'][$ns] = new Net_DNS2_Socket_Sockets( + Net_DNS2_Socket::SOCK_DGRAM, $ns, $this->dns_port, $this->timeout + ); + } else { + + $this->sock['udp'][$ns] = new Net_DNS2_Socket_Streams( + Net_DNS2_Socket::SOCK_DGRAM, $ns, $this->dns_port, $this->timeout + ); + } + } + + // + // if a local IP address / port is set, then add it + // + if (strlen($this->local_host) > 0) { + + $this->sock['udp'][$ns]->bindAddress( + $this->local_host, $this->local_port + ); + } + + // + // open it + // + if ($this->sock['udp'][$ns]->open() === false) { + + $this->_last_socket_error = $this->sock['udp'][$ns]->last_error; + continue; + } + + // + // write the data to the socket + // + if ($this->sock['udp'][$ns]->write($data) === false) { + + $this->_last_socket_error = $this->sock['udp'][$ns]->last_error; + continue; + } + + // + // read the content, using select to wait for a response + // + $size = 0; + + $result = $this->sock['udp'][$ns]->read($size); + if (( $result === false) + || ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE) + ) { + $this->_last_socket_error = $this->sock['udp'][$ns]->last_error; + continue; + } + + // + // create the packet object + // + $response = new Net_DNS2_Packet_Response($result, $size); + if (is_null($response)) { + + throw new Net_DNS2_Exception( + 'empty response object', + Net_DNS2_Lookups::E_NS_FAILED, + null, + $request + ); + } + + // + // check the packet header for a trucated bit; if it was truncated, + // then re-send the request as TCP. + // + if ($response->header->tc == 1) { + + $tcp_fallback = true; + continue; + } + + break; + } + } + + // + // if $response is null, then we didn't even try once; which shouldn't + // actually ever happen + // + if (is_null($response)) { + + throw new Net_DNS2_Exception( + 'empty response object', + Net_DNS2_Lookups::E_NS_FAILED, + null, + $request + ); + } + + // + // add the name server that the response came from to the response object, + // and the socket type that was used. + // + $response->answer_from = $ns; + $response->answer_socket_type = $socket_type; + + // + // make sure header id's match between the request and response + // + if ($request->header->id != $response->header->id) { + + throw new Net_DNS2_Exception( + 'invalid header: the request and response id do not match.', + Net_DNS2_Lookups::E_HEADER_INVALID, + null, + $request, + $response + ); + } + + // + // make sure the response is actually a response + // + // 0 = query, 1 = response + // + if ($response->header->qr != Net_DNS2_Lookups::QR_RESPONSE) { + + throw new Net_DNS2_Exception( + 'invalid header: the response provided is not a response packet.', + Net_DNS2_Lookups::E_HEADER_INVALID, + null, + $request, + $response + ); + } + + // + // make sure the response code in the header is ok + // + if ($response->header->rcode != Net_DNS2_Lookups::RCODE_NOERROR) { + + throw new Net_DNS2_Exception( + 'DNS request failed: ' . + Net_DNS2_Lookups::$result_code_messages[$response->header->rcode], + $response->header->rcode, + null, + $request, + $response + ); + } + + return $response; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/BitMap.php b/include/pear/Net/DNS2/BitMap.php new file mode 100644 index 0000000000000000000000000000000000000000..cdc0934a3432e9f7de869a0f59d1013cdd5c89bc --- /dev/null +++ b/include/pear/Net/DNS2/BitMap.php @@ -0,0 +1,254 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: BitMap.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * a class to handle converting RR bitmaps to arrays and back; used on NSEC + * and NSEC3 RR's + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_BitMap +{ + /** + * parses a RR bitmap field defined in RFC3845, into an array of RR names. + * + * Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) + + * + * @param string $data a bitmap stringto parse + * + * @return array + * @access public + * + */ + public static function bitMapToArray($data) + { + if (strlen($data) == 0) { + return null; + } + + $output = array(); + $offset = 0; + $length = strlen($data); + + while ($offset < $length) { + + // + // unpack the window and length values + // + $x = unpack('@' . $offset . '/Cwindow/Clength', $data); + $offset += 2; + + // + // copy out the bitmap value + // + $bitmap = unpack('C*', substr($data, $offset, $x['length'])); + $offset += $x['length']; + + // + // I'm not sure if there's a better way of doing this, but PHP doesn't + // have a 'B' flag for unpack() + // + $bitstr = ''; + foreach ($bitmap as $r) { + + $bitstr .= sprintf('%08b', $r); + } + + $blen = strlen($bitstr); + for ($i=0; $i<$blen; $i++) { + + if ($bitstr[$i] == '1') { + + $type = $x['window'] * 256 + $i; + + if (isset(Net_DNS2_Lookups::$rr_types_by_id[$type])) { + + $output[] = Net_DNS2_Lookups::$rr_types_by_id[$type]; + } else { + + $output[] = 'TYPE' . $type; + } + } + } + } + + return $output; + } + + /** + * builds a RR Bit map from an array of RR type names + * + * @param array $data a list of RR names + * + * @return string + * @access public + * + */ + public static function arrayToBitMap(array $data) + { + if (count($data) == 0) { + return null; + } + + $current_window = 0; + + // + // go through each RR + // + $max = 0; + $bm = array(); + + foreach ($data as $rr) { + + $rr = strtoupper($rr); + + // + // get the type id for the RR + // + $type = @Net_DNS2_Lookups::$rr_types_by_name[$rr]; + if (isset($type)) { + + // + // skip meta types or qtypes + // + if ( (isset(Net_DNS2_Lookups::$rr_qtypes_by_id[$type])) + || (isset(Net_DNS2_Lookups::$rr_metatypes_by_id[$type])) + ) { + continue; + } + + } else { + + // + // if it's not found, then it must be defined as TYPE<id>, per + // RFC3845 section 2.2, if it's not, we ignore it. + // + list($name, $type) = explode('TYPE', $rr); + if (!isset($type)) { + + continue; + } + } + + // + // build the current window + // + $current_window = (int)($type / 256); + + $val = $type - $current_window * 256.0; + if ($val > $max) { + $max = $val; + } + + $bm[$current_window][$val] = 1; + $bm[$current_window]['length'] = ceil(($max + 1) / 8); + } + + $output = ''; + + foreach ($bm as $window => $bitdata) { + + $bitstr = ''; + + for ($i=0; $i<$bm[$window]['length'] * 8; $i++) { + if (isset($bm[$window][$i])) { + $bitstr .= '1'; + } else { + $bitstr .= '0'; + } + } + + $output .= pack('CC', $window, $bm[$window]['length']); + $output .= pack('H*', self::bigBaseConvert($bitstr)); + } + + return $output; + } + + /** + * a base_convert that handles large numbers; forced to 2/16 + * + * @param string $number a bit string + * + * @return string + * @access public + * + */ + public static function bigBaseConvert($number) + { + $result = ''; + + $bin = substr(chunk_split(strrev($number), 4, '-'), 0, -1); + $temp = preg_split('[-]', $bin, -1, PREG_SPLIT_DELIM_CAPTURE); + + for ($i = count($temp)-1;$i >= 0;$i--) { + + $result = $result . base_convert(strrev($temp[$i]), 2, 16); + } + + return strtoupper($result); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Cache.php b/include/pear/Net/DNS2/Cache.php new file mode 100644 index 0000000000000000000000000000000000000000..b375ca2fa5bdc395834ae5ddc6999eeea626a356 --- /dev/null +++ b/include/pear/Net/DNS2/Cache.php @@ -0,0 +1,290 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Cache.php 160 2012-07-18 03:57:32Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.1.0 + * + */ + +/** + * A class to provide simple dns lookup caching. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Cache +{ + /* + * the filename of the cache file + */ + protected $cache_file = ''; + + /* + * the local data store for the cache + */ + protected $cache_data = array(); + + /* + * the size of the cache to use + */ + protected $cache_size = 0; + + /* + * the cache serializer + */ + protected $cache_serializer; + + /** + * returns true/false if the provided key is defined in the cache + * + * @param string $key the key to lookup in the local cache + * + * @return boolean + * @access public + * + */ + public function has($key) + { + return isset($this->cache_data[$key]); + } + + /** + * returns the value for the given key + * + * @param string $key the key to lookup in the local cache + * + * @return mixed returns the cache data on sucess, false on error + * @access public + * + */ + public function get($key) + { + if (isset($this->cache_data[$key])) { + + if ($this->cache_serializer == 'json') { + return json_decode($this->cache_data[$key]['object']); + } else { + return unserialize($this->cache_data[$key]['object']); + } + } else { + + return false; + } + } + + /** + * adds a new key/value pair to the cache + * + * @param string $key the key for the new cache entry + * @param mixed $data the data to store in cache + * + * @return void + * @access public + * + */ + public function put($key, $data) + { + $ttl = 86400 * 365; + + // + // find the lowest TTL, and use that as the TTL for the whole cached + // object. The downside to using one TTL for the whole object, is that + // we'll invalidate entries before they actuall expire, causing a + // real lookup to happen. + // + // The upside is that we don't need to require() each RR type in the + // cache, so we can look at their individual TTL's on each run- we only + // unserialize the actual RR object when it's get() from the cache. + // + foreach ($data->answer as $index => $rr) { + + if ($rr->ttl < $ttl) { + $ttl = $rr->ttl; + } + } + foreach ($data->authority as $index => $rr) { + + if ($rr->ttl < $ttl) { + $ttl = $rr->ttl; + } + } + foreach ($data->additional as $index => $rr) { + + if ($rr->ttl < $ttl) { + $ttl = $rr->ttl; + } + } + + $this->cache_data[$key] = array( + + 'cache_date' => time(), + 'ttl' => $ttl + ); + + if ($this->cache_serializer == 'json') { + $this->cache_data[$key]['object'] = json_encode($data); + } else { + $this->cache_data[$key]['object'] = serialize($data); + } + } + + /** + * runs a clean up process on the cache data + * + * @return void + * @access protected + * + */ + protected function clean() + { + if (count($this->cache_data) > 0) { + + // + // go through each entry and adjust their TTL, and remove entries that + // have expired + // + $now = time(); + + foreach ($this->cache_data as $key => $data) { + + $diff = $now - $data['cache_date']; + + if ($data['ttl'] <= $diff) { + + unset($this->cache_data[$key]); + } else { + + $this->cache_data[$key]['ttl'] -= $diff; + $this->cache_data[$key]['cache_date'] = $now; + } + } + } + } + + /** + * runs a clean up process on the cache data + * + * @return mixed + * @access protected + * + */ + protected function resize() + { + if (count($this->cache_data) > 0) { + + // + // serialize the cache data + // + if ($this->cache_serializer == 'json') { + $cache = json_encode($this->cache_data); + } else { + $cache = serialize($this->cache_data); + } + + // + // only do this part if the size allocated to the cache storage + // is smaller than the actual cache data + // + if (strlen($cache) > $this->cache_size) { + + while (strlen($cache) > $this->cache_size) { + + // + // go through the data, and remove the entries closed to + // their expiration date. + // + $smallest_ttl = time(); + $smallest_key = null; + + foreach ($this->cache_data as $key => $data) { + + if ($data['ttl'] < $smallest_ttl) { + + $smallest_ttl = $data['ttl']; + $smallest_key = $key; + } + } + + // + // unset the key with the smallest TTL + // + unset($this->cache_data[$smallest_key]); + + // + // re-serialize + // + if ($this->cache_serializer == 'json') { + $cache = json_encode($this->cache_data); + } else { + $cache = serialize($this->cache_data); + } + } + } + + if ( ($cache == 'a:0:{}') || ($cache == '{}') ) { + return null; + } else { + return $cache; + } + } + + return null; + } +}; + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Cache/File.php b/include/pear/Net/DNS2/Cache/File.php new file mode 100644 index 0000000000000000000000000000000000000000..0de797747b11841ccd490f106838b37e971bcb17 --- /dev/null +++ b/include/pear/Net/DNS2/Cache/File.php @@ -0,0 +1,242 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: File.php 160 2012-07-18 03:57:32Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.1.0 + * + */ + +/** + * File-based caching for the Net_DNS2_Cache class + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Cache_File extends Net_DNS2_Cache +{ + /** + * open a cache object + * + * @param string $cache_file path to a file to use for cache storage + * @param integer $size the size of the shared memory segment to create + * @param string $serializer the name of the cache serialize to use + * + * @throws Net_DNS2_Exception + * @access public + * @return void + * + */ + public function open($cache_file, $size, $serializer) + { + $this->cache_size = $size; + $this->cache_file = $cache_file; + $this->cache_serializer = $serializer; + + // + // check that the file exists first + // + if ( (file_exists($this->cache_file) == true) + && (filesize($this->cache_file) > 0) + ) { + + // + // open the file for reading + // + $fp = @fopen($this->cache_file, 'r'); + if ($fp !== false) { + + // + // lock the file just in case + // + flock($fp, LOCK_EX); + + // + // read the file contents + // + $data = fread($fp, filesize($this->cache_file)); + + $decoded = null; + + if ($this->cache_serializer == 'json') { + + $decoded = json_decode($data, true); + } else { + + $decoded = unserialize($data); + } + + if (is_array($decoded) == true) { + + $this->cache_data = $decoded; + } else { + + $this->cache_data = array(); + } + + // + // unlock + // + flock($fp, LOCK_UN); + + // + // close the file + // + fclose($fp); + + // + // clean up the data + // + $this->clean(); + } + } + } + + /** + * Destructor + * + * @access public + * + */ + public function __destruct() + { + // + // if there's no cache file set, then there's nothing to do + // + if (strlen($this->cache_file) == 0) { + return; + } + + // + // open the file for reading/writing + // + $fp = fopen($this->cache_file, 'a+'); + if ($fp !== false) { + + // + // lock the file just in case + // + flock($fp, LOCK_EX); + + // + // seek to the start of the file to read + // + fseek($fp, 0, SEEK_SET); + + // + // read the file contents + // + $data = @fread($fp, filesize($this->cache_file)); + if ( ($data !== false) && (strlen($data) > 0) ) { + + // + // unserialize and store the data + // + $c = $this->cache_data; + + $decoded = null; + + if ($this->cache_serializer == 'json') { + + $decoded = json_decode($data, true); + } else { + + $decoded = unserialize($data); + } + + if (is_array($decoded) == true) { + + $this->cache_data = array_merge($c, $decoded); + } + } + + // + // trucate the file + // + ftruncate($fp, 0); + + // + // clean the data + // + $this->clean(); + + // + // resize the data + // + $data = $this->resize(); + if (!is_null($data)) { + + // + // write the file contents + // + fwrite($fp, $data); + } + + // + // unlock + // + flock($fp, LOCK_UN); + + // + // close the file + // + fclose($fp); + } + } +}; + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Cache/Shm.php b/include/pear/Net/DNS2/Cache/Shm.php new file mode 100644 index 0000000000000000000000000000000000000000..5737efe71708adce07ad0ec8076c7d9990c759e0 --- /dev/null +++ b/include/pear/Net/DNS2/Cache/Shm.php @@ -0,0 +1,305 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Shm.php 160 2012-07-18 03:57:32Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.1.0 + * + */ + +/** + * Shared Memory-based caching for the Net_DNS2_Cache class + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Cache_Shm extends Net_DNS2_Cache +{ + /* + * resource id of the shared memory cache + */ + private $_cache_id = false; + + /* + * the IPC key + */ + private $_cache_file_tok = -1; + + /** + * open a cache object + * + * @param string $cache_file path to a file to use for cache storage + * @param integer $size the size of the shared memory segment to create + * @param string $serializer the name of the cache serialize to use + * + * @throws Net_DNS2_Exception + * @access public + * @return void + * + */ + public function open($cache_file, $size, $serializer) + { + $this->cache_size = $size; + $this->cache_file = $cache_file; + $this->cache_serializer = $serializer; + + // + // make sure the file exists first + // + if (!file_exists($cache_file)) { + + if (file_put_contents($cache_file, '') === false) { + + throw new Net_DNS2_Exception( + 'failed to create empty SHM file: ' . $cache_file, + Net_DNS2_Lookups::E_CACHE_SHM_FILE + ); + } + } + + // + // convert the filename to a IPC key + // + $this->_cache_file_tok = ftok($cache_file, 't'); + if ($this->_cache_file_tok == -1) { + + throw new Net_DNS2_Exception( + 'failed on ftok() file: ' . $this->_cache_file_tok, + Net_DNS2_Lookups::E_CACHE_SHM_FILE + ); + } + + // + // try to open an existing cache; if it doesn't exist, then there's no + // cache, and nothing to do. + // + $this->_cache_id = @shmop_open($this->_cache_file_tok, 'w', 0, 0); + if ($this->_cache_id !== false) { + + // + // this returns the size allocated, and not the size used, but it's + // still a good check to make sure there's space allocated. + // + $allocated = shmop_size($this->_cache_id); + if ($allocated > 0) { + + // + // read the data from the shared memory segment + // + $data = trim(shmop_read($this->_cache_id, 0, $allocated)); + if ( ($data !== false) && (strlen($data) > 0) ) { + + // + // unserialize and store the data + // + $decoded = null; + + if ($this->cache_serializer == 'json') { + + $decoded = json_decode($data, true); + } else { + + $decoded = unserialize($data); + } + + if (is_array($decoded) == true) { + + $this->cache_data = $decoded; + } else { + + $this->cache_data = array(); + } + + // + // call clean to clean up old entries + // + $this->clean(); + } + } + } + } + + /** + * Destructor + * + * @access public + * + */ + public function __destruct() + { + // + // if there's no cache file set, then there's nothing to do + // + if (strlen($this->cache_file) == 0) { + return; + } + + $fp = fopen($this->cache_file, 'r'); + if ($fp !== false) { + + // + // lock the file + // + flock($fp, LOCK_EX); + + // + // check to see if we have an open shm segment + // + if ($this->_cache_id === false) { + + // + // try opening it again, incase it was created by another + // process in the mean time + // + $this->_cache_id = @shmop_open( + $this->_cache_file_tok, 'w', 0, 0 + ); + if ($this->_cache_id === false) { + + // + // otherwise, create it. + // + $this->_cache_id = @shmop_open( + $this->_cache_file_tok, 'c', 0, $this->cache_size + ); + } + } + + // + // get the size allocated to the segment + // + $allocated = shmop_size($this->_cache_id); + + // + // read the contents + // + $data = trim(shmop_read($this->_cache_id, 0, $allocated)); + + // + // if there was some data + // + if ( ($data !== false) && (strlen($data) > 0) ) { + + // + // unserialize and store the data + // + $c = $this->cache_data; + + $decoded = null; + + if ($this->cache_serializer == 'json') { + + $decoded = json_decode($data, true); + } else { + + $decoded = unserialize($data); + } + + if (is_array($decoded) == true) { + + $this->cache_data = array_merge($c, $decoded); + } + } + + // + // delete the segment + // + shmop_delete($this->_cache_id); + + // + // clean the data + // + $this->clean(); + + // + // clean up and write the data + // + $data = $this->resize(); + if (!is_null($data)) { + + // + // re-create segment + // + $this->_cache_id = @shmop_open( + $this->_cache_file_tok, 'c', 0644, $this->cache_size + ); + if ($this->_cache_id === false) { + return; + } + + $o = shmop_write($this->_cache_id, $data, 0); + } + + // + // close the segment + // + shmop_close($this->_cache_id); + + // + // unlock + // + flock($fp, LOCK_UN); + + // + // close the file + // + fclose($fp); + } + } +}; + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Exception.php b/include/pear/Net/DNS2/Exception.php new file mode 100644 index 0000000000000000000000000000000000000000..b3f809b7f73a39d35f231416de87dcfca48a018c --- /dev/null +++ b/include/pear/Net/DNS2/Exception.php @@ -0,0 +1,132 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Exception.php 197 2013-04-22 00:28:00Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + */ + +/** + * Exception handler used by Net_DNS2 + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * + */ +class Net_DNS2_Exception extends Exception +{ + private $_request; + private $_response; + + /** + * Constructor - overload the constructor so we can pass in the request + * and response object (when it's available) + * + * @param string $message the exception message + * @param int $code the exception code + * @param object $previous the previous Exception object + * @param object $request the Net_DNS2_Packet_Request object for this request + * @param object $response the Net_DNS2_Packet_Response object for this request + * + * @access public + * + */ + public function __construct( + $message = '', + $code = 0, + $previous = null, + Net_DNS2_Packet_Request $request = null, + Net_DNS2_Packet_Response $response = null + ) { + // + // store the request/response objects (if passed) + // + $this->_request = $request; + $this->_response = $response; + + // + // call the parent constructor + // + parent::__construct($message, $code, $previous); + } + + /** + * returns the Net_DNS2_Packet_Request object (if available) + * + * @return Net_DNS2_Packet_Request object + * @access public + * @since function available since release 1.3.1 + * + */ + public function getRequest() + { + return $this->_request; + } + + /** + * returns the Net_DNS2_Packet_Response object (if available) + * + * @return Net_DNS2_Packet_Response object + * @access public + * @since function available since release 1.3.1 + * + */ + public function getResponse() + { + return $this->_response; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Header.php b/include/pear/Net/DNS2/Header.php new file mode 100644 index 0000000000000000000000000000000000000000..3831d75b55e0d40150de1d8673911d4cf21ae678 --- /dev/null +++ b/include/pear/Net/DNS2/Header.php @@ -0,0 +1,282 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Header.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + + +/** + * DNS Packet Header class + * + * This class handles parsing and constructing DNS Packet Headers as defined + * by section 4.1.1 of RFC1035. + * + * DNS header format - RFC1035 section 4.1.1 + * DNS header format - RFC4035 section 3.2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ID | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QDCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ANCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | NSCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ARCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * + */ +class Net_DNS2_Header +{ + public $id; // 16 bit - identifier + public $qr; // 1 bit - 0 = query, 1 = response + public $opcode; // 4 bit - op code + public $aa; // 1 bit - Authoritative Answer + public $tc; // 1 bit - TrunCation + public $rd; // 1 bit - Recursion Desired + public $ra; // 1 bit - Recursion Available + public $z; // 1 bit - Reserved + public $ad; // 1 bit - Authentic Data (RFC4035) + public $cd; // 1 bit - Checking Disabled (RFC4035) + public $rcode; // 4 bit - Response code + public $qdcount; // 16 bit - entries in the question section + public $ancount; // 16 bit - resource records in the answer section + public $nscount; // 16 bit - name server rr in the authority records section + public $arcount; // 16 bit - rr's in the additional records section + + /** + * Constructor - builds a new Net_DNS2_Header object + * + * @param mixed &$packet either a Net_DNS2_Packet object or null + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct(Net_DNS2_Packet &$packet = null) + { + if (!is_null($packet)) { + + $this->set($packet); + } else { + + $this->id = $this->nextPacketId(); + $this->qr = Net_DNS2_Lookups::QR_QUERY; + $this->opcode = Net_DNS2_Lookups::OPCODE_QUERY; + $this->aa = 0; + $this->tc = 0; + $this->rd = 1; + $this->ra = 0; + $this->z = 0; + $this->ad = 0; + $this->cd = 0; + $this->rcode = Net_DNS2_Lookups::RCODE_NOERROR; + $this->qdcount = 1; + $this->ancount = 0; + $this->nscount = 0; + $this->arcount = 0; + } + } + + /** + * returns the next available packet id + * + * @return integer + * @access public + * + */ + public function nextPacketId() + { + if (++Net_DNS2_Lookups::$next_packet_id > 65535) { + + Net_DNS2_Lookups::$next_packet_id = 1; + } + + return Net_DNS2_Lookups::$next_packet_id; + } + + /** + * magic __toString() method to return the header as a string + * + * @return string + * @access public + * + */ + public function __toString() + { + $output = ";;\n;; Header:\n"; + + $output .= ";;\t id = " . $this->id . "\n"; + $output .= ";;\t qr = " . $this->qr . "\n"; + $output .= ";;\t opcode = " . $this->opcode . "\n"; + $output .= ";;\t aa = " . $this->aa . "\n"; + $output .= ";;\t tc = " . $this->tc . "\n"; + $output .= ";;\t rd = " . $this->rd . "\n"; + $output .= ";;\t ra = " . $this->ra . "\n"; + $output .= ";;\t z = " . $this->z . "\n"; + $output .= ";;\t ad = " . $this->ad . "\n"; + $output .= ";;\t cd = " . $this->cd . "\n"; + $output .= ";;\t rcode = " . $this->rcode . "\n"; + $output .= ";;\t qdcount = " . $this->qdcount . "\n"; + $output .= ";;\t ancount = " . $this->ancount . "\n"; + $output .= ";;\t nscount = " . $this->nscount . "\n"; + $output .= ";;\t arcount = " . $this->arcount . "\n"; + + return $output; + } + + /** + * constructs a Net_DNS2_Header from a Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet Object + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function set(Net_DNS2_Packet &$packet) + { + // + // the header must be at least 12 bytes long. + // + if ($packet->rdlength < Net_DNS2_Lookups::DNS_HEADER_SIZE) { + + throw new Net_DNS2_Exception( + 'invalid header data provided; to small', + Net_DNS2_Lookups::E_HEADER_INVALID + ); + } + + $offset = 0; + + // + // parse the values + // + $this->id = ord($packet->rdata[$offset]) << 8 | + ord($packet->rdata[++$offset]); + + ++$offset; + $this->qr = (ord($packet->rdata[$offset]) >> 7) & 0x1; + $this->opcode = (ord($packet->rdata[$offset]) >> 3) & 0xf; + $this->aa = (ord($packet->rdata[$offset]) >> 2) & 0x1; + $this->tc = (ord($packet->rdata[$offset]) >> 1) & 0x1; + $this->rd = ord($packet->rdata[$offset]) & 0x1; + + ++$offset; + $this->ra = (ord($packet->rdata[$offset]) >> 7) & 0x1; + $this->z = (ord($packet->rdata[$offset]) >> 6) & 0x1; + $this->ad = (ord($packet->rdata[$offset]) >> 5) & 0x1; + $this->cd = (ord($packet->rdata[$offset]) >> 4) & 0x1; + $this->rcode = ord($packet->rdata[$offset]) & 0xf; + + $this->qdcount = ord($packet->rdata[++$offset]) << 8 | + ord($packet->rdata[++$offset]); + $this->ancount = ord($packet->rdata[++$offset]) << 8 | + ord($packet->rdata[++$offset]); + $this->nscount = ord($packet->rdata[++$offset]) << 8 | + ord($packet->rdata[++$offset]); + $this->arcount = ord($packet->rdata[++$offset]) << 8 | + ord($packet->rdata[++$offset]); + + // + // increment the internal offset + // + $packet->offset += Net_DNS2_Lookups::DNS_HEADER_SIZE; + + return true; + } + + /** + * returns a binary packed DNS Header + * + * @param Net_DNS2_Packet &$packet Object + * + * @return string + * @access public + * + */ + public function get(Net_DNS2_Packet &$packet) + { + $data = pack('n', $this->id) . + chr( + ($this->qr << 7) | ($this->opcode << 3) | + ($this->aa << 2) | ($this->tc << 1) | ($this->rd) + ) . + chr( + ($this->ra << 7) | ($this->ad << 5) | ($this->cd << 4) | $this->rcode + ) . + chr($this->qdcount << 8) . chr($this->qdcount) . + chr($this->ancount << 8) . chr($this->ancount) . + chr($this->nscount << 8) . chr($this->nscount) . + chr($this->arcount << 8) . chr($this->arcount); + + $packet->offset += Net_DNS2_Lookups::DNS_HEADER_SIZE; + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Lookups.php b/include/pear/Net/DNS2/Lookups.php new file mode 100644 index 0000000000000000000000000000000000000000..082ce205002bf4913746d6bdb81049f967856b8d --- /dev/null +++ b/include/pear/Net/DNS2/Lookups.php @@ -0,0 +1,540 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Lookups.php 207 2013-06-13 01:19:55Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +// +// initalize the packet id value +// +Net_DNS2_Lookups::$next_packet_id = mt_rand(0, 65535); + +// +// build the reverse lookup tables; this is just so we don't have to +// have duplicate static content laying around. +// +Net_DNS2_Lookups::$rr_types_by_id = array_flip(Net_DNS2_Lookups::$rr_types_by_name); +Net_DNS2_Lookups::$classes_by_id = array_flip(Net_DNS2_Lookups::$classes_by_name); +Net_DNS2_Lookups::$rr_types_class_to_id = array_flip(Net_DNS2_Lookups::$rr_types_id_to_class); +Net_DNS2_Lookups::$algorithm_name_to_id = array_flip(Net_DNS2_Lookups::$algorithm_id_to_name); +Net_DNS2_Lookups::$digest_name_to_id = array_flip(Net_DNS2_Lookups::$digest_id_to_name); +Net_DNS2_Lookups::$rr_qtypes_by_id = array_flip(Net_DNS2_Lookups::$rr_qtypes_by_name); +Net_DNS2_Lookups::$rr_metatypes_by_id = array_flip(Net_DNS2_Lookups::$rr_metatypes_by_name); +Net_DNS2_Lookups::$protocol_by_id = array_flip(Net_DNS2_Lookups::$protocol_by_name); + +/** + * This class provides simple lookups used througout the Net_DNS2 code + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * + */ +class Net_DNS2_Lookups +{ + /* + * size (in bytes) of a header in a standard DNS packet + */ + const DNS_HEADER_SIZE = 12; + + /* + * max size of a UDP packet + */ + const DNS_MAX_UDP_SIZE = 512; + + /* + * Query/Response flag + */ + const QR_QUERY = 0; // RFC 1035 + const QR_RESPONSE = 1; // RFC 1035 + + /* + * DNS Op Codes + */ + const OPCODE_QUERY = 0; // RFC 1035 + const OPCODE_IQUERY = 1; // RFC 1035, RFC 3425 + const OPCODE_STATUS = 2; // RFC 1035 + const OPCODE_NOTIFY = 4; // RFC 1996 + const OPCODE_UPDATE = 5; // RFC 2136 + + /* + * Resource Record Classes + */ + const RR_CLASS_IN = 1; // RFC 1035 + const RR_CLASS_CH = 3; // RFC 1035 + const RR_CLASS_HS = 4; // RFC 1035 + const RR_CLASS_NONE = 254; // RFC 2136 + const RR_CLASS_ANY = 255; // RFC 1035 + + /* + * DNS Response Codes + */ + const RCODE_NOERROR = 0; // RFC 1035 + const RCODE_FORMERR = 1; // RFC 1035 + const RCODE_SERVFAIL = 2; // RFC 1035 + const RCODE_NXDOMAIN = 3; // RFC 1035 + const RCODE_NOTIMP = 4; // RFC 1035 + const RCODE_REFUSED = 5; // RFC 1035 + const RCODE_YXDOMAIN = 6; // RFC 2136 + const RCODE_YXRRSET = 7; // RFC 2136 + const RCODE_NXRRSET = 8; // RFC 2136 + const RCODE_NOTAUTH = 9; // RFC 2136 + const RCODE_NOTZONE = 10; // RFC 2136 + + // 11-15 reserved + + const RCODE_BADSIG = 16; // RFC 2845 + const RCODE_BADKEY = 17; // RFC 2845 + const RCODE_BADTIME = 18; // RFC 2845 + const RCODE_BADMODE = 19; // RFC 2930 + const RCODE_BADNAME = 20; // RFC 2930 + const RCODE_BADALG = 21; // RFC 2930 + const RCODE_BADTRUNC = 22; // RFC 4635 + + /* + * internal errors codes returned by the exceptions class + */ + const E_NONE = 0; + const E_DNS_FORMERR = self::RCODE_FORMERR; + const E_DNS_SERVFAIL = self::RCODE_SERVFAIL; + const E_DNS_NXDOMAIN = self::RCODE_NXDOMAIN; + const E_DNS_NOTIMP = self::RCODE_NOTIMP; + const E_DNS_REFUSED = self::RCODE_REFUSED; + const E_DNS_YXDOMAIN = self::RCODE_YXDOMAIN; + const E_DNS_YXRRSET = self::RCODE_YXRRSET; + const E_DNS_NXRRSET = self::RCODE_NXRRSET; + const E_DNS_NOTAUTH = self::RCODE_NOTAUTH; + const E_DNS_NOTZONE = self::RCODE_NOTZONE; + + // 11-15 reserved + + const E_DNS_BADSIG = self::RCODE_BADSIG; + const E_DNS_BADKEY = self::RCODE_BADKEY; + const E_DNS_BADTIME = self::RCODE_BADTIME; + const E_DNS_BADMODE = self::RCODE_BADMODE; + const E_DNS_BADNAME = self::RCODE_BADNAME; + const E_DNS_BADALG = self::RCODE_BADALG; + const E_DNS_BADTRUNC = self::RCODE_BADTRUNC; + + // other error conditions + + const E_NS_INVALID_FILE = 200; + const E_NS_INVALID_ENTRY = 201; + const E_NS_FAILED = 202; + + const E_PACKET_INVALID = 300; + const E_PARSE_ERROR = 301; + const E_HEADER_INVALID = 302; + const E_QUESTION_INVALID = 303; + const E_RR_INVALID = 304; + + const E_OPENSSL_ERROR = 400; + const E_OPENSSL_UNAVAIL = 401; + const E_OPENSSL_INV_PKEY = 402; + const E_OPENSSL_INV_ALGO = 403; + + const E_CACHE_UNSUPPORTED = 500; + const E_CACHE_SHM_FILE = 501; + const E_CACHE_SHM_UNAVAIL = 502; + + /* + * DNSSEC Algorithms + */ + const DNSSEC_ALGORITHM_RES = 0; + const DNSSEC_ALGORITHM_RSAMD5 = 1; + const DNSSEC_ALGORITHM_DH = 2; + const DNSSEC_ALGORITHM_DSA = 3; + const DNSSEC_ALGORITHM_ECC = 4; + const DNSSEC_ALGORITHM_RSASHA1 = 5; + const DNSSEC_ALGORITHM_DSANSEC3SHA1 = 6; + const DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1 = 7; + const DNSSEC_ALGORITHM_RSASHA256 = 8; + const DNSSEC_ALGORITHM_RSASHA512 = 10; + const DNSSEC_ALGORITHM_ECCGOST = 12; + const DNSSEC_ALGORITHM_INDIRECT = 252; + const DNSSEC_ALGORITHM_PRIVATEDNS = 253; + const DNSSEC_ALGORITHM_PRIVATEOID = 254; + + /* + * DNSSEC Digest Types + */ + const DNSSEC_DIGEST_RES = 0; + const DNSSEC_DIGEST_SHA1 = 1; + + /* + * The packet id used when sending requests + */ + public static $next_packet_id; + + /* + * Used to map resource record types to their id's, and back + */ + public static $rr_types_by_id = array(); + public static $rr_types_by_name = array( + + 'SIG0' => 0, // RFC 2931 pseudo type + 'A' => 1, // RFC 1035 + 'NS' => 2, // RFC 1035 + 'MD' => 3, // RFC 1035 - obsolete, Not implemented + 'MF' => 4, // RFC 1035 - obsolete, Not implemented + 'CNAME' => 5, // RFC 1035 + 'SOA' => 6, // RFC 1035 + 'MB' => 7, // RFC 1035 - obsolete, Not implemented + 'MG' => 8, // RFC 1035 - obsolete, Not implemented + 'MR' => 9, // RFC 1035 - obsolete, Not implemented + 'NULL' => 10, // RFC 1035 - obsolete, Not implemented + 'WKS' => 11, // RFC 1035 + 'PTR' => 12, // RFC 1035 + 'HINFO' => 13, // RFC 1035 + 'MINFO' => 14, // RFC 1035 - obsolete, Not implemented + 'MX' => 15, // RFC 1035 + 'TXT' => 16, // RFC 1035 + 'RP' => 17, // RFC 1183 + 'AFSDB' => 18, // RFC 1183 + 'X25' => 19, // RFC 1183 + 'ISDN' => 20, // RFC 1183 + 'RT' => 21, // RFC 1183 + 'NSAP' => 22, // RFC 1706 + 'NSAP_PTR' => 23, // RFC 1348 - obsolete, Not implemented + 'SIG' => 24, // RFC 2535 + 'KEY' => 25, // RFC 2535, RFC 2930 + 'PX' => 26, // RFC 2163 + 'GPOS' => 27, // RFC 1712 - Not implemented + 'AAAA' => 28, // RFC 3596 + 'LOC' => 29, // RFC 1876 + 'NXT' => 30, // RFC 2065, obsoleted by by RFC 3755 + 'EID' => 31, // [Patton][Patton1995] + 'NIMLOC' => 32, // [Patton][Patton1995] + 'SRV' => 33, // RFC 2782 + 'ATMA' => 34, // Windows only + 'NAPTR' => 35, // RFC 2915 + 'KX' => 36, // RFC 2230 + 'CERT' => 37, // RFC 4398 + 'A6' => 38, // downgraded to experimental by RFC 3363 + 'DNAME' => 39, // RFC 2672 + 'SINK' => 40, // Not implemented + 'OPT' => 41, // RFC 2671 + 'APL' => 42, // RFC 3123 + 'DS' => 43, // RFC 4034 + 'SSHFP' => 44, // RFC 4255 + 'IPSECKEY' => 45, // RFC 4025 + 'RRSIG' => 46, // RFC 4034 + 'NSEC' => 47, // RFC 4034 + 'DNSKEY' => 48, // RFC 4034 + 'DHCID' => 49, // RFC 4701 + 'NSEC3' => 50, // RFC 5155 + 'NSEC3PARAM' => 51, // RFC 5155 + 'TLSA' => 52, // RFC 6698 + + // 52 - 54 unassigned + + 'HIP' => 55, // RFC 5205 + 'NINFO' => 56, // Not implemented + 'RKEY' => 57, // Not implemented + 'TALINK' => 58, // IETF (draft-barwood-dnsop-ds-publish-02) + 'CDS' => 59, // IETF (draft-barwood-dnsop-ds-publish-02) + + // 60 - 98 unassigned + + 'SPF' => 99, // RFC 4408 + 'UINFO' => 100, // no RFC, Not implemented + 'UID' => 101, // no RFC, Not implemented + 'GID' => 102, // no RFC, Not implemented + 'UNSPEC' => 103, // no RFC, Not implemented + 'NID' => 104, // RFC 6742 + 'L32' => 105, // RFC 6742 + 'L64' => 106, // RFC 6742 + 'LP' => 107, // RFC 6742 + + // 108 - 248 unassigned + + 'TKEY' => 249, // RFC 2930 + 'TSIG' => 250, // RFC 2845 + 'IXFR' => 251, // RFC 1995 - only a full (AXFR) is supported + 'AXFR' => 252, // RFC 1035 + 'MAILB' => 253, // RFC 883, Not implemented + 'MAILA' => 254, // RFC 973, Not implemented + 'ANY' => 255, // RFC 1035 - we support both 'ANY' and '*' + 'URI' => 256, // tools.ietf.org/html/draft-faltstrom-uri-06 + 'CAA' => 257, // tools.ietf.org/html/draft-ietf-pkix-caa-03 + + // 258 - 32767 unassigned + + 'TA' => 32768, // same as DS + 'DLV' => 32769 // RFC 4431 + ); + + /* + * Qtypes and Metatypes - defined in RFC2929 section 3.1 + */ + public static $rr_qtypes_by_id = array(); + public static $rr_qtypes_by_name = array( + + 'IXFR' => 251, // RFC 1995 - only a full (AXFR) is supported + 'AXFR' => 252, // RFC 1035 + 'MAILB' => 253, // RFC 883, Not implemented + 'MAILA' => 254, // RFC 973, Not implemented + 'ANY' => 255 // RFC 1035 - we support both 'ANY' and '*' + ); + + public static $rr_metatypes_by_id = array(); + public static $rr_metatypes_by_name = array( + + 'OPT' => 41, // RFC 2671 + 'TKEY' => 249, // RFC 2930 + 'TSIG' => 250 // RFC 2845 + ); + + /* + * used to map resource record id's to RR class names + */ + public static $rr_types_class_to_id = array(); + public static $rr_types_id_to_class = array( + + 1 => 'Net_DNS2_RR_A', + 2 => 'Net_DNS2_RR_NS', + 5 => 'Net_DNS2_RR_CNAME', + 6 => 'Net_DNS2_RR_SOA', + 11 => 'Net_DNS2_RR_WKS', + 12 => 'Net_DNS2_RR_PTR', + 13 => 'Net_DNS2_RR_HINFO', + 15 => 'Net_DNS2_RR_MX', + 16 => 'Net_DNS2_RR_TXT', + 17 => 'Net_DNS2_RR_RP', + 18 => 'Net_DNS2_RR_AFSDB', + 19 => 'Net_DNS2_RR_X25', + 20 => 'Net_DNS2_RR_ISDN', + 21 => 'Net_DNS2_RR_RT', + 22 => 'Net_DNS2_RR_NSAP', + 24 => 'Net_DNS2_RR_SIG', + 25 => 'Net_DNS2_RR_KEY', + 26 => 'Net_DNS2_RR_PX', + 28 => 'Net_DNS2_RR_AAAA', + 29 => 'Net_DNS2_RR_LOC', + 31 => 'Net_DNS2_RR_EID', + 32 => 'Net_DNS2_RR_NIMLOC', + 33 => 'Net_DNS2_RR_SRV', + 34 => 'Net_DNS2_RR_ATMA', + 35 => 'Net_DNS2_RR_NAPTR', + 36 => 'Net_DNS2_RR_KX', + 37 => 'Net_DNS2_RR_CERT', + 39 => 'Net_DNS2_RR_DNAME', + 41 => 'Net_DNS2_RR_OPT', + 42 => 'Net_DNS2_RR_APL', + 43 => 'Net_DNS2_RR_DS', + 44 => 'Net_DNS2_RR_SSHFP', + 45 => 'Net_DNS2_RR_IPSECKEY', + 46 => 'Net_DNS2_RR_RRSIG', + 47 => 'Net_DNS2_RR_NSEC', + 48 => 'Net_DNS2_RR_DNSKEY', + 49 => 'Net_DNS2_RR_DHCID', + 50 => 'Net_DNS2_RR_NSEC3', + 51 => 'Net_DNS2_RR_NSEC3PARAM', + 52 => 'Net_DNS2_RR_TLSA', + 55 => 'Net_DNS2_RR_HIP', + 58 => 'Net_DNS2_RR_TALINK', + 59 => 'Net_DNS2_RR_CDS', + 99 => 'Net_DNS2_RR_SPF', + 104 => 'Net_DNS2_RR_NID', + 105 => 'Net_DNS2_RR_L32', + 106 => 'Net_DNS2_RR_L64', + 107 => 'Net_DNS2_RR_LP', + 249 => 'Net_DNS2_RR_TKEY', + 250 => 'Net_DNS2_RR_TSIG', + + // 251 - IXFR - handled as a full zone transfer (252) + // 252 - AXFR - handled as a function call + // 255 - ANY - used only for queries + + 256 => 'Net_DNS2_RR_URI', + 257 => 'Net_DNS2_RR_CAA', + 32768 => 'Net_DNS2_RR_TA', + 32769 => 'Net_DNS2_RR_DLV' + ); + + /* + * used to map resource record class names to their id's, and back + */ + public static $classes_by_id = array(); + public static $classes_by_name = array( + + 'IN' => self::RR_CLASS_IN, // RFC 1035 + 'CH' => self::RR_CLASS_CH, // RFC 1035 + 'HS' => self::RR_CLASS_HS, // RFC 1035 + 'NONE' => self::RR_CLASS_NONE, // RFC 2136 + 'ANY' => self::RR_CLASS_ANY // RFC 1035 + ); + + /* + * maps response codes to error messages + */ + public static $result_code_messages = array( + + self::RCODE_NOERROR => 'The request completed successfully.', + self::RCODE_FORMERR => 'The name server was unable to interpret the query.', + self::RCODE_SERVFAIL => 'The name server was unable to process this query due to a problem with the name server.', + self::RCODE_NXDOMAIN => 'The domain name referenced in the query does not exist.', + self::RCODE_NOTIMP => 'The name server does not support the requested kind of query.', + self::RCODE_REFUSED => 'The name server refuses to perform the specified operation for policy reasons.', + self::RCODE_YXDOMAIN => 'Name Exists when it should not.', + self::RCODE_YXRRSET => 'RR Set Exists when it should not.', + self::RCODE_NXRRSET => 'RR Set that should exist does not.', + self::RCODE_NOTAUTH => 'Server Not Authoritative for zone.', + self::RCODE_NOTZONE => 'Name not contained in zone.', + + self::RCODE_BADSIG => 'TSIG Signature Failure.', + self::RCODE_BADKEY => 'Key not recognized.', + self::RCODE_BADTIME => 'Signature out of time window.', + self::RCODE_BADMODE => 'Bad TKEY Mode.', + self::RCODE_BADNAME => 'Duplicate key name.', + self::RCODE_BADALG => 'Algorithm not supported.', + self::RCODE_BADTRUNC => 'Bad truncation.' + ); + + /* + * maps DNS SEC alrorithms to their mnemonics + */ + public static $algorithm_name_to_id = array(); + public static $algorithm_id_to_name = array( + + self::DNSSEC_ALGORITHM_RES => 'RES', + self::DNSSEC_ALGORITHM_RSAMD5 => 'RSAMD5', + self::DNSSEC_ALGORITHM_DH => 'DH', + self::DNSSEC_ALGORITHM_DSA => 'DSA', + self::DNSSEC_ALGORITHM_ECC => 'ECC', + self::DNSSEC_ALGORITHM_RSASHA1 => 'RSASHA1', + self::DNSSEC_ALGORITHM_DSANSEC3SHA1 => 'DSA-NSEC3-SHA1', + self::DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1 => 'RSASHA1-NSEC3-SHA1', + self::DNSSEC_ALGORITHM_RSASHA256 => 'RSASHA256', + self::DNSSEC_ALGORITHM_RSASHA512 => 'RSASHA512', + self::DNSSEC_ALGORITHM_ECCGOST => 'ECC-GOST', + self::DNSSEC_ALGORITHM_INDIRECT => 'INDIRECT', + self::DNSSEC_ALGORITHM_PRIVATEDNS => 'PRIVATEDNS', + self::DNSSEC_ALGORITHM_PRIVATEOID => 'PRIVATEOID' + ); + + /* + * maps DNSSEC digest types to their mnemonics + */ + public static $digest_name_to_id = array(); + public static $digest_id_to_name = array( + + self::DNSSEC_DIGEST_RES => 'RES', + self::DNSSEC_DIGEST_SHA1 => 'SHA-1' + ); + + /* + * Protocols names - RFC 1010 + */ + public static $protocol_by_id = array(); + public static $protocol_by_name = array( + + 'ICMP' => 1, + 'IGMP' => 2, + 'GGP' => 3, + 'ST' => 5, + 'TCP' => 6, + 'UCL' => 7, + 'EGP' => 8, + 'IGP' => 9, + 'BBN-RCC-MON' => 10, + 'NVP-II' => 11, + 'PUP' => 12, + 'ARGUS' => 13, + 'EMCON' => 14, + 'XNET' => 15, + 'CHAOS' => 16, + 'UDP' => 17, + 'MUX' => 18, + 'DCN-MEAS' => 19, + 'HMP' => 20, + 'PRM' => 21, + 'XNS-IDP' => 22, + 'TRUNK-1' => 23, + 'TRUNK-2' => 24, + 'LEAF-1' => 25, + 'LEAF-2' => 26, + 'RDP' => 27, + 'IRTP' => 28, + 'ISO-TP4' => 29, + 'NETBLT' => 30, + 'MFE-NSP' => 31, + 'MERIT-INP' => 32, + 'SEP' => 33, + // 34 - 60 - Unassigned + // 61 - any host internal protocol + 'CFTP' => 62, + // 63 - any local network + 'SAT-EXPAK' => 64, + 'MIT-SUBNET' => 65, + 'RVD' => 66, + 'IPPC' => 67, + // 68 - any distributed file system + 'SAT-MON' => 69, + // 70 - Unassigned + 'IPCV' => 71, + // 72 - 75 - Unassigned + 'BR-SAT-MON' => 76, + // 77 - Unassigned + 'WB-MON' => 78, + 'WB-EXPAK' => 79 + // 80 - 254 - Unassigned + // 255 - Reserved + ); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Packet.php b/include/pear/Net/DNS2/Packet.php new file mode 100644 index 0000000000000000000000000000000000000000..ccd633eb7d2dbbbde819a02c40ae369f95b0f33a --- /dev/null +++ b/include/pear/Net/DNS2/Packet.php @@ -0,0 +1,449 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Packet.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + * This file contains code based off the Net::DNS Perl module by + * Michael Fuhr. + * + * This is the copyright notice from the PERL Net::DNS module: + * + * Copyright (c) 1997-2000 Michael Fuhr. All rights reserved. This + * program is free software; you can redistribute it and/or modify it + * under the same terms as Perl itself. + * + */ + +/** + * This is the base class that holds a standard DNS packet. + * + * The Net_DNS2_Packet_Request and Net_DNS2_Packet_Response classes extend this + * class. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet_Request, Net_DNS2_Packet_Response + * + */ +class Net_DNS2_Packet +{ + /* + * the full binary data and length for this packet + */ + public $rdata; + public $rdlength; + + /* + * the offset pointer used when building/parsing packets + */ + public $offset = 0; + + /* + * Net_DNS2_Header object with the DNS packet header + */ + public $header; + + /* + * array of Net_DNS2_Question objects + * + * used as "zone" for updates per RFC2136 + * + */ + public $question = array(); + + /* + * array of Net_DNS2_RR Objects for Answers + * + * used as "prerequisite" for updates per RFC2136 + * + */ + public $answer = array(); + + /* + * array of Net_DNS2_RR Objects for Authority + * + * used as "update" for updates per RFC2136 + * + */ + public $authority = array(); + + /* + * array of Net_DNS2_RR Objects for Addtitional + */ + public $additional = array(); + + /* + * array of compressed labeles + */ + private $_compressed = array(); + + /** + * magic __toString() method to return the Net_DNS2_Packet as a string + * + * @return string + * @access public + * + */ + public function __toString() + { + $output = $this->header->__toString(); + + foreach ($this->question as $x) { + + $output .= $x->__toString() . "\n"; + } + foreach ($this->answer as $x) { + + $output .= $x->__toString() . "\n"; + } + foreach ($this->authority as $x) { + + $output .= $x->__toString() . "\n"; + } + foreach ($this->additional as $x) { + + $output .= $x->__toString() . "\n"; + } + + return $output; + } + + /** + * returns a full binary DNS packet + * + * @return string + * @throws Net_DNS2_Exception + * @access public + * + */ + public function get() + { + $data = $this->header->get($this); + + foreach ($this->question as $x) { + + $data .= $x->get($this); + } + foreach ($this->answer as $x) { + + $data .= $x->get($this); + } + foreach ($this->authority as $x) { + + $data .= $x->get($this); + } + foreach ($this->additional as $x) { + + $data .= $x->get($this); + } + + return $data; + } + + /** + * applies a standard DNS name compression on the given name/offset + * + * This logic was based on the Net::DNS::Packet::dn_comp() function + * by Michanel Fuhr + * + * @param string $name the name to be compressed + * @param integer &$offset the offset into the given packet object + * + * @return string + * @access public + * + */ + public function compress($name, &$offset) + { + $names = explode('.', $name); + $compname = ''; + + while (!empty($names)) { + + $dname = join('.', $names); + + if (isset($this->_compressed[$dname])) { + + $compname .= pack('n', 0xc000 | $this->_compressed[$dname]); + $offset += 2; + + break; + } + + $this->_compressed[$dname] = $offset; + $first = array_shift($names); + + $length = strlen($first); + if ($length <= 0) { + continue; + } + + // + // truncate see RFC1035 2.3.1 + // + if ($length > 63) { + + $length = 63; + $first = substr($first, 0, $length); + } + + $compname .= pack('Ca*', $length, $first); + $offset += $length + 1; + } + + if (empty($names)) { + + $compname .= pack('C', 0); + $offset++; + } + + return $compname; + } + + /** + * applies a standard DNS name compression on the given name/offset + * + * This logic was based on the Net::DNS::Packet::dn_comp() function + * by Michanel Fuhr + * + * @param string $name the name to be compressed + * + * @return string + * @access public + * + */ + public static function pack($name) + { + $offset = 0; + $names = explode('.', $name); + $compname = ''; + + while (!empty($names)) { + + $first = array_shift($names); + $length = strlen($first); + + $compname .= pack('Ca*', $length, $first); + $offset += $length + 1; + } + + $compname .= "\0"; + $offset++; + + return $compname; + } + + /** + * expands the domain name stored at a given offset in a DNS Packet + * + * This logic was based on the Net::DNS::Packet::dn_expand() function + * by Michanel Fuhr + * + * @param Net_DNS2_Packet &$packet the DNS packet to look in for the domain name + * @param integer &$offset the offset into the given packet object + * + * @return mixed either the domain name or null if it's not found. + * @access public + * + */ + public static function expand(Net_DNS2_Packet &$packet, &$offset) + { + $name = ''; + + while (1) { + if ($packet->rdlength < ($offset + 1)) { + return null; + } + + $xlen = ord($packet->rdata[$offset]); + if ($xlen == 0) { + + ++$offset; + break; + + } else if (($xlen & 0xc0) == 0xc0) { + if ($packet->rdlength < ($offset + 2)) { + + return null; + } + + $ptr = ord($packet->rdata[$offset]) << 8 | + ord($packet->rdata[$offset+1]); + $ptr = $ptr & 0x3fff; + + $name2 = Net_DNS2_Packet::expand($packet, $ptr); + if (is_null($name2)) { + + return null; + } + + $name .= $name2; + $offset += 2; + + break; + } else { + ++$offset; + + if ($packet->rdlength < ($offset + $xlen)) { + + return null; + } + + $elem = ''; + $elem = substr($packet->rdata, $offset, $xlen); + $name .= $elem . '.'; + $offset += $xlen; + } + } + + return trim($name, '.'); + } + + /** + * parses a domain label from a DNS Packet at the given offset + * + * @param Net_DNS2_Packet &$packet the DNS packet to look in for the domain name + * @param integer &$offset the offset into the given packet object + * + * @return mixed either the domain name or null if it's not found. + * @access public + * + */ + public static function label(Net_DNS2_Packet &$packet, &$offset) + { + $name = ''; + + if ($packet->rdlength < ($offset + 1)) { + + return null; + } + + $xlen = ord($packet->rdata[$offset]); + ++$offset; + + if (($xlen + $offset) > $packet->rdlength) { + + $name = substr($packet->rdata, $offset); + $offset = $packet->rdlength; + } else { + + $name = substr($packet->rdata, $offset, $xlen); + $offset += $xlen; + } + + return $name; + } + + /** + * copies the contents of the given packet, to the local packet object. this + * function intentionally ignores some of the packet data. + * + * @param Net_DNS2_Packet $packet the DNS packet to copy the data from + * + * @return boolean + * @access public + * + */ + public function copy(Net_DNS2_Packet $packet) + { + $this->header = $packet->header; + $this->question = $packet->question; + $this->answer = $packet->answer; + $this->authority = $packet->authority; + $this->additional = $packet->additional; + + return true; + } + + /** + * resets the values in the current packet object + * + * @return boolean + * @access public + * + */ + public function reset() + { + $this->header->id = $this->header->nextPacketId(); + $this->rdata = ''; + $this->rdlength = 0; + $this->offset = 0; + $this->answer = array(); + $this->authority = array(); + $this->additional = array(); + $this->_compressed = array(); + + return true; + } + + /** + * formats an IPv6 IP address in the preferred format + * + * @param string $address The IPv6 IP address to format + * + * @return string The IPv6 IP address formatted in the new format + * @access public + * @deprecated function deprecated in 1.1.3 + * + */ + public static function formatIPv6($address) + { + return Net_DNS2::expandIPv6($address); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Packet/Request.php b/include/pear/Net/DNS2/Packet/Request.php new file mode 100644 index 0000000000000000000000000000000000000000..117fc7a98e03b5f1ec585a42d880dd6a80063056 --- /dev/null +++ b/include/pear/Net/DNS2/Packet/Request.php @@ -0,0 +1,221 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Request.php 155 2012-05-06 23:45:23Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + + +/** + * This class handles building new DNS request packets; packets used for DNS + * queries and updates. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Packet_Request extends Net_DNS2_Packet +{ + /** + * Constructor - builds a new Net_DNS2_Packet_Request object + * + * @param string $name the domain name for the packet + * @param string $type the DNS RR type for the packet + * @param string $class the DNS class for the packet + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct($name, $type = null, $class = null) + { + $this->set($name, $type, $class); + } + + /** + * builds a new Net_DNS2_Packet_Request object + * + * @param string $name the domain name for the packet + * @param string $type the DNS RR type for the packet + * @param string $class the DNS class for the packet + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function set($name, $type = 'A', $class = 'IN') + { + // + // generate a new header + // + $this->header = new Net_DNS2_Header; + + // + // add a new question + // + $q = new Net_DNS2_Question(); + + $name = trim(strtolower($name), " \t\n\r\0\x0B."); + $type = strtoupper(trim($type)); + $class = strtoupper(trim($class)); + + // + // check that the input string has some data in it + // + if (empty($name)) { + + throw new Net_DNS2_Exception( + 'empty query string provided', + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + + // + // if the type is "*", rename it to "ANY"- both are acceptable. + // + if ($type == '*') { + + $type = 'ANY'; + } + + // + // check that the type and class are valid + // + if ( (!isset(Net_DNS2_Lookups::$rr_types_by_name[$type])) + || (!isset(Net_DNS2_Lookups::$classes_by_name[$class])) + ) { + throw new Net_DNS2_Exception( + 'invalid type (' . $type . ') or class (' . $class . ') specified.', + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + + // + // if it's a PTR request for an IP address, then make sure we tack on + // the arpa domain + // + if ($type == 'PTR') { + + if (Net_DNS2::isIPv4($name) == true) { + + // + // IPv4 + // + $name = implode('.', array_reverse(explode('.', $name))); + $name .= '.in-addr.arpa'; + + } else if (Net_DNS2::isIPv6($name) == true) { + + // + // IPv6 + // + $e = Net_DNS2::expandIPv6($name); + if ($e !== false) { + + $name = implode( + '.', array_reverse(str_split(str_replace(':', '', $e))) + ); + + $name .= '.ip6.arpa'; + + } else { + + throw new Net_DNS2_Exception( + 'unsupported PTR value: ' . $name, + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + + } else if (preg_match('/arpa$/', $name) == true) { + + // + // an already formatted IPv4 or IPv6 address in the arpa domain + // + + } else { + + throw new Net_DNS2_Exception( + 'unsupported PTR value: ' . $name, + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + } + + // + // store the data + // + $q->qname = $name; + $q->qtype = $type; + $q->qclass = $class; + + $this->question[] = $q; + + // + // the answer, authority and additional are empty; they can be modified + // after the request is created for UPDATE requests if needed. + // + $this->answer = array(); + $this->authority = array(); + $this->additional = array(); + + return true; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Packet/Response.php b/include/pear/Net/DNS2/Packet/Response.php new file mode 100644 index 0000000000000000000000000000000000000000..a2cd1f281cde12e6bd967586568f613dab43918d --- /dev/null +++ b/include/pear/Net/DNS2/Packet/Response.php @@ -0,0 +1,189 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Response.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + + +/** + * This class handles building new DNS response packets; it parses binary packed + * packets that come off the wire + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Packet_Response extends Net_DNS2_Packet +{ + /* + * The name servers that this response came from + */ + public $answer_from; + + /* + * The socket type the answer came from (TCP/UDP) + */ + public $answer_socket_type; + + /** + * Constructor - builds a new Net_DNS2_Packet_Response object + * + * @param string $data binary DNS packet + * @param integer $size the length of the DNS packet + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct($data, $size) + { + $this->set($data, $size); + } + + /** + * builds a new Net_DNS2_Packet_Response object + * + * @param string $data binary DNS packet + * @param integer $size the length of the DNS packet + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function set($data, $size) + { + // + // store the full packet + // + $this->rdata = $data; + $this->rdlength = $size; + + // + // parse the header + // + // we don't bother checking the size earlier, because the first thing the + // header class does, is check the size and throw and exception if it's + // invalid. + // + $this->header = new Net_DNS2_Header($this); + + // + // if the truncation bit is set, then just return right here, because the + // rest of the packet is probably empty; and there's no point in processing + // anything else. + // + // we also don't need to worry about checking to see if the the header is + // null or not, since the Net_DNS2_Header() constructor will throw an + // exception if the packet is invalid. + // + if ($this->header->tc == 1) { + + return false; + } + + // + // parse the questions + // + for ($x = 0; $x < $this->header->qdcount; ++$x) { + + $this->question[$x] = new Net_DNS2_Question($this); + } + + // + // parse the answers + // + for ($x = 0; $x < $this->header->ancount; ++$x) { + + $o = Net_DNS2_RR::parse($this); + if (!is_null($o)) { + + $this->answer[] = $o; + } + } + + // + // parse the authority section + // + for ($x = 0; $x < $this->header->nscount; ++$x) { + + $o = Net_DNS2_RR::parse($this); + if (!is_null($o)) { + + $this->authority[] = $o; + } + } + + // + // parse the additional section + // + for ($x = 0; $x < $this->header->arcount; ++$x) { + + $o = Net_DNS2_RR::parse($this); + if (!is_null($o)) { + + $this->additional[] = $o; + } + } + + return true; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/PrivateKey.php b/include/pear/Net/DNS2/PrivateKey.php new file mode 100644 index 0000000000000000000000000000000000000000..1dca1ce6d225237e48d74d72aca667107391c6ee --- /dev/null +++ b/include/pear/Net/DNS2/PrivateKey.php @@ -0,0 +1,422 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: PrivateKey.php 133 2011-12-03 23:42:24Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.1.0 + * + */ + +/** + * SSL Private Key container class + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * + */ +class Net_DNS2_PrivateKey +{ + /* + * the filename that was loaded; stored for reference + */ + public $filename; + + /* + * the keytag for the signature + */ + public $keytag; + + /* + * the sign name for the signature + */ + public $signname; + + /* + * the algorithm used for the signature + */ + public $algorithm; + + /* + * the key format fo the signature + */ + public $key_format; + + /* + * the openssl private key id + */ + public $instance; + + /* + * RSA: modulus + */ + private $_modulus; + + /* + * RSA: public exponent + */ + private $_public_exponent; + + /* + * RSA: rivate exponent + */ + private $_private_exponent; + + /* + * RSA: prime1 + */ + private $_prime1; + + /* + * RSA: prime2 + */ + private $_prime2; + + /* + * RSA: exponent 1 + */ + private $_exponent1; + + /* + * RSA: exponent 2 + */ + private $_exponent2; + + /* + * RSA: coefficient + */ + private $_coefficient; + + /* + * DSA: prime + */ + //private $_prime; + + /* + * DSA: subprime + */ + //private $_subprime; + + /* + * DSA: base + */ + //private $_base; + + /* + * DSA: private value + */ + //private $_private_value; + + /* + * DSA: public value + */ + //private $_public_value; + + /** + * Constructor - base constructor the private key container class + * + * @param string $file path to a private-key file to parse and load + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct($file = null) + { + if (isset($file)) { + $this->parseFile($file); + } + } + + /** + * parses a private key file generated by dnssec-keygen + * + * @param string $file path to a private-key file to parse and load + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function parseFile($file) + { + // + // check for OpenSSL + // + if (extension_loaded('openssl') === false) { + + throw new Net_DNS2_Exception( + 'the OpenSSL extension is required to use parse private key.', + Net_DNS2_Lookups::E_OPENSSL_UNAVAIL + ); + } + + // + // check to make sure the file exists + // + if (is_readable($file) == false) { + + throw new Net_DNS2_Exception( + 'invalid private key file: ' . $file, + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + + // + // get the base filename, and parse it for the local value + // + $keyname = basename($file); + if (strlen($keyname) == 0) { + + throw new Net_DNS2_Exception( + 'failed to get basename() for: ' . $file, + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + + // + // parse the keyname + // + if (preg_match("/K(.*)\.\+(\d{3})\+(\d*)\.private/", $keyname, $matches)) { + + $this->signname = $matches[1]; + $this->algorithm = intval($matches[2]); + $this->keytag = intval($matches[3]); + + } else { + + throw new Net_DNS2_Exception( + 'file ' . $keyname . ' does not look like a private key file!', + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + + // + // read all the data from the + // + $data = file($file, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); + if (count($data) == 0) { + + throw new Net_DNS2_Exception( + 'file ' . $keyname . ' is empty!', + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + + foreach ($data as $line) { + + list($key, $value) = explode(':', $line); + + $key = trim($key); + $value = trim($value); + + switch(strtolower($key)) { + + case 'private-key-format': + $this->_key_format = $value; + break; + + case 'algorithm': + if ($this->algorithm != $value) { + throw new Net_DNS2_Exception( + 'Algorithm mis-match! filename is ' . $this->algorithm . + ', contents say ' . $value, + Net_DNS2_Lookups::E_OPENSSL_INV_ALGO + ); + } + break; + + // + // RSA + // + case 'modulus': + $this->_modulus = $value; + break; + + case 'publicexponent': + $this->_public_exponent = $value; + break; + + case 'privateexponent': + $this->_private_exponent = $value; + break; + + case 'prime1': + $this->_prime1 = $value; + break; + + case 'prime2': + $this->_prime2 = $value; + break; + + case 'exponent1': + $this->_exponent1 = $value; + break; + + case 'exponent2': + $this->_exponent2 = $value; + break; + + case 'coefficient': + $this->_coefficient = $value; + break; + + // + // DSA - this won't work in PHP until the OpenSSL extension is better + // + /*case 'prime(p)': + $this->_prime = $value; + break; + + case 'subprime(q)': + $this->_subprime = $value; + break; + + case 'base(g)': + $this->_base = $value; + break; + + case 'private_value(x)': + $this->_private_value = $value; + break; + + case 'public_value(y)': + $this->_public_value = $value; + break; + */ + default: + throw new Net_DNS2_Exception( + 'unknown private key data: ' . $key . ': ' . $value, + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + } + + // + // generate the private key + // + $args = array(); + + switch($this->algorithm) { + + // + // RSA + // + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5: + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1: + + $args = array( + + 'rsa' => array( + + 'n' => base64_decode($this->_modulus), + 'e' => base64_decode($this->_public_exponent), + 'd' => base64_decode($this->_private_exponent), + 'p' => base64_decode($this->_prime1), + 'q' => base64_decode($this->_prime2), + 'dmp1' => base64_decode($this->_exponent1), + 'dmq1' => base64_decode($this->_exponent2), + 'iqmp' => base64_decode($this->_coefficient) + ) + ); + + break; + + // + // DSA - this won't work in PHP until the OpenSSL extension is better + // + /*case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSA: + + $args = array( + + 'dsa' => array( + + 'p' => base64_decode($this->_prime), + 'q' => base64_decode($this->_subprime), + 'g' => base64_decode($this->_base), + 'priv_key' => base64_decode($this->_private_value), + 'pub_key' => base64_decode($this->_public_value) + ) + ); + + break; + */ + default: + throw new Net_DNS2_Exception( + 'we only currently support RSAMD5 and RSASHA1 encryption.', + Net_DNS2_Lookups::E_OPENSSL_INV_PKEY + ); + } + + // + // generate and store the key + // + $this->instance = openssl_pkey_new($args); + if ($this->instance === false) { + throw new Net_DNS2_Exception( + openssl_error_string(), + Net_DNS2_Lookups::E_OPENSSL_ERROR + ); + } + + // + // store the filename incase we need it for something + // + $this->filename = $file; + + return true; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Question.php b/include/pear/Net/DNS2/Question.php new file mode 100644 index 0000000000000000000000000000000000000000..ddae4607b85b84a65f4be5528864efb421883f4b --- /dev/null +++ b/include/pear/Net/DNS2/Question.php @@ -0,0 +1,244 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Question.php 124 2011-12-02 23:23:15Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * This class handles parsing and constructing the question sectino of DNS + * packets. + * + * This is referred to as the "zone" for update per RFC2136 + * + * DNS question format - RFC1035 section 4.1.2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * / QNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QTYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QCLASS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Packet + * + */ +class Net_DNS2_Question +{ + /* + * The name of the question + * + * referred to as "zname" for updates per RFC2136 + * + */ + public $qname; + + /* + * The RR type for the questino + * + * referred to as "ztype" for updates per RFC2136 + * + */ + public $qtype; + + /* + * The RR class for the questino + * + * referred to as "zclass" for updates per RFC2136 + * + */ + public $qclass; + + /** + * Constructor - builds a new Net_DNS2_Question object + * + * @param mixed &$packet either a Net_DNS2_Packet object, or null to + * build an empty object + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct(Net_DNS2_Packet &$packet = null) + { + if (!is_null($packet)) { + + $this->set($packet); + } else { + + $this->qname = ''; + $this->qtype = 'A'; + $this->qclass = 'IN'; + } + } + + /** + * magic __toString() function to return the Net_DNS2_Question object as a string + * + * @return string + * @access public + * + */ + public function __toString() + { + return ";;\n;; Question:\n;;\t " . $this->qname . '. ' . + $this->qtype . ' ' . $this->qclass . "\n"; + } + + /** + * builds a new Net_DNS2_Header object from a Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet object + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function set(Net_DNS2_Packet &$packet) + { + // + // expand the name + // + $this->qname = $packet->expand($packet, $packet->offset); + if ($packet->rdlength < ($packet->offset + 4)) { + + throw new Net_DNS2_Exception( + 'invalid question section: to small', + Net_DNS2_Lookups::E_QUESTION_INVALID + ); + } + + // + // unpack the type and class + // + $type = ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + $class = ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + + // + // validate it + // + $type_name = Net_DNS2_Lookups::$rr_types_by_id[$type]; + $class_name = Net_DNS2_Lookups::$classes_by_id[$class]; + + if ( (!isset($type_name)) || (!isset($class_name)) ) { + + throw new Net_DNS2_Exception( + 'invalid question section: invalid type (' . $type . + ') or class (' . $class . ') specified.', + Net_DNS2_Lookups::E_QUESTION_INVALID + ); + } + + // + // store it + // + $this->qtype = $type_name; + $this->qclass = $class_name; + + return true; + } + + /** + * returns a binary packed Net_DNS2_Question object + * + * @param Net_DNS2_Packet &$packet the Net_DNS2_Packet object this question is + * part of. This needs to be passed in so that + * the compressed qname value can be packed in + * with the names of the other parts of the + * packet. + * + * @return string + * @throws Net_DNS2_Exception + * @access public + * + */ + public function get(Net_DNS2_Packet &$packet) + { + // + // validate the type and class + // + $type = Net_DNS2_Lookups::$rr_types_by_name[$this->qtype]; + $class = Net_DNS2_Lookups::$classes_by_name[$this->qclass]; + + if ( (!isset($type)) || (!isset($class)) ) { + + throw new Net_DNS2_Exception( + 'invalid question section: invalid type (' . $this->qtype . + ') or class (' . $this->qclass . ') specified.', + Net_DNS2_Lookups::E_QUESTION_INVALID + ); + } + + $data = $packet->compress($this->qname, $packet->offset); + + $data .= chr($type << 8) . chr($type) . chr($class << 8) . chr($class); + $packet->offset += 4; + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR.php b/include/pear/Net/DNS2/RR.php new file mode 100644 index 0000000000000000000000000000000000000000..55ee7f70a1faba8401dfee7f7aeee97351e686a3 --- /dev/null +++ b/include/pear/Net/DNS2/RR.php @@ -0,0 +1,641 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: RR.php 188 2013-03-31 01:25:46Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + + +/** + * This is the base class for DNS Resource Records + * + * Each resource record type (defined in RR/*.php) extends this class for + * base functionality. + * + * This class handles parsing and constructing the common parts of the DNS + * resource records, while the RR specific functionality is handled in each + * child class. + * + * DNS resource record format - RFC1035 section 4.1.3 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * / / + * / NAME / + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | TYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | CLASS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | TTL | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | RDLENGTH | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| + * / RDATA / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * + */ +abstract class Net_DNS2_RR +{ + /* + * The name of the resource record + */ + public $name; + + /* + * The resource record type + */ + public $type; + + /* + * The resouce record class + */ + public $class; + + /* + * The time to live for this resource record + */ + public $ttl; + + /* + * The length of the rdata field + */ + public $rdlength; + + /* + * The resource record specific data as a packed binary string + */ + public $rdata; + + /** + * abstract definition - method to return a RR as a string; not to + * be confused with the __toString() magic method. + * + * @return string + * @access protected + * + */ + abstract protected function rrToString(); + + /** + * abstract definition - parses a RR from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + abstract protected function rrFromString(array $rdata); + + /** + * abstract definition - sets a Net_DNS2_RR from a Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + abstract protected function rrSet(Net_DNS2_Packet &$packet); + + /** + * abstract definition - returns a binary packet DNS RR object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed string or + * null on failure + * @access protected + * + */ + abstract protected function rrGet(Net_DNS2_Packet &$packet); + + /** + * Constructor - builds a new Net_DNS2_RR object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create + * an empty object + * @param array $rr an array with RR parse values or null to + * create an empty object + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null) + { + if ( (!is_null($packet)) && (!is_null($rr)) ) { + + if ($this->set($packet, $rr) == false) { + + throw new Net_DNS2_Exception( + 'failed to generate resource record', + Net_DNS2_Lookups::E_RR_INVALID + ); + } + } else { + + $class = Net_DNS2_Lookups::$rr_types_class_to_id[get_class($this)]; + if (isset($class)) { + + $this->type = Net_DNS2_Lookups::$rr_types_by_id[$class]; + } + + $this->class = 'IN'; + $this->ttl = 86400; + } + } + + /** + * magic __toString() method to return the Net_DNS2_RR object object as a string + * + * @return string + * @access public + * + */ + public function __toString() + { + return $this->name . '. ' . $this->ttl . ' ' . $this->class . + ' ' . $this->type . ' ' . $this->rrToString(); + } + + /** + * return a formatted string; if a string has spaces in it, then return + * it with double quotes around it, otherwise, return it as it was passed in. + * + * @param string $string the string to format + * + * @return string + * @access protected + * + */ + protected function formatString($string) + { + return '"' . str_replace('"', '\"', trim($string, '"')) . '"'; + } + + /** + * builds an array of strings from an array of chunks of text split by spaces + * + * @param array $chunks an array of chunks of text split by spaces + * + * @return array + * @access protected + * + */ + protected function buildString(array $chunks) + { + $data = array(); + $c = 0; + $in = false; + + foreach ($chunks as $r) { + + $r = trim($r); + if (strlen($r) == 0) { + continue; + } + + if ( ($r[0] == '"') + && ($r[strlen($r) - 1] == '"') + && ($r[strlen($r) - 2] != '\\') + ) { + + $data[$c] = $r; + ++$c; + $in = false; + + } else if ($r[0] == '"') { + + $data[$c] = $r; + $in = true; + + } else if ( ($r[strlen($r) - 1] == '"') + && ($r[strlen($r) - 2] != '\\') + ) { + + $data[$c] .= ' ' . $r; + ++$c; + $in = false; + + } else { + + if ($in == true) { + $data[$c] .= ' ' . $r; + } else { + $data[$c++] = $r; + } + } + } + + foreach ($data as $index => $string) { + + $data[$index] = str_replace('\"', '"', trim($string, '"')); + } + + return $data; + } + + /** + * builds a new Net_DNS2_RR object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create + * an empty object + * @param array $rr an array with RR parse values or null to + * create an empty object + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function set(Net_DNS2_Packet &$packet, array $rr) + { + $this->name = $rr['name']; + $this->type = Net_DNS2_Lookups::$rr_types_by_id[$rr['type']]; + + // + // for RR OPT (41), the class value includes the requestors UDP payload size, + // and not a class value + // + if ($this->type == 'OPT') { + $this->class = $rr['class']; + } else { + $this->class = Net_DNS2_Lookups::$classes_by_id[$rr['class']]; + } + + $this->ttl = $rr['ttl']; + $this->rdlength = $rr['rdlength']; + $this->rdata = substr($packet->rdata, $packet->offset, $rr['rdlength']); + + return $this->rrSet($packet); + } + + /** + * returns a binary packed DNS RR object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet used for + * compressing names + * + * @return string + * @throws Net_DNS2_Exception + * @access public + * + */ + public function get(Net_DNS2_Packet &$packet) + { + $data = ''; + $rdata = ''; + + // + // pack the name + // + $data = $packet->compress($this->name, $packet->offset); + + // + // pack the main values + // + if ($this->type == 'OPT') { + + // + // pre-build the TTL value + // + $this->preBuild(); + + // + // the class value is different for OPT types + // + $data .= pack( + 'nnN', + Net_DNS2_Lookups::$rr_types_by_name[$this->type], + $this->class, + $this->ttl + ); + } else { + + $data .= pack( + 'nnN', + Net_DNS2_Lookups::$rr_types_by_name[$this->type], + Net_DNS2_Lookups::$classes_by_name[$this->class], + $this->ttl + ); + } + + // + // increase the offset, and allow for the rdlength + // + $packet->offset += 10; + + // + // get the RR specific details + // + if ($this->rdlength != -1) { + + $rdata = $this->rrGet($packet); + } + + // + // add the RR + // + $data .= pack('n', strlen($rdata)) . $rdata; + + return $data; + } + + /** + * parses a binary packet, and returns the appropriate Net_DNS2_RR object, + * based on the RR type of the binary content. + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet used for + * decompressing names + * + * @return mixed returns a new Net_DNS2_RR_* object for + * the given RR + * @throws Net_DNS2_Exception + * @access public + * + */ + public static function parse(Net_DNS2_Packet &$packet) + { + $object = array(); + + // + // expand the name + // + $object['name'] = $packet->expand($packet, $packet->offset); + if (is_null($object['name'])) { + + throw new Net_DNS2_Exception( + 'failed to parse resource record: failed to expand name.', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + if ($packet->rdlength < ($packet->offset + 10)) { + + throw new Net_DNS2_Exception( + 'failed to parse resource record: packet too small.', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + // + // unpack the RR details + // + $object['type'] = ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + $object['class'] = ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + + $object['ttl'] = ord($packet->rdata[$packet->offset++]) << 24 | + ord($packet->rdata[$packet->offset++]) << 16 | + ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + + $object['rdlength'] = ord($packet->rdata[$packet->offset++]) << 8 | + ord($packet->rdata[$packet->offset++]); + + if ($packet->rdlength < ($packet->offset + $object['rdlength'])) { + return null; + } + + // + // lookup the class to use + // + $o = null; + $class = Net_DNS2_Lookups::$rr_types_id_to_class[$object['type']]; + + if (isset($class)) { + + $o = new $class($packet, $object); + if ($o) { + + $packet->offset += $object['rdlength']; + } + } else { + + throw new Net_DNS2_Exception( + 'un-implemented resource record type: ' . $object['type'], + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + return $o; + } + + /** + * cleans up some RR data + * + * @param string $data the text string to clean + * + * @return string returns the cleaned string + * + * @access public + * + */ + public function cleanString($data) + { + return strtolower(rtrim($data, '.')); + } + + /** + * parses a standard RR format lines, as defined by rfc1035 (kinda) + * + * In our implementation, the domain *must* be specified- format must be + * + * <name> [<ttl>] [<class>] <type> <rdata> + * or + * <name> [<class>] [<ttl>] <type> <rdata> + * + * name, title, class and type are parsed by this function, rdata is passed + * to the RR specific classes for parsing. + * + * @param string $line a standard DNS config line + * + * @return mixed returns a new Net_DNS2_RR_* object for the given RR + * @throws Net_DNS2_Exception + * @access public + * + */ + public static function fromString($line) + { + if (strlen($line) == 0) { + throw new Net_DNS2_Exception( + 'empty config line provided.', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + $name = ''; + $type = ''; + $class = 'IN'; + $ttl = 86400; + + // + // split the line by spaces + // + $values = preg_split('/[\s]+/', $line); + if (count($values) < 3) { + + throw new Net_DNS2_Exception( + 'failed to parse config: minimum of name, type and rdata required.', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + // + // assume the first value is the name + // + $name = trim(strtolower(array_shift($values)), '.'); + + // + // The next value is either a TTL, Class or Type + // + foreach ($values as $value) { + + switch($value) { + case is_numeric($value): + + $ttl = array_shift($values); + break; + + // + // PHP SUCKS! + // + case ($value === 0): + $ttl = array_shift($values); + break; + + case isset(Net_DNS2_Lookups::$classes_by_name[strtoupper($value)]): + + $class = strtoupper(array_shift($values)); + break; + + case isset(Net_DNS2_Lookups::$rr_types_by_name[strtoupper($value)]): + + $type = strtoupper(array_shift($values)); + break 2; + break; + default: + + throw new Net_DNS2_Exception( + 'invalid config line provided: unknown file: ' . $value, + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + } + + // + // lookup the class to use + // + $o = null; + $class_name = Net_DNS2_Lookups::$rr_types_id_to_class[ + Net_DNS2_Lookups::$rr_types_by_name[$type] + ]; + + if (isset($class_name)) { + + $o = new $class_name; + if (!is_null($o)) { + + // + // set the parsed values + // + $o->name = $name; + $o->class = $class; + $o->ttl = $ttl; + + // + // parse the rdata + // + if ($o->rrFromString($values) === false) { + + throw new Net_DNS2_Exception( + 'failed to parse rdata for config: ' . $line, + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + } else { + + throw new Net_DNS2_Exception( + 'failed to create new RR record for type: ' . $type, + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + } else { + + throw new Net_DNS2_Exception( + 'un-implemented resource record type: '. $type, + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + return $o; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/A.php b/include/pear/Net/DNS2/RR/A.php new file mode 100644 index 0000000000000000000000000000000000000000..f8a0554615bb2b5bdd80d171a347123633ba0646 --- /dev/null +++ b/include/pear/Net/DNS2/RR/A.php @@ -0,0 +1,156 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: A.php 113 2011-07-25 02:54:19Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * A Resource Record - RFC1035 section 3.4.1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ADDRESS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_A extends Net_DNS2_RR +{ + /* + * The IPv4 address in quad-dotted notation + */ + public $address; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->address; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $value = array_shift($rdata); + + if (Net_DNS2::isIPv4($value) == true) { + + $this->address = $value; + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $this->address = inet_ntop($this->rdata); + if ($this->address !== false) { + + return true; + } + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + $packet->offset += 4; + return inet_pton($this->address); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/AAAA.php b/include/pear/Net/DNS2/RR/AAAA.php new file mode 100644 index 0000000000000000000000000000000000000000..86c15155d6d3308bf29dd818da921ff1ab92a011 --- /dev/null +++ b/include/pear/Net/DNS2/RR/AAAA.php @@ -0,0 +1,177 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: AAAA.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * A Resource Record - RFC1035 section 3.4.1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * | | + * | | + * | ADDRESS | + * | | + * | (128 bit) | + * | | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_AAAA extends Net_DNS2_RR +{ + /* + * the IPv6 address in the preferred hexadecimal values of the eight + * 16-bit pieces + * per RFC1884 + * + */ + public $address; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->address; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // expand out compressed formats + // + $value = array_shift($rdata); + if (Net_DNS2::isIPv6($value) == true) { + + $this->address = $value; + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + // + // must be 8 x 16bit chunks, or 16 x 8bit + // + if ($this->rdlength == 16) { + + // + // PHP's inet_ntop returns IPv6 addresses in their compressed form, + // but we want to keep with the preferred standard, so we'll parse + // it manually. + // + $x = unpack('n8', $this->rdata); + if (count($x) == 8) { + + $this->address = vsprintf('%x:%x:%x:%x:%x:%x:%x:%x', $x); + return true; + } + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + $packet->offset += 16; + return inet_pton($this->address); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/AFSDB.php b/include/pear/Net/DNS2/RR/AFSDB.php new file mode 100644 index 0000000000000000000000000000000000000000..0117a9a09d9372fe3d59ed4268ff8fe9202351f4 --- /dev/null +++ b/include/pear/Net/DNS2/RR/AFSDB.php @@ -0,0 +1,174 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: AFSDB.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * AFSDB Resource Record - RFC1183 section 1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | SUBTYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / HOSTNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_AFSDB extends Net_DNS2_RR +{ + /* + * The AFSDB sub type + */ + public $subtype; + + /* + * The AFSDB hostname + */ + public $hostname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->subtype . ' ' . $this->cleanString($this->hostname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->subtype = array_shift($rdata); + $this->hostname = $this->cleanString(array_shift($rdata)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the subtype + // + $x = unpack('nsubtype', $this->rdata); + + $this->subtype = $x['subtype']; + $offset = $packet->offset + 2; + + $this->hostname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->hostname) > 0) { + + $data = pack('n', $this->subtype); + $packet->offset += 2; + + $data .= $packet->compress($this->hostname, $packet->offset); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/ANY.php b/include/pear/Net/DNS2/RR/ANY.php new file mode 100644 index 0000000000000000000000000000000000000000..915324058ec575cbb18868216181b7345f2fdd5d --- /dev/null +++ b/include/pear/Net/DNS2/RR/ANY.php @@ -0,0 +1,129 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: ANY.php 47 2010-10-24 23:53:08Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * This is only used for generating an empty ANY RR. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_ANY extends Net_DNS2_RR +{ + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return ''; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + return true; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + return ''; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/APL.php b/include/pear/Net/DNS2/RR/APL.php new file mode 100644 index 0000000000000000000000000000000000000000..da323f86dd72d4c74739fbb01cbdbb048e29f5bb --- /dev/null +++ b/include/pear/Net/DNS2/RR/APL.php @@ -0,0 +1,343 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: APL.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.0.0 + * + */ + +/** + * APL Resource Record - RFC3123 + * + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | ADDRESSFAMILY | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | PREFIX | N | AFDLENGTH | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * / AFDPART / + * | | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_APL extends Net_DNS2_RR +{ + /* + * a list of all the address prefix list items + */ + public $apl_items = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = ''; + + foreach ($this->apl_items as $item) { + + if ($item['n'] == 1) { + + $out .= '!'; + } + + $out .= $item['address_family'] . ':' . + $item['afd_part'] . '/' . $item['prefix'] . ' '; + } + + return trim($out); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + foreach ($rdata as $item) { + + if (preg_match('/^(!?)([1|2])\:([^\/]*)\/([0-9]{1,3})$/', $item, $m)) { + + $i = array( + + 'address_family' => $m[2], + 'prefix' => $m[4], + 'n' => ($m[1] == '!') ? 1 : 0, + 'afd_part' => strtolower($m[3]) + ); + + $address = $this->_trimZeros( + $i['address_family'], $i['afd_part'] + ); + + $i['afd_length'] = count(explode('.', $address)); + + $this->apl_items[] = $i; + } + } + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = 0; + + while ($offset < $this->rdlength) { + + // + // unpack the family, prefix, negate and length values + // + $x = unpack( + 'naddress_family/Cprefix/Cextra', substr($this->rdata, $offset) + ); + + $item = array( + + 'address_family' => $x['address_family'], + 'prefix' => $x['prefix'], + 'n' => ($x['extra'] >> 7) & 0x1, + 'afd_length' => $x['extra'] & 0xf + ); + + switch($item['address_family']) { + + case 1: + $r = unpack( + 'C*', substr($this->rdata, $offset + 4, $item['afd_length']) + ); + if (count($r) < 4) { + + for ($c=count($r)+1; $c<4+1; $c++) { + + $r[$c] = 0; + } + } + + $item['afd_part'] = implode('.', $r); + + break; + case 2: + $r = unpack( + 'C*', substr($this->rdata, $offset + 4, $item['afd_length']) + ); + if (count($r) < 8) { + + for ($c=count($r)+1; $c<8+1; $c++) { + + $r[$c] = 0; + } + } + + $item['afd_part'] = sprintf( + '%x:%x:%x:%x:%x:%x:%x:%x', + $r[1], $r[2], $r[3], $r[4], $r[5], $r[6], $r[7], $r[8] + ); + + break; + default: + return false; + } + + $this->apl_items[] = $item; + + $offset += 4 + $item['afd_length']; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (count($this->apl_items) > 0) { + + $data = ''; + + foreach ($this->apl_items as $item) { + + // + // pack the address_family and prefix values + // + $data .= pack( + 'nCC', + $item['address_family'], + $item['prefix'], + ($item['n'] << 7) | $item['afd_length'] + ); + + switch($item['address_family']) { + case 1: + $address = explode( + '.', + $this->_trimZeros($item['address_family'], $item['afd_part']) + ); + + foreach ($address as $b) { + $data .= chr($b); + } + break; + case 2: + $address = explode( + ':', + $this->_trimZeros($item['address_family'], $item['afd_part']) + ); + + foreach ($address as $b) { + $data .= pack('H', $b); + } + break; + default: + return null; + } + } + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } + + /** + * returns an IP address with the right-hand zero's trimmed + * + * @param integer $family the IP address family from the rdata + * @param string $address the IP address + * + * @return string the trimmed IP addresss. + * + * @access private + * + */ + private function _trimZeros($family, $address) + { + $a = array(); + + switch($family) { + case 1: + $a = array_reverse(explode('.', $address)); + break; + case 2: + $a = array_reverse(explode(':', $address)); + break; + default: + return ''; + } + + foreach ($a as $value) { + + if ($value === '0') { + + array_shift($a); + } + } + + $out = ''; + + switch($family) { + case 1: + $out = implode('.', array_reverse($a)); + break; + case 2: + $out = implode(':', array_reverse($a)); + break; + default: + return ''; + } + + return $out; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/ATMA.php b/include/pear/Net/DNS2/RR/ATMA.php new file mode 100644 index 0000000000000000000000000000000000000000..d9e51b0e7ed9b08278bd8d4f16b0664e7c3c68bc --- /dev/null +++ b/include/pear/Net/DNS2/RR/ATMA.php @@ -0,0 +1,210 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: ATMA.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.1.0 + * + */ + +/** + * ATMA Resource Record + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | FORMAT | | + * | +--+--+--+--+--+--+--+--+ + * / ADDRESS / + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_ATMA extends Net_DNS2_RR +{ + /* + * One octet that indicates the format of ADDRESS. The two possible values + * for FORMAT are value 0 indicating ATM End System Address (AESA) format + * and value 1 indicating E.164 format + */ + public $format; + + /* + * The IPv4 address in quad-dotted notation + */ + public $address; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->address; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $value = array_shift($rdata); + + if (ctype_xdigit($value) == true) { + + $this->format = 0; + $this->address = $value; + + } else if (is_numeric($value) == true) { + + $this->format = 1; + $this->address = $value; + + } else { + + return false; + } + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the format + // + $x = unpack('Cformat/N*address', $this->rdata); + + $this->format = $x['format']; + + if ($this->format == 0) { + + $a = unpack('@1/H*address', $this->rdata); + + $this->address = $a['address']; + + } else if ($this->format == 1) { + + $this->address = substr($this->rdata, 1, $this->rdlength - 1); + + } else { + + return false; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + $data = chr($this->format); + + if ($this->format == 0) { + + $data .= pack('H*', $this->address); + + } else if ($this->format == 1) { + + $data .= $this->address; + + } else { + + return null; + } + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/CAA.php b/include/pear/Net/DNS2/RR/CAA.php new file mode 100644 index 0000000000000000000000000000000000000000..81d3601b4eccaf79d26fab407c042adb4cf646a0 --- /dev/null +++ b/include/pear/Net/DNS2/RR/CAA.php @@ -0,0 +1,179 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: CAA.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.0 + * + */ + +/** + * CAA Resource Record - http://tools.ietf.org/html/draft-ietf-pkix-caa-03 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | FLAGS | TAG LENGTH | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / TAG / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / DATA / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_CAA extends Net_DNS2_RR +{ + /* + * The critcal flag + */ + public $flags; + + /* + * The property identifier + */ + public $tag; + + /* + * The property value + */ + public $value; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->flags . ' ' . $this->tag . ' "' . + trim($this->cleanString($this->value), '"') . '"'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->flags = array_shift($rdata); + $this->tag = array_shift($rdata); + + $this->value = trim($this->cleanString(implode($rdata, ' ')), '"'); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the flags and tag length + // + $x = unpack('Cflags/Ctag_length', $this->rdata); + + $this->flags = $x['flags']; + $offset = 2; + + $this->tag = substr($this->rdata, $offset, $x['tag_length']); + $offset += $x['tag_length']; + + $this->value = substr($this->rdata, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->value) > 0) { + + $data = chr($this->flags); + $data .= chr(strlen($this->tag)) . $this->tag . $this->value; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +?> diff --git a/include/pear/Net/DNS2/RR/CDS.php b/include/pear/Net/DNS2/RR/CDS.php new file mode 100644 index 0000000000000000000000000000000000000000..c9a08adc25252bcd56735e25e48c227c30689401 --- /dev/null +++ b/include/pear/Net/DNS2/RR/CDS.php @@ -0,0 +1,77 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: CDS.php 130 2011-12-03 05:02:37Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.0 + * + */ + +/** + * The CDS RR is implemented exactly like the DS record, so + * for now we just extend the DS RR and use it. + * + * http://tools.ietf.org/html/draft-barwood-dnsop-ds-publish-02 + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_CDS extends Net_DNS2_RR_DS +{ +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/CERT.php b/include/pear/Net/DNS2/RR/CERT.php new file mode 100644 index 0000000000000000000000000000000000000000..7f3773e382b6bdb7d5645cd51628a53454e3668f --- /dev/null +++ b/include/pear/Net/DNS2/RR/CERT.php @@ -0,0 +1,292 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: CERT.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * CERT Resource Record - RFC4398 section 2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | format | key tag | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | algorithm | / + * +---------------+ certificate or CRL / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_CERT extends Net_DNS2_RR +{ + /* + * format's allowed for certificates + */ + const CERT_FORMAT_RES = 0; + const CERT_FORMAT_PKIX = 1; + const CERT_FORMAT_SPKI = 2; + const CERT_FORMAT_PGP = 3; + const CERT_FORMAT_IPKIX = 4; + const CERT_FORMAT_ISPKI = 5; + const CERT_FORMAT_IPGP = 6; + const CERT_FORMAT_ACPKIX = 7; + const CERT_FORMAT_IACPKIX = 8; + const CERT_FORMAT_URI = 253; + const CERT_FORMAT_OID = 254; + + public $cert_format_name_to_id = array(); + public $cert_format_id_to_name = array( + + self::CERT_FORMAT_RES => 'Reserved', + self::CERT_FORMAT_PKIX => 'PKIX', + self::CERT_FORMAT_SPKI => 'SPKI', + self::CERT_FORMAT_PGP => 'PGP', + self::CERT_FORMAT_IPKIX => 'IPKIX', + self::CERT_FORMAT_ISPKI => 'ISPKI', + self::CERT_FORMAT_IPGP => 'IPGP', + self::CERT_FORMAT_ACPKIX => 'ACPKIX', + self::CERT_FORMAT_IACPKIX => 'IACPKIX', + self::CERT_FORMAT_URI => 'URI', + self::CERT_FORMAT_OID => 'OID' + ); + + /* + * certificate format + */ + public $format; + + /* + * key tag + */ + public $keytag; + + /* + * The algorithm used for the CERt + */ + public $algorithm; + + /* + * certificate + */ + public $certificate; + + /** + * we have our own constructor so that we can load our certificate + * information for parsing. + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * @param array $rr a array with parsed RR values + * + * @return + * + */ + public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null) + { + parent::__construct($packet, $rr); + + // + // load the lookup values + // + $this->cert_format_name_to_id = array_flip($this->cert_format_id_to_name); + } + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->format . ' ' . $this->keytag . ' ' . $this->algorithm . + ' ' . base64_encode($this->certificate); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // load and check the format; can be an int, or a mnemonic symbol + // + $this->format = array_shift($rdata); + if (!is_numeric($this->format)) { + + $mnemonic = strtoupper(trim($this->format)); + if (!isset($this->cert_format_name_to_id[$mnemonic])) { + + return false; + } + + $this->format = $this->cert_format_name_to_id[$mnemonic]; + } else { + + if (!isset($this->cert_format_id_to_name[$this->format])) { + + return false; + } + } + + $this->keytag = array_shift($rdata); + + // + // parse and check the algorithm; can be an int, or a mnemonic symbol + // + $this->algorithm = array_shift($rdata); + if (!is_numeric($this->algorithm)) { + + $mnemonic = strtoupper(trim($this->algorithm)); + if (!isset(Net_DNS2_Lookups::$algorithm_name_to_id[$mnemonic])) { + + return false; + } + + $this->algorithm = Net_DNS2_Lookups::$algorithm_name_to_id[ + $mnemonic + ]; + } else { + + if (!isset(Net_DNS2_Lookups::$algorithm_id_to_name[$this->algorithm])) { + return false; + } + } + + // + // parse and base64 decode the certificate + // + // certificates MUST be provided base64 encoded, if not, everything will + // be broken after this point, as we assume it's base64 encoded. + // + $this->certificate = base64_decode(implode(' ', $rdata)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the format, keytag and algorithm + // + $x = unpack('nformat/nkeytag/Calgorithm', $this->rdata); + + $this->format = $x['format']; + $this->keytag = $x['keytag']; + $this->algorithm = $x['algorithm']; + + // + // copy the certificate + // + $this->certificate = substr($this->rdata, 5, $this->rdlength - 5); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->certificate) > 0) { + + $data = pack('nnC', $this->format, $this->keytag, $this->algorithm) . + $this->certificate; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/CNAME.php b/include/pear/Net/DNS2/RR/CNAME.php new file mode 100644 index 0000000000000000000000000000000000000000..7241f584145dc63680e2856f2d298278ead0e28a --- /dev/null +++ b/include/pear/Net/DNS2/RR/CNAME.php @@ -0,0 +1,153 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: CNAME.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * CNAME Resource Record - RFC1035 section 3.3.1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / CNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_CNAME extends Net_DNS2_RR +{ + /* + * The canonical name + */ + public $cname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->cname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->cname = $this->cleanString(array_shift($rdata)); + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + $this->cname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->cname) > 0) { + + return $packet->compress($this->cname, $packet->offset); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/DHCID.php b/include/pear/Net/DNS2/RR/DHCID.php new file mode 100644 index 0000000000000000000000000000000000000000..521880b8cf05b24c1bcd8cb9c3744b32b230993d --- /dev/null +++ b/include/pear/Net/DNS2/RR/DHCID.php @@ -0,0 +1,207 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DHCID.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * DHCID Resource Record - RFC4701 section 3.1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ID Type Code | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | Digest Type | / + * +--+--+--+--+--+--+--+--+ / + * / / + * / Digest / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_DHCID extends Net_DNS2_RR +{ + /* + * Identifier type + */ + public $id_type; + + /* + * Digest Type + */ + public $digest_type; + + /* + * The digest + */ + public $digest; + + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = pack('nC', $this->id_type, $this->digest_type); + $out .= base64_decode($this->digest); + + return base64_encode($out); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = base64_decode(array_shift($rdata)); + if (strlen($data) > 0) { + + // + // unpack the id type and digest type + // + $x = unpack('nid_type/Cdigest_type', $data); + + $this->id_type = $x['id_type']; + $this->digest_type = $x['digest_type']; + + // + // copy out the digest + // + $this->digest = base64_encode(substr($data, 3, strlen($data) - 3)); + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the id type and digest type + // + $x = unpack('nid_type/Cdigest_type', $this->rdata); + + $this->id_type = $x['id_type']; + $this->digest_type = $x['digest_type']; + + // + // copy out the digest + // + $this->digest = base64_encode( + substr($this->rdata, 3, $this->rdlength - 3) + ); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->digest) > 0) { + + $data = pack('nC', $this->id_type, $this->digest_type) . + base64_decode($this->digest); + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/DLV.php b/include/pear/Net/DNS2/RR/DLV.php new file mode 100644 index 0000000000000000000000000000000000000000..bb235c2024d2ffed3198793620936118b88c6bd1 --- /dev/null +++ b/include/pear/Net/DNS2/RR/DLV.php @@ -0,0 +1,75 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DLV.php 47 2010-10-24 23:53:08Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * The DLV RR is implemented exactly like the DS RR; so we just extend that + * class, and use all of it's methods + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_DLV extends Net_DNS2_RR_DS +{ +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/DNAME.php b/include/pear/Net/DNS2/RR/DNAME.php new file mode 100644 index 0000000000000000000000000000000000000000..f5c631d82565221a2630cd9754851f96b337d698 --- /dev/null +++ b/include/pear/Net/DNS2/RR/DNAME.php @@ -0,0 +1,153 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DNAME.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * DNAME Resource Record - RFC2672 section 3 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / DNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_DNAME extends Net_DNS2_RR +{ + /* + * The target name + */ + public $dname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->dname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->dname = $this->cleanString(array_shift($rdata)); + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + $this->dname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->dname) > 0) { + + return $packet->compress($this->dname, $packet->offset); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/DNSKEY.php b/include/pear/Net/DNS2/RR/DNSKEY.php new file mode 100644 index 0000000000000000000000000000000000000000..d1c08a1e264b5b5c534977c822b1f7cd678e239b --- /dev/null +++ b/include/pear/Net/DNS2/RR/DNSKEY.php @@ -0,0 +1,198 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DNSKEY.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * DNSKEY Resource Record - RFC4034 sction 2.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Flags | Protocol | Algorithm | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / / + * / Public Key / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_DNSKEY extends Net_DNS2_RR +{ + /* + * flags + */ + public $flags; + + /* + * protocol + */ + public $protocol; + + /* + * algorithm used + */ + public $algorithm; + + /* + * the public key + */ + public $key; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->flags . ' ' . $this->protocol . ' ' . + $this->algorithm . ' ' . $this->key; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->flags = array_shift($rdata); + $this->protocol = array_shift($rdata); + $this->algorithm = array_shift($rdata); + $this->key = implode(' ', $rdata); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the flags, protocol and algorithm + // + $x = unpack('nflags/Cprotocol/Calgorithm', $this->rdata); + + // + // TODO: right now we're just displaying what's in DNS; we really + // should be parsing bit 7 and bit 15 of the flags field, and store + // those separately. + // + // right now the DNSSEC implementation is really just for display, + // we don't validate or handle any of the keys + // + $this->flags = $x['flags']; + $this->protocol = $x['protocol']; + $this->algorithm = $x['algorithm']; + + $this->key = base64_encode(substr($this->rdata, 4)); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->key) > 0) { + + $data = pack('nCC', $this->flags, $this->protocol, $this->algorithm); + $data .= base64_decode($this->key); + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/DS.php b/include/pear/Net/DNS2/RR/DS.php new file mode 100644 index 0000000000000000000000000000000000000000..407828ed6e973c8c9320a7312d546fecb82930c5 --- /dev/null +++ b/include/pear/Net/DNS2/RR/DS.php @@ -0,0 +1,209 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: DS.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * DS Resource Record - RFC4034 sction 5.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Key Tag | Algorithm | Digest Type | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / / + * / Digest / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_DS extends Net_DNS2_RR +{ + /* + * key tag + */ + public $keytag; + + /* + * algorithm number + */ + public $algorithm; + + /* + * algorithm used to construct the digest + */ + public $digesttype; + + /* + * the digest data + */ + public $digest; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->keytag . ' ' . $this->algorithm . ' ' . + $this->digesttype . ' ' . $this->digest; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->keytag = array_shift($rdata); + $this->algorithm = array_shift($rdata); + $this->digesttype = array_shift($rdata); + $this->digest = implode('', $rdata); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the keytag, algorithm and digesttype + // + $x = unpack('nkeytag/Calgorithm/Cdigesttype', $this->rdata); + + $this->keytag = $x['keytag']; + $this->algorithm = $x['algorithm']; + $this->digesttype = $x['digesttype']; + + // + // figure out the digest size + // + $digest_size = 0; + if ($this->digesttype == 1) { + + $digest_size = 20; // SHA1 + + } else if ($this->digesttype == 2) { + + $digest_size = 32; // SHA256 + } + + // + // copy the digest + // + $x = unpack('H*', substr($this->rdata, 4, $digest_size)); + $this->digest = $x[1]; + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->digest) > 0) { + + $data = pack( + 'nCCH*', + $this->keytag, $this->algorithm, $this->digesttype, $this->digest + ); + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/EID.php b/include/pear/Net/DNS2/RR/EID.php new file mode 100644 index 0000000000000000000000000000000000000000..17cf8fc27cd7dfe9c0f009fa558d499b3b0d922c --- /dev/null +++ b/include/pear/Net/DNS2/RR/EID.php @@ -0,0 +1,130 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: EID.php 125 2011-12-03 00:19:49Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * EID Resource Record - undefined; the rdata is simply used as-is in it's + * binary format, so not process has to be done. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_EID extends Net_DNS2_RR +{ + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return ''; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + return true; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + return $this->rdata; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/HINFO.php b/include/pear/Net/DNS2/RR/HINFO.php new file mode 100644 index 0000000000000000000000000000000000000000..355ec90839cd1ac45052ea5c7637e97b896660d5 --- /dev/null +++ b/include/pear/Net/DNS2/RR/HINFO.php @@ -0,0 +1,175 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: HINFO.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * HINFO Resource Record - RFC1035 section 3.3.2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / CPU / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / OS / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_HINFO extends Net_DNS2_RR +{ + /* + * computer informatino + */ + public $cpu; + + /* + * operataing system + */ + public $os; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->formatString($this->cpu) . ' ' . + $this->formatString($this->os); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = $this->buildString($rdata); + if (count($data) == 2) { + + $this->cpu = $data[0]; + $this->os = $data[1]; + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + + $this->cpu = trim(Net_DNS2_Packet::label($packet, $offset), '"'); + $this->os = trim(Net_DNS2_Packet::label($packet, $offset), '"'); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->cpu) > 0) { + + $data = chr(strlen($this->cpu)) . $this->cpu; + $data .= chr(strlen($this->os)) . $this->os; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/HIP.php b/include/pear/Net/DNS2/RR/HIP.php new file mode 100644 index 0000000000000000000000000000000000000000..8c0b80be45b078d097011b77cd708b465c9d05a8 --- /dev/null +++ b/include/pear/Net/DNS2/RR/HIP.php @@ -0,0 +1,287 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: HIP.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.0.0 + * + */ + +/** + * HIP Resource Record - RFC5205 section 5 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | HIT length | PK algorithm | PK length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * ~ HIT ~ + * | | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | | + * +-+-+-+-+-+-+-+-+-+-+-+ + + * | Public Key | + * ~ ~ + * | | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + * | | + * ~ Rendezvous Servers ~ + * | | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * +-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_HIP extends Net_DNS2_RR +{ + /* + * The length of the HIT field + */ + public $hit_length; + + /* + * the public key cryptographic algorithm + */ + public $pk_algorithm; + + /* + * the length of the public key field + */ + public $pk_length; + + /* + * The HIT is stored as a binary value in network byte order. + */ + public $hit; + + /* + * The public key + */ + public $public_key; + + /* + * a list of rendezvous servers + */ + public $rendezvous_servers = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->pk_algorithm . ' ' . + $this->hit . ' ' . $this->public_key . ' '; + + foreach ($this->rendezvous_servers as $index => $server) { + + $out .= $server . '. '; + } + + return trim($out); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->pk_algorithm = array_shift($rdata); + $this->hit = strtoupper(array_shift($rdata)); + $this->public_key = array_shift($rdata); + + // + // anything left on the array, must be one or more rendezevous servers. add + // them and strip off the trailing dot + // + if (count($rdata) > 0) { + + $this->rendezvous_servers = preg_replace('/\.$/', '', $rdata); + } + + // + // store the lengths; + // + $this->hit_length = strlen(pack('H*', $this->hit)); + $this->pk_length = strlen(base64_decode($this->public_key)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the algorithm and length values + // + $x = unpack('Chit_length/Cpk_algorithm/npk_length', $this->rdata); + + $this->hit_length = $x['hit_length']; + $this->pk_algorithm = $x['pk_algorithm']; + $this->pk_length = $x['pk_length']; + + $offset = 4; + + // + // copy out the HIT value + // + $hit = unpack('H*', substr($this->rdata, $offset, $this->hit_length)); + + $this->hit = strtoupper($hit[1]); + $offset += $this->hit_length; + + // + // copy out the public key + // + $this->public_key = base64_encode( + substr($this->rdata, $offset, $this->pk_length) + ); + $offset += $this->pk_length; + + // + // copy out any possible rendezvous servers + // + $offset = $packet->offset + $offset; + + while ( ($offset - $packet->offset) < $this->rdlength) { + + $this->rendezvous_servers[] = Net_DNS2_Packet::expand( + $packet, $offset + ); + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if ( (strlen($this->hit) > 0) && (strlen($this->public_key) > 0) ) { + + // + // pack the length, algorithm and HIT values + // + $data = pack( + 'CCnH*', + $this->hit_length, + $this->pk_algorithm, + $this->pk_length, + $this->hit + ); + + // + // add the public key + // + $data .= base64_decode($this->public_key); + + // + // add the offset + // + $packet->offset += strlen($data); + + // + // add each rendezvous server + // + foreach ($this->rendezvous_servers as $index => $server) { + + $data .= $packet->compress($server, $packet->offset); + } + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/IPSECKEY.php b/include/pear/Net/DNS2/RR/IPSECKEY.php new file mode 100644 index 0000000000000000000000000000000000000000..76a4c7fb247c4d10a6b24b4c46132b5db7f70a23 --- /dev/null +++ b/include/pear/Net/DNS2/RR/IPSECKEY.php @@ -0,0 +1,386 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: IPSECKEY.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * IPSECKEY Resource Record - RFC4025 section 2.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | precedence | gateway type | algorithm | gateway | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-------------+ + + * ~ gateway ~ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | / + * / public key / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_IPSECKEY extends Net_DNS2_RR +{ + const GATEWAY_TYPE_NONE = 0; + const GATEWAY_TYPE_IPV4 = 1; + const GATEWAY_TYPE_IPV6 = 2; + const GATEWAY_TYPE_DOMAIN = 3; + + const ALGORITHM_NONE = 0; + const ALGORITHM_DSA = 1; + const ALGORITHM_RSA = 2; + + /* + * Precedence (used the same was as a preference field) + */ + public $precedence; + + /* + * Gateway type - specifies the format of the gataway information + * This can be either: + * + * 0 No Gateway + * 1 IPv4 address + * 2 IPV6 address + * 3 wire-encoded domain name (not compressed) + * + */ + public $gateway_type; + + /* + * The algorithm used + * + * This can be: + * + * 0 No key is present + * 1 DSA key is present + * 2 RSA key is present + * + */ + public $algorithm; + + /* + * The gatway information + */ + public $gateway; + + /* + * the public key + */ + public $key; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->precedence . ' ' . $this->gateway_type . ' ' . + $this->algorithm . ' '; + + switch($this->gateway_type) { + case self::GATEWAY_TYPE_NONE: + $out .= '. '; + break; + + case self::GATEWAY_TYPE_IPV4: + case self::GATEWAY_TYPE_IPV6: + $out .= $this->gateway . ' '; + break; + + case self::GATEWAY_TYPE_DOMAIN: + $out .= $this->gateway . '. '; + break; + } + + $out .= $this->key; + return $out; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // load the data + // + $precedence = array_shift($rdata); + $gateway_type = array_shift($rdata); + $algorithm = array_shift($rdata); + $gateway = strtolower(trim(array_shift($rdata))); + $key = array_shift($rdata); + + // + // validate it + // + switch($gateway_type) { + case self::GATEWAY_TYPE_NONE: + $gateway = ''; + break; + + case self::GATEWAY_TYPE_IPV4: + if (Net_DNS2::isIPv4($gateway) == false) { + return false; + } + break; + + case self::GATEWAY_TYPE_IPV6: + if (Net_DNS2::isIPv6($gateway) == false) { + return false; + } + break; + + case self::GATEWAY_TYPE_DOMAIN: + ; // do nothing + break; + + default: + return false; + } + + // + // check the algorithm and key + // + switch($algorithm) { + case self::ALGORITHM_NONE: + $key = ''; + break; + + case self::ALGORITHM_DSA: + case self::ALGORITHM_RSA: + ; // do nothing + break; + + default: + return false; + } + + // + // store the values + // + $this->precedence = $precedence; + $this->gateway_type = $gateway_type; + $this->algorithm = $algorithm; + $this->gateway = $gateway; + $this->key = $key; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse off the precedence, gateway type and algorithm + // + $x = unpack('Cprecedence/Cgateway_type/Calgorithm', $this->rdata); + + $this->precedence = $x['precedence']; + $this->gateway_type = $x['gateway_type']; + $this->algorithm = $x['algorithm']; + + $offset = 3; + + // + // extract the gatway based on the type + // + switch($this->gateway_type) { + case self::GATEWAY_TYPE_NONE: + $this->gateway = ''; + break; + + case self::GATEWAY_TYPE_IPV4: + $this->gateway = inet_ntop(substr($this->rdata, $offset, 4)); + $offset += 4; + break; + + case self::GATEWAY_TYPE_IPV6: + $ip = unpack('n8', substr($this->rdata, $offset, 16)); + if (count($ip) == 8) { + + $this->gateway = vsprintf('%x:%x:%x:%x:%x:%x:%x:%x', $ip); + $offset += 16; + } else { + + return false; + } + break; + + case self::GATEWAY_TYPE_DOMAIN: + + $doffset = $offset + $packet->offset; + $this->gateway = Net_DNS2_Packet::expand($packet, $doffset); + $offset = ($doffset - $packet->offset); + break; + + default: + return false; + } + + // + // extract the key + // + switch($this->algorithm) { + case self::ALGORITHM_NONE: + $this->key = ''; + break; + + case self::ALGORITHM_DSA: + case self::ALGORITHM_RSA: + $this->key = base64_encode(substr($this->rdata, $offset)); + break; + + default: + return false; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + // + // pack the precedence, gateway type and algorithm + // + $data = pack( + 'CCC', $this->precedence, $this->gateway_type, $this->algorithm + ); + + // + // add the gateway based on the type + // + switch($this->gateway_type) { + case self::GATEWAY_TYPE_NONE: + ; // add nothing + break; + + case self::GATEWAY_TYPE_IPV4: + case self::GATEWAY_TYPE_IPV6: + $data .= inet_pton($this->gateway); + break; + + case self::GATEWAY_TYPE_DOMAIN: + $data .= chr(strlen($this->gateway)) . $this->gateway; + break; + + default: + return null; + } + + // + // add the key if there's one specified + // + switch($this->algorithm) { + case self::ALGORITHM_NONE: + ; // add nothing + break; + + case self::ALGORITHM_DSA: + case self::ALGORITHM_RSA: + $data .= base64_decode($this->key); + break; + + default: + return null; + } + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/ISDN.php b/include/pear/Net/DNS2/RR/ISDN.php new file mode 100644 index 0000000000000000000000000000000000000000..94db77a68deeff5b0b68cccb27e74b8bda77cc08 --- /dev/null +++ b/include/pear/Net/DNS2/RR/ISDN.php @@ -0,0 +1,190 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: ISDN.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * ISDN Resource Record - RFC1183 section 3.2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / ISDN-address / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / SA / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_ISDN extends Net_DNS2_RR +{ + /* + * ISDN Number + */ + public $isdnaddress; + + /* + * Sub-Address + */ + public $sa; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->formatString($this->isdnaddress) . ' ' . + $this->formatString($this->sa); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = $this->buildString($rdata); + if (count($data) >= 1) { + + $this->isdnaddress = $data[0]; + if (isset($data[1])) { + + $this->sa = $data[1]; + } + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $this->isdnaddress = Net_DNS2_Packet::label($packet, $packet->offset); + + // + // look for a SA (sub address) - it's optional + // + if ( (strlen($this->isdnaddress) + 1) < $this->rdlength) { + + $this->sa = Net_DNS2_Packet::label($packet, $packet->offset); + } else { + + $this->sa = ''; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->isdnaddress) > 0) { + + $data = chr(strlen($this->isdnaddress)) . $this->isdnaddress; + if (!empty($this->sa)) { + + $data .= chr(strlen($this->sa)); + $data .= $this->sa; + } + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/KEY.php b/include/pear/Net/DNS2/RR/KEY.php new file mode 100644 index 0000000000000000000000000000000000000000..6bcb0f596cbe6700cf12646c8575792fb03da634 --- /dev/null +++ b/include/pear/Net/DNS2/RR/KEY.php @@ -0,0 +1,85 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: KEY.php 47 2010-10-24 23:53:08Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * the KEY RR is implemented the same as the DNSKEY RR, the only difference + * is how the flags data is parsed. + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | A/C | Z | XT| Z | Z | NAMTYP| Z | Z | Z | Z | SIG | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * + * DNSKEY only uses bits 7 and 15 + * + * We're not doing anything with these flags right now, so duplicating the + * class like this is fine. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_KEY extends Net_DNS2_RR_DNSKEY +{ +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/KX.php b/include/pear/Net/DNS2/RR/KX.php new file mode 100644 index 0000000000000000000000000000000000000000..0218c390c2fce8f3f0a93526d76623609875250f --- /dev/null +++ b/include/pear/Net/DNS2/RR/KX.php @@ -0,0 +1,179 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: KX.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * KX Resource Record - RFC2230 section 3.1 + * + * This class is almost identical to MX, except that the the exchanger + * domain is not compressed, it's added as a label + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PREFERENCE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / EXCHANGER / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_KX extends Net_DNS2_RR +{ + /* + * the preference for this mail exchanger + */ + public $preference; + + /* + * the hostname of the mail exchanger + */ + public $exchange; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->cleanString($this->exchange) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->exchange = $this->cleanString(array_shift($rdata)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse the preference + // + $x = unpack('npreference', $this->rdata); + $this->preference = $x['preference']; + + // + // get the exchange entry server) + // + $offset = $packet->offset + 2; + $this->exchange = Net_DNS2_Packet::label($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->exchange) > 0) { + + $data = pack('nC', $this->preference, strlen($this->exchange)) . + $this->exchange; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/L32.php b/include/pear/Net/DNS2/RR/L32.php new file mode 100644 index 0000000000000000000000000000000000000000..b26d7cb9f0c6ba81f6f4ee717cda542a23509fac --- /dev/null +++ b/include/pear/Net/DNS2/RR/L32.php @@ -0,0 +1,180 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2013 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: L32.php 207 2013-06-13 01:19:55Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.3.1 + * + */ + +/** + * L32 Resource Record - RFC6742 section 2.2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Preference | Locator32 (16 MSBs) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Locator32 (16 LSBs) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_L32 extends Net_DNS2_RR +{ + /* + * The preference + */ + public $preference; + + /* + * The locator32 field + */ + public $locator32; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->locator32; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->locator32 = array_shift($rdata); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the values + // + $x = unpack('npreference/C4locator', $this->rdata); + + $this->preference = $x['preference']; + + // + // build the locator value + // + $this->locator32 = $x['locator1'] . '.' . $x['locator2'] . '.' . + $x['locator3'] . '.' . $x['locator4']; + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->locator32) > 0) { + + // + // break out the locator value + // + $n = explode('.', $this->locator32); + + // + // pack the data + // + return pack('nC4', $this->preference, $n[0], $n[1], $n[2], $n[3]); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/L64.php b/include/pear/Net/DNS2/RR/L64.php new file mode 100644 index 0000000000000000000000000000000000000000..900b433457b39987b97622d667297c6216f0e4eb --- /dev/null +++ b/include/pear/Net/DNS2/RR/L64.php @@ -0,0 +1,187 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2013 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: L64.php 208 2013-06-13 01:22:36Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.3.1 + * + */ + +/** + * L64 Resource Record - RFC6742 section 2.3 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Preference | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + * | Locator64 | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_L64 extends Net_DNS2_RR +{ + /* + * The preference + */ + public $preference; + + /* + * The locator64 field + */ + public $locator64; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->locator64; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->locator64 = array_shift($rdata); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the values + // + $x = unpack('npreference/n4locator', $this->rdata); + + $this->preference = $x['preference']; + + // + // build the locator64 + // + $this->locator64 = dechex($x['locator1']) . ':' . + dechex($x['locator2']) . ':' . + dechex($x['locator3']) . ':' . + dechex($x['locator4']); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->locator64) > 0) { + + // + // break out the locator64 + // + $n = explode(':', $this->locator64); + + // + // pack the data + // + return pack( + 'n5', $this->preference, hexdec($n[0]), hexdec($n[1]), + hexdec($n[2]), hexdec($n[3]) + ); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/LOC.php b/include/pear/Net/DNS2/RR/LOC.php new file mode 100644 index 0000000000000000000000000000000000000000..7afd2fabb8d77c39422a5a3c4adb390e74ba8339 --- /dev/null +++ b/include/pear/Net/DNS2/RR/LOC.php @@ -0,0 +1,440 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: LOC.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * LOC Resource Record - RFC1876 section 2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | VERSION | SIZE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | HORIZ PRE | VERT PRE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | LATITUDE | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | LONGITUDE | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ALTITUDE | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_LOC extends Net_DNS2_RR +{ + /* + * the LOC version- should only ever be 0 + */ + public $version; + + /* + * The diameter of a sphere enclosing the described entity + */ + public $size; + + /* + * The horizontal precision of the data + */ + public $horiz_pre; + + /* + * The vertical precision of the data + */ + public $vert_pre; + + /* + * The latitude - stored in decimal degrees + */ + public $latitude; + + /* + * The longitude - stored in decimal degrees + */ + public $longitude; + + /* + * The altitude - stored in decimal + */ + public $altitude; + + /* + * used for quick power-of-ten lookups + */ + private $_powerOfTen = array(1, 10, 100, 1000, 10000, 100000, + 1000000,10000000,100000000,1000000000); + + /* + * some conversion values + */ + const CONV_SEC = 1000; + const CONV_MIN = 60000; + const CONV_DEG = 3600000; + + const REFERENCE_ALT = 10000000; + const REFERENCE_LATLON = 2147483648; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + if ($this->version == 0) { + + return $this->_d2Dms($this->latitude, 'LAT') . ' ' . + $this->_d2Dms($this->longitude, 'LNG') . ' ' . + sprintf('%.2fm', $this->altitude) . ' ' . + sprintf('%.2fm', $this->size) . ' ' . + sprintf('%.2fm', $this->horiz_pre) . ' ' . + sprintf('%.2fm', $this->vert_pre); + } + + return ''; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // format as defined by RFC1876 section 3 + // + // d1 [m1 [s1]] {"N"|"S"} d2 [m2 [s2]] {"E"|"W"} alt["m"] + // [siz["m"] [hp["m"] [vp["m"]]]] + // + $res = preg_match( + '/^(\d+) \s+((\d+) \s+)?(([\d.]+) \s+)?(N|S) \s+(\d+) ' . + '\s+((\d+) \s+)?(([\d.]+) \s+)?(E|W) \s+(-?[\d.]+) m?(\s+ ' . + '([\d.]+) m?)?(\s+ ([\d.]+) m?)?(\s+ ([\d.]+) m?)?/ix', + implode(' ', $rdata), $x + ); + + if ($res) { + + // + // latitude + // + $latdeg = $x[1]; + $latmin = (isset($x[3])) ? $x[3] : 0; + $latsec = (isset($x[5])) ? $x[5] : 0; + $lathem = strtoupper($x[6]); + + $this->latitude = $this->_dms2d($latdeg, $latmin, $latsec, $lathem); + + // + // longitude + // + $londeg = $x[7]; + $lonmin = (isset($x[9])) ? $x[9] : 0; + $lonsec = (isset($x[11])) ? $x[11] : 0; + $lonhem = strtoupper($x[12]); + + $this->longitude = $this->_dms2d($londeg, $lonmin, $lonsec, $lonhem); + + // + // the rest of teh values + // + $version = 0; + + $this->size = (isset($x[15])) ? $x[15] : 1; + $this->horiz_pre = ((isset($x[17])) ? $x[17] : 10000); + $this->vert_pre = ((isset($x[19])) ? $x[19] : 10); + $this->altitude = $x[13]; + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack all the values + // + $x = unpack( + 'Cver/Csize/Choriz_pre/Cvert_pre/Nlatitude/Nlongitude/Naltitude', + $this->rdata + ); + + // + // version must be 0 per RFC 1876 section 2 + // + $this->version = $x['ver']; + if ($this->version == 0) { + + $this->size = $this->_precsizeNtoA($x['size']); + $this->horiz_pre = $this->_precsizeNtoA($x['horiz_pre']); + $this->vert_pre = $this->_precsizeNtoA($x['vert_pre']); + + // + // convert the latitude and longitude to degress in decimal + // + if ($x['latitude'] < 0) { + + $this->latitude = ($x['latitude'] + + self::REFERENCE_LATLON) / self::CONV_DEG; + } else { + + $this->latitude = ($x['latitude'] - + self::REFERENCE_LATLON) / self::CONV_DEG; + } + + if ($x['longitude'] < 0) { + + $this->longitude = ($x['longitude'] + + self::REFERENCE_LATLON) / self::CONV_DEG; + } else { + + $this->longitude = ($x['longitude'] - + self::REFERENCE_LATLON) / self::CONV_DEG; + } + + // + // convert down the altitude + // + $this->altitude = ($x['altitude'] - self::REFERENCE_ALT) / 100; + + return true; + + } else { + + return false; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if ($this->version == 0) { + + $lat = 0; + $lng = 0; + + if ($this->latitude < 0) { + + $lat = ($this->latitude * self::CONV_DEG) - self::REFERENCE_LATLON; + } else { + + $lat = ($this->latitude * self::CONV_DEG) + self::REFERENCE_LATLON; + } + + if ($this->longitude < 0) { + + $lng = ($this->longitude * self::CONV_DEG) - self::REFERENCE_LATLON; + } else { + + $lng = ($this->longitude * self::CONV_DEG) + self::REFERENCE_LATLON; + } + + $packet->offset += 16; + + return pack( + 'CCCCNNN', + $this->version, + $this->_precsizeAtoN($this->size), + $this->_precsizeAtoN($this->horiz_pre), + $this->_precsizeAtoN($this->vert_pre), + $lat, $lng, + ($this->altitude * 100) + self::REFERENCE_ALT + ); + } + + return null; + } + + /** + * takes an XeY precision/size value, returns a string representation. + * shamlessly stolen from RFC1876 Appendix A + * + * @param integer $prec the value to convert + * + * @return string + * @access private + * + */ + private function _precsizeNtoA($prec) + { + $mantissa = (($prec >> 4) & 0x0f) % 10; + $exponent = (($prec >> 0) & 0x0f) % 10; + + return $mantissa * $this->_powerOfTen[$exponent]; + } + + /** + * converts ascii size/precision X * 10**Y(cm) to 0xXY. + * shamlessly stolen from RFC1876 Appendix A + * + * @param string $prec the value to convert + * + * @return integer + * @access private + * + */ + private function _precsizeAtoN($prec) + { + $exponent = 0; + while ($prec >= 10) { + + $prec /= 10; + ++$exponent; + } + + return ($prec << 4) | ($exponent & 0x0f); + } + + /** + * convert lat/lng in deg/min/sec/hem to decimal value + * + * @param integer $deg the degree value + * @param integer $min the minutes value + * @param integer $sec the seconds value + * @param string $hem the hemisphere (N/E/S/W) + * + * @return float the decinmal value + * @access private + * + */ + private function _dms2d($deg, $min, $sec, $hem) + { + $deg = $deg - 0; + $min = $min - 0; + + $sign = ($hem == 'W' || $hem == 'S') ? -1 : 1; + return ((($sec/60+$min)/60)+$deg) * $sign; + } + + /** + * convert lat/lng in decimal to deg/min/sec/hem + * + * @param float $data the decimal value + * @param string $latlng either LAT or LNG so we can determine the HEM value + * + * @return string + * @access private + * + */ + private function _d2Dms($data, $latlng) + { + $deg = 0; + $min = 0; + $sec = 0; + $msec = 0; + $hem = ''; + + if ($latlng == 'LAT') { + $hem = ($data > 0) ? 'N' : 'S'; + } else { + $hem = ($data > 0) ? 'E' : 'W'; + } + + $data = abs($data); + + $deg = (int)$data; + $min = (int)(($data - $deg) * 60); + $sec = (int)(((($data - $deg) * 60) - $min) * 60); + $msec = round((((((($data - $deg) * 60) - $min) * 60) - $sec) * 1000)); + + return sprintf('%d %02d %02d.%03d %s', $deg, $min, $sec, round($msec), $hem); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/LP.php b/include/pear/Net/DNS2/RR/LP.php new file mode 100644 index 0000000000000000000000000000000000000000..7c5356c09bcde506d15de72b2916f48647b267d2 --- /dev/null +++ b/include/pear/Net/DNS2/RR/LP.php @@ -0,0 +1,177 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2013 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: LP.php 207 2013-06-13 01:19:55Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.3.1 + * + */ + +/** + * LP Resource Record - RFC6742 section 2.4 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Preference | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / + * / / + * / FQDN / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_LP extends Net_DNS2_RR +{ + /* + * The preference + */ + public $preference; + + /* + * The fdqn field + */ + public $fqdn; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->fqdn . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->fqdn = trim(array_shift($rdata), '.'); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse the preference + // + $x = unpack('npreference', $this->rdata); + $this->preference = $x['preference']; + $offset = $packet->offset + 2; + + // + // get the hostname + // + $this->fqdn = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->fqdn) > 0) { + + $data = pack('n', $this->preference); + $packet->offset += 2; + + $data .= $packet->compress($this->fqdn, $packet->offset); + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/MX.php b/include/pear/Net/DNS2/RR/MX.php new file mode 100644 index 0000000000000000000000000000000000000000..d75af38dff2974461aa4d000909b4241029bdc56 --- /dev/null +++ b/include/pear/Net/DNS2/RR/MX.php @@ -0,0 +1,175 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: MX.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * MX Resource Record - RFC1035 section 3.3.9 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PREFERENCE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / EXCHANGE / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_MX extends Net_DNS2_RR +{ + /* + * the preference for this mail exchanger + */ + public $preference; + + /* + * the hostname of the mail exchanger + */ + public $exchange; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->cleanString($this->exchange) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->exchange = $this->cleanString(array_shift($rdata)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse the preference + // + $x = unpack('npreference', $this->rdata); + $this->preference = $x['preference']; + + // + // get the exchange entry server) + // + $offset = $packet->offset + 2; + $this->exchange = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->exchange) > 0) { + + $data = pack('n', $this->preference); + $packet->offset += 2; + + $data .= $packet->compress($this->exchange, $packet->offset); + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NAPTR.php b/include/pear/Net/DNS2/RR/NAPTR.php new file mode 100644 index 0000000000000000000000000000000000000000..d05d9da55c3b8686399a55a071334e6f8bc72238 --- /dev/null +++ b/include/pear/Net/DNS2/RR/NAPTR.php @@ -0,0 +1,231 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NAPTR.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NAPTR Resource Record - RFC2915 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ORDER | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PREFERENCE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / FLAGS / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / SERVICES / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / REGEXP / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / REPLACEMENT / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NAPTR extends Net_DNS2_RR +{ + /* + * the order in which the NAPTR records MUST be processed + */ + public $order; + + /* + * specifies the order in which NAPTR records with equal "order" + * values SHOULD be processed + */ + public $preference; + + /* + * rewrite flags + */ + public $flags; + + /* + * Specifies the service(s) available down this rewrite path + */ + public $services; + + /* + * regular expression + */ + public $regexp; + + /* + * The next NAME to query for NAPTR, SRV, or address records + * depending on the value of the flags field + */ + public $replacement; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->order . ' ' . $this->preference . ' ' . + $this->formatString($this->flags) . ' ' . + $this->formatString($this->services) . ' ' . + $this->formatString($this->regexp) . ' ' . + $this->cleanString($this->replacement) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->order = array_shift($rdata); + $this->preference = array_shift($rdata); + + $data = $this->buildString($rdata); + if (count($data) == 4) { + + $this->flags = $data[0]; + $this->services = $data[1]; + $this->regexp = $data[2]; + $this->replacement = $this->cleanString($data[3]); + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the order and preference + // + $x = unpack('norder/npreference', $this->rdata); + + $this->order = $x['order']; + $this->preference = $x['preference']; + + $offset = $packet->offset + 4; + + $this->flags = Net_DNS2_Packet::label($packet, $offset); + $this->services = Net_DNS2_Packet::label($packet, $offset); + $this->regexp = Net_DNS2_Packet::label($packet, $offset); + + $this->replacement = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if ( (isset($this->order)) && (strlen($this->services) > 0) ) { + + $data = pack('nn', $this->order, $this->preference); + + $data .= chr(strlen($this->flags)) . $this->flags; + $data .= chr(strlen($this->services)) . $this->services; + $data .= chr(strlen($this->regexp)) . $this->regexp; + + $packet->offset += strlen($data); + + $data .= $packet->compress($this->replacement, $packet->offset); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NID.php b/include/pear/Net/DNS2/RR/NID.php new file mode 100644 index 0000000000000000000000000000000000000000..ed4463de5b4f8cd4ffd30edf5e6b96f644abbe7f --- /dev/null +++ b/include/pear/Net/DNS2/RR/NID.php @@ -0,0 +1,187 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2013 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NID.php 208 2013-06-13 01:22:36Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.3.1 + * + */ + +/** + * NID Resource Record - RFC6742 section 2.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Preference | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + * | NodeID | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NID extends Net_DNS2_RR +{ + /* + * The preference + */ + public $preference; + + /* + * The node ID field + */ + public $nodeid; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->nodeid; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = array_shift($rdata); + $this->nodeid = array_shift($rdata); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the values + // + $x = unpack('npreference/n4nodeid', $this->rdata); + + $this->preference = $x['preference']; + + // + // build the node id + // + $this->nodeid = dechex($x['nodeid1']) . ':' . + dechex($x['nodeid2']) . ':' . + dechex($x['nodeid3']) . ':' . + dechex($x['nodeid4']); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->nodeid) > 0) { + + // + // break out the node id + // + $n = explode(':', $this->nodeid); + + // + // pack the data + // + return pack( + 'n5', $this->preference, hexdec($n[0]), hexdec($n[1]), + hexdec($n[2]), hexdec($n[3]) + ); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NIMLOC.php b/include/pear/Net/DNS2/RR/NIMLOC.php new file mode 100644 index 0000000000000000000000000000000000000000..70c421975f96d8eb07bfbd8276ccbb50ea7f1b17 --- /dev/null +++ b/include/pear/Net/DNS2/RR/NIMLOC.php @@ -0,0 +1,130 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NIMLOC.php 125 2011-12-03 00:19:49Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NIMLOCK Resource Record - undefined; the rdata is simply used as-is in it's + * binary format, so not process has to be done. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NIMLOCK extends Net_DNS2_RR +{ + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return ''; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + return true; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + return $this->rdata; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NS.php b/include/pear/Net/DNS2/RR/NS.php new file mode 100644 index 0000000000000000000000000000000000000000..3d006872a0760fdd13ac157ff661d38ccb3e279c --- /dev/null +++ b/include/pear/Net/DNS2/RR/NS.php @@ -0,0 +1,153 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NS.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NS Resource Record - RFC1035 section 3.3.11 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / NSDNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NS extends Net_DNS2_RR +{ + /* + * the hostname of the DNS server + */ + public $nsdname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->nsdname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->nsdname = $this->cleanString(array_shift($rdata)); + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + $this->nsdname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->nsdname) > 0) { + + return $packet->compress($this->nsdname, $packet->offset); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NSAP.php b/include/pear/Net/DNS2/RR/NSAP.php new file mode 100644 index 0000000000000000000000000000000000000000..4413ebcec50d674298ad9e18fac0f85ff97f1406 --- /dev/null +++ b/include/pear/Net/DNS2/RR/NSAP.php @@ -0,0 +1,262 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NSAP.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NSAP Resource Record - RFC1706 + * + * |--------------| + * | <-- IDP --> | + * |--------------|-------------------------------------| + * | AFI | IDI | <-- DSP --> | + * |-----|--------|-------------------------------------| + * | 47 | 0005 | DFI | AA |Rsvd | RD |Area | ID |Sel | + * |-----|--------|-----|----|-----|----|-----|----|----| + * octets | 1 | 2 | 1 | 3 | 2 | 2 | 2 | 6 | 1 | + * |-----|--------|-----|----|-----|----|-----|----|----| + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NSAP extends Net_DNS2_RR +{ + public $afi; + public $idi; + public $dfi; + public $aa; + public $rsvd; + public $rd; + public $area; + public $id; + public $sel; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->afi) . '.' . + $this->cleanString($this->idi) . '.' . + $this->cleanString($this->dfi) . '.' . + $this->cleanString($this->aa) . '.' . + $this->cleanString($this->rsvd) . '.' . + $this->cleanString($this->rd) . '.' . + $this->cleanString($this->area) . '.' . + $this->cleanString($this->id) . '.' . + $this->sel; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = strtolower(trim(array_shift($rdata))); + + // + // there is no real standard for format, so we can't rely on the fact that + // the value will come in with periods separating the values- so strip + // them out if they're included, and parse without them. + // + $data = str_replace(array('.', '0x'), '', $data); + + // + // unpack it as ascii characters + // + $x = unpack('A2afi/A4idi/A2dfi/A6aa/A4rsvd/A4rd/A4area/A12id/A2sel', $data); + + // + // make sure the afi value is 47 + // + if ($x['afi'] == 47) { + + $this->afi = '0x' . $x['afi']; + $this->idi = $x['idi']; + $this->dfi = $x['dfi']; + $this->aa = $x['aa']; + $this->rsvd = $x['rsvd']; + $this->rd = $x['rd']; + $this->area = $x['area']; + $this->id = $x['id']; + $this->sel = $x['sel']; + + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength == 20) { + + // + // get the AFI value + // + $this->afi = dechex(ord($this->rdata[0])); + + // + // we only support AFI 47- there arent' any others defined. + // + if ($this->afi == 47) { + + // + // unpack the rest of the values + // + $x = unpack( + 'Cafi/nidi/Cdfi/C3aa/nrsvd/nrd/narea/Nidh/nidl/Csel', + $this->rdata + ); + + $this->afi = sprintf('0x%02x', $x['afi']); + $this->idi = sprintf('%04x', $x['idi']); + $this->dfi = sprintf('%02x', $x['dfi']); + $this->aa = sprintf( + '%06x', $x['aa1'] << 16 | $x['aa2'] << 8 | $x['aa3'] + ); + $this->rsvd = sprintf('%04x', $x['rsvd']); + $this->rd = sprintf('%04x', $x['rd']); + $this->area = sprintf('%04x', $x['area']); + $this->id = sprintf('%08x', $x['idh']) . + sprintf('%04x', $x['idl']); + $this->sel = sprintf('%02x', $x['sel']); + + return true; + } + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if ($this->afi == 0x47) { + + // + // build the aa field + // + $aa = unpack('A2x/A2y/A2z', $this->aa); + + // + // build the id field + // + $id = unpack('A8a/A4b', $this->id); + + // + $data = pack( + 'CnCCCCnnnNnC', + hexdec($this->afi), + hexdec($this->idi), + hexdec($this->dfi), + hexdec($aa['x']), + hexdec($aa['y']), + hexdec($aa['z']), + hexdec($this->rsvd), + hexdec($this->rd), + hexdec($this->area), + hexdec($id['a']), + hexdec($id['b']), + hexdec($this->sel) + ); + + if (strlen($data) == 20) { + + $packet->offset += 20; + return $data; + } + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NSEC.php b/include/pear/Net/DNS2/RR/NSEC.php new file mode 100644 index 0000000000000000000000000000000000000000..d87d525423713664aae43371ed35dcbc755fdd73 --- /dev/null +++ b/include/pear/Net/DNS2/RR/NSEC.php @@ -0,0 +1,184 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NSEC.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NSEC Resource Record - RFC3845 section 2.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / Next Domain Name / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / List of Type Bit Map(s) / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NSEC extends Net_DNS2_RR +{ + /* + * The next owner name + */ + public $next_domain_name; + + /* + * identifies the RRset types that exist at the NSEC RR's owner name. + */ + public $type_bit_maps = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $data = $this->cleanString($this->next_domain_name) . '.'; + + foreach ($this->type_bit_maps as $rr) { + + $data .= ' ' . $rr; + } + + return $data; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->next_domain_name = $this->cleanString(array_shift($rdata)); + $this->type_bit_maps = $rdata; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // expand the next domain name + // + $offset = $packet->offset; + $this->next_domain_name = Net_DNS2_Packet::expand($packet, $offset); + + // + // parse out the RR's from the bitmap + // + $this->type_bit_maps = Net_DNS2_BitMap::bitMapToArray( + substr($this->rdata, $offset - $packet->offset) + ); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->next_domain_name) > 0) { + + $data = $packet->compress($this->next_domain_name, $packet->offset); + $bitmap = Net_DNS2_BitMap::arrayToBitMap($this->type_bit_maps); + + $packet->offset += strlen($bitmap); + + return $data . $bitmap; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NSEC3.php b/include/pear/Net/DNS2/RR/NSEC3.php new file mode 100644 index 0000000000000000000000000000000000000000..71dc028cb5150eceaafcbf4e9b5bd215f9aad833 --- /dev/null +++ b/include/pear/Net/DNS2/RR/NSEC3.php @@ -0,0 +1,310 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NSEC3.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NSEC3 Resource Record - RFC5155 section 3.2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Hash Alg. | Flags | Iterations | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Salt Length | Salt / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Hash Length | Next Hashed Owner Name / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / Type Bit Maps / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NSEC3 extends Net_DNS2_RR +{ + /* + * Algorithm to use + */ + public $algorithm; + + /* + * flags + */ + public $flags; + + /* + * defines the number of additional times the hash is performed. + */ + public $iterations; + + /* + * the length of the salt- not displayed + */ + public $salt_length; + + /* + * the salt + */ + public $salt; + + /* + * the length of the hash value + */ + public $hash_length; + + /* + * the hashed value of the owner name + */ + public $hashed_owner_name; + + /* + * array of RR type names + */ + public $type_bit_maps = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->algorithm . ' ' . $this->flags . ' ' . $this->iterations . ' '; + + // + // per RFC5155, the salt_length value isn't displayed, and if the salt + // is empty, the salt is displayed as '-' + // + if ($this->salt_length > 0) { + + $out .= $this->salt; + } else { + + $out .= '-'; + } + + // + // per RFC5255 the hash length isn't shown + // + $out .= ' ' . $this->hashed_owner_name; + + // + // show the RR's + // + foreach ($this->type_bit_maps as $rr) { + + $out .= ' ' . strtoupper($rr); + } + + return $out; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->algorithm = array_shift($rdata); + $this->flags = array_shift($rdata); + $this->iterations = array_shift($rdata); + + // + // an empty salt is represented as '-' per RFC5155 section 3.3 + // + $salt = array_shift($rdata); + if ($salt == '-') { + + $this->salt_length = 0; + $this->salt = ''; + } else { + + $this->salt_length = strlen(pack('H*', $salt)); + $this->salt = strtoupper($salt); + } + + $this->hashed_owner_name = array_shift($rdata); + $this->hash_length = strlen(base64_decode($this->hashed_owner_name)); + + $this->type_bit_maps = $rdata; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the first values + // + $x = unpack('Calgorithm/Cflags/niterations/Csalt_length', $this->rdata); + + $this->algorithm = $x['algorithm']; + $this->flags = $x['flags']; + $this->iterations = $x['iterations']; + $this->salt_length = $x['salt_length']; + + $offset = 5; + + if ($this->salt_length > 0) { + + $x = unpack('H*', substr($this->rdata, $offset, $this->salt_length)); + $this->salt = strtoupper($x[1]); + $offset += $this->salt_length; + } + + // + // unpack the hash length + // + $x = unpack('@' . $offset . '/Chash_length', $this->rdata); + $offset++; + + // + // copy out the hash + // + $this->hash_length = $x['hash_length']; + if ($this->hash_length > 0) { + + $this->hashed_owner_name = base64_encode( + substr($this->rdata, $offset, $this->hash_length) + ); + $offset += $this->hash_length; + } + + // + // parse out the RR bitmap + // + $this->type_bit_maps = Net_DNS2_BitMap::bitMapToArray( + substr($this->rdata, $offset) + ); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + // + // pull the salt and build the length + // + $salt = pack('H*', $this->salt); + $this->salt_length = strlen($salt); + + // + // pack the algorithm, flags, iterations and salt length + // + $data = pack( + 'CCnC', + $this->algorithm, $this->flags, $this->iterations, $this->salt_length + ); + $data .= $salt; + + // + // add the hash length and hash + // + $data .= chr($this->hash_length); + if ($this->hash_length > 0) { + + $data .= base64_decode($this->hashed_owner_name); + } + + // + // conver the array of RR names to a type bitmap + // + $data .= Net_DNS2_BitMap::arrayToBitMap($this->type_bit_maps); + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/NSEC3PARAM.php b/include/pear/Net/DNS2/RR/NSEC3PARAM.php new file mode 100644 index 0000000000000000000000000000000000000000..9a67c628081cdd53665f9f583cc46fa650518f1d --- /dev/null +++ b/include/pear/Net/DNS2/RR/NSEC3PARAM.php @@ -0,0 +1,220 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: NSEC3PARAM.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * NSEC3PARAM Resource Record - RFC5155 section 4.2 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Hash Alg. | Flags | Iterations | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Salt Length | Salt / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_NSEC3PARAM extends Net_DNS2_RR +{ + /* + * Algorithm to use + * + * TODO: same as the NSEC3 + */ + public $algorithm; + + /* + * flags + */ + public $flags; + + /* + * defines the number of additional times the hash is performed. + */ + public $iterations; + + /* + * the length of the salt- not displayed + */ + public $salt_length; + + /* + * the salt + */ + public $salt; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->algorithm . ' ' . $this->flags . ' ' . $this->iterations . ' '; + + // + // per RFC5155, the salt_length value isn't displayed, and if the salt + // is empty, the salt is displayed as "-" + // + if ($this->salt_length > 0) { + + $out .= $this->salt; + } else { + + $out .= '-'; + } + + return $out; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->algorithm = array_shift($rdata); + $this->flags = array_shift($rdata); + $this->iterations = array_shift($rdata); + + $salt = array_shift($rdata); + if ($salt == '-') { + + $this->salt_length = 0; + $this->salt = ''; + } else { + + $this->salt_length = strlen(pack('H*', $salt)); + $this->salt = strtoupper($salt); + } + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $x = unpack('Calgorithm/Cflags/niterations/Csalt_length', $this->rdata); + + $this->algorithm = $x['algorithm']; + $this->flags = $x['flags']; + $this->iterations = $x['iterations']; + $this->salt_length = $x['salt_length']; + + if ($this->salt_length > 0) { + + $x = unpack('H*', substr($this->rdata, 5, $this->salt_length)); + $this->salt = strtoupper($x[1]); + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + $salt = pack('H*', $this->salt); + $this->salt_length = strlen($salt); + + $data = pack( + 'CCnC', + $this->algorithm, $this->flags, $this->iterations, $this->salt_length + ) . $salt; + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/OPT.php b/include/pear/Net/DNS2/RR/OPT.php new file mode 100644 index 0000000000000000000000000000000000000000..37422d689f07616071d66bfd1762abf00b85ec83 --- /dev/null +++ b/include/pear/Net/DNS2/RR/OPT.php @@ -0,0 +1,292 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: OPT.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.0.0 + * + */ + +/** + * OPT Resource Record - RFC2929 section 3.1 + * + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | OPTION-CODE | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | OPTION-LENGTH | + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * | | + * / OPTION-DATA / + * / / + * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_OPT extends Net_DNS2_RR +{ + /* + * option code - assigned by IANA + */ + public $option_code; + + /* + * the length of the option data + */ + public $option_length; + + /* + * the option data + */ + public $option_data; + + /* + * the extended response code stored in the TTL + */ + public $extended_rcode; + + /* + * the implementation level + */ + public $version; + + /* + * the DO bit used for DNSSEC - RFC3225 + */ + public $do; + + /* + * the extended flags + */ + public $z; + + /** + * Constructor - builds a new Net_DNS2_RR_OPT object; normally you wouldn't call + * this directly, but OPT RR's are a little different + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create + * an empty object + * @param array $rr an array with RR parse values or null to + * create an empty object + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null) + { + // + // this is for when we're manually building an OPT RR object; we aren't + // passing in binary data to parse, we just want a clean/empty object. + // + $this->type = 'OPT'; + $this->rdlength = 0; + + $this->option_length = 0; + $this->extended_rcode = 0; + $this->version = 0; + $this->do = 0; + $this->z = 0; + + // + // everthing else gets passed through to the parent. + // + if ( (!is_null($packet)) && (!is_null($rr)) ) { + + parent::__construct($packet, $rr); + } + } + + /** + * method to return the rdata portion of the packet as a string. There is no + * defintion for returning an OPT RR by string- this is just here to validate + * the binary parsing / building routines. + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->option_code . ' ' . $this->option_data; + } + + /** + * parses the rdata portion from a standard DNS config line. There is no + * definition for parsing a OPT RR by string- this is just here to validate + * the binary parsing / building routines. + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->option_code = array_shift($rdata); + $this->option_data = array_shift($rdata); + $this->option_length = strlen($this->option_data); + + $x = unpack('Cextended/Cversion/Cdo/Cz', pack('N', $this->ttl)); + + $this->extended_rcode = $x['extended']; + $this->version = $x['version']; + $this->do = ($x['do'] >> 7); + $this->z = $x['z']; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + // + // parse out the TTL value + // + $x = unpack('Cextended/Cversion/Cdo/Cz', pack('N', $this->ttl)); + + $this->extended_rcode = $x['extended']; + $this->version = $x['version']; + $this->do = ($x['do'] >> 7); + $this->z = $x['z']; + + // + // parse the data, if there is any + // + if ($this->rdlength > 0) { + + // + // unpack the code and length + // + $x = unpack('noption_code/noption_length', $this->rdata); + + $this->option_code = $x['option_code']; + $this->option_length = $x['option_length']; + + // + // copy out the data based on the length + // + $this->option_data = substr($this->rdata, 4); + } + + return true; + } + + /** + * pre-builds the TTL value for this record; we needed to separate this out + * from the rrGet() function, as the logic in the Net_DNS2_RR packs the TTL + * value before it builds the rdata value. + * + * @return void + * @access protected + * + */ + protected function preBuild() + { + // + // build the TTL value based on the local values + // + $ttl = unpack( + 'N', + pack('CCCC', $this->extended_rcode, $this->version, ($this->do << 7), 0) + ); + + $this->ttl = $ttl[1]; + + return; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + // + // if there is an option code, then pack that data too + // + if ($this->option_code) { + + $data = pack('nn', $this->option_code, $this->option_length) . + $this->option_data; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/PTR.php b/include/pear/Net/DNS2/RR/PTR.php new file mode 100644 index 0000000000000000000000000000000000000000..cc0b90e782dbf543f43833400ee0a7babc16bfcf --- /dev/null +++ b/include/pear/Net/DNS2/RR/PTR.php @@ -0,0 +1,152 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: PTR.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * PTR Resource Record - RFC1035 section 3.3.12 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / PTRDNAME / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_PTR extends Net_DNS2_RR +{ + /* + * the hostname of the PTR entry + */ + public $ptrdname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->ptrdname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->ptrdname = $this->cleanString(array_shift($rdata)); + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + $this->ptrdname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->ptrdname) > 0) { + + return $packet->compress($this->ptrdname, $packet->offset); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/PX.php b/include/pear/Net/DNS2/RR/PX.php new file mode 100644 index 0000000000000000000000000000000000000000..143b8e879d1e5af4d548127148d7fa3fc678ee3a --- /dev/null +++ b/include/pear/Net/DNS2/RR/PX.php @@ -0,0 +1,186 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: PX.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * PX Resource Record - RFC2163 section 4 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PREFERENCE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / MAP822 / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / MAPX400 / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_PX extends Net_DNS2_RR +{ + /* + * preference + */ + public $preference; + + /* + * the RFC822 part of the MCGAM + */ + public $map822; + + /* + * the X.400 part of the MCGAM + */ + public $mapx400; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . $this->cleanString($this->map822) . '. ' . + $this->cleanString($this->mapx400) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = $rdata[0]; + $this->map822 = $this->cleanString($rdata[1]); + $this->mapx400 = $this->cleanString($rdata[2]); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse the preference + // + $x = unpack('npreference', $this->rdata); + $this->preference = $x['preference']; + + $offset = $packet->offset + 2; + + $this->map822 = Net_DNS2_Packet::expand($packet, $offset); + $this->mapx400 = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->map822) > 0) { + + $data = pack('n', $this->preference); + $packet->offset += 2; + + $data .= $packet->compress($this->map822, $packet->offset); + $data .= $packet->compress($this->mapx400, $packet->offset); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/RP.php b/include/pear/Net/DNS2/RR/RP.php new file mode 100644 index 0000000000000000000000000000000000000000..f0b97b7ab968a4923ad0a4c7129b407967289b44 --- /dev/null +++ b/include/pear/Net/DNS2/RR/RP.php @@ -0,0 +1,167 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: RP.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * RP Resource Record - RFC1183 section 2.2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / mboxdname / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / txtdname / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_RP extends Net_DNS2_RR +{ + /* + * mailbox for the responsible person + */ + public $mboxdname; + + /* + * is a domain name for which TXT RR's exists + */ + public $txtdname; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->mboxdname) . '. ' . + $this->cleanString($this->txtdname) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->mboxdname = $this->cleanString($rdata[0]); + $this->txtdname = $this->cleanString($rdata[1]); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + + $this->mboxdname = Net_DNS2_Packet::expand($packet, $offset); + $this->txtdname = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->mboxdname) > 0) { + + return $packet->compress($this->mboxdname, $packet->offset) . + $packet->compress($this->txtdname, $packet->offset); + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/RRSIG.php b/include/pear/Net/DNS2/RR/RRSIG.php new file mode 100644 index 0000000000000000000000000000000000000000..6f9aa276e24664607c3ec5db2c5b73725c2a488b --- /dev/null +++ b/include/pear/Net/DNS2/RR/RRSIG.php @@ -0,0 +1,329 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: RRSIG.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + * This file contains code based off the Net::DNS::SEC Perl module by + * Olaf M. Kolkman + * + * This is the copyright notice from the PERL Net::DNS::SEC module: + * + * Copyright (c) 2001 - 2005 RIPE NCC. Author Olaf M. Kolkman + * Copyright (c) 2007 - 2008 NLnet Labs. Author Olaf M. Kolkman + * <olaf@net-dns.org> + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the author not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL + * AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +/** + * RRSIG Resource Record - RFC4034 sction 3.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type Covered | Algorithm | Labels | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Original TTL | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Signature Expiration | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Signature Inception | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Key Tag | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Signer's Name / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / / + * / Signature / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_RRSIG extends Net_DNS2_RR +{ + /* + * the RR type covered by this signature + */ + public $typecovered; + + /* + * the algorithm used for the signature + */ + public $algorithm; + + /* + * the number of labels in the name + */ + public $labels; + + /* + * the original TTL + */ + public $origttl; + + /* + * the signature expiration + */ + public $sigexp; + + /* + * the inception of the signature + */ + public $sigincep; + + /* + * the keytag used + */ + public $keytag; + + /* + * the signer's name + */ + public $signname; + + /* + * the signature + */ + public $signature; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->typecovered . ' ' . $this->algorithm . ' ' . + $this->labels . ' ' . $this->origttl . ' ' . + $this->sigexp . ' ' . $this->sigincep . ' ' . + $this->keytag . ' ' . $this->cleanString($this->signname) . '. ' . + $this->signature; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->typecovered = strtoupper(array_shift($rdata)); + $this->algorithm = array_shift($rdata); + $this->labels = array_shift($rdata); + $this->origttl = array_shift($rdata); + $this->sigexp = array_shift($rdata); + $this->sigincep = array_shift($rdata); + $this->keytag = array_shift($rdata); + $this->signname = $this->cleanString(array_shift($rdata)); + + foreach ($rdata as $line) { + + $this->signature .= $line; + } + + $this->signature = trim($this->signature); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack + // + $x = unpack( + 'ntc/Calgorithm/Clabels/Norigttl/Nsigexp/Nsigincep/nkeytag', + $this->rdata + ); + + $this->typecovered = Net_DNS2_Lookups::$rr_types_by_id[$x['tc']]; + $this->algorithm = $x['algorithm']; + $this->labels = $x['labels']; + $this->origttl = Net_DNS2::expandUint32($x['origttl']); + + // + // the dates are in GM time + // + $this->sigexp = gmdate('YmdHis', $x['sigexp']); + $this->sigincep = gmdate('YmdHis', $x['sigincep']); + + // + // get the keytag + // + $this->keytag = $x['keytag']; + + // + // get teh signers name and signature + // + $offset = $packet->offset + 18; + $sigoffset = $offset; + + $this->signname = strtolower( + Net_DNS2_Packet::expand($packet, $sigoffset) + ); + $this->signature = base64_encode( + substr($this->rdata, 18 + ($sigoffset - $offset)) + ); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->signature) > 0) { + + // + // parse the values out of the dates + // + preg_match( + '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigexp, $e + ); + preg_match( + '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigincep, $i + ); + + // + // pack the value + // + $data = pack( + 'nCCNNNn', + Net_DNS2_Lookups::$rr_types_by_name[$this->typecovered], + $this->algorithm, + $this->labels, + $this->origttl, + gmmktime($e[4], $e[5], $e[6], $e[2], $e[3], $e[1]), + gmmktime($i[4], $i[5], $i[6], $i[2], $i[3], $i[1]), + $this->keytag + ); + + // + // the signer name is special; it's not allowed to be compressed + // (see section 3.1.7) + // + $names = explode('.', strtolower($this->signname)); + foreach ($names as $name) { + + $data .= chr(strlen($name)); + $data .= $name; + } + $data .= "\0"; + + // + // add the signature + // + $data .= base64_decode($this->signature); + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/RT.php b/include/pear/Net/DNS2/RR/RT.php new file mode 100644 index 0000000000000000000000000000000000000000..afbe966951cbb5295c20db024c8a96d35fcecbf7 --- /dev/null +++ b/include/pear/Net/DNS2/RR/RT.php @@ -0,0 +1,175 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: RT.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * RT Resource Record - RFC1183 section 3.3 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | preference | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / intermediate-host / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_RT extends Net_DNS2_RR +{ + /* + * the preference of this route + */ + public $preference; + + /* + * host which will servce as an intermediate in reaching the owner host + */ + public $intermediatehost; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->preference . ' ' . + $this->cleanString($this->intermediatehost) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->preference = $rdata[0]; + $this->intermediatehost = $this->cleanString($rdata[1]); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the preference + // + $x = unpack('npreference', $this->rdata); + + $this->preference = $x['preference']; + $offset = $packet->offset + 2; + + $this->intermediatehost = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->intermediatehost) > 0) { + + $data = pack('n', $this->preference); + $packet->offset += 2; + + $data .= $packet->compress($this->intermediatehost, $packet->offset); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/SIG.php b/include/pear/Net/DNS2/RR/SIG.php new file mode 100644 index 0000000000000000000000000000000000000000..4d6202066d0c6ecd425e02c4f8e76fc94c9d13a8 --- /dev/null +++ b/include/pear/Net/DNS2/RR/SIG.php @@ -0,0 +1,423 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: SIG.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + * This file contains code based off the Net::DNS::SEC Perl module by + * Olaf M. Kolkman + * + * This is the copyright notice from the PERL Net::DNS::SEC module: + * + * Copyright (c) 2001 - 2005 RIPE NCC. Author Olaf M. Kolkman + * Copyright (c) 2007 - 2008 NLnet Labs. Author Olaf M. Kolkman + * <olaf@net-dns.org> + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the author not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL + * AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +/** + * SIG Resource Record - RFC2535 section 4.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type Covered | Algorithm | Labels | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Original TTL | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Signature Expiration | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Signature Inception | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Key Tag | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Signer's Name / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / / + * / Signature / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_SIG extends Net_DNS2_RR +{ + /* + * and instance of a Net_DNS2_PrivateKey object + */ + public $private_key = null; + + /* + * the RR type covered by this signature + */ + public $typecovered; + + /* + * the algorithm used for the signature + */ + public $algorithm; + + /* + * the number of labels in the name + */ + public $labels; + + /* + * the original TTL + */ + public $origttl; + + /* + * the signature expiration + */ + public $sigexp; + + /* + * the inception of the signature + */ + public $sigincep; + + /* + * the keytag used + */ + public $keytag; + + /* + * the signer's name + */ + public $signname; + + /* + * the signature + */ + public $signature; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->typecovered . ' ' . $this->algorithm . ' ' . + $this->labels . ' ' . $this->origttl . ' ' . + $this->sigexp . ' ' . $this->sigincep . ' ' . + $this->keytag . ' ' . $this->cleanString($this->signname) . '. ' . + $this->signature; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->typecovered = strtoupper(array_shift($rdata)); + $this->algorithm = array_shift($rdata); + $this->labels = array_shift($rdata); + $this->origttl = array_shift($rdata); + $this->sigexp = array_shift($rdata); + $this->sigincep = array_shift($rdata); + $this->keytag = array_shift($rdata); + $this->signname = $this->cleanString(array_shift($rdata)); + + foreach ($rdata as $line) { + + $this->signature .= $line; + } + + $this->signature = trim($this->signature); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack + // + $x = unpack( + 'ntc/Calgorithm/Clabels/Norigttl/Nsigexp/Nsigincep/nkeytag', + $this->rdata + ); + + $this->typecovered = Net_DNS2_Lookups::$rr_types_by_id[$x['tc']]; + $this->algorithm = $x['algorithm']; + $this->labels = $x['labels']; + $this->origttl = Net_DNS2::expandUint32($x['origttl']); + + // + // the dates are in GM time + // + $this->sigexp = gmdate('YmdHis', $x['sigexp']); + $this->sigincep = gmdate('YmdHis', $x['sigincep']); + + // + // get the keytag + // + $this->keytag = $x['keytag']; + + // + // get teh signers name and signature + // + $offset = $packet->offset + 18; + $sigoffset = $offset; + + $this->signname = strtolower( + Net_DNS2_Packet::expand($packet, $sigoffset) + ); + $this->signature = base64_encode( + substr($this->rdata, 18 + ($sigoffset - $offset)) + ); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + // + // parse the values out of the dates + // + preg_match( + '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigexp, $e + ); + preg_match( + '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigincep, $i + ); + + // + // pack the value + // + $data = pack( + 'nCCNNNn', + Net_DNS2_Lookups::$rr_types_by_name[$this->typecovered], + $this->algorithm, + $this->labels, + $this->origttl, + gmmktime($e[4], $e[5], $e[6], $e[2], $e[3], $e[1]), + gmmktime($i[4], $i[5], $i[6], $i[2], $i[3], $i[1]), + $this->keytag + ); + + // + // the signer name is special; it's not allowed to be compressed + // (see section 3.1.7) + // + $names = explode('.', strtolower($this->signname)); + foreach ($names as $name) { + + $data .= chr(strlen($name)); + $data .= $name; + } + + $data .= chr('0'); + + // + // if the signature is empty, and $this->private_key is an instance of a + // private key object, and we have access to openssl, then assume this + // is a SIG(0), and generate a new signature + // + if ( (strlen($this->signature) == 0) + && ($this->private_key instanceof Net_DNS2_PrivateKey) + && (extension_loaded('openssl') === true) + ) { + + // + // create a new packet for the signature- + // + $new_packet = new Net_DNS2_Packet_Request('example.com', 'SOA', 'IN'); + + // + // copy the packet data over + // + $new_packet->copy($packet); + + // + // remove the SIG object from the additional list + // + array_pop($new_packet->additional); + $new_packet->header->arcount = count($new_packet->additional); + + // + // copy out the data + // + $sigdata = $data . $new_packet->get(); + + // + // based on the algorithm + // + $algorithm = 0; + + switch($this->algorithm) { + + // + // MD5 + // + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5: + + $algorithm = OPENSSL_ALGO_MD5; + break; + + // + // SHA1 + // + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1: + + $algorithm = OPENSSL_ALGO_SHA1; + break; + + // + // un-supported + // + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSA: + // + // DSA won't work in PHP until the OpenSSL extension has + // better DSA support + // + case Net_DNS2_Lookups::DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1: + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA256: + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA512: + case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSANSEC3SHA1: + default: + throw new Net_DNS2_Exception( + 'invalid or unsupported algorithm', + Net_DNS2_Lookups::E_OPENSSL_INV_ALGO + ); + break; + } + + // + // sign the data + // + if (openssl_sign( + $sigdata, $this->signature, $this->private_key->instance, $algorithm + ) == false) { + + throw new Net_DNS2_Exception( + openssl_error_string(), + Net_DNS2_Lookups::E_OPENSSL_ERROR + ); + } + + // + // add it locally encoded + // + $this->signature = base64_encode($this->signature); + } + + // + // add the signature + // + $data .= base64_decode($this->signature); + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/SOA.php b/include/pear/Net/DNS2/RR/SOA.php new file mode 100644 index 0000000000000000000000000000000000000000..5f92f87407e01f148e34ebe4a58d9e5aababa375 --- /dev/null +++ b/include/pear/Net/DNS2/RR/SOA.php @@ -0,0 +1,240 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: SOA.php 149 2012-03-02 01:08:19Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * SOA Resource Record - RFC1035 section 3.3.13 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / MNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / RNAME / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | SERIAL | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | REFRESH | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | RETRY | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | EXPIRE | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | MINIMUM | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_SOA extends Net_DNS2_RR +{ + /* + * The master DNS server + */ + public $mname; + + /* + * mailbox of the responsible person + */ + public $rname; + + /* + * serial number + */ + public $serial; + + /* + * refresh time + */ + public $refresh; + + /* + * retry interval + */ + public $retry; + + /* + * expire time + */ + public $expire; + + /* + * minimum TTL for any RR in this zone + */ + public $minimum; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->mname) . '. ' . + $this->cleanString($this->rname) . '. ' . + $this->serial . ' ' . $this->refresh . ' ' . $this->retry . ' ' . + $this->expire . ' ' . $this->minimum; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->mname = $this->cleanString($rdata[0]); + $this->rname = $this->cleanString($rdata[1]); + + $this->serial = $rdata[2]; + $this->refresh = $rdata[3]; + $this->retry = $rdata[4]; + $this->expire = $rdata[5]; + $this->minimum = $rdata[6]; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // parse the + // + $offset = $packet->offset; + + $this->mname = Net_DNS2_Packet::expand($packet, $offset); + $this->rname = Net_DNS2_Packet::expand($packet, $offset); + + // + // get the SOA values + // + $x = unpack( + '@' . $offset . '/Nserial/Nrefresh/Nretry/Nexpire/Nminimum/', + $packet->rdata + ); + + $this->serial = Net_DNS2::expandUint32($x['serial']); + $this->refresh = Net_DNS2::expandUint32($x['refresh']); + $this->retry = Net_DNS2::expandUint32($x['retry']); + $this->expire = Net_DNS2::expandUint32($x['expire']); + $this->minimum = Net_DNS2::expandUint32($x['minimum']); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->mname) > 0) { + + $data = $packet->compress($this->mname, $packet->offset); + $data .= $packet->compress($this->rname, $packet->offset); + + $data .= pack( + 'N5', $this->serial, $this->refresh, $this->retry, + $this->expire, $this->minimum + ); + + $packet->offset += 20; + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/SPF.php b/include/pear/Net/DNS2/RR/SPF.php new file mode 100644 index 0000000000000000000000000000000000000000..751d93ac808dedf27a01c9e57915c298150532ce --- /dev/null +++ b/include/pear/Net/DNS2/RR/SPF.php @@ -0,0 +1,75 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: SPF.php 47 2010-10-24 23:53:08Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * The SPF RR is implemented exactly like the TXT record, so + * for now we just extend the TXT RR and use it. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_SPF extends Net_DNS2_RR_TXT +{ +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/SRV.php b/include/pear/Net/DNS2/RR/SRV.php new file mode 100644 index 0000000000000000000000000000000000000000..616be99441059adea75f4d5078ea82d69d5e43f0 --- /dev/null +++ b/include/pear/Net/DNS2/RR/SRV.php @@ -0,0 +1,186 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: SRV.php 127 2011-12-03 03:29:39Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * SRV Resource Record - RFC2782 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PRIORITY | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | WEIGHT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PORT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / TARGET / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_SRV extends Net_DNS2_RR +{ + /* + * The priority of this target host. + */ + public $priority; + + /* + * a relative weight for entries with the same priority + */ + public $weight; + + /* + * The port on this target host of this service. + */ + public $port; + + /* + * The domain name of the target host + */ + public $target; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->priority . ' ' . $this->weight . ' ' . + $this->port . ' ' . $this->cleanString($this->target) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->priority = $rdata[0]; + $this->weight = $rdata[1]; + $this->port = $rdata[2]; + + $this->target = $this->cleanString($rdata[3]); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the priority, weight and port + // + $x = unpack('npriority/nweight/nport', $this->rdata); + + $this->priority = $x['priority']; + $this->weight = $x['weight']; + $this->port = $x['port']; + + $offset = $packet->offset + 6; + $this->target = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->target) > 0) { + + $data = pack('nnn', $this->priority, $this->weight, $this->port); + $packet->offset += 6; + + $data .= $packet->compress($this->target, $packet->offset); + + return $data; + } + + return null; + } +} + +?> diff --git a/include/pear/Net/DNS2/RR/SSHFP.php b/include/pear/Net/DNS2/RR/SSHFP.php new file mode 100644 index 0000000000000000000000000000000000000000..13022a6b87bca94252108a285d0524b58484c141 --- /dev/null +++ b/include/pear/Net/DNS2/RR/SSHFP.php @@ -0,0 +1,244 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: SSHFP.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * SSHFP Resource Record - RFC4255 section 3.1 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | algorithm | fp type | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / + * / / + * / fingerprint / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_SSHFP extends Net_DNS2_RR +{ + /* + * the algorithm used + */ + public $algorithm; + + /* + * The finger print type + */ + public $fp_type; + + /* + * the finger print data + */ + public $fingerprint; + + /* + * Algorithms + */ + const SSHFP_ALGORITHM_RES = 0; + const SSHFP_ALGORITHM_RSA = 1; + const SSHFP_ALGORITHM_DSS = 2; + + /* + * Fingerprint Types + */ + const SSHFP_FPTYPE_RES = 0; + const SSHFP_FPTYPE_SHA1 = 1; + + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->algorithm . ' ' . $this->fp_type . ' ' . $this->fingerprint; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // "The use of mnemonics instead of numbers is not allowed." + // + // RFC4255 section 3.2 + // + $algorithm = array_shift($rdata); + $fp_type = array_shift($rdata); + $fingerprint = strtolower(implode('', $rdata)); + + // + // There are only two algorithm's defined + // + if ( ($algorithm != self::SSHFP_ALGORITHM_RSA) + && ($algorithm != self::SSHFP_ALGORITHM_DSS) + ) { + return false; + } + + // + // there's only one fingerprint type currently implemented, so if it's not + // that, then fail. + // + if ($fp_type != self::SSHFP_FPTYPE_SHA1) { + return false; + } + + $this->algorithm = $algorithm; + $this->fp_type = $fp_type; + $this->fingerprint = $fingerprint; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the algorithm and finger print type + // + $x = unpack('Calgorithm/Cfp_type', $this->rdata); + + $this->algorithm = $x['algorithm']; + $this->fp_type = $x['fp_type']; + + // + // There are only two algorithm's defined + // + if ( ($this->algorithm != self::SSHFP_ALGORITHM_RSA) + && ($this->algorithm != self::SSHFP_ALGORITHM_DSS) + ) { + return false; + } + + // + // there's only one fingerprint type currently implemented, + // so if it's not that, then fail. + // + if ($this->fp_type != self::SSHFP_FPTYPE_SHA1) { + return false; + } + + // + // parse the finger print; this assumes SHA-1 + // + $fp = unpack('H*a', substr($this->rdata, 2)); + $this->fingerprint = strtolower($fp['a']); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->fingerprint) > 0) { + + $data = pack( + 'CCH*', $this->algorithm, $this->fp_type, $this->fingerprint + ); + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TA.php b/include/pear/Net/DNS2/RR/TA.php new file mode 100644 index 0000000000000000000000000000000000000000..0253dbe52099ffc4826a1762ed626cc8fc8c34b9 --- /dev/null +++ b/include/pear/Net/DNS2/RR/TA.php @@ -0,0 +1,75 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TA.php 130 2011-12-03 05:02:37Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.0 + * + */ + +/** + * The TA RR is implemented exactly like the DS record, so + * for now we just extend the DS RR and use it. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TA extends Net_DNS2_RR_DS +{ +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TALINK.php b/include/pear/Net/DNS2/RR/TALINK.php new file mode 100644 index 0000000000000000000000000000000000000000..33e938c5144d76caed2903478ae4f4499fe35456 --- /dev/null +++ b/include/pear/Net/DNS2/RR/TALINK.php @@ -0,0 +1,171 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TALINK.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.0 + * + */ + +/** + * TALINK Resource Record - DNSSEC Trust Anchor + * + * http://tools.ietf.org/id/draft-ietf-dnsop-dnssec-trust-history-00.txt + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / PREVIOUS / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / NEXT / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TALINK extends Net_DNS2_RR +{ + /* + * the previous domain name + */ + public $previous; + + /* + * the next domain name + */ + public $next; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cleanString($this->previous) . '. ' . + $this->cleanString($this->next) . '.'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->previous = $this->cleanString($rdata[0]); + $this->next = $this->cleanString($rdata[1]); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $offset = $packet->offset; + + $this->previous = Net_DNS2_Packet::label($packet, $offset); + $this->next = Net_DNS2_Packet::label($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if ( (strlen($this->previous) > 0) || (strlen($this->next) > 0) ) { + + $data = chr(strlen($this->previous)) . $this->previous . + chr(strlen($this->next)) . $this->next; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TKEY.php b/include/pear/Net/DNS2/RR/TKEY.php new file mode 100644 index 0000000000000000000000000000000000000000..115b8bb39ac8fbed242bfce044519686dce6e13c --- /dev/null +++ b/include/pear/Net/DNS2/RR/TKEY.php @@ -0,0 +1,307 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TKEY.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * TKEY Resource Record - RFC 2930 section 2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / ALGORITHM / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | INCEPTION | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | EXPIRATION | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | MODE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ERROR | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | KEY SIZE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / KEY DATA / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | OTHER SIZE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / OTHER DATA / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TKEY extends Net_DNS2_RR +{ + public $algorithm; + public $inception; + public $expiration; + public $mode; + public $error; + public $key_size; + public $key_data; + public $other_size; + public $other_data; + + /* + * TSIG Modes + */ + const TSIG_MODE_RES = 0; + const TSIG_MODE_SERV_ASSIGN = 1; + const TSIG_MODE_DH = 2; + const TSIG_MODE_GSS_API = 3; + const TSIG_MODE_RESV_ASSIGN = 4; + const TSIG_MODE_KEY_DELE = 5; + + /* + * map the mod id's to names so we can validate + */ + public $tsgi_mode_id_to_name = array( + + self::TSIG_MODE_RES => 'Reserved', + self::TSIG_MODE_SERV_ASSIGN => 'Server Assignment', + self::TSIG_MODE_DH => 'Diffie-Hellman', + self::TSIG_MODE_GSS_API => 'GSS-API', + self::TSIG_MODE_RESV_ASSIGN => 'Resolver Assignment', + self::TSIG_MODE_KEY_DELE => 'Key Deletion' + ); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->cleanString($this->algorithm) . '. ' . $this->mode; + if ($this->key_size > 0) { + + $out .= ' ' . trim($this->key_data, '.') . '.'; + } else { + + $out .= ' .'; + } + + return $out; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // data passed in is assumed: <algorithm> <mode> <key> + // + $this->algorithm = $this->cleanString(array_shift($rdata)); + $this->mode = array_shift($rdata); + $this->key_data = trim(array_shift($rdata), '.'); + + // + // the rest of the data is set manually + // + $this->inception = time(); + $this->expiration = time() + 86400; // 1 day + $this->error = 0; + $this->key_size = strlen($this->key_data); + $this->other_size = 0; + $this->other_data = ''; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // expand the algorithm + // + $offset = $packet->offset; + $this->algorithm = Net_DNS2_Packet::expand($packet, $offset); + + // + // unpack inception, expiration, mode, error and key size + // + $x = unpack( + '@' . $offset . '/Ninception/Nexpiration/nmode/nerror/nkey_size', + $packet->rdata + ); + + $this->inception = Net_DNS2::expandUint32($x['inception']); + $this->expiration = Net_DNS2::expandUint32($x['expiration']); + $this->mode = $x['mode']; + $this->error = $x['error']; + $this->key_size = $x['key_size']; + + $offset += 14; + + // + // if key_size > 0, then copy out the key + // + if ($this->key_size > 0) { + + $this->key_data = substr($packet->rdata, $offset, $this->key_size); + $offset += $this->key_size; + } + + // + // unpack the other length + // + $x = unpack('@' . $offset . '/nother_size', $packet->rdata); + + $this->other_size = $x['other_size']; + $offset += 2; + + // + // if other_size > 0, then copy out the data + // + if ($this->other_size > 0) { + + $this->other_data = substr( + $packet->rdata, $offset, $this->other_size + ); + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->algorithm) > 0) { + + // + // make sure the size values are correct + // + $this->key_size = strlen($this->key_data); + $this->other_size = strlen($this->other_data); + + // + // add the algorithm without compression + // + $data = Net_DNS2_Packet::pack($this->algorithm); + + // + // pack in the inception, expiration, mode, error and key size + // + $data .= pack( + 'NNnnn', $this->inception, $this->expiration, + $this->mode, 0, $this->key_size + ); + + // + // if the key_size > 0, then add the key + // + if ($this->key_size > 0) { + + $data .= $this->key_data; + } + + // + // pack in the other size + // + $data .= pack('n', $this->other_size); + if ($this->other_size > 0) { + + $data .= $this->other_data; + } + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TLSA.php b/include/pear/Net/DNS2/RR/TLSA.php new file mode 100644 index 0000000000000000000000000000000000000000..5eba7b5b19dc4a2909804c8fda0f6a2bbf330963 --- /dev/null +++ b/include/pear/Net/DNS2/RR/TLSA.php @@ -0,0 +1,194 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2012, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2012 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TLSA.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.5 + * + */ + +/** + * TLSA Resource Record - RFC 6698 + * + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Cert. Usage | Selector | Matching Type | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / + * / / + * / Certificate Association Data / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TLSA extends Net_DNS2_RR +{ + /* + * The Certificate Usage Field + */ + public $cert_usage; + + /* + * The Selector Field + */ + public $selector; + + /* + * The Matching Type Field + */ + public $matching_type; + + /* + * The Certificate Association Data Field + */ + public $certificate; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->cert_usage . ' ' . $this->selector . ' ' . + $this->matching_type . ' ' . base64_encode($this->certificate); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->cert_usage = array_shift($rdata); + $this->selector = array_shift($rdata); + $this->matching_type = array_shift($rdata); + $this->certificate = base64_decode(implode('', $rdata)); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the format, keytag and algorithm + // + $x = unpack('Cusage/Cselector/Ctype', $this->rdata); + + $this->cert_usage = $x['usage']; + $this->selector = $x['selector']; + $this->matching_type = $x['type']; + + // + // copy the certificate + // + $this->certificate = substr($this->rdata, 3, $this->rdlength - 3); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->certificate) > 0) { + + $data = pack( + 'CCC', $this->cert_usage, $this->selector, $this->matching_type + ) . $this->certificate; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TSIG.php b/include/pear/Net/DNS2/RR/TSIG.php new file mode 100644 index 0000000000000000000000000000000000000000..472107585b3c5cb27d63c9223088dbb8dcc27298 --- /dev/null +++ b/include/pear/Net/DNS2/RR/TSIG.php @@ -0,0 +1,504 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TSIG.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * TSIG Resource Record - RFC 2845 + * + * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / algorithm / + * / / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | time signed | + * | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | fudge | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | mac size | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / + * / mac / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | original id | error | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | other length | / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / + * / other data / + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TSIG extends Net_DNS2_RR +{ + /* + * TSIG Algorithm Identifiers + */ + const HMAC_MD5 = 'hmac-md5.sig-alg.reg.int'; // RFC 2845, required + const GSS_TSIG = 'gss-tsig'; // unsupported, optional + const HMAC_SHA1 = 'hmac-sha1'; // RFC 4635, required + const HMAC_SHA224 = 'hmac-sha224'; // RFC 4635, optional + const HMAC_SHA256 = 'hmac-sha256'; // RFC 4635, required + const HMAC_SHA384 = 'hmac-sha384'; // RFC 4635, optional + const HMAC_SHA512 = 'hmac-sha512'; // RFC 4635, optional + + /* + * the map of hash values to names + */ + public static $hash_algorithms = array( + + self::HMAC_MD5 => 'md5', + self::HMAC_SHA1 => 'sha1', + self::HMAC_SHA224 => 'sha224', + self::HMAC_SHA256 => 'sha256', + self::HMAC_SHA384 => 'sha384', + self::HMAC_SHA512 => 'sha512' + ); + + /* + * algorithm used; only supports HMAC-MD5 + */ + public $algorithm; + + /* + * The time it was signed + */ + public $time_signed; + + /* + * fudge- allowed offset from the time signed + */ + public $fudge; + + /* + * size of the digest + */ + public $mac_size; + + /* + * the digest data + */ + public $mac; + + /* + * the original id of the request + */ + public $original_id; + + /* + * additional error code + */ + public $error; + + /* + * length of the "other" data, should only ever be 0 when there is + * no error, or 6 when there is the error RCODE_BADTIME + */ + public $other_length; + + /* + * the other data; should only ever be a timestamp when there is the + * error RCODE_BADTIME + */ + public $other_data; + + /* + * the key to use for signing - passed in, not included in the rdata + */ + public $key; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $out = $this->cleanString($this->algorithm) . '. ' . + $this->time_signed . ' ' . + $this->fudge . ' ' . $this->mac_size . ' ' . + base64_encode($this->mac) . ' ' . $this->original_id . ' ' . + $this->error . ' '. $this->other_length; + + if ($this->other_length > 0) { + + $out .= ' ' . $this->other_data; + } + + return $out; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + // + // the only value passed in is the key- + // + // this assumes it's passed in base64 encoded. + // + $this->key = preg_replace('/\s+/', '', array_shift($rdata)); + + // + // the rest of the data is set to default + // + $this->algorithm = self::HMAC_MD5; + $this->time_signed = time(); + $this->fudge = 300; + $this->mac_size = 0; + $this->mac = ''; + $this->original_id = 0; + $this->error = 0; + $this->other_length = 0; + $this->other_data = ''; + + // + // per RFC 2845 section 2.3 + // + $this->class = 'ANY'; + $this->ttl = 0; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // expand the algorithm + // + $newoffset = $packet->offset; + $this->algorithm = Net_DNS2_Packet::expand($packet, $newoffset); + $offset = $newoffset - $packet->offset; + + // + // unpack time, fudge and mac_size + // + $x = unpack( + '@' . $offset . '/ntime_high/Ntime_low/nfudge/nmac_size', + $this->rdata + ); + + $this->time_signed = Net_DNS2::expandUint32($x['time_low']); + $this->fudge = $x['fudge']; + $this->mac_size = $x['mac_size']; + + $offset += 10; + + // + // copy out the mac + // + if ($this->mac_size > 0) { + + $this->mac = substr($this->rdata, $offset, $this->mac_size); + $offset += $this->mac_size; + } + + // + // unpack the original id, error, and other_length values + // + $x = unpack( + '@' . $offset . '/noriginal_id/nerror/nother_length', + $this->rdata + ); + + $this->original_id = $x['original_id']; + $this->error = $x['error']; + $this->other_length = $x['other_length']; + + // + // the only time there is actually any "other data", is when there's + // a BADTIME error code. + // + // The other length should be 6, and the other data field includes the + // servers current time - per RFC 2845 section 4.5.2 + // + if ($this->error == Net_DNS2_Lookups::RCODE_BADTIME) { + + if ($this->other_length != 6) { + + return false; + } + + // + // other data is a 48bit timestamp + // + $x = unpack( + 'nhigh/nlow', + substr($this->rdata, $offset + 6, $this->other_length) + ); + $this->other_data = $x['low']; + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->key) > 0) { + + // + // create a new packet for the signature- + // + $new_packet = new Net_DNS2_Packet_Request('example.com', 'SOA', 'IN'); + + // + // copy the packet data over + // + $new_packet->copy($packet); + + // + // remove the TSIG object from the additional list + // + array_pop($new_packet->additional); + $new_packet->header->arcount = count($new_packet->additional); + + // + // copy out the data + // + $sig_data = $new_packet->get(); + + // + // add the name without compressing + // + $sig_data .= Net_DNS2_Packet::pack($this->name); + + // + // add the class and TTL + // + $sig_data .= pack( + 'nN', Net_DNS2_Lookups::$classes_by_name[$this->class], $this->ttl + ); + + // + // add the algorithm name without compression + // + $sig_data .= Net_DNS2_Packet::pack(strtolower($this->algorithm)); + + // + // add the rest of the values + // + $sig_data .= pack( + 'nNnnn', 0, $this->time_signed, $this->fudge, + $this->error, $this->other_length + ); + if ($this->other_length > 0) { + + $sig_data .= pack('nN', 0, $this->other_data); + } + + // + // sign the data + // + $this->mac = $this->_signHMAC( + $sig_data, base64_decode($this->key), $this->algorithm + ); + $this->mac_size = strlen($this->mac); + + // + // compress the algorithm + // + $data = Net_DNS2_Packet::pack(strtolower($this->algorithm)); + + // + // pack the time, fudge and mac size + // + $data .= pack( + 'nNnn', 0, $this->time_signed, $this->fudge, $this->mac_size + ); + $data .= $this->mac; + + // + // check the error and other_length + // + if ($this->error == Net_DNS2_Lookups::RCODE_BADTIME) { + + $this->other_length = strlen($this->other_data); + if ($this->other_length != 6) { + + return null; + } + } else { + + $this->other_length = 0; + $this->other_data = ''; + } + + // + // pack the id, error and other_length + // + $data .= pack( + 'nnn', $packet->header->id, $this->error, $this->other_length + ); + if ($this->other_length > 0) { + + $data .= pack('nN', 0, $this->other_data); + } + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } + + /** + * signs the given data with the given key, and returns the result + * + * @param string $data the data to sign + * @param string $key key to use for signing + * @param string $algorithm the algorithm to use; defaults to MD5 + * + * @return string the signed digest + * @throws Net_DNS2_Exception + * @access private + * + */ + private function _signHMAC($data, $key = null, $algorithm = self::HMAC_MD5) + { + // + // use the hash extension; this is included by default in >= 5.1.2 which + // is our dependent version anyway- so it's easy to switch to it. + // + if (extension_loaded('hash')) { + + if (!isset(self::$hash_algorithms[$algorithm])) { + + throw new Net_DNS2_Exception( + 'invalid or unsupported algorithm', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + return hash_hmac(self::$hash_algorithms[$algorithm], $data, $key, true); + } + + // + // if the hash extension isn't loaded, and they selected something other + // than MD5, throw an exception + // + if ($algorithm != self::HMAC_MD5) { + + throw new Net_DNS2_Exception( + 'only HMAC-MD5 supported. please install the php-extension ' . + '"hash" in order to use the sha-family', + Net_DNS2_Lookups::E_PARSE_ERROR + ); + } + + // + // otherwise, do it ourselves + // + if (is_null($key)) { + + return pack('H*', md5($data)); + } + + $key = str_pad($key, 64, chr(0x00)); + if (strlen($key) > 64) { + + $key = pack('H*', md5($key)); + } + + $k_ipad = $key ^ str_repeat(chr(0x36), 64); + $k_opad = $key ^ str_repeat(chr(0x5c), 64); + + return $this->_signHMAC( + $k_opad . pack('H*', md5($k_ipad . $data)), null, $algorithm + ); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/TXT.php b/include/pear/Net/DNS2/RR/TXT.php new file mode 100644 index 0000000000000000000000000000000000000000..3e86ce7e35415818a726e4b0da8372fcac930a93 --- /dev/null +++ b/include/pear/Net/DNS2/RR/TXT.php @@ -0,0 +1,177 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: TXT.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * TXT Resource Record - RFC1035 section 3.3.14 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / TXT-DATA / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_TXT extends Net_DNS2_RR +{ + /* + * an array of the text strings + */ + public $text = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + if (count($this->text) == 0) { + return '""'; + } + + $data = ''; + + foreach ($this->text as $t) { + + $data .= $this->formatString($t) . ' '; + } + + return trim($data); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = $this->buildString($rdata); + if (count($data) > 0) { + + $this->text = $data; + } + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $length = $packet->offset + $this->rdlength; + $offset = $packet->offset; + + while ($length > $offset) { + + $this->text[] = Net_DNS2_Packet::label($packet, $offset); + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + $data = null; + + foreach ($this->text as $t) { + + $data .= chr(strlen($t)) . $t; + } + + $packet->offset += strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/URI.php b/include/pear/Net/DNS2/RR/URI.php new file mode 100644 index 0000000000000000000000000000000000000000..aef788b823d8be9e641d0ac041b4b89ee6fcf09e --- /dev/null +++ b/include/pear/Net/DNS2/RR/URI.php @@ -0,0 +1,183 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2011 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: URI.php 132 2011-12-03 05:28:54Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.2.0 + * + */ + +/** + * URI Resource Record - http://tools.ietf.org/html/draft-faltstrom-uri-06 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PRIORITY | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | WEIGHT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / TARGET / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_URI extends Net_DNS2_RR +{ + /* + * The priority of this target host. + */ + public $priority; + + /* + * a relative weight for entries with the same priority + */ + public $weight; + + /* + * The domain name of the target host + */ + public $target; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + // + // presentation format has double quotes (") around the target. + // + return $this->priority . ' ' . $this->weight . ' "' . + $this->cleanString($this->target) . '"'; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->priority = $rdata[0]; + $this->weight = $rdata[1]; + + // + // make sure to trim the lead/trailing double quote if it's there. + // + $this->target = trim($this->cleanString($rdata[2]), '"'); + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // unpack the priority and weight + // + $x = unpack('npriority/nweight', $this->rdata); + + $this->priority = $x['priority']; + $this->weight = $x['weight']; + + $offset = $packet->offset + 4; + $this->target = Net_DNS2_Packet::expand($packet, $offset); + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->target) > 0) { + + $data = pack('nn', $this->priority, $this->weight); + $packet->offset += 4; + + $data .= $packet->compress(trim($this->target, '"'), $packet->offset); + + return $data; + } + + return null; + } +} + +?> diff --git a/include/pear/Net/DNS2/RR/WKS.php b/include/pear/Net/DNS2/RR/WKS.php new file mode 100644 index 0000000000000000000000000000000000000000..437eb52ed7c09708dad044d74bf810d2616d626c --- /dev/null +++ b/include/pear/Net/DNS2/RR/WKS.php @@ -0,0 +1,235 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: WKS.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 1.0.1 + * + */ + +/** + * WKS Resource Record - RFC1035 section 3.4.2 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ADDRESS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | PROTOCOL | | + * +--+--+--+--+--+--+--+--+ | + * | | + * / <BIT MAP> / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_WKS extends Net_DNS2_RR +{ + /* + * The IP address of the service + */ + public $address; + + /* + * The protocol of the service + */ + public $protocol; + + /* + * bitmap + */ + public $bitmap = array(); + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + $data = $this->address . ' ' . $this->protocol; + + foreach ($this->bitmap as $port) { + $data .= ' ' . $port; + } + + return $data; + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $this->address = strtolower(trim(array_shift($rdata), '.')); + $this->protocol = array_shift($rdata); + $this->bitmap = $rdata; + + return true; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + // + // get the address and protocol value + // + $x = unpack('Naddress/Cprotocol', $this->rdata); + + $this->address = long2ip($x['address']); + $this->protocol = $x['protocol']; + + // + // unpack the port list bitmap + // + $port = 0; + foreach (unpack('@5/C*', $this->rdata) as $set) { + + $s = sprintf('%08b', $set); + + for ($i=0; $i<8; $i++, $port++) { + if ($s[$i] == '1') { + $this->bitmap[] = $port; + } + } + } + + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->address) > 0) { + + $data = pack('NC', ip2long($this->address), $this->protocol); + + $ports = array(); + + $n = 0; + foreach ($this->bitmap as $port) { + $ports[$port] = 1; + + if ($port > $n) { + $n = $port; + } + } + for ($i=0; $i<ceil($n/8)*8; $i++) { + if (!isset($ports[$i])) { + $ports[$i] = 0; + } + } + + ksort($ports); + + $string = ''; + $n = 0; + + foreach ($ports as $s) { + + $string .= $s; + $n++; + + if ($n == 8) { + + $data .= chr(bindec($string)); + $string = ''; + $n = 0; + } + } + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/RR/X25.php b/include/pear/Net/DNS2/RR/X25.php new file mode 100644 index 0000000000000000000000000000000000000000..b1e6cfde43bd5f0e5fa54d9387e3f22e0cf9e3ef --- /dev/null +++ b/include/pear/Net/DNS2/RR/X25.php @@ -0,0 +1,160 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: X25.php 179 2012-11-23 05:49:01Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * X25 Resource Record - RFC1183 section 3.1 + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * / PSDN-address / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_RR + * + */ +class Net_DNS2_RR_X25 extends Net_DNS2_RR +{ + /* + * The PSDN address + */ + public $psdnaddress; + + /** + * method to return the rdata portion of the packet as a string + * + * @return string + * @access protected + * + */ + protected function rrToString() + { + return $this->formatString($this->psdnaddress); + } + + /** + * parses the rdata portion from a standard DNS config line + * + * @param array $rdata a string split line of values for the rdata + * + * @return boolean + * @access protected + * + */ + protected function rrFromString(array $rdata) + { + $data = $this->buildString($rdata); + if (count($data) == 1) { + + $this->psdnaddress = $data[0]; + return true; + } + + return false; + } + + /** + * parses the rdata of the Net_DNS2_Packet object + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from + * + * @return boolean + * @access protected + * + */ + protected function rrSet(Net_DNS2_Packet &$packet) + { + if ($this->rdlength > 0) { + + $this->psdnaddress = Net_DNS2_Packet::label($packet, $packet->offset); + return true; + } + + return false; + } + + /** + * returns the rdata portion of the DNS packet + * + * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for + * compressed names + * + * @return mixed either returns a binary packed + * string or null on failure + * @access protected + * + */ + protected function rrGet(Net_DNS2_Packet &$packet) + { + if (strlen($this->psdnaddress) > 0) { + + $data = chr(strlen($this->psdnaddress)) . $this->psdnaddress; + + $packet->offset += strlen($data); + + return $data; + } + + return null; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Resolver.php b/include/pear/Net/DNS2/Resolver.php new file mode 100644 index 0000000000000000000000000000000000000000..fdb99e04d25277d3f32a064ff8904ee1b9c506db --- /dev/null +++ b/include/pear/Net/DNS2/Resolver.php @@ -0,0 +1,332 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Resolver.php 191 2013-04-07 23:28:20Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * This is the main resolver class, providing DNS query functions. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2 + * + */ +class Net_DNS2_Resolver extends Net_DNS2 +{ + /** + * Constructor - creates a new Net_DNS2_Resolver object + * + * @param mixed $options either an array with options or null + * + * @access public + * + */ + public function __construct(array $options = null) + { + parent::__construct($options); + } + + /** + * does a basic DNS lookup query + * + * @param string $name the DNS name to loookup + * @param string $type the name of the RR type to lookup + * @param string $class the name of the RR class to lookup + * + * @return Net_DNS_RR object + * @throws Net_DNS2_Exception + * @access public + * + */ + public function query($name, $type = 'A', $class = 'IN') + { + // + // make sure we have some name servers set + // + $this->checkServers(Net_DNS2::RESOLV_CONF); + + // + // we dont' support incremental zone tranfers; so if it's requested, a full + // zone transfer can be returned + // + if ($type == 'IXFR') { + + $type = 'AXFR'; + } + + // + // if the name *looks* too short, then append the domain from the config + // + if ( (strpos($name, '.') === false) && ($type != 'PTR') ) { + + $name .= '.' . strtolower($this->domain); + } + + // + // create a new packet based on the input + // + $packet = new Net_DNS2_Packet_Request($name, $type, $class); + + // + // check for an authentication method; either TSIG or SIG + // + if ( ($this->auth_signature instanceof Net_DNS2_RR_TSIG) + || ($this->auth_signature instanceof Net_DNS2_RR_SIG) + ) { + $packet->additional[] = $this->auth_signature; + $packet->header->arcount = count($packet->additional); + } + + // + // check for the DNSSEC flag, and if it's true, then add an OPT + // RR to the additional section, and set the DO flag to 1. + // + if ($this->dnssec == true) { + + // + // create a new OPT RR + // + $opt = new Net_DNS2_RR_OPT(); + + // + // set the DO flag, and the other values + // + $opt->do = 1; + $opt->class = $this->dnssec_payload_size; + + // + // add the RR to the additional section. + // + $packet->additional[] = $opt; + $packet->header->arcount = count($packet->additional); + } + + // + // set the DNSSEC AD or CD bits + // + if ($this->dnssec_ad_flag == true) { + + $packet->header->ad = 1; + } + if ($this->dnssec_cd_flag == true) { + + $packet->header->cd = 1; + } + + // + // if caching is turned on, then check then hash the question, and + // do a cache lookup. + // + // don't use the cache for zone transfers + // + $packet_hash = ''; + + if ( ($this->use_cache == true) && ($this->cacheable($type) == true) ) { + + // + // open the cache + // + $this->cache->open( + $this->cache_file, $this->cache_size, $this->cache_serializer + ); + + // + // build the key and check for it in the cache. + // + $packet_hash = md5( + $packet->question[0]->qname . '|' . $packet->question[0]->qtype + ); + + if ($this->cache->has($packet_hash)) { + + return $this->cache->get($packet_hash); + } + } + + // + // set the RD (recursion desired) bit to 1 / 0 depending on the config + // setting. + // + if ($this->recurse == false) { + $packet->header->rd = 0; + } else { + $packet->header->rd = 1; + } + + // + // send the packet and get back the response + // + // *always* use TCP for zone transfers- does this cause any problems? + // + $response = $this->sendPacket( + $packet, ($type == 'AXFR') ? true : $this->use_tcp + ); + + // + // if strict mode is enabled, then make sure that the name that was + // looked up is *actually* in the response object. + // + // only do this is strict_query_mode is turned on, AND we've received + // some answers; no point doing any else if there were no answers. + // + if ( ($this->strict_query_mode == true) + && ($response->header->ancount > 0) + ) { + + $found = false; + + // + // look for the requested name/type/class + // + foreach ($response->answer as $index => $object) { + + if ( (strcasecmp($object->name, $name) == 0) + && ($object->type == $type) + && ($object->class == $class) + ) { + $found = true; + break; + } + } + + // + // if it's not found, then unset the answer section; it's not correct to + // throw an exception here; if the hostname didn't exist, then + // sendPacket() would have already thrown an NXDOMAIN error- so the host + // *exists*, but just not the request type/class. + // + // the correct response in this case, is an empty answer section; the + // authority section may still have usual information, like a SOA record. + // + if ($found == false) { + + $response->answer = array(); + $response->header->ancount = 0; + } + } + + // + // cache the response object + // + if ( ($this->use_cache == true) && ($this->cacheable($type) == true) ) { + + $this->cache->put($packet_hash, $response); + } + + return $response; + } + + /** + * does an inverse query for the given RR; most DNS servers do not implement + * inverse queries, but they should be able to return "not implemented" + * + * @param Net_DNS2_RR $rr the RR object to lookup + * + * @return Net_DNS_RR object + * @throws Net_DNS2_Exception + * @access public + * + */ + public function iquery(Net_DNS2_RR $rr) + { + // + // make sure we have some name servers set + // + $this->checkServers(Net_DNS2::RESOLV_CONF); + + // + // create an empty packet + // + $packet = new Net_DNS2_Packet_Request($rr->name, 'A', 'IN'); + + // + // unset the question + // + $packet->question = array(); + $packet->header->qdcount = 0; + + // + // set the opcode to IQUERY + // + $packet->header->opcode = Net_DNS2_Lookups::OPCODE_IQUERY; + + // + // add the given RR as the answer + // + $packet->answer[] = $rr; + $packet->header->ancount = 1; + + // + // check for an authentication method; either TSIG or SIG + // + if ( ($this->auth_signature instanceof Net_DNS2_RR_TSIG) + || ($this->auth_signature instanceof Net_DNS2_RR_SIG) + ) { + $packet->additional[] = $this->auth_signature; + $packet->header->arcount = count($packet->additional); + } + + // + // send the packet and get back the response + // + return $this->sendPacket($packet, $this->use_tcp); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Socket.php b/include/pear/Net/DNS2/Socket.php new file mode 100644 index 0000000000000000000000000000000000000000..090d2cbee45496478ee5aa31a9378eeb6878c585 --- /dev/null +++ b/include/pear/Net/DNS2/Socket.php @@ -0,0 +1,189 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Socket.php 176 2012-11-16 02:14:09Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/* + * check to see if the socket defines exist; if they don't, then define them + */ +if (defined('SOCK_STREAM') == false) { + define('SOCK_STREAM', 1); +} +if (defined('SOCK_DGRAM') == false) { + define('SOCK_DGRAM', 2); +} + +/** + * This is the abstract base class for the two sockets classes; this simply + * provides the class definition for the two sockets classes. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Socket_Sockets, Net_DNS2_Socket_Streams + * + */ +abstract class Net_DNS2_Socket +{ + protected $sock; + protected $type; + protected $host; + protected $port; + protected $timeout; + + protected $local_host; + protected $local_port; + + public $last_error; + + /* + * type of sockets + */ + const SOCK_STREAM = SOCK_STREAM; + const SOCK_DGRAM = SOCK_DGRAM; + + /** + * constructor - set the port details + * + * @param integer $type the socket type + * @param string $host the IP address of the DNS server to connect to + * @param integer $port the port of the DNS server to connect to + * @param integer $timeout the timeout value to use for socket functions + * + * @access public + * + */ + public function __construct($type, $host, $port, $timeout) + { + $this->type = $type; + $this->host = $host; + $this->port = $port; + $this->timeout = $timeout; + } + + /** + * destructor + * + * @access public + */ + public function __destruct() + { + $this->close(); + } + + /** + * sets the local address/port for the socket to bind to + * + * @param string $address the local IP address to bind to + * @param mixed $port the local port to bind to, or 0 to let the socket + * function select a port + * + * @return boolean + * @access public + * + */ + public function bindAddress($address, $port = 0) + { + $this->local_host = $address; + $this->local_port = $port; + + return true; + } + + /** + * opens a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + abstract public function open(); + + /** + * closes a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + abstract public function close(); + + /** + * writes the given string to the DNS server socket + * + * @param string $data a binary packed DNS packet + * + * @return boolean + * @access public + * + */ + abstract public function write($data); + + /** + * reads a response from a DNS server + * + * @param integer &$size the size of the DNS packet read is passed back + * + * @return mixed returns the data on success and false on error + * @access public + * + */ + abstract public function read(&$size); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Socket/Sockets.php b/include/pear/Net/DNS2/Socket/Sockets.php new file mode 100644 index 0000000000000000000000000000000000000000..e17c73a9ae88aa9bf4e87433aefa33d05fd36243 --- /dev/null +++ b/include/pear/Net/DNS2/Socket/Sockets.php @@ -0,0 +1,370 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Sockets.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * Socket handling class using the PHP sockets extension + * + * The sockets extension is faster than the stream functions in PHP, but it's + * not standard. So if the extension is loaded, then this class is used, if + * it's not, then the Net_DNS2_Socket_Streams class is used. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Socket + * + */ +class Net_DNS2_Socket_Sockets extends Net_DNS2_Socket +{ + /** + * opens a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + public function open() + { + // + // create the socket + // + if (Net_DNS2::isIPv4($this->host) == true) { + + $this->sock = @socket_create( + AF_INET, $this->type, + ($this->type == Net_DNS2_Socket::SOCK_STREAM) ? SOL_TCP : SOL_UDP + ); + + } else if (Net_DNS2::isIPv6($this->host) == true) { + + $this->sock = @socket_create( + AF_INET6, $this->type, + ($this->type == Net_DNS2_Socket::SOCK_STREAM) ? SOL_TCP : SOL_UDP + ); + + } else { + + $this->last_error = 'invalid address type: ' . $this->host; + return false; + } + + if ($this->sock === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + @socket_set_option($this->sock, SOL_SOCKET, SO_REUSEADDR, 1); + + // + // bind to a local IP/port if it's set + // + if (strlen($this->local_host) > 0) { + + $result = @socket_bind( + $this->sock, $this->local_host, + ($this->local_port > 0) ? $this->local_port : null + ); + if ($result === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + } + + // + // mark the socket as non-blocking + // + if (@socket_set_nonblock($this->sock) === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + // + // connect to the socket; don't check for status here, we'll check it on the + // socket_select() call so we can handle timeouts properly + // + @socket_connect($this->sock, $this->host, $this->port); + + $read = null; + $write = array($this->sock); + $except = null; + + // + // select on write to check if the call to connect worked + // + switch(@socket_select($read, $write, $except, $this->timeout)) { + case false: + $this->last_error = socket_strerror(socket_last_error()); + return false; + break; + + case 0: + return false; + break; + + default: + ; + } + + return true; + } + + /** + * closes a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + public function close() + { + if (is_resource($this->sock) === true) { + + @socket_close($this->sock); + } + return true; + } + + /** + * writes the given string to the DNS server socket + * + * @param string $data a binary packed DNS packet + * + * @return boolean + * @access public + * + */ + public function write($data) + { + $length = strlen($data); + if ($length == 0) { + + $this->last_error = 'empty data on write()'; + return false; + } + + $read = null; + $write = array($this->sock); + $except = null; + + // + // select on write + // + switch(@socket_select($read, $write, $except, $this->timeout)) { + case false: + $this->last_error = socket_strerror(socket_last_error()); + return false; + break; + + case 0: + return false; + break; + + default: + ; + } + + // + // if it's a TCP socket, then we need to packet and send the length of the + // data as the first 16bit of data. + // + if ($this->type == Net_DNS2_Socket::SOCK_STREAM) { + + $s = chr($length >> 8) . chr($length); + + if (@socket_write($this->sock, $s) === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + } + + // + // write the data to the socket + // + $size = @socket_write($this->sock, $data); + if ( ($size === false) || ($size != $length) ) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + return true; + } + + /** + * reads a response from a DNS server + * + * @param integer &$size the size of the DNS packet read is passed back + * + * @return mixed returns the data on success and false on error + * @access public + * + */ + public function read(&$size) + { + $read = array($this->sock); + $write = null; + $except = null; + + // + // make sure our socket is non-blocking + // + if (@socket_set_nonblock($this->sock) === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + // + // select on read + // + switch(@socket_select($read, $write, $except, $this->timeout)) { + case false: + $this->last_error = socket_strerror(socket_last_error()); + return false; + break; + + case 0: + return false; + break; + + default: + ; + } + + $data = ''; + $length = Net_DNS2_Lookups::DNS_MAX_UDP_SIZE; + + // + // if it's a TCP socket, then the first two bytes is the length of the DNS + // packet- we need to read that off first, then use that value for the + // packet read. + // + if ($this->type == Net_DNS2_Socket::SOCK_STREAM) { + + if (($size = @socket_recv($this->sock, $data, 2, 0)) === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + $length = ord($data[0]) << 8 | ord($data[1]); + if ($length < Net_DNS2_Lookups::DNS_HEADER_SIZE) { + + return false; + } + } + + // + // at this point, we know that there is data on the socket to be read, + // because we've already extracted the length from the first two bytes. + // + // so the easiest thing to do, is just turn off socket blocking, and + // wait for the data. + // + if (@socket_set_block($this->sock) === false) { + + $this->last_error = socket_strerror(socket_last_error()); + return false; + } + + // + // read the data from the socket + // + // loop while reading since some OS's (specifically Win < 2003) don't support + // MSG_WAITALL properly, so they may return with less data than is available. + // + // According to M$, XP and below don't support MSG_WAITALL at all; and there + // also seems to be some issue in 2003 and 2008 where the MSG_WAITALL is + // defined as 0, but if you actually pass 8 (which is the correct defined + // value), it works as it's supposed to- so in these cases, it's just the + // define that's incorrect- this is likely a PHP issue. + // + $data = ''; + $size = 0; + + while (1) { + + $chunk_size = @socket_recv($this->sock, $chunk, $length, MSG_WAITALL); + if ($chunk_size === false) { + + $size = $chunk_size; + $this->last_error = socket_strerror(socket_last_error()); + + return false; + } + + $data .= $chunk; + $size += $chunk_size; + + $length -= $chunk_size; + if ( ($length <= 0) || ($this->type == Net_DNS2_Socket::SOCK_DGRAM) ) { + break; + } + } + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Socket/Streams.php b/include/pear/Net/DNS2/Socket/Streams.php new file mode 100644 index 0000000000000000000000000000000000000000..08a09704a9a940d13b4c6b605af4bf1f0608e687 --- /dev/null +++ b/include/pear/Net/DNS2/Socket/Streams.php @@ -0,0 +1,393 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Streams.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * Socket handling class using the PHP Streams + * + * The sockets extension is faster than the stream functions in PHP, but it's + * not standard. So if the extension is loaded, then the Net_DNS_Socket_Sockets + * class it used, otherwise, this class it used. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2_Socket + * + */ +class Net_DNS2_Socket_Streams extends Net_DNS2_Socket +{ + private $_context; + + /** + * opens a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + public function open() + { + // + // create a list of options for the context + // + $opts = array('socket' => array()); + + // + // bind to a local IP/port if it's set + // + if (strlen($this->local_host) > 0) { + + $opts['socket']['bindto'] = $this->local_host; + if ($this->local_port > 0) { + + $opts['socket']['bindto'] .= ':' . $this->local_port; + } + } + + // + // create the context + // + $this->_context = @stream_context_create($opts); + + // + // create socket + // + $errno; + $errstr; + + switch($this->type) { + case Net_DNS2_Socket::SOCK_STREAM: + + if (Net_DNS2::isIPv4($this->host) == true) { + + $this->sock = @stream_socket_client( + 'tcp://' . $this->host . ':' . $this->port, + $errno, $errstr, $this->timeout, + STREAM_CLIENT_CONNECT, $this->_context + ); + } else if (Net_DNS2::isIPv6($this->host) == true) { + + $this->sock = @stream_socket_client( + 'tcp://[' . $this->host . ']:' . $this->port, + $errno, $errstr, $this->timeout, + STREAM_CLIENT_CONNECT, $this->_context + ); + } else { + + $this->last_error = 'invalid address type: ' . $this->host; + return false; + } + + break; + + case Net_DNS2_Socket::SOCK_DGRAM: + + if (Net_DNS2::isIPv4($this->host) == true) { + + $this->sock = @stream_socket_client( + 'udp://' . $this->host . ':' . $this->port, + $errno, $errstr, $this->timeout, + STREAM_CLIENT_CONNECT, $this->_context + ); + } else if (Net_DNS2::isIPv6($this->host) == true) { + + $this->sock = @stream_socket_client( + 'udp://[' . $this->host . ']:' . $this->port, + $errno, $errstr, $this->timeout, + STREAM_CLIENT_CONNECT, $this->_context + ); + } else { + + $this->last_error = 'invalid address type: ' . $this->host; + return false; + } + + break; + + default: + $this->last_error = 'Invalid socket type: ' . $this->type; + return false; + } + + if ($this->sock === false) { + + $this->last_error = $errstr; + return false; + } + + // + // set it to non-blocking and set the timeout + // + @stream_set_blocking($this->sock, 0); + @stream_set_timeout($this->sock, $this->timeout); + + return true; + } + + /** + * closes a socket connection to the DNS server + * + * @return boolean + * @access public + * + */ + public function close() + { + if (is_resource($this->sock) === true) { + + @fclose($this->sock); + } + return true; + } + + /** + * writes the given string to the DNS server socket + * + * @param string $data a binary packed DNS packet + * + * @return boolean + * @access public + * + */ + public function write($data) + { + $length = strlen($data); + if ($length == 0) { + + $this->last_error = 'empty data on write()'; + return false; + } + + $read = null; + $write = array($this->sock); + $except = null; + + // + // select on write + // + switch(@stream_select($read, $write, $except, $this->timeout)) { + case false: + $this->last_error = 'failed on stream_select()'; + return false; + break; + + case 0: + return false; + break; + + default: + ; + } + + // + // if it's a TCP socket, then we need to packet and send the length of the + // data as the first 16bit of data. + // + if ($this->type == Net_DNS2_Socket::SOCK_STREAM) { + + $s = chr($length >> 8) . chr($length); + + if (@fwrite($this->sock, $s) === false) { + + $this->last_error = 'failed to fwrite() 16bit length'; + return false; + } + } + + // + // write the data to the socket + // + $size = @fwrite($this->sock, $data); + if ( ($size === false) || ($size != $length) ) { + + $this->last_error = 'failed to fwrite() packet'; + return false; + } + + return true; + } + + /** + * reads a response from a DNS server + * + * @param integer &$size the size of the DNS packet read is passed back + * + * @return mixed returns the data on success and false on error + * @access public + * + */ + public function read(&$size) + { + $read = array($this->sock); + $write = null; + $except = null; + + // + // make sure our socket is non-blocking + // + @stream_set_blocking($this->sock, 0); + + // + // select on read + // + switch(stream_select($read, $write, $except, $this->timeout)) { + case false: + $this->last_error = 'error on stream_select()'; + return false; + break; + + case 0: + return false; + break; + + default: + ; + } + + $data = ''; + $length = Net_DNS2_Lookups::DNS_MAX_UDP_SIZE; + + // + // if it's a TCP socket, then the first two bytes is the length of the DNS + // packet- we need to read that off first, then use that value for the + // packet read. + // + if ($this->type == Net_DNS2_Socket::SOCK_STREAM) { + + if (($data = fread($this->sock, 2)) === false) { + + $this->last_error = 'failed on fread() for data length'; + return false; + } + + $length = ord($data[0]) << 8 | ord($data[1]); + if ($length < Net_DNS2_Lookups::DNS_HEADER_SIZE) { + + return false; + } + } + + // + // at this point, we know that there is data on the socket to be read, + // because we've already extracted the length from the first two bytes. + // + // so the easiest thing to do, is just turn off socket blocking, and + // wait for the data. + // + @stream_set_blocking($this->sock, 1); + + // + // read the data from the socket + // + $data = ''; + + // + // the streams socket is weird for TCP sockets; it doesn't seem to always + // return all the data properly; but the looping code I added broke UDP + // packets- my fault- + // + // the sockets library works much better. + // + if ($this->type == Net_DNS2_Socket::SOCK_STREAM) { + + $chunk = ''; + $chunk_size = $length; + + // + // loop so we make sure we read all the data + // + while (1) { + + $chunk = fread($this->sock, $chunk_size); + if ($chunk === false) { + + $this->last_error = 'failed on fread() for data'; + return false; + } + + $data .= $chunk; + $chunk_size -= strlen($chunk); + + if (strlen($data) >= $length) { + break; + } + } + + } else { + + // + // if it's UDP, it's a single fixed-size frame, and the streams library + // doesn't seem to have a problem reading it. + // + $data = fread($this->sock, $length); + if ($length === false) { + + $this->last_error = 'failed on fread() for data'; + return false; + } + } + + $size = strlen($data); + + return $data; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/pear/Net/DNS2/Updater.php b/include/pear/Net/DNS2/Updater.php new file mode 100644 index 0000000000000000000000000000000000000000..e3446a522d4e7cc7052104d0a5a5bfbee7b90ea1 --- /dev/null +++ b/include/pear/Net/DNS2/Updater.php @@ -0,0 +1,654 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * DNS Library for handling lookups and updates. + * + * PHP Version 5 + * + * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Mike Pultz nor the names of his contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @copyright 2010 Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version SVN: $Id: Updater.php 198 2013-05-26 05:05:22Z mike.pultz $ + * @link http://pear.php.net/package/Net_DNS2 + * @since File available since Release 0.6.0 + * + */ + +/** + * The main dynamic DNS updater class. + * + * This class provices functions to handle all defined dynamic DNS update + * requests as defined by RFC 2136. + * + * This is separate from the Net_DNS2_Resolver class, as while the underlying + * protocol is the same, the functionality is completely different. + * + * Generally, query (recursive) lookups are done against caching server, while + * update requests are done against authoratative servers. + * + * @category Networking + * @package Net_DNS2 + * @author Mike Pultz <mike@mikepultz.com> + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://pear.php.net/package/Net_DNS2 + * @see Net_DNS2 + * + */ +class Net_DNS2_Updater extends Net_DNS2 +{ + /* + * a Net_DNS2_Packet_Request object used for the update request + */ + private $_packet; + + /** + * Constructor - builds a new Net_DNS2_Updater objected used for doing + * dynamic DNS updates + * + * @param string $zone the domain name to use for DNS updates + * @param mixed $options an array of config options or null + * + * @throws Net_DNS2_Exception + * @access public + * + */ + public function __construct($zone, array $options = null) + { + parent::__construct($options); + + // + // create the packet + // + $this->_packet = new Net_DNS2_Packet_Request( + strtolower(trim($zone, " \n\r\t.")), 'SOA', 'IN' + ); + + // + // make sure the opcode on the packet is set to UPDATE + // + $this->_packet->header->opcode = Net_DNS2_Lookups::OPCODE_UPDATE; + } + + /** + * checks that the given name matches the name for the zone we're updating + * + * @param string $name The name to be checked. + * + * @return boolean + * @throws Net_DNS2_Exception + * @access private + * + */ + private function _checkName($name) + { + if (!preg_match('/' . $this->_packet->question[0]->qname . '$/', $name)) { + + throw new Net_DNS2_Exception( + 'name provided (' . $name . ') does not match zone name (' . + $this->_packet->question[0]->qname . ')', + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + + return true; + } + + /** + * add a signature to the request for authentication + * + * @param string $keyname the key name to use for the TSIG RR + * @param string $signature the key to sign the request. + * + * @return boolean + * @access public + * @see Net_DNS2::signTSIG() + * @deprecated function deprecated in 1.1.0 + * + */ + public function signature($keyname, $signature) + { + return $this->signTSIG($keyname, $signature); + } + + /** + * 2.5.1 - Add To An RRset + * + * RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH + * and RDATA are those being added, and CLASS is the same as the zone + * class. Any duplicate RRs will be silently ignored by the primary + * master. + * + * @param Net_DNS2_RR $rr the Net_DNS2_RR object to be added to the zone + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function add(Net_DNS2_RR $rr) + { + $this->_checkName($rr->name); + + // + // add the RR to the "update" section + // + if (!in_array($rr, $this->_packet->authority)) { + $this->_packet->authority[] = $rr; + } + + return true; + } + + /** + * 2.5.4 - Delete An RR From An RRset + * + * RRs to be deleted are added to the Update Section. The NAME, TYPE, + * RDLENGTH and RDATA must match the RR being deleted. TTL must be + * specified as zero (0) and will otherwise be ignored by the primary + * master. CLASS must be specified as NONE to distinguish this from an + * RR addition. If no such RRs exist, then this Update RR will be + * silently ignored by the primary master. + * + * @param Net_DNS2_RR $rr the Net_DNS2_RR object to be deleted from the zone + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function delete(Net_DNS2_RR $rr) + { + $this->_checkName($rr->name); + + $rr->ttl = 0; + $rr->class = 'NONE'; + + // + // add the RR to the "update" section + // + if (!in_array($rr, $this->_packet->authority)) { + $this->_packet->authority[] = $rr; + } + + return true; + } + + /** + * 2.5.2 - Delete An RRset + * + * One RR is added to the Update Section whose NAME and TYPE are those + * of the RRset to be deleted. TTL must be specified as zero (0) and is + * otherwise not used by the primary master. CLASS must be specified as + * ANY. RDLENGTH must be zero (0) and RDATA must therefore be empty. + * If no such RRset exists, then this Update RR will be silently ignored + * by the primary master + * + * @param string $name the RR name to be removed from the zone + * @param string $type the RR type to be removed from the zone + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function deleteAny($name, $type) + { + $this->_checkName($name); + + $class = Net_DNS2_Lookups::$rr_types_id_to_class[ + Net_DNS2_Lookups::$rr_types_by_name[$type] + ]; + if (!isset($class)) { + + throw new Net_DNS2_Exception( + 'unknown or un-supported resource record type: ' . $type, + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + $rr = new $class; + + $rr->name = $name; + $rr->ttl = 0; + $rr->class = 'ANY'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "update" section + // + if (!in_array($rr, $this->_packet->authority)) { + $this->_packet->authority[] = $rr; + } + + return true; + } + + /** + * 2.5.3 - Delete All RRsets From A Name + * + * One RR is added to the Update Section whose NAME is that of the name + * to be cleansed of RRsets. TYPE must be specified as ANY. TTL must + * be specified as zero (0) and is otherwise not used by the primary + * master. CLASS must be specified as ANY. RDLENGTH must be zero (0) + * and RDATA must therefore be empty. If no such RRsets exist, then + * this Update RR will be silently ignored by the primary master. + * + * @param string $name the RR name to be removed from the zone + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function deleteAll($name) + { + $this->_checkName($name); + + // + // the Net_DNS2_RR_ANY class is just an empty stub class used for these + // cases only + // + $rr = new Net_DNS2_RR_ANY; + + $rr->name = $name; + $rr->ttl = 0; + $rr->type = 'ANY'; + $rr->class = 'ANY'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "update" section + // + if (!in_array($rr, $this->_packet->authority)) { + $this->_packet->authority[] = $rr; + } + + return true; + } + + /** + * 2.4.1 - RRset Exists (Value Independent) + * + * At least one RR with a specified NAME and TYPE (in the zone and class + * specified in the Zone Section) must exist. + * + * For this prerequisite, a requestor adds to the section a single RR + * whose NAME and TYPE are equal to that of the zone RRset whose + * existence is required. RDLENGTH is zero and RDATA is therefore + * empty. CLASS must be specified as ANY to differentiate this + * condition from that of an actual RR whose RDLENGTH is naturally zero + * (0) (e.g., NULL). TTL is specified as zero (0). + * + * @param string $name the RR name for the prerequisite + * @param string $type the RR type for the prerequisite + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function checkExists($name, $type) + { + $this->_checkName($name); + + $class = Net_DNS2_Lookups::$rr_types_id_to_class[ + Net_DNS2_Lookups::$rr_types_by_name[$type] + ]; + if (!isset($class)) { + + throw new Net_DNS2_Exception( + 'unknown or un-supported resource record type: ' . $type, + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + $rr = new $class; + + $rr->name = $name; + $rr->ttl = 0; + $rr->class = 'ANY'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "prerequisite" section + // + if (!in_array($rr, $this->_packet->answer)) { + $this->_packet->answer[] = $rr; + } + + return true; + } + + /** + * 2.4.2 - RRset Exists (Value Dependent) + * + * A set of RRs with a specified NAME and TYPE exists and has the same + * members with the same RDATAs as the RRset specified here in this + * section. While RRset ordering is undefined and therefore not + * significant to this comparison, the sets be identical in their + * extent. + * + * For this prerequisite, a requestor adds to the section an entire + * RRset whose preexistence is required. NAME and TYPE are that of the + * RRset being denoted. CLASS is that of the zone. TTL must be + * specified as zero (0) and is ignored when comparing RRsets for + * identity. + * + * @param Net_DNS2_RR $rr the RR object to be used as a prerequisite + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function checkValueExists(Net_DNS2_RR $rr) + { + $this->_checkName($rr->name); + + $rr->ttl = 0; + + // + // add the RR to the "prerequisite" section + // + if (!in_array($rr, $this->_packet->answer)) { + $this->_packet->answer[] = $rr; + } + + return true; + } + + /** + * 2.4.3 - RRset Does Not Exist + * + * No RRs with a specified NAME and TYPE (in the zone and class denoted + * by the Zone Section) can exist. + * + * For this prerequisite, a requestor adds to the section a single RR + * whose NAME and TYPE are equal to that of the RRset whose nonexistence + * is required. The RDLENGTH of this record is zero (0), and RDATA + * field is therefore empty. CLASS must be specified as NONE in order + * to distinguish this condition from a valid RR whose RDLENGTH is + * naturally zero (0) (for example, the NULL RR). TTL must be specified + * as zero (0). + * + * @param string $name the RR name for the prerequisite + * @param string $type the RR type for the prerequisite + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function checkNotExists($name, $type) + { + $this->_checkName($name); + + $class = Net_DNS2_Lookups::$rr_types_id_to_class[ + Net_DNS2_Lookups::$rr_types_by_name[$type] + ]; + if (!isset($class)) { + + throw new Net_DNS2_Exception( + 'unknown or un-supported resource record type: ' . $type, + Net_DNS2_Lookups::E_RR_INVALID + ); + } + + $rr = new $class; + + $rr->name = $name; + $rr->ttl = 0; + $rr->class = 'NONE'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "prerequisite" section + // + if (!in_array($rr, $this->_packet->answer)) { + $this->_packet->answer[] = $rr; + } + + return true; + } + + /** + * 2.4.4 - Name Is In Use + * + * Name is in use. At least one RR with a specified NAME (in the zone + * and class specified by the Zone Section) must exist. Note that this + * prerequisite is NOT satisfied by empty nonterminals. + * + * For this prerequisite, a requestor adds to the section a single RR + * whose NAME is equal to that of the name whose ownership of an RR is + * required. RDLENGTH is zero and RDATA is therefore empty. CLASS must + * be specified as ANY to differentiate this condition from that of an + * actual RR whose RDLENGTH is naturally zero (0) (e.g., NULL). TYPE + * must be specified as ANY to differentiate this case from that of an + * RRset existence test. TTL is specified as zero (0). + * + * @param string $name the RR name for the prerequisite + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function checkNameInUse($name) + { + $this->_checkName($name); + + // + // the Net_DNS2_RR_ANY class is just an empty stub class used for these + // cases only + // + $rr = new Net_DNS2_RR_ANY; + + $rr->name = $name; + $rr->ttl = 0; + $rr->type = 'ANY'; + $rr->class = 'ANY'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "prerequisite" section + // + if (!in_array($rr, $this->_packet->answer)) { + $this->_packet->answer[] = $rr; + } + + return true; + } + + /** + * 2.4.5 - Name Is Not In Use + * + * Name is not in use. No RR of any type is owned by a specified NAME. + * Note that this prerequisite IS satisfied by empty nonterminals. + * + * For this prerequisite, a requestor adds to the section a single RR + * whose NAME is equal to that of the name whose nonownership of any RRs + * is required. RDLENGTH is zero and RDATA is therefore empty. CLASS + * must be specified as NONE. TYPE must be specified as ANY. TTL must + * be specified as zero (0). + * + * @param string $name the RR name for the prerequisite + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function checkNameNotInUse($name) + { + $this->_checkName($name); + + // + // the Net_DNS2_RR_ANY class is just an empty stub class used for these + // cases only + // + $rr = new Net_DNS2_RR_ANY; + + $rr->name = $name; + $rr->ttl = 0; + $rr->type = 'ANY'; + $rr->class = 'NONE'; + $rr->rdlength = -1; + $rr->rdata = ''; + + // + // add the RR to the "prerequisite" section + // + if (!in_array($rr, $this->_packet->answer)) { + $this->_packet->answer[] = $rr; + } + + return true; + } + + /** + * returns the current internal packet object. + * + * @return Net_DNS2_Packet_Request + * @access public + # + */ + public function packet() + { + // + // take a copy + // + $p = $this->_packet; + + // + // check for an authentication method; either TSIG or SIG + // + if ( ($this->auth_signature instanceof Net_DNS2_RR_TSIG) + || ($this->auth_signature instanceof Net_DNS2_RR_SIG) + ) { + $p->additional[] = $this->auth_signature; + } + + // + // update the counts + // + $p->header->qdcount = count($p->question); + $p->header->ancount = count($p->answer); + $p->header->nscount = count($p->authority); + $p->header->arcount = count($p->additional); + + return $p; + } + + /** + * executes the update request with the object informaton + * + * @param Net_DNS2_Packet_Response &$response ref to the response object + * + * @return boolean + * @throws Net_DNS2_Exception + * @access public + * + */ + public function update(&$response = null) + { + // + // make sure we have some name servers set + // + $this->checkServers(Net_DNS2::RESOLV_CONF); + + // + // check for an authentication method; either TSIG or SIG + // + if ( ($this->auth_signature instanceof Net_DNS2_RR_TSIG) + || ($this->auth_signature instanceof Net_DNS2_RR_SIG) + ) { + $this->_packet->additional[] = $this->auth_signature; + } + + // + // update the counts + // + $this->_packet->header->qdcount = count($this->_packet->question); + $this->_packet->header->ancount = count($this->_packet->answer); + $this->_packet->header->nscount = count($this->_packet->authority); + $this->_packet->header->arcount = count($this->_packet->additional); + + // + // make sure we have some data to send + // + if ( ($this->_packet->header->qdcount == 0) + || ($this->_packet->header->nscount == 0) + ) { + throw new Net_DNS2_Exception( + 'empty headers- nothing to send!', + Net_DNS2_Lookups::E_PACKET_INVALID + ); + } + + // + // send the packet and get back the response + // + $response = $this->sendPacket($this->_packet, $this->use_tcp); + + // + // clear the internal packet so if we make another request, we don't have + // old data being sent. + // + $this->_packet->reset(); + + // + // for updates, we just need to know it worked- we don't actualy need to + // return the response object + // + return true; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/include/staff/plugin-add.inc.php b/include/staff/plugin-add.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..46251f66d1c2269e8c2417ed0e238613d1e1f8e6 --- /dev/null +++ b/include/staff/plugin-add.inc.php @@ -0,0 +1,35 @@ + +<h2>Install a new plugin</h2> +<p> +To add a plugin into the system, download and place the plugin into the +<code>include/plugins</code> folder. Once in the plugin is in the +<code>plugins/</code> folder, it will be shown in the list below. +</p> + +<form method="post" action="?"> + <?php echo csrf_token(); ?> + <input type="hidden" name="do" value="install"/> +<table class="list" width="100%"><tbody> +<?php + +$installed = $ost->plugins->allInstalled(); +foreach ($ost->plugins->allInfos() as $info) { + // Ignore installed plugins + if (isset($installed[$info['install_path']])) + continue; + ?> + <tr><td><button type="submit" name="install_path" + value="<?php echo $info['install_path']; + ?>">Install</button></td> + <td> + <div><strong><?php echo $info['name']; ?></strong><br/> + <div><?php echo $info['description']; ?></div> + <div class="faded"><em>Version: <?php echo $info['version']; ?></em></div> + <div class="faded"><em>Author: <?php echo $info['author']; ?></em></div> + </div> + </td></tr> + <?php +} +?> +</tbody></table> +</form> diff --git a/include/staff/plugin.inc.php b/include/staff/plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c1cefd5bc2fb60e1570b97e7fec9e6b838461bf9 --- /dev/null +++ b/include/staff/plugin.inc.php @@ -0,0 +1,44 @@ +<?php + +$info=array(); +if($plugin && $_REQUEST['a']!='add') { + $config = $plugin->getConfig(); + if ($config) + $form = $config->getForm(); + if ($_POST) + $form->isValid(); + $title = 'Update Plugin'; + $action = 'update'; + $submit_text='Save Changes'; + $info = $plugin->ht; +} +$info=Format::htmlchars(($errors && $_POST)?$_POST:$info); +?> + +<form action="?id=<?php echo urlencode($_REQUEST['id']); ?>" method="post" id="save"> + <?php csrf_token(); ?> + <input type="hidden" name="do" value="<?php echo $action; ?>"> + <input type="hidden" name="id" value="<?php echo $info['id']; ?>"> + <h2>Manage Plugin + <br/><small><?php echo $plugin->getName(); ?></small></h2> + + <h3>Configuration</h3> + <table class="form_table" width="940" border="0" cellspacing="0" cellpadding="2"> + <tbody> +<?php +if ($form) + $form->render(); +else { ?> + <tr><th>This plugin has no configurable settings<br> + <em>Every plugin should be so easy to use</em></th></tr> +<?php } +?> + </tbody></table> +<p class="centered"> +<?php if ($form) { ?> + <input type="submit" name="submit" value="<?php echo $submit_text; ?>"> + <input type="reset" name="reset" value="Reset"> +<?php } ?> + <input type="button" name="cancel" value="Cancel" onclick='window.location.href="?"'> +</p> +</form> diff --git a/include/staff/plugins.inc.php b/include/staff/plugins.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..eab4a796ee6a3240cd30d35fac1e20f2071b17f0 --- /dev/null +++ b/include/staff/plugins.inc.php @@ -0,0 +1,104 @@ +<div style="width:700;padding-top:5px; float:left;"> + <h2>Currently Installed Plugins</h2> +</div> +<div style="float:right;text-align:right;padding-top:5px;padding-right:5px;"> + <b><a href="plugins.php?a=add" class="Icon form-add">Add New Plugin</a></b></div> +<div class="clear"></div> + +<?php +$page = ($_GET['p'] && is_numeric($_GET['p'])) ? $_GET['p'] : 1; +$count = count($ost->plugins->allInstalled()); +$pageNav = new Pagenate($count, $page, PAGE_LIMIT); +$pageNav->setURL('forms.php'); +$showing=$pageNav->showing().' forms'; +?> + +<form action="plugins.php" method="POST" name="forms"> +<?php csrf_token(); ?> +<input type="hidden" name="do" value="mass_process" > +<input type="hidden" id="action" name="a" value="" > +<table class="list" border="0" cellspacing="1" cellpadding="0" width="940"> + <thead> + <tr> + <th width="7"> </th> + <th>Plugin Name</th> + <th>Status</td> + <th>Date Installed</th> + </tr> + </thead> + <tbody> +<?php +foreach ($ost->plugins->allInstalled() as $p) { + if ($p instanceof Plugin) { ?> + <tr> + <td><input type="checkbox" class="ckb" name="ids[]" value="<?php echo $p->getId(); ?>" + <?php echo $sel?'checked="checked"':''; ?>></td> + <td><a href="plugins.php?id=<?php echo $p->getId(); ?>" + ><?php echo $p->getName(); ?></a></td> + <td>Enabled</td> + <td><?php echo Format::db_datetime($p->getInstallDate()); ?></td> + </tr> + <?php } else { + $p = $ost->plugins->getInfoForPath($p['install_path']); ?> + <tr> + <td><input type="checkbox" class="ckb" name="ids[]" value="<?php echo $p['install_path']; ?>" + <?php echo $sel?'checked="checked"':''; ?>></td> + <td><?php echo $p['name']; ?></td> + <td><strong>Disabled</strong></td> + <td></td> + </tr> + <?php } ?> +<?php } ?> + </tbody> + <tfoot> + <tr> + <td colspan="4"> + <?php if($count){ ?> + Select: + <a id="selectAll" href="#ckb">All</a> + <a id="selectNone" href="#ckb">None</a> + <a id="selectToggle" href="#ckb">Toggle</a> + <?php }else{ + echo 'No extra forms defined yet — add one!'; + } ?> + </td> + </tr> + </tfoot> +</table> +<?php +if ($count) //Show options.. + echo '<div> Page:'.$pageNav->getPageLinks().' </div>'; +?> +<p class="centered" id="actions"> + <input class="button" type="submit" name="delete" value="Delete"> + <input class="button" type="submit" name="enable" value="Enable"> + <input class="button" type="submit" name="disable" value="Disable"> +</p> +</form> + +<div style="display:none;" class="dialog" id="confirm-action"> + <h3>Please Confirm</h3> + <a class="close" href="">×</a> + <hr/> + <p class="confirm-action" style="display:none;" id="delete-confirm"> + <font color="red"><strong>Are you sure you want to DELETE selected plugins?</strong></font> + <br><br>Deleted forms CANNOT be recovered. + </p> + <p class="confirm-action" style="display:none;" id="enable-confirm"> + <font color="green"><strong>Are you ready to enable selected plugins?</strong></font> + </p> + <p class="confirm-action" style="display:none;" id="disable-confirm"> + <font color="red"><strong>Are you sure you want to disable selected plugins?</strong></font> + </p> + <div>Please confirm to continue.</div> + <hr style="margin-top:1em"/> + <p class="full-width"> + <span class="buttons" style="float:left"> + <input type="button" value="No, Cancel" class="close"> + </span> + <span class="buttons" style="float:right"> + <input type="button" value="Yes, Do it!" class="confirm"> + </span> + </p> + <div class="clear"></div> +</div> diff --git a/include/staff/staff.inc.php b/include/staff/staff.inc.php index 4567624842d7aaee268dfe7e034e4173b82c2afd..667b462312b603a205c912584dafb35fe15ac06c 100644 --- a/include/staff/staff.inc.php +++ b/include/staff/staff.inc.php @@ -17,12 +17,12 @@ if($staff && $_REQUEST['a']!='add'){ $title='Add New Staff'; $action='create'; $submit_text='Add Staff'; - $passwd_text='Temp. password required <span class="error"> *</span>'; + $passwd_text='Temporary password required only for "Local" authenication'; //Some defaults for new staff. $info['change_passwd']=1; $info['isactive']=1; $info['isvisible']=1; - $info['isadmin']=0; + $info['isadmin']=0; $qstr.='&a=add'; } $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); @@ -48,7 +48,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); Username: </td> <td> - <input type="text" size="30" name="username" value="<?php echo $info['username']; ?>"> + <input type="text" size="30" class="staff-username typeahead" + name="username" value="<?php echo $info['username']; ?>"> <span class="error">* <?php echo $errors['username']; ?></span> </td> </tr> @@ -58,7 +59,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); First Name: </td> <td> - <input type="text" size="30" name="firstname" value="<?php echo $info['firstname']; ?>"> + <input type="text" size="30" name="firstname" class="auto first" + value="<?php echo $info['firstname']; ?>"> <span class="error">* <?php echo $errors['firstname']; ?></span> </td> </tr> @@ -67,7 +69,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); Last Name: </td> <td> - <input type="text" size="30" name="lastname" value="<?php echo $info['lastname']; ?>"> + <input type="text" size="30" name="lastname" class="auto last" + value="<?php echo $info['lastname']; ?>"> <span class="error">* <?php echo $errors['lastname']; ?></span> </td> </tr> @@ -76,7 +79,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); Email Address: </td> <td> - <input type="text" size="30" name="email" value="<?php echo $info['email']; ?>"> + <input type="text" size="30" name="email" class="auto email" + value="<?php echo $info['email']; ?>"> <span class="error">* <?php echo $errors['email']; ?></span> </td> </tr> @@ -85,7 +89,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); Phone Number: </td> <td> - <input type="text" size="18" name="phone" value="<?php echo $info['phone']; ?>"> + <input type="text" size="18" name="phone" class="auto phone" + value="<?php echo $info['phone']; ?>"> <span class="error"> <?php echo $errors['phone']; ?></span> Ext <input type="text" size="5" name="phone_ext" value="<?php echo $info['phone_ext']; ?>"> <span class="error"> <?php echo $errors['phone_ext']; ?></span> @@ -96,15 +101,39 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); Mobile Number: </td> <td> - <input type="text" size="18" name="mobile" value="<?php echo $info['mobile']; ?>"> + <input type="text" size="18" name="mobile" class="auto mobile" + value="<?php echo $info['mobile']; ?>"> <span class="error"> <?php echo $errors['mobile']; ?></span> </td> </tr> <tr> <th colspan="2"> - <em><strong>Account Password</strong>: <?php echo $passwd_text; ?> <span class="error"> <?php echo $errors['temppasswd']; ?></span></em> + <em><strong>Authentication</strong>: <?php echo $passwd_text; ?> <span class="error"> <?php echo $errors['temppasswd']; ?></span></em> </th> </tr> + <tr> + <td>Authentication Backend</td> + <td> + <select name="backend" onchange="javascript: + if (this.value != '' && this.value != 'local') + $('#password-fields').hide(); + else + $('#password-fields').show(); + "> + <option value="">— Use any available backend —</option> + <?php foreach (AuthenticationBackend::allRegistered() as $ab) { + if (!$ab->supportsAuthentication()) continue; ?> + <option value="<?php echo $ab::$id; ?>" <?php + if ($info['backend'] == $ab::$id) + echo 'selected="selected"'; ?>><?php + echo $ab::$name; ?></option> + <?php } ?> + </select> + </td> + </tr> + </tbody> + <tbody id="password-fields" style="<?php if ($info['backend'] && $info['backend'] != 'local') + echo 'display:none;'; ?>"> <tr> <td width="180"> Password: @@ -133,6 +162,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info); <strong>Force</strong> password change on next login. </td> </tr> + </tbody> + <tbody> <tr> <th colspan="2"> <em><strong>Staff's Signature</strong>: Optional signature used on outgoing emails. <span class="error"> <?php echo $errors['signature']; ?></span></em> diff --git a/include/staff/templates/dynamic-form.tmpl.php b/include/staff/templates/dynamic-form.tmpl.php index f77fa928a74148164d24a6af8eb3527aa6593682..cfe25a45ad544779d916179e55f639edb6073a49 100644 --- a/include/staff/templates/dynamic-form.tmpl.php +++ b/include/staff/templates/dynamic-form.tmpl.php @@ -12,7 +12,7 @@ <?php } else { ?> - <td class="multi-line <?php if ($field->get('required')) echo 'required'; ?>"> + <td class="multi-line <?php if ($field->get('required')) echo 'required'; ?>" style="min-width:120px;"> <?php echo Format::htmlchars($field->get('label')); ?>:</td> <td><?php } diff --git a/include/upgrader/streams/core.sig b/include/upgrader/streams/core.sig index cc5bdea3c043bacc39e0d2213dfa2c8b13c5a8f8..882f4a25247117dd27b27f868e35279e75f29e89 100644 --- a/include/upgrader/streams/core.sig +++ b/include/upgrader/streams/core.sig @@ -1 +1 @@ -6de40a4d5bad7a2923e769a4db1ff3b9 +1b0fce992f6c7ed37a9b2914f86775d4 diff --git a/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql b/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql new file mode 100644 index 0000000000000000000000000000000000000000..48f9480d54544b4eb94935817109cd930cce487d --- /dev/null +++ b/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql @@ -0,0 +1,27 @@ +/** + * @version v1.8.1 - Plugins + * @schema 1b0fce992f6c7ed37a9b2914f86775d4 + * @title Add plugin management system + * + * Add table for plugin manager + */ + +ALTER TABLE `%TABLE_PREFIX%staff` + ADD `backend` varchar(32) default NULL AFTER `passwd`; + +-- Plugins +DROP TABLE IF EXISTS `%TABLE_PREFIX%plugin`; +CREATE TABLE `%TABLE_PREFIX%plugin` ( + `id` int(11) unsigned not null auto_increment, + `name` varchar(30) not null, + `install_path` varchar(60) not null, + `isphar` tinyint(1) not null default 0, + `isactive` tinyint(1) not null default 0, + `installed` datetime not null, + primary key (`id`) +) DEFAULT CHARSET=utf8; + +-- Finished with patch +UPDATE `%TABLE_PREFIX%config` + SET `value` = '1b0fce992f6c7ed37a9b2914f86775d4' + WHERE `key` = 'schema_signature' AND `namespace` = 'core'; diff --git a/scp/ajax.php b/scp/ajax.php index 0ea64116e77289b22e9c5aba5a7efac971f8b6ee..a8a407acceb30705a62bc31bc74fd48f16ac3a42 100644 --- a/scp/ajax.php +++ b/scp/ajax.php @@ -64,7 +64,8 @@ $dispatcher = patterns('', url_get('^/lookup/form$', 'getLookupForm'), url_post('^/lookup/form$', 'addUser'), url_get('^/select$', 'selectUser'), - url_get('^/select/(?P<id>\d+)$', 'selectUser') + url_get('^/select/(?P<id>\d+)$', 'selectUser'), + url_get('^/staff$', 'searchStaff') )), url('^/tickets/', patterns('ajax.tickets.php:TicketsAjaxAPI', url_get('^(?P<tid>\d+)/change-user$', 'changeUserForm'), @@ -100,6 +101,8 @@ $dispatcher = patterns('', )) ); +Signal::send('ajax.scp', $dispatcher); + # Call the respective function print $dispatcher->resolve($ost->get_path_info()); ?> diff --git a/scp/js/scp.js b/scp/js/scp.js index b80cb1a3b83f41f7825ff3e0b6aad8019c7af002..84a491479d8e6ff65dd63d5dcf952585606e4cf2 100644 --- a/scp/js/scp.js +++ b/scp/js/scp.js @@ -345,6 +345,26 @@ $(document).ready(function(){ }, property: "email" }); + $('.staff-username.typeahead').typeahead({ + source: function (typeahead, query) { + if(query.length > 2) { + $.ajax({ + url: "ajax.php/users/staff?q="+query, + dataType: 'json', + success: function (data) { + typeahead.process(data); + } + }); + } + }, + onselect: function (obj) { + var fObj=$('.staff-username.typeahead').closest('form'); + $.each(['first','last','email','phone','mobile'], function(i,k) { + if (obj[k]) $('.auto.'+k, fObj).val(obj[k]); + }); + }, + property: "username" + }); //Overlay $('#overlay').css({ diff --git a/scp/login.php b/scp/login.php index 2f3cf2236e9f4996bb10b94764fb6d0a14d99d22..17424b6aeda068aa29b8bd233416cc3c604ad868 100644 --- a/scp/login.php +++ b/scp/login.php @@ -22,10 +22,12 @@ require_once(INCLUDE_DIR.'class.csrf.php'); $dest = $_SESSION['_staff']['auth']['dest']; $msg = $_SESSION['_staff']['auth']['msg']; $msg = $msg?$msg:'Authentication Required'; +$dest=($dest && (!strstr($dest,'login.php') && !strstr($dest,'ajax.php')))?$dest:'index.php'; if($_POST) { - //$_SESSION['_staff']=array(); #Uncomment to disable login strikes. - if(($user=Staff::login($_POST['userid'], $_POST['passwd'], $errors))){ - $dest=($dest && (!strstr($dest,'login.php') && !strstr($dest,'ajax.php')))?$dest:'index.php'; + // Lookup support backends for this staff + $username = trim($_POST['userid']); + if ($user = AuthenticationBackend::process($username, + $_POST['passwd'], $errors)) { @header("Location: $dest"); require_once('index.php'); //Just incase header is messed up. exit; @@ -33,6 +35,14 @@ if($_POST) { $msg = $errors['err']?$errors['err']:'Invalid login'; } + +// Consider single sign-on authentication backends +if (!$thisstaff || !($thisstaff->getId() || $thisstaff->isValid())) { + if (($user = AuthenticationBackend::singleSignOn($errors)) + && ($user instanceof Staff)) + @header("Location: $dest"); +} + define("OSTSCPINC",TRUE); //Make includes happy! include_once(INCLUDE_DIR.'staff/login.tpl.php'); ?> diff --git a/scp/plugins.php b/scp/plugins.php new file mode 100644 index 0000000000000000000000000000000000000000..c5e7e8918027296970b717289626fb4c5982d6ac --- /dev/null +++ b/scp/plugins.php @@ -0,0 +1,63 @@ +<?php +require('admin.inc.php'); +require_once(INCLUDE_DIR."/class.plugin.php"); + +if($_REQUEST['id'] && !($plugin=Plugin::lookup($_REQUEST['id']))) + $errors['err']='Unknown or invalid plugin ID.'; + +if($_POST) { + switch(strtolower($_POST['do'])) { + case 'update': + if ($plugin) { + $plugin->getConfig()->commit($errors); + } + break; + case 'mass_process': + if(!$_POST['ids'] || !is_array($_POST['ids']) || !count($_POST['ids'])) { + $errors['err'] = 'You must select at least one plugin'; + } else { + $count = count($_POST['ids']); + switch(strtolower($_POST['a'])) { + case 'enable': + foreach ($_POST['ids'] as $path) { + if ($p = $ost->plugins->getInstance($path)) { + $p->enable(); + } + } + break; + case 'disable': + foreach ($_POST['ids'] as $id) { + if ($p = Plugin::lookup($id)) { + $p->disable(); + } + } + break; + case 'delete': + foreach ($_POST['ids'] as $id) { + if ($p = Plugin::lookup($id)) { + var_dump($p); + $p->uninstall(); + } + } + break; + } + } + break; + case 'install': + if ($ost->plugins->install($_POST['install_path'])) + $msg = 'Plugin successfully installed'; + break; + } +} + +$page = 'plugins.inc.php'; +if ($plugin) + $page = 'plugin.inc.php'; +elseif ($_REQUEST['a']=='add') + $page = 'plugin-add.inc.php'; + +$nav->setTabActive('manage'); +require(STAFFINC_DIR.'header.inc.php'); +require(STAFFINC_DIR.$page); +include(STAFFINC_DIR.'footer.inc.php'); +?> diff --git a/setup/cli/package.php b/setup/cli/package.php index 15080fd8ab11eda31d6d09f06e0274f48de99a3b..e0b02cdea6725d3a8bd36387ba7e156c0765c32d 100755 --- a/setup/cli/package.php +++ b/setup/cli/package.php @@ -115,7 +115,7 @@ mkdir("$stage_path/scripts/"); package("setup/scripts/*", "scripts/", -1, "*stage"); # Load the heart of the system -package("include/{,.}*", "upload/include", -1, array('*ost-config.php', '*.sw[a-z]')); +package("include/{,.}*", "upload/include", -1, array('*ost-config.php', '*.sw[a-z]','plugins/*')); # Include the installer package("setup/*.{php,txt,html}", "upload/setup", -1, array("*scripts","*test","*stage")); diff --git a/setup/inc/streams/core/install-mysql.sql b/setup/inc/streams/core/install-mysql.sql index cd260b93e439881d1c2bef6040eccc4f9d00b3b2..ce6030b8b2134a5a57a3107e8ddfed9784385b6a 100644 --- a/setup/inc/streams/core/install-mysql.sql +++ b/setup/inc/streams/core/install-mysql.sql @@ -435,6 +435,7 @@ CREATE TABLE `%TABLE_PREFIX%staff` ( `firstname` varchar(32) default NULL, `lastname` varchar(32) default NULL, `passwd` varchar(128) default NULL, + `backend` varchar(32) default NULL, `email` varchar(128) default NULL, `phone` varchar(24) NOT NULL default '', `phone_ext` varchar(6) default NULL, @@ -689,6 +690,18 @@ CREATE TABLE IF NOT EXISTS `%TABLE_PREFIX%page` ( UNIQUE KEY `name` (`name`) ) DEFAULT CHARSET=utf8; +-- Plugins +DROP TABLE IF EXISTS `%TABLE_PREFIX%plugin`; +CREATE TABLE `%TABLE_PREFIX%plugin` ( + `id` int(11) unsigned not null auto_increment, + `name` varchar(30) not null, + `install_path` varchar(60) not null, + `isphar` tinyint(1) not null default 0, + `isactive` tinyint(1) not null default 0, + `installed` datetime not null, + primary key (`id`) +) DEFAULT CHARSET=utf8; + DROP TABLE IF EXISTS `%TABLE_PREFIX%user`; CREATE TABLE `%TABLE_PREFIX%user` ( `id` int(10) unsigned NOT NULL auto_increment,