From fdb33b0b7eae286fbac9e1692b4e81be8fe566cb Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Nov 2026 09:11:08 +1000 Subject: [PATCH 1/6] TINYDOC-3700: Port the MoxieManager documentation into nested pages under the MoxieManager plugin. --- modules/ROOT/attachments/moxiemanager/mce.zip | Bin 0 -> 2022 bytes .../moxiemanager-example-plugin.zip | Bin 0 -> 2534 bytes .../moxiemanager/moxiemanager-languages.zip | Bin 0 -> 80253 bytes modules/ROOT/images/moxiemanager/dropbox.png | Bin 0 -> 6241 bytes modules/ROOT/nav.adoc | 12 + modules/ROOT/pages/moxiemanager-api.adoc | 507 ++++ .../pages/moxiemanager-changelog-dotnet.adoc | 734 +++++ .../pages/moxiemanager-changelog-php.adoc | 1006 +++++++ modules/ROOT/pages/moxiemanager-faq.adoc | 200 ++ .../pages/moxiemanager-how-to-guides.adoc | 681 +++++ .../ROOT/pages/moxiemanager-installation.adoc | 223 ++ .../ROOT/pages/moxiemanager-integration.adoc | 203 ++ .../ROOT/pages/moxiemanager-languages.adoc | 69 + modules/ROOT/pages/moxiemanager-options.adoc | 2661 +++++++++++++++++ modules/ROOT/pages/moxiemanager-plugins.adoc | 41 + modules/ROOT/pages/moxiemanager-security.adoc | 399 +++ modules/ROOT/pages/moxiemanager.adoc | 18 +- 17 files changed, 6751 insertions(+), 3 deletions(-) create mode 100644 modules/ROOT/attachments/moxiemanager/mce.zip create mode 100644 modules/ROOT/attachments/moxiemanager/moxiemanager-example-plugin.zip create mode 100644 modules/ROOT/attachments/moxiemanager/moxiemanager-languages.zip create mode 100644 modules/ROOT/images/moxiemanager/dropbox.png create mode 100644 modules/ROOT/pages/moxiemanager-api.adoc create mode 100644 modules/ROOT/pages/moxiemanager-changelog-dotnet.adoc create mode 100644 modules/ROOT/pages/moxiemanager-changelog-php.adoc create mode 100644 modules/ROOT/pages/moxiemanager-faq.adoc create mode 100644 modules/ROOT/pages/moxiemanager-how-to-guides.adoc create mode 100644 modules/ROOT/pages/moxiemanager-installation.adoc create mode 100644 modules/ROOT/pages/moxiemanager-integration.adoc create mode 100644 modules/ROOT/pages/moxiemanager-languages.adoc create mode 100644 modules/ROOT/pages/moxiemanager-options.adoc create mode 100644 modules/ROOT/pages/moxiemanager-plugins.adoc create mode 100644 modules/ROOT/pages/moxiemanager-security.adoc diff --git a/modules/ROOT/attachments/moxiemanager/mce.zip b/modules/ROOT/attachments/moxiemanager/mce.zip new file mode 100644 index 0000000000000000000000000000000000000000..d4b3055c9ecbf57dd4bd89f879457a76f334e911 GIT binary patch literal 2022 zcmZ`)dpr~T9^PEm=GMV-o4Ly^3&SP~F*b9jag_UI!cL>)5_2~pcS=Z#DfU*HF@=yz zZtZoa@=6L7p+rQ^Iyt9*-t)UXzu)KkJfGh`-_P^d&0S7(fK$ri2LL$hKMW2FK@KDr5>DH_#6l@qab4{hLDjI3MMA8c zO>I5ht+GgA65&?i-p^F=Yr9bw(48DO`((ucIoBD&U3JhQgxwS~)Aamf<6tvnc%eOX z%!3THj2hgSWi-z&okx7;r#;HQuR{HXp8fMj0MQOS}TsKJaO! zMqez2$8B%VuBsZMjp|GkBX#H$+hg#_C1Z(6zcO^!KR*o}k?`-6JM7?C`tc@%gb9f< zaunz)J>;_15XYQsD0wyD{n_MQ@@}^PL^APM6`z9U((yh$ji%hbkMg`Q?W@G#*finA zm>V;V-%!yFIqu{8W;jVW8o7|HW)7zb2t#l}L@Dh! zyEO)P$Ha)OhsVOLHjB_Ki;X`I?M`XaZ6W+Z6|@1t)|ScXOHGXLLBvgEE`8O4Smeo- ziW#(vx~I@=VzKp$DRIl-gftP89R4Xj(M@OS1HA-ymk@n3-AZ*zSL=bkua8nEP< zX^jDK6TNIMz`rk|0fAYMP;}>Im4G4jlrJd7ErEA) zY34e$@fvS7HcTNp!(L2G_ zLR1_YB6>1TW_wOa+U}J0!o)y1J@QKVV#f63aqN<70x}x+B2}$N-fHjiM=sQlW#xOR z(pR674c|FToTePu&P|-qzWsJsD8{3jA+@8|*#kK0CV-DQ-ztdNtq4Coa?_E@Y ziwmUr={t<+RU;|mK(HvbS|-IdvH1w2nGCnyO>KdZKAB&?t$`Zn?H-l1P}Cg_n{HwT zXje)w(H*AgC?KDgN4Oa3ab1a6_QkT=vu7umvK5_G!y@z?N=W&73-#?ZtPLV{f+f5h zbm{xN@o&?+%`rWknZDaR5C9P87@yF->4o`w`;q(+7a}iIIko?5)I^}=e*NBSL((m= z#RM4FsTy;;c(fg{x%Yvn;q|qpi(Ao41GIW9wlFR18Jf*rnYyt&pOwxkP!J@uvxQgS zO+e%l`su;v-p^h6&P1TjHI(%4MK+Wy&(|ceV=6ll@tNRWh*$#myhw3;1b#gw)6IJ7 zaxiG&xQhsxE8mm`dT(S`R_7V9T1M%Ll3%km^tT_X0+MyYY=9zPWE@}l`Vx9&+W#P5DeX<7 z90{`St5r8f1$}GW+qmOT$PXGyWAAxRvSJHUR7i17*BY2G>-Y6&wZWq2{v`Xk7!&&# zR5lXLXX9fbP8*N+4_rC+tt08(7e@H`?Nqhl6e0IFrW1bJubk;NM!^qref~0-0nbFN z;xf_%<5$7RkE!nw>=zvw$_LG$6cJoZ@(>(q8=svAH*yvpA3lM3LRHO(3@?J7-Kv|G zP-$RXd_edRF;tM-r2B{G7!_npIG$s^LZ@jf*9U>r1i9YQkhS6rnT!U%HnL^LZCH4v zZ<=$cylQZ(5K)|}OcUoRwMA;(#T(j$N>mw)j31U^S(T3yWcTW$$x;tr-m`sK9=i#% z#{;>bfd3zrzj9OS7wiY;e-(cpoj<8SfE?#k;Ow7KyC0;#zXAjPuKhUdeW5t-FX8WI Uw8!&;e%84;vzmiy2Y$Z(4WEf~;{X5v literal 0 HcmV?d00001 diff --git a/modules/ROOT/attachments/moxiemanager/moxiemanager-example-plugin.zip b/modules/ROOT/attachments/moxiemanager/moxiemanager-example-plugin.zip new file mode 100644 index 0000000000000000000000000000000000000000..18af47ab854cbef6bcd72ca0d39fab520b06954e GIT binary patch literal 2534 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 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/moxiemanager/dropbox.png b/modules/ROOT/images/moxiemanager/dropbox.png new file mode 100644 index 0000000000000000000000000000000000000000..8df1a9398f433e76aa850fcbc755aa7462991cc2 GIT binary patch literal 6241 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 z zi&XZQYXPPG&T}T>&{fRQ&vt8qS<-p~ufT>KKkUMRX4|qmaG>$Ye4u>YFIyhYf-I|v zPW7h`wT3C|3+{F3@EfYAka@77U*nxq+pXLF;Cpb1oSe?jAK3TP+xodGZdXKpg;T{I z!*D$7pWD%waI>>xMDOj=;8_ZBhB@YZTsd#;)u+VL5eVcBx==fLA|o97w7gwEs*!mV z&PC6pM97dOs8vtNkxmEEwbS^ozUGjQ2#kzo-9$B<1%03G#l*V5iHVPEWM;%mj0VYJ zV_%;3r?s96Y4hhnM>vQMu$SPfShw8<;Xfc~9*xA|hI<2XcWcJeg>K87K4&;xbAQyn zo@$IaAw(fq{BGgnKArm#BA&VJ`xg#9G5snsV`jM5T0QE&QlS&%;ENv9_&}1g4%Wvb zm#dQ%R5a`Qt={pLdMST(QavN zh=Z=j*QB1YJ%(y+t)9~tA_L~?Dz!1y?AaxKiOGXK6irMx z{i_^C??<@!?l^DfRQQ)njLLRp3A}oJfk|Ok2oAu$pcc3?{xvfpo$zb07b0;UDoMv0 zZjnEPS0;CENQfF*$mn~N?{fFOR<6+wmSV2u#BMnkd-4nFNeB?m8#M_DC7f2=bCueC zcLCj8-EXh0C|=_%jy(}HDWFa}O$Ny4)6Ve`iL~n|}XKj?cq_Gy}?XYLy)ZrLIA5ft578 z<&+Byd`0lpHi;TnH(0%ps`H*e(Dhpsx5A^uQE-3K$ms&sjq-x@U5;?*T5M?Fq=bLE z`OoA$=0scJ2KcTm4EA}jnc?|t8AfW`F!=#j&R03FsxofE7&@JqH}Ldzi0{~&$Sf{T z=3N$W_$%&?q<80~m1woSptIZ+_eq7-@-zW?!e{FXlf!U^Repkmr`bEMkbU3Q$S!N) z4-X4_dU~+aK{R^RzgTR^S2(@n!W(b=rH2?jc9?=-t2thn z4~m2(;<->0LVw(RE}Yyi%5HfPs1;~z+_Mp|YiMMe^{9)i1}t&r?X-86zOVac&Y*~Y z#*3YyJZICk*;l#7{4M#$=8Vwk^tvNIW_-Ly6C!1yZ?PEf@7kQPg#W1n^o%_`oPW#K!3wktufZkLuc##Imb1sf~V;;I>^ zkGH?M*Ubvwtk1 z!1yrMfokq`(a}$1k?9?V*s*6pM;2D;eeM$!rc0KKH_w*4SS)uz{H3~i_6Fs8eNyrt&EindH*y_SEzW=WSq=D=q9exHsd9j zv*`Bi$Lrsv&3bozp2`5IsPw?r^`}{X?KG(EjF=*XCZ&JTCG_3l%8XRG{plj2yW?0rz_cyn>n zc|QSIG)S|iYr-naGd^sb5?`3@j*48A5sI4eEEQ^WwUpv<<;f~&VIB)0#mjq^Dombj z=*1kH@se8223Xb0(p@|If@s=Dyw#}kYoEAieOvFY#oq5Clp%U^Z4Hwj3D80m^V#LG7~e+N_pE4kC2+^FF(D%3sU#Q;)c`2T&xP~zO0qe z1lztvT#5VKX#Z^Wte_fx5XI3BwsJuvUpA;J5>SO)^$=;DNyWV1I9a$~xY<}g(&}*W z=F_#|P`+yFRbWO}vYDQPt5IKyg#?4y4Isme438_qIeE1tQ@3<8w)#UDqI&A*iMRBh zw<$5WC}b7SO~^`di(CS^V-RcJA?N3V1*^%d0nh1Xh6t+%12Z6X1^7m+UIyGTkantt zI3KYj7BfrlB4Mit(Fp$Ar%N+mzLQ#%SqMEczhAcIiv{63rVDij84N*9@Y-N5<4hbJ% zp}h$0dcT)4vWh4f?Yra-Vdj(_*?OOW6dl_8;aC06}*m%>vSA2k}?ov@ytH)gtK`fy6!a_&`ia1wVE*NOD zo{xoG-MvkCg;jB#;skV*5mu4+P2u3S(MAm?k7BdDq^vCxISH<$D6^}kFus{jB1 literal 0 HcmV?d00001 diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index aa3cc956cf..d7a378cf79 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -352,6 +352,18 @@ *** xref:mentions.adoc[Mentions] *** xref:mergetags.adoc[Merge Tags] *** xref:moxiemanager.adoc[MoxieManager] +**** xref:moxiemanager-installation.adoc[Installation] +**** xref:moxiemanager-integration.adoc[Integration] +**** xref:moxiemanager-options.adoc[Options] +**** xref:moxiemanager-plugins.adoc[Plugins] +**** xref:moxiemanager-api.adoc[API] +**** xref:moxiemanager-security.adoc[Security] +**** xref:moxiemanager-how-to-guides.adoc[How-to guides] +**** xref:moxiemanager-languages.adoc[Languages] +**** xref:moxiemanager-faq.adoc[FAQ] +**** Release information +***** xref:moxiemanager-changelog-php.adoc[MoxieManager PHP changelog] +***** xref:moxiemanager-changelog-dotnet.adoc[MoxieManager .NET changelog] *** xref:pageembed.adoc[Page Embed] *** xref:permanentpen.adoc[Permanent Pen] *** PowerPaste diff --git a/modules/ROOT/pages/moxiemanager-api.adoc b/modules/ROOT/pages/moxiemanager-api.adoc new file mode 100644 index 0000000000..ed075bf612 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-api.adoc @@ -0,0 +1,507 @@ += MoxieManager API +:navtitle: API +:description: MoxieManager JavaScript API methods and callbacks. +:keywords: moxiemanager, api, javascript, moxman, browse, upload, edit, view + +== Javascript API + +Here are some of the basic Javascript API integration methods. + +[cols=",",options="header",] +|=== +|Method |Description +|xref:#js-browse[browse] |Displays the file browser view. +|xref:#js-upload[upload] |Displays the upload view. +|xref:#js-edit[edit] |Displays the edit view. +|xref:#js-view[view] |Displays the gallery view. +|xref:#js-createdir[createDir] |Displays the create directory view. +|xref:#js-createdoc[createDoc] |Displays the create document view. +|=== + +If you are configuring this from in a {productname} init config you need to xref:moxiemanager-integration.adoc#tinymce-integration[check out the API here]. + +If you are using MoxieManager Stand-alone, first include this script. + +[source,html] +---- + +---- + +Then you can use these snipplets, either on buttons or wherever you like. + +[[js-browse]] +== `+browse+` + +This method allows you to browse for files in the MoxieManager and insert these into form fields or to a custom callback function. + +=== Parameters + +[cols="1,3",options="header"] +|=== +| Name | Description +|`+path+` a| +Public file system path to display by default. For example: `+/files/images +` + +In order to configure a different start path from the rootpath, the first part of the path needs to be the last part of the rootpath. So if your rootpath is `+/www/domain/myfiles+` then your path needs to be set to `+/myfiles/subfolder+` + +|`+rootpath+` |Public file system path to use as the root. This option needs to be within the configured backend `+filesystem.rootpath+` for security reasons. If you have xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath] configured to `+c:/inetpub/wwwroot+`, and want to constrict users to accessing `+c:/inetpub/wwwroot/files/images+`, you need to set this option to: `+/wwwroot/files/images+` +|`+fields+` |Comma separated list of field ID's to populate with selected file url. *If you are using oninsert you can not use fields option and the other way around.* +|`+view+` |Default view to open. Defaults to `+files+` but can also be configured to `+thumbs+`. +|`+insert+` |Boolean option that allows you to disable the insert functionallity. Can be used when the moxiemanager is used in standalone mode. +|`+filter+` |Initial filter to apply to file selection. This option will fill the filter input field with the value specified. +|`+extensions+` |Comma separated list of file extensions to display for. +|`+include_file_pattern+` |Regexp pattern that the files need to match inorder to be displayed. +|`+exclude_file_pattern+` |Regexp pattern that will be excluded from file list if it matches. +|`+include_directory_pattern+` |Regexp pattern that the directories need to mathc inorder to be displayed. +|`+exclude_directory_pattern+` |Regexp pattern that will be exluded from file list if it matches. +|`+disabled_tools+` |Comma separated list of tools to disable. +|`+hidden_tools+` |Comma separated list of tools to hide. +|`+url+` |Url of input file. If this is specified the MoxieManager will try to resolve the URL into a local file system path and the open the parent directory of that file and select the file. +|`+relative_urls+` |If this option is set to true, all URLs returned from the MoxieManager will be relative from the specified document_base_url. This option is set to false by default. +|`+document_base_url+` |Document base URL defaults to the current page. This is the point relative URLs will be relative to. +|`+no_host+` |Enables you to remove scheme/protocol and host name from urls produced. +|`+multiple+` |Boolean value, enable inserting multiple files or not, default true. +|`+width+` |Set the default width of the window, note that a to small value may break the UI. Should be a number pixel value only, example: width: 600 +|`+height+` |Set the default height of the window, note that a to small value may break the UI. Should be a number pixel value only, example: height: 400 +|`+fullscreen+` |Boolean value, set to true to open in fullscreen, default false. +|`+title+` |Sets the title of the main screen, replaces "MoxieManager" default title. +|`+leftpanel+` |Boolean value, display or hide the left filesystems panel, true by default. +|xref:moxiemanager-options.adoc#insert-filter[insert_filter] |Callback that gets executed when files are selected and inserted. This callback allows you to alter the JSON data before it gets inserted into a form field or passed to the oninsert callback. +|`+skin+` |Enables you to set a custom skin to be used. +|xref:moxiemanager-options.adoc#filelist-main-toolbar[filelist_main_toolbar] |Enables you to control what to display in the main toolbar of the filelist browse dialog. +|xref:moxiemanager-options.adoc#filelist-utils-toolbar[filelist_utils_toolbar] |Enables you to control what to display in the utils toolbar of the filelist browse dialog. +|xref:moxiemanager-options.adoc#filelist-manage-menu[filelist_manage_menu] |Enables you to configure what to display in the manage button menu. +|xref:moxiemanager-options.adoc#filelist-context-menu[filelist_context_menu] |Enables you to configure what to display in the context menu. +|xref:moxiemanager-options.adoc#filelist-insert-toolbar[filelist_insert_toolbar] |Enables you to configure what to display in the insert/cancel toolbar. +|xref:moxiemanager-options.adoc#editimage-main-toolbar[editimage_main_toolbar] |Enables you to control what to display in the main toolbar of the edit image dialog. +|xref:moxiemanager-options.adoc#editimage-zoom-toolbar[editimage_zoom_toolbar] |Enables you to control what to display in the zoom toobar of the edit image dialog. +|xref:moxiemanager-options.adoc#editimage-actions-toolbar[editimage_actions_toolbar] |Enables you to control what to display in the actions toolbar/pabel of the edit image dialog. +|`+fileinfo_fields+` |Space separated list of fields to display currently "path" and "url". +|xref:moxiemanager-options.adoc#remember-last-path[remember_last_path] |When enabled the MoxieManager will remember the last path the user was in when a file was selected. +|xref:moxiemanager-options.adoc#sort-by[sort_by] |Changes the default sort by column for file listings. +|xref:moxiemanager-options.adoc#sort-by[sort_order] |Changed the default sort order asc/desc. +|`+filelist_insert_event+` |Lets you specify an event to insert on can be click, dblclick or none. +|=== + +=== Events + +In version 2.0 of MoxieManager, some events where removed and added by requestion from the users, this is a list of these events. + +[cols="1,3",options="header"] +|=== +|Name |Description +|`+onopen+` |Event triggered when opening. +|`+onclose+` |Event triggered when closing. +|`+onupload+` |Event triggered when an upload is completed. +|`+onsave+` |Event triggered when a text file or image is edited. +|xref:#js-browse-oninsert[oninsert] |Event triggered when file is inserted. +|`+oncreate+` |Event triggered when folder is created. +|=== + +=== Examples + +==== Default path to browse files from + +[source,js] +---- +moxman.browse({ + path: '/files/images' +}); +---- + +==== Custom oninsert callback function + +[source,js] +---- +moxman.browse({ + oninsert: function(args) { + console.log(args.focusedFile); + } +}); +---- + +.On create event testing +[source,js] +---- +moxman.browse({ +    oncreate: function(args) { +        console.log(args); +    } +}); +---- + +.You can also use events when calling createDoc (or other dialogs) directly +[source,js] +---- +moxman.createDir({path: '/files', oncreate: alert('File created')}); +---- + +==== Browse files + +[source,html] +---- + +---- + +==== Pick files for input + +[source,js] +---- +moxman.browse({fields: 'url'}); +---- + +==== Pick files with callback + +[source,js] +---- +moxman.browse({ + oninsert: function(args) { + console.log(args.files[0].url); + } +}); +---- + +==== Get absolute urls + +[source,js] +---- +moxman.browse({fields: 'absurl', no_host: true}); +---- + +==== Browse images only + +[source,js] +---- +moxman.browse({ + view: 'thumbs', + fields: 'url', + extensions:'jpg,gif,png' +}); +---- + +==== Browse files only + +[source,js] +---- +moxman.browse({ + view: 'files', + fields: 'url', + extensions: 'txt' +}); +---- + +[[js-browse-oninsert]] +=== `+oninsert+` callback + +This callback function gets executed when users select files to be inserted. The callback has one argument with some properties. + +==== Properties + +List of properties for the callback args. + +[cols=",",options="header",] +|=== +| Name | Description +|`+focusedFile+` |File object for the currently focused file. This would normally be the first selected file if the user selects multiple files. +|`+files+` |FileCollection containing all files selected. +|=== + +Object returned is also an event. + +==== Example + +[source,js] +---- +moxman.browse({ + oninsert: function(args) { + console.log(args.focusedFile); + } +}); +---- + +Since its an event, you can prevent the window to close using this method: + +[source,js] +---- +moxman.browse({ + oninsert : function(args) { + console.log(args.focusedFile); + args.preventDefault(); + } +}); +---- + +[[js-upload]] +== `+upload+` + +This method allows you to upload files directly to the specified path. It also enables you to get the path and urls to those uploaded files. + +=== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+path+` |Public file system path to upload files to. +|`+onopen+` |Fires after the dialog has been opened. Can be used to produce a custom throbber. +|xref:#js-upload-onupload[onupload] |Callback that gets executed when files are uploaded. +|`+relative_urls+` |If this option is set to true, all URLs returned from the MoxieManager will be relative from the specified document_base_url. This option is set to false by default. +|`+document_base_url+` |Document base URL defaults to the current page. This is the point relative URLs will be relative to. +|`+remove_script_host+` |Enables you to remove scheme/protocol and host name from urls produced. +|`+upload_auto_close+` |Automatically closes the upload dialog if all files where successfully uploaded. Disabled by default. +|=== + +=== Example + +[source,js] +---- +moxman.upload({ + path: '/files/images', + onupload: function(args) { + console.log(args.files); + } +}); +---- + +[[js-upload-onupload]] +=== `+onupload+` callback + +This callback enables you to intercept the uploaded files. + +==== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+files+` |FileCollection instance with all the uploaded files. +|=== + +==== Example + +[source,js] +---- +moxman.upload({ + path: '/files/images', + onupload: function(args) { + console.log(args.files); + } +}); +---- + +[[js-edit]] +== `+edit+` + +This method enables you to edit images or text files directly by passing in a public path to a file. + +=== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+path+` |Public path to the file to edit. For example: `+/files/images/image.jpg+` +|`+onopen+` |Fires after the dialog has been opened. Can be used to produce a custom throbber. +|xref:#js-edit-onsave[onsave] |Callback that gets executed when an image or text file is saved. +|=== + +=== Example + +[source,js] +---- +moxman.edit({ + path: '/files/images/image.jpg', + onsave: function(args) { + console.log(args.file); + } +}); +---- + +==== Edit image + +[source,js] +---- +moxman.edit({ + path: '/files/teddybear.jpg', + onsave: function(result) { + alert(result.file.url); + } +}); +---- + +==== Edit text file + +[source,js] +---- +moxman.edit({ + path: '/files/test.txt', + onsave: function(result) { + alert(result.file.url); + } +}); +---- + +[[js-edit-onsave]] +=== `+onsave+` callback + +This callback gets executed when files are saves by the edit dialog. + +==== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+file+` | File instance of the file being saved. +|=== + +==== Example + +[source,js] +---- +moxman.edit({ + path: '/files/images/image.jpg', + onsave: function(args) { + console.log(args.file); + } +}); +---- + +[[js-view]] +== `+view+` + +This method enables you to view images in a specific path. + +=== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+path+` |Public file system path to the file to view. +|`+paths+` |Array of public file system paths to display. +|`+onopen+` |Fires after the dialog has been opened. Can be used to produce a custom throbber. +|=== + +=== Example + +[source,js] +---- +// View the specified image +moxman.view({ + path: '/files/images/image.jpg' +}); + +// View the specified images +moxman.view({ + paths: ['/files/images/image.jpg', '/files/images/otherimage.jpg'] +}); +---- + +==== View image + +[source,js] +---- +moxman.view({ + path: '/testfiles/camera.jpg' +}); +---- + +[[js-createdir]] +== `+createDir+` + +This method enables you to create a directory in the specified path. + +=== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+path+` |Public file system path where the dir should be created. +|xref:#js-createdir-oncreate[oncreate] |Callback that gets executed when the directory is created. +|`+onopen+` |Fires after the dialog has been opened. Can be used to produce a custom throbber. +|=== + +=== Example + +[source,js] +---- +moxman.createDir({ + path: '/files/images', + oncreate: function(args) { + console.log(args.file); + } +}); +---- + +[[js-createdir-oncreate]] +=== `+oncreate+` callback + +This callback gets executed when a directory is created by the createDir method. + +==== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+file+` |File instance of the created directory. +|=== + +==== Example + +[source,js] +---- +moxman.createDir({ + path: '/files/images', + oncreate: function(args) { + console.log(args.file); + } +}); +---- + +[[js-createdoc]] +== `+createDoc+` + +This method enables you to create a document in the specified path. + +=== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+path+` |Public file system path where the document should be created. +|xref:#js-createdoc-oncreate[oncreate] |Callback that gets executed when the document is created. +|`+onopen+` |Fires after the dialog has been opened. Can be used to produce a custom throbber. +|=== + +=== Example + +[source,js] +---- +moxman.createDoc({ + path: '/files/images', + oncreate: function(args) { + console.log(args.file); + } +}); +---- + +[[js-createdoc-oncreate]] +=== `+oncreate+` callback + +This callback gets executed when a document is created by the createDoc method. + +==== Parameters + +[cols=",",options="header",] +|=== +|Name |Description +|`+file+` |File instance of the created document. +|=== + +==== Example + +[source,js] +---- +moxman.createDoc({ + path: '/files/images', + oncreate: function(args) { + console.log(args.file); + } +}); +---- diff --git a/modules/ROOT/pages/moxiemanager-changelog-dotnet.adoc b/modules/ROOT/pages/moxiemanager-changelog-dotnet.adoc new file mode 100644 index 0000000000..2454ef4de6 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-changelog-dotnet.adoc @@ -0,0 +1,734 @@ += Changelog: MoxieManager .NET version +:navtitle: MoxieManager .NET changelog +:description: Changes in each release of the .NET version of MoxieManager. +:keywords: moxiemanager, changelog, .net, release + +== 3.0.0 - 2024-12-13 + +=== Removed + +* Removed GoogleDrive plugin due to changes in Google's API. + +== 2.1.14 - 2022-02-07 + +=== Added + +* Added compatibility with tinymce v6. + +=== Improved + +* Improved UX experience while using the search field and selecting found files. + +=== Changed + +* Allow uploading any filetypes (extensions) on iOS devices. + +== 2.1.13 - 2019-09-25 + +=== Fixed + +* Fixed bug where the tinymce v5 insert button was missing the tooltip. #MM-121 + +== 2.1.12 - 2019-04-25 + +=== Fixed + +* Fixed bug where an error would be thrown if the dialog was closed while the file list was loading. #MM-118 +* Fixed bug where it wasn't possible to download folders like in the PHP version. #MM-117 + +== 2.1.11 - 2018-11-14 + +=== Fixed + +* Fixed bug where the hidden_tools option wouldn't apply if you switched file system. #MM-113 +* Fixed bug where downloads of many files would result in a to long query string. #MM-111 + +== 2.1.10 - 2018-04-13 + +=== Fixed + +* Fixed bug z indexes wasn't computed right if used with a tinymce instance and standalone at the same time. + +== 2.1.9 - 2018-01-31 + +=== Fixed + +* Fixed bug where the throbber would throw an error if you switched view to fast while files where loading. + +== 2.1.8 - 2017-12-08 + +=== Fixed + +* Fixed basic api for adding custom menu items. +* Fixed bug where it wasn't possible to upload images on ios. +* Fixed bug where where the import file support wasn't working correctly. + +== 2.1.7 - 2017-04-03 + +=== Fixed + +* Fixed issue with checkbox column having text ellipsis on Chrome. +* Fixed bug where utf-8 characters wasn't handled correctly for Amazon S3 file systems. + +== 2.1.6 - 2017-02-01 + +=== Added + +* Added new open menu item that allows you to open a file in a new browser tab. + +=== Fixed + +* Fixed bug where it wasn't possible to tap the upload button to upload files on an iPad. +* Fixed bug where files would be sorted incorrectly if they started with "!". +* Fixed bug where files with "!" wouldn't be handled correctly on AmazonS3. + +== 2.1.5 - 2016-10-10 + +=== Fixed + +* Fixed so delete menu item is disabled when the selected files can't be deleted. +* Fixed xss issue with error message presented when a path can't be resolved. +* Fixed bug where thumbnail directories would be created even if thumbnails where disabled. +* Fixed security issues with download/zip and unzip these are now way more strict. +* Fixed bug where view multiple files wouldn't properly render the file names. +* Fixed bug where some menus in Firefox had scrollbars rendered due to font kerning. +* Fixed bug where it was possible to do operations on the ".." directory thumbnail item. +* Fixed bug where urls resolving to a directory would select the directory. +* Fixed bug with self signed ssl certificates not working for s3/azure. +* Fixed bug where listing files on some ftp servers with odd user names didn't work properly. +* Fixed so date_format can be passed in as a client side config option. +* Fixed so unique thumbnail urls take into account if there is an existing query string parameter. +* Fixed tinymce 3.x compatibility issues with z-ordering of dialogs. + +== 2.1.4 - 2016-04-25 + +=== Fixed + +* Fixed so the container isn't appended to the urlprefix. Might break existing installations. + +== 2.1.3 - 2016-04-08 + +=== Fixed + +* Fixed bug where some error messages wasn't handled properly due to localization. +* Fixed bug where an error was thrown when saving images. +* Fixed bug where the throbber wouldn't be disabled in the image save dialog if you canceled the action. + +== 2.1.2 - 2016-03-31 + +=== Added + +* Added cache control to azure file system. Allows you to override the default HTTP cache-control header. +* Added better error messages when the quota exceeds. Enables you to translate them. + +=== Fixed + +* Fixed bug with the Quota plugin where it wasn't possible to disable checking by setting size to 0. +* Fixed bug where flipping of alpha transparent PNG images would produce an incorrect image. +* Fixed bug where some errors wasn't handled correctly on the client side. +* Fixed bug where files generated by autoformat would be visible even if they where filtered out on the server. +* Fixed bug where the upload button disabled state wasn't working properly. +* Fixed bug where some thumbnails wasn't rendered properly if they contained characters that needed encoding. +* Fixed bug where the file name length input boxes wasn't constrained in length. +* Fixed bug where the caret would jump when updating text fields on firefox. +* Fixed so the upload button becomes a button when only one upload method is available. +* Fixed so edit/rename menu items becomes disabled when more than one file is selected. +* Fixed so edit image asks the user to overwrite the file or not. +* Fixed so dialog gets repositioned inside the editor if the window changes in size. +* Fixed a bug with the FTP plugin that prevented thumbnails from being created. +* Fixed some issues with FTP plugin performance, should now respond faster against slow FTP servers. + +== 2.1.1 - 2016-01-12 + +=== Fixed + +* Fixed bug where saving images wouldn't work in edit image dialog. +* Fixed so thumbnail and image sizes gets populated even if the server can't read the files. + +== 2.1.0 - 2015-12-21 + +=== Added + +* Added new flat skin similar to match the latest tinymce version. +* Added throbber to image editing if the image takes a long time to load. +* Added throbber to upload from external locations like Google drive or Dropbox. + +=== Fixed + +* Fixed so autoformat shows files generated when uploading. +* Fixed so autoformat removed files from file list when deleting. + +== 2.0.11 - 2015-12-11 + +=== Fixed + +* Fixed bug with copy/move on files with thumbnails not working correctly when to and from file had same name. +* Fixed a regression issue with setting rootpath using js options cause favorites/history/uploaded to fail. + +== 2.0.10 - 2015-11-18 + +=== Fixed + +* Fixed bug where delete of favorites/history/uploaded would display a write access error. +* Fixed bug where local files where being locked by the download handler. + +== 2.0.9 - 2015-11-02 + +=== Fixed + +* Fixed bug where url resolvement didn't properly handle client side rootpaths. + +== 2.0.8 - 2015-09-06 + +=== Added + +* Added new file info dialog that displays the path and url for the selected file. + +=== Fixed + +* Fixed bug insert/close user settings would properly disable the insert button and block close actions. +* Fixed bug where certain CKEditor plugins stopped working when moxiemanager was added. + +== 2.0.7 - 2015-09-28 + +=== Added + +* Added new filesystem.overwrite_action that enables setting a default action to take when a file exists. + +=== Improved + +* Improved the error message for internal server errors caused by external code. + +=== Fixed + +* Fixed bug where url prefixes with custom domains for Azure wasn't working correctly. +* Fixed bug where the Azure file system plugin didn't work for the new type of Azure containers. +* Fixed so imports is checked for existance before importing from Dropbox/Google drive. + +== 2.0.6 - 2015-08-13 + +=== Fixed + +* Fixed bug where the path setting wouldn't work properly when integrating with tinymce. + +== 2.0.5 - 2015-06-30 + +=== Added + +* Re-added onclose callback handler this will now fire for all api methods that open windows. + +=== Fixed + +* Fixed so remember_last_path setting works as it used to pre 2.0. + +== 2.0.4 - 2015-05-18 + +=== Fixed + +* Fixed bug where the zoom slider in the edit image dialog didn't properly update when zooming using zoom fit. +* Fixed so standalone image editing does overwrites by default. Save as field can be re-enabled by the show_save_as option. +* Fixed bug where the overwrite confirm dialog wouln't appear when the file name was renamed by the autorename plugin. +* Fixed bug it wasn't possible to upload files on IE 9 when Flash didn't properly initialize. +* Fixed bug where drag/drop of files in older IE:s wouldn't be properly blocked. + +== 2.0.3 - 2015-05-07 + +=== Added + +* Added confirm dialog to save image the user can now decide what to do when the target file exists. + +=== Fixed + +* Fixed bug where z-index wasn't properly set to a higher value used by {productname}. +* Fixed bug where the Favorites/History/Uploaded plugins would sometinmes throw an exception on duplicate keys. + +== 2.0.2 - 2015-05-04 + +=== Fixed + +* Fixed bug where thumbnails/inserts from AmazonS3 could produce an incorrect output url. +* Fixed bug where the urlprefix wouln't be defaulted to the AmazonS3 client endpoint url. +* Fixed bug where the CustomInfo event wasn't able to mutate the file json meta data. +* Fixed bug where files/directories with non ascii characters wasn't properly handled on S3. + +== 2.0.1 - 2015-04-30 + +=== Fixed + +* Fixed bug where edit text file wouldn't properly handle error messages. +* Fixed bug where it wasn't possible to override filesystem.directories using sessions in a flat structure. +* Fixed bug where it wasn't possible to open a directory just created. +* Fixed bug where favorites/history/deleted didn't show the correct menu items. +* Fixed so a better error message gets displayed when a file can't be uploaded due to invalid extension. +* Fixed so all uploaded files gets selected properly if there are many uploaded in a single operation. + +== 2.0.0 - 2015-04-29 + +=== Added + +* Added inline mode for uploads makes it way faster to upload files. +* Added throbber while lazy loading the MoxieManager from {productname} or using the loader.min.js file. +* Added drag/drop upload support for uploading files directly in file view. +* Added a confirm dialog for all uploads/paste operations. +* Added new events callbacks to moxman.browse such as oncreate or onsave. +* Added new tablet support makes it easier to use the MoxieManager on for example an iPad. +* Added V4 Amazon S3 authentication method this fixes issues with the frankfurt node. +* Added support for proxy server for all HTTP requests using the new general.http_proxy setting. +* Added support for picking and importing files from Microsoft One Drive. +* Added new filelist_insert_event option to control insert click behavior can be set to click/dblclick or none. +* Added new force_upload_dialog option lets you force the usage of an upload dialog. +* Added new unique_urls option to add unique suffix to all produced urls to bust caching. +* Added new cache_control and acl setting to AmazonS3 to control how the files are uploaded. + +=== Improved + +* Optimized Amazon S3 client API so it's faster and uses less memory. + +=== Removed + +* Removed the onopen/onclose callbacks since these where mainly used for custom throbbers. +* Removed the Filesystems title since it wasn't really useful. + +=== Fixed + +* Fixed so cache_prefix from {productname} and suffixes on the loader script gets added as cache busting. +* Fixed so the client rootpath setting is a lot smarter so it's possible to really define custon client rootpaths. +* Fixed so context menu can be closed using the Esc key. +* Fixed so the leftside panel gets a scrollbar if there isn't enough space. +* Fixed bug where empty directories wouldn't load properly when the cache layer was enabled. +* Fixed bug where it wasn't possible to set custom sub paths on the Azure file systems. + +== 1.3.20 - 2014-11-20 + +=== Added + +* Added new upload_auto_close option. Enables the upload dialog to automatically close when all files uploaded successfully. + +=== Fixed + +* Fixed bug where only one directory element would work for the filesystem.directories option. +* Fixed bug where the throbber would lock up if a critical server error occured while listing files. +* Fixed so the upload button is disabled until files are properly selected to be uploaded. + +== 1.3.19 - 2014-10-21 + +=== Fixed + +* Fixed bug where content type of uploaded files to azure blob storage didn't get the correct mime type. +* Fixed bug where file names with commas wouldn't be properly downloaded as a zip file. + +== 1.3.18 - 2014-09-29 + +=== Added + +* Added new acl option to Amazon S3 plugin that allows you to set custom acl permissions. + +=== Fixed + +* Fixed so AmazonS3 updates the acl permissions when renaming/moving files. +* Fixed compatibility issue with labels not rendering properly when using bootstrap. +* Fixed bug where special characters like "#" in file names would cause the URL output to break. + +== 1.3.17 - 2014-09-19 + +=== Added + +* Added new unique_url option to allow urls to be padded with a unique cache busting id. + +=== Fixed + +* Fixed bug where thumbnails wasn't being reloaded properly when you edited images using the edit image tool. +* Fixed bug where paths where encoded wrong when inserted to MoxieManager causing no file being selected. +* Fixed bug where paths that didn't existed produced an error, now it falls back to the parent folder. + +== 1.3.16 - 2014-09-04 + +=== Changed + +* Reworked csrf logic to not use client side cookies but instead verify the token validity. + +== 1.3.15 - 2014-09-03 + +=== Added + +* Added csrf security logic to improve security by validating security tokens. + +=== Fixed + +* Fixed issue with file systems being cached locally on the frontend and not updated properly. + +== 1.3.14 - 2014-08-27 + +=== Fixed + +* Fixed bug where non statically positioned body would place the context menu at an incorrect position. +* Fixed bug where the menus would be incorrectly positioned on IE 8 if you scrolled the body down. + +== 1.3.13 - 2014-07-28 + +=== Added + +* Added onopen event callback this gets fired when a action dialog is opened for example when the moxman.browse call is made. + +=== Fixed + +* Fixed so moxiemanager uses the same language as the one set in tinymce if that language pack doesn't exist it will fallback to English. +* Fixed so gif image editing is forced server side since browsers can't save gif data. +* Fixed the image resizing logic to it uses hermite resamling on the client side for better results. + +== 1.3.12 - 2014-06-18 + +=== Fixed + +* Fixed issue with filters not applying properly on uploaded files. +* Fixed bug where FTP plugin wasn't working properly for FTP servers listing files in Windows format. +* Fixed bug where the insert option wasn't working properly if you clicked on the file name in file list. + +== 1.3.11 - 2014-05-15 + +=== Fixed + +* Fixed bug where contextmenu would automatically close on Firefox running on Mac. +* Fixed bug where contextmenu wouldn't be constrained to the current window viewport. +* Fixed bug where the UTF8 BOM would be streamed out in plugin JS contents breaking on IIS servers with gzip enabled. +* Fixed so insert is done when clicking on the file name in file lists so it faster to insert single files. +* Fixed so multiple wwwroot/urlprefix/urlsuffixes can be configured for the local file system. + +== 1.3.10 - 2014-04-30 + +=== Added + +* Added event logic to oninsert callback, can now prevent dialog from closing for example. + +=== Fixed + +* Fixed so the add favorite menu item get properly displayed and can be configure into manage/context menus. +* Fixed bug where files with the same name in favorites/history/uploaded woudln't work properly. + +== 1.3.9 - 2014-04-24 + +=== Added + +* Added new client side options for enabling/disabling all buttons and menu items. +* Added option "rename" to "upload.overwrite", files uploaded will get unique names if file exists. + +=== Fixed + +* Fixed issue with Ftp plugin breaking on symlink files/folders, now ignores symlinks. +* Fixed bug where right clicking on a folder didn't properly select that specific folder. +* Fixed bug where thumbnail folder was not deleted if last thumbnail was deleted in it. +* Fixed so configured uppercase Amazon S3 bucket names produces an error message since they are invalid. + +== 1.3.8 - 2014-04-09 + +=== Added + +* Added new endpoint option to Amazon S3 plugin to configure region or custom domain for API calls. + +=== Fixed + +* Fixed a bug where disabled/hidden tools was not picked up correctly from configuration. +* Fixed bug where urls wasn't properly produced for files with % characters in the file names. +* Fixed bug where quota plugin would increase the current storage size even if an upload failed. +* Fixed bug where it wasn't possible to click thumbnails on subdirectories to navigate deeper. + +== 1.3.7 - 2014-04-02 + +=== Added + +* Added support for skins using the skin option will allow you to load custom skins. + +=== Fixed + +* Fixed bug where it wasn't possible to scope the path for AmazonS3 using s3://bucket/path. +* Fixed bug where GoogleDrive file import didn't save with correct extension. +* Fixed bug where GoogleDrive file import failed on documents with weird characters. + +== 1.3.6 - 2014-03-24 + +=== Fixed + +* Fixed so older Safari 5.1 uses Flash/Silverlight as it's uploader runtime since it isn't W3C compatible. +* Fixed bug where the ExternalAuthenticator would throw an error exception if the user key wasn't present. +* Fixed bug where Azure/Amazon S3 would display an incorrect date/time for directories instead of a dash. +* Fixed bug where Favorites/History wouldn't list target directories properly. + +== 1.3.5 - 2014-03-10 + +=== Added + +* Added support for inserting video files using the insertfile button in {productname}. + +=== Changed + +* Rewrote quota plugin to handle remote file systems correctly and block all types of file updated. + +=== Removed + +* Removed the updated file action event since it's basically a delete and add action. + +=== Fixed + +* Fixed so it doesn't do multiple requests on double clicks when listing directories. +* Fixed bug where IE 8 would throw exceptions if you specified extensions using client side options. +* Fixed bug where Azure/AmazonS3 wouldn't properly handle files/directories with spaces in them. +* Fixed bug in Azure plugin where file names with non ascii file names wasn't properly encoded. +* Fixed bug where it wasn't possible to access other file systems when the rootpath was specified on the client. + +== 1.3.4 - 2014-02-11 + +=== Added + +* Added filter options for the delete command. This allows you to block delete on specific file or directories. + +=== Fixed + +* Fixed bug where the thumbnails.enabled would still create thumbnail directory when moving/copying files. +* Fixed bug where a copy of a file to an directory with an existing file with the same name would add a double dot. +* Fixed bug where it wasn't possible to switch between file systems when the view option was passed in. +* Fixed bug where it wasn't possible to switch view type if the view option was passed in. +* Fixed bug where the remember_last_path option would cause issues when enabled while having multiple rootpaths. +* Fixed bug where extension was not properly identified, could cause issues with thumbnails etc. +* Fixed so options can be excluded from the web.config some users tends to reduce the web.config manually. + +== 1.3.3 - 2014-01-29 + +=== Fixed + +* Fixed bug where it wasn't possible to override the filesystem.rootpath using the SessionAuthenticator. +* Fixed bug where url to file resolve logic would fail when having multiple root paths pointing to the same bucket. +* Fixed so Azure/AmazonS3 config options can be overridden by the SessionAuthenticator using sessions. +* Fixed so the urlprefix for AmazonS3 doesn't automatically add any bucket. So it needs to be specified correctly. + +== 1.3.2 - 2014-01-22 + +=== Added + +* Added insert_filter callback function that lets you override the JSON structure before it gets inserted into forms. +* Added new cache-control config option for AmazonS3 buckets. This enables you to control the cache-control header for files uploaded. + +=== Fixed + +* Fixed so protocol relative urlprefixes can be used for converting file paths to urls. For example //tinymce.com/myfile.gif. + +== 1.3.1 - 2014-01-08 + +=== Added + +* Added basic CKEditor support. It replaces the "browse server" buttons in image/file dialogs. + +=== Fixed + +* Fixed bug where the client side configured extensions wasn't properly extended/inherited in upload dialog. +* Fixed bug where extensions in directory names would change the icon from a folder to a file type. +* Fixed so folders without any date returned for them will display a "-" instead for example on S3. +* Fixed so the AmazonS3 urlprefix option can be used to handle custom domains. + +== 1.3.0 - 2013-12-19 + +=== Changed + +* Changed ICommand/ICommandHandler Execute method to use CommandArguments instead of a plain Dictionary. + +=== Removed + +* Removed BaseHttpHandler and replaced it with IApiHandler that better supports unit testing. + +=== Fixed + +* Fixed bug where the last modification date for local file system wasn't converted to UTC. +* Fixed bug where the last modification date for AmazonS3 wasn't properly parsed and converted to UTC. +* Fixed bug where throbber wasn't working properly due to a CSS skin issue. +* Fixed bug where modal block wasn't working properly due to a CSS skin issue. + +== 1.2.1 - 2013-11-29 + +=== Added + +* Added new date_format option that enables you to specify the format to be used for dates in JSON output. +* Added new nameWithoutExtension and extension to file JSON output. + +=== Changed + +* Normalized output for all API functions so that it's pure JSON and contains meta data. + +=== Removed + +* Removed text for rotate/flip image buttons and replaced them with tooltips to fix i18n issues. + +=== Fixed + +* Fixed bug where some filter field expressions would cause an server exception to occur. +* Fixed bug where the upload dialog extensions field wouldn't wrap if there where to many to fit one line. +* Fixed so it's possible to move files on FTP file systems and between other file systems. +* Fixed so the upload dialog filter out any extensions that isn't present in the client side extensions setting. + +== 1.2.0 - 2013-11-14 + +=== Added + +* Added new Azure Blob Storage support. Available for the Enterprise version only. +* Added new filesystem.directories option that allows you to override configs based on path patterns. + +=== Fixed + +* Fixed bug where IE 8 wouldn't properly load images when rendered in quirks mode. +* Fixed bug where IE 8 couldn't retrive the width/height of images properly when inserted from a non local file system. +* Fixed bug where empty authenticator string caused issues and prevented this configuration mode. +* Fixed bug where error messages wasn't thrown when deleting/copying/moving directories on S3 or Azure. +* Fixed bug where urls wasn't properly resolved to files for Amazon S3. +* Fixed bug where it wasn't possible to copy files between local file system and Amazon S3 file system. +* Fixed bug where the uploaded file plugin wouldn't add files when autoformat plugin was enabled. +* Fixed so the progress of uploads stays at 99% until fully completed for example when using S3 or Azure. + +== 1.1.4 - 2013-11-05 + +=== Fixed + +* Fixed bug where S3 couldn't be properly restricted to specified root path. +* Fixed bug where column sort order wasn't properly synchronized between grid and sort menu button. +* Fixed bug where the logout button would be displayed even if the authenticator(s) wasn't standalone. + +== 1.1.3 - 2013-10-31 + +=== Added + +* Added edit.encoding and edit.line_endings options to control input/output when editing text files. + +=== Fixed + +* Fixed bug where URLs generated for HTTPs would include the port number 443 even though this is redundant. +* Fixed bug where the upload dialog wasn't able to pick files on IE 11. +* Fixed bug where the layout of the upload dialog was incorrect on IE 11 due to sub pixel calculations. +* Fixed bug where local overrides for filesystem.writable wouldn't allow files to be created/deleted. + +== 1.1.2 - 2013-10-17 + +=== Fixed + +* Fixed bug where sorting by date would thrown an server exception. +* Fixed bug where delete/cut operation could take place on directories blocked by _ prefixed mc_access options. +* Fixed bug where contextmenu wouldn't be shown due to a missing permission check. + +== 1.1.1 - 2013-10-10 + +=== Added + +* Added new path and paths options to moxman.view API method call. + +=== Fixed + +* Fixed so it renders properly on legacy browsers IE 7/IE 8. +* Fixed bug where the sort menu button wouldn't be in sync with the file list sorting. +* Fixed bug where disabled_tools/hidden_tools global settings wouldn't work properly. +* Fixed bug where the {productname} image dialog image dimensions wasn't updated properly on IE 10. +* Fixed so view dialog displays only the selected images. Makes it easier to compare images. +* Fixed bug where _ prefixed filesystem.readable/filesystem.writable would allow operations on directories. + +== 1.1 - 2013-09-10 + +=== Added + +* Added new infinite scroll feature for handling of large ammout of files. + +=== Improved + +* Optimized thumbnail loading performance by loading thumbs directly when possible. + +=== Fixed + +* Fixed so thumbnails gets loaded directly from remote file systems like S3 when possible. +* Fixed bug where closing a window in fullscreen mode would produce window scrollbars. +* Fixed issue where AmazonS3 wouldn't list more than 1000 file/folders, limit set to 5000. + +== 1.0.6 - 2013-08-21 + +=== Added + +* Added new feature and option, thumbnail.mode, if set to "crop" will make thumbnails using crop instead of default resize. + +=== Fixed + +* Fixed bug where filter feature would throw js exception and not enable users to select files. +* Fixed bug where the throbber for long operations wasn't activated correctly. +* Fixed bug with S3 Plugin where files got Content-Disposition set when not needed. + +== 1.0.5 - 2013-08-06 + +=== Added + +* Added advanced debugging option, set general.debug to true and access /api.ashx?action=debug + +=== Fixed + +* Fixed bug where it would throw an Environment exception on Medium trust when accessing the temp directory. +* Fixed bug where UNC paths wasn't handled handled properly. +* Fixed bug where fullscreen mode wouldn't cover the whole viewport. +* Fixed bug where it wasn't possible to select files that didn't match a valid mime type.C:\inetpub\wwwroot\moxiemanager-net\src\MoxieManager.Web.UI\changelog.txt +* Fixed bug where images with 1 pixel width/height wouldn't scale down to proper thumbnails. +* Fixed bug where save image didn't work on IE 9 since the Flash XHR fallback wasn't loading properly. +* Fixed so you can override the auth user name from using the ExternalAuthenticator. + +== 1.0.4 - 2013-07-18 + +=== Fixed + +* Fixed bug where it wouldn't properly parse URLs without protocol like //domain/path. +* Fixed bug where username in the session authenticator wouldn't update the user instance. +* Fixed bug where all urls would get converted when having mixed file systems. +* Fixed bug where urls wasn't properly produced when inserting files from AmazonS3. +* Fixed bug where moving/renaming/copying images didn't move/rename/copy the thumbnail file as well. +* Fixed bug with spaces not working on file names in Amazon S3. +* Fixed bug where contextmenu would be positioned at an incorrect postion when scrolling the page. +* Fixed so it's possible to edit any plain text file not just txt, html etc. +* Fixed so the thumbnail_url meta item is properly populated on non local file systems. + +== 1.0.3 - 2013-06-26 + +=== Added + +* Added view file support for non image types such as PDF and HTML files. +* Added keep alive heartbeat logic to prevent session timeouts. + +=== Fixed + +* Fixed bug where detecting site wwwroot was case sensitive. +* Fixed bug where editing of images with uppercase extensions didn't work. + +== 1.0.2 - 2013-06-13 + +=== Added + +* Added new proxy option to Amazon S3 buckets (host:port), mostly for internal debugging. + +=== Fixed + +* Fixed bug with Apply button in image edit not working properly. +* Fixed issue with Quota plugin running on remote filesystems. +* Fixed issue with Amazon S3 integration causing connection errors. + +== 1.0.1 - 2013-06-11 + +=== Added + +* Added new sort_by and sort_order options to control default sorting. +* Added new moxiemanager__settings option to {productname} plugin. + +=== Fixed + +* Fixed bug where SessionAuthenticator would produce exception on casting session key to bool. +* Fixed bug where AutoFormat %f included the extension. +* Fixed bug where ExternalAuthenticator would return false even if authorized. +* Fixed bug where the config wasn't extended properly. +* Fixed bug where config variables wasn't properly replaced. +* Fixed bug where language pack wouldn't load when used with {productname}. +* Fixed bug where sorting of dates could produce strange results. +* Fixed bug where mc_access files couldn't include equal characters in it's values. +* Fixed bug where MoxieManager wouldn't provide an error for urls on files outside the wwwroot. +* Fixed issue with file extension not being automatically set on files on save in image editor. + +== 1.0 - 2013-06-05 + +=== Added + +* First public version of MoxieManager.NET. diff --git a/modules/ROOT/pages/moxiemanager-changelog-php.adoc b/modules/ROOT/pages/moxiemanager-changelog-php.adoc new file mode 100644 index 0000000000..8ad1bcfe13 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-changelog-php.adoc @@ -0,0 +1,1006 @@ += Changelog: MoxieManager PHP version +:navtitle: MoxieManager PHP changelog +:description: Changes in each release of the PHP version of MoxieManager. +:keywords: moxiemanager, changelog, php, release + +== 4.0.0 - 2024-12-13 + +=== Removed + +* Removed GoogleDrive plugin due to changes in Google's API. + +=== Fixed + +* Fixed high level security issue with the installer. +* Fixed various PHP 8+ compatibility issues. + +== 3.0.0 - 2023-05-04 + +=== Added + +* Added support for PHP 8.2 and removed support for PHP 7.x since it's end of life. + +=== Fixed + +* Fixed so the file path encoding is UTF-8 for Windows instead of Windows-1252. +* Fixed issue with implicit convert from float to int in ImageAlter. + +== 2.1.15 - 2022-02-07 + +=== Improved + +* Better sorting files by filenames. If a filename contains only digits, it will be sorted by comparing names as digits. +* Improved UX experience while using the search field and selecting found files. + +=== Changed + +* Allow uploading any filetypes (extensions) on iOS devices. + +=== Fixed + +* Fixed compatibility issues with PHP 8. + +== 2.1.14 - 2020-02-06 + +=== Fixed + +* Fixed bug where file info calls on non existing files would throw error on PHP 7.4.x. + +== 2.1.13 - 2019-09-25 + +=== Fixed + +* Fixed bug where the tinymce v5 insert button was missing the tooltip. #MM-121 + +== 2.1.12 - 2019-04-25 + +=== Fixed + +* Fixed bug where an error would be thrown if the dialog was closed while the file list was loading. #MM-118 + +== 2.1.11 - 2018-11-14 + +=== Fixed + +* Fixed bug where the hidden_tools option wouldn't apply if you switched file system. #MM-113 +* Fixed bug where downloads of many files would result in a to long query string. #MM-111 + +== 2.1.10 - 2018-04-13 + +=== Fixed + +* Fixed bug z indexes wasn't computed right if used with a tinymce instance and standalone at the same time. + +== 2.1.9 - 2018-01-31 + +=== Fixed + +* Fixed bug where the throbber would throw an error if you switched view to fast while files where loading. + +== 2.1.8 - 2017-12-08 + +=== Fixed + +* Fixed basic api for adding custom menu items. +* Fixed bug where it wasn't possible to upload images on ios. +* Fixed bug where where the import file support wasn't working correctly. + +== 2.1.7 - 2017-04-03 + +=== Fixed + +* Fixed issue with checkbox column having text ellipsis on Chrome. + +== 2.1.6 - 2017-02-01 + +=== Added + +* Added new open menu item that allows you to open a file in a new browser tab. + +=== Fixed + +* Fixed bug where it wasn't possible to tap the upload button to upload files on an iPad. +* Fixed bug where files would be sorted incorrectly if they started with "!". + +== 2.1.5 - 2016-10-10 + +=== Fixed + +* Fixed so delete menu item is disabled when the selected files can't be deleted. +* Fixed xss issue with error message presented when a path can't be resolved. +* Fixed bug where thumbnail directories would be created even if thumbnails where disabled. +* Fixed security issues with download/zip and unzip these are now way more strict. +* Fixed bug where view multiple files wouldn't properly render the file names. +* Fixed bug where some menus in Firefox had scrollbars rendered due to font kerning. +* Fixed bug where it was possible to do operations on the ".." directory thumbnail item. +* Fixed bug where urls resolving to a directory would select the directory. +* Fixed bug with self signed ssl certificates not working for s3/azure. +* Fixed bug where listing files on some ftp servers with odd user names didn't work properly. +* Fixed so date_format can be passed in as a client side config option. +* Fixed so unique thumbnail urls take into account if there is an existing query string parameter. +* Fixed tinymce 3.x compatibility issues with z-ordering of dialogs. + +== 2.1.4 - 2016-04-25 + +=== Fixed + +* Fixed so the container isn't appended to the urlprefix. Might break existing installations. + +== 2.1.3 - 2016-04-12 + +=== Fixed + +* Fixed bug where some error messages wasn't handled properly due to localization. +* Fixed bug where an error was thrown when saving images. +* Fixed bug where the throbber wouldn't be disabled in the image save dialog if you canceled the action. + +== 2.1.2 - 2016-03-31 + +=== Added + +* Added cache control to azure file system. Allows you to override the default HTTP cache-control header. +* Added better error messages when the quota exceeds. Enables you to translate them. + +=== Fixed + +* Fixed bug with the Quota plugin where it wasn't possible to disable checking by setting size to 0. +* Fixed bug where flipping of alpha transparent PNG images would produce an incorrect image. +* Fixed bug where some errors wasn't handled correctly on the client side. +* Fixed bug where files generated by autoformat would be visible even if they where filtered out on the server. +* Fixed bug where the upload button disabled state wasn't working properly. +* Fixed bug where some thumbnails wasn't rendered properly if they contained characters that needed encoding. +* Fixed bug where the file name length input boxes wasn't constrained in length. +* Fixed bug where the caret would jump when updating text fields on firefox. +* Fixed so the upload button becomes a button when only one upload method is available. +* Fixed so edit/rename menu items becomes disabled when more than one file is selected. +* Fixed so edit image asks the user to overwrite the file or not. +* Fixed so dialog gets repositioned inside the editor if the window changes in size. + +== 2.1.1 - 2016-01-12 + +=== Fixed + +* Fixed bug where saving images wouldn't work in edit image dialog. +* Fixed so thumbnail and image sizes gets populated even if the server can't read the files. + +== 2.1.0 - 2015-12-21 + +=== Added + +* Added new flat skin similar to match the latest tinymce version. +* Added throbber to image editing if the image takes a long time to load. +* Added throbber to upload from external locations like Google drive or Dropbox. + +=== Fixed + +* Fixed bug where authenticator couldn't properly update the filesystem.directory config. +* Fixed so autoformat shows files generated when uploading. +* Fixed so autoformat removed files from file list when deleting. +* Fixed an issue with cache_header not setting the correct value for Amazon S3 if configured. + +== 2.0.10 - 2015-12-11 + +=== Fixed + +* Fixed an issue preventing the use in PHP 7, now fully supports PHP 7. +* Fixed a bug with copying a file to the same folder it was in caused an exception, now just ignores the operation. +* Fixed bug with copy/move on files with thumbnails not working correctly when to and from file had same name. +* Fixed a regression issue with setting rootpath using js options cause favorites/history/uploaded to fail. + +== 2.0.9 - 2015-11-02 + +=== Fixed + +* Fixed bug where url resolvement didn't properly handle client side rootpaths. +* Fixed bug where uploads from dropbox would produce an file exists error even if the file didn't exist. + +== 2.0.8 - 2015-09-06 + +=== Added + +* Added new file info dialog that displays the path and url for the selected file. + +=== Fixed + +* Fixed bug where certain CKEditor plugins stopped working when moxiemanager was added. +* Fixed bug where copyTo command wasn't working properly on Azure. +* Fixed bug insert/close user settings would properly disable the insert button and block close actions. +* Fixed bug where the cache layer wouldn't properly update read/write state attributes. + +== 2.0.7 - 2015-09-28 + +=== Added + +* Added new filesystem.overwrite_action that enables setting a default action to take when a file exists. + +=== Improved + +* Improved the error message for internal server errors caused by external code. + +=== Fixed + +* Fixed bug where url prefixes with custom domains for Azure wasn't working correctly. +* Fixed bug where http was preffered over https when sending requests to dropbox/googledrive. +* Fixed bug where the external authenticator didn't handle the default https port number correctly. +* Fixed bug where the Azure file system plugin didn't work for the new type of Azure containers. +* Fixed so imports is checked for existance before importing from Dropbox/Google drive. + +== 2.0.6 - 2015-08-13 + +=== Fixed + +* Fixed bug where the path setting wouldn't work properly when integrating with tinymce. + +== 2.0.5 - 2015-06-30 + +=== Added + +* Re-added onclose callback handler this will now fire for all api methods that open windows. + +=== Fixed + +* Fixed so remember_last_path setting works as it used to pre 2.0. + +== 2.0.4 - 2015-05-18 + +=== Fixed + +* Fixed bug where the SessionAuthenticator couldn't handle objects instances as a value for "user" in the session collection. +* Fixed bug where the zoom slider in the edit image dialog didn't properly update when zooming using zoom fit. +* Fixed bug where the overwrite confirm dialog wouln't appear when the file name was renamed by the autorename plugin. +* Fixed bug it wasn't possible to upload files on IE 9 when Flash didn't properly initialize. +* Fixed so standalone image editing does overwrites by default. Save as field can be re-enabled by the show_save_as option. +* Fixed bug where drag/drop of files in older IE:s wouldn't be properly blocked. + +== 2.0.3 - 2015-05-07 + +=== Added + +* Added confirm dialog to save image the user can now decide what to do when the target file exists. + +=== Fixed + +* Fixed bug where z-index wasn't properly set to a higher value used by {productname}. + +== 2.0.2 - 2015-05-04 + +=== Fixed + +* Fixed bug where thumbnails/inserts from AmazonS3 could produce an incorrect output url. +* Fixed bug with creation of documents on AmazonS3 wouldn't be displayed as directories. +* Fixed bug where the urlprefix wouln't be defaulted to the AmazonS3 client endpoint url. +* Fixed bug where the CustomInfo event wasn't able to mutate the file json meta data. +* Fixed bug where it url resolve logic wouldn't work properly for files with spaces or non ascii. + +== 2.0.1 - 2015-04-30 + +=== Fixed + +* Fixed bug where edit text file wouldn't properly handle error messages. +* Fixed bug where it wasn't possible to override filesystem.directories using sessions in a flat structure. +* Fixed so a better error message gets displayed when a file can't be uploaded due to invalid extension. +* Fixed so all uploaded files gets selected properly if there are many uploaded in a single operation. + +== 2.0.0 - 2015-04-29 + +=== Added + +* Added inline mode for uploads makes it way faster to upload files. +* Added throbber while lazy loading the MoxieManager from {productname} or using the loader.min.js file. +* Added drag/drop upload support for uploading files directly in file view. +* Added a confirm dialog for all uploads/paste operations. +* Added new events callbacks to moxman.browse such as oncreate or onsave. +* Added new tablet support makes it easier to use the MoxieManager on for example an iPad. +* Added UTF-8 support to zip creation logic. It's now possible to download files with non ascii characters. +* Added V4 Amazon S3 authentication method this fixes issues with the frankfurt node. +* Added support for proxy server for all HTTP requests using the new general.http_proxy setting. +* Added support for picking and importing files from Microsoft One Drive. +* Added new SessionAuthenticator.session_name option to change the session context name. +* Added new filesystem.local.file_mask/dir_mask to set *nix bit masks for files. +* Added new filelist_insert_event option to control insert click behavior can be set to click/dblclick or none. +* Added new force_upload_dialog option lets you force the usage of an upload dialog. +* Added new unique_urls option to add unique suffix to all produced urls to bust caching. +* Added new cache_control and acl setting to AmazonS3 to control how the files are uploaded. +* Added new ZendAuthenticator enables you to use Zend 2 sessions for authentication and config overrides. + +=== Improved + +* Optimized Amazon S3 client API so it's faster and uses less memory. + +=== Removed + +* Removed the onopen/onclose callbacks since these where mainly used for custom throbbers. +* Removed the Filesystems title since it wasn't really useful. + +=== Fixed + +* Fixed so cache_prefix from {productname} and suffixes on the loader script gets added as cache busting. +* Fixed so the client rootpath setting is a lot smarter so it's possible to really define custon client rootpaths. +* Fixed so context menu can be closed using the Esc key. +* Fixed so the leftside panel gets a scrollbar if there isn't enough space. +* Fixed so xdebug stack traces get properly disabled. +* Fixed bug where empty directories wouldn't load properly when the cache layer was enabled. +* Fixed issue with Joomla Authenticator, should work with both frontend and backend now. + +== 1.4.26 - 2014-11-20 + +=== Added + +* Added new upload_auto_close option. Enables the upload dialog to automatically close when all files uploaded successfully. + +=== Fixed + +* Fixed so the upload button is disabled until files are properly selected to be uploaded. +* Fixed bug where the throbber would lock up if a critical server error occurred while listing files. +* Fixed bug where the debug handler wouldn't properly handle missing GD module support. + +== 1.4.25 - 2014-10-21 + +=== Fixed + +* Fixed issue with self configured wwwroot containing trailing slash, throwing an exception depending on config. +* Fixed bug where content type of uploaded files to azure blob storage didn't get the correct mime type. +* Fixed bug where file names with commas wouldn't be properly downloaded as a zip file. + +== 1.4.24 - 2014-09-29 + +=== Added + +* Added new acl option to Amazon S3 plugin that allows you to set custom acl permissions. + +=== Fixed + +* Fixed so AmazonS3 updates the acl permissions when renaming/moving files. +* Fixed compatibility issue with labels not rendering properly when using bootstrap. + +== 1.4.23 - 2014-09-19 + +=== Added + +* Added new unique_url option to allow urls to be padded with a unique cache busting id. + +=== Fixed + +* Fixed bug where thumbnails wasn't being reloaded properly when you edited images using the edit image tool. +* Fixed bug where FTP plugin would throw an error when uploading a file in a path recently cleared. + +== 1.4.22 - 2014-09-04 + +=== Changed + +* Reworked csrf logic to not use client side cookies but instead verify the token validity. + +== 1.4.21 - 2014-09-03 + +=== Added + +* Added csrf security logic to improve security by validating security tokens. + +=== Fixed + +* Fixed issue with file systems being cached locally on the frontend and not updated properly. + +== 1.4.20 - 2014-08-27 + +=== Fixed + +* Fixed issue with files not listing if they had mixed case extensions in Amazon/Azure file systems. +* Fixed bug where non statically positioned body would place the context menu at an incorrect position. +* Fixed bug where the menus would be incorrectly positioned on IE 8 if you scrolled the body down. + +== 1.4.19 - 2014-08-26 + +=== Fixed + +* Fixed compatibility issue with PHP 5.4 where try statement requires catch. + +== 1.4.18 - 2014-08-21 + +=== Added + +* Added JSP authentication file "auth.jsp" to the ExternalAuthenticator plugin. + +=== Fixed + +* Fixed so generating thumbnails of images with the wrong file extension works properly. +* Fixed so thumbnails gets properly generated for BMP images even though we doesn't full support it. + +== 1.4.17 - 2014-07-28 + +=== Added + +* Added onopen event callback this gets fired when a action dialog is opened for example when the moxman.browse call is made. + +=== Fixed + +* Fixed so moxiemanager uses the same language as the one set in tinymce if that language pack doesn't exist it will fallback to English. +* Fixed so gif image editing is forced server side since browsers can't save gif data. +* Fixed so thumbnail exif extraction is silent and so it fallbacks to the normal thumbnail logic on failure. +* Fixed the image resizing logic to it uses hermite resamling on the client side for better results. + +== 1.4.16 - 2014-06-18 + +=== Fixed + +* Fixed bug where the insert option wasn't working properly if you clicked on the file name in file list. + +== 1.4.15 - 2014-05-15 + +=== Fixed + +* Fixed bug where contextmenu would automatically close on Firefox running on Mac. +* Fixed bug where contextmenu wouldn't be constrained to the current window viewport. +* Fixed so insert is done when clicking on the file name in file lists so it faster to insert single files. +* Fixed bug where the quota plugin didn't handle copy of directories correctly. + +== 1.4.14 - 2014-04-30 + +=== Added + +* Added event logic to oninsert callback, can now prevent dialog from closing for example. + +=== Fixed + +* Fixed so the add favorite menu item get properly displayed and can be configure into manage/context menus. +* Fixed bug where files with the same name in favorites/history/uploaded woudln't work properly. + +== 1.4.13 - 2014-04-24 + +=== Added + +* Added new client side options for enabling/disabling all buttons and menu items. +* Added option "rename" to "upload.overwrite", files uploaded will get unique names if file exists. + +=== Fixed + +* Fixed issue with Ftp plugin breaking on symlink files/folders, now ignores symlinks. +* Fixed bug where right clicking on a folder didn't properly select that specific folder. +* Fixed bug where thumbnail folder was not deleted if last thumbnail was deleted in it. +* Fixed so configured uppercase Amazon S3 bucket names produces an error message since they are invalid. + +== 1.4.12 - 2014-04-09 + +=== Added + +* Added new endpoint option to Amazon S3 plugin to configure region or custom domain for API calls. + +=== Fixed + +* Fixed issue with session_start(), protecting it from already started sessions to avoid errors. +* Fixed a bug where disabled/hidden tools was not picked up correctly from configuration. +* Fixed bug where urls wasn't properly produced for files with % characters in the file names. +* Fixed bug where it wasn't possible to click thumbnails on subdirectories to navigate deeper. +* Fixed bug where quota plugin would increase the current storage size even if an upload failed. + +== 1.4.11 - 2014-04-02 + +=== Added + +* Added support for skins using the skin option will allow you to load custom skins. + +=== Fixed + +* Fixed bug where unserialization objects in sessions could produce errors. +* Fixed bug where GoogleDrive documents did not get the correct file extension. +* Fixed bug where GoogleDrive file import failed on documents with weird characters. + +== 1.4.10 - 2014-03-24 + +=== Fixed + +* Fixed so older Safari 5.1 uses Flash/Silverlight as it's uploader runtime since it isn't W3C compatible. +* Fixed bug where Favorites/History wouldn't list target directories properly. +* Fixed issue where Azure would list dates on directories even though it's not supported. + +== 1.4.9 - 2014-03-10 + +=== Added + +* Added support for inserting video files using the insertfile button in {productname}. + +=== Changed + +* Rewrote quota plugin to handle remote file systems correctly and block all types of file updated. + +=== Removed + +* Removed the updated file action event since it's basically a delete and add action. + +=== Fixed + +* Fixed so it doesn't do multiple requests on double clicks when listing directories. +* Fixed bug where IE 8 would throw exceptions if you specified extensions using client side options. +* Fixed bug where it wasn't possible to access other file systems when the rootpath was specified on the client. +* Fixed an issue with the AutoFormat plugin running formats on files that where invalid. + +== 1.4.8 - 2014-02-13 + +=== Fixed + +* Fixed bug where the external authenticator would produce an incorrect cookie seed. +* Fixed bug where the basic authentication options for external authenticator didn't work correctly. +* Fixed bug with encoding of files and folders on Windows systems, added unit tests. + +== 1.4.7 - 2014-02-11 + +=== Added + +* Added filter options for the delete command. This allows you to block delete on specific file or directories. + +=== Fixed + +* Fixed bug where it was possible to import files from urls that didn't match the filter settings. +* Fixed bug where it wasn't possible to switch between file systems when the view option was passed in. +* Fixed bug where it wasn't possible to switch view type if the view option was passed in. +* Fixed bug where the remember_last_path option would cause issues when enabled while having multiple rootpaths. +* Fixed bug where Windows-1252 file system encoding wasn't properly handled when listing files. +* Fixed bug where cookies wasn't properly encoded/decoded in the ExternalAuthenticator plugin. + +== 1.4.6 - 2014-01-29 + +=== Fixed + +* Fixed bug where empty directories was treated as they didn't exist by the cache layer file system. +* Fixed bug where url to file resolve logic would fail when having multiple root paths pointing to the same bucket. +* Fixed so Azure/AmazonS3 config options can be overridden by the SessionAuthenticator using sessions. +* Fixed so the urlprefix for AmazonS3 doesn't automatically add any bucket. So it needs to be specified correctly. + +== 1.4.5 - 2014-01-22 + +=== Added + +* Added new JoomlaAuthenticator plugin. This enables you to authenticate against the Joomla CMS system. +* Added insert_filter callback function that lets you override the JSON structure before it gets inserted into forms. +* Added new cache-control config option for AmazonS3 buckets. This enables you to control the cache-control header for files uploaded. + +=== Fixed + +* Fixed bug where the AutoFormat plugin wouldn't work on non local file systems such as Amazon S3. +* Fixed so protocol relative urlprefixes can be used for converting file paths to urls. For example //tinymce.com/myfile.gif. + +== 1.4.4 - 2014-01-08 + +=== Added + +* Added CodeIgniterAuthenticator plugin. Enables you to use authenticate and override config options with sessions. +* Added basic CKEditor support. It replaces the "browse server" buttons in image/file dialogs. + +=== Fixed + +* Fixed bug where extensions in directory names would change the icon from a folder to a file type. +* Fixed so folders without any date returned for them will display a "-" instead for example on S3. +* Fixed so the AmazonS3 urlprefix option can be used to handle custom domains. + +== 1.4.3 - 2013-12-27 + +=== Fixed + +* Fixed issue with corrupt exif data, silently fail and generate a proper thumbnail. +* Fixed bug where the client side configured extensions wasn't properly extended/inherited in upload dialog. +* Fixed bug where the list files command could fail if an input URL didn't properly resolve to a file path. + +== 1.4.2 - 2013-12-19 + +=== Fixed + +* Fixed performance issues with the cache layer and huge file lists. +* Fixed bug where urls resolved wasn't within a specified client side root path. +* Fixed bug where throbber wasn't working properly due to a CSS skin issue. +* Fixed bug where modal block wasn't working properly due to a CSS skin issue. + +== 1.4.1 - 2013-11-29 + +=== Added + +* Added new date_format option that enables you to specify the format to be used for dates in JSON output. +* Added new nameWithoutExtension and extension to file JSON output. + +=== Changed + +* Normalized output for all API functions so that it's pure JSON and contains meta data. + +=== Removed + +* Removed text for rotate/flip image buttons and replaced them with tooltips to fix i18n issues. + +=== Fixed + +* Fixed bug where the ftp plugin would list current and parent directories on linux targets. +* Fixed bug where the ftp plugin wouldn't properly delete directories recursive on linux targets. +* Fixed bug where the ftp plugin would throw an exception about the cache layer field protection level. +* Fixed bug where the ftp plugin wasn't able to copy or move files between other file systems. +* Fixed bug where the cache layer wouldn't use the targets files when doing a move or copy operation. +* Fixed bug where the upload dialog extensions field wouldn't wrap if there where to many to fit one line. +* Fixed so the upload dialog filter out any extensions that isn't present in the client side extensions setting. + +== 1.4.0 - 2013-11-14 + +=== Added + +* Added new Azure Blob Storage support. Available for the Enterprise version only. +* Added new filesystem.directories option that allows you to override configs based on path patterns. +* Added support for HTTP Basic Authentication in ExternalAuthenticator and the HttpClient class. +* Added error message if debug page is accessed but not enabled. +* Added more debug variables to the debug output. + +=== Fixed + +* Fixed bug where column sort order wasn't properly synchronized between grid and sort menu button. +* Fixed bug where IE 8 wouldn't properly load images when rendered in quirks mode. +* Fixed bug where IE 8 couldn't retrive the width/height of images properly when inserted from a non local file system. +* Fixed bug where the auto detection logic for filesystem.local.wwwroot could fail on some setups. +* Fixed bug where local file urls couldn't be properly resolved if the filesystem.rootpath was to a symlink. +* Fixed bug where HTTP requests to some hosts like DropBox didn't work correctly when sockets where used. +* Fixed bug where check for double extensions didn't match due to unescaped regexp. +* Fixed bug where the HttpClient class could throw errors on some keep alive connections. +* Fixed bug where the HttpClient class could throw errors if PUT requests where made without a body. +* Fixed bug where error messages wasn't thrown when deleting/copying/moving directories on S3 or Azure. +* Fixed bug where Uploaded and History plugin didn't work without having the Favorites plugin. +* Fixed so the progress of uploads stays at 99% until fully completed for example when using S3 or Azure. + +== 1.3.4 - 2013-11-01 + +=== Added + +* Added edit.encoding and edit.line_endings options to control input/output when editing text files. + +=== Fixed + +* Fixed bug where the upload dialog wasn't able to pick files on IE 11. +* Fixed bug where the layout of the upload dialog was incorrect on IE 11 due to sub pixel calculations. +* Fixed bug where local overrides for filesystem.writable wouldn't allow files to be created/deleted. + +== 1.3.3 - 2013-10-17 + +=== Fixed + +* Fixed bug where delete/cut operation could take place on directories blocked by _ prefixed mc_access options. +* Fixed bug where contextmenu wouldn't be shown due to a missing permission check. + +== 1.3.2 - 2013-10-10 + +=== Changed + +* Rewrote the SymfonyAuthenticator to be compatible with Symfony 2.x+. + +=== Fixed + +* Fixed so it renders properly on legacy browsers IE 7/IE 8. +* Fixed bug where the sort menu button wouldn't be in sync with the file list sorting. +* Fixed bug where disabled_tools/hidden_tools global settings wouldn't work properly. +* Fixed bug where parent file button wouldn't work if you clicked it after a few pages in infinite scroll mode. +* Fixed bug where the {productname} image dialog image dimensions wasn't updated properly on IE 10. +* Fixed bug where _ prefixed filesystem.readable/filesystem.writable would allow operations on directories. + +== 1.3.1 - 2013-09-13 + +=== Added + +* Added new path and paths options to moxman.view API method call. + +=== Fixed + +* Fixed bug where files would be reported as directories in S3 when uploading larger files. +* Fixed so view dialog displays only the selected images. Makes it easier to compare images. + +== 1.3 - 2013-09-10 + +=== Added + +* Added new infinite scroll feature for handling of large ammout of files. + +=== Improved + +* Optimized thumbnail loading performance by loading thumbs directly when possible. + +=== Fixed + +* Fixed bug where it wouldn't properly delete multiple files in History/Favorites/Uploaded directories. +* Fixed issue where AmazonS3 wouldn't load more than 1000 files/folders, limit increased to 5000. + +== 1.2.3 - 2013-08-23 + +=== Fixed + +* Fixed bug where cache layer would throw error if storage directory didn't have write access. +* Fixed bug where logging had to be enabled when using the cache layer. +* Fixed bug where closing a window in fullscreen mode would produce window scrollbars. +* Fixed so thumbnails gets loaded directly from remote file systems like S3 when possible. + +== 1.2.2 - 2013-08-21 + +=== Added + +* Added new feature and option, thumbnail.mode, if set to "crop" will make thumbs by crop instead of resize. +* Added new cache layer. Enables any filesystem to be cached in memory and in database for performance. + +=== Fixed + +* Fixed bug where S3 would set content-disposition header when uploading files. +* Fixed bug where content-type would be incorrect due to mime type resolve issues. +* Fixed bug where it wasn't resolving urls when having multiple file systems to the same bucket in S3. +* Fixed bug where filter feature would throw js exception and not enable users to select files. +* Fixed bug where throbber wasn't being activated correctly on slow operations. + +== 1.2.1 - 2013-08-06 + +=== Fixed + +* Fixed bug with ExternalAuthenticator not being able to override sessions properly. +* Fixed bug where fullscreen mode wouldn't cover the whole viewport. +* Fixed bug where it wasn't possible to select files that didn't match a valid mime type. +* Fixed bug where some boolean options couldn't be properly overridden using mc_access files. +* Fixed bug where images with 1 pixel width/height wouldn't scale down to proper thumbnails. +* Fixed bug where save image didn't work on IE 9 since the Flash XHR fallback wasn't loading properly. +* Fixed so you can override the auth user name from using the ExternalAuthenticator. + +== 1.2 - 2013-07-18 + +=== Added + +* Added new leftpanel set this to false to hide the left side filesystems panel defaults to true. + +=== Fixed + +* Fixed bug where it wouldn't properly parse URLs without protocol like //domain/path. +* Fixed bug in AmazonS3 where the URL provider would add an extra slash behind the bucket name. +* Fixed bug where username in the session authenticator wouldn't update the user instance. +* Fixed bug where all urls would get converted when having mixed file systems. +* Fixed bug where moving/renaming/copying images didn't move/rename/copy the thumbnail file as well. +* Fixed bug with spaces not working on file names in Amazon S3. +* Fixed bug where contextmenu would be positioned at an incorrect postion when scrolling the page. +* Fixed so external authentication state is cached for 5 minutes in a local session. +* Fixed so it's possible to edit any plain text file not just txt, html etc. +* Fixed so the thumbnail_url meta item is properly populated on non local file systems. +* Fixed so that plugin names are trimmed before loaded, in case space is used after comma. + +== 1.1.9 - 2013-06-26 + +=== Added + +* Added some additional info to the debug option. +* Added new CakeAuthenticator plugin that enables authentication to the Cake PHP framework sessions. +* Added new SympfonyAuthenticator plugin that enabled authentication to the Symfony PHP Framework. +* Added view file support for non image types such as PDF and HTML files. +* Added keep alive heartbeat logic to prevent session timeouts. + +=== Fixed + +* Fixed bug where detecting of the site wwwroot was case sensitive. + +== 1.1.8 - 2013-06-13 + +=== Fixed + +* Fixed issue with Quota plugin running on remote filesystem. +* Fixed bug with Apply button in image edit not working properly. +* Fixed bug where autoformat.delete_format_images option wasn't working properly. +* Fixed bug where image altered PNG images wouldn't retain it's alpha transparent mode. + +== 1.1.7 - 2013-06-11 + +=== Added + +* Added a debug handler for easier debugging of remote systems. +* Added new sort_by and sort_order options to control default sorting. +* Added new moxiemanager__settings option to {productname} plugin. +* Added new onclose callback that gets fired when the MoxieManager is closed. +* Added new more advanced filesystem.local.wwwroot setting for complex setups with multiple servers. + +=== Removed + +* Removed session_start from ExternalAuthenticator, could destroy other php sessions and wasn't needed. + +=== Fixed + +* Fixed bug where sorting of dates could produce strange results. +* Fixed bug where mc_access files couldn't include equal characters in it's values. +* Fixed bug where MoxieManager wouldn't provide an error for urls on files outside the wwwroot. +* Fixed issue with file extension not being automatically set on files on save in image editor. +* Fixed issue with case sensitive upload on the client side. + +== 1.1.6 - 2013-05-29 + +=== Fixed + +* Fixed bug with AutoFormat not limiting to images only, causing errors. +* Fixed so that context menu is not shown if "manage" is disabled tool/hidden. +* Fixed so that S3 config has default urlprefix set, previously defaulted to empty string. +* Fixed so S3 resolves url paths to files and selects them correctly. +* Fixed bug with filesystems not being selected properly depending on input url. +* Fixed CSS issue with thumbnail images not being centered and scaled correctly. +* Fixed bug with file listing on IIS6 due to high security filtering. + +== 1.1.5 - 2013-05-24 + +=== Added + +* Added JS option title, moxiemanager_title, to change the default "MoxieManager". + +=== Removed + +* Removed default config for filesystem.local.urlprefix as part of the wwwroot detecting. + +=== Fixed + +* Fixed css reset rules, added font-weight: normal and text-align: left. +* Fixed logic for detecting wwwroot and url prefix, should work better with alias, virtual path, symlinks etc. +* Fixed so json storage silently fails if no write access instead of producing errors. +* Fixed bug where you could click on thumbnails even if insert : false was configured. +* Fixed bug with cut possible when filesystem.writable was set to false locally. +* Fixed bug with thumbnails not being overwritten when overwriting a file on upload. +* Fixed issue with filters not being run on delete command. +* Fixed issue with getting notice errors on faulty install procedure, now properly redirects to installer. + +== 1.1.4 - 2013-05-21 + +=== Added + +* Reintroduced authenticator.login_page, if configured, user is sent to page when auth fails. + +=== Changed + +* Change behavior of AutoRename config options, can now completely overwrite what pattern to replace with. + +=== Fixed + +* Fixed bug with JSON encode in PHP 5.2 while running in debug mode. +* Fixed bug where mc_access files wouldn't properly support local overrides. +* Fixed bug where mc_access files would be displayed in file listing. +* Fixed bug where it would deselect all files when you used the context menu on a multi selection. +* Fixed bug where closing a fullscreen window wouldn't restore scrolling on page. +* Fixed bug where AutoRename plugin was not fixing file names on rename, should also work on move/copy now. +* Fixed bug where AutoRename converted single and double quotes to entities, now it removes them before converting. +* Fixed bug with image editing, files are now streamed instead of redirected to, fixed crossdomain issues. + +== 1.1.3 - 2013-05-15 + +=== Changed + +* AutoRename plugin will now also convert names of folders automatically. +* AutoRename plugin will now also convert filenames and folders in zip files automatically. + +=== Fixed + +* Fixed bug in external authenticator if using non-standard port number. +* Fixed an issue with AutoRename plugin not renaming case files properly. +* Fixed an issue with the Quota plugin when getting an event without filesize info. +* Fixed an issue with the Quota plugin not working properly if checking against a non-existant folder. + +== 1.1.2 - 2013-05-09 + +=== Added + +* Added tooltip to make it easier to read long file names. +* Added new width/height/fullscreen options to control window size. +* Added underline to Error label in Upload dialog. + +=== Fixed + +* Fixed upload issues with open_basedir config option. +* Fixed so that the "Error" label in the upload dialog is underline. +* Fixed issue with Drupal authenticator, removed user paths due to incompatibility with other file systems. +* Fixed bug where PUT requests in AmazonS3 didn't work when using cURL. + +== 1.1.1 - 2013-05-02 + +=== Added + +* Added new multiple option only single files might be selected if it's set to false. + +=== Changed + +* Updated autorename plugin to work better with new beforeupload event. + +=== Fixed + +* Fixed bug where clicking on a thumbnail would insert multiple files. +* Fixed bug where multiple files could be selected when invoked for a specific field. +* Fixed issue with throbber not showing when inserting files. +* Fixed so it's possible to rename files to another case. +* Fixed so image sizes are read from local files when possible. +* Fixed an issue with event ordering in upload. + +== 1.1 - 2013-04-29 + +=== Added + +* Added new AutoRename plugin with some new config options. +* Added new Quota plugin and config options to restrict the size. + +=== Fixed + +* Fixed bug where upload errors would throw an JS error as well in the logs. +* Fixed bug where an absolute filesystem.rootpath with trailing slash would cause thumbnail errors. +* Fixed bug where History/Favorites/Uploaded plugins wouldn't properly sync with filesystem delete. +* Fixed bug where Paste of files into the same directory as the source dir would cause exception. +* Fixed so copy uses underscore instead of parentheses when file exists already, more web friendly. + +== 1.0.7 - 2013-04-25 + +=== Added + +* Added new context menu to file list view/thumbnail view. + +=== Fixed + +* Fixed bug with selection synchronization between list and thumbnail view. +* Fixed so remove_script_host can be used as a fallback to the no_host option. + +== 1.0.6 - 2013-04-24 + +=== Added + +* Added DrupalAuthenticator back as an available plugin. + +=== Changed + +* FTP option "path" renamed to "rootpath" to avoid confusion. + +=== Fixed + +* Fixed bug with z-index of dialogs when integrated with {productname}. +* Fixed bug where sorting of files/directories wasn't correct in file list. +* Fixed bug where tab key wasn't properly focusing the next/previous control. + +== 1.0.5 - 2013-04-18 + +=== Fixed + +* Fixed so thumbnails are easier to select by clicking on the whole info area. +* Fixed so thumbnail filenames are visible all the time not just on hover. +* Fixed an issue with url encoding to image editor, causing error. +* Fixed an issue with clients not having write access to folder for thumbnail creation, now silently fails. + +== 1.0.4 - 2013-04-17 + +=== Fixed + +* Fixed language translations, check xref:moxiemanager-languages.adoc#download-language-packs[Download language packs] for info. +* Fixed bug where document_base_url wasn't properly applied to {productname} integration plugin. +* Fixed IE 8 rendering issues with psuedo elements not rendering icon fonts properly. +* Fixed issues with Authentication Exceptions, should now show proper error messages. + +== 1.0.3 - 2013-04-16 + +=== Added + +* Added new Coldfusion integration for the ExternalAuthenticator. +* Added new PHP integration for the ExternalAuthenticator. +* Added new "ExternalAuthenticator.external_auth_url" option for ExternalAuthenticator. +* Added new "ExternalAuthenticator.secret_key" option for ExternalAuthenticator. + +=== Changed + +* Rewrote ExternalAuthenticator for ASP to match new JSON format. + +=== Fixed + +* Fixed bug where flash fallback for upload wasn't working on IE. +* Fixed bug where IE 7-9 would produce a JS error when saving images. + +== 1.0.2 - 2013-04-15 + +=== Added + +* Added check for exif_thumbnail function in thumbnail creation, could be configured off. + +=== Fixed + +* Fixed bug where the throbber wasn't showing when file listing was slow. +* Fixed bug with . prefixed file names producing errors when listing. +* Fixed bug where a trailing slash on client side root paths would produce an error. + +== 1.0.1 - 2013-04-12 + +=== Fixed + +* Fixed bug where thumbnails would add it's self as uploaded files in the uploaded plugin. +* Fixed issue where thumbnails would be generated inside thumbnail folders. +* Fixed bug where empty temp path config option would cause issues with upload. + +== 1.0 - 2013-04-11 + +=== Added + +* First public version of MoxieManager. diff --git a/modules/ROOT/pages/moxiemanager-faq.adoc b/modules/ROOT/pages/moxiemanager-faq.adoc new file mode 100644 index 0000000000..2b7efb2d31 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-faq.adoc @@ -0,0 +1,200 @@ += MoxieManager FAQ +:navtitle: FAQ +:description: Frequently asked questions and troubleshooting for MoxieManager. +:keywords: moxiemanager, faq, troubleshooting, support + +MoxieManager if created to be easy to integrate with existing server applications such as CMS systems, web hosting controllers or LMS systems. + +== License questions + +=== Contact our support + +If you have any questions in regards to our licensing, please contact link:{supporturl}/[{supportname}]. + +== Installation/Configuration + +=== Basic installation + +The MoxieManager is made to work right out of the box, just unzip the files into a publicly available folder on your website, and navigate to the folder using your web browser. You can read more about the installation steps on the xref:moxiemanager-installation.adoc[installation] wiki page. + +=== {productname} integration + +. Locate your {productname} folder and {productname} configuration options +. Unpack MoxieManager into `+tinymce/plugins+` folder, so it should be in `+tinymce/plugins/moxiemanager+`. +. Edit the {productname} configuration, and add `+moxiemanager+` to the plugins config option. ++ +[source,js] +---- +tinymce.init({ + plugins: "image moxiemanager", + toolbar: "image insertimage insertfile", +}); +---- + +That's it. + +=== What should i put in the filesystem.rootpath config option? + +An absolute or relative path to your website + +The root path is the folder where the MoxieManager should start to list your files, no folder above this in the folder structure will be accessible. So it should be something like `+c:\Inetpub\wwwroot\images+` or `+/var/www/htdocs/mywebsite.com/images+` if you are on Linux. It can also be a relative path, such as `+../../images+`. + +=== Authentication/Security + +Do not run MoxieManager without making sure its secure from public access, unless specifically configured to run in that environment. + +After getting MoxieManager to work, you will probably want to configure some sort of Authenticator, if you are integrating into some other system, check out the SessionAuthenticator in the xref:moxiemanager-security.adoc[Documentation] section. The simplest setup is to have your system set a session like `+loggedInKey+` to simply `+true+` and then have the SessionAuthenticator look for that session with correct value. + +For other options on how to configure Authentication/Security, check the xref:moxiemanager-security.adoc[Documentation]. + +=== Virtual directories + +When virtual directories are configured, the public path can not be resolved automatically, and it requires some extra configuration. + +Example setup if your virtual directory is named "virtupload" pointing to c:\www\inetpub\upload: + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = 'c:\www\inetpub\upload'; +$moxieManagerConfig['filesystem.local.wwwroot'] = 'c:\www\inetpub\upload'; +$moxieManagerConfig['filesystem.local.urlprefix'] = '{proto}://{host}/virtupload/'; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + +---- + +Will take an absolute path like c:\www\inetpub\upload\images\my.gif crop away c:\www\inetpub\upload producing /images/my.gif then add http://www.site.com/virtupload before it producing http://www.site.com/virtupload/images/my.gif + +=== Session is destroyed at random + +Microsoft have a great "feature" where it auto reloads the application if you do many file/directory changes inside an application this can however be disables as of version 4.5. So add this to your Web.Config to see if the automatic recycling stops. + +[source,xml] +---- + +---- + +=== How do I get help/support? + +First, please look through the FAQ Troubleshooting section below. + +If you still need help, link:https://support.tiny.cloud/hc/en-us/requests/new[open a support ticket]. + +== Troubleshooting + +=== Thumbnails are not centered in the thumbnail view + +This is due to the wrong doctype in the page opening MoxieManager, set the HTML5 doctype or HTML4 strict and it will look as it should. + +[source,html] +---- + +---- + +=== Javascript error while loading MoxieManager, uploading files or inserting files + +By default, there should not be any javacscript errors, this is usually not due to any frontend issue, but rather the response the interface gets from the backend. Make sure you check write permissions to temp folders, storage folder and your root folder structure if you plan on uploading files to it. Also check log files for clues to why the backend isn't responding properly. + +=== Insert image only inserts thumbnail not full size image + +You can change this behavior by modifying the moxiemanager_insert_template init option. + +=== Thumbnails does not get generated + +Verify write access to the images folder, also verify your config options and if on PHP, make sure GD is installed on the server. + +=== Uploading to directories fails + +Some PHP hosting companies have incorrect settings on their servers these issues can be resolved by: + +* Setting the safe_mode_gid setting to true for your host in the vhost config. Since this is the main problem the group is normally correct but not the user. +* Using the open_basedir is much more efficient to restrict file access across domains than safe_mode. +* Change the user that apache is running under so it's matched the ftp server or vice versa. + +=== I can't upload larger files + +Make sure that your application runtime is configured correctly: + +PHP settings needed in php.ini you can check this with a phpinfo call. + +[source,php] +---- +; Maximum allowed size for uploaded files. +upload_max_filesize = 50M + +; Maximum size of POST data that PHP will accept. +post_max_size = 50M +---- + +In .NET you need to specify this in your web.config: + +[source,xml] +---- + + + + +---- + +=== Could not resolve path + +This can be caused by a few different reasons, but often it is related to the path being encoded wrong. + +The reason for this is the Prototype javascript library, upgrade to the latest version for the problem to go away. + +[source,js] +---- +// Error/response looks like this +{"jsonrpc":"2.0","error":{"code":0,"message":"Could not resolve path: [\"\/sub\/folders\/file.png\"]","data":null},"id":"i2"} +---- + +=== Images won't display in preview or as thumbnails + +On some hosts the preview of images doesn't work as expected there are two common reasons for this to fail. The first one is that the xref:moxiemanager-options.adoc#filesystem-local-wwwroot[filesystem.local.wwwroot] setting can't be auto detected, the second is that the MoxieManager is inside a virtual directory. + +* The more common issue with filesystem.local.wwwroot not being auto detected is fairy easy to resolve just set the absolute file system path to where the root of your site is located on disk in that option. For example: `+filesystem.local.wwwroot=/var/www+` or `+filesystem.local.wwwroot=c:/inetpub/wwwroot+` this setting is located in config.php/web.config depending on if you use the PHP or .NET version. +* The less common issue is when you have a virtual directory for the MoxieManager then you need to set the filesystem.local.wwwroot to where the root of this virtual directory is on disk. For example: `+filesystem.local.wwwroot=/var/www/virtualdir+` and the set the xref:moxiemanager-options.adoc#filesystem-local-urlprefix[filesystem.local.urlprefix] to include the virtual name `+{proto}://{host}/virtualname+`. + +If any of these solutions above shouldn't work try enabling logging by setting log.enabled=true and log.level=debug in the config.php/web.config file. This will write a log with the details used to produce an url out of a file system path into the logs directory. + +=== Upload and create folder buttons are missing + +This is probably due to no write access in the folder being listed. + +=== Paths returned are not as I wish to have them + +For stand-alone mode, check the xref:moxiemanager-api.adoc#js-browse[API docs], specifically the relative_path and no_host option if you wish to have a site absolute path. + +=== Path returned contains only domain or is empty! + +This is probably due to the path can not be resolved automatically, usually happens when someone uses aliases/virtual directories or symlinks. + +* Try to configure filesystem.local.wwwroot to the root path of your webserver folder (/www/domain/public_html for example). Should be a path, not an URL. +* If you are using virtual directories, check the above FAQ items under "installation" for tips on how to get that working. +* If all else fails, use our support ticket system and ask for help, also check the Debugging FAQ item below. + +=== Safari upload does not work, "No input file specified" + +This is usually due to old Safari versions, or use of Safari on Windows, a browser that is discontinued. Please use the latest version (on Mac), or a different browser (on PC). + +=== MoxieManager is not rendered correct or starting up correctly + +Go to the moxiemanager/examples.html file and see if the same problem exists there, if it does not, it probably means a buggy or badly written javascript causes issues, try removing them one by one on your page until things work to find out what script might be causing it. + +=== Debugging (PHP) + +If you enable xref:moxiemanager-options.adoc#general-debug[general.debug] in your config options, then go to moxiemanager/api.php?action=debug you can view the output of some debugging points, if you request support through our ticket system, be sure to include this information in the ticket. + +=== SessionAuthenticator/Sessions not working (.NET) + +One common mistake is when you copy the configuration values from the MoxieManager Web.config file into a global Web.config file and forget to remote the MoxieManager Web.config. In this case, the settings you change in the global Web.config file will be overwritten by the Web.config in the MoxieManager folder, either keep the MoxieManager Web.config in its folder and reconfigure that, or remove it alltogether and just use the settings from the global Web.config. + +The moxiemanager needs to be in the same application as the rest of your site/system to be able to share session data. diff --git a/modules/ROOT/pages/moxiemanager-how-to-guides.adoc b/modules/ROOT/pages/moxiemanager-how-to-guides.adoc new file mode 100644 index 0000000000..4dcf2e568c --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-how-to-guides.adoc @@ -0,0 +1,681 @@ += MoxieManager how-to guides +:navtitle: How-to guides +:description: How-to guides for MoxieManager features, plugins, and integrations. +:keywords: moxiemanager, how-to, amazon s3, azure, dropbox, ftp, quota, mc_access, translate + +Om this section, you get to learn abit about some of the more powerfull features that are offered in MoxieManager. + +[[file-storage]] +== File storage + +[[how-to-configure-for-amazons3]] +=== How to configure for AmazonS3 + +NOTE: Amazon S3 support is only available for Enterprise License customers. + +. Make sure you have added AmazonS3 to the plugins list like this: ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['general.plugins'] = 'Favorites,History,Uploaded,AmazonS3'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + + + + + +---- + +. Configure your bucket information in config file. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['amazons3.buckets'] = array( + 'mybucketname' => array( + 'publickey' => '', + 'secretkey' => '' + ) +); +---- ++ +.Example for .NET integrations +[source,xml] +---- + + + +---- ++ +NOTE: *Optional:* You might also need to configure 'urlprefix' in your bucket, it should be "http://s3.amazonaws.com" or similar, without the bucket name. ++ +Get your publickey and secretkey from Amazon S3 admin interface. + +. Add your bucket to the rootpath configuration. Please note that bucketnames can only be a-z 0-9 and lowercase chars. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = 's3://mybucketname'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- ++ +NOTE: Note that the name must match with what you called your bucket in the buckets config in *Step 2*. ++ +It is also possible to have many rootpath, if you wish to list local folder as well as Amazon S3. Check out xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath] config for more information about that. + +==== List of bucket options + +[cols=",",options="header",] +|=== +|Option |Description +|`+publickey+` |The public key that you get from the Amazon S3 service. +|`+secretkey+` |The secret key that you get from the Amazon S3 service. +|`+urlprefix+` |Url prefix to add infront of the urls when selecting files this can for example be http://mycustom.domain or //mycustom.domain. If you do not have a custom domain, you will need to configure the bucketname into the normal s3 url. +|`+cache-control+` |Enables you to control how the files are to be cached in the users browser when the request the file. The values that can be specified for this option can be found in the http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9[HTTP RFC]. +|`+endpoint+` |Enables you to configure a specific endpoint for the API calls this can be an URL to a http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region[specific region] or a custom domain. +|=== + +==== Example of EU region bucket with custom domain + +.Example for PHP integrations + +[source,php] +---- +'' => array( + 'publickey' => '', + 'secretkey' => '', + 'urlprefix' => 'http://mycustomdomain/', + 'endpoint' => 's3-eu-west-1.amazonaws.com' +) +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[how-to-configure-for-azure]] +=== How to configure for Azure + +NOTE: Azure Blob Storage support is only available for Enterprise License customers. + +. Make sure you have added Azure to the plugins list like this: ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['general.plugins'] = 'Favorites,History,Uploaded,Azure'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + + +---- + +. Configure your container information in config file. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['azure.containers'] = array( + 'containername' => array( + 'account' => 'yourazureaccount', + 'sharedkey' => 'yoursharedkey' + ) +); +---- ++ +.Example for .NET integrations +[source,xml] +---- + + + +---- ++ +NOTE: *Optional:* You can also set development to true to run against the local Azure Storage Emulator. ++ +Get your account and sharedkey from the Azure admin interface. + +. Add your container to the rootpath configuration. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = 'azure://containername'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- ++ +NOTE: Note that the name must match with what you called your container in the container config in *Step 2*. ++ +It is also possible to have many rootpath, if you wish to list local folder as well as Azure. Check out xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath] config for more information about that. + +==== Optional, setting config by sessions + +If you wish to configure for settings, do not forget to use the prefix for the azure settings as well. + +.Example for PHP integrations + +[source,php] +---- +$_SESSION["moxiemanager.azure.containers.myazureclient.container"] = "containername"; +$_SESSION["moxiemanager.azure.containers.myazureclient.account"] = "accountname"; +$_SESSION["moxiemanager.azure.containers.myazureclient.sharedkey"] = "accountsecretkey"; + +$_SESSION["moxiemanager.filesystem.rootpath"] = "azure://myazureclient"; +---- + +.Example for .NET integrations + +[source] +---- +Session["moxiemanager.azure.containers.myazureclient.container"] = "containername"; +Session["moxiemanager.azure.containers.myazureclient.account"] = "accountname"; +Session["moxiemanager.azure.containers.myazureclient.sharedkey"] = "accountsecretkey"; + +Session["moxiemanager.filesystem.rootpath"] = "azure://myazureclient"; +---- + +If your session prefix is configured to "moxiemanager". + +[[how-to-use-ftp]] +=== How to use Ftp + +NOTE: FTP support is only available in the Professional and Enterprise License package + +. Add FTP to the plugins list in the config file. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['general.plugins'] = 'Favorites,History,Uploaded,Ftp'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + + + + + +---- + +. Add the FTP configuration to config file. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['ftp.accounts'] = array( +    'FTPServer' => array( +        'host' => 'www.domain.with.ftp', +        'user' => 'username', +        'password' => 'password', +        'rootpath' => '/public_html/wwwroot/images', +        'wwwroot' => '/public_html/wwwroot', +        'passive' => true, + 'urlprefix' => '{proto}://{host}' +    ) +); +---- ++ +.Example for .NET integrations +[source,xml] +---- + + + +---- ++ +* *rootpath* is the path you want listed as root folder of your FTP. +* *wwwroot* is the public folder of remote site, see example above. +* *urlprefix* is optional, by default it sets to the same domain as the hostname. + +. Add your FTP to the rootpath config in config file. ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = 'ftp://FTPServer'; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- ++ +NOTE: Note that the name must match with what you called your site in the ftp config in *Step 2*. ++ +It is also possible to have many rootpath, if you wish to list local folder as well as some ftp server. Check out xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath] config for more information about that. + +.Note, problems with paths +NOTE: If your not getting a proper return path from the FTP plugin, you might need to fiddle with *urlprefix* setting and configure the correct domain for a public url to the file, if the file is possible to access publicly. + +[[how-to-use-dropbox]] +=== How to use Dropbox + +NOTE: Dropbox is only available for Professional/Enterprise License customers. + +The Dropbox integration works like this, you can select files using the Dropbox Chooser, those files will be downloaded locally to MoxieManager. + +. Open dropbox https://www.dropbox.com/developers/apps/create[create app page] +. Click *Create App* +. Choose *Dropbox API* in the "Choose API" section. +. Choose *Full Dropbox* in the "Choose the type of access you need" section. +. Name your app. +. Select *Enable additional users* +. Add your domains to *Chooser/Saver domains* for example localhost +. Copy the "*App key*" and paste it into the xref:moxiemanager-options.adoc#dropbox-app-id[dropbox.app_id] settings on config.php or Web.config. + +Here are some examples of the lines you need to change in the config + +.Example for PHP integrations + +[source,php] +---- +// Add to plugins list +$moxieManagerConfig['general.plugins'] = "Favorites,History,Uploaded,Dropbox"; + +// Config the app_id +$moxieManagerConfig['dropbox.app_id'] = ""; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + + + + + +---- + +And you are done, you should now be able to choose files from your Dropbox account. + +image:moxiemanager/dropbox.png[Example] + +[[authentication-and-user-paths]] +== Authentication and user paths + +[[how-to-make-your-own-authenticator]] +=== How to make your own authenticator + +If you need more control over user rights, we suggest making your own authenticator. They are fairly simple, and you should be able to construct one with basic knowledge in either PHP or .NET. + +==== PHP + +In PHP, you can copy one of the existing Authenticators, for example, copy the "/moxiemanager/plugins/SessionAuthenticator" folder into a new folder called "CustomAuthenticator". In that folder is a single Plugin.php file that checks authentication, add checks against your system, and return true if the user is verified, otherwise false. You can also fiddle with the config etc. + +[source,php] +---- +extend($myConfig); + + // The user is authenticated so let them though + return true; + } +} +MOXMAN::getAuthManager()->add("CustomAuthenticator", new MOXMAN_CustomAuthenticator_Plugin()); +---- + +==== .NET + +It is a bit more complicated in .NET, since you need to compile a plugin. Create a bare base project called "MoxieManager.Plugins.CustomAuthenticator", put a single file called Plugin.cs in it, and compile it, add it to the server Bin folder and config it into web.config. If you are familiar with .NET you should be able to use this to empower your integration. + +[source,csharp] +---- +using System; +using System.Security.Cryptography; +using System.Text; +using System.Web; +using System.IO; +using System.Xml; +using MoxieManager.Core; +using MoxieManager.Core.Auth; +using MoxieManager.Core.Util; + +namespace MoxieManager.Plugins.CustomAuthenticator { +    public class Plugin : IPlugin, IAuthenticator { +        public void Init() { +        } + +        public bool Authenticate(User user) { +            var config = ManagerContext.Current.Config; +            // You can access session context here if needed. +            //var session = ManagerContext.Current.HttpContextBase.Session; + +            // THIS WOULD BE WHEN YOU RUN CHECKS TO SEE IF USER LOGGED INTO YOUR SYSTEM CAN ACCESS MOXIEMANAGER +            // COULD BE VIA CHECKING A SESSION, OR IMPLEMENTING SOMETHING TO CHECK AGAINST, JUST INCLUDE LIB ABOVE. +            return false; + +            // PUT SOME CUSTOM CONFIG OPTIONS +            config.Put("filesystem.rootpath", "c:\inetpub\wwwroot"); + +            // The user is authenticated so let them though +            return true; +        } + +        public string Name { +            get { return "CustomAuthenticator"; } +        } +    } +} +---- + +Return true after you check if the user is authenticated in your system, otherwise return false. + +[[how-to-implement-user-specific-paths]] +=== How to implement user specific paths + +The easiest way to do this, is by using the SessionAuthenticator, read more about it in the integration section. + +Using the session authenticator, you can set specific paths depending on who logs into your system, this is a simple example on how to use this feature. + +[source,js] +---- +// Setup sessions on login of your CMS (or the example login page that comes with the software) +session_start(); +$user = $_SESSION["userid"]; // Get a userid or name from your system +$_SESSION['isLoggedIn']=true; // Set the state for the Session Authenticator + +// Override the rootpath +$_SESSION['filesystem.rootpath']="/var/www/htdocs/mysite.com/". $user ."/files/"; +---- + +Sanitize the $user variable, MoxieManager does have checks against hack attempts, but its always a good idea to sanitize the input. + +==== Alternative + +There is an alternative that is supported by a few of our authenticators, the *$\{user}* replacement. + +First, you need to make sure you set the "user key" for that authenticator, so for the SessionAuthenticator that would be whatever you configure the sessionauthenticator.user_key to be. If you configure that to "username" and then set a session called "username" to the name of that user (or ID), it will make that part of the path. + +You can configure your config.php/Web.config rootpath to something like `+c:/Inetpub/wwwroot/project/${user}/images+` and the $\{user} will be replaced with the user key. + +Be sure to sanitize this as much as possible before setting it. + +This feature is supported by the Externalauthenticator, SessionAuthenticator and for .NET we also have support for it in the AspNetAuthenticator. + +[[installing-in-other-systems]] +== Installing in other systems + +[[how-to-install-in-ckeditor]] +=== How to install in CKEditor + +Installing the MoxieManager in CKEditor is pretty easy. Simply copy the moxiemanager to the ckeditor plugin directory and add the "moxiemanager" to the list of extra plugins. Then the "browse server" buttons in the link/image dialogs will be replaced with the MoxieManager. + +[source,js] +---- +// Editor config +CKEDITOR.editorConfig = function(config) { + config.extraPlugins = 'moxiemanager'; +}); +---- + +==== CDN version + +If you are using the CDN version of CKEditor, you can use something like this to load MoxieManager. + +[source,js] +---- +CKEDITOR.plugins.addExternal('moxiemanager', '/moxiemanager/', 'plugin.js'); +CKEDITOR.replace('ckeditor', { +    extraPlugins : 'moxiemanager' +}); +---- + +Where "/moxiemanager/" is the path where your local moxiemanager is installed. (End slash required) + +[[how-to-install-in-joomla]] +=== How to install in Joomla + +Installation in *Joomla 3.2* is fairly simple. All you need to do is follow these simple steps and it should work. If you stuggle with any of these steps feel free to contact out support. + +. Copy "moxiemanager" to /media/editors/tinymce/plugins/moxiemanager +. Select "Extended" the select list "Functionality" in Extensions -> Plugin Manager -> Editor - {productname}. +. Enter "moxiemanager" in the "Custom plugin" field under the "Advanced" tab under Extensions -> Plugin Manager -> Editor - {productname}. +. Add a new article and click on "insert/edit link" icon in the {productname} rich text editor field. +. Click on the new "Browse" button in this dialog and an installation dialog should appear. +. Paste the license key and select "Joomla Authenticator" from this installation dialog. + +[[how-to-install-on-godaddy]] +=== How to install on Godaddy + +If you are running the .NET version on Godaddy, first make sure you are running the 4.5 version of the .NET framework. + +Then you need to add a snipplet into your web.config file. + +[source,js] +---- + +      +          +      + +---- + +Then enable the feature but configuring it enabled. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['autorename.enabled'] = true; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +These are some of the options available. + +[cols=",",] +|=== +|autorename.enabled |Boolean value, false by default, can be set in mc_access files. +|autorename.space |Character to replace space with, default is underscore _ +|autorename.lowercase |Boolean value, force lowercase characters. Default is false. +|autorename.pattern |Custom RegEx pattern, default is [^0-9a-z-_] +|=== + +NOTE: Note that AutoRename plugins also follow xref:moxiemanager-options.adoc#upload-overwrite[upload.overwrite] value, if upload.overwrite is true, renamed files will replace files in the same folder. + +[[how-to-use-mc-access]] +=== How to use mc access + +mc_access is a very powerfull feature of the MoxieManager. + +Create a simple text file called mc_access file and put it in whatever folder you wish to control in more detail. + +==== Simple trick + +Do you have a problem with your users uploading files in the root folder of your site? + +Well, here is a trick to disable upload and any modifications at all in the root folder only. + +[source] +---- +_filesystem.writable=false +_general.disabled_tools=upload +---- + +The _ underscore in front of the option indicates that it is only applied locally and not to subdirectories. + +==== Templates + +Lets say you have a system and wish to allow users to create their own pages based on a template, with mc_access you can force certain templates to be used specifically for that folder. + +[source] +---- +createdoc.templates=Dokument=${rootpath}/templates/content_page.req.php,Lightbox=${rootpath} +---- + +Almost all configuration options can be set per-directory using mc_access, check out the configuration options on what powerfull things you can do with this. + +NOTE: Notice that mc_access support doesn't work on remote file systems like Azure or Amazon due to performance issues. We recommend using the xref:moxiemanager-options.adoc#filesystem-directories[filesystem.directories] setting for as an alternative. + +[[how-to-use-quota]] +=== How to use Quota + +NOTE: Note that this plugins is only available for Enterprise and Professional license customers. + +If you wish to enable the quota plugin, add it to your plugins config. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.plugins'] = 'Favorites,History,Uploaded,Quota'; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + +---- + +You can configure the quota limit using this option in config.php. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['quota.max_size'] = "10m"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +First time the file listing is made, an initial index is made of all subfolders, this can take some time if you have huge amounts of folders/files. After the initial listing, an update to the list is only made for the current folder you are in. + +This is not suitable for thousands of files and folders setups. + +[[customization]] +== Customization + +[[how-to-install-a-custom-skin]] +=== How to install a custom skin + +Uncompress the custom skin zip file into the `+moxiemanger/skin+` folder, the folder should already contain a subfolder named lightgray, the default skin. + +.Example of usage when using Moxman.browse js method of calling Moxiemanager +[source,js] +---- +moxman.browse({ + ... + skin: 'charcoal' +}); +---- + +.Example of usage when using it in {productname} +[source,js] +---- +tinymce.init({ + ... + moxiemanager_skin: 'charcoal' +}); +---- + +NOTE: Please note that the name of the skin is the name of the folder you created in `+moxiemanager/skin+`. + +If you encounter and problems, please use the ticket system to get support. + +.View with charcoal skin +.Example code +[source,js] +---- +moxman.browse({ + fields: 'url', + skin: 'charcoal' +}); +---- diff --git a/modules/ROOT/pages/moxiemanager-installation.adoc b/modules/ROOT/pages/moxiemanager-installation.adoc new file mode 100644 index 0000000000..8c0e626a8f --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-installation.adoc @@ -0,0 +1,223 @@ += MoxieManager installation +:navtitle: Installation +:description: Install MoxieManager for PHP or .NET, as a standalone file manager or as a {productname} plugin. +:keywords: moxiemanager, installation, php, .net, upgrading, troubleshooting + +Installing MoxieManager should be fairly simple, but mastering all the options can be harder. + +And if you have problems, xref:moxiemanager-faq.adoc[check out the FAQ] and if that doesn't work, use the ticket system from your account. + +PHP and .NET have the same features. + +* xref:#installation-php[Read this for PHP installation instructions.] +* xref:#installation-net[Read this for .NET installation instructions.] + +NOTE: Please note that a lot of the documentation is still for the PHP version, all config examples that looks like $moxieManagerConfig[""]; is of course edited in the Web.config file for .NET. + +[[installation-php]] +== PHP installation + +Installing MoxieManager should be fairly simple, but mastering all the options can be harder. + +=== Requirements + +* PHP version of at least *8* is required for MoxieManager 3.0.0 and later. Version 3.0.0 added support for PHP 8.2 and removed support for PHP 7.x. +* Earlier versions of MoxieManager require PHP version of at least *5.3*. For PHP 7, you need at least version 2.0.10 of MoxieManager. +* As for other PHP extensions, *GD image library* is required if you wish to use any image editing capabilities. +* *Exif extension* is also recommended but Exif features can be turned off, basically only used to extract a thumbnail if it exists. +* *Any "normal" browser* that isn't to old should work just fine with MoxieManager, older browser versions might have a different look though. +* A modern *HTML5 or HTML4 Strict doctype* () is required to get the UI to render properly. +* Weird shared hosting PHP security settings (mostly really bad shared hosting setups) can cause various permission issues. + +=== Basic installation + +Here are the basic steps for installing the moxiemanager in standalone mode. + +. Unpack the zip file and upload it to your web server. For example: c:/inetpub/wwwroot/moxiemanager +. Open the moxiemanager in a browser for example http://localhost/moxiemanager/ +. Follow the instructions in the installer, it will create the config.php file for you. + +The next step is to configure it exactly as you might want it. + +=== {productname} installation + +Installing as a plugin to {productname} is also fairly simple. + +. Locate your {productname} folder +. Locate your {productname} config options (wherever they may be in whatever system you are using), should look something like this `+tinymce.init{/*... lots of config options ...*/}+` +. Unpack MoxieManager into your tinymce/plugins folder, so it ends up in tinymce/plugins/moxiemanager. +. Edit the tinymce.init\{} and insert "moxiemanager" into the plugins list, should look something like this: ++ +[source,js] +---- +tinymce.init({ + selector: "textarea", + plugins: "link table code save moxiemanager", +}); +---- + +That should really be it, next step would be to fine tune the xref:moxiemanager-options.adoc[config] options. + +==== Custom MoxieManager location + +If you wish to put MoxieManager in a different folder, or are running the CDN version of {productname}, you can use the xref:editor-important-options.adoc#external_plugins[external_plugins] option in {productname}. + +[source,js] +---- +tinymce.init({ +    ... +    external_plugins: { +        "moxiemanager": "/moxiemanager/plugin.min.js" +    } +}); +---- + +The path in this case is the root of the website, for example, if MoxieManager where installed in c:/inetpub/wwwroot/moxiemanager and c:/inetpub/wwwroot is the root of the website. + +=== Next step - configuration + +After the installation, standalone or in tinymce, you probably want to change some config options. + +The most important configuration option (*config.php*) is this: + +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = ""; +---- + +xref:moxiemanager-options.adoc#filesystem-rootpath[Read more about this option here] + +This is where your files are listed from, this can be an absolute or relative Path from the MoxieManager folder. + +`+Absolute: /var/htdocs/mydomain/html+` + +`+Relative: ../../../documents+` + +NOTE: Please note that if you are using *symlinks/aliases/virtual directories*, you might need additional configuration, but the rootpath should be *set to the actuall path on server*, not the path including the symlink/alias/virtual dir. + +Add a name to your path: + +`+MyName=../path/to/files+` + +* You probably want some form of authentication, check out the xref:moxiemanager-security.adoc[Authentication integration help]. If you wish to turn off the authenticator, only recommended for testing or if you are behind basic authentication already, you simply set the `+$moxieManagerConfig["authenticator"] = "";+` to an empty string. +* Now, if you wish to configure plugins, you should check out the xref:moxiemanager-options.adoc#general-plugins[general.plugins] option. +* If you wish to use mc_access to set folder specific options, xref:moxiemanager-how-to-guides.adoc#how-to-use-mc-access[check out our how to]. +* And if you have problems, xref:moxiemanager-faq.adoc[check out the FAQ] of course! + +[[installation-net]] +== .NET installation + +Installing MoxieManager should be fairly simple, but mastering all the options can be harder. + +=== Requirements + +* MoxieManager will only work with *.NET 4.5 Framework*, download http://www.microsoft.com/en-us/download/details.aspx?id=30653[here]. +* A modern *HTML5 or HTML4 Strict doctype* () is required to get the UI to render properly. + +=== Basic installation + +Here are the basic steps for installing the moxiemanager in standalone mode. + +NOTE: Please note, there is no Visual Studio Building required to make this software work. + +. Unpack the zip file and upload it to your web server. For example: c:/inetpub/wwwroot/moxiemanager +. Copy all the DLL files moxiemanager/bin to your root bin folder. +. Open up moxiemanager/Web.config (you need all values in this file) +.. Insert your license key into "xref:moxiemanager-options.adoc#general-license[general.license]" +.. Configure your "xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath]" if you wish to change the default +.. Configure an "xref:moxiemanager-options.adoc#authenticator[authenticator]", check the xref:moxiemanager-plugins.adoc[plugins page for more info]. +. Check write access to xref:moxiemanager-options.adoc#filesystem-rootpath[filesystem.rootpath] you configured above (for IIS_IUSRS), if you want upload to work. +. Add a mimetype for icon fonts to your IIS settings if its not already done, add for .woff (application/font-woff) files. +. Direct your browser to the moxiemanager installation folder to try it out. + +NOTE: Please note that if you move the *Web.config* settings into a global website Web.config, *do not forget to remove the original* in the MoxieManager folder, or all configurations will be overwritten by the local ones. + +If you get a 500 internal server error, first, check your .NET version, only .NET 4.5 Framework is supported. Next, make sure you copied the DLL files to the root bin folder. + +If you encounter any problems, check the xref:moxiemanager-faq.adoc[FAQ] or use the support ticket system to submit tickets. + +=== {productname} installation + +Installing as a plugin to {productname} is also fairly simple. + +. Locate your {productname} folder +. Locate your {productname} config options (wherever they may be in whatever system you are using), should look something like this `+tinymce.init{/*... lots of config options ...*/}+` +. Unpack MoxieManager into your tinymce/plugins folder, so it ends up in tinymce/plugins/moxiemanager. +. *Follow section 2 to 4* in the above basic installation. +. Edit the tinymce.init\{} and insert "moxiemanager" into the plugins list, should look something like this: ++ +[source,js] +---- +tinymce.init({ + selector: "textarea", + plugins: "link table code save moxiemanager", +}); +---- + +* For more detailed authentication info, check out the xref:moxiemanager-security.adoc[Authentication integration help]. If you wish to turn off the authenticator, only recommended for testing or if you are behind basic authentication already, you simply set the `+$moxieManagerConfig["authenticator"] = "";+` to an empty string. +* Now, if you wish to configure plugins, you should check out the xref:moxiemanager-options.adoc#general-plugins[general.plugins] option. +* If you wish to use mc_access to set folder specific options, xref:moxiemanager-how-to-guides.adoc#how-to-use-mc-access[check out our how to]. +* And if you have problems, xref:moxiemanager-faq.adoc[check out the FAQ] of course! + +==== Custom MoxieManager location + +If you wish to put MoxieManager in a different folder, or are running the CDN version of {productname}, you can use the xref:editor-important-options.adoc#external_plugins[external_plugins] option in {productname}. + +[source,js] +---- +tinymce.init({ +    ... +    external_plugins: { +        "moxiemanager": "/moxiemanager/plugin.min.js" +    } +}); +---- + +The path in this case is the root of the website, for example, if MoxieManager where installed in c:/inetpub/wwwroot/moxiemanager and c:/inetpub/wwwroot is the root of the website. + +== Upgrading + +Usually, you should just replace the old files with all the new files in the updated package, making sure to overwrite. With the exception of the config file, most of the times (perhaps not on major updates) you should be able to save your config file, but if you have some trouble after upgrading, replacing and re-doing the configuration might help you solve some issues. + +There might also be updates to the UI and Javascript files of MoxieManager, then you need to make sure you clear your browser cache. If you use MoxieManager with {productname}, you can use the cache suffix and change that, to force a reload of the cached files. + +Check out the xref:editor-important-options.adoc#cache_suffix[cache_suffix option] in the {productname} configuration. + +If you use MoxieManager standalone, you can add or change the loader.min.js script file querystring, and it should drop the cache files loaded. + +`++` + +== Troubleshooting + +If you are having issues, first thing to check is *write permissions*, make sure you can write to the *temp folder*, by default, it uses system temp folder, but you can reconfigure that using xref:moxiemanager-options.adoc#general-temp-dir[general.temp_dir]. If you want upload/create folder to work, make sure write access to the listed folder is also correct. You may also need *write permissions to the storage folder* (moxiemanager/data/storage by default) if you wish to use those features. + +Another common issue is that *thumbnails aren't shown centered in the thumbnail view* of MoxieManager, this is due to wrong doctype in the document opening MoxieManager, set the HTML5 (or HTML4 Strict) doctype and it will work. + +[source,html] +---- + +---- + +Also check the xref:moxiemanager-faq.adoc[FAQ] for common issues! + +*Advanced debugging*, you can access the debugging tool by setting xref:moxiemanager-options.adoc#general-debug[general.debug] to true in your config, then go directly to the following url with your browser (moxiemanager is the folder where you have installed it ofc): + +.Example for PHP integrations + +[source,php] +---- +moxiemanager/api.php?action=debug +---- + +.Example for .NET integrations + +[source] +---- +moxiemanager/api.ashx?action=debug +---- + +This should give you some information about your system. + +== Support + +To get support, link:https://support.tiny.cloud/hc/en-us/requests/new[open a support ticket] with link:{supporturl}/[{supportname}]. diff --git a/modules/ROOT/pages/moxiemanager-integration.adoc b/modules/ROOT/pages/moxiemanager-integration.adoc new file mode 100644 index 0000000000..3cc50c0f80 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-integration.adoc @@ -0,0 +1,203 @@ += MoxieManager integration +:navtitle: Integration +:description: Integrate MoxieManager with {productname} and other systems. +:keywords: moxiemanager, integration, tinymce, wordpress + +Ok, so you have tested it on your server and have made sure it works, time to integrate it with whatever system you might be using. + +This is really the part that can be somewhat tricky, certain system require specific Authenticators or custom Authenticators in order to work properly. It can be especially tricky if you system has some custom managment of Sessions. + +[[tinymce-integration]] +== {productname} integration + +MoxieManager picks up certain xref:#tinymce-integration[config options] when integrated into {productname}. + +These are setting you should *set in your {productname} configuration* in order to get the setup you want. See below for examples! + +If you are using xref:moxiemanager-api.adoc[moxman.browse, check these API docs]. + +[cols="1,3",options="header"] +|=== +| Name | Description +|`+moxiemanager__settings+` a| +Configure seperate options for image, media or link dialog, change to either *image*, *file* or *media*. Example Config. + +[source,js] +---- +moxiemanager_image_settings : { + view : 'thumbs', + extensions : 'jpg,png,gif' +} +---- + +This will override any "global" settings. + +|`+moxiemanager_path+` |Public file system path to display by default. For example: `+/files/images+` +|`+moxiemanager_rootpath+` |Public file system path to use as the root. This option needs to be within the configured backend `+filesystem.rootpath+` for security reasons. For example: `+/files/images+` if the server side rootpath is `+/root/site/files+`. +|`+moxiemanager_view+` |Default depends on what dialog in {productname} it is opened from, image insert dialog = thumbs, link insert dialog = files. Can be either `+files+` or `+thumbs+`. +|`+moxiemanager_insert+` |Boolean option that allows you to disable the insert toolbar, but clicking image still works. Note: Option might change behaviour in the future. +|`+moxiemanager_filter+` |Initial filter to apply to file selection. This option will fill the filter input field with the value specified. +|`+moxiemanager_extensions+` |Comma separated list of file extensions to display for. +|`+moxiemanager_include_file_pattern+` |Regexp pattern that the files need to match inorder to be displayed. +|`+moxiemanager_exclude_file_pattern+` |Regexp pattern that will be excluded from file list if it matches. +|`+moxiemanager_include_directory_pattern+` |Regexp pattern that the directories need to mathc inorder to be displayed. +|`+moxiemanager_exclude_directory_pattern+` |Regexp pattern that will be exluded from file list if it matches. +|`+moxiemanager_disabled_tools+` |Comma separated list of tools to disable. Check out xref:moxiemanager-options.adoc#filelist-main-toolbar[moxiemanager_filelist_main_toolbar] for configuring this instead in newer versions. +|`+moxiemanager_hidden_tools+` |Comma separated list of tools to hide. Check out xref:moxiemanager-options.adoc#filelist-main-toolbar[moxiemanager_filelist_main_toolbar] for configuring this instead in newer versions. +|xref:moxiemanager-options.adoc#moxiemanager-image-template[moxiemanager_image_template] |HTML template used when inserting images directly into {productname} using the browse button. +|xref:moxiemanager-options.adoc#moxiemanager-file-template[moxiemanager_file_template] |HTML template used when inserting non image files directly into {productname} using the browse button. +|`+moxiemanager_width+` |Set the width of the window, a low value may break the UI. +|`+moxiemanager_height+` |Set the height of the window, a low value may break the UI. +|`+moxiemanager_fullscreen+` |Boolean value, true if you wish the window to max width/height. +|`+moxiemanager_title+` |Sets the title of the main window, replaces "MoxieManager". +|`+moxiemanager_leftpanel+` |Boolean value, true by default. Show or hide the left filesystems panel. +|xref:moxiemanager-options.adoc#date-format[moxiemanager_date_format] |Enables you to specify a date format to be used when inserting files. +|xref:moxiemanager-options.adoc#insert-filter[moxiemanager_insert_filter] |Callback that enables you to filter the data before it gets inserted. +|`+moxiemanager_skin+` |Enables you to set a custom skin to be used. +|`+relative_urls+` |*{productname} Option*, if this option is set to true, {productname} will take the path returned from MoxieManager and make it relative. +|`+document_base_url+` |*{productname} Option*, defaults to the current page. This is the point relative URLs will be relative to. +|`+remove_script_host+` |*{productname} Option*, Enables you to remove scheme/protocol and host name from urls produced. So `+relative_urls : false+` and `+remove_script_host : true+` will get site absolute paths like `+/my/files/here.jpg+` +|xref:moxiemanager-options.adoc#unique-urls[moxiemanager_unique_urls] |Appends an unique id to bust client side caches. +|xref:moxiemanager-options.adoc#filelist-main-toolbar[moxiemanager_filelist_main_toolbar] |Enables you to control what to display in the main toolbar of the filelist browse dialog. +|xref:moxiemanager-options.adoc#filelist-utils-toolbar[moxiemanager_filelist_utils_toolbar] |Enables you to control what to display in the utils toolbar of the filelist browse dialog. +|xref:moxiemanager-options.adoc#filelist-manage-menu[moxiemanager_filelist_manage_menu] |Enables you to configure what to display in the manage button menu. +|xref:moxiemanager-options.adoc#filelist-context-menu[moxiemanager_filelist_context_menu] |Enables you to configure what to display in the context menu. +|xref:moxiemanager-options.adoc#filelist-insert-toolbar[moxiemanager_filelist_insert_toolbar] |Enables you to configure what to display in the insert/cancel toolbar. +|xref:moxiemanager-options.adoc#editimage-main-toolbar[moxiemanager_editimage_main_toolbar] |Enables you to control what to display in the main toolbar of the edit image dialog. +|xref:moxiemanager-options.adoc#editimage-zoom-toolbar[moxiemanager_editimage_zoom_toolbar] |Enables you to control what to display in the zoom toobar of the edit image dialog. +|xref:moxiemanager-options.adoc#editimage-actions-toolbar[moxiemanager_editimage_actions_toolbar] |Enables you to control what to display in the actions toolbar/pabel of the edit image dialog. +|xref:moxiemanager-options.adoc#remember-last-path[moxiemanager_remember_last_path] |When enabled the MoxieManager will remember the last path the user was in when a file was selected. +|xref:moxiemanager-options.adoc#sort-by[moxiemanager_sort_by] |Changes the default sort by column for file listings. +|xref:moxiemanager-options.adoc#sort-by[moxiemanager_sort_order] |Changes the default sort order asc/desc. +|`+moxiemanager_unique_urls+` |Appends an unique id to bust client side caches. +|`+moxiemanager_upload_auto_close+` |Automatically closes the upload dialog if all files where successfully uploaded. Disabled by default. +|=== + +=== Examples + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_rootpath : '/files/subfolder' +}); +---- + +The rootpath must be within the rootpath set in config.php for security reasons. + +[source,php] +---- +$moxieManagerConfig["filesystem.rootpath"] = "/www/site/files"; +---- + +`+moxiemanager_rootpath : '/files/subfolder'+` is a valid config option if subfolder exists. + +`+moxiemanager_rootpath : '/othersite/files'+` is NOT a valid config option. + +[source,js] +---- +tinymce.init({ + ... + relative_urls : false, +}); +---- + +MoxieManager always returns an absolute URL to {productname}, then the {productname} options convert the urls. In this case, relative_urls is set to false, when you save in {productname}, the resulting path will be: + +`+/my/absolute/url.jpg+` + +Since remove_script_host is false by default. + +[source,js] +---- +tinymce.init({ + ... + relative_urls : false, + remove_script_host : false +}); +---- + +With this example, urls will be absolute WITH the site domain. + +`+http://www.mysite.com/my/absolute/url.jpg+` + +NOTE: Note, lets say you have `+admin.mysite.com+`, you can configure `+document_base_url : 'http://www.mysite.com'+` + +Then URLs should become just as above, and not `+admin.mysite.com+` absolute. + +==== Basic integration + +This is how you integrate the MoxieManager into {productname}. + +[source,js] +---- +tinymce.init({ + selector: "textarea", + plugins: "moxiemanager link image", + toolbar: "insertfile link image", + menubar: false +}); +---- + +This is the most basic integration example. + +==== Custom settings + +These are some examples of custom settings that can be passed from {productname} to MoxieManager. + +For more detailed info about configuration options, check out the xref:#tinymce-integration[{productname} integration] page. + +[source,js] +---- +tinymce.init({ + selector: "textarea", + plugins: "moxiemanager link image", + toolbar: "insertfile link image", + menubar: false, + moxiemanager_file_settings: { + /* Only list txt files, and remove side navigation. */ + moxiemanager_extensions : 'txt', + moxiemanager_leftpanel : false + }, + moxiemanager_image_settings: { + /* Scope to different folder, show thumbnails of selected extensions */ + moxiemanager_title : 'Images', + moxiemanager_extensions : 'jpg,png,gif', + moxiemanager_rootpath : '/testfiles/testfolder', + moxiemanager_view : 'thumbs' + } +}); +---- + +==== Using with CDN version of {productname} + +In order to load MoxieManager, you need to run it with as an external plugin. + +[source,js] +---- +tinymce.init({ + ... + plugins: "moxiemanager link image", + external_plugins: { + "moxiemanager": "/moxiemanager/plugin.min.js" + } +}); +---- + +== Authentication integration + +Setup Authentication to integrate with whatever system you might be using, read more in the xref:moxiemanager-security.adoc[Security] section. + +[[integration-wordpress]] +== Wordpress integration + +These instructions should work for any Wordpress version above 2.5. + +. Download the MoxieManager package from this website. +. Unzip the package so the Wordpress structure looks like this: `+/wp-includes/js/tinymce/plugins/moxiemanager+` +. Download xref:attachment$moxiemanager/mce.zip[this Wordpress plugin package] and unzip so the structure looks like this: `+/wp-content/plugins/mce+` +. Login to Wordpress as administrator, activate the MoxieManager plugin. +. Create a new post or page, the editor should now have an extra button, click it and follow the installation instructions, choose the SessionAuthenticator and leave the session name intact as isLoggedIn. +. Continue and save the config and you are done, you might have to logout/login to Wordpress again for it to work. + +If you have any issues, please use the support ticket system and we will try to assist you. diff --git a/modules/ROOT/pages/moxiemanager-languages.adoc b/modules/ROOT/pages/moxiemanager-languages.adoc new file mode 100644 index 0000000000..6b9a33270f --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-languages.adoc @@ -0,0 +1,69 @@ += MoxieManager languages +:navtitle: Languages +:description: Available MoxieManager languages and the language pack download. +:keywords: moxiemanager, languages, language packs, translation, download + +[[download-language-packs]] +== Download language packs + +The ZIP file contains the `+langs+` folder with the language files for every available MoxieManager language. + +xref:attachment$moxiemanager/moxiemanager-languages.zip[Download the MoxieManager language packs] (ZIP) + +[[available-languages]] +== Available languages + +[cols="3,2,2",options="header"] +|=== +|Language |Code |Updated +|Arabic |`+ar+` |2025-03-14 12:21 +|Azerbaijani |`+az+` |2025-03-14 12:21 +|Basque (Spain) |`+eu_ES+` |2025-03-14 12:21 +|Catalan |`+ca+` |2025-03-14 12:21 +|Chinese (China) |`+zh_CN+` |2025-03-14 12:21 +|Chinese (Taiwan) |`+zh_TW+` |2025-03-14 12:21 +|Chinese (Taiwan) (Big5) |`+zh_TW.Big5+` |2025-03-14 12:21 +|Chinese Simplified |`+zh-Hans+` |2025-03-14 12:21 +|Croatian |`+hr+` |2025-03-14 12:21 +|Czech |`+cs+` |2025-03-14 12:21 +|Danish |`+da+` |2025-03-14 12:21 +|Danish (Denmark) |`+da_DK+` |2025-03-14 12:21 +|Dutch (Netherlands) |`+nl_NL+` |2025-03-14 12:21 +|English (United Kingdom) |`+en_GB+` |2025-03-14 12:21 +|Finnish (Finland) |`+fi_FI+` |2025-03-14 12:21 +|French |`+fr+` |2025-03-14 12:21 +|French (Canada) |`+fr_CA+` |2025-03-14 12:21 +|German |`+de+` |2025-03-14 12:21 +|German (Switzerland) |`+de_CH+` |2025-03-14 12:21 +|Greek (Greece) |`+el_GR+` |2025-03-14 12:21 +|Hebrew |`+he+` |2025-03-14 12:21 +|Hungarian (Hungary) |`+hu_HU+` |2025-03-14 12:21 +|Italian (Italy) |`+it_IT+` |2025-03-14 12:21 +|Japanese |`+ja+` |2025-03-14 12:21 +|Kazakh |`+kk+` |2025-03-14 12:21 +|Kurdish |`+ku+` |2025-03-14 12:21 +|Kurdish (Iraq) |`+ku_IQ+` |2025-03-14 12:21 +|Norwegian Bokmål (Norway) |`+nb_NO+` |2025-03-14 12:21 +|Persian |`+fa+` |2025-03-14 12:21 +|Polish |`+pl+` |2025-03-14 12:21 +|Portuguese (Brazil) |`+pt_BR+` |2025-03-14 12:21 +|Romanian |`+ro+` |2025-03-14 12:21 +|Russian |`+ru+` |2025-03-14 12:21 +|Slovak |`+sk+` |2025-03-14 12:21 +|Slovak (Slovakia) |`+sk_SK+` |2025-03-14 12:21 +|Spanish |`+es+` |2025-03-14 12:21 +|Swedish (Sweden) |`+sv_SE+` |2025-03-14 12:21 +|Thai (Thailand) |`+th_TH+` |2025-03-14 12:21 +|Turkish (Turkey) |`+tr_TR+` |2025-03-14 12:21 +|Ukrainian |`+uk+` |2025-03-14 12:21 +|Ukrainian (Ukraine) |`+uk_UA+` |2025-03-14 12:21 +|Vietnamese |`+vi+` |2025-03-14 12:21 +|Welsh |`+cy+` |2025-03-14 12:21 +|=== + +NOTE: The Chinese (Taiwan) (Big5) language pack (`+zh_TW.Big5+`) is not included in the ZIP file because its download is no longer available. + +[[how-to-translate]] +== How to translate + +The translations for every available language are in the xref:#download-language-packs[MoxieManager language packs]. There is one special item called "_dateformatter.datetime" this is the default format string for dates and different languages have different xref:moxiemanager-options.adoc#date-format[formats]. If you need help with the translation process, link:https://support.tiny.cloud/hc/en-us/requests/new[open a support ticket]. diff --git a/modules/ROOT/pages/moxiemanager-options.adoc b/modules/ROOT/pages/moxiemanager-options.adoc new file mode 100644 index 0000000000..cf234b31a7 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-options.adoc @@ -0,0 +1,2661 @@ += MoxieManager options +:navtitle: Options +:description: Reference for MoxieManager client-side and server-side configuration options. +:keywords: moxiemanager, options, configuration, config.php, web.config + +Here is a complete reference to all available configuration options. + +[[tinymce-specific-options]] +== {productname}-specific options + +[[moxiemanager-file-template]] +=== `+moxiemanager_file_template+` + +This {productname} specific option enables you to insert the selected files as custom HTML. The option expects an HTML string with variables that gets replaced with file data.  This template is used by the insertfile toolbar button and gets used when you insert non image files such as pdf files this would normally be a link to that document. + +==== Variables + +[cols=",",options="header",] +|=== +|Variable |Description +|`+url+` |Url to the selected file. +|`+name+` |Name of the selected file. +|`+path+` |Absolute path to the selected file. +|`+size+` |Size of the selected file in bytes. +|`+parentPath+` |Absolute path to the parent directory of the selected file. +|=== + +==== Encoders + +Variable values can also be encoded to various formats. These are the built in encoders: + +[cols=",",options="header",] +|=== +|Name |Description +|`+urlencode+` |Encodes the variable in url encoding format. +|`+xmlEncode+` |Encodes the variable in XML encoding. For example these: < > & " '. +|`+sizeSuffix+` |Adds a suffix to sizes for kb/mb etc. +|=== + +==== Examples + +Insert file with name and size suffix: + +[source,js] +---- +moxiemanager_file_template: '{$name} {$size|sizeSuffix}' +---- + +[[moxiemanager-image-template]] +=== `+moxiemanager_image_template+` + +This {productname} specific option enables you to insert the selected images as custom HTML. The option expects an HTML string with variables that gets replaced with file data. This template is used by the insertfile toolbar button and gets used when you insert images. + +==== Variables + +[cols=",",options="header",] +|=== +|Variable |Description +|`+url+` |Url to the selected file. +|`+name+` |Name of the selected file. +|`+path+` |Absolute path to the selected file. +|`+size+` |Size of the selected file in bytes. +|`+parentPath+` |Absolute path to the parent directory of the selected file. +|`+meta.width+` |Width of the selected image. +|`+meta.height+` |Height of the selected image. +|`+meta.thumb_url+` |Url to the thumbnail for the selected image. +|`+meta.thumb_width+` |Width of the thumbnail for the selected image. +|`+meta.thumb_height+` |Height of the thumbnail for the selected image. +|=== + +==== Encoders + +Variable values can also be encoded to various formats. These are the built in encoders: + +[cols=",",options="header",] +|=== +|Name |Description +|`+urlencode+` |Encodes the variable in url encoding format. +|`+xmlEncode+` |Encodes the variable in XML encoding. For example these: < > & " '. +|`+sizeSuffix+` |Adds a suffix to sizes for kb/mb etc. +|=== + +==== Examples + +Insert image thumbnail with lightbox link to fullsize image: + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_image_template: '' +}); +---- + +[[tinymce-and-moxman-options]] +== {productname} and MoxMan options + +[[date-format]] +=== `+date_format+` + +The date_format settings allows you to set the format string to be used when producing strings out of date objects returned from the server. This option can be used both in standalone mode and integrated with {productname} it will default to the current language pack format. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ..., + moxiemanager_date_format: '%Y-%d-%m %H:%M:%S' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + date_format: '%Y-%d-%m %H:%M:%S' +}); +---- + +==== Date format items + +[cols=",",options="header",] +|=== +|Item |Description +|`+%D+` |mm/dd/yy (same as %m/%d/%y) +|`+%r+` |12-hour clock time hh:mm:ss with AM or PM (same as %I:%M:%S %p) +|`+%y+` |year as a decimal number without a century (range 00 to 99) +|`+%Y+` |year as a decimal number including the century +|`+%m+` |month as a decimal number (range 01 to 12) +|`+%B+` |full localised month name (e.g. "January") +|`+%b+` |abbreviated localised month name (e.g. "Jan") +|`+%d+` |day of the month as a decimal number (range 01 to 31) +|`+%A+` |full localised weekday name (e.g. "Monday") +|`+%a+` |abbreviated localised weekday name (e.g. "Mon") +|`+%H+` |hour as a decimal number using a 24-hour clock (range 00 to 23) +|`+%I+` |hour as a decimal number using a 12-hour clock (range 01 to 12) +|`+%M+` |minute as a decimal number (range 00-59) +|`+%S+` |second as a decimal number (range 00-59) +|`+%p+` |either "am" or "pm" according to the given time value +|`+%%+` |a literal "%" character +|=== + +[[editimage-actions-toolbar]] +=== `+editimage_actions_toolbar+` + +This option enables you to configure what xref:#controls[buttons] to display in the actions toolbar of the edit image view. The defaults for this config option is "resize crop fliprotate brightness contrast exposure gamma hue saturate sepia vibrance triangleblur colorize grayscale invert sharpen emboss" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_editimage_actions_toolbar: 'resize crop fliprotate brightness contrast exposure gamma hue saturate sepia vibrance triangleblur colorize grayscale invert sharpen emboss' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.edit({ + ... + editimage_actions_toolbar: 'resize crop fliprotate brightness contrast exposure gamma hue saturat sepia vibrance triangleblur colorize grayscale invert sharpen emboss' +}); +---- + +[[editimage-main-toolbar]] +=== `+editimage_main_toolbar+` + +This option enables you to configure what xref:#controls[buttons] to display in the main toolbar of the edit image view. The defaults for this config option is "save revert undo redo" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_editimage_main_toolbar: 'save revert undo redo' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.edit({ + ... + editimage_main_toolbar: 'save revert undo redo' +}); +---- + +[[editimage-zoom-toolbar]] +=== `+editimage_zoom_toolbar+` + +This option enables you to configure what xref:#controls[buttons] to display in the zoom toolbar of the edit image view. The defaults for this config option is "zoomfit zoom" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_editimage_zoom_toolbar: 'zoomfit zoom' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.edit({ + ... + editimage_zoom_toolbar: 'zoomfit zoom' +}); +---- + +[[filelist-main-toolbar]] +=== `+filelist_main_toolbar+` + +This option enables you to configure what to xref:#controls[buttons] to display in the main toolbar of the filelist browse view. The defaults for this config option is "create upload manage" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_filelist_main_toolbar: 'create upload manage' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + filelist_main_toolbar: 'create upload manage' +}); +---- + +[[filelist-insert-toolbar]] +=== `+filelist_insert_toolbar+` + +This option enables you to configure what xref:#controls[buttons] to display in the insert/close toolbar of the filelist browse view. The defaults for this config option is "insert close" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_filelist_insert_toolbar: 'insert close' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + filelist_insert_toolbar: 'insert close' +}); +---- + +[[filelist-utils-toolbar]] +=== `+filelist_utils_toolbar+` + +This option enables you to configure what xref:#controls[buttons] to display in the utils toolbar of the filelist browse view. The defaults for this config option is "refresh viewmode sort filter" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_filelist_utils_toolbar: 'refresh viewmode sort filter' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + filelist_utils_toolbar: 'refresh viewmode sort filter' +}); +---- + +[[filelist-manage-menu]] +=== `+filelist_manage_menu+` + +This option enables you to configure what xref:#controls[menu items] to display in the menu for the manage button in the main toolbar of the filelist browse view. The defaults for this config option is "cut copy paste | view edit rename download addfavorite | zip unzip | remove" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_filelist_manage_menu: 'cut copy paste | view edit rename download addfavorite | zip unzip | remove' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + filelist_manage_menu: 'cut copy paste | view edit rename download addfavorite | zip unzip | remove' +}); +---- + +[[filelist-context-menu]] +=== `+filelist_context_menu+` + +This option enables you to configure what xref:#controls[menu items] to display in the contextmenu of the filelist browse view. The defaults for this config option is "cut copy paste | view edit rename download addfavorite | zip unzip | remove" see the examples below on how to configure it. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_filelist_context_menu: 'cut copy paste | view edit rename download addfavorite | zip unzip | remove' +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + filelist_context_menu: 'cut copy paste | view edit rename download addfavorite | zip unzip | remove' +}); +---- + +[[insert-filter]] +=== `+insert_filter+` + +This option allows you to alter the contents of the JSON that gets inserted into the editor or form field. You can for example change the url to something that matches your needs. See the example below on how to change the url of the inserted file. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ..., + moxiemanager_insert_filter: function(file) { + // Url is located both at the root level and the meta level + file.url += '?id=42'; + file.meta.url = file.url; + + // Override the size + file.size = file.size * 2; + } +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + insert_filter: function(file) { + // Url is located both at the root level and the meta level + file.url += '?id=42'; + file.meta.url = file.url; + + // Override the size + file.size = file.size * 2; + } +}); +---- + +[[remember-last-path]] +=== `+remember_last_path+` + +When this option is sets the MoxieManager to open the last path the user was in when a file was inserted. This won't be persistent when the page reloads. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_remember_last_path: true +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + remember_last_path: true +}); +---- + +[[sort-by]] +=== `+sort_by+` + +When this option lets you change the column to sort the files by this defaults to "name". Valid options are name, size, extension, lastModified. You can also change the xref:#sort-order[sort order]. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_sort_by: "size" +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + sort_by: "size" +}); +---- + +[[sort-order]] +=== `+sort_order+` + +When this option lets you change the order sort the files by this defaults to "asc" but can be set to "desc" for descending order. You can also change column to xref:#sort-by[sort by]. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ... + moxiemanager_sort_order: "desc" +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + sort_order: "desc" +}); +---- + +[[unique-urls]] +=== `+unique_urls+` + +This option allows to generate unique urls from files based on their file size and their last modification date. This will help you bust the browser cache where it would normally cache every image. + +==== Example of usage in {productname} + +[source,js] +---- +tinymce.init({ + ..., + moxiemanager_unique_urls: true +}); +---- + +==== Example of usage in standalone mode + +[source,js] +---- +moxman.browse({ + ... + unique_urls: true +}); +---- + +[[controls]] +== Controls + +=== File list controls + +[cols=",",options="header",] +|=== +|Control name |Description +|`+create+` |Create folder/document menu button. Displays a list of folder and document templates. +|`+upload+` |Upload menu button. Lets you select files from local file system or external locations. +|`+manage+` |Manage menu button. Displays a list of manage options for the current selection. +|`+refresh+` |Refreshes the current file list. +|`+viewmode+` |Switches the current viewmode from thumbnails to a file list. +|`+sort+` |Changes the sorting of the current file list/thumbnail list +|`+filter+` |Lets you filter the current file list. +|`+insert+` |Insets the currently selected files. +|`+close+` |Closes the current dialog. +|`+fileinfo+` |Displays a dialog with the file paths. +|=== + +=== Edit image controls + +[cols=",",options="header",] +|=== +|Control name |Description +|`+save+` |Saves the current image to a user defined file name. +|`+revert+` |Reverts all changes to the current image. +|`+undo+` |Undoes the last action. +|`+redo+` |Redoes the previous action. +|`+zoomfit+` |Zooms the current image to fit the editor view. +|`+zoom+` |Lets the user dynamically change the zoom level. +|`+resize+` |Resizes the current image. +|`+crop+` |Crops the current image. +|`+fliprotate+` |Flips or rotates the current image. +|`+brightness+` |Changes the brightness of the current image. +|`+contrast+` |Changes the contrast of the current image. +|`+exposure+` |Changes the exposure of the current image. +|`+gamma+` |Changes the gamma of the current image. +|`+hue+` |Changes the hue of the current image. +|`+saturate+` |Saturates the current image. +|`+sepia+` |Changes the sepcia of the current image. +|`+vibrance+` |Changes the vibrance of the current image. +|`+triangleblur+` |Adds triangle blur to the current image. +|`+colorize+` |Colorizes the current image. +|`+grayscale+` |Changes the current image to grayscale. +|`+invert+` |Inverts the current image. +|`+sharpen+` |Sharpens the current image. +|`+emboss+` |Applies embross to the current image. +|=== + +[[general]] +== General + +[[general-allow-override]] +=== `+general.allow_override+` + +Allow override of config options using mc_access files. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.allow_override'] = 'hidden_tools,disabled_tools'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +xref:moxiemanager-how-to-guides.adoc#how-to-use-mc-access[Read more about mc_access files here.] + +[[general-debug]] +=== `+general.debug+` + +More details error messages, enable this if you are troubleshooting the software. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.debug'] = true; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[general-demo]] +=== `+general.demo+` + +Demo mode, boolean option, usefull for safe public demo. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.demo'] = false; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[general-disabled-tools]] +=== `+general.disabled_tools+` + +Disable tools from the user interface. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig["general.disabled_tools"] = "upload"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +A list of tools: + +* upload +* create +* manage +* filter + +[[general-hidden-tools]] +=== `+general.hidden_tools+` + +Hide tools from the user interface. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig["general.hidden_tools"] = "upload"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +A list of tools: + +* upload +* create +* manage +* filter + +[[general-language]] +=== `+general.language+` + +Set default xref:moxiemanager-languages.adoc[language] loaded, default language is English. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.language'] = 'en'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[general-license]] +=== `+general.license+` + +This is where you should put your license key you get from purchasing our software. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.license'] = false; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[general-plugins]] +=== `+general.plugins+` + +This is only for PHP + +A string controling the plugins loaded and used. + +[source,php] +---- +$moxieManagerConfig['general.plugins'] = 'Favorites,History,Uploaded,Ftp'; +---- + +xref:moxiemanager-plugins.adoc[Read more about plugins] here, but note that Authenticators are not suppose to be configured in the general.plugins option, but rather in the authenticator option. + +==== .NET plugins + +You need to configure the .NET plugins in your Web.Config file, example follows: + +[source,xml] +---- + + + + + + +---- + +[[general-temp-dir]] +=== `+general.temp_dir+` + +This should point to a writable temp directory, does not need to be accessible through the server, in fact, we recommend you set this to something above your webroot. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['general.temp_dir'] = '../data/temp'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[authentication]] +== Authentication + +[[authenticator]] +=== authenticator + +Set this to whatever authenticator you are planing to use. + +The most common are: + +* xref:moxiemanager-security.adoc#basicauthenticator[BasicAuthenticator] +* xref:moxiemanager-security.adoc#sessionauthenticator[SessionAuthenticator] +* xref:moxiemanager-security.adoc#external-authentication[ExternalAuthenticator] + +==== PHP example + +[source,php] +---- +$moxieManagerConfig["authenticator"] = ""; +---- + +==== .NET example + +[source,xml] +---- + +---- + +If you wish to use no authenticator/login, you can set the config option to an empty string, but please note that your opening your files up to external users + +[[filesystem]] +== Filesystem + +[[filesystem-rootpath]] +=== `+filesystem.rootpath+` + +This is the most important thing to configure, the path where files will be listed/shown, it can be an absolute or relative path (relative from the moxiemanager installation folder). + +==== Named paths + +You can also set a name for the path, this name will show up in the list on the right side instead of the last foldername, useful when you have ID's as names etc. You simply construct your rootpath like so: `+myname=/path/to/files+` + +.Example for PHP integrations + +[source,php] +---- +// Single path +$moxieManagerConfig['filesystem.rootpath'] = "/var/www/htdocs/mysite.com/files"; + +// Multiple named paths +$moxieManagerConfig['filesystem.rootpath'] = "Myfiles=../myfiles;YourFiles=../yourfiles"; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + + +---- + +[[filesystem-include-directory-pattern]] +=== `+filesystem.include_directory_pattern+` + +Match a directory to always include with REGEX, default is empty. + +[source,php] +---- +$moxieManagerConfig['filesystem.include_directory_pattern'] = '/^(myfolder|yourfolder)$/i'; +---- + +[[filesystem-exclude-directory-pattern]] +=== `+filesystem.exclude_directory_pattern+` + +Exclude one of more directories matching a regual expression. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.exclude_directory_pattern'] = '/^(mcith|secret)$/i'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[filesystem-include-file-pattern]] +=== `+filesystem.include_file_pattern+` + +Include files by a REGEX pattern. + +[source,php] +---- +$moxieManagerConfig['filesystem.include_file_pattern'] = '/(\.gif|\.jpg\.png)$/i'; +---- + +This example matches only gif, jpg and png file extensions. + +[[filesystem-exclude-file-pattern]] +=== `+filesystem.exclude_file_pattern+` + +Exlcude files by REGEX pattern. + +[source,php] +---- +$moxieManagerConfig['filesystem.exclude_file_pattern'] = '/\.php$/i'; +---- + +This example excludes all PHP files. + +[[filesystem-extensions]] +=== `+filesystem.extensions+` + +A list of extensions that gets listed inside the MoxieManager this will also restrict what the user may upload. You can restict uploads further using the xref:#upload-extensions[upload.extensions] config option. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.extensions'] = 'jpg,png,gif,zip,pdf,doc'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[filesystem-readable]] +=== `+filesystem.readable+` + +Set readable true/false, usefull if you want to disable read access. + +[source,php] +---- +$moxieManagerConfig['filesystem.readable'] = true; +---- + +[[filesystem-writable]] +=== `+filesystem.writable+` + +Control write access to folder. + +[source,php] +---- +$moxieManagerConfig['filesystem.writable'] = true; +---- + +[[filesystem-directories]] +=== `+filesystem.directories+` + +This config option enables you to override global config options on directories matching a specific pattern. This pattern can either be a public file system path like "/files/documents" or a directory name like "images". + +If a public file system path is specified that specific path and all directories below it would get the new option. If you specify only a directory name any directory anywhere matching that exact name would have the speicifed config options. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.directories'] = array( + "images" => array( + "upload.extensions" => "gif,jpg,png" + ), + + "/files/documents" => array( + "upload.extensions" => "docx,pdf" + ) +); +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + + + + + + +---- + +[[filesystem-overwrite-action]] +=== `+filesystem.overwrite_action+` + +This option lets you specify a default action to execute instead of asking the user what to do if a file already exists on for example upload. + +==== Options for this setting + +[cols="1,3"] +|=== +|`+rename+` |Generate an unique name for the file by adding a number to the end of it. +|`+skip+` |Skip the file and move on to the next one. +|`+overwrite+` |Overwrite the file. +|`+ask+` |Ask the user what it's supposed to do. +|=== + +[[filesystem-allow-override]] +=== `+filesystem.allow_override+` + +Allow specific settings to be overriden by mc_access files. + +[source,php] +---- +$moxieManagerConfig['filesystem.allow_override'] = '*'; +---- + +[[local-filesystem]] +== Local filesystem + +[[filesystem-local-wwwroot]] +=== `+filesystem.local.wwwroot+` + +This option should contain the local file system path to the web servers wwwroot. + +It will automatically detect the wwwroot by default but some very specific server setups might need this one to be defined. + +The wwwroot should be the point http://www.site.com/ points to in windows this is normally `+c:/Inetpub/wwwroot+` or in Linux it might be `+/var/www+` this depends on the server setup. + +This setting is used to map file paths such as `+c:/Inetpub/wwwroot/somedir/somefile.gif+` into URLs such as `+http://www.mysite.com/somedir/somefile.gif+` it's doing this by taking the path and removing the wwwroot part. + +So for example if the preview.wwwroot is configured to `+c:/Inetpub/wwwroot+` it will then take a path like this `+c:/Inetpub/wwwroot/somedir/somefile.gif+` and convert it by removing the first part and the result would be `+/somedir/somefile.gif+` it will then use other options such as `+filesystem.local.urlprefix+` and `+filesystem.local.urlsuffix+` to build a complete URL such as `+http://www.mysite.com/mydir/myfile.gif?somesuffix=x+` + +If you are using virtual directories, you must configure this option to the point where the files for the virtual directory is stored. For example d:/myroot/mydir if the virtual directory points to d:/myroot/mydir + +If you are using an Apache Alias the value for this option is the alias file system location + +==== Advanced WWWROOT configuration + +If you are using multiple rootpaths and need multiple wwwroot options, you can set this instead of the standard options. + +[source,php] +---- +$moxieManagerConfig['filesystem.rootpath'] = "c:/inetpub/wwwroot/files;d:/inetpub/public/files"; +---- + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.local.wwwroot'] = array( + "c:/inetpub/wwwroot" => array( + "urlprefix" => "http://www.domain.com/", + "urlsuffix" => "?suffix" + ), + "d:/inetpub/public" => array( + "urlprefix" => "http://www.otherdomain.com/", + "urlsuffix" => "?suffix" + ) +); +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + +---- + +Use this only in really special cases. + +[[filesystem-local-urlprefix]] +=== `+filesystem.local.urlprefix+` + +This option should contain the URL prefix, by default this prefix is the current protocol and host such as http://mysite.com/. But some times preview should be passed through a PHP page or similar to stream a file and then you want to alter this option. + +Variable names (including the curly braces) are replaced as follows. Multiple instances of the same variable can be used, and are replaced. `+filesystem.local.urlprefix+` is currently the only setting in which these variables are replaced. + +[cols=",",] +|=== +|\{proto} |Replaced with the protocol of the site (usually http). +|\{host} |Replaced with the host name of the site (for example, www.mysite.com). +|\{port} |Replaced with the port number of the site, which is 80 for most production Web sites. +|=== + +[source,php] +---- +$moxieManagerConfig['filesystem.local.urlprefix'] = "http://somesite.com/somepreviewpage.php?path="; +---- + +[[filesystem-local-urlsuffix]] +=== `+filesystem.local.urlsuffix+` + +This option enables you to add a suffix of parameters to the end of the preview URL this can be useful if you need to handle preview in a special way. + +[source,php] +---- +$moxieManagerConfig['filesystem.local.urlsuffix'] = "?someparam=somevalue"; +---- + +[[filesystem-local-access-file-name]] +=== `+filesystem.local.access_file_name+` + +This option enables you to specify the file name that is used to load directory specific MoxieManager options. + +The default name is `+mc_access+` + +[source,php] +---- +$moxieManagerConfig['filesystem.local.access_file_name'] = "mc_access_file"; +---- + +[[filesystem-local-cache]] +=== `+filesystem.local.cache+` + +This option enables you to turn on persistent database caching. This boosts performance by listing files from a database that is kept in sync with your local file system. You can always refresh this cached filesystem by pressing the refresh button. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['filesystem.local.cache'] = true; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[filesystem-local-allow-override]] +=== `+filesystem.local.allow_override+` + +Allow to override options using mc_access files. + +[source,php] +---- +$moxieManagerConfig['filesystem.local.allow_override'] = ""; +---- + +[[createdir]] +== Createdir + +[[createdir-templates]] +=== `+createdir.templates+` + +This option is used by the create directory dialog, the files specified in this comma separated list will be used as templates for creating new directories. This enables users to select the template from a drop list and create a instance of that directory. + +This option can be very useful when for example a index.html file and a images directory is to be auto created for the user. + +There are a few built in variables that gets auto replaced when this option is used, these variables are: + +[cols=",",] +|=== +|$\{path} |The current path. +|$\{rootpath} |The current root path. +|$\{configpath} |The current mc_access path. +|=== + +[source,php] +---- +$moxieManagerConfig['creatdir.templates'] = '${rootpath}/templates/dir1,${rootpath}/templates/dir2'; +---- + +[[createdir-include-directory-pattern]] +=== `+createdir.include_directory_pattern+` + +Only allow a specific set of directory names to be created using REGEX matching. + +[source,php] +---- +$moxieManagerConfig['createdir.include_directory_pattern'] = ''; +---- + +[[createdir-exclude-directory-pattern]] +=== `+createdir.exclude_directory_pattern+` + +Exclude a specific set of folder names using a REGEX pattern. + +[source,php] +---- +$moxieManagerConfig['createdir.exclude_directory_pattern'] = ''; +---- + +[[createdir-allow-override]] +=== `+createdir.allow_override+` + +Allow override for mc_access files. + +[source,php] +---- +$moxieManagerConfig['createdir.allow_override'] = '*'; +---- + +[[createdoc]] +== Createdoc + +[[createdoc-templates]] +=== `+createdoc.templates+` + +This option is used by the create file dialog, the files specified in this comma separated list will be used as templates for creating new files. + +There are a few built in variables that gets auto replaced when this option is used, these variables are: + +[cols=",",] +|=== +|$\{path} |The current path. +|$\{rootpath} |The current root path. +|$\{configpath} |The current mc_access path. +|=== + +[source,php] +---- +$moxieManagerConfig["createdoc.templates"] = '${rootpath}/templates/file1.html'; +---- + +[[createdoc-fields]] +=== `+createdoc.fields+` + +This option enables you to specify search/replace fields to be added to the create document dialog. This option should contain a comma separated list of fields where even item are the title of the field and the odd items are the variable names. + +These fields will then be search/replaced within the template for example a field called title will search for $\{title} and replace that with the contents specified by the user. This can be very useful when you want to setup specific fields like title, keywords and description. + +[source,php] +---- +$moxieManagerConfig['createdoc.fields'] = "title,Document title,keywords,Keywords"; +---- + +[[createdoc-include-file-pattern]] +=== `+createdoc.include_file_pattern+` + +This option can be used to exclude all file names but those matching the specified regexp pattern. + +[source,php] +---- +$moxieManagerConfig["createdoc.include_file_pattern"] = "/^onefolder|twofolder$/i"; +---- + +[[createdoc-exclude-file-pattern]] +=== `+createdoc.exclude_file_pattern+` + +This option can be used to exclude all file names but those matching the specified regexp pattern. + +[source,php] +---- +$moxieManagerConfig["createdoc.exclude_file_pattern"] = "/^notthis|notthat$/i"; +---- + +[[createdoc-extensions]] +=== `+createdoc.extensions+` + +Limit the extensions type of files one can create using createdoc. + +Comma seperated list of extensions. + +[source,php] +---- +$moxieManagerConfig["createdoc.extensions"] = "htm,html,txt"; +---- + +[[createdoc-allow-override]] +=== `+createdoc.allow_override+` + +[[upload]] +== Upload + +[[upload-allow-override]] +=== `+upload.allow_override+` + +Set what options can be use in mc_access files. + +[source,php] +---- +$moxieManagerConfig['upload.allow_override'] = "chunk_size"; +---- + +[[upload-autoresize]] +=== `+upload.autoresize+` + +Auto resize images uploaded. + +[source,php] +---- +$moxieManagerConfig['upload.autoresize'] = true; +---- + +[[upload-autoresize-jpeg-quality]] +=== `+upload.autoresize_jpeg_quality+` + +This option enables you specify the autoresize jpeg quality in percent 0-100. + +[source,php] +---- +$moxieManagerConfig['upload.autoresize_jpeg_quality'] = "90"; +---- + +[[upload-chunk-size]] +=== `+upload.chunk_size+` + +This option will enable you to specify the chunk size that the multiple upload feature will use. Chunking enables you to upload very large files regardless of post/upload restrictions set by the hosting provider. Notice that you can use mb, kb suffixes. + +[source,php] +---- +$moxieManagerConfig['upload.chunk_size'] = "10MB"; +---- + +[[upload-exclude-file-pattern]] +=== `+upload.exclude_file_pattern+` + +Files matching this regex pattern will be rejected. + +[source,php] +---- +$moxieManagerConfig["upload.exclude_file_pattern"] = "/^test|old$/i"; +---- + +[[upload-extensions]] +=== `+upload.extensions+` + +This option should contain a comma separated list of valid extensions that can be uploaded. Also this will further restrict the filtering of the xref:#filesystem-extensions[filesystem.extensions] config option. So you can for example let the user list more file types than the user can upload. This is especially useful when you want to restict image uploads only to a specific directory. + +Remember that in addition to this setting, all file extensions must also be allowed in the xref:#filesystem-extensions[filesystem.extensions] setting. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['upload.extensions'] = 'gif,jpg,png'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[upload-include-file-pattern]] +=== `+upload.include_file_pattern+` + +Only filenames matching this regex patterns may be uploaded. + +[source,php] +---- +$moxieManagerConfig["upload.include_file_pattern"] = "/^myfile|yourfile$/i"; +---- + +[[upload-max-height]] +=== `+upload.max_height+` + +Use this option to specify a max height of images, files with a greater height that this value will not be accepted. + +[source,php] +---- +$moxieManagerConfig['upload.max_height'] = 768; +---- + +If `+upload.autoresize+` is set to true, files will be resized down to max width/max height. + +[[upload-maxsize]] +=== `+upload.maxsize+` + +This option enables you specify the max upload file size, files larger than this size will be denied. Large files will be split into blocks and multiple requests this can be controlled by the xref:#upload-chunk-size[chunk_size] config option. + +The format of this option is MB or KB or b, so you may write 100Kb or 10MB or 10b. + +[source,php] +---- +$moxieManagerConfig['upload.maxsize'] = "10MB"; +---- + +[[upload-max-width]] +=== `+upload.max_width+` + +Use this option to specify a max width of images, files with a greater width that this value will not be accepted. + +[source,php] +---- +$moxieManagerConfig['upload.max_width'] = 1024; +---- + +If `+upload.autoresize+` is set to true, files will be resized down to max width/max height. + +[[upload-overwrite]] +=== `+upload.overwrite+` + +This options controls if you allow files to be overwritten or not. + +You can also configure it to "rename", and if a file with the same name already exists, it will rename it to _2. + +[source,php] +---- +$moxieManagerConfig['upload.overwrite'] = true; +---- + +Possible values: + +[cols=",",] +|=== +|true |If a file with same name exists, it will be overwritten. +|false |If a file with same name exists, error will be given and file not overwritten. +|rename |If a file with same name exists, new file will be renamed to unique file name. +|=== + +Default value is FALSE. + +[[delete]] +== Delete + +[[delete-include-file-pattern]] +=== `+delete.include_file_pattern+` + +This option can be used to exclude all file names but those matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.include_file_pattern'] = "/^file|morefile$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[delete-exclude-file-pattern]] +=== `+delete.exclude_file_pattern+` + +This option can be used to exclude all file names matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.exclude_file_pattern'] = "/^notthis$|^notthat$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[delete-include-directory-pattern]] +=== `+delete.include_directory_pattern+` + +This option can be used to exclude all dir names but those matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.include_directory_pattern'] = "/^dir|moredir$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[delete-exclude-directory-pattern]] +=== `+delete.exclude_directory_pattern+` + +This option can be used to exclude all dir names matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.exclude_directory_pattern'] = "/^notthis$|^notthat$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[delete-extensions]] +=== `+delete.extensions+` + +This option enables you to restrict rename to only the matching file extensions. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.extensions'] = "gif,jpg"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[delete-allow-override]] +=== `+delete.allow_override+` + +Enable options to be configured in mc_access files. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['delete.allow_override'] = "*"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename]] +== Rename + +[[rename-allow-override]] +=== `+rename.allow_override+` + +Enable options to be configured in mc_access files. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.allow_override'] = "*"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename-exclude-directory-pattern]] +=== `+rename.exclude_directory_pattern+` + +This option can be used to exclude all dir names matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.exclude_directory_pattern'] = "/^notthis$|^notthat$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename-exclude-file-pattern]] +=== `+rename.exclude_file_pattern+` + +This option can be used to exclude all file names matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.exclude_file_pattern'] = "/^notthis$|^notthat$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename-extensions]] +=== `+rename.extensions+` + +This option enables you to restrict rename to only the matching file extensions. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.extensions'] = "gif,jpg"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename-include-directory-pattern]] +=== `+rename.include_directory_pattern+` + +This option can be used to exclude all dir names but those matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.include_directory_pattern'] = "/^dir|moredir$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[rename-include-file-pattern]] +=== `+rename.include_file_pattern+` + +This option can be used to exclude all file names but those matching the specified regexp pattern. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['rename.include_file_pattern'] = "/^file|morefile$/i"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[edit]] +== Edit + +[[edit-allow-override]] +=== `+edit.allow_override+` + +Allow to override options in mc_access + +[source,php] +---- +$moxieManagerConfig['edit.allow_override'] = "extensions"; +---- + +[[edit-encoding]] +=== `+edit.encoding+` + +This option enables you to force a specific encoding when editing text files. This can be either "utf-8" or "iso-8859-1". + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['edit.encoding'] = "utf-8"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[edit-exclude-file-pattern]] +=== `+edit.exclude_file_pattern+` + +This option can be used to exclude editing of file names matching the specified regexp pattern. + +[source,php] +---- +$moxieManagerConfig['edit.exclude_file_pattern'] = "/^nofile|noesfile$/i"; +---- + +[[edit-extensions]] +=== `+edit.extensions+` + +Allow these certain extensions to be edited. + +[source,php] +---- +$moxieManagerConfig['edit.extensions'] = "txt,htm,html,jpg,gif,png"; +---- + +[[edit-include-file-pattern]] +=== `+edit.include_file_pattern+` + +This option can be used to include editing of file names matching the specified regexp pattern. + +[source,php] +---- +$moxieManagerConfig['edit.include_file_pattern'] = "/^file|morefile$/i"; +---- + +[[edit-jpeg-quality]] +=== `+edit.jpeg_quality+` + +Set the jpeg quality of edited images. + +[source,php] +---- +$moxieManagerConfig['edit.jpeg_quality'] = "90"; +---- + +[[edit-line-endings]] +=== `+edit.line_endings+` + +This option enables you to force the line endings to a specific format when editing text files. Possible values for this option is "crlf" for windows style line endings or "lf" for unix style line endings. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['edit.line_endings'] = "crlf"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[view]] +== View + +[[view-allow-override]] +=== `+view.allow_override+` + +Enable options to be set in mc_access. + +[source,php] +---- +$moxieManagerConfig['view.allow_override'] = "extensions"; +---- + +[[view-exclude-file-pattern]] +=== `+view.exclude_file_pattern+` + +Exclude files to be viewable by a REGEX pattern. + +[source,php] +---- +$moxieManagerConfig['view.exclude_file_pattern'] = '/(nothis|notthat)/i'; +---- + +[[view-extensions]] +=== `+view.extensions+` + +Extensions allowed to be viewed in viewer. + +[source,php] +---- +$moxieManagerConfig['view.extensions'] = "jpg,gif,png"; +---- + +[[view-include-file-pattern]] +=== `+view.include_file_pattern+` + +Include files to be viewable by a REGEX pattern. + +[source,php] +---- +$moxieManagerConfig['view.include_file_pattern'] = '/(myfile|morefile)/i'; +---- + +[[download]] +== Download + +[[download-include-file-pattern]] +=== `+download.include_file_pattern+` + +Only filenames matching this regex patterns may be downloaded. + +[source,php] +---- +$moxieManagerConfig["download.include_file_pattern"] = "/^myfile|yourfile$/i"; +---- + +[[download-exclude-file-pattern]] +=== `+download.exclude_file_pattern+` + +Filenames matching this regex pattern can not be downloaded. + +[source,php] +---- +$moxieManagerConfig["download.exclude_file_pattern"] = "/^myfile|yourfile$/i"; +---- + +[[download-extensions]] +=== `+download.extensions+` + +Only files with these extensions may be downloaded. + +[source,php] +---- +$moxieManagerConfig['download.extensions'] = "jpg,gif,png,txt,doc,pdf"; +---- + +[[download-allow-override]] +=== `+download.allow_override+` + +Allow only certain options to be used in mc_access files. + +[source,php] +---- +$moxieManagerConfig['download.allow_override'] = "extensions"; +---- + +[[thumbnail]] +== Thumbnail + +[[thumbnail-allow-override]] +=== `+thumbnail.allow_override+` + +Allow certain options to be used in mc_access files. + +[source,php] +---- +$moxieManagerConfig['thumbnail.allow_override'] = "enabled"; +---- + +[[thumbnail-auto-generate]] +=== `+thumbnail.auto_generate+` + +Enable auto generation of thumbnails. + +[source,php] +---- +$moxieManagerConfig['thumbnail.auto_generate'] = true; +---- + +[[thumbnail-delete]] +=== `+thumbnail.delete+` + +This option enables you to control if thumbnails should be deleted when the main image is deleted or not. + +Default value is TRUE. + +[source,php] +---- +$moxieManagerConfig['thumbnail.delete'] = true; +---- + +[[thumbnail-enabled]] +=== `+thumbnail.enabled+` + +This option enables you to tell the MoxieManager to use generated thumbnails if they exists. + +[source,php] +---- +$moxieManagerConfig['thumbnail.enabled'] = true; +---- + +[[thumbnail-folder]] +=== `+thumbnail.folder+` + +This is a relative path to where the generated thumbnails should be stored and retrieved from, as default, it uses "mcith" folder. This folder will be created if it does not exist, the folder will be created as a sub folder to the folder where the image is. + +If you do not wish to show this folder, you can filter it out using the `+filesystem.exclude_directory_pattern+` option. + +NOTE: Please note that this is a required configuration if you want to use the thumbnail save functionality. + +[source,php] +---- +$moxieManagerConfig['thumbnail.folder'] = "mcith"; +---- + +[[thumbnail-height]] +=== `+thumbnail.height+` + +Set the height of generated thumbnails. + +[source,php] +---- +$moxieManagerConfig['thumbnail.height'] = 150; +---- + +[[thumbnail-jpeg-quality]] +=== `+thumbnail.jpeg_quality+` + +The jpeg quality setting for thumbnails. + +[source,php] +---- +$moxieManagerConfig['thumbnail.jpeg_quality'] = "90"; +---- + +[[thumbnail-mode]] +=== `+thumbnail.mode+` + +Set thumbnail mode to either *resize* (default) or *crop*. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig["thumbnail.mode"] = "crop"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +We recommend using the default "resize". + +[[thumbnail-prefix]] +=== `+thumbnail.prefix+` + +This is an optional prefix for the name of the thumbnail file created by auto generation. The default of this setting is "mcith_". + +[source,php] +---- +$moxieManagerConfig["thumbnail.prefix"] = "mcith_"; +---- + +[[thumbnail-use-exif]] +=== `+thumbnail.use_exif+` + +Boolean option for enabling the use of EXIF data for the display of thumbnails. Many jpg, jpeg or tiff images contains a thumbnail version of the image, this options enables MoxieManager to extract and use that thumbnail. The thumbnail will not be saved down, it is extracted every time the image is viewed inside MoxieManager. + +NOTE: Please note that the size of this thumbnail will be stretched to the size specified in the MoxieManager configuration options. + +Default value of this option is false. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['thumbnail.use_exif'] = true; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[thumbnail-width]] +=== `+thumbnail.width+` + +Set the width of generated thumbnails. + +[source,php] +---- +$moxieManagerConfig['thumbnail.width'] = 150; +---- + +[[cache]] +== Cache + +[[cache-connection]] +=== `+cache.connection+` + +As of PHP version 1.2.2 we introduced a caching layer for speeding up remote filesystems mainly. + +`+cache.connection+` should contain your SQLite or MySQL connection string. + +In the case of SQLite: + +`+sqlite:./data/storage/cache.s3db+` + +In the case of MySQL: + +`+mysql:host=localhost;dbname=moxmancache;username=user;password=pass+` + +You can find the *schemas* for MySQL and SQLite in the *moxiemanger/classes/Vfs/Cache* folder. + +There is a known issue of an error message if logging is disabled, you can enable logging and set the level to "info" and it should work. + +NOTE: Note that this feature is not available fully for .NET just yet, only a memory caching layer, full feature coming. + +[[sql]] +== SQL + +[[sql-connection]] +=== `+sql.connection+` + +Sql connection for storing data such as metadata etc. + +[source,php] +---- +$moxieManagerConfig['sql.connection'] = 'sqlite:../data/storage/moxman.s3db'; +---- + +or + +[source,php] +---- +$moxieManagerConfig['sql.connection'] = 'mysql:host=localhost;dbname=moxiemanager'; +---- + +Should not be publicly accessible, but no real critical data is stored in this. + +[[sql-username]] +=== `+sql.username+` + +Username of sql user. + +[source,php] +---- +$moxieManagerConfig['sql.username'] = 'moxmanuser'; +---- + +[[sql-password]] +=== `+sql.password+` + +Password of SQL user. + +[source,php] +---- +$moxieManagerConfig['sql.password'] = 'mytopsecretpasswordnooneknows'; +---- + +[[sql-table-prefix]] +=== `+sql.table_prefix+` + +A simple and short table prefix. + +[source,php] +---- +$moxieManagerConfig['sql.table_prefix'] = 'moxman_'; +---- + +[[storage]] +== Storage + +[[storage-engine]] +=== `+storage.engine+` + +Storage engine, used for anything needing storage, mostly user specific data. + +[source,php] +---- +$moxieManagerConfig['storage.engine'] = 'json'; +---- + +Possible options are + +[cols=",",] +|=== +| json |Recommended +| mysql |Experimental +| sqlite |Experimental +|=== + +NOTE: Please note, we recommend using the default json engine for this storage operation. + +If you want extra security, configure the path to a directory above the wwwroot of your website. + +[[storage-path]] +=== `+storage.path+` + +The path of the storage engine for JSON options. + +[source,php] +---- +$moxieManagerConfig['storage.path'] = './data/storage'; +---- + +[[log]] +== Log + +[[log-enabled]] +=== `+log.enabled+` + +This boolean value will enable (true) or disable (false) the file logging. + +[source,php] +---- +$moxieManagerConfig['log.enabled'] = true; +---- + +[[log-filename]] +=== `+log.filename+` + +This option enables you to specify the file name format for the log files. The `+{level}+` will be replaced with the current log level. So for example if you want all messages in one file you can specify something like `+messages.log+` if you want separate files for each log level (recommended) you can specify `+{level}.log+`. + +[source,php] +---- +$moxieManagerConfig['log.filename'] = "{level}.log"; +---- + +[[log-filter]] +=== `+log.filter+` + +Match only logging on specific REGEX filter, for example, you might want to filter a specific plugin. + +[source,php] +---- +$moxieManagerConfig['log.filter'] = "/auth/i"; +---- + +[[log-format]] +=== `+log.format+` + +This option enables you to specify the message format for each log row. + +Variables that gets automatically replaced. + +[cols="1,3",] +|=== +|+{time}+ |Will be the current time when the message was created. +|+{level}+ |Will be a string representation of the current log level. +|+{message}+ |Will contain the log message body. +|=== + +[source,php] +---- +$moxieManagerConfig['log.format'] = "[{time}] [{level}] {message}"; +---- + +[[log-level]] +=== `+log.level+` + +This option enables you to specify the current log level. The levels are: + +* debug +* info +* warn +* error +* fatal + +[source,php] +---- +$moxieManagerConfig['log.level'] = "error"; +---- + +[[log-max-files]] +=== `+log.max_files+` + +This option enables you to specify the max files in rotation when a log file gets bigger than the specified xref:#log-max-size[log.max_size] it will be rotated. + +This feature is very useful to keep the logs at a fixed size. + +[source,php] +---- +$moxieManagerConfig['log.max_files'] = "10"; +---- + +[[log-max-size]] +=== `+log.max_size+` + +This option enables you to specify the max size of the log file before it rotates it. This size can use prefixes for example: 10mb or 100k is valid. + +[source,php] +---- +$moxieManagerConfig['log.max_size'] = "100k"; +---- + +[[log-path]] +=== `+log.path+` + +This option should contain the relative or absolute path to where the log files is to be stored. + +Remember: You need to make sure that this directory is writable by the Web server. + +[source,php] +---- +$moxieManagerConfig['log.path'] = "logs"; +---- + +[[sessionauthenticator]] +== SessionAuthenticator + +[[sessionauthenticator-config-prefix]] +=== `+SessionAuthenticator.config_prefix+` + +This option enables override any config option from a session, the value of this option will be used as a prefix when it looks though the sessions for config options. + +NOTE: Please note that the prefix is REQUIRED and set to moxiemanager by default in the config file. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['SessionAuthenticator.config_prefix'] = "moxiemanager"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +So if you wish to overwrite the rootpath using sessions. + +.Example for PHP integrations + +[source,php] +---- +$_SESSION["moxiemanager.filesystem.rootpath"] = "/some/root"; +---- + +.Example for .NET integrations + +[source] +---- +Session["moxiemanager.filesystem.rootpath"] = "c:\some\site"; +---- + +[[sessionauthenticator-logged-in-key]] +=== `+SessionAuthenticator.logged_in_key+` + +This option enables you specify what session key to check for if the user is logged in or not. The session value of this key should be set to true if the user is to access the MoxieManager. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['SessionAuthenticator.logged_in_key'] = "IsLoggedIn"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +In your own application simply set the session variable to the above key, and it should authenticate that user. + +.Example for PHP integrations + +[source,php] +---- +$_SESSION["IsLoggedIn"] = true; +---- + +.Example for .NET integrations + +[source] +---- +Session["IsLoggedIn"] = true; +---- + +The SessionAuthenticator will check for that session to validate the user, so in your login page, set and everything should work just fine. + +[[sessionauthenticator-user-key]] +=== `+SessionAuthenticator.user_key+` + +This option enables you specify what session key to grab the user/login name from. The value of this session can then be substituted with the $\{user} in any of the config parameters. Most common is to place it in the filesystem.rootpath config value, see below for a example. Notice a any \, / or : will be removed form the user name for security reasons. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['SessionAuthenticator.user_key'] = "UserName"; +$moxieManagerConfig['filesystem.rootpath'] = 'users/${user}'; // Override root by username +---- + +.Example for .NET integrations + +[source,xml] +---- + + +---- + +Then you can set the session in your application and the variable in the rootpath will be replaced. + +.Example for PHP integrations + +[source,php] +---- +$_SESSION["UserName"] = "Tony"; +---- + +.Example for .NET integrations + +[source] +---- +Session["UserName"] = "Tony"; +---- + +[[externalauthenticator]] +== ExternalAuthenticator + +[[externalauthenticator-external-auth-url]] +=== `+ExternalAuthenticator.external_auth_url+` + +This option enables you to specify a URL to a external authentication page this page can be located on a remote server or be written in another language than PHP. So it makes it possible to install and use the software on a ASP or JSP site and authenticate against that sites sessions. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['ExternalAuthenticator.external_auth_url'] = "auth_example.jsp"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +Check the ExternalAuthenticator folder in your install for examples for many languages. + +[[externalauthenticator-secret-key]] +=== `+ExternalAuthenticator.secret_key+` + +This option should include a secret key, this key will be used in the authentication mechanism so the remote page specified with the `+ExternalAuthenticator.external_auth_url+` needs to match this key. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['ExternalAuthenticator.secret_key'] = "replacemewithsomerandomkeyandkeepitsecret"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[ipauthenticator]] +== IpAuthenticator + +[[ipauthenticator-ip-numbers]] +=== `+IpAuthenticator.ip_numbers+` + +This option enables you valid IP numbers that may access the application. Both individual IP numbers and IP ranges are accepted. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['IpAuthenticator.ip_numbers'] = "10.0.0.1,10.0.0.2,192.168.1.1-192.168.1.255"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[cakeauthenticator]] +== CakeAuthenticator + +[[cakeauthenticator-logged-in-key]] +=== `+CakeAuthenticator.logged_in_key+` + +This enables you to specify the session key to look for when authenticating the user with Cake PHP. This option defaults to "isloggedin" + +[source,php] +---- +$moxieManagerConfig['CakeAuthenticator.logged_in_key'] = "MyLoggedInKey"; +---- + +You can then use this code to authenticate the user: + +[source,php] +---- +// Login the user and override the filesystem.rootpath setting +CakeSession::write('MyLoggedInKey', "true"); +CakeSession::write('moxiemanager.filesystem.rootpath', "/var/www/myroot"); +---- + +[[cakeauthenticator-user-key]] +=== `+CakeAuthenticator.user_key+` + +This enables you to specify the key to look for in the sessions to override the user variable. The $\{user} will be replaced in all config options if you set the Cake PHP user session key + +[source,php] +---- +// Change the user key too look for +$moxieManagerConfig['CakeAuthenticator.user_key'] = 'user'; + +// User specific path in moxiemanager/config.php +$moxieManagerConfig['filesystem.rootpath'] = 'users/${user}'; +---- + +Override the user by setting: + +[source,php] +---- +// Override user +CakeSession::write("user", "someuser"); +---- + +[[cakeauthenticator-config-prefix]] +=== `+CakeAuthenticator.config_prefix+` + +This enables you to specify the prefix to look for when overriding config options. This default to "moxiemanager". + +You can then use this code to authenticate the user: + +[source,php] +---- +// Override the filesystem.rootpath +CakeSession::write('moxiemanager.filesystem.rootpath', "/var/www/myroot"); +---- + +[[codeigniterauthenticator-options]] +== CodeIgniterAuthenticator + +[[codeigniterauthenticator-logged-in-key]] +=== `+CodeIgniterAuthenticator.logged_in_key+` + +This enables you to specify the session key to look for when authenticating the user with CodeIgniter PHP. This option defaults to "isloggedin" + +[source,php] +---- +$moxieManagerConfig['CodeIgniterAuthenticator.logged_in_key'] = "MyLoggedInKey"; +---- + +You can then use this code to authenticate the user: + +[source,php] +---- +// Login the user and override the filesystem.rootpath setting in your controller +$this->session->set_userdata('MyLoggedInKey', "true"); +$this->session->set_userdata('moxiemanager.filesystem.rootpath', "/var/www/myroot"); +---- + +[[codeigniterauthenticator-user-key]] +=== `+CodeIgniterAuthenticator.user_key+` + +This enables you to specify the key to look for in the sessions to override the user variable. The $\{user} will be replaced in all config options if you set the CodeIgniter PHP user session key + +[source,php] +---- +// Change the user key too look for +$moxieManagerConfig['CodeIgniterAuthenticator.user_key'] = 'user'; + +// User specific path in moxiemanager/config.php +$moxieManagerConfig['filesystem.rootpath'] = 'users/${user}'; +---- + +Override the user by setting: + +[source,php] +---- +// Override user +$this->session->set_userdata("user", "someuser"); +---- + +[[codeigniterauthenticator-environment]] +=== `+CodeIgniterAuthenticator.environment+` + +This option enables you to switch environment from "development" to "production". Sessions are not shared between different environments so this is an important config option to change, + +[source,php] +---- +$moxieManagerConfig['CodeIgniterAuthenticator.environment'] = "production"; +---- + +[[codeigniterauthenticator-config-prefix]] +=== `+CodeIgniterAuthenticator.config_prefix+` + +This enables you to specify the prefix to look for when overriding config options. This default to "moxiemanager". + +You can then use this code to authenticate the user: + +[source,php] +---- +// Override the filesystem.rootpath +$this->session->set_userdata('moxiemanager.filesystem.rootpath', "/var/www/myroot"); +---- + +[[zendauthenticator-options]] +== ZendAuthenticator + +[[zendauthenticator-config-prefix]] +=== `+ZendAuthenticator.config_prefix+` + +This enables you to specify the prefix to look for when overriding config options. This default to "moxiemanager". + +You can then use this code to authenticate the user: + +[source,php] +---- +// Override the filesystem.rootpath +$session = new Zend\Session\Container(); +$session->{"moxiemanager.filesystem.rootpath"} = "/var/www/myroot"; +---- + +[[zendauthenticator-library-path]] +=== `+ZendAuthenticator.library_path+` + +This lets you specify a custom installation path for the zend framework. + +[source,php] +---- +// Set the container name +$moxieManagerConfig['ZendAuthenticator.library_path'] = '/path/to/zendframework'; +---- + +[[zendauthenticator-logged-in-key]] +=== `+ZendAuthenticator.logged_in_key+` + +This enables you to specify the session key to look for when authenticating the user with Zend 2 framework. This option defaults to "loggedin" + +[source,php] +---- +$moxieManagerConfig['ZendAuthenticator.logged_in_key'] = "MyLoggedInKey"; +---- + +You can then use this code to authenticate the user: + +[source,php] +---- +// Login the user and override the filesystem.rootpath setting in your controller +$session = new Zend\Session\Container(); +$session->{"MyLoggedInKey"} = true; +$session->{"moxiemanager.filesystem.rootpath"} = "/var/www/myroot"; +---- + +[[zendauthenticator-session-container]] +=== `+ZendAuthenticator.session_container+` + +This enables you to specify the session container name. + +[source,php] +---- +// Set the container name +$moxieManagerConfig['ZendAuthenticator.session_container'] = 'mycontainer'; +---- + +Override the user by setting: + +[source,php] +---- +// Override user in using the Zend 2 session container +$this->session = new Zend\Session\Container("mycontainer"); +$this->session->user = "username"; +---- + +[[zendauthenticator-user-key]] +=== `+ZendAuthenticator.user_key+` + +This enables you to specify the key to look for in the sessions to override the user variable. The $\{user} will be replaced in all config options if you set the CodeIgniter PHP user session key + +[source,php] +---- +// Change the user key too look for +$moxieManagerConfig['ZendAuthenticator.user_key'] = 'user'; + +// User specific path in moxiemanager/config.php +$moxieManagerConfig['filesystem.rootpath'] = 'users/${user}'; +---- + +Override the user by setting: + +[source,php] +---- +// Override user in using Zend 2 +$this->session = new Zend\Session\Container(); +$this->session->user = "username"; +---- + +[[azure-plugin]] +== Azure plugin + +[[azure-containers]] +=== `+azure.containers+` + +This option enables you to configure azure containers. We have a detailed how to called "xref:moxiemanager-how-to-guides.adoc#how-to-configure-for-azure[How to configure for Azure]" so read that for details on how to use this option. + +[[amazon-plugin]] +== Amazon plugin + +[[amazons3-buckets]] +=== `+amazons3.buckets+` + +This option enables you to configure Amazon S3 buckets. We have a detailed how to called "xref:moxiemanager-how-to-guides.adoc#how-to-configure-for-amazons3[How to configure for AmazonS3]" so read that for details on how to use this option. + +[[dropbox]] +== DropBox + +[[dropbox-app-id]] +=== `+dropbox.app_id+` + +NOTE: Please note that this is only available for Professional and Enterprise customers. + +Dropbox Application id. + +. First, get a Dropbox account, then go to: https://www.dropbox.com/developers/apps +. Click on the "Create App" button, choose a name for your app, select "Dropbox Chooser" and the domain(s) you want this to function on. +. When you have created your app, get the "App key" and paste it into the dropbox.app_id settings. + +[source,php] +---- +$moxieManagerConfig['dropbox.app_id'] = ""; +---- + +Check the xref:moxiemanager-how-to-guides.adoc#how-to-use-dropbox[DropBox Howto] for details integration steps. + +[[autoformat-plugin]] +== AutoFormat plugin + +[[autoformat-rules]] +=== `+autoformat.rules+` + +This option enables you to auto resize or convert images when they get uploaded. For example you when you upload a image you can generate 3 fixed sizes of the images all resizing will be proportional. + +The parameter is in the following format:`+{width}x{height}|{format}={filename},..+` Both the resize part and format path is optional. So you can for example only change the image format with this pattern: gif=%f.gif or only resize it by this pattern: `+320x240=%f_320x240.%e+` + +Here is a more complex pattern: `+320x240|gif=gifs/%f_%w_%h.gif,320x240=%f_%w_%h.%e+` It will generate a 320x240 large gif in the gifs directory it will auto create the directory. It will also make a 320x240 image in the same directory as the uploaded file. + +Available formats are: gif,jpg,png + +==== Filename parameters + +[cols=",",options="header",] +|=== +|Name |Summary +|`+%f+` |Filename without extension for example "myimage". +|`+%e+` |Extension the extension part of the image for example "gif". +|`+%w+` |Output image width, the proportional value. +|`+%h+` |Output image height, the proportional valie. +|`+%tw+` |Target width/specified width by the resize option. +|`+%th+` |Target height/specified height by the resize option. +|`+%ow+` |Original width, before the image gets resized. +|`+%oh+` |Original height, before the image gets resize. +|=== + +===== Example + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['autoformat.rules'] = '320x240|gif=%f_%w_%h.gif,320x240=%f_%w_%h.%e'; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[autoformat-delete-format-images]] +=== `+autoformat.delete_format_images+` + +When original image gets deleted, should the formatted rules be followed and also deleted? + +Basically, MoxieManager will resolve the format syntax and look for resulting files, if they exist, they will be deleted if this option is set to true. + +[source,php] +---- +$moxieManagerConfig['autoformat.delete_format_images'] = true; +---- + +[[autoformat-jpeg-quality]] +=== `+autoformat.jpeg_quality+` + +Jpeg quality setting, 0-100. + +[source,php] +---- +$moxieManagerConfig['autoformat.jpeg_quality'] = ""; +---- + +[[favorites-plugin]] +== Favorites plugin + +[[favorites-max]] +=== `+favorites.max+` + +Max amount of favorites to store. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['favorites.max'] = "100"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[history-plugin]] +== History plugin + +[[history-max]] +=== `+history.max+` + +Max amount of items stored in history. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['history.max'] = "10"; +---- + +.Example for .NET integrations + +[source,xml] +---- + +---- + +[[autorename-plugin]] +== AutoRename plugin + +* xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[autorename.enabled] +* xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[autorename.space] +* xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[autorename.custom_pattern] +* xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[autorename.custom_replace] +* xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[autorename.lowercase] diff --git a/modules/ROOT/pages/moxiemanager-plugins.adoc b/modules/ROOT/pages/moxiemanager-plugins.adoc new file mode 100644 index 0000000000..fbbe61d851 --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-plugins.adoc @@ -0,0 +1,41 @@ += MoxieManager plugins +:navtitle: Plugins +:description: MoxieManager plugins and the license each plugin requires. +:keywords: moxiemanager, plugins, authenticator, filesystem + +Some plugins are only available in certain licenses, as noted by the last column in the table. + +[cols=",,",options="header",] +|=== +|Plugin |Description |License +|xref:moxiemanager-how-to-guides.adoc#how-to-configure-for-amazons3[AmazonS3] |FileSystem implementation for Amazon S3 cloud storage. |Enterprise +|xref:moxiemanager-how-to-guides.adoc#how-to-configure-for-azure[Azure] |FileSystem implementation for Azure Blob Storage. |Enterprise +|xref:moxiemanager-options.adoc#autoformat-rules[AutoFormat] |Automatically formats images when uploaded. |All +|xref:moxiemanager-how-to-guides.adoc#how-to-use-autorename[AutoRename] |Auto Rename files on upload. |All +|xref:moxiemanager-security.adoc#basicauthenticator[BasicAuthenticator] |Authenticator with basic login config for small sets of users. |All +|xref:moxiemanager-how-to-guides.adoc#how-to-use-dropbox[Dropbox] |Import files from Dropbox into your file system. |Professional, Enterprise +|xref:moxiemanager-options.adoc#favorites-max[Favorites] |List with favorites you can add/remove from at a user level. |All +|xref:moxiemanager-how-to-guides.adoc#how-to-use-ftp[Ftp] |FileSystem implementation for FTP. |Professional, Enterprise +|xref:moxiemanager-options.adoc#history-max[History] |List of latest inserted files stored at user level. |All +|xref:moxiemanager-options.adoc#ipauthenticator-ip-numbers[IpAuthenticator] |Authenticator for specific ip addresses or ranges. |All +|xref:moxiemanager-how-to-guides.adoc#how-to-use-quota[Quota] |Quota plugin, limit user upload capabilities. |Professional, Enterprise +|xref:moxiemanager-security.adoc#sessionauthenticator[SessionAuthenticator] |Authenticator that checks sessions for option overrides etc. |All +|Uploaded |List of latest uploaded files. |All +|xref:moxiemanager-security.adoc#symfonyauthenticator[SymfonyAuthenticator] |Authenticator for Symfony > 2.x |All +|xref:moxiemanager-security.adoc#cakeauthenticator[CakeAuthenticator] |Authenticator for CakePHP |All +|xref:moxiemanager-security.adoc#codeigniterauthenticator[CodeIgniterAuthenticator] |Authentication for the CodeIgniter PHP framework. |All +|xref:moxiemanager-how-to-guides.adoc#how-to-install-in-joomla[JoomlaAuthenciator] |Authenticator for the Joomla CMS system. |All +|DrupalAuthenticator |Authenticator for the Drupal CMS system. |All +|xref:moxiemanager-security.adoc#zendauthenticator[ZendAuthenticator] |Authenticator for the Zend 2 framework. |All +|=== + +== .NET example plugin + +You can download an example plugin for .NET here, this is a Visual Studio 2012 solution, to build a custom plugin, follow these steps: + +. Unpack the zip and open up the solution in Visual Studio (2012 recommended). +. Add a reference to the MoxieManager.Core.dll file before building, modify/add/remove any code you wish. +. Build and copy the resulting DLL into the same bin folder as the other DLL files for MoxieManager. +. Add the appropriate line to your Web.Config file so the plugin gets included, make note of the name so it matches yours. + +xref:attachment$moxiemanager/moxiemanager-example-plugin.zip[Moxiemanager .NET Example Plugin] diff --git a/modules/ROOT/pages/moxiemanager-security.adoc b/modules/ROOT/pages/moxiemanager-security.adoc new file mode 100644 index 0000000000..074e516f3f --- /dev/null +++ b/modules/ROOT/pages/moxiemanager-security.adoc @@ -0,0 +1,399 @@ += MoxieManager security +:navtitle: Security +:description: MoxieManager security and authenticators. +:keywords: moxiemanager, security, authentication, authenticator, session + +The MoxieManager requires you to be authorized using a authenticator. There are a few bundled authentications but you can also write your own if you have custom needs. + +== Client-side settings + +Any settings setup client side, either when using MoxieManager standalone (moxman.browse()) or with {productname} moxiemanager_ settings always asume everything is insecure. + +Client side settings and javascript is run on the client and is therefor not to be trusted. Be careful when using client side configuration options such as *rootpath*, make sure your backend (config.php, Web.config) rootpath setting is where you place your security. + +== Other settings + +There are other potential settings that can cause security issues, such as allowing users to upload executable files (PHP, ASPX etc). If you do not have the knowledge yourself to understand the dangers, please consult a professional developer to help you wih your configuration. + +[[authenticators]] +== Authenticators + +[cols="1,3",options="header"] +|=== +|Authenticator |Description +|xref:#sessionauthenticator[SessionAuthenticator] |This authenticator will look for a specific session key and check if it's value equals true. This enables you to set this session variable in your systems login page. +|xref:#basicauthenticator[BasicAuthenticator] |This authenticator will display a login dialog for the user and match the username/password against the configured users. This is normally used when the MoxieManager is used in standalone mode. +|xref:moxiemanager-options.adoc#ipauthenticator-ip-numbers[IpAuthenticator] |This authenticator will verify that the user has access by checking if their IP number matches a list of valid ones or is within a range of ip numbers. +|xref:#external-authentication[ExternalAuthenticator] |This authenticator will take all session cookies and pass them on to a backend page. That page will then verify that the user is logged in properly. This is useful when the MoxieManager is to be integrated with other languages like classical asp or jsp. +|xref:#aspnetauthenticator[AspNetAuthenticator] |This uses the build in authentication method in .NET and is only available in the .NET version. +|=== + +[[sessionauthenticator]] +=== SessionAuthenticator + +First, we will show you a simple configuration for getting SessionAuthentication to work, every other implementation or authentication will be a variant of this, simply setting a session in your system and checking for it in the MoxieManager. We highly recommend you take a look at the code in the SessionAuthentication file, its fairly simple and should be easy to understand. + +Turn on the SessionAuthenticator + +.Example for PHP integrations + +[source,php] +---- +// Change this to switch to SessionAuthenticator +$moxieManagerConfig['authenticator'] = "SessionAuthenticator"; + +// Set this SESSION key in your system when a user login, $_SESSION["isLoggedIn"] = true +$moxieManagerConfig['SessionAuthenticator.logged_in_key'] = "isLoggedIn"; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + + + +---- + +This code should go in whatever login logic your system uses. + +"moxiemanager" is the default prefix set in the config file. + +.Example for PHP integrations + +[source,php] +---- +session_start(); +$_SESSION['isLoggedIn'] = true; // True/false if user is logged in or not, should be same as above +$_SESSION['moxiemanager.filesystem.rootpath'] = "/var/www/htdocs/myroot"; // Set a root path for this use +---- + +.Example for .NET integrations + +[source] +---- +// Write to normal ASP.NET session +Session["isLoggedIn"] = true; +Session["moxiemanager.filesystem.rootpath"] = "c:/inetpub/wwwroot/upload"; +---- + +You can also of course make any modifications this way, so for example, if you have the userid in a variable called $userid you can do this: + +.Example for PHP integrations + +[source,php] +---- +$_SESSION['moxiemanager.filesystem.rootpath']="/var/www/htdocs/myroot/". $userid ."/files"; +---- + +.Example for .NET integrations + +[source] +---- +Session["moxiemanager.filesystem.rootpath"] = "c:/inetpub/wwwroot/"+ UserId +"/uploads"; +---- + +Make sure your userid is secure, altho MoxieManager have checks for hacks in the path, sanitizing input is always a good idea. + +==== Setting AmazonS3 or Azure paths via sessions + +If you are using AmazonS3 or Azure, you can set the config options through a flat session structure, like this: + +.Example for PHP integrations + +[source,php] +---- +// Amazon +$_SESSION["moxiemanager.amazons3.buckets.myclient.publickey"] = "pubkey"; +$_SESSION["moxiemanager.amazons3.buckets.myclient.secretkey"] = "seckey"; +$_SESSION["moxiemanager.amazons3.buckets.myclient.urlprefix"] = "http://bucketname.s3.amazonaws.com"; +// Azure +$_SESSION["azure.containers.myazureclient.container"] = "test"; +$_SESSION["azure.containers.myazureclient.account"] = "moxietest"; +$_SESSION["azure.containers.myazureclient.sharedkey"] = "sharedkey"; +// Setup the rootpath +$_SESSION["moxiemanager.filesystem.rootpath"] = "s3://myclient;azure://myazureclient"; +---- + +.Example for .NET integrations + +[source] +---- +/* Amazon S3 */ +Session["moxiemanager.amazons3.buckets.myclient.publickey"] = "pubkey"; +Session["moxiemanager.amazons3.buckets.myclient.secretkey"] = "seckey"; +Session["moxiemanager.amazons3.buckets.myclient.urlprefix"] = "http://bucketname.s3.amazonaws.com"; + +/* Azure */ +Session["azure.containers.myazureclient.container"] = "testcontainer"; +Session["azure.containers.myazureclient.account"] = "moxietest"; +Session["azure.containers.myazureclient.sharedkey"] = "sharedkey"; + +/* Setup rootpath */ +Session["moxiemanager.filesystem.rootpath"] = "s3://myclient;azure://myazureclient"; +---- + +NOTE: Please note the buckets. and containers., that needs to match your rootpath setup. + +If you are using a system that *overrides session management*, you have to initalize the system framework inside the config file, so it will use the systems session storage. + +[[basicauthenticator]] +=== BasicAuthenticator + +If you use the installer, you can configure basic authentication, this is how it works if you wish to do it manually. + +First, set the authenticator to the correct one in your config file. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['authenticator'] = 'BasicAuthenticator'; +---- + +.Example for .NET integrations + +[source,xml] +---- + + + + + +---- + +In config, you can add the following config option to add/remove users. + +.Example for PHP integrations + +[source,php] +---- +$moxieManagerConfig['basicauthenticator.users'] = array( +   array( +      "username" => "adminuser", +      "password" => "somerandompassword", +      "email" => "somemail@somedomainidunno.com", +      "groups" => array("administrator")) +); +---- + +.Example for .NET integrations + +[source,xml] +---- + + + +---- + +[[external-authentication]] +=== External authentication + +The External Authenticator should work with almost anything, such as classic ASP, Java, Perl or whatever. It can only authenticate the user on the same server since it takes the session cookie information from the current PHP/.NET domain and passes them to the other runtime for example classical asp. + +. Set the Authenticator to ExternalAuthenticator ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['authenticator'] = "ExternalAuthenticator"; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- + +. Check the `+moxiemanager/plugins/ExternalAuthenticator+` folder, copy the .jsp, .asp or .php page depending on what you are integrating with. Note for .NET, these files are not shipped with the .NET version, post a ticket in the support system, and we will send you the files. + +. Open up the example file you copied above, set the `+SECRET_KEY+` to something unique. + +. You should modify the example file to fit your system, for example, checking a specific session for logged in user etc. + +. Edit the MoxieManager config file, change the ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['ExternalAuthenticator.secret_key'] = "someSecretKey"; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- ++ +to the same `+SECRET_KEY+` you set above in Step 3. + +. Set the ++ +.Example for PHP integrations +[source,php] +---- +$moxieManagerConfig['ExternalAuthenticator.external_auth_url'] = "auth.asp"; +---- ++ +.Example for .NET integrations +[source,xml] +---- + +---- ++ +in the configfile to the correct URL for the example file you copied earlier. ++ +NOTE: Please note that the auth.asp file is only an example, you will want to customize that file for whatever you are integrating with. ++ +NOTE: Also note that a remote url does not work here, it should be a relative URL, for PHP its relative from the ExternalAuthenticator folder, for .NET its relative from the root moxiemanager folder. + +. Verify that the Authentication works. ++ +IMPORTANT: Remember that the ExternalAuthenticator sets up a local session so that one will not be automatically removed if you logout. + +So you might need to request a session destroy page. + +[[aspnetauthenticator]] +=== AspNetAuthenticator + +This authenticator will use the built in API in .NET you can read more about .NET forms authentication at the http://msdn.microsoft.com/en-us/library/7t6b43z4(v=vs.100).aspx[MSDN website]. + +==== Simple example of forms authentication + +Using the built in AspNetAuthenticator allows you to login using passwords defined in Web.Config or using Active Directory etc. We won't cover all that since the Microsoft documentation covers that. This simple example uses form authentication. + +. Change the authenticator option to "AspNetAuthenticator" in Web.Config: ++ +.Example for .NET integrations +[source,xml] +---- + +---- + +. Add this into your Web.Config to enable AspNet forms authentication: ++ +[source,xml] +---- + + + + + + + + + + +---- + +. Create a new login page AspNetLogin.aspx with this code: ++ +[source,xml] +---- +<%@ Page Language="C#" %> +<%@ Import Namespace="System.Web.Security" %> + + + +
+ + + + + + + +---- ++ +You can now login using the username "user" and password "pass" by using that on the AspNetLogin.aspx page in your browser. + +== 3rd party libraries (PHP) + +* For *CodeIgniter*, we recommend using https://github.com/EllisLab/CodeIgniter/wiki/Native-session[Native-sessions] and the xref:#sessionauthenticator[SessionAuthenticator] for integration. +* For *Symfony*, we recommend using the xref:#symfonyauthenticator[SymfonyAuthenticator] that comes with the package. +* For *CakePHP*, we recommend using the xref:#cakeauthenticator[CakeAuthenticator] that comes with the package. +* For *CodeIgniter*, we recommend using the xref:#codeigniterauthenticator[CodeIgniterAuthenticator] that comes with the package. +* For *Wordpress*, follow xref:moxiemanager-integration.adoc#integration-wordpress[these instructions]. +* For *Zend 2*, we recommend using the xref:#zendauthenticator[ZendAuthenticator] plugin. + +[[cakeauthenticator]] +=== CakeAuthenticator + +This authenticator is used to handle the custom sessions used in the Cake PHP framework. It's very similar to the SessionAuthenticator. You need to have the moxiemanager installed in the `+vendors+` directory of your cake application. If you want to install it in some other directory you need to alter the ROOT define in `+moxiemanager/plugins/CakeAuthenticator/Plugin.php+`. + +Here the settings available for the Cake authenticator: + +[cols=",",options="header",] +|=== +|Setting |Description +|xref:moxiemanager-options.adoc#cakeauthenticator-logged-in-key[CakeAuthenticator.logged_in_key] |Name of the session key to check for. Defaults to "loggedin". +|xref:moxiemanager-options.adoc#cakeauthenticator-config-prefix[CakeAuthenticator.config_prefix] |Prefix of config options defaults to "moxiemanager". +|xref:moxiemanager-options.adoc#cakeauthenticator-user-key[CakeAuthenticator.user_key] |Name of the session key to use as a replacement for $\{user} variables. +|=== + +[[codeigniterauthenticator]] +=== CodeIgniterAuthenticator + +This authenticator is used to handle the custom sessions used in the CodeIgniter PHP framework. It's very similar to the SessionAuthenticator. You need to specify the environment to use "development/testing/production" in the MoxieManager config.php file. You also need to set the logged in key in CodeIgniter to true when the user loggs in so the moxiemanager can check for that. + +Here the settings available for the Cake authenticator: + +[cols=",",options="header",] +|=== +|Setting |Description +|xref:moxiemanager-options.adoc#codeigniterauthenticator-environment[CodeIgniterAuthenticator.environment] |The current environment for the site "development" or "production". +|xref:moxiemanager-options.adoc#codeigniterauthenticator-logged-in-key[CodeIgniterAuthenticator.logged_in_key] |Name of the session key to check for. Defaults to "loggedin". +|xref:moxiemanager-options.adoc#codeigniterauthenticator-config-prefix[CodeIgniterAuthenticator.config_prefix] |Prefix of config options defaults to "moxiemanager". +|xref:moxiemanager-options.adoc#codeigniterauthenticator-user-key[CodeIgniterAuthenticator.user_key] |Name of the session key to use as a replacement for $\{user} variables. +|=== + +[[symfonyauthenticator]] +=== SymfonyAuthenticator + +This Authenticator should make it easy to use with *Symfony > 2.x* framework. + +Setup these options in your config.php file for MoxieManager. + +[source,php] +---- +$moxieManagerConfig['optionname'] = 'value'; +---- + +[cols="1,3",options="header"] +|=== +|Option |Description +|`+SymfonyAuthenticator.environment+` |Name of your the environment you want to use. Defaults to "prod" but can be "development". +|`+SymfonyAuthenticator.logged_in_key+` |Logged in key that it checks for when doing authentication. Defaults to "isLoggedIn". +|`+SymfonyAuthenticator.config_prefix+` |Configuration prefix to use when overriding config options. Defaults to "moxiemanager". +|`+SymfonyAuthenticator.user_key+` |User config key to override the logged in user name with. Defaults to "user". +|=== + +[[zendauthenticator]] +=== ZendAuthenticator + +This authenticator is used to handle the custom sessions used in the Zend 2 PHP framework. It's very similar to the SessionAuthenticator. You can enable this authenticator by setting the "authenticator" config option. + +[source,php] +---- +$moxieManagerConfig['authenticator'] = 'ZendAuthenticator'; +---- + +[cols=",",options="header",] +|=== +|Setting |Description +|xref:moxiemanager-options.adoc#zendauthenticator-logged-in-key[ZendAuthenticator.logged_in_key] |Name of the session key to check for. Defaults to "loggedin". +|xref:moxiemanager-options.adoc#zendauthenticator-config-prefix[ZendAuthenticator.config_prefix] |Prefix of config options defaults to "moxiemanager". +|xref:moxiemanager-options.adoc#zendauthenticator-user-key[ZendAuthenticator.user_key] |Name of the session key to use as a replacement for $\{user} variables. +|xref:moxiemanager-options.adoc#zendauthenticator-session-container[ZendAuthenticator.session_container] |Session container name if it's not set the default container will be used. +|xref:moxiemanager-options.adoc#zendauthenticator-library-path[ZendAuthenticator.library_path] |Path to the zend framework directory. This will be automatically detected by default. +|=== diff --git a/modules/ROOT/pages/moxiemanager.adoc b/modules/ROOT/pages/moxiemanager.adoc index 7ed43cdbad..fc0a0c0f99 100644 --- a/modules/ROOT/pages/moxiemanager.adoc +++ b/modules/ROOT/pages/moxiemanager.adoc @@ -9,8 +9,20 @@ MoxieManager is a premium {productname} plugin and server system that enables us MoxieManager is an application separate from {productname} that includes .NET or PHP server components. Being built by the team behind {productname} it has tight integration with the editor via a toolbar control. It is designed to work with {productname} configuration settings such as `+relative_urls+`. -MoxieManager is a paid addition to {productname}. It is included in link:{pricingpage}/[{enterpriseversion} subscriptions]. +NOTE: MoxieManager is a paid addition to {productname}. It is included in link:{pricingpage}/[{enterpriseversion} subscriptions]. -Full documentation on MoxieManager, including how to http://www.moxiemanager.com/documentation/index.php/TinyMCE_Integration[integrate with {productname}], can be http://www.moxiemanager.com/documentation/[found] on the MoxieManager website. +[[getting-started]] +== Getting started -Documentation is archived for the deprecated http://archive.tinymce.com/wiki.php/MCImageManager[MCImageManager] and http://archive.tinymce.com/wiki.php/MCFileManager[MCFileManager]. +Full documentation on MoxieManager, including xref:moxiemanager-installation.adoc[installation] and how to xref:moxiemanager-integration.adoc#tinymce-integration[integrate with {productname}], is provided in the following pages. + +This documentation will show you how to install, configure and customize MoxieManager to fit your needs. + +If your here for the first time, we recommend these sections first. + +. xref:moxiemanager-installation.adoc[Installation] +. xref:moxiemanager-integration.adoc[Integration] + +The configuration can seem daunting at first, but its very powerfull, and the use of *xref:moxiemanager-how-to-guides.adoc#how-to-use-mc-access[mc_access]* files can really increase the power of configuration by a lot. Template folders also enables you to copy pre-configured folder configs (by including an mc_access file) to have a really custom experience. + +Also, check out the xref:moxiemanager-how-to-guides.adoc[How-to section] for some advanced info on how to configure certain things, such as upload.format and other powerfull options. From 0f9b561ba7c0f41867a1b90ac3fb1d0ad303468e Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Nov 2026 09:19:52 +1000 Subject: [PATCH 2/6] TINYDOC-3700: Add a .NET Framework 4.5 end-of-support caution to the MoxieManager .NET requirements. --- modules/ROOT/pages/moxiemanager-installation.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/moxiemanager-installation.adoc b/modules/ROOT/pages/moxiemanager-installation.adoc index 8c0e626a8f..0b40281b93 100644 --- a/modules/ROOT/pages/moxiemanager-installation.adoc +++ b/modules/ROOT/pages/moxiemanager-installation.adoc @@ -111,6 +111,8 @@ Installing MoxieManager should be fairly simple, but mastering all the options c === Requirements +CAUTION: Microsoft .NET Framework 4.5 is no longer supported by Microsoft, and security updates will not be issued for MoxieManager for .NET installations. + * MoxieManager will only work with *.NET 4.5 Framework*, download http://www.microsoft.com/en-us/download/details.aspx?id=30653[here]. * A modern *HTML5 or HTML4 Strict doctype* () is required to get the UI to render properly. From 124431fceb7a202462e4a241ad0350068a22be78 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Nov 2026 09:27:32 +1000 Subject: [PATCH 3/6] TINYDOC-3700: Replace broken MoxieManager example and GoDaddy links with working URLs. --- modules/ROOT/pages/moxiemanager-faq.adoc | 2 +- modules/ROOT/pages/moxiemanager-how-to-guides.adoc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/moxiemanager-faq.adoc b/modules/ROOT/pages/moxiemanager-faq.adoc index 2b7efb2d31..212924b59b 100644 --- a/modules/ROOT/pages/moxiemanager-faq.adoc +++ b/modules/ROOT/pages/moxiemanager-faq.adoc @@ -71,7 +71,7 @@ $moxieManagerConfig['filesystem.local.urlprefix'] = '{proto}://{host}/virtupload ---- -Will take an absolute path like c:\www\inetpub\upload\images\my.gif crop away c:\www\inetpub\upload producing /images/my.gif then add http://www.site.com/virtupload before it producing http://www.site.com/virtupload/images/my.gif +Will take an absolute path like c:\www\inetpub\upload\images\my.gif crop away c:\www\inetpub\upload producing /images/my.gif then add `+http://www.example.com/virtupload+` before it producing `+http://www.example.com/virtupload/images/my.gif+` === Session is destroyed at random diff --git a/modules/ROOT/pages/moxiemanager-how-to-guides.adoc b/modules/ROOT/pages/moxiemanager-how-to-guides.adoc index 4dcf2e568c..bacf3b9824 100644 --- a/modules/ROOT/pages/moxiemanager-how-to-guides.adoc +++ b/modules/ROOT/pages/moxiemanager-how-to-guides.adoc @@ -81,7 +81,7 @@ It is also possible to have many rootpath, if you wish to list local folder as w |Option |Description |`+publickey+` |The public key that you get from the Amazon S3 service. |`+secretkey+` |The secret key that you get from the Amazon S3 service. -|`+urlprefix+` |Url prefix to add infront of the urls when selecting files this can for example be http://mycustom.domain or //mycustom.domain. If you do not have a custom domain, you will need to configure the bucketname into the normal s3 url. +|`+urlprefix+` |Url prefix to add infront of the urls when selecting files this can for example be https://www.example.com or //www.example.com. If you do not have a custom domain, you will need to configure the bucketname into the normal s3 url. |`+cache-control+` |Enables you to control how the files are to be cached in the users browser when the request the file. The values that can be specified for this option can be found in the http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9[HTTP RFC]. |`+endpoint+` |Enables you to configure a specific endpoint for the API calls this can be an URL to a http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region[specific region] or a custom domain. |=== @@ -508,7 +508,7 @@ Then you need to add a snipplet into your web.config file. Date: Wed, 11 Nov 2026 14:41:27 +1000 Subject: [PATCH 4/6] Update modules/ROOT/pages/moxiemanager-options.adoc Co-authored-by: Tim Dettrick --- modules/ROOT/pages/moxiemanager-options.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/moxiemanager-options.adoc b/modules/ROOT/pages/moxiemanager-options.adoc index cf234b31a7..b769d69e68 100644 --- a/modules/ROOT/pages/moxiemanager-options.adoc +++ b/modules/ROOT/pages/moxiemanager-options.adoc @@ -1917,7 +1917,7 @@ You can find the *schemas* for MySQL and SQLite in the *moxiemanger/classes/Vfs/ There is a known issue of an error message if logging is disabled, you can enable logging and set the level to "info" and it should work. -NOTE: Note that this feature is not available fully for .NET just yet, only a memory caching layer, full feature coming. +NOTE: Note that this feature is not available fully for .NET, only a memory caching layer. [[sql]] == SQL From 051c926716f84006f54fc88667906e4227a668f1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Nov 2026 14:41:39 +1000 Subject: [PATCH 5/6] Update modules/ROOT/pages/moxiemanager-installation.adoc Co-authored-by: Tim Dettrick --- modules/ROOT/pages/moxiemanager-installation.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/moxiemanager-installation.adoc b/modules/ROOT/pages/moxiemanager-installation.adoc index 0b40281b93..020e959923 100644 --- a/modules/ROOT/pages/moxiemanager-installation.adoc +++ b/modules/ROOT/pages/moxiemanager-installation.adoc @@ -134,7 +134,7 @@ NOTE: Please note, there is no Visual Studio Building required to make this soft NOTE: Please note that if you move the *Web.config* settings into a global website Web.config, *do not forget to remove the original* in the MoxieManager folder, or all configurations will be overwritten by the local ones. -If you get a 500 internal server error, first, check your .NET version, only .NET 4.5 Framework is supported. Next, make sure you copied the DLL files to the root bin folder. +If you get a 500 internal server error, first, check your .NET version, only .NET 4.5 Framework has been verified to work. Next, make sure you copied the DLL files to the root bin folder. If you encounter any problems, check the xref:moxiemanager-faq.adoc[FAQ] or use the support ticket system to submit tickets. From 39279dca9c76a9b64a3c76f0696247e82f3baeb1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Nov 2026 14:41:49 +1000 Subject: [PATCH 6/6] Update modules/ROOT/pages/moxiemanager.adoc Co-authored-by: Tim Dettrick --- modules/ROOT/pages/moxiemanager.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/moxiemanager.adoc b/modules/ROOT/pages/moxiemanager.adoc index fc0a0c0f99..e88efc61db 100644 --- a/modules/ROOT/pages/moxiemanager.adoc +++ b/modules/ROOT/pages/moxiemanager.adoc @@ -7,7 +7,7 @@ include::partial$misc/admon-moxiemanager-not-on-cloud.adoc[] MoxieManager is a premium {productname} plugin and server system that enables users to insert files located externally to the editor (e.g. on their client desktop) into their document. -MoxieManager is an application separate from {productname} that includes .NET or PHP server components. Being built by the team behind {productname} it has tight integration with the editor via a toolbar control. It is designed to work with {productname} configuration settings such as `+relative_urls+`. +MoxieManager is an application separate from {productname} that includes PHP or .NET server components. Being built by the team behind {productname} it has tight integration with the editor via a toolbar control. It is designed to work with {productname} configuration settings such as `+relative_urls+`. NOTE: MoxieManager is a paid addition to {productname}. It is included in link:{pricingpage}/[{enterpriseversion} subscriptions].