const NUMBERS = '0123456789';
/**
+ * A Net_DNS_Resolver object to use to determine hostnames.
+ *
+ * @var Net_DNS_Resolver
+ */
+ static public $dnsResolver;
+
+ /**
* Singleton instances.
*
* @var array
? $_SERVER['REMOTE_ADDR']
: $_SERVER['HTTP_X_FORWARDED_FOR'];
- if (class_exists('Net_DNS')) {
- $resolver = new Net_DNS_Resolver();
- $resolver->retry = isset($GLOBALS['conf']['dns']['retry']) ? $GLOBALS['conf']['dns']['retry'] : 1;
- $resolver->retrans = isset($GLOBALS['conf']['dns']['retrans']) ? $GLOBALS['conf']['dns']['retrans'] : 1;
+ if (!empty(self::$dnsResolver)) {
$ptrdname = $host;
- if ($response = $resolver->query($host, 'PTR')) {
+ if ($response = self::$dnsResolver->query($host, 'PTR')) {
foreach ($response->answer as $val) {
if (isset($val->ptrdname)) {
$ptrdname = $val->ptrdname;
--- /dev/null
+<?php
+/**
+ * TODO
+ */
+class Horde_Core_Autoloader_Callback_Auth
+{
+ /**
+ * TODO
+ */
+ public function callback()
+ {
+ Horde_Auth::$dnsResolver = $GLOBALS['injector']->getInstance('Net_DNS_Resolver');
+ }
+
+}
--- /dev/null
+<?php
+class Horde_Core_Binder_Dns implements Horde_Injector_Binder
+{
+ public function create(Horde_Injector $injector)
+ {
+ if (!class_exists('Net_DNS_Resolver')) {
+ return null;
+ }
+
+ $resolver = new Net_DNS_Resolver();
+ $resolver->retry = isset($GLOBALS['conf']['dns']['retry'])
+ ? $GLOBALS['conf']['dns']['retry']
+ : 1;
+ $resolver->retrans = isset($GLOBALS['conf']['dns']['retrans'])
+ ? $GLOBALS['conf']['dns']['retrans']
+ : 1;
+
+ return $resolver;
+ }
+
+ public function equals(Horde_Injector_Binder $binder)
+ {
+ return false;
+ }
+}
protected function __construct($session_flags = 0)
{
/* Set autoloader callbacks. */
+ Horde_Autoloader::addCallback('Horde_Auth', array('Horde_Core_Autoloader_Callback_Auth', 'callback'));
Horde_Autoloader::addCallback('Horde_Mime', array('Horde_Core_Autoloader_Callback_Mime', 'callback'));
+ /* Setup injector. */
+ $GLOBALS['injector'] = $injector = new Horde_Injector(new Horde_Injector_TopLevel());
+ $injector->addBinder('Horde_Cache', new Horde_Core_Binder_Cache());
+ $injector->addBinder('Horde_Db_Adapter_Base', new Horde_Core_Binder_Db('reader'));
+ $injector->addBinder('Horde_Log_Logger', new Horde_Core_Binder_Logger());
+ $injector->addBinder('Horde_Memcache', new Horde_Core_Binder_Memcache());
+ $injector->addBinder('Horde_Template', new Horde_Core_Binder_Template());
+ $injector->addBinder('Net_DNS_Resolver', new Horde_Core_Binder_Dns());
+
/* Import and global Horde's configuration values. Almost a chicken
* and egg issue - since loadConfiguration() uses registry in certain
* instances. However, if HORDE_BASE is defined, and app is
umask($conf['umask']);
}
- /* Setup injector. Need to init Horde_Memcache here because it may
- * be called in setupSessionHandler(). */
- $GLOBALS['injector'] = new Horde_Injector(new Horde_Injector_TopLevel());
- $GLOBALS['injector']->addBinder('Horde_Memcache', new Horde_Core_Binder_Memcache());
-
/* Start a session. */
if ($session_flags & self::SESSION_NONE ||
(PHP_SAPI == 'cli') ||
Horde_Nls::setTextdomain('horde', HORDE_BASE . '/locale', Horde_Nls::getCharset());
Horde_String::setDefaultCharset(Horde_Nls::getCharset());
- /* Initialize caching. */
- $GLOBALS['injector']->addBinder('Horde_Cache', new Horde_Core_Binder_Cache());
-
$this->_regmtime = max(filemtime(HORDE_BASE . '/config/registry.php'),
filemtime(HORDE_BASE . '/config/registry.d'));
throw new Horde_Exception(_("This system is currently deactivated."));
}
- /* Set the rest of the default bindings. */
- $GLOBALS['injector']->addBinder('Horde_Db_Adapter_Base', new Horde_Core_Binder_Db('reader'));
- $GLOBALS['injector']->addBinder('Horde_Log_Logger', new Horde_Core_Binder_Logger());
- $GLOBALS['injector']->addBinder('Horde_Template', new Horde_Core_Binder_Template());
-
/* Create the global permissions object. */
// TODO: Remove(?)
$GLOBALS['perms'] = Horde_Perms::singleton();
<dir name="Core">
<dir name="Autoloader">
<dir name="Callback">
+ <dir name="Auth.php" role="php" />
<dir name="Mime.php" role="php" />
</dir> <!-- /lib/Horde/Core/Autoloader/Callback -->
</dir> <!-- /lib/Horde/Core/Autoloader -->
<dir name="Binder">
<file name="Cache.php" role="php" />
<file name="Db.php" role="php" />
+ <file name="Dns.php" role="php" />
<file name="Logger.php" role="php" />
<file name="Memcache.php" role="php" />
<file name="Template.php" role="php" />
<filelist>
<install name="lib/Horde/Config.php" as="Horde/Config.php" />
<install name="lib/Horde/Config/Form.php" as="Horde/Config/Form.php" />
+ <install name="lib/Horde/Core/Autoloader/Callback/Auth.php" as="Horde/Core/Autoloader/Callback/Auth.php" />
<install name="lib/Horde/Core/Autoloader/Callback/Mime.php" as="Horde/Core/Autoloader/Callback/Mime.php" />
<install name="lib/Horde/Core/Binder/Cache.php" as="Horde/Core/Binder/Cache.php" />
<install name="lib/Horde/Core/Binder/Db.php" as="Horde/Core/Binder/Db.php" />
+ <install name="lib/Horde/Core/Binder/Dns.php" as="Horde/Core/Binder/Dns.php" />
<install name="lib/Horde/Core/Binder/Logger.php" as="Horde/Core/Binder/Logger.php" />
<install name="lib/Horde/Core/Binder/Memcache.php" as="Horde/Core/Binder/Memcache.php" />
<install name="lib/Horde/Core/Binder/Template.php" as="Horde/Core/Binder/Template.php" />
/**
* Generate the 'Received' header for the Web browser->Horde hop
* (attempts to conform to guidelines in RFC 5321 [4.4]).
+ *
+ * @param array $options Additional options:
+ * <pre>
+ * 'dns' - (Net_DNS_Resolver) Use the DNS resolver object to lookup
+ * hostnames.
+ * DEFAULT: Use gethostbyaddr() function.
+ * 'server' - (string) Use this server name.
+ * DEFAULT: Auto-detect using current PHP values.
+ * </pre>
*/
- public function addReceivedHeader()
+ public function addReceivedHeader($options = array())
{
- $have_netdns = @include_once 'Net/DNS.php';
- if ($have_netdns) {
- $resolver = new Net_DNS_Resolver();
- $resolver->retry = isset($GLOBALS['conf']['dns']['retry']) ? $GLOBALS['conf']['dns']['retry'] : 1;
- $resolver->retrans = isset($GLOBALS['conf']['dns']['retrans']) ? $GLOBALS['conf']['dns']['retrans'] : 1;
- }
-
$old_error = error_reporting(0);
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
/* This indicates the user is connecting through a proxy. */
$remote_path = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$remote_addr = $remote_path[0];
- if ($have_netdns) {
+ if (!empty($options['dns'])) {
$remote = $remote_addr;
- if ($response = $resolver->query($remote_addr, 'PTR')) {
+ if ($response = $options['dns']->query($remote_addr, 'PTR')) {
foreach ($response->answer as $val) {
if (isset($val->ptrdname)) {
$remote = $val->ptrdname;
} else {
$remote_addr = $_SERVER['REMOTE_ADDR'];
if (empty($_SERVER['REMOTE_HOST'])) {
- if ($have_netdns) {
+ if (!empty($options['dns'])) {
$remote = $remote_addr;
- if ($response = $resolver->query($remote_addr, 'PTR')) {
+ if ($response = $options['dns']->query($remote_addr, 'PTR')) {
foreach ($response->answer as $val) {
if (isset($val->ptrdname)) {
$remote = $val->ptrdname;
$remote_ident = '';
}
- if (!empty($GLOBALS['conf']['server']['name'])) {
- $server_name = $GLOBALS['conf']['server']['name'];
+ if (!empty($options['server'])) {
+ $server_name = $options['server'];
} elseif (!empty($_SERVER['SERVER_NAME'])) {
$server_name = $_SERVER['SERVER_NAME'];
} elseif (!empty($_SERVER['HTTP_HOST'])) {
/**
* Get country information from a hostname or IP address.
*
- * @param string $host The hostname or IP address.
+ * @param string $host The hostname or IP address.
+ * @param Net_DNS_Resolver $dns A DNS resolver object used to look up the
+ * hostname.
*
* @return mixed On success, return an array with the following entries:
* 'code' => Country Code
* 'name' => Country Name
* On failure, return false.
*/
- static public function getCountryByHost($host)
+ static public function getCountryByHost($host, $dns = null)
{
/* List of generic domains that we know is not in the country TLD
list. See: http://www.iana.org/gtld/gtld.htm */
$checkHost = $host;
if (preg_match('/^\d+\.\d+\.\d+\.\d+$/', $host)) {
- if (class_exists('Net_DNS')) {
- $resolver = new Net_DNS_Resolver();
- $resolver->retry = isset($GLOBALS['conf']['dns']['retry']) ? $GLOBALS['conf']['dns']['retry'] : 1;
- $resolver->retrans = isset($GLOBALS['conf']['dns']['retrans']) ? $GLOBALS['conf']['dns']['retrans'] : 1;
- if ($response = $resolver->query($host, 'PTR')) {
- foreach ($response->answer as $val) {
- if (isset($val->ptrdname)) {
- $checkHost = $val->ptrdname;
- break;
- }
+ if (is_null($dns)) {
+ $checkHost = @gethostbyaddr($host);
+ } elseif ($response = $dns->query($host, 'PTR')) {
+ foreach ($response->answer as $val) {
+ if (isset($val->ptrdname)) {
+ $checkHost = $val->ptrdname;
+ break;
}
}
- } else {
- $checkHost = @gethostbyaddr($host);
}
}
/**
* Returns a Horde image link to the country flag.
*
- * @param string $host The hostname or IP address.
+ * @param string $host The hostname or IP address.
+ * @param Net_DNS_Resolver $dns A DNS resolver object used to look up the
+ * hostname.
*
* @return string The image URL, or the empty string on error.
*/
- static public function generateFlagImageByHost($host)
+ static public function generateFlagImageByHost($host, $dns = null)
{
- $data = self::getCountryByHost($host);
+ $data = self::getCountryByHost($host, $dns);
if ($data === false) {
return '';
}
} else {
$host = @gethostbyaddr($data['remoteAddr']);
}
- $entry[_("Remote Host:")] = $host . ' [' . $data['remoteAddr'] . '] ' . Horde_Nls::generateFlagImageByHost($host);
+ $entry[_("Remote Host:")] = $host . ' [' . $data['remoteAddr'] . '] ' . Horde_Nls::generateFlagImageByHost($host, $injector->getInstance('Net_DNS_Resolver'));
}
echo '<li><div class="sesstoggle">' . $plus . $minus . htmlspecialchars($data['userid']) . ' [' . htmlspecialchars($id) . ']'
/* Set up the mail headers and read the log file. */
$msg_headers = new Horde_Mime_Headers();
- $msg_headers->addReceivedHeader();
+ $msg_headers->addReceivedHeader(array(
+ 'dns' => $GLOBALS['injector']->getInstance('Net_DNS_Resolver'),
+ 'server' => $GLOBALS['conf']['server']['name']
+ ));
$msg_headers->addMessageIdHeader();
$msg_headers->addUserAgentHeader();
$msg_headers->addHeader('Date', date('r'));
$headers = new Horde_Mime_Headers();
/* Add a Received header for the hop from browser to server. */
- $headers->addReceivedHeader();
+ $headers->addReceivedHeader(array(
+ 'dns' => $GLOBALS['injector']->getInstance('Net_DNS_Resolver'),
+ 'server' => $GLOBALS['conf']['server']['name']
+ ));
$headers->addMessageIdHeader();
/* Add priority header, if requested. */
$mime->addPart($ics);
// Build the reply headers.
- $msg_headers->addReceivedHeader();
+ $msg_headers->addReceivedHeader(array(
+ 'dns' => $GLOBALS['injector']->getInstance('Net_DNS_Resolver'),
+ 'server' => $GLOBALS['conf']['server']['name']
+ ));
$msg_headers->addMessageIdHeader();
$msg_headers->addHeader('Date', date('r'));
$msg_headers->addHeader('From', $email);
$mime->addPart($ics);
// Build the reply headers.
- $msg_headers->addReceivedHeader();
+ $msg_headers->addReceivedHeader(array(
+ 'dns' => $GLOBALS['injector']->getInstance('Net_DNS_Resolver'),
+ 'server' => $GLOBALS['conf']['server']['name']
+ ));
$msg_headers->addMessageIdHeader();
$msg_headers->addHeader('Date', date('r'));
$msg_headers->addHeader('From', $email);
$origin_host = array($origin_host);
}
foreach ($origin_host as $host) {
- $from_img .= Horde_Nls::generateFlagImageByHost($host) . ' ';
+ $from_img .= Horde_Nls::generateFlagImageByHost($host, $injector->getInstance('Net_DNS_Resolver')) . ' ';
}
trim($from_img);
}
if (empty($from_img) && !empty($envelope['from'])) {
$from_ob = reset($envelope['from']);
- $from_img = Horde_Nls::generateFlagImageByHost($from_ob['host']);
+ $from_img .= Horde_Nls::generateFlagImageByHost($from_ob['host'], $injector->getInstance('Net_DNS_Resolver')) . ' ';
}
if (!empty($from_img)) {