Compare commits

..

64 commits

Author SHA1 Message Date
Sebijk
dfb82c6ef1 fix undefined array key strike 2023-11-03 08:29:05 +01:00
Sebijk
5c17ac91b7 set version to 7.4.1-RC1 2023-10-14 14:51:21 +02:00
Sebijk
281fc00552 fix undefined 2023-10-14 14:43:58 +02:00
Sebijk
d1aa868c24 search filter absendername 2023-10-14 14:43:34 +02:00
Sebijk
e3436e999a create a docker template for development
thanks to mbuchalik for this idea
2023-10-14 14:24:25 +02:00
Sebijk
8808752b30 switch to json instead serialize + base64 2023-10-14 14:19:41 +02:00
Sebijk
8e3509d8b8 require init 2023-10-13 21:43:39 +02:00
Sebijk
da39b74ee8 php 8 fix from mbuchalik fork 2023-10-13 21:42:59 +02:00
Sebijk
f3b00829ed fix static call in fax plugin and update fpdi to 2.5 2023-10-13 21:40:43 +02:00
Sebijk
3bde398b52 require init
if init.inc.php not exists, it will stop script, include just continue.
2023-10-13 21:26:09 +02:00
Sebijk
15e17a6075 Port some changes from MBuchalik fork 2023-10-13 21:21:03 +02:00
Sebijk
08800a2bff Update Smarty to 3.1.48 2023-10-13 16:22:00 +02:00
Sebijk
6b5b84a920 fix undefined extlink 2023-09-23 23:09:26 +02:00
Sebijk
4206e26ccb update fpdf to 1.86 2023-08-06 13:22:54 +02:00
Sebijk
e86c54a7cb add isset 2023-08-06 13:09:23 +02:00
Sebijk
b8063773f9 fix undefined index 2023-08-05 09:45:44 +02:00
Sebijk
ddd402cf2d update ckeditor 2023-07-19 19:11:23 +02:00
Sebijk
fd7db4aee4 process # in deref.php 2023-06-12 20:59:59 +02:00
Sebijk
26914fa012 fix undefined variable 2023-06-12 20:38:12 +02:00
Sebijk
5baea95fcd fix undefined variable 2023-06-07 04:05:02 +02:00
Sebijk
0c18bca69f update FPDI to 2.3.7 2023-06-06 20:39:15 +02:00
Sebijk
0f4ec3d32d update CKEditor to 4.21.0 2023-06-06 20:20:35 +02:00
Sebijk
5b0c842c48 remove obsolete code with safe_mode 2023-06-06 18:51:43 +02:00
Sebijk
76bc97d627 fix syntax error 2023-06-06 17:41:48 +02:00
Sebijk
e2a4d687e8 Security: Prevent leak of POP3 passwords in html code. 2023-06-06 17:37:52 +02:00
Sebijk
76a58c77f5 fix undefined variable 2023-06-06 17:05:01 +02:00
Sebijk
da37928a60 fix undefined variable 2023-06-06 17:03:36 +02:00
Sebijk
ebc0f974dc fix undefined variable 2023-06-06 16:55:13 +02:00
Sebijk
a827bbee18 fix undefined error 2023-06-06 16:50:02 +02:00
Sebijk
8c62bc536d fix undefined var 2023-03-22 19:23:14 +01:00
Sebijk
7458dc7fae fix undefined array key 2023-02-11 23:50:17 +01:00
Sebijk
0f335a7809 template if fix 2023-02-03 22:33:39 +01:00
Sebijk
775fea6d73 set version to 7.4.1-Beta4 2023-02-02 20:59:14 +01:00
Sebijk
e599013582 add FileHandlerMobile
This allow to use plugins in mobile interface
2023-02-02 19:53:15 +01:00
Sebijk
28c56c50c9 make _sendNotification static 2023-02-02 00:04:43 +01:00
Sebijk
825591f52c add dnsbl and reglock check for non logged in users 2023-02-01 21:00:34 +01:00
Sebijk
3a69a69a50 responsive widgets + template fixes 2023-02-01 20:22:18 +01:00
Sebijk
be0a2c84bf sabredav replace utf8_encode 2023-02-01 20:21:21 +01:00
Sebijk
db1d099341 remove obsolete koobi7 and jfchat plugin 2023-02-01 20:15:05 +01:00
Sebijk
c8f5e7b2cf fix undefined key in email compose 2023-02-01 00:48:30 +01:00
Sebijk
aa6f631316 isset captchainfo 2023-02-01 00:18:25 +01:00
Sebijk
72094d0d40 add more isset 2023-02-01 00:03:38 +01:00
Sebijk
bbf69c444d fix again a lot of undefined index 2023-01-31 22:43:33 +01:00
Sebijk
c4bb0e2bc2 make _dateFor static 2023-01-22 13:45:47 +01:00
Sebijk
8a675941b8 make _getOccurencesInTimeframe and _dateFor static 2023-01-22 13:42:55 +01:00
Sebijk
e7f7e499a7 fix call in static function: use self function 2023-01-22 13:23:59 +01:00
Sebijk
5a8e28c0fd change structure because of php-bug #10002 2022-12-10 18:23:00 +01:00
Sebijk
361ea6b0b9 disable memmcached in php 8 2022-12-10 00:08:09 +01:00
Sebijk
5b8e138bfd update ckeditor to 4.20.1 2022-12-10 00:07:21 +01:00
Sebijk
47c293b436 fix a lot of undefined variable and index 2022-12-09 09:49:08 +01:00
Sebijk
702d2d9345 Fix undefined variable showDbMailsNote 2022-11-23 20:43:59 +01:00
Sebijk
67fdc5cd1f cs fix (and call ProcessNotifications statically). 2022-11-22 20:56:42 +01:00
Sebijk
04a8d3a3a9 update fpdf to 1.85 2022-11-22 20:49:24 +01:00
Sebijk
b38021fce0 use CharSetDecode
utf8_encode and utf8_decode are deprecated in PHP 8.2
2022-11-22 20:48:53 +01:00
Sebijk
611e897edb fix undefined errors 2022-11-22 00:28:31 +01:00
Sebijk
84e3b5202c cs fix 2022-10-19 20:34:47 +02:00
Sebijk
755f0b4939 update ckeditor to 4.20 2022-10-19 20:16:37 +02:00
Sebijk
6e61a01375 cs fix 2022-09-16 23:58:55 +02:00
Sebijk
a3186cbfb2 update ckeditor to 4.19.1 2022-09-16 23:52:56 +02:00
Sebijk
565a5e8ee1 update openfire plugin 2022-03-22 16:46:41 +01:00
Sebijk
4d8e1b37a7 Update CKEditor to 4.18.0 2022-03-22 16:12:05 +01:00
Sebijk
6c55c5d4cb updated austria city code database 2022-03-22 09:33:13 +01:00
Sebijk
9b02ce5953 add city code check database for sri lanka
Codes from https://github.com/AyeshJayasekara/PostalCodes
2022-03-22 09:31:06 +01:00
Sebijk
84d58d8632 php 8 + cs fix 2022-03-22 09:27:34 +01:00
581 changed files with 46665 additions and 16684 deletions

View file

@ -17,7 +17,8 @@ A big thanks goes to b1gMail founder Patrick Schlangen. He released b1gMail as f
## Getting started
It is recommended to install the b1gMail developer copy on a local web server,
e.g. standard Apache/PHP/MySQL on Linux or Wamp on Windows. Even better results
on Windows can be achieved with a WSL setup.
on Windows can be achieved with a WSL setup. If you use Docker, you can also
use our docker template in `docker-dev`.
In order to install a development environment, proceed as follows:
1. Clone the repository

2
dev-docker/.env Normal file
View file

@ -0,0 +1,2 @@
# Docker by default uses the folder name to isolate different projects. This might however be a problem because we call our folder "dev", which might also be how other projects call their folders. To avoid any collisions, we use an idea from https://stackoverflow.com/questions/50947938/docker-compose-orphan-containers-warning
COMPOSE_PROJECT_NAME=b1gmail-dev

15
dev-docker/Dockerfile Normal file
View file

@ -0,0 +1,15 @@
FROM php:8.2-apache
# From the official documentation on https://hub.docker.com/_/php
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libicu-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
# See https://github.com/docker-library/php/issues/391
RUN docker-php-ext-install mysqli
RUN docker-php-ext-install intl

29
dev-docker/README.md Normal file
View file

