summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/gpg.php149
1 files changed, 149 insertions, 0 deletions
diff --git a/www/gpg.php b/www/gpg.php
index 9c304ca..4cfe1e5 100644
--- a/www/gpg.php
+++ b/www/gpg.php
@@ -333,6 +333,148 @@ function normalizeName($name) {
return $name;
}
+function expandVariants($name) {
+ static $replacements = array(
+ ' ' => array(' '), # no-break space = non-breaking space, U+00A0 ISOnum
+ '¡' => array('!'), # inverted exclamation mark, U+00A1 ISOnum
+ '¦' => array(''), # broken bar = broken vertical bar, U+00A6 ISOnum
+ '§' => array(''), # section sign, U+00A7 ISOnum
+ '¨' => array(''), # diaeresis = spacing diaeresis, U+00A8 ISOdia
+ '©' => array('(c)'), # copyright sign, U+00A9 ISOnum
+ 'ª' => array(''), # feminine ordinal indicator, U+00AA ISOnum
+ '«' => array('"'), # left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ '¬' => array(''), # not sign, U+00AC ISOnum
+ '­' => array('-'), # soft hyphen = discretionary hyphen, U+00AD ISOnum
+ '®' => array('(r)'), # registered sign = registered trade mark sign, U+00AE ISOnum
+ '¯' => array(''), # macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ '²' => array('^2'), # superscript two = superscript digit two = squared, U+00B2 ISOnum
+ '³' => array('^3'), # superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ '´' => array(''), # acute accent = spacing acute, U+00B4 ISOdia
+ 'µ' => array('mu'), # micro sign, U+00B5 ISOnum
+ '·' => array('.'), # middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ '¸' => array(''), # cedilla = spacing cedilla, U+00B8 ISOdia
+ '¹' => array('^1'), # superscript one = superscript digit one, U+00B9 ISOnum
+ 'º' => array(''), # masculine ordinal indicator, U+00BA ISOnum
+ '»' => array('"'), # right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ '¼' => array('1/4'), # vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ '½' => array('1/2'), # vulgar fraction one half = fraction one half, U+00BD ISOnum
+ '¾' => array('3/4'), # vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ '¿' => array('?'), # inverted question mark = turned question mark, U+00BF ISOnum
+ 'À' => array('A'), # latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ 'Á' => array('A'), # latin capital letter A with acute, U+00C1 ISOlat1
+ 'Â' => array('A'), # latin capital letter A with circumflex, U+00C2 ISOlat1
+ 'Ã' => array('A'), # latin capital letter A with tilde, U+00C3 ISOlat1
+ 'Ä' => array('Ae', 'A'), # latin capital letter A with diaeresis, U+00C4 ISOlat1
+ 'Å' => array('A'), # latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ 'Æ' => array('AE'), # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ 'Ç' => array('C'), # latin capital letter C with cedilla, U+00C7 ISOlat1
+ 'È' => array('E'), # latin capital letter E with grave, U+00C8 ISOlat1
+ 'É' => array('E'), # latin capital letter E with acute, U+00C9 ISOlat1
+ 'Ê' => array('E'), # latin capital letter E with circumflex, U+00CA ISOlat1
+ 'Ë' => array('Ee', 'E'), # latin capital letter E with diaeresis, U+00CB ISOlat1
+ 'Ì' => array('I'), # latin capital letter I with grave, U+00CC ISOlat1
+ 'Í' => array('I'), # latin capital letter I with acute, U+00CD ISOlat1
+ 'Î' => array('I'), # latin capital letter I with circumflex, U+00CE ISOlat1
+ 'Ï' => array('Ie', 'I'), # latin capital letter I with diaeresis, U+00CF ISOlat1
+ 'Ð' => array('I'), # latin capital letter ETH, U+00D0 ISOlat1
+ 'Ñ' => array('N'), # latin capital letter N with tilde, U+00D1 ISOlat1
+ 'Ò' => array('O'), # latin capital letter O with grave, U+00D2 ISOlat1
+ 'Ó' => array('O'), # latin capital letter O with acute, U+00D3 ISOlat1
+ 'Ô' => array('O'), # latin capital letter O with circumflex, U+00D4 ISOlat1
+ 'Õ' => array('O'), # latin capital letter O with tilde, U+00D5 ISOlat1
+ 'Ö' => array('Oe', 'O'), # latin capital letter O with diaeresis, U+00D6 ISOlat1
+ '×' => array('*'), # multiplication sign, U+00D7 ISOnum
+ 'Ø' => array('O'), # latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ 'Ù' => array('U'), # latin capital letter U with grave, U+00D9 ISOlat1
+ 'Ú' => array('U'), # latin capital letter U with acute, U+00DA ISOlat1
+ 'Û' => array('U'), # latin capital letter U with circumflex, U+00DB ISOlat1
+ 'Ü' => array('Ue', 'U'), # latin capital letter U with diaeresis, U+00DC ISOlat1
+ 'Ý' => array('Y'), # latin capital letter Y with acute, U+00DD ISOlat1
+ 'Þ' => array('Th'), # latin capital letter THORN, U+00DE ISOlat1
+ 'ß' => array('ss', 'sz'), # latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ 'à' => array('a'), # latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ 'á' => array('a'), # latin small letter a with acute, U+00E1 ISOlat1
+ 'â' => array('a'), # latin small letter a with circumflex, U+00E2 ISOlat1
+ 'ã' => array('a'), # latin small letter a with tilde, U+00E3 ISOlat1
+ 'ä' => array('ae', 'a'), # latin small letter a with diaeresis, U+00E4 ISOlat1
+ 'å' => array('a'), # latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ 'æ' => array('ae'), # latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ 'ç' => array('c'), # latin small letter c with cedilla, U+00E7 ISOlat1
+ 'è' => array('e'), # latin small letter e with grave, U+00E8 ISOlat1
+ 'é' => array('e'), # latin small letter e with acute, U+00E9 ISOlat1
+ 'ê' => array('e'), # latin small letter e with circumflex, U+00EA ISOlat1
+ 'ë' => array('ee', 'e'), # latin small letter e with diaeresis, U+00EB ISOlat1
+ 'ì' => array('i'), # latin small letter i with grave, U+00EC ISOlat1
+ 'í' => array('i'), # latin small letter i with acute, U+00ED ISOlat1
+ 'î' => array('i'), # latin small letter i with circumflex, U+00EE ISOlat1
+ 'ï' => array('ie', 'i'), # latin small letter i with diaeresis, U+00EF ISOlat1
+ 'ð' => array('eth'), # latin small letter eth, U+00F0 ISOlat1
+ 'ñ' => array('n'), # latin small letter n with tilde, U+00F1 ISOlat1
+ 'ò' => array('o'), # latin small letter o with grave, U+00F2 ISOlat1
+ 'ó' => array('o'), # latin small letter o with acute, U+00F3 ISOlat1
+ 'ô' => array('o'), # latin small letter o with circumflex, U+00F4 ISOlat1
+ 'õ' => array('o'), # latin small letter o with tilde, U+00F5 ISOlat1
+ 'ö' => array('oe', 'o'), # latin small letter o with diaeresis, U+00F6 ISOlat1
+ '÷' => array('/'), # division sign, U+00F7 ISOnum
+ 'ø' => array('o'), # latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ 'ù' => array('o'), # latin small letter u with grave, U+00F9 ISOlat1
+ 'ú' => array('u'), # latin small letter u with acute, U+00FA ISOlat1
+ 'û' => array('u'), # latin small letter u with circumflex, U+00FB ISOlat1
+ 'ü' => array('u'), # latin small letter u with diaeresis, U+00FC ISOlat1
+ 'ý' => array('y'), # latin small letter y with acute, U+00FD ISOlat1
+ 'þ' => array('th'), # latin small letter thorn, U+00FE ISOlat1
+ 'ÿ' => array('y', 'ij', 'ii', 'ei'), # latin small letter y with diaeresis, U+00FF ISOlat1
+ 'ƒ' => array('f'), # latin small f with hook = function = florin, U+0192 ISOtech
+ '…' => array('...'), # horizontal ellipsis = three dot leader, U+2026 ISOpub
+ '′' => array('\''), # prime = minutes = feet, U+2032 ISOtech
+ '″' => array('"'), # double prime = seconds = inches, U+2033 ISOtech
+ '‾' => array(''), # overline = spacing overscore, U+203E NEW
+ '⁄' => array('/'), # fraction slash, U+2044 NEW
+ '™' => array('(tm)', 'tm'), # trade mark sign, U+2122 ISOnum
+ '−' => array('-'), # minus sign, U+2212 ISOtech
+ '∗' => array('*'), # asterisk operator, U+2217 ISOtech
+ '∼' => array('~'), # tilde operator = varies with = similar to, U+223C ISOtech
+ '⊕' => array('+'), # circled plus = direct sum, U+2295 ISOamsb
+ '⊗' => array('*'), # circled times = vector product, U+2297 ISOamsb
+ 'Œ' => array('OE'), # latin capital ligature OE, U+0152 ISOlat2
+ 'œ' => array('oe'), # latin small ligature oe, U+0153 ISOlat2
+ 'Š' => array('s'), # latin capital letter S with caron, U+0160 ISOlat2
+ 'š' => array('s'), # latin small letter s with caron, U+0161 ISOlat2
+ 'Ÿ' => array('Y', 'Ij', 'Ii', 'Ei'), # latin capital letter Y with diaeresis, U+0178 ISOlat2
+ 'ˆ' => array(''), # modifier letter circumflex accent, U+02C6 ISOpub
+ '˜' => array('~'), # small tilde, U+02DC ISOdia
+ ' ' => array(' '), # en space, U+2002 ISOpub
+ ' ' => array(' '), # em space, U+2003 ISOpub
+ ' ' => array(' '), # thin space, U+2009 ISOpub
+ '–' => array('-'), # em dash, U+2014 ISOpub
+ '—' => array('-'), # em dash, U+2014 ISOpub
+ '‘' => array('\''), # left single quotation mark, U+2018 ISOnum
+ '’' => array('\''), # right single quotation mark, U+2019 ISOnum
+ '‚' => array('\''), # single low-9 quotation mark, U+201A NEW
+ '“' => array('"'), # left double quotation mark, U+201C ISOnum
+ '”' => array('"'), # right double quotation mark, U+201D ISOnum
+ '„' => array('"'), # double low-9 quotation mark, U+201E NEW
+ '‹' => array('\''), # single left-pointing angle quotation mark, U+2039 ISO proposed
+ '›' => array('\''), # single right-pointing angle quotation mark, U+203A ISO proposed
+ );
+
+ $variants = array($name);
+
+ foreach($replacements as $rk => $rv) {
+ $vnew = array();
+ foreach($variants as $variant) {
+ foreach($rv as $rv1) {
+ $vnew[] = str_replace($rk, $rv1, $variant);
+ }
+ }
+ $variants = $vnew;
+ }
+
+ $variants = array_filter($variants, function($a) { return false === strstr($a, "&"); } );
+
+ return $variants;
+}
+
function compareName($requested, $acceptable) {
if(empty($acceptable) || empty($requested)) {
return false;
@@ -345,6 +487,13 @@ function compareName($requested, $acceptable) {
return true;
}
+ $variants = expandVariants($acceptable);
+ foreach($variants as $acceptable_variant) {
+ if(0 === strcasecmp($requested, $acceptable_variant)) {
+ return true;
+ }
+ }
+
return false;
}