Compare commits

..

110 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
Sebijk
297ed98f6d fix empty url 2022-03-10 17:09:30 +01:00
Sebijk
a79044e80c edit alias and login with alias setting 2022-03-08 23:45:01 +01:00
Sebijk
d3537daf8a make organizer optional 2022-03-08 23:44:06 +01:00
Sebijk
086a30e39c fix mobile deref.php 2022-03-07 23:46:43 +01:00
Sebijk
55461948c5 fix wrong path 2022-03-07 17:07:45 +01:00
Sebijk
77a94e5b05 fix format plz 2022-03-07 03:11:04 +01:00
Sebijk
8956ce08b4 update plz db
added (source https://www.suche-postleitzahl.org/downloads )
01561 Großenhain, Ebersbach u.a.
01594 Riesa, Stauchitz, Hirschstein
01640 Coswig
01662 Meißen
01731 Kreischa
01734 Rabenau
01774 Klingenberg
01778 Altenberg
01796 Pirna, Struppen, Dohma
01809 Heidenau
01829 Wehlen
01847 Lohmen
01994 Schipkau
01996 Senftenberg
01998 Schipkau
02708 Löbau, Kottmar u.a.
02727 Ebersbach-Neugersdorf
02739 Kottmar
02788 Zittau
02796 Jonsdorf
02797 Oybin
02799 Großschönau
02906 Niesky, Hohendubrau u.a.
02943 Weißwasser, Boxberg
02959 Schleife
02991 Lauta
03058 Neuhausen/Spree
03172 Guben, Schenkendöbern
03205 Calau, Bronkow
03226 Vetschau
04425 Taucha
04523 Pegau, Elstertrebnitz
04552 Borna
04564 Böhlen
04613 Lucka
04683 Naunhof
04746 Hartha
04774 Dahlen
04824 Brandis
04860 Torgau, Dreiheide
04861 Torgau
04862 Mockrehna
04889 Belgern-Schildau
04928 Plessa, Schraden
04932 Röderland, Großthiemig u.a.
04938 Uebigau-Wahrenbrück
06198 Salzatal
06255 Mücheln
06295 Eisleben
06317 Seegebiet Mansfelder Land
06366 Köthen
06369 Südliches Anhalt u.a.
06388 Südliches Anhalt, Köthen
06456 Arnstein
06463 Falkenstein
06464 Seeland
06466 Seeland
06467 Seeland
06469 Seeland
06485 Quedlinburg, Ballenstedt
06502 Thale, Blankenburg
06536 Südharz, Berga
06543 Falkenstein
06577 An der Schmücke, Etzleben, Oberheldrungen
06628 Lanitz-Hassel-Tal, Molauer Land
06642 Nebra, Kaiserpfalz
06688 Weißenfels
06711 Zeitz
06712 Zeitz, Gutenborn u.a.
06721 Meineweh, Osterfeld
06722 Droyßig, Wetterzeube
06729 Elsteraue
06766 Bitterfeld-Wolfen
06772 Gräfenhainichen
06774 Muldestausee
06779 Raguhn-Jeßnitz
06794 Sandersdorf-Brehna
06796 Sandersdorf-Brehna
06800 Raguhn-Jeßnitz
06803 Bitterfeld-Wolfen
06808 Bitterfeld-Wolfen
06842 Dessau-Roßlau
06844 Dessau-Roßlau
06846 Dessau-Roßlau
06847 Dessau-Roßlau
06849 Dessau-Roßlau
06861 Dessau-Roßlau
06862 Dessau-Roßlau
06868 Coswig (Anhalt)
06886 Wittenberg
06888 Wittenberg
06889 Wittenberg
06895 Zahna-Elster
07366 Rosenthal am Rennsteig
07426 Königsee-Rottenbach u.a.
07557 Gera, Zedlitz u.a.
07570 Weida, Harth-Pöllnitz, Wünschendorf
07751 Jena, Bucha, Großpürschütz u.a.
07768 Kahla
07774 Dornburg-Camburg u.a.
07922 Tanna
07926 Gefell
07950 Zeulenroda-Triebes, Weißendorf
07952 Pausa-Mühltroff
07955 Auma-Weidatal
08233 Treuen
08262 Muldenhammer
08267 Klingenthal
08280 Aue
08304 Schönheide
08315 Lauter-Bernsbach
08344 Grünhain-Beierfeld
08352 Raschau
08373 Remse
08412 Werdau
08523 Plauen
08525 Plauen
08527 Plauen, Rößnitz
08529 Plauen
08539 Rosenbach
08543 Pöhl
08548 Rosenbach
09224 Chemnitz
09228 Chemnitz
09241 Mühlau
09405 Zschopau, Gornau
09434 Zschopau
09465 Sehma
09484 Oberwiesenthal
09487 Schlettau
09488 Wiesa
09509 Pockau-Lengefeld (Pockau)
09514 Pockau-Lengefeld (Lengefeld)
09548 Seiffen/Erzgeb.
09634 Reinsberg
09648 Mittweida, Kriebstein
14476 Potsdam
14624 Dallgow-Döberitz
14641 Nauen
14715 Milower Land, Schollene, Nennhausen u.a.
14778 Beetzsee, Wollin, Wenzlow, Golzow u.a.
14797 Lehnin
14798 Havelsee
14822 Brück, Borkheide u.a.
15306 Seelow, Lietzen u.a.
15328 Golzow, Zechin u.a.
15377 Oberbarnim, Märkische Höhe u.a.
15378 Rüdersdorf
15712 Königs Wusterhausen
15713 Königs Wusterhausen
15745 Wildau
15754 Heidesee
15831 Blankenfelde-Mahlow
15837 Baruth
15926 Luckau, Waldrehna, Heideblick, Fürstlich Drehna
15936 Dahme u.a.
16230 Melchow, Chorin u.a.
16244 Schorfheide
16303 Schwedt
16321 Bernau
16562 Hohen Neuendorf OT Bergfelde
16818 Fehrbellin, Temnitzquell, Märkisch Linden u.a.
16827 Neuruppin
16835 Lindow u.a.
16837 Rheinsberg
16866 Gumtow, Kyritz u.a.
17089 Burow
17091 Rosenow
17099 Friedland, Galenbeck, Datzetal
17109 Demmin
17111 Demmin u.a.
17121 Loitz
17166 Dahmen, Groß Wokern, Teterow
17213 Malchow u.a.
17252 Mirow
17326 Brüssow
17329 Krackow, Nadrensee
17424 Ostseebad Heringsdorf
17429 Benz, Heringsdorf u.a.
17506 Gützkow
18181 Rostock, Graal-Müritz
18195 Tessin, Grammow u.a.
18211 Retschow, Admannshagen-Bargeshagen u.a.
18230 Rerik, Bastorf, Biendorf
18233 Neubukow, Ravensberg u.a.
18239 Satow
18292 Krakow, Dobbin-Linstow u.a.
18299 Laage, Wardow u.a.
18317 Saal
18337 Marlow
18375 Prerow a. Darß
18516 Rakow
18565 Hiddensee
18586 Sellin u.a.
18609 Binz
19053 Schwerin
19055 Schwerin
19057 Schwerin
19059 Schwerin
19061 Schwerin
19063 Schwerin
19065 Pinnow
19067 Leezen
19075 Pampow
19079 Banzkow, Sukow
19086 Plate
19217 Rehna, Carlow u.a.
19273 Amt Neuhaus, Stapel
19300 Grabow u.a.
19336 Legde/Quitzöbel, Bad Wilsnack
19339 Plattenburg
19386 Lübz, Passow
19395 Plau am See
21258 Heidenau
21261 Welle
21398 Neetze
21435 Stelle
21483 Gülzow
21521 Aumühle
21527 Kollow
21635 Jork
21680 Stade
21682 Stade
21683 Stade
21684 Stade
21714 Hammah
21730 Balje
22961 Hoisdorf
22962 Siek
23554 Lübeck St. Lorenz Nord
23568 Lübeck Schlutup/St. Gertrud
23701 Eutin, Süsel
23747 Dahme
23749 Grube
23816 Leezen
23826 Bark
23845 Seth
23879 Mölln
23899 Gudow
23911 Ziethen
23946 Boltenhagen
24111 Kiel Russee
24222 Schwentinental
24223 Schwentinetal
24242 Felde
24354 Kosel, Rieseby u.a.
24366 Loose
24401 Böel
24806 Hohn
24809 Nübbel
24848 Kropp u.a.
24850 Schuby
24863 Börm
24878 Jagel, Lottorf
24881 Nübel
24882 Schaalby, Geelbek
24884 Selk, Geltdorf, Hahnekrug
24894 Tolk, Twedt
24896 Treia, Ahrenviölfeld
24899 Wohlde
24969 Großenwiehe, Lindewitt
24975 Husby
24976 Handewitt
24986 Mittelangeln
25479 Ellerau
25482 Appen
25488 Holm
25593 Reher
25594 Vaale
25693 Sankt Michaelisdonn, Gudendorf, Volsemenhusen, Trennewurth
25746 Heide u.a.
25776 Sankt Annen, Rehm-Flehde-Bargen
25788 Delve
25799 Wrohm
25813 Husum, Schwesing u.a.
25859 Hallig Hooge
25867 Oland
25869 Habel, Gröde
25878 Drage, Seeth
25879 Stapel
25938 Föhr
25946 Amrum
25980 Sylt
25992 List
26209 Hatten
26452 Sande
26524 Hage, Halbemond u.a.
26532 Großheide
26571 Juist, Memmert
26603 Aurich
26605 Aurich
26607 Aurich
26632 Ihlow
26789 Leer
26831 Bunde
26835 Hesel, Neukamperfehn u.a.
26901 Lorup, Rastdorf
26919 Brake
27249 Maasen, Mellinghausen
27339 Riede
27404 Zeven, Elsdorf
27499 Neuwerk
27607 Geestland
27624 Geestland
27628 Hagen
27639 Wurster Nordseeküste
27804 Berne
28832 Achim
28844 Weyhe
29229 Celle, Wittbeck
29361 Höfer
29362 Hohne
29413 Dähre, Diesdorf, Wallstawe
29439 Lüchow
29471 Gartow
29485 Lemgow
29525 Uelzen
29576 Barum
29683 Bad Fallingbostel, Osterheide
29690 Schwarmstedt u.a.
29693 Hodenhagen u.a.
29699 Bomlitz
30669 Langenhagen (Flughafen)
31008 Elze
31180 Giesen
31188 Holle
31275 Lehrte
31553 Auhagen, Sachsenhagen
31559 Haste, Hohnhorst
31618 Liebenau
31632 Husum
31633 Leese
31693 Hespe
31707 Heeßen, Bad Eilsen
31712 Niederwöhren
31867 Pohle, Lauenau, Messenkamp, Hülsede etc
32312 Lübbecke
32369 Rahden
32791 Lage
33142 Büren
33181 Wünnenberg
33333 Bertelsmann
34117 Kassel
34119 Kassel
34121 Kassel
34123 Kassel
34125 Kassel
34127 Kassel
34128 Kassel
34130 Kassel
34131 Kassel
34132 Kassel
34134 Kassel
34233 Kassel, Fuldatal
34329 Nieste
34399 Wesertal
35083 Wetter
35114 Haina
35321 Laubach
35390 Gießen
35392 Gießen
35394 Gießen
35396 Gießen
35398 Gießen
35423 Lich
35466 Rabenau
35638 Leun
35647 Waldolms
35764 Sinn
36119 Neuhof
36142 Tann
36404 Vacha, Oechsen
36460 Krayenberggemeinde, Frauensee
36469 Bad Salzungen
37290 Meißner
37308 Heiligenstadt
37345 Am Ohmberg, Sonnenstein
37444 Braunlage
37586 Dassel
37620 Halle
38173 Sickte, Dettum u.a.
38279 Sehlde
38368 Rennau, Querenhorst, Mariental, Grasleben
38465 Brome
38554 Weyhausen
38690 Goslar
38707 Clausthal-Zellerfeld
38723 Seesen
38729 Langelsheim
38822 Halberstadt, Groß Quenstedt
38838 Huy
38875 Oberharz am Brocken
38877 Oberharz am Brocken
38879 Wernigerode
38899 Oberharz am Brocken
39171 Sülzetal
39217 Schönebeck (Elbe)
39240 Calbe, Rosenburg u.a.
39288 Burg
39317 Elbe-Parey
39345 Haldensleben, Flechtingen, Bülstringen u.a.
39439 Güsten
39443 Staßfurt
39446 Staßfurt
39448 Börde-Hakel
39524 Sandau
39615 Seehausen, Werben, Leppin u.a.
39624 Kalbe
39628 Bismark
39649 Gardelegen
42781 Haan
44623 Herne
44625 Herne
44627 Herne
44628 Herne
44629 Herne
44649 Herne
44651 Herne
44652 Herne
44653 Herne
45768 Marl
45770 Marl
45772 Marl
46359 Heiden
46414 Rhede
46483 Wesel
46485 Wesel
46487 Wesel
47533 Kleve
48366 Laer
48480 Lünne, Schapen, Spelle
48599 Gronau
49201 Dissen
49324 Melle
49326 Melle
49393 Lohne
49401 Damme
49456 Bakum
49536 Lienen
49596 Gehrde
49597 Rieste
49733 Haren
49767 Twist
49824 Ringe, Laar, Emlichheim
49828 Esche, Georgsdorf, Lage, Neuenhaus, Osterwald
49843 Uelsen, Halle, Gölenkamp, Getelo
50321 Brühl
50354 Hürth
52349 Düren
52351 Düren
52353 Düren
52355 Düren
53507 Dernau
53518 Adenau, Kottenborn u.a.
53545 Linz am Rhein, Ockenfels
53562 Sankt Katharinen (Landkreis Neuwied)
53797 Lohmar
53949 Dahlem
54338 Schweich
54343 Föhren
54422 Neuhütten
54441 Ayl, Trassem u.a.
54451 Irsch
54539 Ürzig
54552 Mehren u.a.
54570 Pelm, Neroth u.a.
54585 Esch
54657 Badem, Gindorf, Neidenbach
55116 Mainz
55118 Mainz
55120 Mainz
55122 Mainz
55124 Mainz
55126 Mainz
55127 Mainz
55128 Mainz
55129 Mainz Ebersheim, Hechtsheim
55130 Mainz
55131 Mainz
55246 Wiesbaden
55262 Ingelheim am Rhein
55263 Ingelheim am Rhein
55487 Sohren
55566 Sobernheim
55583 Bad Kreuznach
55624 Rhaunen
56132 Dausenau, Frücht u.a.
56254 Müden
56316 Raubach
56322 Spay
56329 Sankt Goar
56332 Lehmen, Niederfell, Oberfell, Wolken u.a.
56335 Neuhäusel
56346 Sankt Goarshausen u.a.
56357 Miehlen u.a.
56377 Nassau
56414 Meudt, Molsberg, Hundsangen, Niederahr u.a.
56462 Höhn
56653 Wehr
56745 Bell
56823 Büchel
56859 Bullay, Alf, Zell
57462 Olpe
57537 Wissen, Hövels u.a.
57583 Nauroth
58089 Hagen
58091 Hagen
58093 Hagen
58095 Hagen
58097 Hagen
58099 Hagen
58119 Hagen
58135 Hagen
59063 Hamm
59065 Hamm
59067 Hamm
59069 Hamm
59071 Hamm
59073 Hamm
59075 Hamm
59077 Hamm
59174 Kamen
59227 Ahlen
59229 Ahlen
59302 Oelde
59494 Soest
59955 Winterberg
59964 Medebach
59969 Bromskirchen, Hallenberg
60306 Frankfurt am Main, Opernturm
60310 Frankfurt am Main (Taunusturm)
60312 Frankfurt am Main (Omniturm)
60315 Frankfurt am Main (FOUR)
61130 Nidderau
61137 Schöneck
63679 Schotten
63808 Haibach
63831 Wiesen, Wiesener Forst
63840 Hausen
63863 Eschau
64354 Reinheim
64569 Nauheim
64653 Lorsch
64658 Fürth
64760 Oberzent
65391 Lorch
65582 Diez, Hambach, Aull
65604 Elz
66386 Sankt Ingbert
66606 Sankt Wendel
66679 Losheim
66706 Perl
66989 Höheinöd, Petersberg u.a.
67141 Neuhofen
67294 Bischheim u.a.
67454 Haßloch
67575 Eich
67580 Hamm
67759 Nußbach
68775 Ketsch
68782 Brühl
68789 Sankt Leon-Rot
69181 Leimen
69250 Schönau
69254 Malsch
69256 Mauer
69469 Weinheim
71101 Schönaich
71287 Weissach
71404 Korb
71577 Großerlach
72147 Nehren
72419 Neufra
72475 Bitz
72660 Beuren
73084 Salach
73087 Bad Boll
73105 Dürnau
73277 Owen
73329 Kuchen
73430 Aalen
73431 Aalen
73432 Aalen
73433 Aalen
73434 Aalen
73492 Rainau
73499 Wört
73525 Stadt Schwäbisch Gmünd
73529 Stadt Schwäbisch Gmünd
73540 Heubach
73547 Lorch
74223 Flein
74254 Offenau
74388 Talheim
74399 Walheim
74417 Gschwend
74679 Weißbach
74722 Buchen
74744 Ahorn
74931 Lobbach
75242 Neuhausen
75335 Dobel
75389 Neuweiler
76316 Malsch
76709 Kronau
76744 Wörth
76768 Berg
76771 Hördt
76835 Rhodt u.a.
77694 Kehl
77743 Neuried
77756 Hausach
77815 Bühl
77866 Rheinau
77886 Lauf
77889 Seebach
77974 Meißenheim
77977 Rust
78144 Schramberg
78267 Aach
78345 Moos
78479 Reichenau
78559 Gosheim
78607 Talheim
78739 Hardt
79232 March
79271 Sankt Peter
79276 Reute
79299 Wittnau
79367 Weisweil
79369 Wyhl
79379 Müllheim
79664 Wehr
79692 Kleines Wiesental
79695 Wieden
79730 Murg
79809 Weilheim
81248 München
82061 Neuried
82067 Schäftlarn
82178 Puchheim
82216 Maisach
82223 Eichenau
82335 Berg
82392 Habach
82435 Bayersoien
82445 Schwaigen
82475 Garmisch-Partenkirchen (Schneefernerhaus)
82493 Krün
82496 Oberau
83125 Eggstätt
83135 Schechen
83224 Grassau
83358 Seeon-Seebruck
83370 Seeon-Seebruck
83374 Traunreut
83376 Seeon-Seebruck
83410 Laufen
83546 Gars am Inn
83555 Gars a. Inn
83559 Gars a. Inn
83626 Valley
83673 Bichl
83674 Gaißach
83708 Kreuth
84072 Au in der Hallertau
84095 Furth
84168 Aham
84187 Weng
84337 Schönau
84367 Tann
84424 Isen
84571 Reischach
85114 Buxheim
85258 Weichs
85259 Sulzemoos
85376 Neufahrn b. Freising
85419 Mauern
85457 Wörth
85540 Haar
85586 Poing
85625 Glonn
85665 Moosach
86479 Aichen
86510 Ried
86551 Aichach
86556 Kühbach
86641 Rain
86653 Monheim
86674 Baar
86736 Auhausen
86850 Fischach
86875 Waal
86935 Rott
86941 Eresing
86947 Weil
86984 Prem
87471 Durach
87493 Lauben
87538 Fischen im Allgäu
87668 Rieden
87675 Stötten am Auerberg
87736 Böhen
87737 Boos
87740 Buxheim
87743 Egg an der Günz
87760 Lachen
87761 Lauben
87773 Pleß
88175 Scheidegg
88276 Berg
88459 Tannheim
88477 Schwendi
88639 Wald
88682 Salem
89073 Ulm
89075 Ulm
89077 Ulm
89079 Ulm
89081 Ulm
89195 Staig
89290 Buch
89331 Burgau
89353 Glött
90537 Nürnberg-Feucht, Feuchter Forst
90547 Stein
90762 Fürth
90763 Fürth
90765 Fürth
90766 Fürth
90768 Fürth
91154 Roth
91180 Heideck
91189 Rohr
91207 Lauf an der Pegnitz
91247 Vorra
91353 Hausen
91589 Aurach
91596 Burk
92242 Hirschau
92286 Rieden
92444 Rötz
92637 Weiden in der OPf., Theisseil
92712 Pirk
93086 Wörth an der Donau
93090 Bach an der Donau
93192 Wald
93199 Zell
93345 Hausen
93413 Cham
93437 Furth i. Wald
93462 Lam
93474 Arrach
93499 Zandt
94086 Griesbach i. Rottal
94110 Wegscheid
94151 Mauth
94164 Sonnen
94255 Böbrach
94258 Frauenau
94327 Bogen
94353 Haibach
94369 Rain
94439 Roßbach
94526 Metten
94545 Hohenau
94554 Moos
94568 Sankt Oswald
95028 Hof
95030 Hof
95032 Hof
95111 Rehau
95180 Berg
95182 Döhlau
95239 Zell
95494 Gesees
95671 Bärnau
95697 Nagel
96161 Gerach
96169 Lauter
96231 Staffelstein
96355 Tettau
96476 Rodach b. Coburg
96482 Ahorn
96528 Frankenblick, Schalkau, Bachfeld
97239 Aub
97270 Kist, Irtenberger Wald
97274 Leinach
97288 Theilheim
97525 Schwebheim
97779 Geroda
97843 Neuhütten
97849 Roden
98547 Schwarza u.a.
98596 Brotterode-Trusetal
98630 Römhild
98631 Grabfeld
98666 Biberau, Masserberg
98667 Schleusegrund
98694 Ilmenau
99090 Erfurt
99095 Erfurt
99192 Nesse-Apfelstädt, Nottleben
99330 Geratal
99331 Geratal
99338 Plaue, Martinroda
99423 Weimar
99425 Weimar
99427 Weimar
99428 Grammetal, Weimar
99631 Weißensee
99707 Kyffhäuserland
99718 Greußen Clingen Großenehrich
99768 Harztor
99820 Hörselberg-Hainich
99846 Seebach
99867 Gotha
99869 Drei Gleichen
99986 Vogtei, Kammerforst u.a.
99988 Südeichsfeld
99991 Unstrut-Hainich
2022-03-07 02:54:45 +01:00
Sebijk
b49753067c add favicon notify, small fixes 2022-03-07 01:27:12 +01:00
Sebijk
7f49816a79 add deref warning 2022-03-07 01:26:28 +01:00
Sebijk
fd11f48196 company+taxid contributed by SLM 2022-03-07 01:25:44 +01:00
Sebijk
facf6b3e96 new template hooks: afterButtons and beforemailSendOptions 2022-03-07 00:25:03 +01:00
Sebijk
2fbda2efed add postfix transport list creator 2022-03-06 16:53:53 +01:00
Sebijk
9544eb9cb1 remove safe mode check 2022-03-06 16:53:16 +01:00
Sebijk
0e1d1045b1 rector classes 2022-03-06 15:47:16 +01:00
Sebijk
382621be77 use more html5 2022-03-06 15:36:34 +01:00
Sebijk
5be555f460 restore show source button 2022-03-06 12:29:09 +01:00
Sebijk
e103ddbdfb Only variables should be passed by reference 2022-02-23 00:35:40 +01:00
Sebijk
1cbbfd9ca5 remove uneeded function in wbb2 auth 2022-02-23 00:27:09 +01:00
Sebijk
cb7b5bdadc run php cs fix 2022-02-21 21:04:55 +01:00
Sebijk
6a8c9a281f change header, add wbb2 plugin files 2022-02-19 13:37:11 +01:00
Sebijk
a5406c0860 remove unused files 2022-02-19 12:21:00 +01:00
Sebijk
0150916ed5 fix mysql error in auth plugins and add mybb auth 2022-02-19 12:20:41 +01:00
Sebijk
698b979173 php 8 fix add staticFetch 2022-02-18 17:33:47 +01:00
Sebijk
cf7841409a replace icons with font awesome 2022-02-17 22:58:04 +01:00
Sebijk
893166b5bf cs fix 2022-02-17 22:16:51 +01:00
Sebijk
a80c4c2cca switch to fork awesome and update fa-animation 2022-02-17 22:09:09 +01:00
Sebijk
14c45d140f add construct 2022-02-15 16:43:07 +01:00
Sebijk
b8dccb13c7 cs fix 2022-02-15 16:42:44 +01:00
Sebijk
baf9650676 update ckeditor to 4.17.2 2022-02-14 16:56:37 +01:00
Sebijk
30c1bbf0bf set new release to 7.4.1-beta2 2022-02-13 23:30:10 +01:00
Sebijk
8b8ee9b71b update sabredav to 3.0.7 2022-02-13 23:22:47 +01:00
Sebijk
3f21950bce revert unneeded change 2022-02-13 23:19:15 +01:00
Sebijk
b210ad9dd2 add new feature sendername in alias 2022-02-13 23:13:20 +01:00
Sebijk
bc995a53b2 add removeip plugin 2022-02-13 23:12:55 +01:00
Sebijk
9efe3f0cfd PHP 8 captcha fix 2022-02-13 22:58:24 +01:00
Sebijk
6985708599 declare private and public 2022-02-13 22:37:28 +01:00
Sebijk
1d92b78694 skip convert (language files already utf8) + charset fix 2022-02-13 19:44:13 +01:00
Sebijk
37d8003f43 more PHP8 fixes 2022-02-13 19:43:47 +01:00
Sebijk
3e3a9790cb update news plugin for b1gMail 7.4 2022-02-13 18:29:36 +01:00
Sebijk
47bdb3274b
Update issue templates 2022-02-12 00:05:57 +01:00
Sebijk
323001d9ab update readme, add db_sync and custom sendername in alias 2022-02-11 23:59:28 +01:00
Sebijk
3c6e7e49f4 remove unused tables and add tool extract_db_struct 2022-02-11 23:31:57 +01:00
Sebijk
7d5466c661
Merge pull request #1 from mkleger/main
New Maintenance mode with IP whitelist
2022-02-11 23:29:17 +01:00
Michael Kleger
8d54f564a9
Merge pull request #1 from mkleger/Customized-ACP-welcome-page
Customized ACP welcome page
2022-02-07 21:37:47 +01:00
Michael Kleger
57b69ca2da
Customized ACP welcome page
- b1gMail version integrated into overview block
- Note Block is only displayed if there are array elements
2022-02-07 21:35:29 +01:00
Michael Kleger
7e346f2011 New Maintenance mode with IP whitelist 2022-02-07 11:51:08 +01:00
1637 changed files with 166117 additions and 62254 deletions

43
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,43 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Server (please complete the following information):**
- Platform:
- PHP version:
- MySQL / MariaDB version:
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View file

@ -17,25 +17,27 @@ 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. Go to `src/serverlib/` and copy `config.default.inc.php` to `config.inc.php`
3. Open the folder `src` in your web browser, e.g. `http://localhost/b1gMail/src/`
4. Follow the setup instructs, use the normal serial number of your b1gMail license
2. Go to `src/serverlib/` and copy `config.default.inc.php` to `config.inc.php` and copy `version.default.inc.php` to `version.inc.php`.
3. Remove the file `lock` in `src/setup/`
4. Open the folder `src` in your web browser, e.g. `http://localhost/b1gMail/src/`
5. Follow the setup instructs
## Staying up to date
When pulling new changes from the server, you will need to update your database
structure in case it changed. In order to do so, log in to the ACP of your b1gMail
development copy, go to "Tools" -> "Optimize" and chose "Check structure". Let
the ACP fix any issues it found.
structure in case it changed. In order to do so, you can use the `tools/db_sync.php`
script or log in to the ACP of your b1gMail development copy, go to "Tools" -> "Optimize"
and chose "Check structure". Let the ACP fix any issues it found.
## Contributing
You want to contribute to the b1gMail code? Great! In order to do so, it's
probably the best idea to fork the b1gMail repository here and start creating your own commits.
As soon as you feel the commit is mature and you would like to integrate it into the b1gMail code base,
create a merge request to the master repository and we will review it.
create a merge request to the main repository and we will review it.
### Basic guidelines for commits
* Adhere to the b1gMail coding style

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

@ -147,7 +147,7 @@ if($_REQUEST['action'] == 'groups')
if($_REQUEST['traffic'] > 0)
$_REQUEST['traffic'] *= 1024*1024;
$db->Query('UPDATE {pre}gruppen SET titel=?, soforthtml=?, sms_monat=?, storage=?, webdisk=?, maxsize=?, anlagen=?, traffic=?, wd_member_kbs=?, wd_open_kbs=?, send_limit_count=?, send_limit_time=?, ownpop3=?, ownpop3_interval=?, selfpop3_check=?, aliase=?, sms_pre=?, mail2sms=?, wap=?, sms_ownfrom=?, checker=?, tbx_webdisk=?, tbx_smsmanager=?, ads=?, share=?, pop3=?, smtp=?, responder=?, imap=?, forward=?, webdav=?, saliase=?, sms_price_per_credit=?, sms_from=?, sms_sig=?, signatur=?, smsvalidation=?, allow_newsletter_optout=?, smime=?, issue_certificates=?, upload_certificates=?, max_recps=?, sender_aliases=?, syncml=?, organizerdav=?, ftsearch=?, notifications=?, maildeliverystatus=?, abuseprotect=?, mail_send_code=?, sms_send_code=?, auto_save_drafts=? WHERE id=?',
$db->Query('UPDATE {pre}gruppen SET titel=?, soforthtml=?, sms_monat=?, storage=?, webdisk=?, maxsize=?, anlagen=?, traffic=?, wd_member_kbs=?, wd_open_kbs=?, send_limit_count=?, send_limit_time=?, ownpop3=?, ownpop3_interval=?, selfpop3_check=?, aliase=?, sms_pre=?, mail2sms=?, wap=?, sms_ownfrom=?, checker=?, tbx_webdisk=?, tbx_smsmanager=?, ads=?, share=?, pop3=?, smtp=?, responder=?, imap=?, forward=?, webdav=?, saliase=?, sms_price_per_credit=?, sms_from=?, sms_sig=?, signatur=?, smsvalidation=?, allow_newsletter_optout=?, smime=?, issue_certificates=?, upload_certificates=?, max_recps=?, sender_aliases=?, syncml=?, organizerdav=?, ftsearch=?, notifications=?, maildeliverystatus=?, abuseprotect=?, mail_send_code=?, sms_send_code=?, auto_save_drafts=?,organizer=? WHERE id=?',
$_REQUEST['titel'],
isset($_REQUEST['soforthtml']) ? 'yes' : 'no',
$_REQUEST['sms_monat'],
@ -200,6 +200,7 @@ if($_REQUEST['action'] == 'groups')
isset($_REQUEST['mail_send_code']) ? 'yes' : 'no',
isset($_REQUEST['sms_send_code']) ? 'yes' : 'no',
isset($_REQUEST['auto_save_drafts']) ? 'yes' : 'no',
isset($_REQUEST['organizer']) ? 'yes' : 'no',
$_REQUEST['id']);
$cacheManager->Delete('group:' . $_REQUEST['id']);

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

@ -95,8 +95,11 @@ if($_REQUEST['action'] == 'common')
if($_POST['language'] != $bm_prefs['language'])
setcookie('bm_language', $_POST['language'], time()+TIME_ONE_YEAR);
// maintenance whitelist
$dbwhitelist = explode(',', $_POST['wartung_whitelist']);
$db->Query('UPDATE {pre}prefs SET titel=?, b1gmta_host=?, selffolder=?, selfurl=?, mobile_url=?, search_engine=?, datafolder=?, language=?, std_land=?, datumsformat=?, ordner_proseite=?, gut_regged=?, autocancel=?, wartung=?, structstorage=?, cron_interval=?, logouturl=?, contact_history=?, ip_lock=?, cookie_lock=?, domain_combobox=?, ssl_url=?, ssl_login_option=?, ssl_login_enable=?, ssl_signup_enable=?, auto_tz=?, compress_pages=?, redirect_mobile=?, calendar_defaultviewmode=?, '
$db->Query('UPDATE {pre}prefs SET titel=?, b1gmta_host=?, selffolder=?, selfurl=?, mobile_url=?, search_engine=?, datafolder=?, language=?, std_land=?, datumsformat=?, ordner_proseite=?, gut_regged=?, autocancel=?, wartung=?, wartung_whitelist_ips=?, structstorage=?, cron_interval=?, logouturl=?, contact_history=?, ip_lock=?, cookie_lock=?, domain_combobox=?, ssl_url=?, ssl_login_option=?, ssl_login_enable=?, ssl_signup_enable=?, auto_tz=?, compress_pages=?, redirect_mobile=?, calendar_defaultviewmode=?, '
. 'logs_autodelete=?, logs_autodelete_days=?, logs_autodelete_archive=?, hotkeys_default=?, contactform=?, contactform_to=?, contactform_name=?, notify_interval=?, notify_lifetime=?, mail_groupmode=?',
$_POST['titel'],
$_POST['b1gmta_host'],
@ -112,6 +115,7 @@ if($_REQUEST['action'] == 'common')
isset($_POST['gut_regged']) ? 'yes' : 'no',
isset($_POST['autocancel']) ? 'yes' : 'no',
isset($_POST['wartung']) ? 'yes' : 'no',
serialize($dbwhitelist),
isset($_POST['structstorage']) ? 'yes' : 'no',
$_POST['cron_interval'],
$_POST['logouturl'],
@ -145,9 +149,18 @@ if($_REQUEST['action'] == 'common')
// get available languages
$languages = GetAvailableLanguages();
$countries = CountryList();
// maintenance whitelist
$whitelist = NULL;
if(!empty($bm_prefs['wartung_whitelist_ips'])) {
foreach (unserialize($bm_prefs['wartung_whitelist_ips']) as $whiteip) {
$whitelist .= $whiteip .', ';
}
}
$whitelist = rtrim($whitelist, ', ');
// assign
$tpl->assign('safemode', ini_get('safe_mode'));
$tpl->assign('wartungwhitelist', $whitelist);
$tpl->assign('languages', $languages);
$tpl->assign('countries', CountryList());
$tpl->assign('page', 'prefs.common.tpl');
@ -179,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

@ -73,10 +73,11 @@ if($_REQUEST['action'] == 'common')
{
if(isset($_REQUEST['save']))
{
$db->Query('UPDATE {pre}prefs SET blobstorage_provider=?, blobstorage_compress=?, fts_bg_indexing=?',
$db->Query('UPDATE {pre}prefs SET blobstorage_provider=?, blobstorage_compress=?, fts_bg_indexing=?, exturl_warning=?',
$_REQUEST['blobstorage_provider'],
isset($_REQUEST['blobstorage_compress']) ? 'yes' : 'no',
isset($_REQUEST['fts_bg_indexing']) ? 'yes' : 'no');
isset($_REQUEST['fts_bg_indexing']) ? 'yes' : 'no',
isset($_REQUEST['exturl_warning']) ? 'yes' : 'no');
ReadConfig();
}

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>
@ -156,6 +156,11 @@
<td class="td2"><input type="checkbox" name="organizerdav"{if !$davSupport} disabled="disabled"{else}{if $group.organizerdav=='yes'} checked="checked"{/if}{/if} /></td>
<td colspan="2">&nbsp;</td>
</tr>
<tr>
<td class="td1">{lng p="organizer"}?</td>
<td class="td2"><input type="checkbox" name="organizer"{if $group.organizer=='yes'} checked="checked"{/if} /></td>
<td colspan="2">&nbsp;</td>
</tr>
<tr>
<td class="td1">{lng p="smtp"}?</td>
<td class="td2"><input type="checkbox" name="smtp"{if $group.smtp=='yes'} checked="checked"{/if} /></td>
@ -230,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>
@ -261,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

@ -4,7 +4,7 @@
<table>
<tr>
<td width="40" valign="top" rowspan="14"><img src="{$tpldir}images/ico_prefs_common.png" border="0" alt="" width="32" height="32" /></td>
<td width="40" valign="top" rowspan="13"><img src="{$tpldir}images/ico_prefs_common.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="220">{lng p="projecttitle"}:</td>
<td class="td2"><input type="text" name="titel" value="{text allowEmpty=true value=$bm_prefs.titel}" size="36" /></td>
</tr>
@ -48,10 +48,22 @@
<td class="td1" width="220">{lng p="compresspages"}?</td>
<td class="td2"><input name="compress_pages"{if $bm_prefs.compress_pages=='yes'} checked="checked"{/if} type="checkbox" /></td>
</tr>
</table>
</fieldset>
<fieldset>
<legend>{lng p="maintmode"}</legend>
<table>
<tr>
<td width="40" valign="top" rowspan="2"><img src="{$tpldir}images/ico_prefs_cmd.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="220">{lng p="maintmode"}?</td>
<td class="td2"><input name="wartung"{if $bm_prefs.wartung=='yes'} checked="checked"{/if} type="checkbox" /></td>
</tr>
<tr>
<td class="td1" width="220">{lng p="whitelist"}:</td>
<td class="td2"><input type="text" name="wartung_whitelist" value="{text allowEmpty=true value=$wartungwhitelist}" size="36" /></td>
</tr>
</table>
</fieldset>
@ -125,13 +137,6 @@
<td class="td2"><input type="checkbox" name="structstorage"{if $bm_prefs.structstorage=='yes'&&!$safemode} checked="checked"{/if}{if $safemode} disabled="disabled"{/if} /></td>
</tr>
</table>
{if $safemode}
<p>
<img src="{$tpldir}images/warning.png" border="0" alt="" width="16" height="16" align="absmiddle" />
{lng p="structsafewarn"}
</p>
{/if}
</fieldset>
<fieldset>
@ -143,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

@ -4,7 +4,7 @@
<table>
<tr>
<td width="40" valign="top" rowspan="3"><img src="{$tpldir}images/ico_prefs_email.png" border="0" alt="" width="32" height="32" /></td>
<td width="40" valign="top" rowspan="4"><img src="{$tpldir}images/ico_prefs_email.png" border="0" alt="" width="32" height="32" /></td>
<td class="td1" width="220">{lng p="storein"}:</td>
<td class="td2"><select name="blobstorage_provider">
<option value="0"{if $bm_prefs.blobstorage_provider==0} selected="selected"{/if}>{lng p="filesystem"} ({lng p="separatefiles"})</option>
@ -30,6 +30,15 @@
</label>
</td>
</tr>
<tr>
<td class="td1">{lng p="exturl"}:</td>
<td class="td2">
<label>
<input name="exturl_warning"{if $bm_prefs.exturl_warning=='yes'} checked="checked"{/if} type="checkbox" />
{lng p="exturl_warning"}
</label>
</td>
</tr>
</table>
</fieldset>

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,21 +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="{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>
@ -55,20 +59,24 @@
</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="{email value=$user.altmail}" style="width:85%;" /></td>
</tr>
<tr>
<td class="td1">{lng p="taxid"}:</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}
{assign var=fieldID value=$profileField.id}
@ -76,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}
@ -87,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}
@ -262,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>
@ -292,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>
@ -310,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">
@ -334,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

@ -1,17 +1,3 @@
<fieldset>
<legend>b1gMail</legend>
<table width="100%">
<tr>
<td rowspan="2" width="40" align="center" valign="top"><img src="{$tpldir}images/about_logo.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1" width="24%">{lng p="version"}:</td>
<td class="td2" width="26%">{$version}</td>
<td colspan="3" rowspan="2">&nbsp;</td>
</tr>
</table>
</fieldset>
{if $adminRow.type==0||$adminRow.privileges.overview}
<fieldset>
<legend>{lng p="overview"}</legend>
@ -23,23 +9,17 @@
<td class="td1" width="24%"><a href="users.php?sid={$sid}">{lng p="users"}</a>:</td>
<td class="td2" width="26%">{$userCount}</td>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/ico_system.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1" width="24%">{lng p="phpversion"}:</td>
<td class="td2" width="26%">{$phpVersion}</td>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/about_logo.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1" width="24%">{lng p="version"}:</td>
<td class="td2" width="26%">{$version}</td>
</tr>
<tr>
<td class="td1"><a href="users.php?filter=true&statusNotActivated=true&allGroups=true&sid={$sid}">{lng p="notactivated"}</a>:</td>
<td class="td2">{$notActivatedUserCount}</td>
<td class="td1">{lng p="webserver"}:</td>
<td class="td2">{$webserver}</td>
</tr>
<tr>
<td class="td1"><a href="users.php?filter=true&statusLocked=true&allGroups=true&sid={$sid}">{lng p="locked"}</a>:</td>
<td class="td2">{$lockedUserCount}</td>
<td class="td1">{lng p="load"}:</td>
<td class="td2">{$loadAvg}</td>
</tr>
<!-- mail stuff -->
@ -51,23 +31,23 @@
<td class="td1">{lng p="emailsize"}:</td>
<td class="td2">{if $emailSize!==false}{size bytes=$emailSize}{else}-{/if}</td>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/ico_data.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1">{lng p="mysqlversion"}:</td>
<td class="td2">{$mysqlVersion}</td>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/ico_system.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1">{lng p="phpversion"}:</td>
<td class="td2">{$phpVersion}</td>
</tr>
<tr>
<td class="td1">{lng p="emails"}:</td>
<td class="td2">{$emailCount}</td>
<td class="td1">{lng p="tables"}:</td>
<td class="td2">{$tableCount}</td>
<td class="td1">{lng p="webserver"}:</td>
<td class="td2">{$webserver}</td>
</tr>
<tr>
<td class="td1">{lng p="folders"}:</td>
<td class="td2">{$folderCount}</td>
<td class="td1">{lng p="dbsize"}:</td>
<td class="td2">{size bytes=$dbSize}</td>
<td class="td1">{lng p="load"}:</td>
<td class="td2">{$loadAvg}</td>
</tr>
<!-- webdisk stuff -->
@ -77,15 +57,25 @@
<tr>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/ico_disk.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1">{lng p="disksize"}:</td>
<td class="td2" colspan="3">{if $diskSize!==false}{size bytes=$diskSize}{else}-{/if}</td>
<td class="td2">{if $diskSize!==false}{size bytes=$diskSize}{else}-{/if}</td>
<td rowspan="3" width="40" align="center" valign="top"><img src="{$tpldir}images/ico_data.png" border="0" alt="" width="32" heigh="32" /></td>
<td class="td1">{lng p="mysqlversion"}:</td>
<td class="td2">{$mysqlVersion}</td>
</tr>
<tr>
<td class="td1">{lng p="files"}:</td>
<td class="td2" colspan="3">{$diskFileCount}</td>
<td class="td2">{$diskFileCount}</td>
<td class="td1">{lng p="tables"}:</td>
<td class="td2">{$tableCount}</td>
</tr>
<tr>
<td class="td1">{lng p="folders"}:</td>
<td class="td2" colspan="3">{$diskFolderCount}</td>
<td class="td2">{$diskFolderCount}</td>
<td class="td1">{lng p="dbsize"}:</td>
<td class="td2">{size bytes=$dbSize}</td>
</tr>
</table>
</fieldset>
@ -136,7 +126,7 @@
</table>
{/if}
{if $adminRow.type==0}
{if $adminRow.type == 0 && $notices|@count > 0}
<fieldset>
<legend>{lng p="notices"}</legend>
@ -145,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);
@ -378,11 +378,12 @@ if($_REQUEST['action'] == 'users')
$res->Free();
// update common stuff
$db->Query('UPDATE {pre}users SET profilfelder=?, email=?, vorname=?, nachname=?, strasse=?, hnr=?, plz=?, ort=?, land=?, tel=?, fax=?, mail2sms_nummer=?, altmail=?, gruppe=?, gesperrt=?, notes=?, re=?, fwd=?, mail2sms=?, forward=?, forward_to=?, `newsletter_optin`=?, datumsformat=?, absendername=?, anrede=?, saliase=?, mailspace_add=?, diskspace_add=?, traffic_add=? WHERE id=?',
$db->Query('UPDATE {pre}users SET profilfelder=?, email=?, vorname=?, nachname=?, company=?, strasse=?, hnr=?, plz=?, ort=?, land=?, tel=?, fax=?, taxid=?, mail2sms_nummer=?, altmail=?, gruppe=?, gesperrt=?, notes=?, re=?, fwd=?, mail2sms=?, forward=?, forward_to=?, `newsletter_optin`=?, datumsformat=?, absendername=?, anrede=?, saliase=?, mailspace_add=?, diskspace_add=?, traffic_add=? WHERE id=?',
serialize($profileData),
EncodeEMail($_REQUEST['email']),
$_REQUEST['vorname'],
$_REQUEST['nachname'],
$_REQUEST['company'],
$_REQUEST['strasse'],
$_REQUEST['hnr'],
$_REQUEST['plz'],
@ -390,6 +391,7 @@ if($_REQUEST['action'] == 'users')
$_REQUEST['land'],
$_REQUEST['tel'],
$_REQUEST['fax'],
$_REQUEST['taxid'],
$_REQUEST['mail2sms_nummer'],
EncodeEMail($_REQUEST['altmail']),
$_REQUEST['gruppe'],
@ -901,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,11 +1,233 @@
CKEditor 4 Changelog
====================
⚠️️️ **CKEditor 4 (the open source edition) is no longer maintained.** ⚠️
## CKEditor 4.17.1
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:
* [#4979](https://github.com/ckeditor/ckeditor4/issues/3757): Added cache key in [#4761](https://github.com/ckeditor/ckeditor4/issues/4761) started to breaking relative links for external CSS resources. The fix had been reverted and will be corrected in the upcoming release.
* [#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
Fixed issues:
* [#4934](https://github.com/ckeditor/ckeditor4/issues/4934): Fixed: Active focus in dialog tabs is not visible in the High Contrast mode.
* [#547](https://github.com/ckeditor/ckeditor4/issues/547): Fixed: Dragging and dropping elements like images within a table is no longer available.
* [#4875](https://github.com/ckeditor/ckeditor4/issues/4875): Fixed: It is not possible to delete multiple selected lists.
* [#4873](https://github.com/ckeditor/ckeditor4/issues/4873): Fixed: Pasting content from MS Word and Outlook with horizontal lines prevents images from being uploaded.
* [#4952](https://github.com/ckeditor/ckeditor4/issues/4952): Fixed: Dragging and dropping images within a table cell appends additional elements.
* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): Fixed: Some CSS files are missing unique timestamp used to prevent browser to cache static resources between editor releases.
* [#4987](https://github.com/ckeditor/ckeditor4/issues/4987): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) is not recognizing more than one space character.
* [#5061](https://github.com/ckeditor/ckeditor4/issues/5061): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) plugin incorrectly handles multiple whitespace during replacing text.
* [#5004](https://github.com/ckeditor/ckeditor4/issues/5004): Fixed: `MutationObserver` used in [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin causes memory leaks.
* [#4994](https://github.com/ckeditor/ckeditor4/issues/4994): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin caused content pasted from Word to turn into an image.
API changes:
* [#4918](https://github.com/ckeditor/ckeditor4/issues/4918): Explicitly set the [`config.useComputedState`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-useComputedState) default value to `true`. Thanks to [Shabab Karim](https://github.com/shabab477)!
* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): The [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function was added.
* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): [`CKEDITOR.dom.document#appendStyleSheet()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_document.html#method-appendStyleSheet) and [`CKEDITOR.tools.buildStyleHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-buildStyleHtml) now use the newly added [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function to correctly handle caching of CSS files.
Other changes:
* [#5014](https://github.com/ckeditor/ckeditor4/issues/5014): Fixed: Toolbar configurator fails when plugin does not define a toolbar group. Thanks to [SuperPat](https://github.com/SuperPat45)!
## CKEditor 4.17.1
**Highlights:**
Due to a regression in CKEeditor 4.17.0 version that was only revealed after the release and affected a limited area of operation, CSS assets loaded via relative links started to point into invalid location when loaded from external resources.
We have therefore decided to immediately release CKEditor 4.17.1 that fixed this problem. If you have already upgraded to v4.17.0, make sure to upgrade to v4.17.1 to avoid this regression.
Fixed issues:
* [#4979](https://github.com/ckeditor/ckeditor4/issues/3757): Fixed: Added cache key in [#4761](https://github.com/ckeditor/ckeditor4/issues/4761) started to breaking relative links for external CSS resources. The fix has been reverted and will be corrected in the next editor version.
## CKEditor 4.17
@ -13,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.
@ -79,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.
@ -117,7 +339,7 @@ Fixed Issues:
* [#4351](https://github.com/ckeditor/ckeditor4/issues/4351): Fixed: Incorrect values for RGBA/HSLA colors in [Color Dialog](https://ckeditor.com/cke4/addon/colordialog).
* [#4509](https://github.com/ckeditor/ckeditor4/issues/4509): Fixed: Incorrect handling of drag & drop inside [widgets](https://ckeditor.com/cke4/addon/widget) and nested editables.
* [#4611](https://github.com/ckeditor/ckeditor4/issues/4611): [Android, iOS] Fixed: Incorrect hover styles for buttons in the toolbar on mobile devices.
* [#4652](https://github.com/ckeditor/ckeditor4/issues/4652): Fixed: [Event data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_eventInfo.html) set to `false` is treated as an event cancelation.
* [#4652](https://github.com/ckeditor/ckeditor4/issues/4652): Fixed: [Event data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_eventInfo.html) set to `false` is treated as an event cancellation.
* [#4659](https://github.com/ckeditor/ckeditor4/issues/4659): Fixed: [`CKEDITOR.htmlParser`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser.html) does not treat `--!>` as a comment end tag correctly.
## CKEditor 4.16
@ -1616,7 +1838,7 @@ Other Changes:
New Features:
* [#11297](https://dev.ckeditor.com/ticket/11297): Styles can now be applied to widgets. The definition of a style which can be applied to a specific widget must contain two additional properties &mdash; `type` and `widget`. Read more in the [Widget Styles](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_styles.html#widget-styles) section of the "Syles Drop-down" guide. Note that by default, widgets support only classes and no other attributes or styles. Related changes and features:
* [#11297](https://dev.ckeditor.com/ticket/11297): Styles can now be applied to widgets. The definition of a style which can be applied to a specific widget must contain two additional properties &mdash; `type` and `widget`. Read more in the [Widget Styles](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_styles.html#widget-styles) section of the "Styles Drop-down" guide. Note that by default, widgets support only classes and no other attributes or styles. Related changes and features:
* Introduced the [`CKEDITOR.style.addCustomHandler()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_style.html#static-method-addCustomHandler) method for registering custom style handlers.
* The [`CKEDITOR.style.apply()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_style.html#method-apply) and [`CKEDITOR.style.remove()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_style.html#method-remove) methods are now called with an editor instance instead of the document so they can be reused by the [`CKEDITOR.editor.applyStyle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-applyStyle) and [`CKEDITOR.editor.removeStyle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-removeStyle) methods. Backward compatibility was preserved, but from CKEditor 4.4 it is highly recommended to pass an editor instead of a document to these methods.
* Many new methods and properties were introduced in the [Widget API](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.plugins.widget.html) to make the handling of styles by widgets fully customizable. See: [`widget.definition.styleableElements`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-styleableElements), [`widget.definition.styleToAllowedContentRule`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-styleToAllowedContentRules), [`widget.addClass()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-addClass), [`widget.removeClass()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-removeClass), [`widget.getClasses()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-getClasses), [`widget.hasClass()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-hasClass), [`widget.applyStyle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-applyStyle), [`widget.removeStyle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-removeStyle), [`widget.checkStyleActive()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-checkStyleActive).

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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben.
* 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.
@ -60,7 +68,7 @@ The following libraries are included in CKEditor under the BSD-3 License (see Ap
Trademarks
----------
CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
CKEditor is a trademark of CKSource Holding sp. z o.o. All other brand
and product names are trademarks, registered trademarks or service
marks of their respective holders.

View file

@ -1,10 +1,10 @@
/*
Copyright (c) 2003-2021, CKSource - Frederico Knabben. 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,6 +1,6 @@
/**
* @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/license
* @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/3fe06b48e03a97a12569e70ffdc9a97d
* (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/3fe06b48e03a97a12569e70ffdc9a97d
* (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:
@ -68,6 +68,7 @@ var CKBUILDER_CONFIG = {
'link' : 1,
'list' : 1,
'smiley' : 1,
'sourcedialog' : 1,
'toolbar' : 1,
'undo' : 1,
'wysiwygarea' : 1

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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.5 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,8 +1,9 @@
/*
Copyright (c) 2003-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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

@ -0,0 +1,6 @@
/*
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;
if(a===d)return!0;setTimeout(function(){b(c,a)});return!1}}(),contents:[{id:"main",label:a.lang.sourcedialog.title,elements:[{type:"textarea",id:"data",dir:"ltr",inputStyle:"cursor:auto;width:"+e+"px;height:"+b+"px;tab-size:4;text-align:left;","class":"cke_source"}]}]}});

View file

@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> &ndash; Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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">
@ -47,6 +47,9 @@ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
<h2 class="samples">Plugins</h2>
<dl class="samples">
<dt><a class="samples" href="sourcedialog/sourcedialog.html">Editing source code in a dialog</a><span class="new">New!</span></dt>
<dd>Try the latest sample of CKEditor 4 and learn more about customizing your WYSIWYG editor with endless possibilities.</dd>
<dt><a class="samples" href="wysiwygarea/fullpage.html">Full page support</a></dt>
<dd>Try the latest sample of CKEditor 4 and learn more about customizing your WYSIWYG editor with endless possibilities.</dd>
</dl>
@ -116,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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a>
- Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +117,7 @@ var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2021, <a class="samples" href="https://cksource.com/">CKSource</a>
- Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +106,7 @@ var editor = CKEDITOR.inline( 'article-body' );
https://ckeditor.com</a>
</p>
<p id="copy">
Copyright &copy; 2003-2021, <a class="samples" href="https://cksource.com/">CKSource</a>
- Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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-2021, CKSource - Frederico Knabben. 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

@ -0,0 +1,121 @@
<!DOCTYPE html>
<!--
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">
<head>
<meta charset="utf-8">
<title>Editing source code in a dialog &mdash; CKEditor Sample</title>
<script src="../../../ckeditor.js"></script>
<link rel="stylesheet" href="../../../samples/old/sample.css">
<meta name="ckeditor-sample-name" content="Editing source code in a dialog">
<meta name="ckeditor-sample-group" content="Plugins">
<meta name="ckeditor-sample-description" content="Editing HTML content of both inline and classic editor instances.">
<meta name="ckeditor-sample-isnew" content="1">
<meta name="description" content="Try the latest sample of CKEditor 4 and learn more about customizing your WYSIWYG editor with endless possibilities.">
<style>
#editable
{
padding: 10px;
float: left;
}
</style>
</head>
<body>
<h1 class="samples">
<a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Editing source code in a dialog
</h1>
<div class="warning deprecated">
This sample is not maintained anymore. Check out its <a href="https://ckeditor.com/docs/ckeditor4/latest/examples/sourcearea.html">brand new version in CKEditor Examples</a>.
</div>
<div class="description">
<p>
<strong>Sourcedialog</strong> plugin provides an easy way to edit raw HTML content
of an editor, similarly to what is possible with <strong>Sourcearea</strong>
plugin for classic (<code>iframe</code>-based) instances but using dialogs. Thanks to that, it's also possible
to manipulate raw content of inline editor instances.
</p>
<p>
This plugin extends the toolbar with a button,
which opens a dialog window with a source code editor. It works with both classic
and inline instances. To enable this
plugin, basically add <code>extraPlugins: 'sourcedialog'</code> to editor's
config:
</p>
<pre class="samples">
// Inline editor.
CKEDITOR.inline( 'editable', {
<strong>extraPlugins: 'sourcedialog'</strong>
});
// Classic (iframe-based) editor.
CKEDITOR.replace( 'textarea_id', {
<strong>extraPlugins: 'sourcedialog'</strong>,
removePlugins: 'sourcearea'
});
</pre>
<p>
Note that you may want to include <code>removePlugins: 'sourcearea'</code>
in your config when using <strong>Sourcedialog</strong> in classic editor instances.
This prevents feature redundancy.
</p>
<p>
Note that <code>editable</code> in the code above is the <code>id</code>
attribute of the <code>&lt;div&gt;</code> element to be converted into an inline instance.
</p>
<p>
Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
the <code>&lt;textarea&gt;</code> element to be replaced with CKEditor.
</p>
</div>
<div>
<label for="editor1">
Inline editor:
</label>
<div id="editor1" contenteditable="true" style="padding: 5px 20px;">
<p>This is some <strong>sample text</strong>. You are using <a href="https://ckeditor.com/">CKEditor</a>.</p>
</div>
</div>
<br>
<div>
<label for="editor2">
Classic editor:
</label>
<textarea cols="80" id="editor2" name="editor2" rows="10">
This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.
</textarea>
</div>
<script>
// We need to turn off the automatic editor creation first.
CKEDITOR.disableAutoInline = true;
var config = {
toolbarGroups: [
{ name: 'mode' },
{ name: 'basicstyles' },
{ name: 'links' }
],
extraPlugins: 'sourcedialog',
removePlugins: 'sourcearea'
}
CKEDITOR.inline( 'editor1', config );
CKEDITOR.replace( 'editor2', config );
</script>
<div id="footer">
<hr>
<p>
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-2023, <a class="samples" href="https://cksource.com/">CKSource</a> Holding sp. z o.o. All rights reserved.
</p>
</div>
</body>
</html>

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2003-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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-2021, CKSource - Frederico Knabben. 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,8 +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-2021, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
Knabben. 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>

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