Remove Net_DNS_Resolver dependency from framework libs
authorMichael M Slusarz <slusarz@curecanti.org>
Mon, 1 Feb 2010 23:32:57 +0000 (16:32 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Tue, 2 Feb 2010 01:04:56 +0000 (18:04 -0700)
12 files changed:
framework/Auth/lib/Horde/Auth.php
framework/Core/lib/Horde/Core/Autoloader/Callback/Auth.php [new file with mode: 0644]
framework/Core/lib/Horde/Core/Binder/Dns.php [new file with mode: 0644]
framework/Core/lib/Horde/Registry.php
framework/Core/package.xml
framework/Mime/lib/Horde/Mime/Headers.php
framework/Nls/lib/Horde/Nls.php
horde/admin/sessions.php
imp/attachment.php
imp/lib/Compose.php
imp/lib/Mime/Viewer/Itip.php
imp/message.php

index f90b084..8eafc40 100644 (file)
@@ -80,6 +80,13 @@ class Horde_Auth
     const NUMBERS = '0123456789';
 
     /**
+     * A Net_DNS_Resolver object to use to determine hostnames.
+     *
+     * @var Net_DNS_Resolver
+     */
+    static public $dnsResolver;
+
+    /**
      * Singleton instances.
      *
      * @var array
@@ -772,12 +779,9 @@ class Horde_Auth
             ? $_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;
diff --git a/framework/Core/lib/Horde/Core/Autoloader/Callback/Auth.php b/framework/Core/lib/Horde/Core/Autoloader/Callback/Auth.php
new file mode 100644 (file)
index 0000000..5b0533c
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * TODO
+ */
+class Horde_Core_Autoloader_Callback_Auth
+{
+    /**
+     * TODO
+     */
+    public function callback()
+    {
+        Horde_Auth::$dnsResolver = $GLOBALS['injector']->getInstance('Net_DNS_Resolver');
+    }
+
+}
diff --git a/framework/Core/lib/Horde/Core/Binder/Dns.php b/framework/Core/lib/Horde/Core/Binder/Dns.php
new file mode 100644 (file)
index 0000000..e095163
--- /dev/null
@@ -0,0 +1,25 @@
+<?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;
+    }
+}
index 457d0eb..3c3f6ee 100644 (file)
@@ -230,8 +230,18 @@ class Horde_Registry
     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
@@ -257,11 +267,6 @@ class Horde_Registry
             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') ||
@@ -287,9 +292,6 @@ class Horde_Registry
         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'));
 
@@ -311,11 +313,6 @@ class Horde_Registry
             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();
index 6b2d8f7..7be9a42 100644 (file)
@@ -55,12 +55,14 @@ Application Framework.
      <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" />
@@ -149,9 +151,11 @@ Application Framework.
   <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" />
index 62cb4aa..2bcffde 100644 (file)
@@ -147,24 +147,26 @@ class Horde_Mime_Headers
     /**
      * 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;
@@ -178,9 +180,9 @@ class Horde_Mime_Headers
         } 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;
@@ -205,8 +207,8 @@ class Horde_Mime_Headers
             $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'])) {
index f11dc0b..e0d0325 100644 (file)
@@ -474,14 +474,16 @@ class Horde_Nls
     /**
      * 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 */
@@ -492,20 +494,15 @@ class Horde_Nls
 
         $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);
             }
         }
 
@@ -557,13 +554,15 @@ class Horde_Nls
     /**
      * 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 '';
         }
index 69ef46c..a9df1f3 100644 (file)
@@ -55,7 +55,7 @@ try {
             } 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) . ']'
index 4e92a10..507182f 100644 (file)
@@ -83,7 +83,10 @@ if ($conf['compose']['link_attachments_notify']) {
 
                 /* 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'));
index d3346c2..bfe16a5 100644 (file)
@@ -493,7 +493,10 @@ class IMP_Compose
         $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. */
index 11aff02..af955df 100644 (file)
@@ -322,7 +322,10 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Driver
                     $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);
@@ -422,7 +425,10 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Driver
                     $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);
index 9aea21d..af75e9b 100644 (file)
@@ -245,14 +245,14 @@ if ($origin_host) {
         $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)) {