use strict types

This commit is contained in:
Shish 2020-01-26 13:19:35 +00:00
parent f5ccffdaf4
commit 9eb5acf2dc
414 changed files with 957 additions and 897 deletions

View File

@ -16,6 +16,7 @@ RUN mkdir -p data/config && \
echo "<?php define(\"DATABASE_DSN\", \"sqlite:data/shimmie.sqlite\");" > data/config/auto_install.conf.php && \
echo === Installing === && php index.php && \
echo === Smoke Test === && php index.php get-page /post/list && \
echo === Unit Tests === && ./vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text && \
echo === Unit Tests === && ./vendor/bin/phpunit --configuration tests/phpunit.xml && \
echo === Cleaning === && rm -rf data
#echo === Unit Tests === && ./vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text && \
CMD "/app/tests/docker-init.sh"

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/*
* Load all the files into memory, sanitise the environment, but don't
* actually do anything as far as the app is concerned

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class BaseThemelet
@ -85,13 +85,13 @@ class BaseThemelet
$page->add_block(new Block(null, $body, "main", 90, "paginator"));
}
private function gen_page_link(string $base_url, ?string $query, string $page, string $name): string
private function gen_page_link(string $base_url, ?string $query, int $page, string $name): string
{
$link = make_link($base_url.'/'.$page, $query);
return '<a href="'.$link.'">'.$name.'</a>';
}
private function gen_page_link_block(string $base_url, ?string $query, string $page, int $current_page, string $name): string
private function gen_page_link_block(string $base_url, ?string $query, int $page, int $current_page, string $name): string
{
$paginator = "";
if ($page == $current_page) {
@ -129,7 +129,7 @@ class BaseThemelet
$pages = [];
foreach (range($start, $end) as $i) {
$pages[] = $this->gen_page_link_block($base_url, $query, $i, $current_page, $i);
$pages[] = $this->gen_page_link_block($base_url, $query, $i, $current_page, (string)$i);
}
$pages_html = implode(" | ", $pages);

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class Block

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
interface CacheEngine
{
public function get(string $key);

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* CAPTCHA abstraction *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Interface Config
@ -18,12 +18,12 @@ interface Config
/**
* Set a configuration option to a new value, regardless of what the value is at the moment.
*/
public function set_int(string $name, ?string $value): void;
public function set_int(string $name, ?int $value): void;
/**
* Set a configuration option to a new value, regardless of what the value is at the moment.
*/
public function set_float(string $name, ?string $value): void;
public function set_float(string $name, ?float $value): void;
/**
* Set a configuration option to a new value, regardless of what the value is at the moment.
@ -32,9 +32,8 @@ interface Config
/**
* Set a configuration option to a new value, regardless of what the value is at the moment.
* @param null|bool|string $value
*/
public function set_bool(string $name, $value): void;
public function set_bool(string $name, ?bool $value): void;
/**
* Set a configuration option to a new value, regardless of what the value is at the moment.
@ -133,13 +132,13 @@ abstract class BaseConfig implements Config
{
public $values = [];
public function set_int(string $name, ?string $value): void
public function set_int(string $name, ?int $value): void
{
$this->values[$name] = is_null($value) ? null : parse_shorthand_int($value);
$this->values[$name] = is_null($value) ? null : $value;
$this->save($name);
}
public function set_float(string $name, ?string $value): void
public function set_float(string $name, ?float $value): void
{
$this->values[$name] = $value;
$this->save($name);
@ -151,9 +150,9 @@ abstract class BaseConfig implements Config
$this->save($name);
}
public function set_bool(string $name, $value): void
public function set_bool(string $name, ?bool $value): void
{
$this->values[$name] = bool_escape($value) ? 'Y' : 'N';
$this->values[$name] = $value ? 'Y' : 'N';
$this->save($name);
}
@ -277,10 +276,10 @@ class StaticConfig extends BaseConfig
if (!empty($config)) {
$this->values = $config;
} else {
throw new Exception("Config file '$filename' doesn't contain any config");
throw new ScoreException("Config file '$filename' doesn't contain any config");
}
} else {
throw new Exception("Config file '$filename' missing");
throw new ScoreException("Config file '$filename' missing");
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use FFSPHP\PDO;
abstract class DatabaseDriver
@ -168,7 +168,7 @@ class Database
$this->connect_db();
}
return $this->db->execute(
"-- " . str_replace("%2F", "/", urlencode(@$_GET['q'])). "\n" .
"-- " . str_replace("%2F", "/", urlencode($_GET['q'] ?? '')). "\n" .
$query,
$args
);

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
abstract class SCORE
{
const AIPK = "SCORE_AIPK";
@ -169,7 +169,7 @@ class SQLite extends DBEngine
public function init(PDO $db)
{
ini_set('sqlite.assoc_case', 0);
ini_set('sqlite.assoc_case', '0');
$db->exec("PRAGMA foreign_keys = ON;");
$db->sqliteCreateFunction('UNIX_TIMESTAMP', '_unix_timestamp', 1);
$db->sqliteCreateFunction('now', '_now', 0);

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class Email

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Generic parent class for all events.
*
@ -58,6 +58,7 @@ class PageRequestEvent extends Event
public function __construct(string $path)
{
parent::__construct();
global $config;
// trim starting slashes
@ -140,7 +141,7 @@ class PageRequestEvent extends Event
*/
public function count_args(): int
{
return int_escape($this->arg_count - $this->part_count);
return $this->arg_count - $this->part_count;
}
/*
@ -198,6 +199,7 @@ class CommandEvent extends Event
*/
public function __construct(array $args)
{
parent::__construct();
global $user;
$opts = [];
@ -278,6 +280,7 @@ class TextFormattingEvent extends Event
public function __construct(string $text)
{
parent::__construct();
$h_text = html_escape(trim($text));
$this->original = $h_text;
$this->formatted = $h_text;
@ -328,6 +331,7 @@ class LogEvent extends Event
public function __construct(string $section, int $priority, string $message, array $args)
{
parent::__construct();
$this->section = $section;
$this->priority = $priority;
$this->message = $message;

View File

@ -1,15 +1,22 @@
<?php
<?php declare(strict_types=1);
/**
* Class SCoreException
*
* A base exception to be caught by the upper levels.
*/
class SCoreException extends Exception
class SCoreException extends RuntimeException
{
/** @var string|null */
public $query;
/** @var string */
public $error;
public function __construct(string $msg, ?string $query=null)
{
parent::__construct($msg);
$this->error = $msg;
$this->query = $query;
}
}
@ -47,15 +54,10 @@ class InvalidInput extends SCoreException
class InsufficientMemoryException extends SCoreException
{
}
/*
* This is used by the image resizing code when there is an error while resizing
*/
class ImageResizeException extends SCoreException
{
public $error;
public function __construct(string $error)
{
$this->error = $error;
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* \page eande Events and Extensions
*
@ -83,11 +83,13 @@
*/
abstract class Extension
{
/** @var string */
public $key;
/** @var Themelet this theme's Themelet object */
public $theme;
/** @var Themelet */
protected $theme;
/** @var ExtensionInfo */
public $info;
private static $enabled_extensions = [];
@ -98,7 +100,7 @@ abstract class Extension
$this->theme = $this->get_theme_object($class);
$this->info = ExtensionInfo::get_for_extension_class($class);
if ($this->info===null) {
throw new Exception("Info class not found for extension $class");
throw new ScoreException("Info class not found for extension $class");
}
$this->key = $this->info->key;
}
@ -213,7 +215,10 @@ abstract class ExtensionInfo
/** @var array which DBs this ext supports (blank for 'all') */
public $db_support = [];
/** @var bool */
private $supported = null;
/** @var string */
private $support_info = null;
public function is_supported(): bool
@ -302,12 +307,10 @@ abstract class ExtensionInfo
{
foreach (get_declared_classes() as $class) {
$rclass = new ReflectionClass($class);
if ($rclass->isAbstract()) {
// don't do anything
} elseif (is_subclass_of($class, "ExtensionInfo")) {
if (!$rclass->isAbstract() && is_subclass_of($class, "ExtensionInfo")) {
$extension_info = new $class();
if (array_key_exists($extension_info->key, self::$all_info_by_key)) {
throw new Exception("Extension Info $class with key $extension_info->key has already been loaded");
throw new ScoreException("Extension Info $class with key $extension_info->key has already been loaded");
}
self::$all_info_by_key[$extension_info->key] = $extension_info;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* An image is being added to the database.
@ -20,18 +20,13 @@ class ImageAdditionEvent extends Event
*/
public function __construct(Image $image)
{
parent::__construct();
$this->image = $image;
}
}
class ImageAdditionException extends SCoreException
{
public $error;
public function __construct(string $error)
{
$this->error = $error;
}
}
/**
@ -53,6 +48,7 @@ class ImageDeletionEvent extends Event
*/
public function __construct(Image $image, bool $force = false)
{
parent::__construct();
$this->image = $image;
$this->force = $force;
}
@ -77,6 +73,7 @@ class ImageReplaceEvent extends Event
*/
public function __construct(int $id, Image $image)
{
parent::__construct();
$this->id = $id;
$this->image = $image;
}
@ -84,13 +81,6 @@ class ImageReplaceEvent extends Event
class ImageReplaceException extends SCoreException
{
/** @var string */
public $error;
public function __construct(string $error)
{
$this->error = $error;
}
}
/**
@ -108,12 +98,12 @@ class ThumbnailGenerationEvent extends Event
/** @var bool */
public $generated;
/**
* Request a thumbnail be made for an image object
*/
public function __construct(string $hash, string $type, bool $force=false)
{
parent::__construct();
$this->hash = $hash;
$this->type = $type;
$this->force = $force;
@ -139,6 +129,7 @@ class ParseLinkTemplateEvent extends Event
public function __construct(string $link, Image $image)
{
parent::__construct();
$this->link = $link;
$this->original = $link;
$this->image = $image;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class Image
*
@ -27,6 +27,7 @@ class Image
/** @var string */
public $hash;
/** @var int */
public $filesize;
/** @var string */
@ -65,7 +66,6 @@ class Image
/** @var int */
public $length = null;
/**
* One will very rarely construct an image directly, more common
* would be to use Image::by_id, Image::by_hash, etc.
@ -76,17 +76,18 @@ class Image
foreach ($row as $name => $value) {
// some databases use table.name rather than name
$name = str_replace("images.", "", $name);
$this->$name = $value; // hax, this is likely the cause of much scrutinizer-ci complaints.
// hax, this is likely the cause of much scrutinizer-ci complaints.
if(in_array($name, ["locked", "lossless", "video", "audio"])) {
$this->$name = bool_escape($value);
}
elseif(in_array($name, ["id", "owner_id", "height", "width", "filesize", "length"])) {
$this->$name = int_escape($value);
}
else {
$this->$name = $value;
}
}
$this->locked = bool_escape($this->locked);
assert(is_numeric($this->id));
assert(is_numeric($this->height));
assert(is_numeric($this->width));
$this->id = int_escape($this->id);
$this->height = int_escape($this->height);
$this->width = int_escape($this->width);
}
}
@ -301,12 +302,12 @@ class Image
if ($tag_count === 0) {
$total = $cache->get("image-count");
if (!$total) {
$total = $database->get_one("SELECT COUNT(*) FROM images");
$total = (int)$database->get_one("SELECT COUNT(*) FROM images");
$cache->set("image-count", $total, 600);
}
} elseif ($tag_count === 1 && !preg_match("/[:=><\*\?]/", $tags[0])) {
$total = $database->get_one(
$database->scoreql_to_sql("SELECT count FROM tags WHERE LOWER(tag) = LOWER(:tag)"),
$total = (int)$database->get_one(
"SELECT count FROM tags WHERE LOWER(tag) = LOWER(:tag)",
["tag"=>$tags[0]]
);
} else {
@ -317,7 +318,7 @@ class Image
$total = Image::get_accelerated_count($tag_conditions, $img_conditions);
if (is_null($total)) {
$querylet = Image::build_search_querylet($tag_conditions, $img_conditions);
$total = $database->get_one("SELECT COUNT(*) AS cnt FROM ($querylet->sql) AS tbl", $querylet->variables);
$total = (int)$database->get_one("SELECT COUNT(*) AS cnt FROM ($querylet->sql) AS tbl", $querylet->variables);
}
}
if (is_null($total)) {
@ -331,10 +332,10 @@ class Image
*
* #param string[] $tags
*/
public static function count_pages(array $tags=[]): float
public static function count_pages(array $tags=[]): int
{
global $config;
return ceil(Image::count_images($tags) / $config->get_int(IndexConfig::IMAGES));
return (int)ceil(Image::count_images($tags) / $config->get_int(IndexConfig::IMAGES));
}
private static function terms_to_conditions(array $terms): array
@ -1029,13 +1030,13 @@ class Image
SELECT images.*
FROM images INNER JOIN (
$sub_query
) a on a.image_id = images.id
) a on a.image_id = images.id
";
} elseif (!empty($negative_tag_id_array)) {
$negative_tag_id_list = join(', ', $negative_tag_id_array);
$sql = "
SELECT images.*
FROM images LEFT JOIN image_tags negative ON negative.image_id = images.id AND negative.tag_id in ($negative_tag_id_list)
FROM images LEFT JOIN image_tags negative ON negative.image_id = images.id AND negative.tag_id in ($negative_tag_id_list)
WHERE negative.image_id IS NULL
";
} else {

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* Misc functions *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class Querylet
{
/** @var string */

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class Tag
*
@ -88,13 +88,13 @@ class Tag
public static function sanitize(string $tag): string
{
$tag = preg_replace("/\s/", "", $tag); # whitespace
$tag = preg_replace('/\x20(\x0e|\x0f)/', '', $tag); # unicode RTL
$tag = preg_replace('/\x20[\x0e\x0f]/', '', $tag); # unicode RTL
$tag = preg_replace("/\.+/", ".", $tag); # strings of dots?
$tag = preg_replace("/^(\.+[\/\\\\])+/", "", $tag); # trailing slashes?
$tag = trim($tag, ", \t\n\r\0\x0B");
if (mb_strlen($tag, 'UTF-8') > 255) {
throw new Exception("The tag below is longer than 255 characters, please use a shorter tag.\n$tag\n");
throw new ScoreException("The tag below is longer than 255 characters, please use a shorter tag.\n$tag\n");
}
return $tag;
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* Logging convenience *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* \page themes Themes
*
@ -44,8 +44,6 @@ abstract class PageMode
*/
class Page
{
/** @name Overall */
//@{
/** @var string */
public $mode = PageMode::PAGE;
/** @var string */
@ -75,11 +73,7 @@ class Page
}
}
//@}
// ==============================================
/** @name "data" mode */
//@{
/** @var string; public only for unit test */
public $data = "";
@ -114,11 +108,7 @@ class Page
$this->disposition = $disposition;
}
//@}
// ==============================================
/** @name "redirect" mode */
//@{
/** @var string */
private $redirect = "";
@ -132,11 +122,7 @@ class Page
$this->redirect = $redirect;
}
//@}
// ==============================================
/** @name "page" mode */
//@{
/** @var int */
public $code = 200;
@ -268,8 +254,6 @@ class Page
$this->blocks[] = $block;
}
//@}
// ==============================================
/**
@ -553,6 +537,7 @@ class PageSubNavBuildingEvent extends Event
public function __construct(string $parent)
{
parent::__construct();
$this->parent= $parent;
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
abstract class Permissions
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* Things which should be in the core API *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@ -162,9 +162,7 @@ function list_files(string $base, string $_sub_dir=""): array
foreach ($files as $filename) {
$full_path = "$base/$_sub_dir/$filename";
if (is_link($full_path)) {
// ignore
} elseif (is_dir($full_path)) {
if (!is_link($full_path) && is_dir($full_path)) {
if (!($filename == "." || $filename == "..")) {
//subdirectory found
$file_list = array_merge(
@ -549,7 +547,7 @@ function xml_tag(string $name, array $attrs=[], array $children=[]): string
{
$xml = "<$name ";
foreach ($attrs as $k => $v) {
$xv = str_replace('&#039;', '&apos;', htmlspecialchars($v, ENT_QUOTES));
$xv = str_replace('&#039;', '&apos;', htmlspecialchars((string)$v, ENT_QUOTES));
$xml .= "$k=\"$xv\" ";
}
if (count($children) > 0) {

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* Event API *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@ -37,9 +37,7 @@ function _set_event_listeners(): void
foreach (get_declared_classes() as $class) {
$rclass = new ReflectionClass($class);
if ($rclass->isAbstract()) {
// don't do anything
} elseif (is_subclass_of($class, "Extension")) {
if (!$rclass->isAbstract() && is_subclass_of($class, "Extension")) {
/** @var Extension $extension */
$extension = new $class();
@ -68,8 +66,7 @@ function _dump_event_listeners(array $event_listeners, string $path): void
foreach (get_declared_classes() as $class) {
$rclass = new ReflectionClass($class);
if ($rclass->isAbstract()) {
} elseif (is_subclass_of($class, "Extension")) {
if (!$rclass->isAbstract() && is_subclass_of($class, "Extension")) {
$p .= "\$$class = new $class(); ";
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/*
* First, load the user-specified settings
*/

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
require_once "core/polyfills.php";
class PolyfillsTest extends \PHPUnit\Framework\TestCase

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
require_once "core/util.php";
class UtilTest extends \PHPUnit\Framework\TestCase

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* HTML Generation *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
function _new_user(array $row): User
{
@ -107,7 +107,7 @@ class User
{
$u = User::by_name($name);
if (is_null($u)) {
throw SCoreException("Can't find any user named " . html_escape($name));
throw new ScoreException("Can't find any user named " . html_escape($name));
} else {
return $u->id;
}
@ -168,7 +168,7 @@ class User
{
global $database;
if (User::by_name($name)) {
throw new Exception("Desired username is already in use");
throw new ScoreException("Desired username is already in use");
}
$old_name = $this->name;
$this->name = $name;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* @global UserClass[] $_shm_user_classes
*/
@ -48,8 +48,7 @@ class UserClass
public function can(string $ability): bool
{
if (array_key_exists($ability, $this->abilities)) {
$val = $this->abilities[$ability];
return $val;
return $this->abilities[$ability];
} elseif (!is_null($this->parent)) {
return $this->parent->can($ability);
} else {

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use function MicroHTML\emptyHTML;
use function MicroHTML\FORM;
use function MicroHTML\INPUT;
@ -79,7 +79,7 @@ function blockcmp(Block $a, Block $b): int
if ($a->position == $b->position) {
return 0;
} else {
return ($a->position > $b->position);
return ($a->position > $b->position) ? 1 : -1;
}
}
@ -92,7 +92,7 @@ function get_memory_limit(): int
// thumbnail generation requires lots of memory
$default_limit = 8*1024*1024; // 8 MB of memory is PHP's default.
$shimmie_limit = parse_shorthand_int($config->get_int(MediaConfig::MEM_LIMIT));
$shimmie_limit = $config->get_int(MediaConfig::MEM_LIMIT);
if ($shimmie_limit < 3*1024*1024) {
// we aren't going to fit, override
@ -117,7 +117,7 @@ function get_memory_limit(): int
// Shimmie wants more memory than what PHP is currently set for.
// Attempt to set PHP's memory limit.
if (ini_set("memory_limit", $shimmie_limit) === false) {
if (ini_set("memory_limit", "$shimmie_limit") === false) {
/* We can't change PHP's limit, oh well, return whatever its currently set to */
return $memory;
}
@ -344,20 +344,17 @@ function join_url(string $base, string ...$paths)
function get_dir_contents(string $dir): array
{
if (empty($dir)) {
throw new Exception("dir required");
}
assert(!empty($dir));
if (!is_dir($dir)) {
return [];
}
$results = array_diff(
return array_diff(
scandir(
$dir
),
['..', '.']
);
return $results;
}
/**
@ -460,8 +457,8 @@ function _sanitise_environment(): void
date_default_timezone_set(TIMEZONE);
}
# ini_set('zend.assertions', 1); // generate assertions
ini_set('assert.exception', 1); // throw exceptions when failed
# ini_set('zend.assertions', '1'); // generate assertions
ini_set('assert.exception', '1'); // throw exceptions when failed
if (DEBUG) {
error_reporting(E_ALL);
}
@ -695,13 +692,11 @@ function SHM_FORM(string $target, string $method="POST", bool $multipart=false,
if ($onsubmit) {
$attrs["onsubmit"] = $onsubmit;
}
$f = FORM(
return FORM(
$attrs,
INPUT(["type"=>"hidden", "name"=>"q", "value"=>$target]),
$method != "GET" ? "" : $user->get_auth_html()
);
return $f;
}
function SHM_SIMPLE_FORM($target, ...$children) {

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AdminPageInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Sent when the admin page is ready to be added to
@ -10,6 +10,7 @@ class AdminBuildingEvent extends Event
public function __construct(Page $page)
{
parent::__construct();
$this->page = $page;
}
}
@ -23,12 +24,16 @@ class AdminActionEvent extends Event
public function __construct(string $action)
{
parent::__construct();
$this->action = $action;
}
}
class AdminPage extends Extension
{
/** @var AdminPageTheme */
protected $theme;
public function onPageRequest(PageRequestEvent $event)
{
global $page, $user;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AdminPageTest extends ShimmiePHPUnitTestCase
{
public function testAuth()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AdminPageTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AliasEditorInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use MicroCRUD\ActionColumn;
use MicroCRUD\TextColumn;
@ -33,6 +33,7 @@ class AddAliasEvent extends Event
public function __construct(string $oldtag, string $newtag)
{
parent::__construct();
$this->oldtag = trim($oldtag);
$this->newtag = trim($newtag);
}
@ -44,6 +45,9 @@ class AddAliasException extends SCoreException
class AliasEditor extends Extension
{
/** @var AliasEditorTheme */
protected $theme;
public function onPageRequest(PageRequestEvent $event)
{
global $config, $database, $page, $user;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AliasEditorTest extends ShimmiePHPUnitTestCase
{
public function testAliasList()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AliasEditorTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ApprovalInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
abstract class ApprovalConfig
{
@ -9,6 +9,9 @@ abstract class ApprovalConfig
class Approval extends Extension
{
/** @var ApprovalTheme */
protected $theme;
public function onInitExt(InitExtEvent $event)
{
global $config;
@ -59,8 +62,6 @@ class Approval extends Extension
public function onAdminBuilding(AdminBuildingEvent $event)
{
global $config;
$this->theme->display_admin_form();
}
@ -128,7 +129,7 @@ class Approval extends Extension
$event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y ")));
}
if(is_null($event->term)) return;
if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) {
if ($user->can(Permissions::APPROVE_IMAGE) && $matches[1] == "no") {
$event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_N ")));
@ -177,7 +178,7 @@ class Approval extends Extension
public static function disapprove_image($image_id)
{
global $database, $user;
global $database;
$database->execute(
$database->scoreql_to_sql(
@ -236,7 +237,6 @@ class Approval extends Extension
}
}
public function onDatabaseUpgrade(DatabaseUpgradeEvent $event)
{
global $database;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ApprovalTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ArrowkeyNavigationInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ArrowkeyNavigation extends Extension
{
@ -85,11 +85,9 @@ class ArrowkeyNavigation extends Extension
}
// Create return array
$pageinfo = [
return [
"prev" => $prefix.$prev,
"next" => $prefix.$next,
];
return $pageinfo;
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ArtistsInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AuthorSetEvent extends Event
{
@ -11,6 +11,7 @@ class AuthorSetEvent extends Event
public function __construct(Image $image, User $user, string $author)
{
parent::__construct();
$this->image = $image;
$this->user = $user;
$this->author = $author;
@ -19,6 +20,9 @@ class AuthorSetEvent extends Event
class Artists extends Extension
{
/** @var ArtistsTheme */
protected $theme;
public function onImageInfoSet(ImageInfoSetEvent $event)
{
global $user;
@ -38,6 +42,8 @@ class Artists extends Extension
public function onSearchTermParse(SearchTermParseEvent $event)
{
if(is_null($event->term)) return;
$matches = [];
if (preg_match("/^(author|artist)[=|:](.*)$/i", $event->term, $matches)) {
$char = $matches[1];
@ -195,7 +201,7 @@ class Artists extends Extension
case "view":
{
$artistID = $event->get_arg(1);
$artistID = int_escape($event->get_arg(1));
$artist = $this->get_artist($artistID);
$aliases = $this->get_alias($artist['id']);
$members = $this->get_members($artist['id']);
@ -222,7 +228,7 @@ class Artists extends Extension
case "edit":
{
$artistID = $event->get_arg(1);
$artistID = int_escape($event->get_arg(1));
$artist = $this->get_artist($artistID);
$aliases = $this->get_alias($artistID);
$members = $this->get_members($artistID);
@ -262,7 +268,7 @@ class Artists extends Extension
}
case "nuke":
{
$artistID = $event->get_arg(1);
$artistID = int_escape($event->get_arg(1));
$this->delete_artist($artistID); // this will delete the artist, its alias, its urls and its members
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("artist/list"));
@ -300,7 +306,7 @@ class Artists extends Extension
}
case "delete":
{
$aliasID = $event->get_arg(2);
$aliasID = int_escape($event->get_arg(2));
$artistID = $this->get_artistID_by_aliasID($aliasID);
$this->delete_alias($aliasID);
$page->set_mode(PageMode::REDIRECT);
@ -341,7 +347,7 @@ class Artists extends Extension
}
case "delete":
{
$urlID = $event->get_arg(2);
$urlID = int_escape($event->get_arg(2));
$artistID = $this->get_artistID_by_urlID($urlID);
$this->delete_url($urlID);
$page->set_mode(PageMode::REDIRECT);
@ -415,7 +421,7 @@ class Artists extends Extension
{
global $database;
$result = $database->get_row("SELECT author FROM images WHERE id = :id", ['id'=>$imageID]);
return stripslashes($result['author']);
return $result['author'] ?? "";
}
private function url_exists_by_url(string $url): bool
@ -435,7 +441,6 @@ class Artists extends Extension
private function alias_exists_by_name(string $alias): bool
{
global $database;
$result = $database->get_one("SELECT COUNT(1) FROM artist_alias WHERE alias = :alias", ['alias'=>$alias]);
return ($result != 0);
}
@ -507,25 +512,19 @@ class Artists extends Extension
private function get_alias_by_id(int $aliasID): array
{
global $database;
$result = $database->get_row("SELECT * FROM artist_alias WHERE id = :id", ['id'=>$aliasID]);
$result["alias"] = stripslashes($result["alias"]);
return $result;
return $database->get_row("SELECT * FROM artist_alias WHERE id = :id", ['id'=>$aliasID]);
}
private function get_url_by_id(int $urlID): array
{
global $database;
$result = $database->get_row("SELECT * FROM artist_urls WHERE id = :id", ['id'=>$urlID]);
$result["url"] = stripslashes($result["url"]);
return $result;
return $database->get_row("SELECT * FROM artist_urls WHERE id = :id", ['id'=>$urlID]);
}
private function get_member_by_id(int $memberID): array
{
global $database;
$result = $database->get_row("SELECT * FROM artist_members WHERE id = :id", ['id'=>$memberID]);
$result["name"] = stripslashes($result["name"]);
return $result;
return $database->get_row("SELECT * FROM artist_members WHERE id = :id", ['id'=>$memberID]);
}
private function update_artist()
@ -850,7 +849,7 @@ class Artists extends Extension
{
global $config, $database;
$pageNumber = clamp($event->get_arg(1), 1, null) - 1;
$pageNumber = clamp(int_escape($event->get_arg(1)), 1, null) - 1;
$artistsPerPage = $config->get_int("artistsPerPage");
$listing = $database->get_all(

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ArtistTest extends ShimmiePHPUnitTestCase
{
public function testSearch()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ArtistsTheme extends Themelet
{
public function get_author_editor_html(string $author): string

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AutoCompleteInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AutoComplete extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class AutoCompleteTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BanWordsInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BanWords extends Extension
{
@ -75,7 +75,7 @@ xanax
/**
* Throws if the comment contains banned words.
*/
private function test_text(string $comment, Exception $ex): void
private function test_text(string $comment, SCoreException $ex): void
{
$comment = strtolower($comment);

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BanWordsTest extends ShimmiePHPUnitTestCase
{
public function check_blocked($image_id, $words)

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BBCodeInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BBCode extends FormatterExtension

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BBCodeTest extends ShimmiePHPUnitTestCase
{
public function testBasics()

View File

@ -4,7 +4,7 @@ class Blocks extends Extension
{
public function onDatabaseUpgrade(DatabaseUpgradeEvent $event)
{
global $config, $database;
global $database;
if ($this->get_version("ext_blocks_version") < 1) {
$database->create_table("blocks", "
id SCORE_AIPK,

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BlotterInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class Blotter extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BlotterTest extends ShimmiePHPUnitTestCase
{
public function testLogin()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BlotterTheme extends Themelet
{
public function display_editor($entries)

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BrowserSearchInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BrowserSearch extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BrowserSearchTest extends ShimmiePHPUnitTestCase
{
public function testBasic()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkActionsInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkActionBlockBuildingEvent extends Event
{
@ -39,13 +39,11 @@ class BulkActionEvent extends Event
public $action;
/** @var array */
public $items;
/** @var PageRequestEvent */
public $page_request;
public function __construct(String $action, PageRequestEvent $pageRequestEvent, Generator $items)
public function __construct(String $action, Generator $items)
{
parent::__construct();
$this->action = $action;
$this->page_request = $pageRequestEvent;
$this->items = $items;
}
}
@ -108,7 +106,7 @@ class BulkActions extends Extension
}
$query = $event->args[0];
$items = $this->yield_search_results($event->args[1]);
$newEvent = new BulkActionEvent($event->args[0], $event, $items);
$newEvent = new BulkActionEvent($event->args[0], $items);
var_dump($newEvent);
# send_event($newEvent);
}
@ -177,11 +175,10 @@ class BulkActions extends Extension
}
if (is_iterable($items)) {
$newEvent = new BulkActionEvent($action, $event, $items);
$newEvent = new BulkActionEvent($action, $items);
send_event($newEvent);
}
$page->set_mode(PageMode::REDIRECT);
if (!isset($_SERVER['HTTP_REFERER'])) {
$_SERVER['HTTP_REFERER'] = make_link();
@ -228,7 +225,7 @@ class BulkActions extends Extension
send_event(new ImageDeletionEvent($image));
$total++;
} catch (Exception $e) {
$page->flash("Error while removing {$image->id}: " . $e->getMessage(), "error");
$page->flash("Error while removing {$image->id}: " . $e->getMessage());
}
}
return $total;
@ -283,7 +280,7 @@ class BulkActions extends Extension
send_event(new SourceSetEvent($image, $source));
$total++;
} catch (Exception $e) {
$page->flash("Error while setting source for {$image->id}: " . $e->getMessage(), "error");
$page->flash("Error while setting source for {$image->id}: " . $e->getMessage());
}
}
return $total;

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkActionsTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddEvent extends Event
{
@ -7,6 +7,7 @@ class BulkAddEvent extends Event
public function __construct(string $dir)
{
parent::__construct();
$this->dir = $dir;
$this->results = [];
}

View File

@ -1,4 +1,5 @@
<?php
<?php declare(strict_types=1);
class BulkAddTest extends ShimmiePHPUnitTestCase
{
public function testBulkAdd()
@ -26,15 +27,15 @@ class BulkAddTest extends ShimmiePHPUnitTestCase
# FIXME: test that the output here makes sense, no "adding foo.php ... ok"
$this->get_page("post/list/hash=17fc89f372ed3636e28bd25cc7f3bac1/1");
$this->assert_title(new PatternExpectation("/^Image \d+: data/"));
$this->assert_title_matches(new PatternExpectation("/^Image \d+: data/"));
$this->click("Delete");
$this->get_page("post/list/hash=feb01bab5698a11dd87416724c7a89e3/1");
$this->assert_title(new PatternExpectation("/^Image \d+: data/"));
$this->assert_title_matches(new PatternExpectation("/^Image \d+: data/"));
$this->click("Delete");
$this->get_page("post/list/hash=e106ea2983e1b77f11e00c0c54e53805/1");
$this->assert_title(new PatternExpectation("/^Image \d+: data/"));
$this->assert_title_matches(new PatternExpectation("/^Image \d+: data/"));
$this->click("Delete");
$this->log_out();

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddCSVInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddCSV extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkAddCSVTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class BulkRemoveInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
//todo: removal by tag returns 1 less image in test for some reason, actually a combined search doesn't seem to work for shit either

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CommentListInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
require_once "vendor/ifixit/php-akismet/akismet.class.php";
@ -13,6 +13,7 @@ class CommentPostingEvent extends Event
public function __construct(int $image_id, User $user, string $comment)
{
parent::__construct();
$this->image_id = $image_id;
$this->user = $user;
$this->comment = $comment;
@ -31,6 +32,7 @@ class CommentDeletionEvent extends Event
public function __construct(int $comment_id)
{
parent::__construct();
$this->comment_id = $comment_id;
}
}
@ -69,7 +71,7 @@ class Comment
public static function count_comments_by_user(User $user): int
{
global $database;
return $database->get_one("
return (int)$database->get_one("
SELECT COUNT(*) AS count
FROM comments
WHERE owner_id=:owner_id
@ -102,7 +104,7 @@ class CommentList extends Extension
public function onDatabaseUpgrade(DatabaseUpgradeEvent $event)
{
global $config, $database;
global $database;
if ($this->get_version("ext_comments_version") < 3) {
// shortcut to latest
if ($this->get_version("ext_comments_version") < 1) {
@ -202,7 +204,7 @@ class CommentList extends Extension
if ($user->can(Permissions::DELETE_COMMENT)) {
// FIXME: post, not args
if ($event->count_args() === 3) {
send_event(new CommentDeletionEvent($event->get_arg(1)));
send_event(new CommentDeletionEvent(int_escape($event->get_arg(1))));
$page->flash("Deleted comment");
$page->set_mode(PageMode::REDIRECT);
if (!empty($_SERVER['HTTP_REFERER'])) {
@ -254,7 +256,7 @@ class CommentList extends Extension
$duser = User::by_name($search);
$i_comment_count = Comment::count_comments_by_user($duser);
$com_per_page = 50;
$total_pages = ceil($i_comment_count / $com_per_page);
$total_pages = (int)ceil($i_comment_count / $com_per_page);
$page_num = clamp($page_num, 1, $total_pages);
$comments = $this->get_user_comments($duser->id, $com_per_page, ($page_num - 1) * $com_per_page);
$this->theme->display_all_user_comments($comments, $page_num, $total_pages, $duser);
@ -340,8 +342,9 @@ class CommentList extends Extension
public function onSearchTermParse(SearchTermParseEvent $event)
{
$matches = [];
if(is_null($event->term)) return;
$matches = [];
if (preg_match("/^comments([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+)$/i", $event->term, $matches)) {
$cmp = ltrim($matches[1], ":") ?: "=";
$comments = $matches[2];
@ -399,7 +402,7 @@ class CommentList extends Extension
$images = [];
while ($row = $result->fetch()) {
$image = Image::by_id($row["image_id"]);
$image = Image::by_id((int)$row["image_id"]);
if (
Extension::is_enabled(RatingsInfo::KEY) && !is_null($image) &&
!in_array($image->rating, $user_ratings)

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CommentListTest extends ShimmiePHPUnitTestCase
{
public function setUp(): void

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CommentListTheme extends Themelet
{
private $show_anon_id = false;
@ -40,14 +40,14 @@ class CommentListTheme extends Themelet
$comment_limit = $config->get_int("comment_list_count", 10);
$comment_captcha = $config->get_bool('comment_captcha');
foreach ($images as $pair) {
$image = $pair[0];
$comments = $pair[1];
$thumb_html = $this->build_thumb_html($image);
$comment_html = "";
$comment_count = count($comments);
if ($comment_limit > 0 && $comment_count > $comment_limit) {
$comment_html .= "<p>showing $comment_limit of $comment_count comments</p>";
@ -166,10 +166,10 @@ class CommentListTheme extends Themelet
public function display_all_user_comments(array $comments, int $page_number, int $total_pages, User $user)
{
global $page;
assert(is_numeric($page_number));
assert(is_numeric($total_pages));
$html = "";
foreach ($comments as $comment) {
$html .= $this->comment_to_html($comment, true);
@ -182,7 +182,7 @@ class CommentListTheme extends Themelet
$prev = $page_number - 1;
$next = $page_number + 1;
//$search_terms = array('I','have','no','idea','what','this','does!');
//$u_tags = url_escape(Tag::implode($search_terms));
//$query = empty($u_tags) ? "" : '/'.$u_tags;
@ -274,16 +274,15 @@ class CommentListTheme extends Themelet
{
global $config;
$i_image_id = int_escape($image_id);
$hash = CommentList::get_hash();
$h_captcha = $config->get_bool("comment_captcha") ? captcha_get_html() : "";
return '
<div class="comment comment_add">
'.make_form(make_link("comment/add")).'
<input type="hidden" name="image_id" value="'.$i_image_id.'" />
<input type="hidden" name="image_id" value="'.$image_id.'" />
<input type="hidden" name="hash" value="'.$hash.'" />
<textarea id="comment_on_'.$i_image_id.'" name="comment" rows="5" cols="50"></textarea>
<textarea id="comment_on_'.$image_id.'" name="comment" rows="5" cols="50"></textarea>
'.$h_captcha.'
<br><input type="submit" value="Post Comment" />
</form>
@ -297,7 +296,7 @@ class CommentListTheme extends Themelet
<div class="command_example">
<pre>comments=1</pre>
<p>Returns images with exactly 1 comment.</p>
</div>
</div>
<div class="command_example">
<pre>comments>0</pre>
<p>Returns images with 1 or more comments. </p>

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
abstract class CronUploaderConfig

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/*
* Name: Cron Uploader

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
require_once "config.php";
@ -109,13 +109,13 @@ class CronUploader extends Extension
{
global $page;
if (empty($folder)) {
throw new Exception("folder empty");
throw new SCoreException("folder empty");
}
$queue_dir = $this->get_queue_dir();
$stage_dir = join_path($this->get_failed_dir(), $folder);
if (!is_dir($stage_dir)) {
throw new Exception("Could not find $stage_dir");
throw new SCoreException("Could not find $stage_dir");
}
$this->prep_root_dir();
@ -123,7 +123,7 @@ class CronUploader extends Extension
$results = get_dir_contents($queue_dir);
if (count($results) > 0) {
$page->flash("Queue folder must be empty to re-stage", "error");
$page->flash("Queue folder must be empty to re-stage");
return;
}
@ -293,7 +293,7 @@ class CronUploader extends Extension
}
$output_subdir = date('Ymd-His', time());
$image_queue = $this->generate_image_queue($upload_count);
$image_queue = $this->generate_image_queue(CronUploaderConfig::get_dir(), $upload_count);
// Throw exception if there's nothing in the queue
@ -408,9 +408,8 @@ class CronUploader extends Extension
send_event($event);
// Generate info message
$infomsg = ""; // Will contain info message
if ($event->image_id == -1) {
throw new Exception("File type not recognised. Filename: {$filename}");
throw new UploadException("File type not recognised. Filename: {$filename}");
} elseif ($event->merged === true) {
$infomsg = "Image merged. ID: {$event->image_id} - Filename: {$filename}";
} else {
@ -473,8 +472,6 @@ class CronUploader extends Extension
private function log_message(int $severity, string $message): void
{
global $database;
log_msg(self::NAME, $severity, $message);
$time = "[" . date('Y-m-d H:i:s') . "]";

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CronUploaderTheme extends Themelet
{
@ -40,7 +40,7 @@ class CronUploaderTheme extends Themelet
<td>{$failed_dirinfo['total_mb']}</td>
<td>{$failed_dirinfo['path']}</td>
</tr></table>
<br>Cron Command: <input type='text' size='60' value='$cron_cmd'><br>
Create a cron job with the command above.<br/>
Read the documentation if you're not sure what to do.<br>";
@ -57,14 +57,14 @@ class CronUploaderTheme extends Themelet
<br />When you create the cron job, you choose when to upload new images.</li>
</ol>";
$usage_html = "Upload your images you want to be uploaded to the queue directory using your FTP client or other means.
$usage_html = "Upload your images you want to be uploaded to the queue directory using your FTP client or other means.
<br />(<b>{$queue_dirinfo['path']}</b>)
<ol>
<li>Any sub-folders will be turned into tags.</li>
<li>If the file name matches \"## - tag1 tag2.png\" the tags will be used.</li>
<li>If both are found, they will all be used.</li>
<li>The character \";\" will be changed into \":\" in any tags.</li>
<li>You can inherit categories by creating a folder that ends with \";\". For instance category;\\tag1 would result in the tag category:tag1. This allows creating a category folder, then creating many subfolders that will use that category.</li>
<li>You can inherit categories by creating a folder that ends with \";\". For instance category;\\tag1 would result in the tag category:tag1. This allows creating a category folder, then creating many subfolders that will use that category.</li>
</ol>
The cron uploader works by importing files from the queue folder whenever this url is visited:
<br/><pre><a href='$cron_url'>$cron_url</a></pre>
@ -72,7 +72,7 @@ class CronUploaderTheme extends Themelet
<ul>
<li>If an import is already running, another cannot start until it is done.</li>
<li>Each time it runs it will import up to ".CronUploaderConfig::get_count()." file(s). This is controlled from <a href='".make_link("setup")."'>Board Config</a>.</li>
<li>Uploaded images will be moved to the 'uploaded' directory into a subfolder named after the time the import started. It's recommended that you remove everything out of this directory from time to time. If you have admin controls enabled, this can be done from <a href='".make_link("admin")."'>Board Admin</a>.</li>
<li>Uploaded images will be moved to the 'uploaded' directory into a subfolder named after the time the import started. It's recommended that you remove everything out of this directory from time to time. If you have admin controls enabled, this can be done from <a href='".make_link("admin")."'>Board Admin</a>.</li>
<li>If you enable the db logging extension, you can view the log output on this screen. Otherwise the log will be written to a file at ".CronUploaderConfig::get_dir().DIRECTORY_SEPARATOR."uploads.log</li>
</ul>
";
@ -100,7 +100,7 @@ class CronUploaderTheme extends Themelet
public function display_form(array $failed_dirs)
{
global $page, $database;
global $page;
$link = make_http(make_link("cron_upload"));
$html = "<a href='$link'>Cron uploader documentation</a>";

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CustomHtmlHeadersInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class CustomHtmlHeaders extends Extension
{
@ -15,10 +15,10 @@ class CustomHtmlHeaders extends Extension
// modified title
$sb->add_choice_option("sitename_in_title", [
"none" => 0,
"as prefix" => 1,
"as suffix" => 2
], "<br>Add website name in title");
"none" => "none",
"as prefix" => "prefix",
"as suffix" => "suffix"
], "<br>Add website name in title");
$event->panel->add_block($sb);
}
@ -26,7 +26,7 @@ class CustomHtmlHeaders extends Extension
public function onInitExt(InitExtEvent $event)
{
global $config;
$config->set_default_int("sitename_in_title", 0);
$config->set_default_string("sitename_in_title", "none");
}
# Load Analytics tracking code on page request
@ -52,17 +52,16 @@ class CustomHtmlHeaders extends Extension
// get config values
$site_title = $config->get_string(SetupConfig::TITLE);
$sitename_in_title = $config->get_int("sitename_in_title");
$sitename_in_title = $config->get_string("sitename_in_title");
// if feature is enabled & sitename isn't already in title
// (can occur on index & other pages)
if ($sitename_in_title != 0 && !strstr($page->title, $site_title)) {
if ($sitename_in_title == 1) {
$page->title = "$site_title - $page->title";
} // as prefix
elseif ($sitename_in_title == 2) {
$page->title = "$page->title - $site_title";
} // as suffix
// sitename is already in title (can occur on index & other pages)
if(strstr($page->title, $site_title)) return;
if ($sitename_in_title == "prefix") {
$page->title = "$site_title - $page->title";
}
elseif ($sitename_in_title == "suffix") {
$page->title = "$page->title - $site_title";
}
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DanbooruApiInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DanbooruApi extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DanbooruApiTest extends ShimmiePHPUnitTestCase
{
public function testSearch()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DowntimeInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class Downtime extends Extension
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DowntimeTest extends ShimmiePHPUnitTestCase
{
public function tearDown(): void

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class DowntimeTheme extends Themelet
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class EmoticonsInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class EmoticonTest extends ShimmiePHPUnitTestCase
{
public function testEmoticons()

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class EmoticonListInfo extends ExtensionInfo
{

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* Class EmoticonList

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class EmoticonListTheme extends Themelet
{
public function display_emotes(array $list)

View File

@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
class ETInfo extends ExtensionInfo
{

Some files were not shown because too many files have changed in this diff Show More