@ -0,0 +1,29 @@
**THIS SETUP IS ONLY MEANT FOR DEVELOPMENT PURPOSES!**
> Make sure you have Docker installed on your system.
In order to start a development server, simply run `docker compose up`. This will start an apache server with php (on `localhost:5000`), a mysql database, and phpmyadmin (on `localhost:3100`).
The credentials for the database that you will later also need when installing b1gmail:
- Host: `db` (Yes, you don't need to use any IP address or similar. Just `db` is sufficient.)
- Database name: `b1gmail`
- Username: `user`
- Password: `password`
In order to log in to phpmyadmin, use the following credentials:
- Username: `root`
- Password: `root`
Important when recreating the containers: We don't only store data in the database, but also in `/src/temp/` and `/src/data/`. You might need to delete files and folders in these directories. You can delete everything from `/src/data/` and `/src/temp/` except for the following files:
- `/src/data/.htaccess`
- `/src/data/index.html`
- `/src/temp/.htaccess`
- `/src/temp/index.html`
- `/src/temp/cache/dummy`
- `/src/temp/session/dummy`
- `/src/serverlib/config.inc.php`
A script for automation is included. If you want to use a "hacky" approach for now: Simply delete these `/src/data/` and `/src/temp/` directories and then use git to revert the changes.

View file

@ -0,0 +1,32 @@
version: '3.9'
services:
php:
build: .
networks:
- default
ports:
- '5000:80'
volumes:
- ../src:/var/www/html
depends_on:
- db
db:
image: mariadb
networks:
- default
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: b1gmail
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- '3306:3306'
phpmyadmin:
image: phpmyadmin/phpmyadmin:5
ports:
- '3100:80'
depends_on:
- db

View file

@ -0,0 +1,31 @@
#!/bin/bash
rm -Rf ../src/data
mkdir ../src/data
touch ../src/data/.htaccess
touch ../src/data/index.html
rm -Rf ../src/temp
mkdir ../src/temp
mkdir ../src/temp/cache
mkdir ../src/temp/session
touch ../src/temp/.htaccess
touch ../src/temp/index.html
touch ../src/temp/cache/dummy
touch ../src/temp/session/dummy
tee ../src/temp/.htaccess <<EOF
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Deny from all
</IfModule>
EOF
tee ../src/data/.htaccess <<EOF
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Deny from all
</IfModule>
EOF

View file

@ -58,7 +58,7 @@ if($_REQUEST['action'] == 'db')
{
// read default structure
include('../serverlib/database.struct.php');
$databaseStructure = unserialize(base64_decode($databaseStructure));
$databaseStructure = json_decode($databaseStructure, JSON_OBJECT_AS_ARRAY);
// get tables
$defaultTables = array();
@ -184,7 +184,7 @@ if($_REQUEST['action'] == 'db')
{
// read default structure
include('../serverlib/database.struct.php');
$databaseStructure = unserialize(base64_decode($databaseStructure));
$databaseStructure = json_decode($databaseStructure, JSON_OBJECT_AS_ARRAY);
$executedQueries = SyncDBStruct($databaseStructure);
// assign

View file

@ -19,371 +19,335 @@
*
*/
include('../serverlib/admin.inc.php');
include '../serverlib/admin.inc.php';
RequestPrivileges(PRIVILEGES_ADMIN);
AdminRequirePrivilege('pluginsadmin');
if(!isset($_REQUEST['action']))
$_REQUEST['action'] = 'plugins';
if (!isset($_REQUEST['action'])) {
$_REQUEST['action'] = 'plugins';
}
$tabs = array(
0 => array(
'title' => $lang_admin['plugins'],
'relIcon' => 'plugin32.png',
'link' => 'plugins.php?',
'active' => $_REQUEST['action'] == 'plugins'
),
1 => array(
'title' => $lang_admin['widgets'],
'relIcon' => 'wlayout_add32.png',
'link' => 'plugins.php?action=widgets&',
'active' => $_REQUEST['action'] == 'widgets'
),
2 => array(
'title' => $lang_admin['updates'],
'relIcon' => 'updates.png',
'link' => 'plugins.php?action=updates&',
'active' => $_REQUEST['action'] == 'updates'
),
3 => array(
'title' => $lang_admin['install'],
'relIcon' => 'plugin_add.png',
'link' => 'plugins.php?action=install&',
'active' => $_REQUEST['action'] == 'install'
)
);
$tabs = [
0 => [
'title' => $lang_admin['plugins'],
'relIcon' => 'plugin32.png',
'link' => 'plugins.php?',
'active' => $_REQUEST['action'] == 'plugins',
],
1 => [
'title' => $lang_admin['widgets'],
'relIcon' => 'wlayout_add32.png',
'link' => 'plugins.php?action=widgets&',
'active' => $_REQUEST['action'] == 'widgets',
],
2 => [
'title' => $lang_admin['updates'],
'relIcon' => 'updates.png',
'link' => 'plugins.php?action=updates&',
'active' => $_REQUEST['action'] == 'updates',
],
3 => [
'title' => $lang_admin['install'],
'relIcon' => 'plugin_add.png',
'link' => 'plugins.php?action=install&',
'active' => $_REQUEST['action'] == 'install',
],
];
/**
/*
* plugins/widgets
*/
if($_REQUEST['action'] == 'plugins'
|| $_REQUEST['action'] == 'widgets')
{
if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'activatePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_inactivePlugins[$_REQUEST['plugin']]))
{
$plugins->activatePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
}
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'deactivatePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_plugins[$_REQUEST['plugin']]))
{
$plugins->deactivatePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
}
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'pausePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_plugins[$_REQUEST['plugin']]))
{
$plugins->pausePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
}
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'unpausePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_inactivePlugins[$_REQUEST['plugin']]))
{
$plugins->unpausePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
}
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'deletePackage'
&& isset($_REQUEST['package']) && strlen($_REQUEST['package']) == 32)
{
BMPluginPackage::Uninstall($_REQUEST['package']);
$tpl->assign('reloadMenu', true);
}
if ($_REQUEST['action'] == 'plugins'
|| $_REQUEST['action'] == 'widgets') {
if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'activatePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_inactivePlugins[$_REQUEST['plugin']])) {
$plugins->activatePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
} elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'deactivatePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_plugins[$_REQUEST['plugin']])) {
$plugins->deactivatePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
} elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'pausePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_plugins[$_REQUEST['plugin']])) {
$plugins->pausePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
} elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'unpausePlugin'
&& isset($_REQUEST['plugin']) && isset($plugins->_inactivePlugins[$_REQUEST['plugin']])) {
$plugins->unpausePlugin($_REQUEST['plugin']);
$tpl->assign('reloadMenu', true);
} elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'deletePackage'
&& isset($_REQUEST['package']) && strlen($_REQUEST['package']) == 32) {
BMPluginPackage::staticUninstall($_REQUEST['package']);
$tpl->assign('reloadMenu', true);
}
$pluginList = array();
$pluginList = [];
// build plugin list
foreach($plugins->_plugins as $className=>$pluginInfo)
{
if(($_REQUEST['action'] == 'plugins' && ($plugins->getParam('type', $className) == BMPLUGIN_DEFAULT
|| $plugins->getParam('type', $className) == BMPLUGIN_FILTER))
|| ($_REQUEST['action'] == 'widgets' && $plugins->getParam('type', $className) == BMPLUGIN_WIDGET))
{
if(!isset($pluginList[$pluginInfo['signature']]))
$pluginList[$pluginInfo['signature']] = array(
'name' => $pluginInfo['packageName'],
'plugins' => array()
);
$pluginList[$pluginInfo['signature']]['plugins'][] = array(
'name' => $className,
'title' => $plugins->getParam('name', $className),
'version' => $plugins->getParam('version', $className),
'author' => $plugins->getParam('author', $className),
'type' => $pluginTypeTable[$plugins->getParam('type', $className)],
'installed' => $plugins->getParam('installed', $className),
'paused' => $plugins->getParam('paused', $className)
);
}
}
foreach($plugins->_inactivePlugins as $className=>$pluginInfo)
{
if(($_REQUEST['action'] == 'plugins' && ($pluginInfo['type'] == BMPLUGIN_DEFAULT
|| $pluginInfo['type'] == BMPLUGIN_FILTER))
|| ($_REQUEST['action'] == 'widgets' && $pluginInfo['type'] == BMPLUGIN_WIDGET))
{
if(!isset($pluginList[$pluginInfo['signature']]))
$pluginList[$pluginInfo['signature']] = array(
'name' => $pluginInfo['packageName'],
'plugins' => array()
);
$pluginList[$pluginInfo['signature']]['plugins'][] = array(
'name' => $className,
'title' => $pluginInfo['name'],
'version' => $pluginInfo['version'],
'author' => $pluginInfo['author'],
'type' => $pluginTypeTable[$pluginInfo['type']],
'installed' => $pluginInfo['installed'],
'paused' => $pluginInfo['paused']
);
}
}
// build plugin list
foreach ($plugins->_plugins as $className => $pluginInfo) {
if (($_REQUEST['action'] == 'plugins' && ($plugins->getParam('type', $className) == BMPLUGIN_DEFAULT
|| $plugins->getParam('type', $className) == BMPLUGIN_FILTER))
|| ($_REQUEST['action'] == 'widgets' && $plugins->getParam('type', $className) == BMPLUGIN_WIDGET)) {
if (!isset($pluginList[$pluginInfo['signature']])) {
$pluginList[$pluginInfo['signature']] = [
'name' => $pluginInfo['packageName'],
'plugins' => [],
];
}
$pluginList[$pluginInfo['signature']]['plugins'][] = [
'name' => $className,
'title' => $plugins->getParam('name', $className),
'description' => $plugins->getParam('description', $className),
'version' => $plugins->getParam('version', $className),
'author' => $plugins->getParam('author', $className),
'type' => $pluginTypeTable[$plugins->getParam('type', $className)],
'installed' => $plugins->getParam('installed', $className),
'paused' => $plugins->getParam('paused', $className),
];
}
}
foreach ($plugins->_inactivePlugins as $className => $pluginInfo) {
if (($_REQUEST['action'] == 'plugins' && ($pluginInfo['type'] == BMPLUGIN_DEFAULT
|| $pluginInfo['type'] == BMPLUGIN_FILTER))
|| ($_REQUEST['action'] == 'widgets' && $pluginInfo['type'] == BMPLUGIN_WIDGET)) {
if (!isset($pluginList[$pluginInfo['signature']])) {
$pluginList[$pluginInfo['signature']] = [
'name' => $pluginInfo['packageName'],
'plugins' => [],
];
}
$pluginList[$pluginInfo['signature']]['plugins'][] = [
'name' => $className,
'title' => $pluginInfo['name'],
'description' => $pluginInfo['description'],
'version' => $pluginInfo['version'],
'author' => $pluginInfo['author'],
'type' => $pluginTypeTable[$pluginInfo['type']],
'installed' => $pluginInfo['installed'],
'paused' => $pluginInfo['paused'],
];
}
}
function __PluginSort($a, $b)
{
return(strcasecmp(($a['installed'] ? '0' : '1') . $a['title'], ($b['installed'] ? '0' : '1') . $b['title']));
}
function __PluginSort($a, $b)
{
return strcasecmp(($a['installed'] ? '0' : '1').$a['title'], ($b['installed'] ? '0' : '1').$b['title']);
}
function __PluginListSort($a, $b)
{
return(strcasecmp($a['name'], $b['name']));
}
function __PluginListSort($a, $b)
{
return strcasecmp($a['name'], $b['name']);
}
foreach($pluginList as $key=>$val)
uasort($pluginList[$key]['plugins'], '__PluginSort');
foreach ($pluginList as $key => $val) {
uasort($pluginList[$key]['plugins'], '__PluginSort');
}
uasort($pluginList, '__PluginListSort');
uasort($pluginList, '__PluginListSort');
$tpl->assign('action', $_REQUEST['action']);
$tpl->assign('plugins', $pluginList);
$tpl->assign('page', 'plugins.list.tpl');
$tpl->assign('action', $_REQUEST['action']);
$tpl->assign('plugins', $pluginList);
$tpl->assign('page', 'plugins.list.tpl');
}
/**
/*
* update check page
*/
else if($_REQUEST['action'] == 'updates')
{
$pluginList = array();
elseif ($_REQUEST['action'] == 'updates') {
$pluginList = [];
// build plugin list
foreach($plugins->_plugins as $className=>$pluginInfo)
{
if(!isset($pluginList[$pluginInfo['signature']]))
$pluginList[$pluginInfo['signature']] = array(
'name' => $pluginInfo['packageName'],
'plugins' => array()
);
$pluginList[$pluginInfo['signature']]['plugins'][] = array(
'name' => $className,
'title' => $plugins->getParam('name', $className),
'version' => $plugins->getParam('version', $className),
'author' => $plugins->getParam('author', $className),
'website' => $plugins->getParam('website', $className),
'type' => $pluginTypeTable[$plugins->getParam('type', $className)],
'installed' => true
);
}
// build plugin list
foreach ($plugins->_plugins as $className => $pluginInfo) {
if (!isset($pluginList[$pluginInfo['signature']])) {
$pluginList[$pluginInfo['signature']] = [
'name' => $pluginInfo['packageName'],
'plugins' => [],
];
}
$pluginList[$pluginInfo['signature']]['plugins'][] = [
'name' => $className,
'title' => $plugins->getParam('name', $className),
'description' => $plugins->getParam('description', $className),
'version' => $plugins->getParam('version', $className),
'author' => $plugins->getParam('author', $className),
'website' => $plugins->getParam('website', $className),
'type' => $pluginTypeTable[$plugins->getParam('type', $className)],
'installed' => true,
];
}
$tpl->assign('plugins', $pluginList);
$tpl->assign('page', 'plugins.updates.tpl');
$tpl->assign('plugins', $pluginList);
$tpl->assign('page', 'plugins.updates.tpl');
}
/**
/*
* perform update check
*/
else if($_REQUEST['action'] == 'updateCheck'
&& isset($_REQUEST['plugin']))
{
$latestVersion = '';
$resultCode = $plugins->callFunction('CheckForUpdates', $_REQUEST['plugin'], false, array(&$latestVersion));
elseif ($_REQUEST['action'] == 'updateCheck'
&& isset($_REQUEST['plugin'])) {
$latestVersion = '';
$resultCode = $plugins->callFunction('CheckForUpdates', $_REQUEST['plugin'], false, [&$latestVersion]);
printf('%s;%d;%s;%s',
$_REQUEST['plugin'],
$resultCode,
$latestVersion,
$plugins->getParam('website', $_REQUEST['plugin']));
exit();
printf('%s;%d;%s;%s',
$_REQUEST['plugin'],
$resultCode,
$latestVersion,
$plugins->getParam('website', $_REQUEST['plugin']));
exit();
}
/**
/*
* install
*/
else if($_REQUEST['action'] == 'install')
{
//
// form
//
if(!isset($_REQUEST['do']))
{
$tpl->assign('page', 'plugins.install.tpl');
}
elseif ($_REQUEST['action'] == 'install') {
//
// form
//
if (!isset($_REQUEST['do'])) {
$tpl->assign('page', 'plugins.install.tpl');
}
//
// upload
//
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'uploadPlugin')
{
$formatError = true;
//
// upload
//
elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'uploadPlugin') {
$formatError = true;
if(isset($_FILES['package']) && $_FILES['package']['error'] == 0
&& $_FILES['package']['size'] > 0)
{
// request temp file
$tempFileID = RequestTempFile(0);
$tempFileName = TempFileName($tempFileID);
if (isset($_FILES['package']) && $_FILES['package']['error'] == 0
&& $_FILES['package']['size'] > 0) {
// request temp file
$tempFileID = RequestTempFile(0);
$tempFileName = TempFileName($tempFileID);
// move file
$fileName = $_FILES['package']['name'];
move_uploaded_file($_FILES['package']['tmp_name'], $tempFileName);
// move file
$fileName = $_FILES['package']['name'];
move_uploaded_file($_FILES['package']['tmp_name'], $tempFileName);
// open file
$package = _new('BMPluginPackage', array($fp = fopen($tempFileName, 'rb')));
if($package->ParseFile())
{
$meta = $package->metaInfo;
// open file
$package = _new('BMPluginPackage', [$fp = fopen($tempFileName, 'rb')]);
if ($package->ParseFile()) {
$meta = $package->metaInfo;
foreach($meta as $key=>$val)
if(is_string($val))
$meta[$key] = CharsetDecode($val, FALLBACK_CHARSET);
foreach ($meta as $key => $val) {
if (is_string($val)) {
$meta[$key] = CharsetDecode($val, FALLBACK_CHARSET);
}
}
$formatError = false;
$tpl->assign('id', $tempFileID);
$tpl->assign('meta', $meta);
$tpl->assign('signature', $package->signature);
$tpl->assign('versionsMatch', $package->metaInfo['for_b1gmail'] == B1GMAIL_VERSION);
$tpl->assign('b1gmailVersion', B1GMAIL_VERSION);
$tpl->assign('page', 'plugin.install.info.tpl');
}
$formatError = false;
$tpl->assign('id', $tempFileID);
$tpl->assign('meta', $meta);
$tpl->assign('signature', $package->signature);
$tpl->assign('versionsMatch', $package->metaInfo['for_b1gmail'] == B1GMAIL_VERSION);
$tpl->assign('b1gmailVersion', B1GMAIL_VERSION);
$tpl->assign('page', 'plugin.install.info.tpl');
}
// close file
fclose($fp);
}
// close file
fclose($fp);
}
// invalid file => message
if($formatError)
{
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_formaterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
}
}
// invalid file => message
if ($formatError) {
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_formaterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
}
}
//
// check signature
//
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'checkSignature'
&& isset($_REQUEST['signature']) && strlen($_REQUEST['signature']) == 32)
{
$result = BMPluginPackage::VerifySignature($_REQUEST['signature']);
//
// check signature
//
elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'checkSignature'
&& isset($_REQUEST['signature']) && strlen($_REQUEST['signature']) == 32) {
$result = BMPluginPackage::VerifySignature($_REQUEST['signature']);
if($result === false)
{
$tpl->assign('icon', 'error32');
$tpl->assign('title', $lang_admin['sigfailed']);
$tpl->assign('text', $lang_admin['sigfailed_desc']);
}
else if($result == SIGNATURE_OFFICIAL)
{
$tpl->assign('icon', 'sig_ok');
$tpl->assign('title', $lang_admin['sigofficial']);
$tpl->assign('text', $lang_admin['sigofficial_desc']);
}
else if($result == SIGNATURE_VERIFIED)
{
$tpl->assign('icon', 'sig');
$tpl->assign('title', $lang_admin['sigver']);
$tpl->assign('text', $lang_admin['sigver_desc']);
}
else if($result == SIGNATURE_UNKNOWN)
{
$tpl->assign('icon', 'sig_unknown');
$tpl->assign('title', $lang_admin['sigunknown']);
$tpl->assign('text', $lang_admin['sigunknown_desc']);
}
else if($result == SIGNATURE_MALICIOUS)
{
$tpl->assign('icon', 'sig_mal');
$tpl->assign('title', $lang_admin['sigmal']);
$tpl->assign('text', $lang_admin['sigmal_desc']);
}
if ($result === false) {
$tpl->assign('icon', 'error32');
$tpl->assign('title', $lang_admin['sigfailed']);
$tpl->assign('text', $lang_admin['sigfailed_desc']);
} elseif ($result == SIGNATURE_OFFICIAL) {
$tpl->assign('icon', 'sig_ok');
$tpl->assign('title', $lang_admin['sigofficial']);
$tpl->assign('text', $lang_admin['sigofficial_desc']);
} elseif ($result == SIGNATURE_VERIFIED) {
$tpl->assign('icon', 'sig');
$tpl->assign('title', $lang_admin['sigver']);
$tpl->assign('text', $lang_admin['sigver_desc']);
} elseif ($result == SIGNATURE_UNKNOWN) {
$tpl->assign('icon', 'sig_unknown');
$tpl->assign('title', $lang_admin['sigunknown']);
$tpl->assign('text', $lang_admin['sigunknown_desc']);
} elseif ($result == SIGNATURE_MALICIOUS) {
$tpl->assign('icon', 'sig_mal');
$tpl->assign('title', $lang_admin['sigmal']);
$tpl->assign('text', $lang_admin['sigmal_desc']);
}
$tpl->display('plugin.install.signature.tpl');
exit();
}
$tpl->display('plugin.install.signature.tpl');
exit();
}
//
// install
//
else if(isset($_REQUEST['do']) && $_REQUEST['do'] == 'installPlugin'
&& isset($_REQUEST['id']) && ValidTempFile(0, (int)$_REQUEST['id']))
{
if(isset($_REQUEST['step']))
$step = max(1, min(2, (int)$_REQUEST['step']));
else
$step = 1;
//
// install
//
elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'installPlugin'
&& isset($_REQUEST['id']) && ValidTempFile(0, (int) $_REQUEST['id'])) {
if (isset($_REQUEST['step'])) {
$step = max(1, min(2, (int) $_REQUEST['step']));
} else {
$step = 1;
}
$id = (int)$_REQUEST['id'];
$tempFileName = TempFileName($id);
$id = (int) $_REQUEST['id'];
$tempFileName = TempFileName($id);
// open file
$package = _new('BMPluginPackage', array($fp = fopen($tempFileName, 'rb')));
if($package->ParseFile())
{
if($step == 1)
{
if($package->InstallStep1())
{
$url = sprintf('plugins.php?action=install&do=installPlugin&id=%d&step=2&sid=%s',
$id,
session_id());
header('Location: ' . $url);
fclose($fp);
exit();
}
else
{
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_insterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
fclose($fp);
ReleaseTempFile(0, $id);
}
}
// open file
$package = _new('BMPluginPackage', [$fp = fopen($tempFileName, 'rb')]);
if ($package->ParseFile()) {
if ($step == 1) {
if ($package->InstallStep1()) {
$url = sprintf('plugins.php?action=install&do=installPlugin&id=%d&step=2&sid=%s',
$id,
session_id());
header('Location: '.$url);
fclose($fp);
exit();
} else {
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_insterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
fclose($fp);
ReleaseTempFile(0, $id);
}
} elseif ($step == 2) {
if ($package->InstallStep2()) {
$tpl->assign('reloadMenu', true);
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_installed']);
$tpl->assign('msgIcon', 'info32');
$tpl->assign('backLink', 'plugins.php?');
$tpl->assign('page', 'msg.tpl');
} else {
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_insterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
}
else if($step == 2)
{
if($package->InstallStep2())
{
$tpl->assign('reloadMenu', true);
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_installed']);
$tpl->assign('msgIcon', 'info32');
$tpl->assign('backLink', 'plugins.php?');
$tpl->assign('page', 'msg.tpl');
}
else
{
$tpl->assign('msgTitle', $lang_admin['install']);
$tpl->assign('msgText', $lang_admin['plugin_insterr']);
$tpl->assign('msgIcon', 'error32');
$tpl->assign('backLink', 'plugins.php?action=install&');
$tpl->assign('page', 'msg.tpl');
}
// close and release file
fclose($fp);
ReleaseTempFile(0, $id);
}
}
}
// close and release file
fclose($fp);
ReleaseTempFile(0, $id);
}
}
}
}
$tpl->assign('tabs', $tabs);
$tpl->assign('title', $lang_admin['plugins'] . ' &raquo; ' . $lang_admin['plugins']);
$tpl->assign('title', $lang_admin['plugins'].' &raquo; '.$lang_admin['plugins']);
$tpl->display('page.tpl');
?>

