aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs')
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/Bool2TextTransformationsPlugin.php69
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/CodeMirrorEditorTransformationPlugin.php75
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DateFormatTransformationsPlugin.php158
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DownloadTransformationsPlugin.php93
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ExternalTransformationsPlugin.php160
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/FormattedTransformationsPlugin.php65
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/HexTransformationsPlugin.php71
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageLinkTransformationsPlugin.php63
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageUploadTransformationsPlugin.php121
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/InlineTransformationsPlugin.php78
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/LongToIPv4TransformationsPlugin.php66
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/PreApPendTransformationsPlugin.php68
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/RegexValidationTransformationsPlugin.php74
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SQLTransformationsPlugin.php62
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SubstringTransformationsPlugin.php93
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextFileUploadTransformationsPlugin.php103
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextImageLinkTransformationsPlugin.php75
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextLinkTransformationsPlugin.php77
18 files changed, 1571 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/Bool2TextTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/Bool2TextTransformationsPlugin.php
new file mode 100644
index 0000000..696aa64
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/Bool2TextTransformationsPlugin.php
@@ -0,0 +1,69 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the Bool2Text transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Bool2Text
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the Bool2Text transformations plugins.
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Bool2Text
+ */
+abstract class Bool2TextTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Converts Boolean values to text (default \'T\' and \'F\').'
+ . ' First option is for TRUE, second for FALSE. Nonzero=true.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['Bool2Text']);
+
+ if ($buffer == '0') {
+ return $options[1]; // return false label
+ }
+
+ return $options[0]; // or true one if nonzero
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Bool2Text";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/CodeMirrorEditorTransformationPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/CodeMirrorEditorTransformationPlugin.php
new file mode 100644
index 0000000..bbd1fff
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/CodeMirrorEditorTransformationPlugin.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for syntax highlighted editors using CodeMirror
+ *
+ * @package PhpMyAdmin-Transformations
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\IOTransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all the CodeMirror syntax highlighted editors
+ *
+ * @package PhpMyAdmin-Transformations
+ */
+abstract class CodeMirrorEditorTransformationPlugin extends IOTransformationsPlugin
+{
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ return $buffer;
+ }
+
+ /**
+ * Returns the html for input field to override default textarea.
+ * Note: Return empty string if default textarea is required.
+ *
+ * @param array $column column details
+ * @param int $row_id row number
+ * @param string $column_name_appendix the name attribute
+ * @param array $options transformation options
+ * @param string $value Current field value
+ * @param string $text_dir text direction
+ * @param int $tabindex tab index
+ * @param int $tabindex_for_value offset for the values tabindex
+ * @param int $idindex id index
+ *
+ * @return string the html for input field
+ */
+ public function getInputHtml(
+ array $column,
+ $row_id,
+ $column_name_appendix,
+ array $options,
+ $value,
+ $text_dir,
+ $tabindex,
+ $tabindex_for_value,
+ $idindex
+ ) {
+ $html = '';
+ if (! empty($value)) {
+ $html = '<input type="hidden" name="fields_prev' . $column_name_appendix
+ . '" value="' . htmlspecialchars($value) . '">';
+ }
+ $class = 'transform_' . strtolower(static::getName()) . '_editor';
+ $html .= '<textarea name="fields' . $column_name_appendix . '"'
+ . ' dir="' . $text_dir . '" class="' . $class . '">'
+ . htmlspecialchars($value) . '</textarea>';
+
+ return $html;
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DateFormatTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DateFormatTransformationsPlugin.php
new file mode 100644
index 0000000..32ed494
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DateFormatTransformationsPlugin.php
@@ -0,0 +1,158 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the date format transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage DateFormat
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use PhpMyAdmin\Sanitize;
+use PhpMyAdmin\Util;
+use stdClass;
+
+/**
+ * Provides common methods for all of the date format transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class DateFormatTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a TIME, TIMESTAMP, DATETIME or numeric unix timestamp'
+ . ' column as formatted date. The first option is the offset (in'
+ . ' hours) which will be added to the timestamp (Default: 0). Use'
+ . ' second option to specify a different date/time format string.'
+ . ' Third option determines whether you want to see local date or'
+ . ' UTC one (use "local" or "utc" strings) for that. According to'
+ . ' that, date format has different value - for "local" see the'
+ . ' documentation for PHP\'s strftime() function and for "utc" it'
+ . ' is done using gmdate() function.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $buffer = (string) $buffer;
+ // possibly use a global transform and feed it with special options
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['DateFormat']);
+
+ // further operations on $buffer using the $options[] array.
+ $options[2] = mb_strtolower($options[2]);
+
+ if (empty($options[1])) {
+ if ($options[2] == 'local') {
+ $options[1] = __('%B %d, %Y at %I:%M %p');
+ } else {
+ $options[1] = 'Y-m-d H:i:s';
+ }
+ }
+
+ $timestamp = -1;
+
+ // INT columns will be treated as UNIX timestamps
+ // and need to be detected before the verification for
+ // MySQL TIMESTAMP
+ if ($meta->type == 'int') {
+ $timestamp = $buffer;
+
+ // Detect TIMESTAMP(6 | 8 | 10 | 12 | 14)
+ // TIMESTAMP (2 | 4) not supported here.
+ // (Note: prior to MySQL 4.1, TIMESTAMP has a display size
+ // for example TIMESTAMP(8) means YYYYMMDD)
+ } else {
+ if (preg_match('/^(\d{2}){3,7}$/', $buffer)) {
+ if (mb_strlen($buffer) == 14 || mb_strlen($buffer) == 8) {
+ $offset = 4;
+ } else {
+ $offset = 2;
+ }
+
+ $aDate = [];
+ $aDate['year'] = (int) mb_substr($buffer, 0, $offset);
+ $aDate['month'] = (int) mb_substr($buffer, $offset, 2);
+ $aDate['day'] = (int) mb_substr($buffer, $offset + 2, 2);
+ $aDate['hour'] = (int) mb_substr($buffer, $offset + 4, 2);
+ $aDate['minute'] = (int) mb_substr($buffer, $offset + 6, 2);
+ $aDate['second'] = (int) mb_substr($buffer, $offset + 8, 2);
+
+ if (checkdate($aDate['month'], $aDate['day'], $aDate['year'])) {
+ $timestamp = mktime(
+ $aDate['hour'],
+ $aDate['minute'],
+ $aDate['second'],
+ $aDate['month'],
+ $aDate['day'],
+ $aDate['year']
+ );
+ }
+ // If all fails, assume one of the dozens of valid strtime() syntaxes
+ // (https://www.gnu.org/manual/tar-1.12/html_chapter/tar_7.html)
+ } else {
+ if (preg_match('/^[0-9]\d{1,9}$/', $buffer)) {
+ $timestamp = (int) $buffer;
+ } else {
+ $timestamp = strtotime($buffer);
+ }
+ }
+ }
+
+ // If all above failed, maybe it's a Unix timestamp already?
+ if ($timestamp < 0 && preg_match('/^[1-9]\d{1,9}$/', $buffer)) {
+ $timestamp = $buffer;
+ }
+
+ // Reformat a valid timestamp
+ if ($timestamp >= 0) {
+ $timestamp -= (int) $options[0] * 60 * 60;
+ $source = $buffer;
+ if ($options[2] == 'local') {
+ $text = Util::localisedDate(
+ $timestamp,
+ $options[1]
+ );
+ } elseif ($options[2] == 'utc') {
+ $text = gmdate($options[1], $timestamp);
+ } else {
+ $text = 'INVALID DATE TYPE';
+ }
+ return '<dfn onclick="alert(\'' . Sanitize::jsFormat($source, false) . '\');" title="'
+ . htmlspecialchars((string) $source) . '">' . htmlspecialchars((string) $text) . '</dfn>';
+ }
+
+ return htmlspecialchars((string) $buffer);
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Date Format";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DownloadTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DownloadTransformationsPlugin.php
new file mode 100644
index 0000000..d6c21d6
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/DownloadTransformationsPlugin.php
@@ -0,0 +1,93 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the download transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Download
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the download transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class DownloadTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a link to download the binary data of the column. You can'
+ . ' use the first option to specify the filename, or use the second'
+ . ' option as the name of a column which contains the filename. If'
+ . ' you use the second option, you need to set the first option to'
+ . ' the empty string.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ global $row, $fields_meta;
+
+ if (isset($options[0]) && ! empty($options[0])) {
+ $cn = $options[0]; // filename
+ } else {
+ if (isset($options[1]) && ! empty($options[1])) {
+ foreach ($fields_meta as $key => $val) {
+ if ($val->name == $options[1]) {
+ $pos = $key;
+ break;
+ }
+ }
+ if (isset($pos)) {
+ $cn = $row[$pos];
+ }
+ }
+ if (empty($cn)) {
+ $cn = 'binary_file.dat';
+ }
+ }
+
+ return sprintf(
+ '<a href="transformation_wrapper.php%s&amp;ct=application'
+ . '/octet-stream&amp;cn=%s" title="%s" class="disableAjax">%s</a>',
+ $options['wrapper_link'],
+ htmlspecialchars(urlencode($cn)),
+ htmlspecialchars($cn),
+ htmlspecialchars($cn)
+ );
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Download";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ExternalTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ExternalTransformationsPlugin.php
new file mode 100644
index 0000000..006ee86
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ExternalTransformationsPlugin.php
@@ -0,0 +1,160 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the external transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage External
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the external transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class ExternalTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'LINUX ONLY: Launches an external application and feeds it the column'
+ . ' data via standard input. Returns the standard output of the'
+ . ' application. The default is Tidy, to pretty-print HTML code.'
+ . ' For security reasons, you have to manually edit the file'
+ . ' libraries/classes/Plugins/Transformations/Output/Text_Plain_External'
+ . '.php and list the tools you want to make available.'
+ . ' The first option is then the number of the program you want to'
+ . ' use and the second option is the parameters for the program.'
+ . ' The third option, if set to 1, will convert the output using'
+ . ' htmlspecialchars() (Default 1). The fourth option, if set to 1,'
+ . ' will prevent wrapping and ensure that the output appears all on'
+ . ' one line (Default 1).'
+ );
+ }
+
+ /**
+ * Enables no-wrapping
+ *
+ * @param array $options transformation options
+ *
+ * @return bool
+ */
+ public function applyTransformationNoWrap(array $options = [])
+ {
+ if (! isset($options[3]) || $options[3] == '') {
+ $nowrap = true;
+ } elseif ($options[3] == '1' || $options[3] == 1) {
+ $nowrap = true;
+ } else {
+ $nowrap = false;
+ }
+
+ return $nowrap;
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ // possibly use a global transform and feed it with special options
+
+ // further operations on $buffer using the $options[] array.
+
+ $allowed_programs = [];
+
+ //
+ // WARNING:
+ //
+ // It's up to administrator to allow anything here. Note that users may
+ // specify any parameters, so when programs allow output redirection or
+ // any other possibly dangerous operations, you should write wrapper
+ // script that will publish only functions you really want.
+ //
+ // Add here program definitions like (note that these are NOT safe
+ // programs):
+ //
+ //$allowed_programs[0] = '/usr/local/bin/tidy';
+ //$allowed_programs[1] = '/usr/local/bin/validate';
+
+ // no-op when no allowed programs
+ if (count($allowed_programs) === 0) {
+ return $buffer;
+ }
+
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions(
+ $options,
+ $cfg['DefaultTransformations']['External']
+ );
+
+ if (isset($allowed_programs[$options[0]])) {
+ $program = $allowed_programs[$options[0]];
+ } else {
+ $program = $allowed_programs[0];
+ }
+
+ // needs PHP >= 4.3.0
+ $newstring = '';
+ $descriptorspec = [
+ 0 => [
+ "pipe",
+ "r",
+ ],
+ 1 => [
+ "pipe",
+ "w",
+ ],
+ ];
+ $process = proc_open($program . ' ' . $options[1], $descriptorspec, $pipes);
+ if (is_resource($process)) {
+ fwrite($pipes[0], $buffer);
+ fclose($pipes[0]);
+
+ while (! feof($pipes[1])) {
+ $newstring .= fgets($pipes[1], 1024);
+ }
+ fclose($pipes[1]);
+ // we don't currently use the return value
+ proc_close($process);
+ }
+
+ if ($options[2] == 1 || $options[2] == '2') {
+ $retstring = htmlspecialchars($newstring);
+ } else {
+ $retstring = $newstring;
+ }
+
+ return $retstring;
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "External";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/FormattedTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/FormattedTransformationsPlugin.php
new file mode 100644
index 0000000..b40ffe3
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/FormattedTransformationsPlugin.php
@@ -0,0 +1,65 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the formatted transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Formatted
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the formatted transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class FormattedTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays the contents of the column as-is, without running it'
+ . ' through htmlspecialchars(). That is, the column is assumed'
+ . ' to contain valid HTML.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ return '<iframe srcdoc="'
+ . strtr($buffer, '"', '\'')
+ . '" sandbox=""></iframe>';
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Formatted";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/HexTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/HexTransformationsPlugin.php
new file mode 100644
index 0000000..69ce92d
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/HexTransformationsPlugin.php
@@ -0,0 +1,71 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the hex transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Hex
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the hex transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class HexTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays hexadecimal representation of data. Optional first'
+ . ' parameter specifies how often space will be added (defaults'
+ . ' to 2 nibbles).'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ // possibly use a global transform and feed it with special options
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['Hex']);
+ $options[0] = intval($options[0]);
+
+ if ($options[0] < 1) {
+ return bin2hex($buffer);
+ } else {
+ return chunk_split(bin2hex($buffer), $options[0], ' ');
+ }
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Hex";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageLinkTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageLinkTransformationsPlugin.php
new file mode 100644
index 0000000..efcfdc5
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageLinkTransformationsPlugin.php
@@ -0,0 +1,63 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the link transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Link
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the link transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class ImageLinkTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a link to download this image.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ // must disable the page loader, see
+ // https://wiki.phpmyadmin.net/pma/Page_loader#Bypassing_the_page_loader
+ return '<a class="disableAjax" target="_blank" rel="noopener noreferrer" href="transformation_wrapper.php'
+ . $options['wrapper_link'] . '" alt="[' . htmlspecialchars($buffer) . ']">[BLOB]</a>';
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "ImageLink";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageUploadTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageUploadTransformationsPlugin.php
new file mode 100644
index 0000000..0e6c0fd
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/ImageUploadTransformationsPlugin.php
@@ -0,0 +1,121 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the image upload input transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage ImageUpload
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\IOTransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the image upload transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class ImageUploadTransformationsPlugin extends IOTransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Image upload functionality which also displays a thumbnail.'
+ . ' The options are the width and height of the thumbnail'
+ . ' in pixels. Defaults to 100 X 100.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ return $buffer;
+ }
+
+ /**
+ * Returns the html for input field to override default textarea.
+ * Note: Return empty string if default textarea is required.
+ *
+ * @param array $column column details
+ * @param int $row_id row number
+ * @param string $column_name_appendix the name attribute
+ * @param array $options transformation options
+ * @param string $value Current field value
+ * @param string $text_dir text direction
+ * @param int $tabindex tab index
+ * @param int $tabindex_for_value offset for the values tabindex
+ * @param int $idindex id index
+ *
+ * @return string the html for input field
+ */
+ public function getInputHtml(
+ array $column,
+ $row_id,
+ $column_name_appendix,
+ array $options,
+ $value,
+ $text_dir,
+ $tabindex,
+ $tabindex_for_value,
+ $idindex
+ ) {
+ $html = '';
+ $src = '';
+ if (! empty($value)) {
+ $html = '<input type="hidden" name="fields_prev' . $column_name_appendix
+ . '" value="' . bin2hex($value) . '">';
+ $html .= '<input type="hidden" name="fields' . $column_name_appendix
+ . '" value="' . bin2hex($value) . '">';
+ $src = 'transformation_wrapper.php' . $options['wrapper_link'];
+ }
+ $html .= '<img src="' . $src . '" width="'
+ . (isset($options[0]) ? intval($options[0]) : '100') . '" height="'
+ . (isset($options[1]) ? intval($options[1]) : '100') . '" alt="'
+ . __('Image preview here') . '">';
+ $html .= '<br><input type="file" name="fields_upload'
+ . $column_name_appendix . '" accept="image/*" class="image-upload">';
+
+ return $html;
+ }
+
+ /**
+ * Returns the array of scripts (filename) required for plugin
+ * initialization and handling
+ *
+ * @return array javascripts to be included
+ */
+ public function getScripts()
+ {
+ return [
+ 'transformations/image_upload.js',
+ ];
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Image upload";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/InlineTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/InlineTransformationsPlugin.php
new file mode 100644
index 0000000..102dce9
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/InlineTransformationsPlugin.php
@@ -0,0 +1,78 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the inline transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Inline
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the inline transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class InlineTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a clickable thumbnail. The options are the maximum width'
+ . ' and height in pixels. The original aspect ratio is preserved.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['Inline']);
+
+ if (PMA_IS_GD2) {
+ return '<a href="transformation_wrapper.php'
+ . $options['wrapper_link']
+ . '" rel="noopener noreferrer" target="_blank"><img src="transformation_wrapper.php'
+ . $options['wrapper_link'] . '&amp;resize=jpeg&amp;newWidth='
+ . intval($options[0]) . '&amp;newHeight='
+ . intval($options[1])
+ . '" alt="[' . htmlspecialchars($buffer) . ']" border="0"></a>';
+ } else {
+ return '<img src="transformation_wrapper.php'
+ . $options['wrapper_link']
+ . '" alt="[' . htmlspecialchars($buffer) . ']" width="320" height="240">';
+ }
+ }
+
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Inline";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/LongToIPv4TransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/LongToIPv4TransformationsPlugin.php
new file mode 100644
index 0000000..03767dc
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/LongToIPv4TransformationsPlugin.php
@@ -0,0 +1,66 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the long to IPv4 transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage LongToIPv4
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use PhpMyAdmin\Util;
+use stdClass;
+
+/**
+ * Provides common methods for all of the long to IPv4 transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class LongToIPv4TransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Converts an (IPv4) Internet network address stored as a BIGINT'
+ . ' into a string in Internet standard dotted format.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ if (! Util::isInteger($buffer) || $buffer < 0 || $buffer > 4294967295) {
+ return htmlspecialchars($buffer);
+ }
+
+ return long2ip((int) $buffer);
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Long To IPv4";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/PreApPendTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/PreApPendTransformationsPlugin.php
new file mode 100644
index 0000000..3dbf9d8
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/PreApPendTransformationsPlugin.php
@@ -0,0 +1,68 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the prepend/append transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage PreApPend
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the prepend/append transformations plugins.
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage PreApPend
+ */
+abstract class PreApPendTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Prepends and/or Appends text to a string. First option is text'
+ . ' to be prepended, second is appended (enclosed in single'
+ . ' quotes, default empty string).'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['PreApPend']);
+
+ //just prepend and/or append the options to the original text
+ return htmlspecialchars($options[0]) . htmlspecialchars($buffer)
+ . htmlspecialchars($options[1]);
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "PreApPend";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/RegexValidationTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/RegexValidationTransformationsPlugin.php
new file mode 100644
index 0000000..33f0ccd
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/RegexValidationTransformationsPlugin.php
@@ -0,0 +1,74 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the regex validation input transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage RegexValidation
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\IOTransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the regex validation
+ * input transformations plugins.
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage RegexValidation
+ */
+abstract class RegexValidationTransformationsPlugin extends IOTransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Validates the string using regular expression '
+ . 'and performs insert only if string matches it. '
+ . 'The first option is the Regular Expression.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ // reset properties of object
+ $this->reset();
+ if (! empty($options[0]) && ! preg_match($options[0], $buffer)) {
+ $this->success = false;
+ $this->error = sprintf(
+ __('Validation failed for the input string %s.'),
+ htmlspecialchars($buffer)
+ );
+ }
+
+ return $buffer;
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Regex Validation";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SQLTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SQLTransformationsPlugin.php
new file mode 100644
index 0000000..616a24e
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SQLTransformationsPlugin.php
@@ -0,0 +1,62 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the SQL transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage SQL
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use PhpMyAdmin\Util;
+use stdClass;
+
+/**
+ * Provides common methods for all of the SQL transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class SQLTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Formats text as SQL query with syntax highlighting.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ return Util::formatSql($buffer);
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "SQL";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SubstringTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SubstringTransformationsPlugin.php
new file mode 100644
index 0000000..7267f6c
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/SubstringTransformationsPlugin.php
@@ -0,0 +1,93 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the substring transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Substring
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the substring transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class SubstringTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a part of a string. The first option is the number of'
+ . ' characters to skip from the beginning of the string (Default 0).'
+ . ' The second option is the number of characters to return (Default:'
+ . ' until end of string). The third option is the string to append'
+ . ' and/or prepend when truncation occurs (Default: "…").'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ // possibly use a global transform and feed it with special options
+
+ // further operations on $buffer using the $options[] array.
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['Substring']);
+
+ if ($options[1] != 'all') {
+ $newtext = mb_substr(
+ $buffer,
+ $options[0],
+ $options[1]
+ );
+ } else {
+ $newtext = mb_substr($buffer, $options[0]);
+ }
+
+ $length = mb_strlen($newtext);
+ $baselength = mb_strlen($buffer);
+ if ($length != $baselength) {
+ if ($options[0] != 0) {
+ $newtext = $options[2] . $newtext;
+ }
+
+ if (($length + (int) $options[0]) != $baselength) {
+ $newtext .= $options[2];
+ }
+ }
+
+ return htmlspecialchars($newtext);
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Substring";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextFileUploadTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextFileUploadTransformationsPlugin.php
new file mode 100644
index 0000000..76021d8
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextFileUploadTransformationsPlugin.php
@@ -0,0 +1,103 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the text file upload input transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage TextFileUpload
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\IOTransformationsPlugin;
+use stdClass;
+
+/**
+ * Provides common methods for all of the text file upload
+ * input transformations plugins.
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage TextFileUpload
+ */
+abstract class TextFileUploadTransformationsPlugin extends IOTransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'File upload functionality for TEXT columns. '
+ . 'It does not have a textarea for input.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ return $buffer;
+ }
+
+ /**
+ * Returns the html for input field to override default textarea.
+ * Note: Return empty string if default textarea is required.
+ *
+ * @param array $column column details
+ * @param int $row_id row number
+ * @param string $column_name_appendix the name attribute
+ * @param array $options transformation options
+ * @param string $value Current field value
+ * @param string $text_dir text direction
+ * @param int $tabindex tab index
+ * @param int $tabindex_for_value offset for the values tabindex
+ * @param int $idindex id index
+ *
+ * @return string the html for input field
+ */
+ public function getInputHtml(
+ array $column,
+ $row_id,
+ $column_name_appendix,
+ array $options,
+ $value,
+ $text_dir,
+ $tabindex,
+ $tabindex_for_value,
+ $idindex
+ ) {
+ $html = '';
+ if (! empty($value)) {
+ $html = '<input type="hidden" name="fields_prev' . $column_name_appendix
+ . '" value="' . htmlspecialchars($value) . '">';
+ $html .= '<input type="hidden" name="fields' . $column_name_appendix
+ . '" value="' . htmlspecialchars($value) . '">';
+ }
+ $html .= '<input type="file" name="fields_upload'
+ . $column_name_appendix . '">';
+
+ return $html;
+ }
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Text file upload";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextImageLinkTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextImageLinkTransformationsPlugin.php
new file mode 100644
index 0000000..71fdd6a
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextImageLinkTransformationsPlugin.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the image link transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage ImageLink
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use PhpMyAdmin\Sanitize;
+use stdClass;
+
+/**
+ * Provides common methods for all of the image link transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class TextImageLinkTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays an image and a link; the column contains the filename. The'
+ . ' first option is a URL prefix like "https://www.example.com/". The'
+ . ' second and third options are the width and the height in pixels.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['TextImageLink']);
+ $url = $options[0] . $buffer;
+ /* Do not allow javascript links */
+ if (! Sanitize::checkLink($url, true, true)) {
+ return htmlspecialchars($url);
+ }
+ return '<a href="' . htmlspecialchars($url)
+ . '" rel="noopener noreferrer" target="_blank"><img src="' . htmlspecialchars($url)
+ . '" border="0" width="' . intval($options[1])
+ . '" height="' . intval($options[2]) . '">'
+ . htmlspecialchars($buffer) . '</a>';
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "Image Link";
+ }
+}
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextLinkTransformationsPlugin.php b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextLinkTransformationsPlugin.php
new file mode 100644
index 0000000..e29ff2c
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Transformations/Abs/TextLinkTransformationsPlugin.php
@@ -0,0 +1,77 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Abstract class for the link transformations plugins
+ *
+ * @package PhpMyAdmin-Transformations
+ * @subpackage Link
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Transformations\Abs;
+
+use PhpMyAdmin\Plugins\TransformationsPlugin;
+use PhpMyAdmin\Sanitize;
+use stdClass;
+
+/**
+ * Provides common methods for all of the link transformations plugins.
+ *
+ * @package PhpMyAdmin
+ */
+abstract class TextLinkTransformationsPlugin extends TransformationsPlugin
+{
+ /**
+ * Gets the transformation description of the specific plugin
+ *
+ * @return string
+ */
+ public static function getInfo()
+ {
+ return __(
+ 'Displays a link; the column contains the filename. The first option'
+ . ' is a URL prefix like "https://www.example.com/". The second option'
+ . ' is a title for the link.'
+ );
+ }
+
+ /**
+ * Does the actual work of each specific transformations plugin.
+ *
+ * @param string $buffer text to be transformed
+ * @param array $options transformation options
+ * @param stdClass|null $meta meta information
+ *
+ * @return string
+ */
+ public function applyTransformation($buffer, array $options = [], ?stdClass $meta = null)
+ {
+ $cfg = $GLOBALS['cfg'];
+ $options = $this->getOptions($options, $cfg['DefaultTransformations']['TextLink']);
+ $url = (isset($options[0]) ? $options[0] : '') . ((isset($options[2]) && $options[2]) ? '' : $buffer);
+ /* Do not allow javascript links */
+ if (! Sanitize::checkLink($url, true, true)) {
+ return htmlspecialchars($url);
+ }
+ return '<a href="'
+ . htmlspecialchars($url)
+ . '" title="'
+ . htmlspecialchars(isset($options[1]) ? $options[1] : '')
+ . '" target="_blank" rel="noopener noreferrer">'
+ . htmlspecialchars(isset($options[1]) ? $options[1] : $buffer)
+ . '</a>';
+ }
+
+
+ /* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
+
+ /**
+ * Gets the transformation name of the specific plugin
+ *
+ * @return string
+ */
+ public static function getName()
+ {
+ return "TextLink";
+ }
+}