Skip to content
Snippets Groups Projects
Unverified Commit c77f9b14 authored by Seamus Lee's avatar Seamus Lee Committed by GitHub
Browse files

Merge pull request #15475 from mecachisenros/externUrl

#1100 Add externUrl method and civicrm_alterExternUrl hook
parents 87dab41a 095e7f1c
Branches
Tags
No related merge requests found
......@@ -39,6 +39,8 @@ class CRM_Contribute_Form_ContributionPage_Widget extends CRM_Contribute_Form_Co
$this->assign('cpageId', $this->_id);
$this->assign('widgetExternUrl', CRM_Utils_System::externUrl('extern/widget', "cpageId={$this->_id}&widgetId={$this->_widget->id}&format=3"));
$config = CRM_Core_Config::singleton();
$title = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionPage',
$this->_id,
......
......@@ -121,7 +121,7 @@ class CRM_Core_Payment_PaymentExpress extends CRM_Core_Payment {
CRM_Core_Error::fatal(ts('Component is invalid'));
}
$url = $config->userFrameworkResourceURL . "extern/pxIPN.php";
$url = CRM_Utils_System::externUrl('extern/pxIPN');
if ($component == 'event') {
$cancelURL = CRM_Utils_System::url('civicrm/event/register',
......
......@@ -29,22 +29,7 @@ class CRM_Cxn_BAO_Cxn extends CRM_Cxn_DAO_Cxn {
* @return string
*/
public static function getSiteCallbackUrl() {
$config = CRM_Core_Config::singleton();
if (preg_match('/^(http|https):/', $config->resourceBase)) {
$civiUrl = $config->resourceBase;
}
else {
$civiUrl = rtrim(CRM_Utils_System::baseURL(), '/') . '/' . ltrim($config->resourceBase, '/');
}
// In practice, this may not be necessary, but we want to prevent
// edge-cases that downgrade security-level below system policy.
if (Civi::settings()->get('enableSSL')) {
$civiUrl = preg_replace('/^http:/', 'https:', $civiUrl);
}
return rtrim($civiUrl, '/') . '/extern/cxn.php';
return CRM_Utils_System::externUrl('extern/cxn', NULL, NULL, TRUE, TRUE);
}
/**
......
......@@ -1139,8 +1139,8 @@ ORDER BY civicrm_email.is_bulkmail DESC
// push the tracking url on to the html email if necessary
if ($this->open_tracking && $html) {
array_push($html, "\n" . '<img src="' . $config->userFrameworkResourceURL .
"extern/open.php?q=$event_queue_id\" width='1' height='1' alt='' border='0'>"
array_push($html, "\n" . '<img src="' . CRM_Utils_System::externUrl('extern/open', "q=$event_queue_id")
. '" width="1" height="1" alt="" border="0">'
);
}
......
......@@ -57,7 +57,6 @@ class CRM_Mailing_BAO_TrackableURL extends CRM_Mailing_DAO_TrackableURL {
else {
$hrefExists = FALSE;
$config = CRM_Core_Config::singleton();
$tracker = new CRM_Mailing_BAO_TrackableURL();
if (preg_match('/^href/i', $url)) {
......@@ -73,11 +72,11 @@ class CRM_Mailing_BAO_TrackableURL extends CRM_Mailing_DAO_TrackableURL {
}
$id = $tracker->id;
$redirect = $config->userFrameworkResourceURL . "extern/url.php?u=$id";
$redirect = CRM_Utils_System::externUrl('extern/url', "u=$id");
$urlCache[$mailing_id . $url] = $redirect;
}
$returnUrl = "{$urlCache[$mailing_id . $url]}&qid={$queue_id}";
$returnUrl = CRM_Utils_System::externUrl('extern/url', "u=$id&qid=$queue_id");
if ($hrefExists) {
$returnUrl = "href='{$returnUrl}' rel='nofollow'";
......
......@@ -284,6 +284,41 @@ class CRM_Utils_System {
return $url;
}
/**
* Generates an extern url.
*
* @param string $path
* The extern path, such as "extern/url".
* @param string $query
* A query string to append to the link.
* @param string $fragment
* A fragment identifier (named anchor) to append to the link.
* @param bool $absolute
* Whether to force the output to be an absolute link (beginning with a
* URI-scheme such as 'http:').
* @param bool $isSSL
* NULL to autodetect. TRUE to force to SSL.
*/
public static function externUrl($path = NULL, $query = NULL, $fragment = NULL, $absolute = TRUE, $isSSL = NULL) {
$query = self::makeQueryString($query);
$url = Civi::paths()->getUrl("[civicrm.root]/{$path}.php", $absolute ? 'absolute' : 'relative', $isSSL)
. ($query ? "?$query" : "")
. ($fragment ? "#$fragment" : "");
$parsedUrl = CRM_Utils_Url::parseUrl($url);
$event = \Civi\Core\Event\GenericHookEvent::create([
'url' => &$parsedUrl,
'path' => $path,
'query' => $query,
'fragment' => $fragment,
'absolute' => $absolute,
'isSSL' => $isSSL,
]);
Civi::service('dispatcher')->dispatch('hook_civicrm_alterExternUrl', $event);
return CRM_Utils_Url::unparseUrl($event->url);
}
/**
* Path of the current page e.g. 'civicrm/contact/view'
*
......
......@@ -211,4 +211,4 @@ function onReady( ) {
}
</script>
{/literal}
<script type="text/javascript" src="{$config->userFrameworkResourceURL}/extern/widget.php?cpageId={$cpageId}&widgetId={$widget_id}&format=3"></script>
<script type="text/javascript" src="{$widgetExternUrl}"></script>
......@@ -114,6 +114,78 @@ class CRM_Utils_SystemTest extends CiviUnitTestCase {
];
}
/**
* Test extern url.
*/
public function testExternUrl() {
$siteKey = mt_rand();
$apiKey = mt_rand();
$restUrl = CRM_Utils_System::externUrl('extern/rest', "entity=Contact&action=get&key=$siteKey&api_key=$apiKey");
$this->assertContains('extern/rest.php', $restUrl);
$this->assertContains('?', $restUrl);
$this->assertContains('entity=Contact', $restUrl);
$this->assertContains('action=get', $restUrl);
$this->assertContains("key=$siteKey", $restUrl);
$this->assertContains("api_key=$apiKey", $restUrl);
}
/**
* Test the alterExternUrl hook.
*
* @param string $path
* @param array $expected
*
* @dataProvider getExternURLs
*/
public function testAlterExternUrlHook($path, $expected) {
Civi::service('dispatcher')->addListener('hook_civicrm_alterExternUrl', [$this, 'hook_civicrm_alterExternUrl']);
$externUrl = CRM_Utils_System::externUrl($path, $expected['query']);
$this->assertContains('path/altered/by/hook', $externUrl, 'Hook failed to alter URL path');
$this->assertContains($expected['query'] . '&thisWas=alteredByHook', $externUrl, 'Hook failed to alter URL query');
}
/**
* Hook for alterExternUrl.
*
* @param \Civi\Core\Event\GenericHookEvent $event
* @param string $hookName
*/
public function hook_civicrm_alterExternUrl(\Civi\Core\Event\GenericHookEvent $event, $hookName) {
$this->assertEquals('hook_civicrm_alterExternUrl', $hookName);
$this->assertTrue($event->hasField('url'));
$this->assertTrue($event->hasField('path'));
$this->assertTrue($event->hasField('query'));
$this->assertTrue($event->hasField('fragment'));
$this->assertTrue($event->hasField('absolute'));
$this->assertTrue($event->hasField('isSSL'));
$event->url = $event->url->withPath('path/altered/by/hook');
$event->url = $event->url->withQuery($event->query . '&thisWas=alteredByHook');
}
/**
* Get extern url params for testing.
*
* @return array
*/
public function getExternURLs() {
return [
[
'extern/url',
[
'path' => 'extern/url',
'query' => 'u=1&qid=1',
],
],
[
'extern/open',
[
'path' => 'extern/open',
'query' => 'q=1',
],
],
];
}
/**
* Demonstrate the, um, "flexibility" of isNull
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment