diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php
index cf465980..487a20ae 100644
--- a/cfg/conf.sample.php
+++ b/cfg/conf.sample.php
@@ -227,3 +227,15 @@ dir = PATH "data"
;bucket = "my-bucket"
;accesskey = "access key id"
;secretkey = "secret access key"
+
+[yourls]
+; don't mix this up with "urlshortener" config item:
+; - when using a standard configuration, "urlshortener" will point to the YOURLS API, including access credentials, and will be part of the PrivateBin public web page (insecure!)
+; - when using the parameters in this section ("signature" and "apiurl"), "urlshortener" will point to a fixed PrivateBin page ("$basepath/shortenviayourls.php") and
+; that PHP will in turn call YOURLS server-side, using the URL from "apiurl" and using the "access signature" from "signature" parameter.
+
+; (optional) the "signature" (access key) issued by YOURLS for the using account
+; signature = ""
+
+; (optional) the URL of the YOURLS API, called to shorten a PrivateBin URL
+; apiurl = ""
diff --git a/lib/Configuration.php b/lib/Configuration.php
index fad44a27..6f3a8225 100644
--- a/lib/Configuration.php
+++ b/lib/Configuration.php
@@ -93,6 +93,10 @@ class Configuration
'model_options' => array(
'dir' => 'data',
),
+ 'yourls' => array(
+ 'signature' => '',
+ 'apiurl' => '',
+ ),
);
/**
diff --git a/shortenviayourls.php b/shortenviayourls.php
new file mode 100644
index 00000000..28022819
--- /dev/null
+++ b/shortenviayourls.php
@@ -0,0 +1,85 @@
+getKey( "basepath") . "/?")) {
+
+ // Init the CURL session
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $conf->getKey( "apiurl", "yourls"));
+ curl_setopt($ch, CURLOPT_HEADER, 0); // No header in the result
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return, do not echo result
+ curl_setopt($ch, CURLOPT_POST, 1); // This is a POST request
+ curl_setopt($ch, CURLOPT_POSTFIELDS, array( // Data to POST
+ 'signature' => $conf->getKey( "signature", "yourls"),
+ 'format' => 'json',
+ 'action' => 'shorturl',
+ 'url' => $originalUrl
+ ));
+ // Fetch and return content
+ $data = curl_exec($ch);
+ curl_close($ch);
+ if (!($data === FALSE) && is_string($data))
+ {
+ $data = json_decode( $data, true);
+
+ if (!is_null($data) && array_key_exists('statusCode', $data)
+ && array_key_exists('shorturl', $data) && ($data['statusCode'] == 200))
+ {
+ $shortenedUrl = $data['shorturl'];
+ $opSuccess = TRUE;
+ } else {
+ // error with contents of YOURLS response.
+ $errCode = 3;
+ }
+ } else {
+ // error when calling YOURLS - probably a PrivateBin configuration issue, like wrong/missing apiurl or signature
+ $errCode = 2;
+ }
+ } else {
+ // trying to shorten a URL not pointing to our PrivateBin instance.
+ $errCode = 1;
+ }
+}
+
+if ($opSuccess)
+{
+ print("
Your shortened paste is $shortenedUrl");
+}
+else
+{
+ print("
Error: An error occured while trying to shorten the given URL (error code $errCode)");
+}
+
+function getGetData() {
+ $data = http_build_query($_GET);
+ return $data;
+}
+
+function startsWith($haystack, $needle)
+{
+ $length = strlen($needle);
+ return (substr($haystack, 0, $length) === $needle);
+}
+?>