183 lines
6.2 KiB
PHP
183 lines
6.2 KiB
PHP
<?php
|
|
defined( 'WPINC' ) OR exit;
|
|
|
|
include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/client.php';
|
|
include_once DG_PATH . 'inc/thumbers/thumber-co/class-thumber-client.php';
|
|
|
|
add_filter( 'allowed_http_origin', array( 'DG_ThumberCoThumber', 'allowThumberWebhooks' ), 10, 2);
|
|
add_filter( 'upload_mimes', array( 'DG_ThumberCoThumber', 'customMimeTypes' ) );
|
|
|
|
class DG_ThumberCoThumber extends DG_AbstractThumber {
|
|
|
|
/**
|
|
* @const string Name of the action performed in the webhook.
|
|
*/
|
|
const ThumberAction = 'dg_thumber_webhook';
|
|
|
|
/**
|
|
* @const string Used in nonce to separate the attachment ID from the "random" segment.
|
|
*/
|
|
const NonceSeparator = '_';
|
|
|
|
/**
|
|
* @var string URL to webhook.
|
|
*/
|
|
private static $webhook;
|
|
|
|
/**
|
|
* @var DG_ThumberClient The thumber client instance.
|
|
*/
|
|
private static $client;
|
|
|
|
/**
|
|
* @return bool Whether Thumber.co is enabled.
|
|
*/
|
|
public static function thumberEnabled() {
|
|
$options = DG_Thumber::getOptions();
|
|
return $options['active']['thumber-co'];
|
|
}
|
|
|
|
/**
|
|
* Initializes the static values for this class.
|
|
*/
|
|
public static function init() {
|
|
if ( self::thumberEnabled() ) {
|
|
parent::init();
|
|
self::$webhook = admin_url( 'admin-post.php?action=' . self::ThumberAction );
|
|
self::$client = DG_ThumberClient::getInstance();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $ID The attachment ID.
|
|
* @param int $pg The page to thumbnail.
|
|
*
|
|
* @return bool Always false. Asynchronously set the thumbnail in webhook later.
|
|
*/
|
|
public function getThumbnail( $ID, $pg = 1 ) {
|
|
global $dg_options;
|
|
|
|
include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/client.php';
|
|
include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/thumb-request.php';
|
|
|
|
$options = DG_Thumber::getOptions();
|
|
$url_or_path = get_attached_file( $ID );
|
|
|
|
if ( ! self::checkGeometry( $options['width'], $options['height'] ) ) {
|
|
DG_Logger::writeLog( DG_LogLevel::Detail, "Skipping attachment #$ID as it exceeds Thumber.co subscription geometry limit." );
|
|
return false;
|
|
}
|
|
|
|
if ( ! self::checkFileSize( $url_or_path ) ) {
|
|
DG_Logger::writeLog( DG_LogLevel::Detail, "Skipping attachment #$ID as it exceeds Thumber.co subscription file size limit." );
|
|
return false;
|
|
}
|
|
|
|
$mime_type = get_post_mime_type( $ID );
|
|
if ( ! $dg_options['thumber-co']['direct_upload'] ) {
|
|
$url_or_path = wp_get_attachment_url( $ID );
|
|
}
|
|
|
|
if ( ! $url_or_path || ! $mime_type ) {
|
|
return false;
|
|
}
|
|
|
|
$req = new ThumberThumbReq();
|
|
$req->setCallback( self::$webhook );
|
|
$req->setMimeType( $mime_type );
|
|
$req->setNonce( $ID . self::NonceSeparator . md5( microtime() ) );
|
|
$req->setPg( $pg );
|
|
$req->setGeometry( $options['width'] . 'x' . $options['height'] );
|
|
|
|
if ( $dg_options['thumber-co']['direct_upload'] ) {
|
|
$req->setDecodedData( file_get_contents( $url_or_path ) );
|
|
} else {
|
|
$req->setUrl( $url_or_path );
|
|
}
|
|
|
|
$resp = self::$client->sendThumbRequest( $req );
|
|
|
|
if ( $resp['http_code'] < 200 || $resp['http_code'] > 399 ) {
|
|
DG_Logger::writeLog( DG_LogLevel::Error, 'Failed to transmit to server: ' . $resp['body'] );
|
|
}
|
|
|
|
// always returns false -- we set the thumbnail later when webhook is hit
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @return string[] The extensions supported by this thumber.
|
|
*/
|
|
protected function getThumberExtensions() {
|
|
return self::$client->getMimeTypes();
|
|
}
|
|
|
|
/**
|
|
* @return int An integer from 0 to 100. Higher priorities will be attempted before lower priority thumbers.
|
|
*/
|
|
public function getPriority() {
|
|
return 5;
|
|
}
|
|
|
|
/**
|
|
* @return bool Whether Thumber.co may be used in thumbnail generation.
|
|
*/
|
|
public static function isThumberCoAvailable() {
|
|
global $dg_options;
|
|
return isset( $dg_options['thumber-co']['uid'] ) && isset( $dg_options['thumber-co']['secret'] );
|
|
}
|
|
|
|
/**
|
|
* TODO: This should be a configurable option and should include all Thumber types not default WP-supported.
|
|
* @param $mimes string[] The MIME types WP knows about.
|
|
* @return string[] Modified MIME types -- adding additional supported types.
|
|
*/
|
|
public static function customMimeTypes($mimes) {
|
|
$mimes['pub'] = 'application/mspublisher';
|
|
return $mimes;
|
|
}
|
|
|
|
/**
|
|
* WP by default will not handle POSTs from Thumber so add a special case for the action we want to handle.
|
|
* @param $origin string Origin URL. If not provided, the value of get_http_origin() is used.
|
|
* @param $origin_arg string Unused.
|
|
*
|
|
* @return string Origin URL if allowed, empty string if not.
|
|
*/
|
|
public static function allowThumberWebhooks($origin, $origin_arg) {
|
|
if ( !$origin && isset( $_REQUEST['action'] ) && $_REQUEST['action'] === self::ThumberAction ) {
|
|
$origin = get_http_origin();
|
|
}
|
|
|
|
return $origin;
|
|
}
|
|
|
|
/**
|
|
* @param string $filename File to be tested.
|
|
* @return bool Whether file is acceptable to be sent to Thumber.
|
|
*/
|
|
private static function checkFileSize($filename ) {
|
|
$ret = true;
|
|
$size = @filesize( $filename );
|
|
if ( $size !== false ) {
|
|
$sub = self::$client->getSubscription();
|
|
$ret = ( ! $sub || empty( $sub['file_size_limit'] ) ) || ( $size > 0 && $size <= $sub['file_size_limit'] );
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* @param $width int The requested thumb width.
|
|
* @param $height int The requested thumb height.
|
|
* @return bool Whether the requested geometry meets subscription limitations.
|
|
*/
|
|
private static function checkGeometry( $width, $height ) {
|
|
$sub = self::$client->getSubscription();
|
|
return ( ! $sub || empty( $sub['thumb_size_limit'] ) ) || ( $width <= $sub['thumb_size_limit'] && $height <= $sub['thumb_size_limit'] );
|
|
}
|
|
}
|
|
|
|
add_action( 'admin_post_nopriv_' . DG_ThumberCoThumber::ThumberAction, array( DG_ThumberClient::getInstance(), 'receiveThumbResponse' ), 5, 0);
|
|
|
|
DG_ThumberCoThumber::init(); |