From 2965a981b7ec22866fbdf2d567d87e2d068d3617 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 31 Jul 2015 16:04:08 -0400
Subject: [PATCH] Allow to search and import missing PGP pubkeys from keyservers using Publickey.js
---
program/lib/Roundcube/rcube_string_replacer.php | 45 +++++++++++++++++++++++++++++++++++++++++----
1 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php
index 0fc90a5..ce61e53 100644
--- a/program/lib/Roundcube/rcube_string_replacer.php
+++ b/program/lib/Roundcube/rcube_string_replacer.php
@@ -24,11 +24,16 @@
*/
class rcube_string_replacer
{
- public static $pattern = '/##str_replacement\[([0-9]+)\]##/';
+ public static $pattern = '/##str_replacement_(\d+)##/';
public $mailto_pattern;
public $link_pattern;
+ public $linkref_index;
+ public $linkref_pattern;
+
private $values = array();
private $options = array();
+ private $linkrefs = array();
+ private $urls = array();
function __construct($options = array())
@@ -37,14 +42,16 @@
// Support unicode/punycode in top-level domain part
$utf_domain = '[^?&@"\'\\/()<>\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})';
$url1 = '.:;,';
- $url2 = 'a-zA-Z0-9%=#$@+?!&\\/_~\\[\\]\\(\\){}\*-';
+ $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*\x80-\xFE-';
- $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]?[$url2]+)*)/";
+ $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]*[$url2]+)*)/";
$this->mailto_pattern = "/("
."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part
."@$utf_domain" // domain-part
."(\?[$url1$url2]+)?" // e.g. ?subject=test...
.")/";
+ $this->linkref_index = '/\[([^\]#]+)\](:?\s*##str_replacement_(\d+)##)/';
+ $this->linkref_pattern = '/\[([^\]#]+)\]/';
$this->options = $options;
}
@@ -67,7 +74,7 @@
*/
public function get_replacement($i)
{
- return '##str_replacement['.$i.']##';
+ return '##str_replacement_' . $i . '##';
}
/**
@@ -96,11 +103,38 @@
$attrib['href'] = $url_prefix . $url;
$i = $this->add(html::a($attrib, rcube::Q($url)) . $suffix);
+ $this->urls[$i] = $attrib['href'];
}
// Return valid link for recognized schemes, otherwise
// return the unmodified string for unrecognized schemes.
return $i >= 0 ? $prefix . $this->get_replacement($i) : $matches[0];
+ }
+
+ /**
+ * Callback to add an entry to the link index
+ */
+ public function linkref_addindex($matches)
+ {
+ $key = $matches[1];
+ $this->linkrefs[$key] = $this->urls[$matches[3]];
+
+ return $this->get_replacement($this->add('['.$key.']')) . $matches[2];
+ }
+
+ /**
+ * Callback to replace link references with real links
+ */
+ public function linkref_callback($matches)
+ {
+ $i = 0;
+ if ($url = $this->linkrefs[$matches[1]]) {
+ $attrib = (array)$this->options['link_attribs'];
+ $attrib['href'] = $url;
+ $i = $this->add(html::a($attrib, rcube::Q($matches[1])));
+ }
+
+ return $i > 0 ? '['.$this->get_replacement($i).']' : $matches[0];
}
/**
@@ -142,6 +176,9 @@
// search for patterns like links and e-mail addresses
$str = preg_replace_callback($this->link_pattern, array($this, 'link_callback'), $str);
$str = preg_replace_callback($this->mailto_pattern, array($this, 'mailto_callback'), $str);
+ // resolve link references
+ $str = preg_replace_callback($this->linkref_index, array($this, 'linkref_addindex'), $str);
+ $str = preg_replace_callback($this->linkref_pattern, array($this, 'linkref_callback'), $str);
return $str;
}
--
Gitblit v1.9.1