View file

@ -192,7 +192,12 @@ else if($_REQUEST['action'] == 'caching')
// assign
$bm_prefs['memcache_servers'] = str_replace(';', "\n", $bm_prefs['memcache_servers']);
$tpl->assign('memcache', class_exists('Memcache') || class_exists('Memcached'));
if((int)str_replace('.', '', phpversion()) >= 800) { // In PHP 8 we will disable memcached
$tpl->assign('memcache', false);
}
else {
$tpl->assign('memcache', class_exists('Memcache') || class_exists('Memcached'));
}
$tpl->assign('page', 'prefs.caching.tpl');
}

View file

@ -46,7 +46,7 @@
{elseif $fieldInfo.type==2}
<input type="checkbox" name="prefs[{$groupName}][{$fieldKey}]" value="1"{if $fieldInfo.value} checked="checked"{/if} />
{elseif $fieldInfo.type==1}
<input type="text" style="width:85%;" name="prefs[{$groupName}][{$fieldKey}]" value="{text value=$fieldInfo.value allowEmpty=true}" />
<input type="text" style="width:85%;" name="prefs[{$groupName}][{$fieldKey}]" value="{if isset($fieldInfo.value)}{text value=$fieldInfo.value allowEmpty=true}{/if}" />
{/if}
</td>
</tr>

View file

@ -7,15 +7,15 @@
<tr>
<td width="40" valign="top" rowspan="6"><img src="{$tpldir}images/ico_users.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="220">{lng p="username"}:</td>
<td class="td2"><input type="text" size="28" id="username" name="username" value="{text value=$admin.username}" /></td>
<td class="td2"><input type="text" size="28" id="username" name="username" value="{if isset($admin.username)}{text value=$admin.username}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="firstname"}:</td>
<td class="td2"><input type="text" size="36" id="firstname" name="firstname" value="{text value=$admin.firstname allowEmpty=true}" /></td>
<td class="td2"><input type="text" size="36" id="firstname" name="firstname" value="{if isset($admin.firstname)}{text value=$admin.firstname allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="lastname"}:</td>
<td class="td2"><input type="text" size="36" id="lastname" name="lastname" value="{text value=$admin.lastname allowEmpty=true}" /></td>
<td class="td2"><input type="text" size="36" id="lastname" name="lastname" value="{if isset($admin.lastname)}{text value=$admin.lastname allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="type"}:</td>
@ -36,7 +36,7 @@
<td class="td1" width="220">{lng p="areas"}:</td>
<td class="td2">
{foreach from=$permsTable item=permTitle key=permName}
<input type="checkbox" name="perms[{$permName}]" value="1" id="perm_{$permName}"{if $admin.perms.$permName} checked="checked"{/if} />
<input type="checkbox" name="perms[{$permName}]" value="1" id="perm_{$permName}"{if isset($admin.perms.$permName) && $admin.perms.$permName} checked="checked"{/if} />
<label for="perm_{$permName}" style="font-weight:bold;">{$permTitle}</label><br />
{/foreach}
</td>
@ -45,7 +45,7 @@
<td class="td1">{lng p="plugins"}:</td>
<td class="td2">
{foreach from=$pluginList item=pluginTitle key=pluginName}
<input type="checkbox" name="perms[plugins][{$pluginName}]" value="1" id="plugin_{$pluginName}"{if $admin.perms.plugins.$pluginName} checked="checked"{/if} />
<input type="checkbox" name="perms[plugins][{$pluginName}]" value="1" id="plugin_{$pluginName}"{if isset($admin.perms.plugins.$pluginName) && $admin.perms.plugins.$pluginName} checked="checked"{/if} />
<label for="plugin_{$pluginName}" style="font-weight:bold;">{text value=$pluginTitle}</label><br />
{/foreach}
</td>

View file

@ -8,7 +8,7 @@
<table width="100%">
<tr>
<td class="td1" width="160">{lng p="title"}:</td>
<td class="td2"><input type="text" name="titel" value="{text value=$group.titel allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="titel" value="{if isset($group.titel)}{text value=$group.titel allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="htmlview"}?</td>
@ -235,11 +235,11 @@
</tr>
<tr>
<td class="td1" width="160">{lng p="smsfrom"}:</td>
<td class="td2"><input type="text" name="sms_from" value="{text value=$group.sms_from allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="sms_from" value="{if isset($group.sms_from)}{text value=$group.sms_from allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="smssig"}:</td>
<td class="td2"><input type="text" name="sms_sig" value="{text value=$group.sms_sig allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="sms_sig" value="{if isset($group.sms_sig)}{text value=$group.sms_sig allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="mailsig"}:</td>
@ -266,7 +266,7 @@
{elseif $fieldInfo.type==2}
<input type="checkbox" name="{$fieldKey}" value="1"{if $fieldInfo.value} checked="checked"{/if} />
{elseif $fieldInfo.type==1}
<input type="text" style="width:85%;" name="{$fieldKey}" value="{text value=$fieldInfo.value allowEmpty=true}" />
<input type="text" style="width:85%;" name="{$fieldKey}" value="{if isset($fieldInfo.value)}{text value=$fieldInfo.value allowEmpty=true}{/if}" />
{/if}
</tr>
{/foreach}

View file

@ -20,13 +20,13 @@
<body onload="EBID('username').focus();" id="loginBody">
<form action="index.php?action=login" method="post" autocomplete="off">
{if $jump}<input type="hidden" id="jump" name="jump" value="{text value=$jump allowEmpty=true}" />{/if}
{if isset($jump)}<input type="hidden" id="jump" name="jump" value="{text value=$jump allowEmpty=true}" />{/if}
<input type="hidden" name="timezone" id="timezone" value="{$timezone}" />
<div id="loginBox1">
<div id="loginBox2">
<div id="loginBox3">
{if $error}<div class="loginError">{$error}</div>{/if}
{if isset($error)}<div class="loginError">{$error}</div>{/if}
<div id="loginLogo">
<img src="templates/images/logo_letter.png" style="width:90px;height:53px;" border="0" alt="" />

View file

@ -46,26 +46,26 @@
<tr>
<td class="td1">{lng p="priority"}:</td>
<td class="td2">
<input type="checkbox"{if $prio[8]} checked="checked"{/if} name="prio[8]" id="prio8" />
<input type="checkbox"{if isset($prio[8])} checked="checked"{/if} name="prio[8]" id="prio8" />
<label for="prio8"><img src="{$tpldir}images/debug.png" border="0" alt="" width="16" height="16" /></label> &nbsp;
<input type="checkbox"{if $prio[2]} checked="checked"{/if} name="prio[2]" id="prio2" />
<input type="checkbox"{if isset($prio[2])} checked="checked"{/if} name="prio[2]" id="prio2" />
<label for="prio2"><img src="{$tpldir}images/info.png" border="0" alt="" width="16" height="16" /></label> &nbsp;
<input type="checkbox"{if $prio[1]} checked="checked"{/if} name="prio[1]" id="prio1" />
<input type="checkbox"{if isset($prio[1])} checked="checked"{/if} name="prio[1]" id="prio1" />
<label for="prio1"><img src="{$tpldir}images/warning.png" border="0" alt="" width="16" height="16" /></label> &nbsp;
<input type="checkbox"{if $prio[4]} checked="checked"{/if} name="prio[4]" id="prio4" />
<input type="checkbox"{if isset($prio[4])} checked="checked"{/if} name="prio[4]" id="prio4" />
<label for="prio4"><img src="{$tpldir}images/error.png" border="0" alt="" width="16" height="16" /></label> &nbsp;
<input type="checkbox"{if $prio[16]} checked="checked"{/if} name="prio[16]" id="prio16" />
<input type="checkbox"{if isset($prio[16])} checked="checked"{/if} name="prio[16]" id="prio16" />
<label for="prio16"><img src="{$tpldir}images/plugin.png" border="0" alt="" width="16" height="16" /></label>
</td>
</tr>
<tr>
<td class="td1">{lng p="search"}:</td>
<td class="td2">
<input type="text" name="q" value="{text value=$q allowEmpty=true}" size="36" style="width:85%;" />
<input type="text" name="q" value="{if isset($q)}{text value=$q allowEmpty=true}{/if}" size="36" style="width:85%;" />
</td>
</tr>
</table>

View file

@ -8,8 +8,8 @@
<input type="hidden" name="queryAction" value="show" />
{if $smarty.post.queryTypeLogin}<input type="hidden" name="queryTypeLogin" value="on" />{/if}
{if $smarty.post.queryTypeGroups}<input type="hidden" name="queryTypeGroups" value="on" />{/if}
{if $smarty.post.loginDays}<input type="hidden" name="loginDays" value="{text value=$smarty.post.loginDays allowEmpty=true}" />{/if}
{foreach from=$smarty.post.groups item=item key=key}<input type="hidden" name="groups[{$key}]" value="{text value=$item allowEmpty=true}" />{/foreach}
{if $smarty.post.loginDays}<input type="hidden" name="loginDays" value="{if isset($smarty.post.loginDays)}{text value=$smarty.post.loginDays allowEmpty=true}{/if}" />{/if}
{foreach from=$smarty.post.groups item=item key=key}<input type="hidden" name="groups[{$key}]" value="{if isset($item)}{text value=$item allowEmpty=true}{/if}" />{/foreach}
<fieldset>
<legend>{lng p="inactiveusers"}</legend>

View file

@ -1,7 +1,7 @@
<fieldset>
<legend>{$msgTitle}</legend>
{if $msgIcon}
{if !empty($msgIcon)}
<table>
<tr>
<td width="36" valign="top"><img src="{$tpldir}images/{$msgIcon}.png" border="0" alt="" width="32" height="32" /></td>
@ -12,7 +12,7 @@
{$msgText}
{/if}
{if $backLink}
{if !empty($backLink)}
<p align="right">
<input class="button" type="button" onclick="document.location.href='{$backLink}sid={$sid}';" value=" {lng p="back"} " />
</p>
@ -23,10 +23,8 @@
{/if}
</fieldset>
{if $reloadMenu}
{if isset($reloadMenu) && $reloadMenu}
<script>
<!--
parent.frames['menu'].location.href = 'main.php?action=menu&item=4&sid={$sid}';
//-->
</script>
{/if}
{/if}

View file

