summaryrefslogtreecommitdiff
path: root/extlib/Net/IDNA.php
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-03-30 17:35:27 -0700
committerBrion Vibber <brion@pobox.com>2010-03-30 17:35:27 -0700
commit0841fa712ec558d283f533690d2db50dfa1da8fc (patch)
tree406ea631c8704dfcfd81dceaacf5a1785ff2103b /extlib/Net/IDNA.php
parentbfb2ac4910a52dde9bd3c39855f0488f56eb79bc (diff)
Ticket #1281: JID validation now more or less follows spec instead of calling e-mail validator
Basic splitting/validation code submitted via http://status.net/wiki/XMPP/JID_validation -- Copyright 2009 Patrick Georgi <patrick@georgi-clan.de> Licensed under ISC-L, which is compatible with everything else that keeps the copyright notice intact. Added PEAR Net_IDNA package to extlib to handle IDN normalization (also used by Validate's email verifier if present). * added test suite, supplemented my own test cases with JID validation and normalization test cases from libpurple * follows XMPP rules for validation of name part * fixes for normalization with non-ASCII names * will do domain checks if $config['email']['check_domain'] is on, checking for an XMPP-server SRV record or any lookup. (We don't actually need to ping those direct though.) * some more obscure stringprep validation rules aren't quite followed yet, but we err on the side of permissiveness. * we still don't actually let you save your address with a resource on it, as we strip resources when looking up users who've sent us presence or message updates. I would recommend saving the outgoing resource as a separate field if/when we add that..?
Diffstat (limited to 'extlib/Net/IDNA.php')
-rw-r--r--extlib/Net/IDNA.php100
1 files changed, 100 insertions, 0 deletions
diff --git a/extlib/Net/IDNA.php b/extlib/Net/IDNA.php
new file mode 100644
index 000000000..987a37ef1
--- /dev/null
+++ b/extlib/Net/IDNA.php
@@ -0,0 +1,100 @@
+<?php
+
+// {{{ license
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
+//
+// +----------------------------------------------------------------------+
+// | This library is free software; you can redistribute it and/or modify |
+// | it under the terms of the GNU Lesser General Public License as |
+// | published by the Free Software Foundation; either version 2.1 of the |
+// | License, or (at your option) any later version. |
+// | |
+// | This library is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | Lesser General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU Lesser General Public |
+// | License along with this library; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
+// | USA. |
+// +----------------------------------------------------------------------+
+//
+
+// }}}
+
+
+/**
+ * Encode/decode Internationalized Domain Names.
+ * Factory class to get correct implementation either for php4 or php5.
+ *
+ * @author Markus Nix <mnix@docuverse.de>
+ * @author Matthias Sommerfeld <mso@phlylabs.de>
+ * @package Net
+ * @version $Id: IDNA.php 284681 2009-07-24 04:24:27Z clockwerx $
+ */
+
+class Net_IDNA
+{
+ // {{{ factory
+ /**
+ * Attempts to return a concrete IDNA instance for either php4 or php5.
+ *
+ * @param array $params Set of paramaters
+ * @return object IDNA The newly created concrete Log instance, or an
+ * false on an error.
+ * @access public
+ */
+ function getInstance($params = array())
+ {
+ $version = explode( '.', phpversion() );
+ $handler = ((int)$version[0] > 4) ? 'php5' : 'php4';
+ $class = 'Net_IDNA_' . $handler;
+ $classfile = 'Net/IDNA/' . $handler . '.php';
+
+ /*
+ * Attempt to include our version of the named class, but don't treat
+ * a failure as fatal. The caller may have already included their own
+ * version of the named class.
+ */
+ @include_once $classfile;
+
+ /* If the class exists, return a new instance of it. */
+ if (class_exists($class)) {
+ return new $class($params);
+ }
+
+ return false;
+ }
+ // }}}
+
+ // {{{ singleton
+ /**
+ * Attempts to return a concrete IDNA instance for either php4 or php5,
+ * only creating a new instance if no IDNA instance with the same
+ * parameters currently exists.
+ *
+ * @param array $params Set of paramaters
+ * @return object IDNA The newly created concrete Log instance, or an
+ * false on an error.
+ * @access public
+ */
+ function singleton($params = array())
+ {
+ static $instances;
+ if (!isset($instances)) {
+ $instances = array();
+ }
+
+ $signature = serialize($params);
+ if (!isset($instances[$signature])) {
+ $instances[$signature] = Net_IDNA::getInstance($params);
+ }
+
+ return $instances[$signature];
+ }
+ // }}}
+}
+
+?>