2012-04-30 01:15:06 +08:00
< ? php
/**
2016-07-11 17:58:15 +08:00
* PrivateBin
2012-04-30 01:15:06 +08:00
*
* a zero - knowledge paste bin
*
2016-07-11 17:58:15 +08:00
* @ link https :// github . com / PrivateBin / PrivateBin
2012-04-30 01:15:06 +08:00
* @ copyright 2012 Sébastien SAUVAGE ( sebsauvage . net )
2016-07-19 19:56:52 +08:00
* @ license https :// www . opensource . org / licenses / zlib - license . php The zlib / libpng License
2023-07-09 14:44:22 +08:00
* @ version 1.5 . 2
2012-04-30 01:15:06 +08:00
*/
2016-12-13 01:43:23 +08:00
2016-12-13 01:50:00 +08:00
namespace PrivateBin ;
2016-07-21 23:09:48 +08:00
use Exception ;
2016-10-29 16:24:08 +08:00
use PrivateBin\Persistence\ServerSalt ;
use PrivateBin\Persistence\TrafficLimiter ;
2016-07-21 23:09:48 +08:00
2012-04-30 01:15:06 +08:00
/**
2018-07-29 21:17:35 +08:00
* Controller
2012-04-30 01:15:06 +08:00
*
2018-07-29 21:17:35 +08:00
* Puts it all together .
2012-04-30 01:15:06 +08:00
*/
2018-07-29 21:17:35 +08:00
class Controller
2012-04-30 01:15:06 +08:00
{
2015-08-16 21:55:31 +08:00
/**
* version
*
* @ const string
2012-04-30 01:15:06 +08:00
*/
2023-07-09 14:44:22 +08:00
const VERSION = '1.5.2' ;
2012-04-30 01:15:06 +08:00
2017-03-25 02:20:34 +08:00
/**
* minimal required PHP version
*
* @ const string
*/
2020-02-06 02:30:14 +08:00
const MIN_PHP_VERSION = '5.6.0' ;
2017-03-25 02:20:34 +08:00
2015-09-01 04:10:41 +08:00
/**
* show the same error message if the paste expired or does not exist
*
* @ const string
*/
const GENERIC_ERROR = 'Paste does not exist, has expired or has been deleted.' ;
2012-04-30 01:15:06 +08:00
/**
2015-09-23 05:21:31 +08:00
* configuration
2015-08-16 21:55:31 +08:00
*
2012-04-30 01:15:06 +08:00
* @ access private
2016-08-09 17:54:42 +08:00
* @ var Configuration
2012-04-30 01:15:06 +08:00
*/
2015-09-23 05:21:31 +08:00
private $_conf ;
2012-04-30 01:15:06 +08:00
/**
2015-08-16 21:55:31 +08:00
* error message
*
2012-04-30 01:15:06 +08:00
* @ access private
* @ var string
*/
private $_error = '' ;
2013-11-01 08:15:14 +08:00
/**
2015-08-16 21:55:31 +08:00
* status message
*
2013-11-01 08:15:14 +08:00
* @ access private
* @ var string
*/
private $_status = '' ;
2015-09-02 04:33:07 +08:00
/**
* JSON message
*
* @ access private
* @ var string
*/
private $_json = '' ;
2012-04-30 01:15:06 +08:00
/**
2015-09-27 09:03:55 +08:00
* Factory of instance models
2015-08-16 21:55:31 +08:00
*
2012-04-30 01:15:06 +08:00
* @ access private
2015-09-27 09:03:55 +08:00
* @ var model
2012-04-30 01:15:06 +08:00
*/
private $_model ;
2015-09-28 02:34:39 +08:00
/**
* request
*
* @ access private
* @ var request
*/
private $_request ;
2015-10-18 20:37:58 +08:00
/**
* URL base
*
* @ access private
* @ var string
*/
2016-08-09 17:54:42 +08:00
private $_urlBase ;
2015-10-18 20:37:58 +08:00
2012-04-30 01:15:06 +08:00
/**
* constructor
*
2016-07-11 17:58:15 +08:00
* initializes and runs PrivateBin
2012-04-30 01:15:06 +08:00
*
* @ access public
2016-08-22 15:46:26 +08:00
* @ throws Exception
2012-04-30 01:15:06 +08:00
*/
public function __construct ()
{
2017-03-25 02:20:34 +08:00
if ( version_compare ( PHP_VERSION , self :: MIN_PHP_VERSION ) < 0 ) {
throw new Exception ( I18n :: _ ( '%s requires php %s or above to work. Sorry.' , I18n :: _ ( 'PrivateBin' ), self :: MIN_PHP_VERSION ), 1 );
2015-09-02 04:33:07 +08:00
}
2016-08-22 15:46:26 +08:00
if ( strlen ( PATH ) < 0 && substr ( PATH , - 1 ) !== DIRECTORY_SEPARATOR ) {
2017-01-01 23:33:11 +08:00
throw new Exception ( I18n :: _ ( '%s requires the PATH to end in a "%s". Please update the PATH in your index.php.' , I18n :: _ ( 'PrivateBin' ), DIRECTORY_SEPARATOR ), 5 );
2016-08-22 15:46:26 +08:00
}
2012-04-30 01:15:06 +08:00
2016-08-09 17:54:42 +08:00
// load config from ini file, initialize required classes
2012-04-30 01:15:06 +08:00
$this -> _init ();
2016-07-26 14:19:35 +08:00
switch ( $this -> _request -> getOperation ()) {
2015-09-28 02:34:39 +08:00
case 'create' :
$this -> _create ();
break ;
case 'delete' :
$this -> _delete (
$this -> _request -> getParam ( 'pasteid' ),
$this -> _request -> getParam ( 'deletetoken' )
);
break ;
case 'read' :
$this -> _read ( $this -> _request -> getParam ( 'pasteid' ));
break ;
2015-10-18 20:37:58 +08:00
case 'jsonld' :
$this -> _jsonld ( $this -> _request -> getParam ( 'jsonld' ));
return ;
2022-10-23 14:10:56 +08:00
case 'yourlsproxy' :
$this -> _yourlsproxy ( $this -> _request -> getParam ( 'link' ));
break ;
2012-04-30 01:15:06 +08:00
}
2015-09-02 04:33:07 +08:00
// output JSON or HTML
2016-07-26 14:19:35 +08:00
if ( $this -> _request -> isJsonApiCall ()) {
2016-08-09 17:54:42 +08:00
header ( 'Content-type: ' . Request :: MIME_JSON );
2015-10-18 20:37:58 +08:00
header ( 'Access-Control-Allow-Origin: *' );
header ( 'Access-Control-Allow-Methods: GET, POST, PUT, DELETE' );
header ( 'Access-Control-Allow-Headers: X-Requested-With, Content-Type' );
2015-09-02 04:33:07 +08:00
echo $this -> _json ;
2016-07-26 14:19:35 +08:00
} else {
2015-09-02 04:33:07 +08:00
$this -> _view ();
}
2012-04-30 01:15:06 +08:00
}
/**
2018-07-29 21:17:35 +08:00
* initialize PrivateBin
2012-04-30 01:15:06 +08:00
*
* @ access private
2019-05-14 04:31:52 +08:00
* @ throws Exception
2012-04-30 01:15:06 +08:00
*/
private function _init ()
{
2016-08-15 22:45:47 +08:00
$this -> _conf = new Configuration ;
$this -> _model = new Model ( $this -> _conf );
2016-08-09 17:54:42 +08:00
$this -> _request = new Request ;
2018-01-06 17:27:58 +08:00
$this -> _urlBase = $this -> _request -> getRequestUri ();
2015-10-19 02:38:07 +08:00
// set default language
$lang = $this -> _conf -> getKey ( 'languagedefault' );
2016-08-09 17:54:42 +08:00
I18n :: setLanguageFallback ( $lang );
2015-10-19 02:38:07 +08:00
// force default language, if language selection is disabled and a default is set
2016-07-26 14:19:35 +08:00
if ( ! $this -> _conf -> getKey ( 'languageselection' ) && strlen ( $lang ) == 2 ) {
2015-10-19 02:38:07 +08:00
$_COOKIE [ 'lang' ] = $lang ;
2021-04-17 02:15:12 +08:00
setcookie ( 'lang' , $lang , 0 , '' , '' , true );
2015-10-19 02:38:07 +08:00
}
2012-04-30 01:15:06 +08:00
}
/**
2013-11-01 08:15:14 +08:00
* Store new paste or comment
2012-04-30 01:15:06 +08:00
*
2015-09-17 04:51:48 +08:00
* POST contains one or both :
2019-05-04 05:03:57 +08:00
* data = json encoded FormatV2 encrypted text ( containing keys : iv , v , iter , ks , ts , mode , adata , cipher , salt , ct )
* attachment = json encoded FormatV2 encrypted text ( containing keys : iv , v , iter , ks , ts , mode , adata , cipher , salt , ct )
2012-04-30 01:15:06 +08:00
*
* All optional data will go to meta information :
2012-05-20 05:59:41 +08:00
* expire ( optional ) = expiration delay ( never , 5 min , 10 min , 1 hour , 1 day , 1 week , 1 month , 1 year , burn ) ( default : never )
2015-09-17 04:51:48 +08:00
* formatter ( optional ) = format to display the paste as ( plaintext , syntaxhighlighting , markdown ) ( default : syntaxhighlighting )
* burnafterreading ( optional ) = if this paste may only viewed once ? ( 0 / 1 ) ( default : 0 )
2012-04-30 01:15:06 +08:00
* opendiscusssion ( optional ) = is the discussion allowed on this paste ? ( 0 / 1 ) ( default : 0 )
2019-05-04 05:03:57 +08:00
* attachmentname = json encoded FormatV2 encrypted text ( containing keys : iv , v , iter , ks , ts , mode , adata , cipher , salt , ct )
* nickname ( optional ) = in discussion , encoded FormatV2 encrypted text nickname of author of comment ( containing keys : iv , v , iter , ks , ts , mode , adata , cipher , salt , ct )
2012-04-30 01:15:06 +08:00
* parentid ( optional ) = in discussion , which comment this comment replies to .
* pasteid ( optional ) = in discussion , which paste this comment belongs to .
*
* @ access private
2015-08-28 05:58:56 +08:00
* @ return string
2012-04-30 01:15:06 +08:00
*/
2015-09-17 04:51:48 +08:00
private function _create ()
2012-04-30 01:15:06 +08:00
{
2021-06-13 16:44:26 +08:00
// Ensure last paste from visitors IP address was more than configured amount of seconds ago.
ServerSalt :: setStore ( $this -> _model -> getStore ());
TrafficLimiter :: setConfiguration ( $this -> _conf );
TrafficLimiter :: setStore ( $this -> _model -> getStore ());
2022-02-20 18:25:19 +08:00
try {
TrafficLimiter :: canPass ();
} catch ( Exception $e ) {
$this -> _return_message ( 1 , $e -> getMessage ());
2019-05-19 15:42:55 +08:00
return ;
2016-07-26 14:19:35 +08:00
}
2012-04-30 01:15:06 +08:00
2019-05-09 04:11:21 +08:00
$data = $this -> _request -> getData ();
2019-05-10 13:55:39 +08:00
$isComment = array_key_exists ( 'pasteid' , $data ) &&
! empty ( $data [ 'pasteid' ]) &&
array_key_exists ( 'parentid' , $data ) &&
! empty ( $data [ 'parentid' ]);
if ( ! FormatV2 :: isValid ( $data , $isComment )) {
2019-05-19 15:42:55 +08:00
$this -> _return_message ( 1 , I18n :: _ ( 'Invalid data.' ));
return ;
2019-05-10 13:55:39 +08:00
}
2015-09-23 05:21:31 +08:00
$sizelimit = $this -> _conf -> getKey ( 'sizelimit' );
2019-05-14 04:31:52 +08:00
// Ensure content is not too big.
2019-05-09 04:11:21 +08:00
if ( strlen ( $data [ 'ct' ]) > $sizelimit ) {
2019-05-19 15:42:55 +08:00
$this -> _return_message (
2019-05-09 04:11:21 +08:00
1 ,
I18n :: _ (
'Paste is limited to %s of encrypted data.' ,
Filter :: formatHumanReadableSize ( $sizelimit )
)
);
2019-05-19 15:42:55 +08:00
return ;
2016-07-19 21:26:41 +08:00
}
2015-09-27 09:03:55 +08:00
// The user posts a comment.
2019-05-10 13:55:39 +08:00
if ( $isComment ) {
2019-05-09 04:11:21 +08:00
$paste = $this -> _model -> getPaste ( $data [ 'pasteid' ]);
2015-09-27 09:03:55 +08:00
if ( $paste -> exists ()) {
try {
2019-05-09 04:11:21 +08:00
$comment = $paste -> getComment ( $data [ 'parentid' ]);
2015-09-27 09:03:55 +08:00
$comment -> setData ( $data );
$comment -> store ();
2016-07-26 14:19:35 +08:00
} catch ( Exception $e ) {
2019-05-19 15:42:55 +08:00
$this -> _return_message ( 1 , $e -> getMessage ());
return ;
2015-09-27 09:03:55 +08:00
}
$this -> _return_message ( 0 , $comment -> getId ());
2016-07-26 14:19:35 +08:00
} else {
2019-05-15 13:44:03 +08:00
$this -> _return_message ( 1 , I18n :: _ ( 'Invalid data.' ));
2015-09-12 23:33:16 +08:00
}
}
2015-09-27 09:03:55 +08:00
// The user posts a standard paste.
2016-07-26 14:19:35 +08:00
else {
2016-07-15 23:02:59 +08:00
$this -> _model -> purge ();
2015-09-27 09:03:55 +08:00
$paste = $this -> _model -> getPaste ();
try {
2015-10-03 23:54:18 +08:00
$paste -> setData ( $data );
2015-09-27 09:03:55 +08:00
$paste -> store ();
} catch ( Exception $e ) {
return $this -> _return_message ( 1 , $e -> getMessage ());
}
$this -> _return_message ( 0 , $paste -> getId (), array ( 'deletetoken' => $paste -> getDeleteToken ()));
2012-04-30 01:15:06 +08:00
}
}
2013-02-24 21:33:51 +08:00
/**
* Delete an existing paste
*
* @ access private
2013-11-01 08:15:14 +08:00
* @ param string $dataid
* @ param string $deletetoken
2013-02-24 21:33:51 +08:00
*/
private function _delete ( $dataid , $deletetoken )
{
2015-09-27 09:03:55 +08:00
try {
$paste = $this -> _model -> getPaste ( $dataid );
2016-07-26 14:19:35 +08:00
if ( $paste -> exists ()) {
2019-05-09 04:11:21 +08:00
// accessing this method ensures that the paste would be
2015-09-27 09:03:55 +08:00
// deleted if it has already expired
2019-05-09 04:11:21 +08:00
$paste -> get ();
2020-02-06 02:30:14 +08:00
if ( hash_equals ( $paste -> getDeleteToken (), $deletetoken )) {
2019-05-09 04:11:21 +08:00
// Paste exists and deletion token is valid: Delete the paste.
2017-02-23 04:42:14 +08:00
$paste -> delete ();
$this -> _status = 'Paste was properly deleted.' ;
2016-07-26 14:19:35 +08:00
} else {
2019-05-09 04:11:21 +08:00
$this -> _error = 'Wrong deletion token. Paste was not deleted.' ;
2015-09-27 09:03:55 +08:00
}
2016-07-26 14:19:35 +08:00
} else {
2015-09-27 09:03:55 +08:00
$this -> _error = self :: GENERIC_ERROR ;
2015-09-01 04:10:41 +08:00
}
2015-09-27 09:03:55 +08:00
} catch ( Exception $e ) {
$this -> _error = $e -> getMessage ();
2013-11-01 08:15:14 +08:00
}
2017-02-23 04:42:14 +08:00
if ( $this -> _request -> isJsonApiCall ()) {
if ( strlen ( $this -> _error )) {
$this -> _return_message ( 1 , $this -> _error );
} else {
$this -> _return_message ( 0 , $dataid );
}
}
2013-11-01 08:15:14 +08:00
}
2012-04-30 01:15:06 +08:00
/**
2018-05-27 20:36:30 +08:00
* Read an existing paste or comment , only allowed via a JSON API call
2012-04-30 01:15:06 +08:00
*
* @ access private
2013-11-01 08:15:14 +08:00
* @ param string $dataid
2012-04-30 01:15:06 +08:00
*/
2013-11-01 08:15:14 +08:00
private function _read ( $dataid )
2012-04-30 01:15:06 +08:00
{
2018-05-27 20:36:30 +08:00
if ( ! $this -> _request -> isJsonApiCall ()) {
return ;
}
2015-09-27 09:03:55 +08:00
try {
$paste = $this -> _model -> getPaste ( $dataid );
2016-07-26 14:19:35 +08:00
if ( $paste -> exists ()) {
2018-05-27 21:05:31 +08:00
$data = $paste -> get ();
2019-05-09 04:11:21 +08:00
if ( array_key_exists ( 'salt' , $data [ 'meta' ])) {
unset ( $data [ 'meta' ][ 'salt' ]);
2016-07-26 14:19:35 +08:00
}
2018-05-27 20:36:30 +08:00
$this -> _return_message ( 0 , $dataid , ( array ) $data );
2016-07-26 14:19:35 +08:00
} else {
2018-05-27 20:36:30 +08:00
$this -> _return_message ( 1 , self :: GENERIC_ERROR );
2012-04-30 01:15:06 +08:00
}
2015-09-27 09:03:55 +08:00
} catch ( Exception $e ) {
2018-05-27 20:36:30 +08:00
$this -> _return_message ( 1 , $e -> getMessage ());
2015-09-02 04:33:07 +08:00
}
2012-04-30 01:15:06 +08:00
}
/**
2018-07-29 21:17:35 +08:00
* Display frontend .
2012-04-30 01:15:06 +08:00
*
* @ access private
*/
private function _view ()
{
2012-08-29 05:28:41 +08:00
// set headers to disable caching
2013-02-24 21:33:51 +08:00
$time = gmdate ( 'D, d M Y H:i:s \G\M\T' );
2016-09-18 17:29:37 +08:00
header ( 'Cache-Control: no-store, no-cache, no-transform, must-revalidate' );
2013-02-24 21:33:51 +08:00
header ( 'Pragma: no-cache' );
header ( 'Expires: ' . $time );
header ( 'Last-Modified: ' . $time );
header ( 'Vary: Accept' );
2016-08-09 20:46:32 +08:00
header ( 'Content-Security-Policy: ' . $this -> _conf -> getKey ( 'cspheader' ));
2021-04-17 01:19:11 +08:00
header ( 'Cross-Origin-Resource-Policy: same-origin' );
header ( 'Cross-Origin-Embedder-Policy: require-corp' );
2022-08-22 19:25:56 +08:00
// disabled, because it prevents links from a paste to the same site to
// be opened. Didn't work with `same-origin-allow-popups` either.
// See issue https://github.com/PrivateBin/PrivateBin/issues/970 for details.
// header('Cross-Origin-Opener-Policy: same-origin');
2022-04-10 17:28:52 +08:00
header ( 'Permissions-Policy: browsing-topics=()' );
2019-06-28 02:31:10 +08:00
header ( 'Referrer-Policy: no-referrer' );
2016-09-18 17:29:37 +08:00
header ( 'X-Content-Type-Options: nosniff' );
2021-04-17 01:19:11 +08:00
header ( 'X-Frame-Options: deny' );
header ( 'X-XSS-Protection: 1; mode=block' );
2012-08-26 06:49:11 +08:00
2013-10-31 06:54:42 +08:00
// label all the expiration options
$expire = array ();
2016-07-26 14:19:35 +08:00
foreach ( $this -> _conf -> getSection ( 'expire_options' ) as $time => $seconds ) {
2016-08-15 22:45:47 +08:00
$expire [ $time ] = ( $seconds == 0 ) ? I18n :: _ ( ucfirst ( $time )) : Filter :: formatHumanReadableTime ( $time );
2013-10-31 06:54:42 +08:00
}
2015-09-12 23:33:16 +08:00
// translate all the formatter options
2016-08-09 17:54:42 +08:00
$formatters = array_map ( 'PrivateBin\\I18n::_' , $this -> _conf -> getSection ( 'formatter_options' ));
2015-09-12 23:33:16 +08:00
2015-09-19 17:21:13 +08:00
// set language cookie if that functionality was enabled
$languageselection = '' ;
2016-07-26 14:19:35 +08:00
if ( $this -> _conf -> getKey ( 'languageselection' )) {
2016-08-09 17:54:42 +08:00
$languageselection = I18n :: getLanguage ();
2021-04-17 02:15:12 +08:00
setcookie ( 'lang' , $languageselection , 0 , '' , '' , true );
2015-09-19 17:21:13 +08:00
}
2022-03-14 00:24:47 +08:00
// strip policies that are unsupported in meta tag
$metacspheader = str_replace (
array (
'frame-ancestors \'none\'; ' ,
'; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-downloads' ,
),
'' ,
$this -> _conf -> getKey ( 'cspheader' )
);
2016-08-09 17:54:42 +08:00
$page = new View ;
2022-10-23 14:10:56 +08:00
$page -> assign ( 'CSPHEADER' , $metacspheader );
$page -> assign ( 'ERROR' , I18n :: _ ( $this -> _error ));
2022-10-23 19:09:54 +08:00
$page -> assign ( 'NAME' , $this -> _conf -> getKey ( 'name' ));
2022-10-23 14:10:56 +08:00
if ( $this -> _request -> getOperation () === 'yourlsproxy' ) {
$page -> assign ( 'SHORTURL' , $this -> _status );
$page -> draw ( 'yourlsproxy' );
return ;
}
2020-07-02 01:47:12 +08:00
$page -> assign ( 'BASEPATH' , I18n :: _ ( $this -> _conf -> getKey ( 'basepath' )));
2016-08-09 17:54:42 +08:00
$page -> assign ( 'STATUS' , I18n :: _ ( $this -> _status ));
2012-04-30 01:15:06 +08:00
$page -> assign ( 'VERSION' , self :: VERSION );
2015-09-23 05:21:31 +08:00
$page -> assign ( 'DISCUSSION' , $this -> _conf -> getKey ( 'discussion' ));
$page -> assign ( 'OPENDISCUSSION' , $this -> _conf -> getKey ( 'opendiscussion' ));
2015-09-12 23:33:16 +08:00
$page -> assign ( 'MARKDOWN' , array_key_exists ( 'markdown' , $formatters ));
$page -> assign ( 'SYNTAXHIGHLIGHTING' , array_key_exists ( 'syntaxhighlighting' , $formatters ));
2015-09-23 05:21:31 +08:00
$page -> assign ( 'SYNTAXHIGHLIGHTINGTHEME' , $this -> _conf -> getKey ( 'syntaxhighlightingtheme' ));
2015-09-12 23:33:16 +08:00
$page -> assign ( 'FORMATTER' , $formatters );
2015-09-23 05:21:31 +08:00
$page -> assign ( 'FORMATTERDEFAULT' , $this -> _conf -> getKey ( 'defaultformatter' ));
2020-10-13 13:28:35 +08:00
$page -> assign ( 'INFO' , I18n :: _ ( str_replace ( " ' " , '"' , $this -> _conf -> getKey ( 'info' ))));
2016-08-09 17:54:42 +08:00
$page -> assign ( 'NOTICE' , I18n :: _ ( $this -> _conf -> getKey ( 'notice' )));
2015-09-23 05:21:31 +08:00
$page -> assign ( 'BURNAFTERREADINGSELECTED' , $this -> _conf -> getKey ( 'burnafterreadingselected' ));
$page -> assign ( 'PASSWORD' , $this -> _conf -> getKey ( 'password' ));
$page -> assign ( 'FILEUPLOAD' , $this -> _conf -> getKey ( 'fileupload' ));
2016-08-16 17:11:03 +08:00
$page -> assign ( 'ZEROBINCOMPATIBILITY' , $this -> _conf -> getKey ( 'zerobincompatibility' ));
2015-09-19 17:21:13 +08:00
$page -> assign ( 'LANGUAGESELECTION' , $languageselection );
2016-08-09 17:54:42 +08:00
$page -> assign ( 'LANGUAGES' , I18n :: getLanguageLabels ( I18n :: getAvailableLanguages ()));
2013-10-31 06:54:42 +08:00
$page -> assign ( 'EXPIRE' , $expire );
2015-09-23 05:21:31 +08:00
$page -> assign ( 'EXPIREDEFAULT' , $this -> _conf -> getKey ( 'default' , 'expire' ));
2016-01-31 16:56:06 +08:00
$page -> assign ( 'URLSHORTENER' , $this -> _conf -> getKey ( 'urlshortener' ));
2017-12-25 21:59:15 +08:00
$page -> assign ( 'QRCODE' , $this -> _conf -> getKey ( 'qrcode' ));
2019-06-18 03:40:37 +08:00
$page -> assign ( 'HTTPWARNING' , $this -> _conf -> getKey ( 'httpwarning' ));
2019-09-20 01:14:48 +08:00
$page -> assign ( 'HTTPSLINK' , 'https://' . $this -> _request -> getHost () . $this -> _request -> getRequestUri ());
2019-06-24 01:45:40 +08:00
$page -> assign ( 'COMPRESSION' , $this -> _conf -> getKey ( 'compression' ));
2015-09-23 05:21:31 +08:00
$page -> draw ( $this -> _conf -> getKey ( 'template' ));
2012-04-30 01:15:06 +08:00
}
2015-10-19 02:38:07 +08:00
/**
* outputs requested JSON - LD context
*
* @ access private
* @ param string $type
*/
2015-10-18 20:37:58 +08:00
private function _jsonld ( $type )
{
2023-01-15 15:04:21 +08:00
if ( ! in_array ( $type , array (
'comment' ,
'commentmeta' ,
'paste' ,
'pastemeta' ,
'types' ,
))) {
2015-10-18 20:37:58 +08:00
$type = '' ;
}
$content = '{}' ;
2016-08-15 22:45:47 +08:00
$file = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'js' . DIRECTORY_SEPARATOR . $type . '.jsonld' ;
2016-07-26 14:19:35 +08:00
if ( is_readable ( $file )) {
2015-10-18 20:37:58 +08:00
$content = str_replace (
'?jsonld=' ,
2016-08-09 17:54:42 +08:00
$this -> _urlBase . '?jsonld=' ,
2015-10-18 20:37:58 +08:00
file_get_contents ( $file )
);
}
2023-01-15 15:04:21 +08:00
if ( $type === 'types' ) {
$content = str_replace (
2023-01-15 21:45:10 +08:00
implode ( '", "' , array_keys ( $this -> _conf -> getDefaults ()[ 'expire_options' ])),
implode ( '", "' , array_keys ( $this -> _conf -> getSection ( 'expire_options' ))),
2023-01-15 15:04:21 +08:00
$content
);
}
2015-10-18 20:37:58 +08:00
header ( 'Content-type: application/ld+json' );
header ( 'Access-Control-Allow-Origin: *' );
header ( 'Access-Control-Allow-Methods: GET' );
echo $content ;
}
2022-10-23 14:10:56 +08:00
/**
* proxies link to YOURLS , updates status or error with response
*
* @ access private
* @ param string $link
*/
private function _yourlsproxy ( $link )
{
$yourls = new YourlsProxy ( $this -> _conf , $link );
if ( $yourls -> isError ()) {
$this -> _error = $yourls -> getError ();
} else {
$this -> _status = $yourls -> getUrl ();
}
}
2012-04-30 01:15:06 +08:00
/**
2015-10-19 02:38:07 +08:00
* prepares JSON encoded status message
2012-04-30 01:15:06 +08:00
*
* @ access private
2016-07-06 20:12:14 +08:00
* @ param int $status
2012-04-30 01:15:06 +08:00
* @ param string $message
2013-11-01 08:15:14 +08:00
* @ param array $other
2012-04-30 01:15:06 +08:00
*/
2013-11-01 08:15:14 +08:00
private function _return_message ( $status , $message , $other = array ())
2012-04-30 01:15:06 +08:00
{
$result = array ( 'status' => $status );
2016-07-26 14:19:35 +08:00
if ( $status ) {
2016-08-09 17:54:42 +08:00
$result [ 'message' ] = I18n :: _ ( $message );
2016-07-26 14:19:35 +08:00
} else {
2016-08-15 22:45:47 +08:00
$result [ 'id' ] = $message ;
2016-08-09 17:54:42 +08:00
$result [ 'url' ] = $this -> _urlBase . '?' . $message ;
2012-04-30 01:15:06 +08:00
}
2013-11-01 08:15:14 +08:00
$result += $other ;
2019-05-14 04:31:52 +08:00
$this -> _json = Json :: encode ( $result );
2012-04-30 01:15:06 +08:00
}
}