@ -6,7 +6,7 @@
<tr>
<td width="40" valign="top" rowspan="7"><img src="{$tpldir}images/newsletter.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="120">{lng p="title"}:</td>
<td class="td2"><input type="text" id="subject" name="title" value="{text value=$tpl.title allowEmpty=true}" size="42" /></td>
<td class="td2"><input type="text" id="subject" name="title" value="{if isset($tpl.title)}{text value=$tpl.title allowEmpty=true}{/if}" size="42" /></td>
</tr>
<tr>
<td class="td1" >{lng p="mode"}:</td>
@ -20,11 +20,11 @@
</tr>
<tr>
<td class="td1">{lng p="from"}:</td>
<td class="td2"><input type="text" id="from" name="from" value="{text value=$tpl.from allowEmpty=true}" size="42" /></td>
<td class="td2"><input type="text" id="from" name="from" value="{if isset($tpl.from)}{text value=$tpl.from allowEmpty=true}{/if}" size="42" /></td>
</tr>
<tr>
<td class="td1">{lng p="subject"}:</td>
<td class="td2"><input type="text" id="subject" name="subject" value="{text value=$tpl.subject allowEmpty=true}" size="42" /></td>
<td class="td2"><input type="text" id="subject" name="subject" value="{if isset($tpl.subject)}{text value=$tpl.subject allowEmpty=true}{/if}" size="42" /></td>
</tr>
<tr>
<td class="td1">{lng p="priority"}:</td>

View file

@ -67,7 +67,7 @@
</tr>
<tr>
<td class="td1">{lng p="from"}:</td>
<td class="td2"><input type="text" id="from" name="from" value="{text value=$from}" size="42" /></td>
<td class="td2"><input type="text" id="from" name="from" value="{if isset($from)}{text value=$from}{/if}" size="42" /></td>
</tr>
<tr>
<td class="td1">{lng p="subject"}:</td>

View file

@ -17,7 +17,7 @@
<td class="td1" width="120">{lng p="groups"}:</td>
<td class="td2">
{foreach from=$groups item=group key=groupID}
<input type="checkbox" name="group_{$groupID}" id="group_{$groupID}"{if !$smarty.get.toGroup||$smarty.get.toGroup==$groupID} checked="checked"{/if} onclick="determineNewsletterRecipients()" />
<input type="checkbox" name="group_{$groupID}" id="group_{$groupID}"{if !isset($smarty.get.toGroup) || !$smarty.get.toGroup || $smarty.get.toGroup==$groupID} checked="checked"{/if} onclick="determineNewsletterRecipients()" />
<label for="group_{$groupID}"><b>{text value=$group.title}</b></label><br />
{/foreach}
</td>
@ -75,7 +75,7 @@
</tr>
<tr>
<td class="td1">{lng p="from"}:</td>
<td class="td2"><input type="text" id="from" name="from" value="{text value=$from}" size="42" /></td>
<td class="td2"><input type="text" id="from" name="from" value="{if isset($from)}{text value=$from}{/if}" size="42" /></td>
</tr>
<tr>
<td class="td1">{lng p="subject"}:</td>
@ -93,14 +93,12 @@
<td colspan="2" style="border: 1px solid #DDDDDD;background-color:#FFFFFF;">
<textarea name="emailText" id="emailText" class="plainTextArea" style="width:100%;height:400px;"></textarea>
<script src="../clientlib/wysiwyg.js?{fileDateSig file="../../clientlib/wysiwyg.js"}"></script>
<script type="text/javascript" src="../clientlib/ckeditor/ckeditor.js?{fileDateSig file="../../clientlib/ckeditor/ckeditor.js"}"></script>
<script src="../clientlib/ckeditor/ckeditor.js?{fileDateSig file="../../clientlib/ckeditor/ckeditor.js"}"></script>
<script>
<!--
var editor = new htmlEditor('emailText');
editor.height = 400;
editor.init();
registerLoadAction('editor.start()');
//-->
</script>
</td>
</tr>
@ -136,8 +134,6 @@
</form>
<script>
<!--
var newsletterMode = 'export';
registerLoadAction('determineNewsletterRecipients()');
//-->
</script>
</script>

View file

@ -1,7 +1,7 @@
<fieldset>
<legend>{lng p="db"}</legend>
{if $execute}
{if isset($execute)}
<table class="list">
<tr>
<th>&nbsp;</th>

View file

@ -75,7 +75,7 @@
<li><a href="prefs.countries.php?sid={$sid}"><img src="./templates/images/country.png" />{lng p="countries"}</a></li>
<li><a href="prefs.widgetlayouts.php?sid={$sid}"><img src="./templates/images/wlayout_add.png" />{lng p="widgetlayouts"}</a></li>
<li><a href="prefs.payments.php?sid={$sid}"><img src="./templates/images/ico_prefs_payments.png" />{lng p="payments"}</a></li>
{if $toolbox_serverurl!=''}<li><a href="toolbox.php?sid={$sid}"><img src="./templates/images/toolbox.png" />{lng p="toolbox"}</a></li>{/if}
{if !empty($toolbox_serverurl)}<li><a href="toolbox.php?sid={$sid}"><img src="./templates/images/toolbox.png" />{lng p="toolbox"}</a></li>{/if}
</ul>
</li>
{/if}
@ -107,7 +107,7 @@
<ul>
{if $adminRow.type==0}<li><a href="plugins.php?sid={$sid}"><img src="./templates/images/plugin.png" />{lng p="plugins"}</a></li>{/if}
{foreach from=$pluginMenuItems item=pluginInfo key=plugin}
{if $adminRow.type==0||$adminRow.privileges.plugins.$plugin}
{if $adminRow.type==0||isset($adminRow.privileges.plugins.$plugin)}
<li><a href="plugin.page.php?sid={$sid}&plugin={$plugin}" ><img src="{if $pluginInfo.icon}../plugins/templates/images/{$pluginInfo.icon}{else}./templates/images/wlayout_add.png{/if}" />{$pluginInfo.title}</a></li>
{/if}
{/foreach}
@ -129,7 +129,7 @@
{foreach from=$tabs item=tab}
<li{if $tab.active} class="active"{/if}>
<a href="{$tab.link}sid={$sid}">
<img src="{if $tab.relIcon}./templates/images/{$tab.relIcon}{elseif $tab.icon}{$tab.icon}{else}./templates/images/ico_prefs_misc.png{/if}" border="0" alt="" />
<img src="{if !empty($tab.relIcon)}./templates/images/{$tab.relIcon}{elseif $tab.icon}{$tab.icon}{else}./templates/images/ico_prefs_misc.png{/if}" border="0" alt="" />
{$tab.title}
</a>
</li>

View file

@ -47,7 +47,7 @@
</table>
</fieldset>
{if $reloadMenu}
{if isset($reloadMenu)}
<script>
<!--
parent.frames['menu'].location.href = 'main.php?action=menu&item=4&sid={$sid}';

View file

@ -72,7 +72,7 @@
<td>{$prefDetails.title}</td>
<td>
{if $prefDetails.type==1}
<input type="text" name="types[{$apTypeID}][prefs][{$prefKey}]" value="{text value=$prefDetails.value}" style="width:100px;" class="smallInput" />
<input type="text" name="types[{$apTypeID}][prefs][{$prefKey}]" value="{if isset($prefDetails.value)}{text value=$prefDetails.value}{/if}" style="width:100px;" class="smallInput" />
{/if}
</td>
</tr>

View file

@ -11,7 +11,7 @@
</tr>
<tr>
<td class="td1" width="160">{lng p="category"}:</td>
<td class="td2"><input type="text" name="category" size="36" value="{text value=$ad.category allowEmpty=true}" /></td>
<td class="td2"><input type="text" name="category" size="36" value="{if isset($ad.category)}{text value=$ad.category allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1" width="160">{lng p="weight"}:</td>

View file

@ -42,7 +42,7 @@
{elseif $fieldInfo.type==2}
<input type="checkbox" name="prefs[{$key}][{$fieldKey}]" value="1"{if $fieldInfo.value} checked="checked"{/if} />
{elseif $fieldInfo.type==1}
<input type="text" style="width:85%;" name="prefs[{$key}][{$fieldKey}]" value="{text value=$fieldInfo.value allowEmpty=true}" />
<input type="text" style="width:85%;" name="prefs[{$key}][{$fieldKey}]" value="{if isset($fieldInfo.value)}{text value=$fieldInfo.value allowEmpty=true}{/if}" />
{/if}
</td>
</tr>

View file

@ -148,7 +148,7 @@
<td class="td2">
<input type="checkbox" id="logs_autodelete" name="logs_autodelete"{if $bm_prefs.logs_autodelete=='yes'} checked="checked"{/if} />
<label for="logs_autodelete">{lng p="enableolder"}</label>
<input type="number" name="logs_autodelete_days" value="{text value=$bm_prefs.logs_autodelete_days}" size="4" min="1" step="1" />
<input type="number" name="logs_autodelete_days" value="{if isset($bm_prefs.logs_autodelete_days)}{text value=$bm_prefs.logs_autodelete_days}{/if}" size="4" min="1" step="1" />
{lng p="days"}<br />
<input type="checkbox" id="logs_autodelete_archive" name="logs_autodelete_archive"{if $bm_prefs.logs_autodelete_archive=='yes'} checked="checked"{/if} />
<label for="logs_autodelete_archive">{lng p="savearc"}</label>

View file

@ -7,7 +7,7 @@
<td width="40" valign="top" rowspan="6"><img src="{$tpldir}images/coupon32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="150">{lng p="code"}:</td>
<td class="td2">
<input type="text" name="code" value="{text value=$coupon.code}" style="width:85%;" />
<input type="text" name="code" value="{if isset($coupon.code)}{text value=$coupon.code}{/if}" style="width:85%;" />
</td>
</tr>
<tr>
@ -16,7 +16,7 @@
<input type="checkbox" onchange="EBID('count').value=this.checked?'-1':'0';"{if $coupon.anzahl==-1} checked="checked"{/if} id="count_unlim" />
<label for="count_unlim"><b>{lng p="unlimited"}</b></label>
{lng p="or"}
<input type="text" size="6" name="anzahl" id="count" value="{text value=$coupon.anzahl}" onkeyup="EBID('count_unlim').checked=this.value=='-1';" />
<input type="text" size="6" name="anzahl" id="count" value="{if isset($coupon.anzahl)}{text value=$coupon.anzahl}{/if}" onkeyup="EBID('count_unlim').checked=this.value=='-1';" />
</td>
</tr>
<tr>

View file

@ -23,7 +23,7 @@
<td style="text-align:center;"><input type="checkbox" name="domains[{$domain.domain}][in_login]"{if $domain.in_login} checked="checked"{/if} /></td>
<td style="text-align:center;"><input type="checkbox" name="domains[{$domain.domain}][in_signup]"{if $domain.in_signup} checked="checked"{/if} /></td>
<td style="text-align:center;"><input type="checkbox" name="domains[{$domain.domain}][in_aliases]"{if $domain.in_aliases} checked="checked"{/if} /></td>
<td><input type="text" name="domains[{$domain.domain}][pos]" value="{text value=$domain.pos allowEmpty=true}" size="6" /></td>
<td><input type="text" name="domains[{$domain.domain}][pos]" value="{if isset($domain.pos)}{text value=$domain.pos allowEmpty=true}{/if}" size="6" /></td>
<td>
<a href="prefs.common.php?action=domains&delete={$domain.urlDomain}&sid={$sid}" onclick="return confirm('{lng p="realdel"}');"><img src="{$tpldir}images/delete.png" border="0" alt="{lng p="edit"}" width="16" height="16" /></a>
</td>

View file

@ -48,9 +48,9 @@
<td><img src="{$tpldir}images/phrases.png" border="0" alt="" width="16" height="16" /></td>
<td><a name="{$text.key}" />{$text.title}<br /><small>{text value=$text.key}</small></td>
<td>
{if $customTextsHTML[$text.key]}<div style="border: 1px solid #DDDDDD;background-color:#FFFFFF;">{/if}
<textarea onfocus="this.style.height='240px';" onblur="this.style.height='100px';" style="width:99%;height:{if $customTextsHTML[$text.key]}350{else}100{/if}px;" name="text-{$text.key}" id="text-{$text.key}">{text value=$text.text allowEmpty=true}</textarea>
{if $customTextsHTML[$text.key]}
{if isset($customTextsHTML[$text.key])}<div style="border: 1px solid #DDDDDD;background-color:#FFFFFF;">{/if}
<textarea onfocus="this.style.height='240px';" onblur="this.style.height='100px';" style="width:99%;height:{if isset($customTextsHTML[$text.key])}350{else}100{/if}px;" name="text-{$text.key}" id="text-{$text.key}">{text value=$text.text allowEmpty=true}</textarea>
{if isset($customTextsHTML[$text.key])}
</div>
<script>
<!--

View file

@ -11,12 +11,12 @@
</tr>
<tr>
<td class="td1">{lng p="pay_notification"}:</td>
<td class="td2"><input id="send_pay_notification" name="send_pay_notification"{if $bm_prefs.send_pay_notification=='yes'} checked="checked"{/if} type="checkbox" /><label for="send_pay_notification"> {lng p="to2"}: </label><input type="text" name="pay_notification_to" value="{text value=$bm_prefs.pay_notification_to allowEmpty=true}" size="24" /></td>
<td class="td2"><input id="send_pay_notification" name="send_pay_notification"{if $bm_prefs.send_pay_notification=='yes'} checked="checked"{/if} type="checkbox" /><label for="send_pay_notification"> {lng p="to2"}: </label><input type="text" name="pay_notification_to" value="{if isset($bm_prefs.pay_notification_to)}{text value=$bm_prefs.pay_notification_to allowEmpty=true}{/if}" size="24" /></td>
</tr>
<tr>
<td class="td1">{lng p="sysmailsender"}:</td>
<td class="td2">
"<input type="text" name="pay_emailfrom" value="{text value=$bm_prefs.pay_emailfrom allowEmpty=true}" size="14" />"
"<input type="text" name="pay_emailfrom" value="{if isset($bm_prefs.pay_emailfrom)}{text value=$bm_prefs.pay_emailfrom allowEmpty=true}{/if}" size="14" />"
&lt;<input type="text" name="pay_emailfromemail" value="{email value=$bm_prefs.pay_emailfromemail}" size="22" />&gt;
</td>
</tr>

View file

@ -7,7 +7,7 @@
<tr>
<td width="40" valign="top" rowspan="3"><img src="{$tpldir}images/ico_pay_banktransfer.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="180">{lng p="title"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="title" value="{text value=$row.title allowEmpty=true}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="title" value="{if isset($row.title)}{text value=$row.title allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="enable"}?</td>
@ -43,16 +43,16 @@
{assign var=lastPos value=$field.pos}
<tr class="{$class}">
<td><img src="{$tpldir}images/field.png" border="0" alt="" width="16" height="16" /></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][title]" value="{text value=$field.title allowEmpty=true}" /></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][title]" value="{if isset($field.title)}{text value=$field.title allowEmpty=true}{/if}" /></td>
<td><select name="fields[{$fieldID}][type]">
{foreach from=$fieldTypeTable key=id item=text}
<option value="{$id}"{if $id==$field.type} selected="selected"{/if}>{$text}</option>
{/foreach}
</select></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][options]" value="{text value=$field.options allowEmpty=true}" /></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][options]" value="{if isset($field.options)}{text value=$field.options allowEmpty=true}{/if}" /></td>
<td style="text-align:center;"><input type="checkbox" name="fields[{$fieldID}][oblig]"{if $field.oblig} checked="checked"{/if} /></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][rule]" value="{text value=$field.rule allowEmpty=true}" /></td>
<td><input type="text" name="fields[{$fieldID}][pos]" value="{text value=$field.pos allowEmpty=true}" size="5" /></td>
<td><input type="text" style="width: 90%;" name="fields[{$fieldID}][rule]" value="{if isset($field.rule)}{text value=$field.rule allowEmpty=true}{/if}" /></td>
<td><input type="text" name="fields[{$fieldID}][pos]" value="{if isset($field.pos)}{text value=$field.pos allowEmpty=true}{/if}" size="5" /></td>
<td style="text-align:center;"><input type="checkbox" name="fields[{$fieldID}][delete]" /></td>
</tr>
{/foreach}

View file

@ -6,11 +6,11 @@
<tr>
<td width="40" valign="top" rowspan="6"><img src="{$tpldir}images/field32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="150">{lng p="field"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="feld" value="{text value=$field.feld allowEmpty=true}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="feld" value="{if isset($field.feld)}{text value=$field.feld allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="validityrule"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="rule" value="{text value=$field.rule allowEmpty=true}" />
<td class="td2"><input type="text" style="width:85%;" name="rule" value="{if isset($field.rule)}{text value=$field.rule allowEmpty=true}{/if}" />
<br /><small>{lng p="pfrulenote"}</small></td>
</tr>
<tr>
@ -36,7 +36,7 @@
</tr>
<tr>
<td class="td1">{lng p="options"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="extra" value="{text value=$field.extra allowEmpty=true}" />
<td class="td2"><input type="text" style="width:85%;" name="extra" value="{if isset($field.extra)}{text value=$field.extra allowEmpty=true}{/if}" />
<br /><small>{lng p="optionsdesc"}</small></td>
</tr>
</table>

View file

@ -6,11 +6,11 @@
<tr>
<td width="40" valign="top" rowspan="5"><img src="{$tpldir}images/rule32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="150">{lng p="field"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="field" value="{text value=$rule.field}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="field" value="{if isset($rule.field)}{text value=$rule.field}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="expression"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="expression" value="{text value=$rule.expression allowEmpty=true}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="expression" value="{if isset($rule.expression)}{text value=$rule.expression allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="action"}:</td>

View file

@ -6,7 +6,7 @@
<tr>
<td width="40" valign="top" rowspan="5"><img src="{$tpldir}images/gateway32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="150">{lng p="title"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="titel" value="{text value=$gateway.titel}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="titel" value="{if isset($gateway.titel)}{text value=$gateway.titel}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="getstring"}:</td>
@ -14,15 +14,15 @@
</tr>
<tr>
<td class="td1">{lng p="returnvalue"}:</td>
<td class="td2"><input type="text" size="10" name="success" value="{text value=$gateway.success allowEmpty=true}" /></td>
<td class="td2"><input type="text" size="10" name="success" value="{if isset($gateway.success)}{text value=$gateway.success allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="user"}:</td>
<td class="td2"><input type="text" size="36" id="user" name="user" value="{text value=$gateway.user allowEmpty=true}" /></td>
<td class="td2"><input type="text" size="36" id="user" name="user" value="{if isset($gateway.user)}{text value=$gateway.user allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="password"}:</td>
<td class="td2"><input type="password" autocomplete="off" size="36" id="pass" name="pass" value="{text value=$gateway.pass allowEmpty=true}" /></td>
<td class="td2"><input type="password" autocomplete="off" size="36" id="pass" name="pass" value="{if isset($gateway.pass)}{text value=$gateway.pass allowEmpty=true}{/if}" /></td>
</tr>
</table>

View file

@ -6,7 +6,7 @@
<tr>
<td width="40" valign="top" rowspan="6"><img src="{$tpldir}images/type32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="150">{lng p="title"}:</td>
<td class="td2"><input type="text" style="width:85%;" name="titel" value="{text value=$type.titel}" /></td>
<td class="td2"><input type="text" style="width:85%;" name="titel" value="{if isset($type.titel)}{text value=$type.titel}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="gateway"}:</td>
@ -19,7 +19,7 @@
</tr>
<tr>
<td class="td1">{lng p="type"}:</td>
<td class="td2"><input type="text" size="6" name="typ" value="{text value=$type.typ allowEmpty=true}" /></td>
<td class="td2"><input type="text" size="6" name="typ" value="{if isset($type.typ)}{text value=$type.typ allowEmpty=true}{/if}" /></td>
</tr>
<tr>
<td class="td1">{lng p="price"}:</td>

View file

@ -26,7 +26,7 @@
{elseif $fieldInfo.type==2}
<input type="checkbox" name="prefs[{$fieldKey}]" value="1"{if $fieldInfo.value} checked="checked"{/if} />
{elseif $fieldInfo.type==1}
<input type="text" style="width:85%;" name="prefs[{$fieldKey}]" value="{text value=$fieldInfo.value allowEmpty=true}" />
<input type="text" style="width:85%;" name="prefs[{$fieldKey}]" value="{if isset($fieldInfo.value)}{text value=$fieldInfo.value allowEmpty=true}{/if}" />
{/if}
</td>
</tr>

View file

@ -12,7 +12,7 @@
{/foreach}
</div>
<script src="../clientlib/dragcontainer.js" type="text/javascript"></script>
<script src="../clientlib/dragcontainer.js?{fileDateSig file="../../clientlib/dragcontainer.js"}" type="text/javascript"></script>
<script>
<!--
var dc = new dragContainer('dashboard', 3, 'dc');

View file

@ -42,7 +42,7 @@
{elseif $fieldInfo.type==2}
<input type="checkbox" name="prefs[{$groupName}][{$fieldKey}]" value="1"{if $fieldInfo.value} checked="checked"{/if} />
{elseif $fieldInfo.type==1}
<input type="text" style="width:85%;" name="prefs[{$groupName}][{$fieldKey}]" value="{text value=$fieldInfo.value allowEmpty=true}" />
<input type="text" style="width:85%;" name="prefs[{$groupName}][{$fieldKey}]" value="{if isset($fieldInfo.value)}{text value=$fieldInfo.value allowEmpty=true}{/if}" />
{/if}
</td>
</tr>

View file

@ -8,7 +8,7 @@
<table width="100%">
<tr>
<td class="td1" width="115">{lng p="email"}:</td>
<td class="td2"><input type="text" name="email" value="{text value=$user.email allowEmpty=true}" style="width:40%;" />
<td class="td2"><input type="text" name="email" value="{if isset($user.email)}{text value=$user.email allowEmpty=true}{/if}" style="width:40%;" />
<select name="emailDomain">
{foreach from=$domainList item=domain}
<option value="{$domain}">@{domain value=$domain}</option>
@ -25,21 +25,21 @@
</tr>
<tr>
<td class="td1">{lng p="firstname"}:</td>
<td class="td2"><input type="text" name="vorname" value="{text value=$user.vorname allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="vorname" value="{if isset($user.vorname)}{text value=$user.vorname allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="lastname"}:</td>
<td class="td2"><input type="text" name="nachname" value="{text value=$user.nachname allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="nachname" value="{if isset($user.nachname)}{text value=$user.nachname allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="streetno"}:</td>
<td class="td2"><input type="text" name="strasse" value="{text value=$user.strasse allowEmpty=true}" style="width:55%;" />
<input type="text" name="hnr" value="{text value=$user.hnr allowEmpty=true}" style="width:15%;" /></td>
<td class="td2"><input type="text" name="strasse" value="{if isset($user.strasse)}{text value=$user.strasse allowEmpty=true}{/if}" style="width:55%;" />
<input type="text" name="hnr" value="{if isset($user.hnr)}{text value=$user.hnr allowEmpty=true}{/if}" style="width:15%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="zipcity"}:</td>
<td class="td2"><input type="text" name="plz" value="{text value=$user.plz allowEmpty=true}" style="width:20%;" />
<input type="text" name="ort" value="{text value=$user.ort allowEmpty=true}" style="width:50%;" /></td>
<td class="td2"><input type="text" name="plz" value="{if isset($user.plz)}{text value=$user.plz allowEmpty=true}{/if}" style="width:20%;" />
<input type="text" name="ort" value="{if isset($user.ort)}{text value=$user.ort allowEmpty=true}{/if}" style="width:50%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="country"}:</td>
@ -51,19 +51,19 @@
</tr>
<tr>
<td class="td1">{lng p="tel"}:</td>
<td class="td2"><input type="text" name="tel" value="{text value=$user.tel allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="tel" value="{if isset($user.tel)}{text value=$user.tel allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="fax"}:</td>
<td class="td2"><input type="text" name="fax" value="{text value=$user.fax allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="fax" value="{if isset($user.fax)}{text value=$user.fax allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="cellphone"}:</td>
<td class="td2"><input type="text" name="mail2sms_nummer" value="{text value=$user.mail2sms_nummer allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="mail2sms_nummer" value="{if isset($user.mail2sms_nummer)}{text value=$user.mail2sms_nummer allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="altmail"}:</td>
<td class="td2"><input type="text" name="altmail" value="{text value=$user.altmail allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="altmail" value="{if isset($user.altmail)}{text value=$user.altmail allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
{foreach from=$profileFields item=profileField}
@ -72,9 +72,9 @@
<td class="td1">{$profileField.title}:</td>
<td class="td2">
{if $profileField.type==1}
<input type="text" name="field_{$profileField.id}" value="{text value=$profileField.value allowEmpty=true}" style="width:85%;" />
<input type="text" name="field_{$profileField.id}" value="{if isset($profileField.value)}{text value=$profileField.value allowEmpty=true}{/if}" style="width:85%;" />
{elseif $profileField.type==2}
<input type="checkbox" name="field_{$profileField.id}"{if $profileField.value} checked="checked"{/if} />
<input type="checkbox" name="field_{$profileField.id}"{if isset($profileField.value)} checked="checked"{/if} />
{elseif $profileField.type==4}
<select name="field_{$profileField.id}">
{foreach from=$profileField.extra item=item}
@ -112,10 +112,10 @@
<tr>
<td class="td1">{lng p="status"}:</td>
<td class="td2"><select name="gesperrt">
<option value="no"{if $user.gesperrt=='no'} selected="selected"{/if}>{lng p="active"}</option>
<option value="yes"{if $user.gesperrt=='yes'} selected="selected"{/if}>{lng p="locked"}</option>
<option value="locked"{if $user.gesperrt=='locked'} selected="selected"{/if}>{lng p="notactivated"}</option>
<option value="delete"{if $user.gesperrt=='delete'} selected="selected"{/if}>{lng p="deleted"}</option>
<option value="no"{if isset($user.gesperrt) && $user.gesperrt=='no'} selected="selected"{/if}>{lng p="active"}</option>
<option value="yes"{if isset($user.gesperrt) && $user.gesperrt=='yes'} selected="selected"{/if}>{lng p="locked"}</option>
<option value="locked"{if isset($user.gesperrt) && $user.gesperrt=='locked'} selected="selected"{/if}>{lng p="notactivated"}</option>
<option value="delete"{if isset($user.gesperrt) && $user.gesperrt=='delete'} selected="selected"{/if}>{lng p="deleted"}</option>
</select></td>
</tr>
<tr>
@ -127,7 +127,7 @@
<fieldset>
<legend>{lng p="notes"}</legend>
<textarea style="width:100%;height:80px;" name="notes">{text value=$user.notes allowEmpty=true}</textarea>
<textarea style="width:100%;height:80px;" name="notes">{if isset($user.notes)}{text value=$user.notes allowEmpty=true}{/if}</textarea>
</fieldset>
</td>
</tr>

View file

@ -1,6 +1,6 @@
<form method="post" action="users.php?do=edit&id={$user.id}&save=true&sid={$sid}" onsubmit="spin(this)">
{if $msg}
{if !empty($msg)}
<center style="margin:1em;">
<div class="note">
{$msg}
@ -29,25 +29,25 @@
</tr>
<tr>
<td class="td1">{lng p="firstname"}:</td>
<td class="td2"><input type="text" name="vorname" value="{text value=$user.vorname allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="vorname" value="{if isset($user.vorname)}{text value=$user.vorname allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="lastname"}:</td>
<td class="td2"><input type="text" name="nachname" value="{text value=$user.nachname allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="nachname" value="{if isset($user.nachname)}{text value=$user.nachname allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="company"}:</td>
<td class="td2"><input type="text" name="company" value="{text value=$user.company allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="company" value="{if isset($user.company)}{text value=$user.company allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="streetno"}:</td>
<td class="td2"><input type="text" name="strasse" value="{text value=$user.strasse allowEmpty=true}" style="width:55%;" />
<input type="text" name="hnr" value="{text value=$user.hnr allowEmpty=true}" style="width:15%;" /></td>
<td class="td2"><input type="text" name="strasse" value="{if isset($user.strasse)}{text value=$user.strasse allowEmpty=true}{/if}" style="width:55%;" />
<input type="text" name="hnr" value="{if isset($user.hnr)}{text value=$user.hnr allowEmpty=true}{/if}" style="width:15%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="zipcity"}:</td>
<td class="td2"><input type="text" name="plz" value="{text value=$user.plz allowEmpty=true}" style="width:20%;" />
<input type="text" name="ort" value="{text value=$user.ort allowEmpty=true}" style="width:50%;" /></td>
<td class="td2"><input type="text" name="plz" value="{if isset($user.plz)}{text value=$user.plz allowEmpty=true}{/if}" style="width:20%;" />
<input type="text" name="ort" value="{if isset($user.ort)}{text value=$user.ort allowEmpty=true}{/if}" style="width:50%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="country"}:</td>
@ -59,15 +59,15 @@
</tr>
<tr>
<td class="td1">{lng p="tel"}:</td>
<td class="td2"><input type="text" name="tel" value="{text value=$user.tel allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="tel" value="{if isset($user.tel)}{text value=$user.tel allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="fax"}:</td>
<td class="td2"><input type="text" name="fax" value="{text value=$user.fax allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="fax" value="{if isset($user.fax)}{text value=$user.fax allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="cellphone"}:</td>
<td class="td2"><input type="text" name="mail2sms_nummer" value="{text value=$user.mail2sms_nummer allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="mail2sms_nummer" value="{if isset($user.mail2sms_nummer)}{text value=$user.mail2sms_nummer allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="altmail"}:</td>
@ -75,7 +75,7 @@
</tr>
<tr>
<td class="td1">{lng p="taxid"}:</td>
<td class="td2"><input type="text" name="taxid" value="{text value=$user.taxid}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="taxid" value="{if isset($user.taxid)}{text value=$user.taxid}{/if}" style="width:85%;" /></td>
</tr>
{foreach from=$profileFields item=profileField}
@ -84,7 +84,7 @@
<td class="td1">{$profileField.title}:</td>
<td class="td2">
{if $profileField.type==1}
<input type="text" name="field_{$profileField.id}" value="{text value=$profileField.value allowEmpty=true}" style="width:85%;" />
<input type="text" name="field_{$profileField.id}" value="{if isset($profileField.value)}{text value=$profileField.value allowEmpty=true}{/if}" style="width:85%;" />
{elseif $profileField.type==2}
<input type="checkbox" name="field_{$profileField.id}"{if $profileField.value} checked="checked"{/if} />
{elseif $profileField.type==4}
@ -95,7 +95,7 @@
</select>
{elseif $profileField.type==8}
{foreach from=$profileField.extra item=item}
<input type="radio" id="field_{$profileField.id}_{$item}" name="field_{$profileField.id}" value="{text value=$item allowEmpty=true}"{if $profileField.value==$item} checked="checked"{/if} />
<input type="radio" id="field_{$profileField.id}_{$item}" name="field_{$profileField.id}" value="{if isset($item)}{text value=$item allowEmpty=true}{/if}"{if $profileField.value==$item} checked="checked"{/if} />
<label for="field_{$profileField.id}_{$item}"><b>{$item}</b></label> &nbsp;
{/foreach}
{elseif $profileField.type==32}
@ -270,8 +270,8 @@
<table width="100%">
<tr>
<td class="td1" width="160">{lng p="re"}/{lng p="fwd"}:</td>
<td class="td2"><input type="text" name="re" value="{text value=$user.re allowEmpty=true}" style="width:35%;" />
<input type="text" name="fwd" value="{text value=$user.fwd allowEmpty=true}" style="width:35%;" /></td>
<td class="td2"><input type="text" name="re" value="{if isset($user.re)}{text value=$user.re allowEmpty=true}{/if}" style="width:35%;" />
<input type="text" name="fwd" value="{if isset($user.fwd)}{text value=$user.fwd allowEmpty=true}{/if}" style="width:35%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="mail2sms"}:</td>
@ -300,11 +300,11 @@
</tr>
<tr>
<td class="td1">{lng p="dateformat"}:</td>
<td class="td2"><input type="text" name="datumsformat" value="{text value=$user.datumsformat allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="datumsformat" value="{if isset($user.datumsformat)}{text value=$user.datumsformat allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="sendername"}:</td>
<td class="td2"><input type="text" name="absendername" value="{text value=$user.absendername allowEmpty=true}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="absendername" value="{if isset($user.absendername)}{text value=$user.absendername allowEmpty=true}{/if}" style="width:85%;" /></td>
</tr>
</table>
</div>
@ -318,7 +318,7 @@
</div>
</fieldset>
<fieldset class="{if $showAliases}un{/if}collapsed">
<fieldset class="{if isset($showAliases)}un{/if}collapsed">
<legend><a href="javascript:;" onclick="toggleFieldset(this)">{lng p="aliases"}</a></legend>
<div class="content">
<table class="list">
@ -342,7 +342,7 @@
</div>
</fieldset>
<fieldset class="{if $showPayments}un{/if}collapsed">
<fieldset class="{if isset($showPayments)}un{/if}collapsed">
<legend><a href="javascript:;" onclick="toggleFieldset(this)">{lng p="payments"}</a> ({lng p="max"} 15)</legend>
<div class="content">
<table class="list">

View file

@ -4,9 +4,9 @@
<input type="hidden" name="sortOrder" id="sortOrder" value="{$sortOrder}" />
<input type="hidden" name="singleAction" id="singleAction" value="" />
<input type="hidden" name="singleID" id="singleID" value="" />
{if $queryString}<input type="hidden" name="query" id="query" value="{text value=$queryString}" />{/if}
{if !empty($queryString)}<input type="hidden" name="query" id="query" value="{text value=$queryString}" />{/if}
{if $searchQuery}
{if isset($searchQuery)}
<fieldset>
<legend>{lng p="search"}</legend>
@ -128,7 +128,7 @@
</td>
<td colspan="3" class="td2">
{foreach from=$fields item=field key=fieldID}
<input type="checkbox" name="field_{$fieldID}" id="field_{$fieldID}"{if $field.checked} checked="checked"{/if} />
<input type="checkbox" name="field_{$fieldID}" id="field_{$fieldID}"{if !empty($field.checked)} checked="checked"{/if} />
<label for="field_{$fieldID}"><b>{text value=$field.feld}</b></label><br />
{/foreach}
</td>

View file

@ -29,6 +29,9 @@
<label for="searchIn_telfaxmobile"><b>{lng p="tel"} / {lng p="fax"} / {lng p="cellphone"}</b></label></td>
</tr>
<tr>
<td><input type="checkbox" name="searchIn[absendername]" id="searchIn_absendername" checked="checked" />
<label for="searchIn_absendername"><b>{lng p="sendername"}</b></label>
</td>
<td><input type="checkbox" id="searchIn_all" checked="checked" onchange="invertSelection(document.forms.f1,'searchIn',true,this.checked)" />
<label for="searchIn_all"><b>{lng p="all"}</b></label></td>
<td colspan="2">&nbsp;</td>

View file

@ -4,7 +4,7 @@
<input type="hidden" name="sortOrder" id="sortOrder" value="{$sortOrder}" />
<input type="hidden" name="singleAction" id="singleAction" value="" />
<input type="hidden" name="singleID" id="singleID" value="" />
{if $queryString}<input type="hidden" name="query" id="query" value="{text value=$queryString}" />{/if}
{if !empty($queryString)}<input type="hidden" name="query" id="query" value="{text value=$queryString}" />{/if}
<fieldset>
<legend>{lng p="transactions"} ({email value=$user.email}, #{$user.id})</legend>

View file

@ -135,7 +135,7 @@
<tr>
<td width="20" valign="top"><img src="{$tpldir}images/{$notice.type}.png" width="16" height="16" border="0" alt="" align="absmiddle" /></td>
<td valign="top">{$notice.text}</td>
<td align="right" valign="top" width="20">{if $notice.link}<a href="{$notice.link}sid={$sid}"><img src="{$tpldir}images/go.png" border="0" alt="" width="16" height="16" /></a>{else}&nbsp;{/if}</td>
<td align="right" valign="top" width="20">{if isset($notice.link)}<a href="{$notice.link}sid={$sid}"><img src="{$tpldir}images/go.png" border="0" alt="" width="16" height="16" /></a>{else}&nbsp;{/if}</td>
</tr>
{/foreach}
</table>

View file

@ -6,7 +6,7 @@
<tr>
<td width="40" valign="top" rowspan="2"><img src="{$tpldir}images/workgroup_mail32.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="130">{lng p="title"}:</td>
<td class="td2"><input type="text" name="titel" value="{text value=$folder.titel}" style="width:85%;" /></td>
<td class="td2"><input type="text" name="titel" value="{if isset($folder.titel)}{text value=$folder.titel}{/if}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="itemsperpage"}:</td>

View file

@ -277,7 +277,7 @@ if($_REQUEST['action'] == 'users')
// do the query!
$users = array();
$res = $db->Query('SELECT id,email,vorname,nachname,strasse,hnr,plz,ort,gruppe,gesperrt,lastlogin,profilfelder ' . $theQuery . ' '
$res = $db->Query('SELECT id,email,vorname,nachname,strasse,hnr,plz,ort,gruppe,gesperrt,lastlogin,profilfelder,absendername ' . $theQuery . ' '
. 'ORDER BY ' . $sortBy . ' '
. $sortOrder . ' '
. 'LIMIT ' . $startPos . ',' . $perPage);
@ -903,6 +903,8 @@ else if($_REQUEST['action'] == 'search')
$fields = array_merge($fields, array('strasse', 'hnr', 'plz', 'ort', 'land'));
else if($field == 'telfaxmobile')
$fields = array_merge($fields, array('tel', 'fax', 'mail2sms_nummer'));
else if($field == 'absendername')
$fields[] = 'absendername';
}
// build query string

View file

@ -189,11 +189,6 @@ if($_REQUEST['action'] == 'welcome')
else if(!is_writeable(B1GMAIL_DATA_DIR))
$notices[] = array('type' => 'error',
'text' => sprintf($lang_admin['dataperms'], B1GMAIL_DATA_DIR));
// struct storage?
if($bm_prefs['structstorage'] == 'yes' && ini_get('safe_mode'))
$notices[] = array('type' => 'error',
'text' => $lang_admin['structsafewarn'],
'link' => 'prefs.common.php?');
// dynamic recipient detection but no receive rules
if($bm_prefs['recipient_detection'] == 'dynamic')
@ -291,7 +286,7 @@ if($_REQUEST['action'] == 'welcome')
'link' => 'prefs.common.php?');
// struct storage recommended?
if($bm_prefs['structstorage'] == 'no' && !ini_get('safe_mode'))
if($bm_prefs['structstorage'] == 'no')
$notices[] = array('type' => 'info',
'text' => $lang_admin['structrec'],
'link' => 'prefs.common.php?');

View file

@ -41,7 +41,7 @@ if(isset($_COOKIE['bm_language'])
}
}
include('./serverlib/init.inc.php');
require './serverlib/init.inc.php';
if(isset($_REQUEST['sid']) && trim($_REQUEST['sid']) != '')
RequestPrivileges(PRIVILEGES_USER, true) || RequestPrivileges(PRIVILEGES_ADMIN, true);

View file

@ -1,5 +1,196 @@
CKEditor 4 Changelog
====================
⚠️️️ **CKEditor 4 (the open source edition) is no longer maintained.** ⚠️
If you would like to keep access to future CKEditor 4 security patches, check the [Extended Support Model](https://ckeditor.com/ckeditor-4-support/), which guarantees **security updates and critical bug fixes until December 2026**. Alternatively, [upgrade to CKEditor 5](https://ckeditor.com/docs/ckeditor5/latest/updating/ckeditor4/migration-from-ckeditor-4.html).
## CKEditor 4.22.0 / 4.22.1
⚠️ This is the last open source release of CKEditor 4. As announced in 2018, CKEditor 4 has reached its End of Life in June 2023.
New Features:
* [#5316](https://github.com/ckeditor/ckeditor4/issues/5316): Added vertical margins support for list elements in the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
* [#5410](https://github.com/ckeditor/ckeditor4/issues/5410): Added the ability to indicate the language of styles in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin via the [`config.styleSet`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-stylesSet) configuration option.
* [#5510](https://github.com/ckeditor/ckeditor4/issues/5510): Added notification system to the editor informing users that the editor version is up-to-date and secure. See [`config.versionCheck`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-versionCheck) configuration option to learn more.
Fixed Issues:
* [#5437](https://github.com/ckeditor/ckeditor4/issues/5437): Fixed: Incorrect indication of selected items in combo boxes. The selected item was unmarked upon each opening of the combo box.
* [#5495](https://github.com/ckeditor/ckeditor4/issues/5495): Fixed: Insufficient color ratio for links inside [Notifications](https://ckeditor.com/cke4/addon/notification).
Other Changes:
* [#5412](https://github.com/ckeditor/ckeditor4/issues/5412): Prevent using `document.domain` in Firefox in the [Preview](https://ckeditor.com/cke4/addon/preview) plugin.
Note: CKEditor 4.22.1 has been released immediately after 4.22.0 to fix the README issues on [npm](https://www.npmjs.com/) and contains no changes vs 4.22.0.
## CKEditor 4.21.0
**Security Updates:**
A cross-site scripting vulnerability has been discovered affecting [Iframe Dialog](https://ckeditor.com/cke4/addon/iframe) and [Media Embed](https://ckeditor.com/cke4/addon/embed) plugins.
This vulnerability might affect a small percentage of integrators that depend on dynamic editor initialization/destroy mechanism. See [GitHub advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-vh5c-xwqv-cv9g) for more details.
**Potential breaking changes**
In some rare cases, a security release may introduce a breaking change to your application. We have provided configuration options that will help you mitigate any potential issues with the upgrade:
- Starting from version 4.21, the [Iframe Dialog](https://ckeditor.com/cke4/addon/iframe) plugin applies the `sandbox` attribute by default, which restricts JavaScript code execution in the iframe element. To change this behavior, configure the [`config.iframe_attributes`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-iframe_attributes) option.
- Starting from version 4.21, the [Media Embed](https://ckeditor.com/cke4/addon/embed) plugin regenerates the entire content of the embed widget by default. To change this behavior, configure the [`config.embed_keepOriginalContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-embed_keepOriginalContent) option.
If you choose to change either of the above options, make sure to properly configure [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to avoid any potential security issues that may arise from embedding iframe elements on your web page.
You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions.
**An upgrade is highly recommended!**
New Features:
* [#4400](https://github.com/ckeditor/ckeditor4/issues/4400): Added the [`config.uploadImage_supportedTypes`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-uploadImage_supportedTypes) configuration option allowing to change the image formats accepted by the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin. Thanks to [SilverYoCha](https://github.com/SilverYoCha)!
Fixed Issues:
* [#5431](https://github.com/ckeditor/ckeditor4/issues/5431): Fixed: No notification is shown when pasting or dropping unsupported image types into the editor.
## CKEditor 4.20.2
Fixed Issues:
* [#439](https://github.com/ckeditor/ckeditor4/issues/439): Fixed: Incorrect <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> navigation for radio buttons inside the dialog.
* [#4829](https://github.com/ckeditor/ckeditor4/issues/4829): Fixed: Undo reversed entire table content instead of a single cell. Thanks to that fix, multiple changes in a table can be undone one by one.
* [#5396](https://github.com/ckeditor/ckeditor4/issues/5396): Fixed: Event listeners for `popstate` and `hashchange` events on the `window`, added by the [Maximize](https://ckeditor.com/cke4/addon/maximize) plugin, were not removed when destroying the editor instance.
* [#5414](https://github.com/ckeditor/ckeditor4/issues/5414): Fixed: File and image uploaders based on the [Upload Widget plugin](https://ckeditor.com/cke4/addon/uploadwidget) and [Easy Image plugin ](https://ckeditor.com/cke4/addon/easyimage) didn't fire the [`change` event](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) upon finishing upload, resulting in passing incorrect data in form controls for integration frameworks, like [Reactive forms in Angular](https://angular.io/guide/reactive-forms).
* [#698](https://github.com/ckeditor/ckeditor4/issues/698): Fixed: An error was thrown after applying formatting to the widget with inline editable and switching to the source mode. Thanks to [Glen](https://github.com/glen-84)!
API changes:
* [#3540](https://github.com/ckeditor/ckeditor4/issues/3540): The [startup data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html) passed to the widget's command is now used to also populate the widget's template.
* [#5352](https://github.com/ckeditor/ckeditor4/issues/5352): Added the [`colorButton_contentsCss`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_contentsCss) configuration option allowing to add custom CSS to the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) menu content. Thanks to [mihilion](https://github.com/mihilion)!
## CKEditor 4.20.1
Fixed Issues:
* [#5333](https://github.com/ckeditor/ckeditor4/issues/5333): Fixed: The original name of the uploaded image is not preserved by the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin if the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin has enabled image handling.
* [#2881](https://github.com/ckeditor/ckeditor4/issues/2881): Fixed: Changing table headers from "Both" to "First column" in the [Table](https://ckeditor.com/cke4/addon/table) dialog does not change the first column cell correctly.
* [#2996](https://github.com/ckeditor/ckeditor4/issues/2996): Fixed: Table header "scope" attribute is incorrect for the "Headers: both" option in the [Table](https://ckeditor.com/cke4/addon/table) dialog.
* [#4802](https://github.com/ckeditor/ckeditor4/issues/4802): Fixed: [Tableselection](https://ckeditor.com/cke4/addon/tableselection) caret moves to the previous cell after tabbing into the next cell and then removing its content.
* [#5365](https://github.com/ckeditor/ckeditor4/issues/5365): Fixed: The value of the [`config.baseFloatZIndex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-baseFloatZIndex) config variable is incorrectly applied to parent dialog when the child dialog is closed resulting in the dialog overlay covering up the dialog. Thanks to [JenoDK](https://github.com/JenoDK)!
* [#5305](https://github.com/ckeditor/ckeditor4/issues/5305): Fixed: Anchor name can invalidly include spaces.
## CKEditor 4.20
New Features:
* [#5084](https://github.com/ckeditor/ckeditor4/issues/5084): Added the [`config.tabletools_scopedHeaders`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-tabletools_scopedHeaders) configuration option controlling the behaviour of table headers with and without the `[scope]` attribute.
* [#5219](https://github.com/ckeditor/ckeditor4/issues/5219): Added the [`config.image2_defaultLockRatio`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-image2_defaultLockRatio) configuration option allowing to set the default value of the "Lock ratio" option in the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) dialog.
* [#2008](https://github.com/ckeditor/ckeditor-dev/pull/2008): Extended the [Mentions](https://ckeditor.com/cke4/addon/mentions) and [Emoji](https://ckeditor.com/cke4/addon/emoji) plugins with a feature option that adds a space after an accepted autocompletion match. See:
* [`configDefinition.followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_mentions_configDefinition.html#property-followingSpace) option for the mentions plugin, and
* [`config.emoji_followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-emoji_followingSpace) option for the emoji plugin.
* [#5215](https://github.com/ckeditor/ckeditor4/issues/5215): Added the [`config.coreStyles_toggleSubSup`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-coreStyles_toggleSubSup) configuration option which disallows setting the subscript and superscript on the same element simultaneously using UI buttons. This option is turned off by default.
Fixed Issues:
* [#4889](https://github.com/ckeditor/ckeditor4/issues/4889): Fixed: Incorrect position of the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) cursor after scrolling the editor horizontally.
* [#5319](https://github.com/ckeditor/ckeditor4/issues/5319): Fixed: [Autolink](https://ckeditor.com/cke4/addon/autolink) [`config.autolink_urlRegex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autolink_urlRegex) option produced invalid links when configured directly using the editor instance config. Thanks to [Aigars Zeiza](https://github.com/Zuzon)!
* [#4941](https://github.com/ckeditor/ckeditor4/issues/4941): Fixed: Some entities got wrongly encoded when using [`entities_processNumerical = true`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-entities_processNumerical) configuration option.
* [#4931](https://github.com/ckeditor/ckeditor4/issues/4931): Fixed: Selecting the whole editor content when there is only a list with an empty element at the end inside and deleting it did not delete all list items.
API changes:
* [#5122](https://github.com/ckeditor/ckeditor4/issues/5122): Added the ability to provide a list of buttons as an array to the [`config.removeButtons`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removeButtons) config variable.
* [#2008](https://github.com/ckeditor/ckeditor-dev/pull/2008): Added [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) [`followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_autocomplete_configDefinition.html#property-followingSpace) option that finishes an accepted match with a space.
## CKEditor 4.19.1
Fixed Issues:
* [#5125](https://github.com/ckeditor/ckeditor4/issues/5125): Fixed: Deleting a widget with disabled [autoParagraph](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autoParagraph) by the keyboard `backspace` key removes the editor editable area and crashes the editor.
* [#5135](https://github.com/ckeditor/ckeditor4/issues/5135): Fixed: The [`checkbox.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_checkbox.html#method-setValue) and [`radio.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_radio.html#method-setValue) methods are not chainable as stated in the documentation. Thanks to [Jordan Bradford](https://github.com/LordPachelbel)!
* [#5085](https://github.com/ckeditor/ckeditor4/issues/5085): Fixed: The [Language](https://ckeditor.com/cke4/addon/language) plugin removes the element marking the text in foreign language if said element does not have an information about the text direction.
* [#4284](https://github.com/ckeditor/ckeditor4/issues/4284): Fixed: [Tableselection](https://ckeditor.com/cke4/addon/tableselection) Merging cells with a rowspan throws an unexpected error and does not create an undo step.
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/wysiwygarea) plugin degrades typing performance.
* [#5158](https://github.com/ckeditor/ckeditor4/issues/5158): Fixed: [`CKEDITOR.tools#convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) gives invalid results if the helper calculator element was deleted from the DOM.
* [#5234](https://github.com/ckeditor/ckeditor4/issues/5234): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) doesn't allow to upload images files using toolbar button.
* [#438](https://github.com/ckeditor/ckeditor4/issues/438): Fixed: It is impossible to navigate to the [elementspath](https://ckeditor.com/cke4/addon/elementspath) from the [toolbar](https://ckeditor.com/cke4/addon/toolbar) by keyboard and vice versa.
* [#4449](https://github.com/ckeditor/ckeditor4/issues/4449): Fixed: [`dialog.validate#functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) incorrectly composes functions that return an optional error message, like e.g. [`dialog.validate.number`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-number) due to unnecessary return type coercion.
* [#4473](https://github.com/ckeditor/ckeditor4/issues/4473): Fixed: The [dialog.validate](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html) method does not accept parameter value. The issue originated in [dialog.validate.functions](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) method that did not properly propagate parameter value to validator. Affected validators:
* [`functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions)
* [`equals`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-equals)
* [`notEqual`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-notEqual)
* [`cssLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-cssLength)
* [`htmlLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-htmlLength)
* [`inlineStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-inlineStyle)
* [#5147](https://github.com/ckeditor/ckeditor4/issues/5147): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog does not contain info about focus being moved back to the editing area upon leaving dialogs.
* [#5144](https://github.com/ckeditor/ckeditor4/issues/5144): Fixed: [Menu buttons](https://ckeditor.com/cke4/addon/menubutton) and [panel buttons](https://ckeditor.com/cke4/addon/panelbutton) incorrectly indicate the open status of their associated pop-up menus in the browser's accessibility tree.
* [#5022](https://github.com/ckeditor/ckeditor4/issues/5022): Fixed: [Find and Replace](https://ckeditor.com/cke4/addon/find) does not respond to the `Enter` key.
API changes:
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`config.editorplaceholder_delay`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-editorplaceholder_delay) configuration option allowing to delay placeholder before it is toggled when changing editor content.
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`CKEDITOR.tools#debounce()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-debounce) function allowing to postpone a passed function execution until the given milliseconds have elapsed since the last time it was invoked.
## CKEditor 4.19.0
New features:
* [#2444](https://github.com/ckeditor/ckeditor4/issues/2444): Togglable toolbar buttons are now exposed as toggle buttons in the browser's accessibility tree.
* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): Added an option allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature as a function handle for editor creators ([`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo)).
* [#4986](https://github.com/ckeditor/ckeditor4/issues/4986): Added [`config.shiftLineBreaks`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-shiftLineBreaks) allowing to preserve inline elements formatting when the `shift`+`enter` keystroke is used.
* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) configuration option allowing to customize or disable the editor's application region label. This option, combined with [`config.title`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-title), gives much better control over the editor's labels read by screen readers.
Fixed Issues:
* [#4543](https://github.com/ckeditor/ckeditor4/issues/4543): Fixed: Toolbar buttons toggle state is not correctly announced by screen readers lacking the information whether the feature is on or off.
* [#4052](https://github.com/ckeditor/ckeditor4/issues/4052): Fixed: Editor labels are read incorrectly by screen readers due to invalid editor control type for the [Iframe Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) editors.
* [#1904](https://github.com/ckeditor/ckeditor4/issues/1904): Fixed: Screen readers are not announcing the read-only editor state.
* [#4904](https://github.com/ckeditor/ckeditor4/issues/4904): Fixed: Table cell selection and navigation with the `tab` key behavior is inconsistent after adding a new row.
* [#3394](https://github.com/ckeditor/ckeditor4/issues/3394): Fixed: [Enhanced image](https://ckeditor.com/cke4/addon/image2) plugin dialog is not supporting URL with query string parameters. Thanks to [Simon Urli](https://github.com/surli)!
* [#5049](https://github.com/ckeditor/ckeditor4/issues/5049): Fixed: The editor fails in strict mode due to not following the `use strict` directives in a core editor module.
* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Fixed: The [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin shows notification about unsupported file format when the file type is different than `jpg`, `gif`, `png`, not respecting [supported types](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-supportedTypes) by the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) plugin.
* [#4855](https://github.com/ckeditor/ckeditor4/issues/4855): [iOS] Fixed: Focusing toolbar buttons with an enabled VoiceOver screen reader moves the browser focus into an editable area and interrupts button functionality.
API changes:
* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): The [`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo) functions are now returning a handle function allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature.
* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Added the [CKEDITOR.plugins.clipboard.addFileMatcher](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard.html#method-addFileMatcher) function allowing to define file formats supported by the [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. Trying to paste unsupported files will result in a notification that a file cannot be dropped or pasted into the editor.
* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) alongside [`CKEDITOR.editor#applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-applicationTitle) to allow customizing editor's application region label.
## CKEditor 4.18.0
**Security Updates:**
* Fixed an XSS vulnerability in the core module reported by GitHub Security Lab team member [Kevin Backhouse](https://github.com/kevinbackhouse).
Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing a JavaScript code. See [CVE-2022-24728](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-4fc4-4p5g-6w89) for more details.
* Fixed a Regular expression Denial of Service (ReDoS) vulnerability in dialog plugin discovered by the CKEditor 4 team during our regular security audit.
Issue summary: The vulnerability allowed to abuse a dialog input validator regular expression, which could cause a significant performance drop resulting in a browser tab freeze. See [CVE-2022-24729](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-f6rf-9m92-x2hh) for more details.
You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions.
**An upgrade is highly recommended!**
**Highlights:**
[Web Spell Checker](https://webspellchecker.com/) ended support for WebSpellChecker Dialog on December 31st, 2021. This means the plugin is not supported any longer. Therefore, we decided to deprecate and remove the WebSpellChecker Dialog plugin from CKEditor 4 presets.
We strongly encourage everyone to choose one of the other available spellchecking solutions - [Spell Check As You Type (SCAYT)](https://ckeditor.com/cke4/addon/scayt) or [WProofreader](https://ckeditor.com/cke4/addon/wproofreader).
Fixed issues:
* [#5097](https://github.com/ckeditor/ckeditor4/issues/5097): [Chrome] Fixed: Incorrect conversion of points to pixels while using [`CKEDITOR.tools.convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx).
* [#5044](https://github.com/ckeditor/ckeditor4/issues/5044): Fixed: `select` elements with `multiple` attribute had incorrect styling. Thanks to [John R. D'Orazio](https://github.com/JohnRDOrazio)!
Other changes:
* [#5093](https://github.com/ckeditor/ckeditor4/issues/5093): Deprecated and removed WebSpellChecker Dialog from presets.
* [#5127](https://github.com/ckeditor/ckeditor4/issues/5127): Deprecated the [`CKEDITOR.rnd`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-rnd) property to discourage using it in a security-sensitive context.
* [#5087](https://github.com/ckeditor/ckeditor4/issues/5087): Improved the jQuery adapter by replacing a deprecated jQuery API with existing counterparts. Thanks to [Fran Boon](https://github.com/flavour)!
* [#5128](https://github.com/ckeditor/ckeditor4/issues/5128): Improved the [Emoji](https://ckeditor.com/cke4/addon/emoji) definitions encoding set by the [`config.emoji_emojiListUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-emoji_emojiListUrl) configuration option.
## CKEditor 4.17.2
@ -44,11 +235,11 @@ Fixed issues:
* Fixed XSS vulnerability in the core module reported by [William Bowling](https://github.com/wbowling).
Issue summary: The vulnerability allowed to inject malformed comments HTML bypassing content sanitization, which could result in executing JavaScript code. See [security advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7h26-63m7-qhf2) for more details.
Issue summary: The vulnerability allowed to inject malformed comments HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41165](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7h26-63m7-qhf2) for more details.
* Fixed XSS vulnerability in the core module reported by [Maurice Dauer](https://twitter.com/laytonctf).
Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing JavaScript code. See [security advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-pvmx-g8h5-cprj) for more details.
Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41164](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-pvmx-g8h5-cprj) for more details.
You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions.
@ -110,15 +301,15 @@ Other Changes:
* Fixed XSS vulnerability in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin reported by [Anton Subbotin](https://github.com/skavans).
Issue summary: The vulnerability allowed to abuse paste functionality using malformed HTML, which could result in injecting arbitrary HTML into the editor. See [security advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7889-rm5j-hpgg) for more details.
Issue summary: The vulnerability allowed to abuse paste functionality using malformed HTML, which could result in injecting arbitrary HTML into the editor. See [CVE-2021-32809](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7889-rm5j-hpgg) for more details.
* Fixed XSS vulnerability in the [Widget](https://ckeditor.com/cke4/addon/widget) plugin reported by [Anton Subbotin](https://github.com/skavans).
Issue summary: The vulnerability allowed to abuse undo functionality using malformed [Widget](https://ckeditor.com/cke4/addon/widget) HTML, which could result in executing JavaScript code. See [security advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-6226-h7ff-ch6c) for more details.
Issue summary: The vulnerability allowed to abuse undo functionality using malformed [Widget](https://ckeditor.com/cke4/addon/widget) HTML, which could result in executing JavaScript code. See [CVE-2021-32808](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-6226-h7ff-ch6c) for more details.
* Fixed XSS vulnerability in the [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) plugin reported by [Mika Kulmala](https://github.com/kulmik).
Issue summary: The vulnerability allowed to inject malformed [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) HTML, which could result in executing JavaScript code. See [security advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-m94c-37g6-cjhc) for more details.
Issue summary: The vulnerability allowed to inject malformed [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) HTML, which could result in executing JavaScript code. See [CVE-2021-37695](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-m94c-37g6-cjhc) for more details.
You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions.

View file

@ -1,8 +1,16 @@
Software License Agreement
==========================
Software License Agreement for CKEditor 4 LTS (4.23.0 and above)
================================================================
CKEditor - The text editor for Internet - https://ckeditor.com/
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
CKEditor - The text editor for Internet - https://ckeditor.com/ <br>
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
CKEditor 4 LTS ("Long Term Support") is available under exclusive terms of the [Extended Support Model](https://ckeditor.com/ckeditor-4-support/). [Contact us](https://ckeditor.com/contact/) to obtain a commercial license.
Software License Agreement for CKEditor 4.22.* and below
========================================================
CKEditor - The text editor for Internet - https://ckeditor.com/ <br>
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
Licensed under the terms of any of the following licenses at your
choice:
@ -37,7 +45,7 @@ done by developers outside of CKSource with their express permission.
The following libraries are included in CKEditor under the MIT license (see Appendix D):
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2022, CKSource Holding sp. z o.o.
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2023, CKSource Holding sp. z o.o.
* PicoModal (included in `samples/js/sf.js`) - Copyright (c) 2012 James Frasca.
* CodeMirror (included in the samples) - Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others.
* ES6Promise - Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors.

View file

@ -1,10 +1,10 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},
ckeditor:function(g,e){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g)){var m=e;e=g;g=m}var k=[];e=e||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function d(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(d,100)},0)},null,null,9999);
else{if(e.autoUpdateElement||"undefined"==typeof e.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)e.autoUpdateElementJquery=!0;e.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,e):CKEDITOR.inline(h,e);b.data("ckeditorInstance",c);c.on("instanceReady",function(e){var d=e.editor;setTimeout(function n(){if(d.element){e.removeListener();d.on("dataReady",function(){b.trigger("dataReady.ckeditor",[d])});d.on("setData",function(a){b.trigger("setData.ckeditor",
[d,a.data])});d.on("getData",function(a){b.trigger("getData.ckeditor",[d,a.data])},999);d.on("destroy",function(){b.trigger("destroy.ckeditor",[d])});d.on("save",function(){a(h.form).submit();return!1},null,null,20);if(d.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){d.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",
ckeditor:function(g,e){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if("function"!==typeof g){var m=e;e=g;g=m}var k=[];e=e||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function d(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(d,100)},0)},null,null,
9999);else{if(e.autoUpdateElement||"undefined"==typeof e.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)e.autoUpdateElementJquery=!0;e.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,e):CKEDITOR.inline(h,e);b.data("ckeditorInstance",c);c.on("instanceReady",function(e){var d=e.editor;setTimeout(function n(){if(d.element){e.removeListener();d.on("dataReady",function(){b.trigger("dataReady.ckeditor",[d])});d.on("setData",function(a){b.trigger("setData.ckeditor",
[d,a.data])});d.on("getData",function(a){b.trigger("getData.ckeditor",[d,a.data])},999);d.on("destroy",function(){b.trigger("destroy.ckeditor",[d])});d.on("save",function(){a(h.form).trigger("submit");return!1},null,null,20);if(d.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){d.updateElement()})};a(h.form).on("submit",c);a(h.form).on("form-pre-serialize",c);b.on("destroy.ckeditor",function(){a(h.form).off("submit",c);a(h.form).off("form-pre-serialize",
c)})}d.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[d]);g&&g.apply(d,[h]);l.resolve()}else setTimeout(n,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,k).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(e){if(arguments.length){var m=
this,k=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(e,function(){f.resolve()});k.push(f.promise());return!0}return g.call(b,e)});if(k.length){var b=new a.Deferred;a.when.apply(this,k).done(function(){b.resolveWith(m)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}}))})(window.jQuery);

View file

@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license/
*/
@ -13,10 +13,10 @@
* (1) https://ckeditor.com/cke4/builder
* Visit online builder to build CKEditor from scratch.
*
* (2) https://ckeditor.com/cke4/builder/948bf8010ca183a767f6c0815b9aa51f
* (2) https://ckeditor.com/cke4/builder/50e66534ec806d58dee47b4bbf047e2f
* Visit online builder to build CKEditor, starting with the same setup as before.
*
* (3) https://ckeditor.com/cke4/builder/download/948bf8010ca183a767f6c0815b9aa51f
* (3) https://ckeditor.com/cke4/builder/download/50e66534ec806d58dee47b4bbf047e2f
* Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.
*
* NOTE:

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
*/

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("paste",function(c){function k(a){var b=new CKEDITOR.dom.document(a.document),g=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();g.setAttribute("contenteditable",!0);g.on(e.mainPasteEvent,function(a){a=e.initPasteDataTransfer(a);f?a!=f&&(f=e.initPasteDataTransfer()):f=a});if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){a=a.data;var b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+

View file

@ -1,4 +1,4 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,8 +1,9 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("anchor",function(c){function f(b,a){return b.createFakeElement(b.document.createElement("a",{attributes:a}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,getModel:function(b){var a=b.getSelection();b=a.getRanges()[0];a=a.getSelectedElement();b.shrink(CKEDITOR.SHRINK_ELEMENT);(a=b.getEnclosedNode())&&a.type===CKEDITOR.NODE_TEXT&&(a=a.getParent());a&&!a.is("a")&&(a=a.getAscendant("a")||a);b=a&&a.type===CKEDITOR.NODE_ELEMENT&&("anchor"===
a.data("cke-real-element-type")||a.is("a"))?a:void 0;return b||null},onOk:function(){var b=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),b={id:b,name:b,"data-cke-saved-name":b},a=this.getModel(c);if(a)a.data("cke-realelement")?(b=f(c,b),b.replace(a),CKEDITOR.env.ie&&c.getSelection().selectElement(b)):a.setAttributes(b);else if(a=(a=c.getSelection())&&a.getRanges()[0],a.collapsed)b=f(c,b),a.insertNode(b);else{CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(b["class"]="cke_anchor");var d=a.clone();
d.enlarge(CKEDITOR.ENLARGE_ELEMENT);for(var e=new CKEDITOR.dom.walker(d),d=d.collapsed?d.startContainer:e.next(),g=a.createBookmark();d;)d.type===CKEDITOR.NODE_ELEMENT&&d.getAttribute("data-cke-saved-name")&&(d.remove(!0),e.reset()),d=e.next();a.moveToBookmark(g);b=new CKEDITOR.style({element:"a",attributes:b});b.type=CKEDITOR.STYLE_INLINE;b.applyToRange(a)}},onShow:function(){var b=c.getSelection(),a=this.getModel(c),d=a&&a.data("cke-realelement");if(a=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,
a):CKEDITOR.plugins.link.getSelectedLink(c)){var e=a.data("cke-saved-name");this.setValueOf("info","txtName",e||"");!d&&b.selectElement(a)}this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return this.getValue()?!0:(alert(c.lang.link.anchor.errorName),!1)}}]}]}});
a):CKEDITOR.plugins.link.getSelectedLink(c)){var e=a.data("cke-saved-name");this.setValueOf("info","txtName",e||"");!d&&b.selectElement(a)}this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){var b=this.getValue();return b?/[\u0020\u0009\u000a\u000c\u000d]/g.test(b)?(alert(c.lang.link.anchor.errorWhitespace),!1):!0:(alert(c.lang.link.anchor.errorName),
!1)}}]}]}});

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
(function(){function u(){var c=this.getDialog(),p=c._.editor,n=p.config.linkPhoneRegExp,q=p.config.linkPhoneMsg,p=CKEDITOR.dialog.validate.notEmpty(p.lang.link.noTel).apply(this);if(!c.getContentElement("info","linkType")||"tel"!=c.getValueOf("info","linkType"))return!0;if(!0!==p)return p;if(n)return CKEDITOR.dialog.validate.regex(n,q).call(this)}CKEDITOR.dialog.add("link",function(c){function p(a,b){var c=a.createRange();c.setStartBefore(b);c.setEndAfter(b);return c}var n=CKEDITOR.plugins.link,q,

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("smiley",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,k,m=function(l){var c=l.data.getTarget(),b=c.getName();if("a"==b)c=c.getChild(0);else if("img"!=b)return;var b=c.getAttribute("cke_src"),a=c.getAttribute("title"),c=f.document.createElement("img",{attributes:{src:b,"data-cke-saved-src":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);k.hide();l.data.preventDefault()},q=CKEDITOR.tools.addFunction(function(a,c){a=

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("sourcedialog",function(a){var b=CKEDITOR.document.getWindow().getViewPaneSize(),e=Math.min(b.width-70,800),b=b.height/1.5,d;return{title:a.lang.sourcedialog.title,minWidth:100,minHeight:100,onShow:function(){this.setValueOf("main","data",d=a.getData())},onOk:function(){function b(f,c){a.focus();a.setData(c,function(){f.hide();var b=a.createRange();b.moveToElementEditStart(a.editable());b.select()})}return function(){var a=this.getValueOf("main","data").replace(/\r/g,""),c=this;

View file

@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
@media (max-width: 900px) {

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -118,7 +118,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor &ndash; The text editor for the Internet &ndash; <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p class="grid-width-100" id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</footer>

View file

@ -1,5 +1,5 @@
/**
* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
var SF=function(){function d(a){return(a=a.attributes?a.attributes.getNamedItem("class"):null)?a.value.split(" "):[]}function c(a){var e=document.createAttribute("class");e.value=a.join(" ");return e}var b={attachListener:function(a,e,b){if(a.addEventListener)a.addEventListener(e,b,!1);else if(a.attachEvent)a.attachEvent("on"+e,function(){b.apply(a,arguments)});else throw Error("Could not attach event.");}};b.indexOf=function(){var a=Array.prototype.indexOf;return"function"===a?function(e,b){return a.call(e,

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -78,7 +78,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -203,7 +203,7 @@ Second line of text preceded by two line breaks.</textarea>
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -52,7 +52,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*
* Styles used by the XHTML 1.1 sample page (xhtml.html).

View file

@ -1,7 +1,7 @@
<!DOCTYPE html>
<?php
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
?>
@ -53,7 +53,7 @@ if (!empty($_POST))
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",az:"Azerbaijani",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German","de-ch":"German (Switzerland)",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish","es-mx":"Spanish (Mexico)",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -501,7 +501,7 @@ CKEDITOR.replace( 'editor7', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,5 +1,5 @@
/**
* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -183,7 +183,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -137,7 +137,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -99,7 +99,7 @@ CKEDITOR.replace( '<em>textarea_id</em>', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -119,7 +119,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -307,7 +307,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -117,7 +117,7 @@ var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -106,7 +106,7 @@ var editor = CKEDITOR.inline( 'article-body' );
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -96,7 +96,7 @@ $( document ).ready( function() {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -69,7 +69,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -53,7 +53,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -52,7 +52,7 @@ CKEDITOR.replace( '<em>textarea_id</em>' )
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

View file

@ -1,5 +1,5 @@
/**
* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

View file

@ -9,7 +9,7 @@
To save the content created with CKEditor you need to read the POST data on the server
side and write it to a file or the database.
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-------------------------------------------------------------------------------------------

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -114,7 +114,7 @@ CKEDITOR.replace( 'textarea_id', {
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -71,7 +71,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -228,7 +228,7 @@ CKEDITOR.replace( <em>'textarea_id'</em>, {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -65,7 +65,7 @@ CKEDITOR.replace( '<em>textarea_id</em>', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -115,7 +115,7 @@ CKEDITOR.replace( '<em>textarea_id</em>', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -73,7 +73,7 @@ CKEDITOR.replace( '<em>textarea_id</em>', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<html lang="en">
@ -227,7 +227,7 @@ CKEDITOR.replace( '<em>textarea_id</em>', {
CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
-->
<!--[if IE 8]><html class="ie8"><![endif]-->
@ -137,7 +137,7 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
CKEditor &ndash; The text editor for the Internet &ndash; <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
</p>
<p class="grid-width-100" id="copy">
Copyright &copy; 2003-2022, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
Copyright &copy; 2003-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</footer>

File diff suppressed because one or more lines are too long

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