Update
@@ -0,0 +1 @@
|
||||
This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
|
||||
80
public/admin/plugins/tmce/responsive_filemanager/README.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# Responsive FileManager for TinyMCE and CKEditor
|
||||
|
||||
[](https://travis-ci.org/trippo/ResponsiveFilemanager)
|
||||
|
||||
Responsive FileManager is a free open-source file manager made with the jQuery library, CSS3, PHP and HTML5 that offers a nice and elegant way to upload and insert files, images and videos. You can use it as external plugin for TinyMCE version 4.x. or CKEditor and you can also use it as a stand-alone file manager to manage and select files. The script automatically creates thumbnails of images for the preview list and can create also external thumbnails to use in your cms or site. It can be configured for automatic resizing of uploaded images or to automatically limit the size. You can personalize the configuration for each folder. You can set a subfolder as the root and change the configuration for each user, page or FileManager call. Is compatible with multi-user mode and you can edit images with aviary editor, sorting files.
|
||||
|
||||
DEMO AND DOCUMENTATION: http://www.responsivefilemanager.com/
|
||||
|
||||
PRODUCTION VERSION DOWNLOAD: https://github.com/trippo/ResponsiveFilemanager/releases
|
||||
|
||||
Released under Creative Commons Attribution-NonCommercial 3.0 Unported License.
|
||||
|
||||
Creator : info@albertoperipolli.com - tr1pp0
|
||||
|
||||
### Localization
|
||||
|
||||
- AZE [Elshad Agayev]
|
||||
- BGR [Stanislav Panev]
|
||||
- BRA [paulomanrique]
|
||||
- CAT [Manel Peña]
|
||||
- CHN [Vu Doan Thang]
|
||||
- CRO
|
||||
- CZE [jlusticky]
|
||||
- DAN [Morten Hesselberg Grove]
|
||||
- ENG
|
||||
- ESP [Roberto Santamaria]
|
||||
- FRA [Mathieu Ducharme]
|
||||
- GER [Oliver Beta]
|
||||
- GRC [vkouvelis]
|
||||
- Hebrew [sagie212]
|
||||
- HUN [Novak Szabolcs]
|
||||
- IND [urayogi]
|
||||
- ITA
|
||||
- JPN [Vu Doan Thang]
|
||||
- LTU [Tomas Norkūnas]
|
||||
- MON [Tumenzul Batjargal]
|
||||
- NLD [Martijn van der Made]
|
||||
- NOR [Pål Schroeder]
|
||||
- Persian [web2web esf ir]
|
||||
- POL [Michell Hoduń]
|
||||
- POR [Sérgio Lima]
|
||||
- RUS [vasromand]
|
||||
- SLO [Roman Šovčík]
|
||||
- SVN [Peter Benko]
|
||||
- SWE [Jon Sten]
|
||||
- TUR [Ahmed Faruk Bora]
|
||||
- UKR [Sergey]
|
||||
|
||||
### Development
|
||||
|
||||
In order to work on assets, you need to install [Node.js](http://nodejs.org) and [yarn](https://yarnpkg.com), then cd to your folder and run these commands:
|
||||
|
||||
1. Install node packages according to package.js (directory node_modules)
|
||||
|
||||
```
|
||||
yarn install
|
||||
```
|
||||
3. Compile assets
|
||||
|
||||
```
|
||||
yarn build
|
||||
```
|
||||
|
||||
Gulp use [laravel-elixir](http://laravel.com/docs/5.0/elixir)
|
||||
|
||||
### Credits
|
||||
|
||||
- [Bootstrap](http://twitter.github.io/bootstrap)
|
||||
- [Bootstrap Lightbox](http://jbutz.github.io/bootstrap-lightbox)
|
||||
- [Dropzonejs](http://www.dropzonejs.com)
|
||||
- [Fancybox](http://fancybox.net)
|
||||
- [TouchSwipe](http://labs.rampinteractive.co.uk/touchSwipe/demos)
|
||||
- [PHP Image Magician](http://phpimagemagician.jarrodoberto.com)
|
||||
- [Mini icons](http://www.fatcow.com/free-icons)
|
||||
- [Jupload](http://jupload.sourceforge.net)
|
||||
- [Bootbox](http://bootboxjs.com)
|
||||
- [jQuery contextMenu](https://swisnl.github.io/jQuery-contextMenu/)
|
||||
- [Bootstrap-modal](https://github.com/jschr/bootstrap-modal)
|
||||
- [jPlayer](http://jplayer.org)
|
||||
- [Lazy Load Plugin for jQuery](http://www.appelsiini.net/projects/lazyload)
|
||||
516
public/admin/plugins/tmce/responsive_filemanager/changelog.txt
Normal file
@@ -0,0 +1,516 @@
|
||||
Responsive Filemanager Changelog
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.14.0
|
||||
*********************************************************
|
||||
- add support to tinymce 5 (thanks to mikolaj pich)
|
||||
- change image editor to Toast UI Image Editor (thanks to jack denning)
|
||||
- fix Critical Security (thanks to Fariskhi Vidyan for reporting)
|
||||
- add ckEditor on html file edit
|
||||
- update context menu (thanks to joshua schmidtke)
|
||||
- fix upload an image with malicius code inside
|
||||
- added compatibility with memory_limit expressed in G
|
||||
- fix relative url return
|
||||
- fix error on file duplication
|
||||
- fix error with memory usage (thanks to tim mclaughlin)
|
||||
- fix a vulnerability on url upload (thanks to donot-wong for reporting)
|
||||
- fix return on upload in same cases
|
||||
- other fixes (thanks to all for reporting)
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.13.4
|
||||
*********************************************************
|
||||
- fix Directory Traversal Allows to Read Any File (thanks to Simon Uvarov for reporting)
|
||||
- fix Path Traversal While Upacking Archives (thanks to Simon Uvarov for reporting)
|
||||
- Fix foreach warning on URL upload
|
||||
- Fix http https URL upload
|
||||
- add toggle on config for extract_files
|
||||
- prevent image creation for broken links in URL upload (thanks to davodavodavo3)
|
||||
- Migrate to yarn on development (thanks to mklkj)
|
||||
- code refactoring
|
||||
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.13.3
|
||||
*********************************************************
|
||||
- support to files without extension
|
||||
- fix Path Traversal vulnerability and url validation
|
||||
- fix vulnerability that permits to see server files
|
||||
- fix double file and folder rename
|
||||
- refactoring
|
||||
- update Hungarian, German and Thai languages
|
||||
- fix nested php tags in download permission
|
||||
- change jPlayer script to cdn
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.13.2
|
||||
*********************************************************
|
||||
- empty filename support (like .htaccess, .env,...)
|
||||
- fix download bug
|
||||
- refactoring check extension
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.13.1
|
||||
*********************************************************
|
||||
- folder creation fix
|
||||
- blacklist fix
|
||||
- php < 5.6 compatibility fix
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.13.0
|
||||
*********************************************************
|
||||
- multiple file selection: you can delete multiple files, you can select multiple file (n.b. if you select multiple files on stand alone mode it return a json list of urls, if you use editor with normal mode return only the first and if you use tinymce with responsivefilemanager plugin return all files on editor)
|
||||
- you can disable mime type renaming on config
|
||||
- blacklist extensions available on config
|
||||
- fixed precompiled test on duplication
|
||||
- rfm remember the last folder when return to filemanager
|
||||
- added mime type .rar
|
||||
- fixed folder permission to get config value
|
||||
- fixed an error on folder renaming
|
||||
- a lot of others bugs fixed
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.12.2
|
||||
*********************************************************
|
||||
- fixed a security vulnerability (thanks to sashaptrw)
|
||||
- fixed other minor problems
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.12.1
|
||||
*********************************************************
|
||||
- fix FTP support
|
||||
- fix problem with subfolder session
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.12.0
|
||||
*********************************************************
|
||||
- fixed multiple security vulnerabilities (thanks to Ryan Dewhurst - BSc Ethical Hacking for Computer Security, CCNA)
|
||||
- fixed lazy loading problems with a new plugin
|
||||
- copy url without flash with clipboard.js
|
||||
- removed java uploader and introduce new upload system with canucks part
|
||||
- new upload method with jQuery-File-Upload
|
||||
- removed viewer_js and substituted with google preview
|
||||
- fix problem with url upload
|
||||
- multiple files, folder upload permission also WITH RECURSIVE FOLDER UPLOAD
|
||||
- fix the config.php inclusion on subfolders see CUSTOMISE CONFIGURATION FOR EACH FOLDER on documentation
|
||||
- RTL stylesheet on repository (if you want to use simply include on dialog.php)
|
||||
- you can now drop files/folders everywhere to upload
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.11.3
|
||||
*********************************************************
|
||||
- fixed multiple security vulnerabilities (thanks to Wiswat Aswamenakul (Nick))
|
||||
- url upload toggle
|
||||
- fixed upload xml
|
||||
- prettify improvement
|
||||
- added cad preview
|
||||
- other minor bug fixes
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.11.0
|
||||
*********************************************************
|
||||
- fixed multiple security vulnerabilities (thanks to CERT-W and Davide Girardi from Outpost24)
|
||||
- Add FTP beta support
|
||||
- Upload from URL
|
||||
- Add watermark on images
|
||||
- fixed problem with some file type on upload
|
||||
- fixed a problem with change language
|
||||
- fixed a problem with rename
|
||||
- fixed a problem with upload mine type
|
||||
- fixed memory_error bool indicator
|
||||
- add configuration to add &time to image to prevent chaching
|
||||
- other fixes
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.10.2
|
||||
*********************************************************
|
||||
- fixed Download of large file
|
||||
- added pause resume download
|
||||
- fixed problem with base_url function
|
||||
- removed set_time_limit call
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.10.1
|
||||
*********************************************************
|
||||
- now you can pass available extensions list in url (ex. you can show only excel files)
|
||||
- fixed a problem with php<5.3
|
||||
- remember filter and sort after refresh
|
||||
- added config toggle to show/hide filter buttons and language selection button
|
||||
- fixed a problem when you click on namefile label (previously was equal to click two times)
|
||||
- fixed a problem with relative path with folder (thanks to gordon-matt)
|
||||
- fixed a problem with mimetype in some cases
|
||||
- fixed a problem with cache on image editor include
|
||||
- fixed a problem with + char on folders name
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.10.0
|
||||
*********************************************************
|
||||
- added total max size control to limit the size of all files into
|
||||
source folder (you can control it in config.php) (thanks to Stephane MERCIER)
|
||||
- improved the error messages (thanks to Stephane MERCIER)
|
||||
- update jplayer
|
||||
- fixed a incorrect closing of upload modal
|
||||
- fixed lowercase on convert_spaces active and add lower_case option on config.php
|
||||
- add mimetype control on upload (ex. if i renane img.jpg to img.pdf and upload to filemananger the system check the time type and converte it to img.jpg)
|
||||
- fixed permission error on files and folders
|
||||
- other fix
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.7
|
||||
*********************************************************
|
||||
- fixed pdf preview
|
||||
- fixed a bug with session subfolder folder creation
|
||||
- fixed a bug with folder creation
|
||||
- fixed a problem with ie and allow_url_fopen server config
|
||||
- fixed a problem with folder copy
|
||||
- fixed a problem with relative folder url export
|
||||
- fixed error 'TypeError: $ is not a function'
|
||||
- fixed a problem with lang in query string
|
||||
- fixed a problem with drag&drop on android
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.6
|
||||
*********************************************************
|
||||
- fixed a security vulnerability (thanks to securitum.pl)
|
||||
- code refactoring removed thumb path to ajax calls
|
||||
- improve file/folder permission layout and fixed a error
|
||||
- fixed a problem with image editor
|
||||
- added vitnamese language
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.5
|
||||
*********************************************************
|
||||
- fixed a Adobe Creative SDK issue
|
||||
- fixed a problem when you edit multiple image in the same session
|
||||
- fixed a problem with security issue in some server configurations
|
||||
- added maxSize config to Adobe Creative SDK export image (default now is 1400)
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.4
|
||||
*********************************************************
|
||||
- Upgrade Aviary Image Editor with new Adobe Creative SDK without size limitation
|
||||
- Add files and folders counter on each folder
|
||||
- Fixed a problem with folder selection on relative url
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.3
|
||||
*********************************************************
|
||||
- Fixed the problem with undefined windowParent
|
||||
- Fixed a problem with selection on CKeditor
|
||||
- Added bootstrap modal default support
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.2
|
||||
*********************************************************
|
||||
- added file selection directly from dropzone upload area (you can now select file directly after upload)
|
||||
- folder selection in context menu (you can now select also a folder)
|
||||
- responsive filemanager modal open on tinyMCE (the dimension of modal depend on window dimension)
|
||||
- utf8 translitteration fix
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.1
|
||||
*********************************************************
|
||||
- bugfix
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.9.0
|
||||
*********************************************************
|
||||
- add compatibility with CKEditor (thanks to dennis.buijs)
|
||||
- fix ordering and filtering bugs (in js and php)
|
||||
- Refactoring of configuration and language files (thanks to rkgrep)
|
||||
- updated libraries via bower dependency management (thanks to rkgrep)
|
||||
- added Assets compilation via gulp for developing (thanks to rkgrep)
|
||||
- added Hebrew lang (sagie212)
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.8.1
|
||||
*********************************************************
|
||||
- add compatibility with free full resolution with aviary image editor
|
||||
- convert all include(); with include ‘’;
|
||||
- fix a problem with lowercase automatically change
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.8
|
||||
*********************************************************
|
||||
- added pdf, openoffice files preview with customized viewer.js
|
||||
- added other office file preview with google preview
|
||||
- fixed ordering bug
|
||||
- improved layout style
|
||||
- added copy to clipboard button on show url dialog
|
||||
- fixed a bug when download a file
|
||||
- fixed a bug in relative path images creation
|
||||
- adding custom convert_spaces [by fungio]
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.7.3
|
||||
*********************************************************
|
||||
- Fix a problem with lazy load and filters
|
||||
- add option to remember text filter in session
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.7.2
|
||||
*********************************************************
|
||||
|
||||
***** Major *****
|
||||
- Added mime type lib for downloads
|
||||
- Added lazy loading feature
|
||||
- Added options for auto and max image resizing
|
||||
- Lang. updates
|
||||
- Added touch devices support for drag&drop
|
||||
- Added support for returning relative URL-s
|
||||
- Bugfixes
|
||||
|
||||
|
||||
***** Detailed *****
|
||||
- Added mime type lib for downloads
|
||||
All downloads no should load successfuly
|
||||
|
||||
- Added lazy loading feature
|
||||
Images will only load when in the viewport so when you are in a crowded folder it will load faster
|
||||
|
||||
- Added options for auto and max image resizing
|
||||
In the past all images that was resized either with max_image or auto resize was cropped.
|
||||
Now the user can specify to crop,exact,landscape or portrait options.
|
||||
The max image size can be overridden by auto resize option
|
||||
|
||||
- Added support for returning relative URL-s
|
||||
Relative URL-s can be returned when selecting files from the filemanager: a 'relative_url' GET parameter should be
|
||||
added to the request with a value of "1" when opening RFM. Otherwise returned URL-s will be absolute.
|
||||
|
||||
- Bugfixes
|
||||
Fixed css bugs
|
||||
Fixed drag&drop bugs
|
||||
Removed 'default' access keys for security
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.6.0
|
||||
*********************************************************
|
||||
|
||||
***** Major *****
|
||||
- Cross domain feature
|
||||
- Add in config.php a option to replace all spaces with _
|
||||
- Encoding of Export URL
|
||||
- Code refactoring
|
||||
|
||||
|
||||
***** Detailed *****
|
||||
- Cross domain feature:To enable cross-domain file selector, where files are hosted on one server (for example, serverA.com) and URL is being sent to another (for example, serverB.com), include crossdomain=1 in the URL.
|
||||
For example, to instantiate image picker, use the following URL:
http://serverA.com/[path to filemanager]/filemanager/dialog.php?type=1&field_id=fieldID&crossdomain=1
|
||||
Then on serverB.com, the following code can be used to retrieve the URL after file selection is made. Please note, that the code is written for jQuery with FancyBox plug-in.
|
||||
|
||||
//
|
||||
// Handles message from ResponsiveFilemanager
|
||||
//
|
||||
function OnMessage(e){
|
||||
var event = e.originalEvent;
|
||||
// Make sure the sender of the event is trusted
|
||||
if(event.data.sender === 'responsivefilemanager'){
|
||||
if(event.data.field_id){
|
||||
var fieldID=event.data.field_id;
|
||||
var url=event.data.url;
|
||||
$('#'+fieldID).val(url).trigger('change');
|
||||
$.fancybox.close();
|
||||
|
||||
// Delete handler of the message from ResponsiveFilemanager
|
||||
$(window).off('message', OnMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handler for a message from ResponsiveFilemanager
|
||||
$(‘.opener-class).on('click',function(){
|
||||
$(window).on('message', OnMessage);
|
||||
});
|
||||
|
||||
|
||||
FILE MANAGER AS TINYMCE PLUG-IN
|
||||
There is extra parameter needed filemanager_crossdomain when calling tinymce.init(), please see below.
|
||||
tinymce.init({
|
||||
...
|
||||
filemanager_crossdomain: true,
|
||||
external_filemanager_path:"http://path/secondaryserver/filemanager/",
|
||||
external_plugins: { "filemanager" : "http://path/secondaryserver/filemanager/plugin.min.js"},
|
||||
...
|
||||
});
|
||||
|
||||
|
||||
- Convert_spaces options: enable the conversion of spaces to _ in file and folder name
|
||||
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.5.0
|
||||
*********************************************************
|
||||
|
||||
***** Major *****
|
||||
- File permission changing
|
||||
- Language Changing
|
||||
- View/edit/create text files
|
||||
- Fixes
|
||||
|
||||
NOTE: Changed upload button's icon!
|
||||
|
||||
***** Detailed *****
|
||||
- File permission changing (OFF BY DEFAULT!)
|
||||
Now you can change the files/folders permission with a slick window.
|
||||
To access the window first you must activate it in the config file.
|
||||
After you activated it you can reach it from the rigth click menu.
|
||||
You can configure the permission with both text and checkboxes.
|
||||
If you entered a wrong format/number the initial state will be restored.
|
||||
When changing permissions for folders there will be more options for
|
||||
recursive changing (No/only files/only folders/both).
|
||||
If you set the permission wrong there will be errors.
|
||||
|
||||
NOTE! If you don't know what you are doing then leave as it is bacause
|
||||
you can cause trouble.
|
||||
Usually files are 644 and folders are 755
|
||||
You CANNOT set the sticky bit!
|
||||
|
||||
- Language Changing
|
||||
You can now change the language dynamicly from the menu.
|
||||
The button is located next to the refresh button (a globe icon)
|
||||
|
||||
If adding new language, it should be added to the languages.php file as
|
||||
well for it to show up.
|
||||
|
||||
I tried to identify all language codes and add the name on there own
|
||||
language but I might messed up so please check it and correct it if
|
||||
necessary. (Because I'm only a human and speak only 2 languages)
|
||||
|
||||
- View/edit/create text files
|
||||
You can now view/edit/create text based files like .txt.
|
||||
|
||||
To view a file's content just click on the preview (eye) icon.
|
||||
To edit a file rigth click on it and select "Edit file's content"
|
||||
To create a new file just click on the "+ file" icon (old upload button)
|
||||
|
||||
When creating a new file you must specify it's extension.
|
||||
All valid extensions for edit/create are listed in the config file
|
||||
($editable_text_file_exts)
|
||||
|
||||
- Fixes
|
||||
Fixed some css overflow errors
|
||||
Removed lang_View from menu because it was overflowing
|
||||
Removed hr.php lang because it's the same as hr_HR.php
|
||||
Changed upload buttons icon to accomodate the "new file" addition
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.4.1
|
||||
*********************************************************
|
||||
|
||||
***** Major *****
|
||||
- Security Access Keys
|
||||
- More Tinymce settings
|
||||
- Tinymce 3.* support
|
||||
- Added image resize options
|
||||
- Bugfixes
|
||||
|
||||
|
||||
***** Detailed *****
|
||||
- Security Access Keys
|
||||
If 'USE_ACCESS_KEYS' are set to true only those will access RF whose url
|
||||
contains the access key (akey) like:
|
||||
<input type="button" href="../filemanager/dialog.php?akey=myPrivateKey">
|
||||
|
||||
Allowed access keys are defined in the config as well.
|
||||
$access_keys must be an array so you can add multiple.
|
||||
Your access key should NEVER be 'key' and keep in mind they are CASE
|
||||
SENSITIVE!
|
||||
For recommended key generation read the comments in the config file.
|
||||
|
||||
If there's no access key supplied with the url or it's not in the
|
||||
$access_key array you will get 'Access Denied' and you cannot continue.
|
||||
|
||||
For tinymce a new variable was added: "filemanager_access_key"
|
||||
|
||||
Tinymce config example:
|
||||
|
||||
tinyinit
|
||||
...
|
||||
external_filemanager_path:"../filemanager",
|
||||
filemanager_access_key: "myPrivateKey",
|
||||
...
|
||||
|
||||
This is a bit of additional security so no one can access your filesystem.
|
||||
|
||||
- More Tinymce settings
|
||||
- Added 'filemanager_subfolder' param so you can now define the starting folder in tinymce
|
||||
eg: 'filemanager_subfolder:"subfolder/"'
|
||||
|
||||
- Bugfixes
|
||||
- Fixed audio/video player bug
|
||||
- Fix in remember last position
|
||||
- Show url context link in all files and folder
|
||||
- Fixed a problem with old thumbnails on renaming
|
||||
- Fixed a copy past issue
|
||||
- Fixed Standalone Mode not using the field_id passed in mixed use cases
|
||||
|
||||
*********************************************************
|
||||
* RFM 9.4.0
|
||||
*********************************************************
|
||||
|
||||
***** Major *****
|
||||
- Cut/copy/paste support
|
||||
- Drag&drop support
|
||||
- Few new icons
|
||||
- Code refactor
|
||||
- Bugfixes
|
||||
|
||||
|
||||
***** Detailed *****
|
||||
- Cut/copy/paste
|
||||
You can configure the actions in config.php file and disable/ limit them if needed.
|
||||
When right clicking on a folder/file there will be options for copy and cut
|
||||
(and paste if files on clipboard and righ clicked on a file)
|
||||
There's icon for paste to this dir and clear clipboard after the 'new dir' icons
|
||||
They will grey out if there's nothing on the clipboard.
|
||||
|
||||
- Drag&drop
|
||||
Now you can drag n drop files/folders to other folders
|
||||
(this will overwrite existing files if encountered any!)
|
||||
|
||||
- Icons
|
||||
Added new icons for the new functions
|
||||
All are legit made by me or get from free icon sites
|
||||
|
||||
- Code Refator
|
||||
- Added bunch of comments and change a lot of codes.
|
||||
|
||||
- Changed all $_SESSION vars to be in a separet array
|
||||
eg.:$_SESSION["verify"] -> $_SESSION['RF']["verify"]
|
||||
So now there won't be any problem with big projecfts integrating RF
|
||||
|
||||
- Added the lang file url to $_SESSION['RF']['language_file']
|
||||
Now it can be included easily
|
||||
|
||||
- Added a lot of new lang. lines and feedback info
|
||||
New lines added to every language (in english) so translation can go smoothly
|
||||
(There are places where i added %s to lang lines which will be swapped with an action name
|
||||
, commented out what will be inserted at runtime)
|
||||
|
||||
- Added timeout when closing upload tab
|
||||
|
||||
|
||||
- Bugfixes
|
||||
- Corrected issue #69 Dropzone spritemap.png problem
|
||||
Now when loading a language it will search for the appropiate spritemaps.
|
||||
If none found will fallback to english
|
||||
All spritemaps should follow the language code naming eg:
|
||||
For hu_HU:
|
||||
spritemap_hu_HU.png
|
||||
spritemap@2x_hu_HU.png
|
||||
|
||||
(might consider moving them in a separte folder in the future)
|
||||
|
||||
- Fixed issue #71 The uploaded file exceeds the max size allowed
|
||||
Now when uploading it properly check for max post size
|
||||
It is dealt with in config.php after definning the max upload size and if it's bigger
|
||||
than server's ini it will revert it back to it.
|
||||
@@ -0,0 +1,653 @@
|
||||
<?php
|
||||
|
||||
$config = include 'config/config.php';
|
||||
|
||||
require_once 'include/utils.php';
|
||||
|
||||
if ($_SESSION['RF']["verify"] != "RESPONSIVEfilemanager") {
|
||||
response(trans('forbidden').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
$languages = include 'lang/languages.php';
|
||||
|
||||
if (isset($_SESSION['RF']['language']) && file_exists('lang/' . basename($_SESSION['RF']['language']) . '.php')) {
|
||||
if (array_key_exists($_SESSION['RF']['language'], $languages)) {
|
||||
include 'lang/' . basename($_SESSION['RF']['language']) . '.php';
|
||||
} else {
|
||||
response(trans('Lang_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
response(trans('Lang_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
//check $_GET['file']
|
||||
if (isset($_GET['file']) && !checkRelativePath($_GET['file'])) {
|
||||
response(trans('wrong path').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
//check $_POST['file']
|
||||
if(isset($_POST['path']) && !checkRelativePath($_POST['path'])) {
|
||||
response(trans('wrong path').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
$ftp = ftp_con($config);
|
||||
|
||||
if (isset($_GET['action'])) {
|
||||
switch ($_GET['action']) {
|
||||
case 'new_file_form':
|
||||
echo trans('Filename') . ': <input type="text" id="create_text_file_name" style="height:30px"> <select id="create_text_file_extension" style="margin:0;width:100px;">';
|
||||
foreach ($config['editable_text_file_exts'] as $ext) {
|
||||
echo '<option value=".'.$ext.'">.'.$ext.'</option>';
|
||||
}
|
||||
echo '</select><br><hr><textarea id="textfile_create_area" style="width:100%;height:150px;"></textarea>';
|
||||
break;
|
||||
|
||||
case 'view':
|
||||
if (isset($_GET['type'])) {
|
||||
$_SESSION['RF']["view_type"] = $_GET['type'];
|
||||
} else {
|
||||
response(trans('view type number missing').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'filter':
|
||||
if (isset($_GET['type'])) {
|
||||
if (isset($config['remember_text_filter']) && $config['remember_text_filter']) {
|
||||
$_SESSION['RF']["filter"] = $_GET['type'];
|
||||
}
|
||||
} else {
|
||||
response(trans('view type number missing').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'sort':
|
||||
if (isset($_GET['sort_by'])) {
|
||||
$_SESSION['RF']["sort_by"] = $_GET['sort_by'];
|
||||
}
|
||||
|
||||
if (isset($_GET['descending']))
|
||||
{
|
||||
$_SESSION['RF']["descending"] = $_GET['descending'];
|
||||
}
|
||||
break;
|
||||
case 'save_img':
|
||||
$info = pathinfo($_POST['name']);
|
||||
$image_data = $_POST['url'];
|
||||
|
||||
if (preg_match('/^data:image\/(\w+);base64,/', $image_data, $type)) {
|
||||
$image_data = substr($image_data, strpos($image_data, ',') + 1);
|
||||
$type = strtolower($type[1]); // jpg, png, gif
|
||||
|
||||
$image_data = base64_decode($image_data);
|
||||
|
||||
if ($image_data === false) {
|
||||
response(trans('TUI_Decode_Failed').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
response(trans('').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($image_data === false) {
|
||||
response(trans('').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!checkresultingsize(strlen($image_data))) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if ($ftp) {
|
||||
$temp = tempnam('/tmp', 'RF');
|
||||
unlink($temp);
|
||||
$temp .=".".substr(strrchr($_POST['url'], '.'), 1);
|
||||
file_put_contents($temp, $image_data);
|
||||
|
||||
$ftp->put($config['ftp_base_folder'].$config['upload_dir'] . $_POST['path'] . $_POST['name'], $temp, FTP_BINARY);
|
||||
|
||||
create_img($temp, $temp, 122, 91);
|
||||
$ftp->put($config['ftp_base_folder'].$config['ftp_thumbs_dir']. $_POST['path'] . $_POST['name'], $temp, FTP_BINARY);
|
||||
|
||||
unlink($temp);
|
||||
} else {
|
||||
file_put_contents($config['current_path'] . $_POST['path'] . $_POST['name'], $image_data);
|
||||
create_img($config['current_path'] . $_POST['path'] . $_POST['name'], $config['thumbs_base_path'].$_POST['path'].$_POST['name'], 122, 91);
|
||||
// TODO something with this function cause its blowing my mind
|
||||
new_thumbnails_creation(
|
||||
$config['current_path'].$_POST['path'],
|
||||
$config['current_path'].$_POST['path'].$_POST['name'],
|
||||
$_POST['name'],
|
||||
$config['current_path'],
|
||||
$config
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'extract':
|
||||
if (!$config['extract_files']) {
|
||||
response(trans('wrong action').AddErrorLocation())->send();
|
||||
}
|
||||
if ($ftp) {
|
||||
$path = $config['ftp_base_url'].$config['upload_dir'] . $_POST['path'];
|
||||
$base_folder = $config['ftp_base_url'].$config['upload_dir'] . fix_dirname($_POST['path']) . "/";
|
||||
} else {
|
||||
$path = $config['current_path'] . $_POST['path'];
|
||||
$base_folder = $config['current_path'] . fix_dirname($_POST['path']) . "/";
|
||||
}
|
||||
|
||||
$info = pathinfo($path);
|
||||
|
||||
if ($ftp) {
|
||||
$tempDir = tempdir();
|
||||
$temp = tempnam($tempDir, 'RF');
|
||||
unlink($temp);
|
||||
$temp .= "." . $info['extension'];
|
||||
$handle = fopen($temp, "w");
|
||||
fwrite($handle, file_get_contents($path));
|
||||
fclose($handle);
|
||||
$path = $temp;
|
||||
$base_folder = $tempDir . "/";
|
||||
}
|
||||
|
||||
$info = pathinfo($path);
|
||||
|
||||
switch ($info['extension']) {
|
||||
case "zip":
|
||||
$zip = new ZipArchive;
|
||||
if ($zip->open($path) === true) {
|
||||
//get total size
|
||||
$sizeTotalFinal = 0;
|
||||
for ($i = 0; $i < $zip->numFiles; $i++) {
|
||||
$aStat = $zip->statIndex($i);
|
||||
$sizeTotalFinal += $aStat['size'];
|
||||
}
|
||||
if (!checkresultingsize($sizeTotalFinal)) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
//make all the folders and unzip into the folders
|
||||
for ($i = 0; $i < $zip->numFiles; $i++) {
|
||||
$FullFileName = $zip->statIndex($i);
|
||||
|
||||
if (checkRelativePath($FullFileName['name'])) {
|
||||
if (substr($FullFileName['name'], -1, 1) == "/") {
|
||||
create_folder($base_folder . $FullFileName['name']);
|
||||
}
|
||||
|
||||
if (! (substr($FullFileName['name'], -1, 1) == "/")) {
|
||||
$fileinfo = pathinfo($FullFileName['name']);
|
||||
if (in_array(strtolower($fileinfo['extension']), $config['ext'])) {
|
||||
copy('zip://' . $path . '#' . $FullFileName['name'], $base_folder . $FullFileName['name']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$zip->close();
|
||||
} else {
|
||||
response(trans('Zip_No_Extract').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "gz":
|
||||
// No resulting size pre-control available
|
||||
$p = new PharData($path);
|
||||
$p->decompress(); // creates files.tar
|
||||
break;
|
||||
|
||||
case "tar":
|
||||
// No resulting size pre-control available
|
||||
// unarchive from the tar
|
||||
$phar = new PharData($path);
|
||||
$phar->decompressFiles();
|
||||
$files = array();
|
||||
check_files_extensions_on_phar($phar, $files, '', $config);
|
||||
$phar->extractTo($base_folder, $files, true);
|
||||
break;
|
||||
|
||||
default:
|
||||
response(trans('Zip_Invalid').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($ftp) {
|
||||
unlink($path);
|
||||
$ftp->putAll($base_folder, "/".$config['ftp_base_folder'] . $config['upload_dir'] . fix_dirname($_POST['path']), FTP_BINARY);
|
||||
deleteDir($base_folder);
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case 'media_preview':
|
||||
if(isset($_GET['file'])){
|
||||
$_GET['file'] = sanitize($_GET['file']);
|
||||
}
|
||||
if(isset($_GET['title'])){
|
||||
$_GET['title'] = sanitize($_GET['title']);
|
||||
}
|
||||
if($ftp){
|
||||
$preview_file = $config['ftp_base_url'].$config['upload_dir'] . $_GET['file'];
|
||||
}else{
|
||||
$preview_file = $config['current_path'] . $_GET["file"];
|
||||
}
|
||||
$info = pathinfo($preview_file);
|
||||
ob_start();
|
||||
?>
|
||||
<div id="jp_container_1" class="jp-video" style="margin:0 auto;">
|
||||
<div class="jp-type-single">
|
||||
<div id="jquery_jplayer_1" class="jp-jplayer"></div>
|
||||
<div class="jp-gui">
|
||||
<div class="jp-video-play">
|
||||
<a href="javascript:;" class="jp-video-play-icon" tabindex="1">play</a>
|
||||
</div>
|
||||
<div class="jp-interface">
|
||||
<div class="jp-progress">
|
||||
<div class="jp-seek-bar">
|
||||
<div class="jp-play-bar"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-current-time"></div>
|
||||
<div class="jp-duration"></div>
|
||||
<div class="jp-controls-holder">
|
||||
<ul class="jp-controls">
|
||||
<li><a href="javascript:;" class="jp-play" tabindex="1">play</a></li>
|
||||
<li><a href="javascript:;" class="jp-pause" tabindex="1">pause</a></li>
|
||||
<li><a href="javascript:;" class="jp-stop" tabindex="1">stop</a></li>
|
||||
<li><a href="javascript:;" class="jp-mute" tabindex="1" title="mute">mute</a></li>
|
||||
<li><a href="javascript:;" class="jp-unmute" tabindex="1" title="unmute">unmute</a></li>
|
||||
<li><a href="javascript:;" class="jp-volume-max" tabindex="1" title="max volume">max volume</a></li>
|
||||
</ul>
|
||||
<div class="jp-volume-bar">
|
||||
<div class="jp-volume-bar-value"></div>
|
||||
</div>
|
||||
<ul class="jp-toggles">
|
||||
<li><a href="javascript:;" class="jp-full-screen" tabindex="1" title="full screen">full screen</a></li>
|
||||
<li><a href="javascript:;" class="jp-restore-screen" tabindex="1" title="restore screen">restore screen</a></li>
|
||||
<li><a href="javascript:;" class="jp-repeat" tabindex="1" title="repeat">repeat</a></li>
|
||||
<li><a href="javascript:;" class="jp-repeat-off" tabindex="1" title="repeat off">repeat off</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="jp-title" style="display:none;">
|
||||
<ul>
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="jp-no-solution">
|
||||
<span>Update Required</span>
|
||||
To play the media you will need to either update your browser to a recent version or update your <a href="https://get.adobe.com/flashplayer/" target="_blank">Flash plugin</a>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(in_array(strtolower($info['extension']), $config['ext_music'])): ?>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
|
||||
$("#jquery_jplayer_1").jPlayer({
|
||||
ready: function () {
|
||||
$(this).jPlayer("setMedia", {
|
||||
title: "<?php $_GET['title']; ?>",
|
||||
mp3: "<?php echo $preview_file; ?>",
|
||||
m4a: "<?php echo $preview_file; ?>",
|
||||
oga: "<?php echo $preview_file; ?>",
|
||||
wav: "<?php echo $preview_file; ?>"
|
||||
});
|
||||
},
|
||||
swfPath: "js",
|
||||
solution: "html,flash",
|
||||
supplied: "mp3, m4a, midi, mid, oga,webma, ogg, wav",
|
||||
smoothPlayBar: true,
|
||||
keyEnabled: false
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php elseif (in_array(strtolower($info['extension']), $config['ext_video'])): ?>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
|
||||
$("#jquery_jplayer_1").jPlayer({
|
||||
ready: function () {
|
||||
$(this).jPlayer("setMedia", {
|
||||
title: "<?php $_GET['title']; ?>",
|
||||
m4v: "<?php echo $preview_file; ?>",
|
||||
ogv: "<?php echo $preview_file; ?>",
|
||||
flv: "<?php echo $preview_file; ?>"
|
||||
});
|
||||
},
|
||||
swfPath: "js",
|
||||
solution: "html,flash",
|
||||
supplied: "mp4, m4v, ogv, flv, webmv, webm",
|
||||
smoothPlayBar: true,
|
||||
keyEnabled: false
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php endif;
|
||||
|
||||
$content = ob_get_clean();
|
||||
|
||||
response($content)->send();
|
||||
exit;
|
||||
|
||||
break;
|
||||
case 'copy_cut':
|
||||
if ($_POST['sub_action'] != 'copy' && $_POST['sub_action'] != 'cut') {
|
||||
response(trans('wrong sub-action').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (trim($_POST['path']) == '') {
|
||||
response(trans('no path').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$msg_sub_action = ($_POST['sub_action'] == 'copy' ? trans('Copy') : trans('Cut'));
|
||||
$path = $config['current_path'] . $_POST['path'];
|
||||
|
||||
if (is_dir($path)) {
|
||||
// can't copy/cut dirs
|
||||
if ($config['copy_cut_dirs'] === false) {
|
||||
response(sprintf(trans('Copy_Cut_Not_Allowed'), $msg_sub_action, trans('Folders')).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
list($sizeFolderToCopy, $fileNum, $foldersCount) = folder_info($path, false);
|
||||
// size over limit
|
||||
if ($config['copy_cut_max_size'] !== false && is_int($config['copy_cut_max_size'])) {
|
||||
if (($config['copy_cut_max_size'] * 1024 * 1024) < $sizeFolderToCopy) {
|
||||
response(sprintf(trans('Copy_Cut_Size_Limit'), $msg_sub_action, $config['copy_cut_max_size']).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// file count over limit
|
||||
if ($config['copy_cut_max_count'] !== false && is_int($config['copy_cut_max_count'])) {
|
||||
if ($config['copy_cut_max_count'] < $fileNum) {
|
||||
response(sprintf(trans('Copy_Cut_Count_Limit'), $msg_sub_action, $config['copy_cut_max_count']).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if (!checkresultingsize($sizeFolderToCopy)) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
// can't copy/cut files
|
||||
if ($config['copy_cut_files'] === false) {
|
||||
response(sprintf(trans('Copy_Cut_Not_Allowed'), $msg_sub_action, trans('Files')).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$_SESSION['RF']['clipboard']['path'] = $_POST['path'];
|
||||
$_SESSION['RF']['clipboard_action'] = $_POST['sub_action'];
|
||||
break;
|
||||
case 'clear_clipboard':
|
||||
$_SESSION['RF']['clipboard'] = null;
|
||||
$_SESSION['RF']['clipboard_action'] = null;
|
||||
break;
|
||||
case 'chmod':
|
||||
if ($ftp) {
|
||||
$path = $config['ftp_base_url'] . $config['upload_dir'] . $_POST['path'];
|
||||
if (
|
||||
($_POST['folder']==1 && $config['chmod_dirs'] === false)
|
||||
|| ($_POST['folder']==0 && $config['chmod_files'] === false)
|
||||
|| (is_function_callable("chmod") === false)) {
|
||||
response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? trans('Folders') : trans('Files')), 403).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
$info = $_POST['permissions'];
|
||||
} else {
|
||||
$path = $config['current_path'] . $_POST['path'];
|
||||
if (
|
||||
(is_dir($path) && $config['chmod_dirs'] === false)
|
||||
|| (is_file($path) && $config['chmod_files'] === false)
|
||||
|| (is_function_callable("chmod") === false)) {
|
||||
response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? trans('Folders') : trans('Files')), 403).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$perms = fileperms($path) & 0777;
|
||||
|
||||
$info = '-';
|
||||
|
||||
// Owner
|
||||
$info .= (($perms & 0x0100) ? 'r' : '-');
|
||||
$info .= (($perms & 0x0080) ? 'w' : '-');
|
||||
$info .= (($perms & 0x0040) ?
|
||||
(($perms & 0x0800) ? 's' : 'x') :
|
||||
(($perms & 0x0800) ? 'S' : '-'));
|
||||
|
||||
// Group
|
||||
$info .= (($perms & 0x0020) ? 'r' : '-');
|
||||
$info .= (($perms & 0x0010) ? 'w' : '-');
|
||||
$info .= (($perms & 0x0008) ?
|
||||
(($perms & 0x0400) ? 's' : 'x') :
|
||||
(($perms & 0x0400) ? 'S' : '-'));
|
||||
|
||||
// World
|
||||
$info .= (($perms & 0x0004) ? 'r' : '-');
|
||||
$info .= (($perms & 0x0002) ? 'w' : '-');
|
||||
$info .= (($perms & 0x0001) ?
|
||||
(($perms & 0x0200) ? 't' : 'x') :
|
||||
(($perms & 0x0200) ? 'T' : '-'));
|
||||
}
|
||||
|
||||
|
||||
$ret = '<div id="files_permission_start">
|
||||
<form id="chmod_form">
|
||||
<table class="table file-perms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>r </td>
|
||||
<td>w </td>
|
||||
<td>x </td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>'.trans('User').'</td>
|
||||
<td><input id="u_4" type="checkbox" data-value="4" data-group="user" '.(substr($info, 1, 1)=='r' ? " checked" : "").'></td>
|
||||
<td><input id="u_2" type="checkbox" data-value="2" data-group="user" '.(substr($info, 2, 1)=='w' ? " checked" : "").'></td>
|
||||
<td><input id="u_1" type="checkbox" data-value="1" data-group="user" '.(substr($info, 3, 1)=='x' ? " checked" : "").'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>'.trans('Group').'</td>
|
||||
<td><input id="g_4" type="checkbox" data-value="4" data-group="group" '.(substr($info, 4, 1)=='r' ? " checked" : "").'></td>
|
||||
<td><input id="g_2" type="checkbox" data-value="2" data-group="group" '.(substr($info, 5, 1)=='w' ? " checked" : "").'></td>
|
||||
<td><input id="g_1" type="checkbox" data-value="1" data-group="group" '.(substr($info, 6, 1)=='x' ? " checked" : "").'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>'.trans('All').'</td>
|
||||
<td><input id="a_4" type="checkbox" data-value="4" data-group="all" '.(substr($info, 7, 1)=='r' ? " checked" : "").'></td>
|
||||
<td><input id="a_2" type="checkbox" data-value="2" data-group="all" '.(substr($info, 8, 1)=='w' ? " checked" : "").'></td>
|
||||
<td><input id="a_1" type="checkbox" data-value="1" data-group="all" '.(substr($info, 9, 1)=='x' ? " checked" : "").'></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td colspan="3"><input type="text" class="input-block-level" name="chmod_value" id="chmod_value" value="" data-def-value=""></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>';
|
||||
|
||||
if ((!$ftp && is_dir($path))) {
|
||||
$ret .= '<div class="hero-unit" style="padding:10px;">'.trans('File_Permission_Recursive').'<br/><br/>
|
||||
<ul class="unstyled">
|
||||
<li><label class="radio"><input value="none" name="apply_recursive" type="radio" checked> '.trans('No').'</label></li>
|
||||
<li><label class="radio"><input value="files" name="apply_recursive" type="radio"> '.trans('Files').'</label></li>
|
||||
<li><label class="radio"><input value="folders" name="apply_recursive" type="radio"> '.trans('Folders').'</label></li>
|
||||
<li><label class="radio"><input value="both" name="apply_recursive" type="radio"> '.trans('Files').' & '.trans('Folders').'</label></li>
|
||||
</ul>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$ret .= '</form></div>';
|
||||
|
||||
response($ret)->send();
|
||||
exit;
|
||||
|
||||
break;
|
||||
case 'get_lang':
|
||||
if (! file_exists('lang/languages.php')) {
|
||||
response(trans('Lang_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$languages = include 'lang/languages.php';
|
||||
if (! isset($languages) || ! is_array($languages)) {
|
||||
response(trans('Lang_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$curr = $_SESSION['RF']['language'];
|
||||
|
||||
$ret = '<select id="new_lang_select">';
|
||||
foreach ($languages as $code => $name) {
|
||||
$ret .= '<option value="' . $code . '"' . ($code == $curr ? ' selected' : '') . '>' . $name . '</option>';
|
||||
}
|
||||
$ret .= '</select>';
|
||||
|
||||
response($ret)->send();
|
||||
exit;
|
||||
|
||||
break;
|
||||
case 'change_lang':
|
||||
$choosen_lang = (!empty($_POST['choosen_lang']))? $_POST['choosen_lang']:"en_EN";
|
||||
|
||||
if (array_key_exists($choosen_lang, $languages)) {
|
||||
if (! file_exists('lang/' . $choosen_lang . '.php')) {
|
||||
response(trans('Lang_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
} else {
|
||||
$_SESSION['RF']['language'] = $choosen_lang;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case 'cad_preview':
|
||||
if ($ftp) {
|
||||
$selected_file = $config['ftp_base_url'].$config['upload_dir'] . $_GET['file'];
|
||||
} else {
|
||||
$selected_file = $config['current_path'] . $_GET['file'];
|
||||
|
||||
if (! file_exists($selected_file)) {
|
||||
response(trans('File_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
if ($ftp) {
|
||||
$url_file = $selected_file;
|
||||
} else {
|
||||
$url_file = $config['base_url'] . $config['upload_dir'] . str_replace($config['current_path'], '', $_GET["file"]);
|
||||
}
|
||||
|
||||
$cad_url = urlencode($url_file);
|
||||
$cad_html = "<iframe src=\"//sharecad.org/cadframe/load?url=" . $url_file . "\" class=\"google-iframe\" scrolling=\"no\"></iframe>";
|
||||
$ret = $cad_html;
|
||||
response($ret)->send();
|
||||
break;
|
||||
case 'get_file': // preview or edit
|
||||
$sub_action = $_GET['sub_action'];
|
||||
$preview_mode = $_GET["preview_mode"];
|
||||
|
||||
if ($sub_action != 'preview' && $sub_action != 'edit') {
|
||||
response(trans('wrong action').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($ftp) {
|
||||
$selected_file = ($sub_action == 'preview' ? $config['ftp_base_url'].$config['upload_dir'] . $_GET['file'] : $config['ftp_base_url'].$config['upload_dir'] . $_POST['path']);
|
||||
} else {
|
||||
$selected_file = ($sub_action == 'preview' ? $config['current_path'] . $_GET['file'] : $config['current_path'] . $_POST['path']);
|
||||
|
||||
if (! file_exists($selected_file)) {
|
||||
response(trans('File_Not_Found').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$info = pathinfo($selected_file);
|
||||
|
||||
if ($preview_mode == 'text') {
|
||||
$is_allowed = ($sub_action == 'preview' ? $config['preview_text_files'] : $config['edit_text_files']);
|
||||
$allowed_file_exts = ($sub_action == 'preview' ? $config['previewable_text_file_exts'] : $config['editable_text_file_exts']);
|
||||
} elseif ($preview_mode == 'google') {
|
||||
$is_allowed = $config['googledoc_enabled'];
|
||||
$allowed_file_exts = $config['googledoc_file_exts'];
|
||||
}
|
||||
|
||||
if (! isset($allowed_file_exts) || ! is_array($allowed_file_exts)) {
|
||||
$allowed_file_exts = array();
|
||||
}
|
||||
|
||||
if (!isset($info['extension'])) {
|
||||
$info['extension']='';
|
||||
}
|
||||
if (! in_array($info['extension'], $allowed_file_exts)
|
||||
|| ! isset($is_allowed)
|
||||
|| $is_allowed === false
|
||||
|| (!$ftp && ! is_readable($selected_file))
|
||||
) {
|
||||
response(sprintf(trans('File_Open_Edit_Not_Allowed'), ($sub_action == 'preview' ? strtolower(trans('Open')) : strtolower(trans('Edit')))).AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if ($sub_action == 'preview') {
|
||||
if ($preview_mode == 'text') {
|
||||
// get and sanities
|
||||
$data = file_get_contents($selected_file);
|
||||
$data = htmlspecialchars(htmlspecialchars_decode($data));
|
||||
$ret = '';
|
||||
|
||||
$ret .= '<script src="https://rawgit.com/google/code-prettify/master/loader/run_prettify.js?autoload=true&skin=sunburst"></script>';
|
||||
$ret .= '<?prettify lang='.$info['extension'].' linenums=true?><pre class="prettyprint"><code class="language-'.$info['extension'].'">'.$data.'</code></pre>';
|
||||
} elseif ($preview_mode == 'google') {
|
||||
if ($ftp) {
|
||||
$url_file = $selected_file;
|
||||
} else {
|
||||
$url_file = $config['base_url'] . $config['upload_dir'] . str_replace($config['current_path'], '', $_GET["file"]);
|
||||
}
|
||||
|
||||
$googledoc_url = urlencode($url_file);
|
||||
$ret = "<iframe src=\"https://docs.google.com/viewer?url=" . $url_file . "&embedded=true\" class=\"google-iframe\"></iframe>";
|
||||
}
|
||||
}else{
|
||||
$data = stripslashes(htmlspecialchars(file_get_contents($selected_file)));
|
||||
if(in_array($info['extension'],array('html','html'))){
|
||||
$ret = '<script src="https://cdn.ckeditor.com/ckeditor5/12.1.0/classic/ckeditor.js"></script><textarea id="textfile_edit_area" style="width:100%;height:300px;">'.$data.'</textarea><script>setTimeout(function(){ ClassicEditor.create( document.querySelector( "#textfile_edit_area" )).catch( function(error){ console.error( error ); } ); }, 500);</script>';
|
||||
}else{
|
||||
$ret = '<textarea id="textfile_edit_area" style="width:100%;height:300px;">'.$data.'</textarea>';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
response($ret)->send();
|
||||
exit;
|
||||
|
||||
break;
|
||||
default:
|
||||
response(trans('no action passed').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
response(trans('no action passed').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Deny from all
|
||||
@@ -0,0 +1,618 @@
|
||||
<?php
|
||||
$version = "9.14.0";
|
||||
if (session_id() == '') {
|
||||
session_start();
|
||||
}
|
||||
|
||||
mb_internal_encoding('UTF-8');
|
||||
mb_http_output('UTF-8');
|
||||
mb_language('uni');
|
||||
mb_regex_encoding('UTF-8');
|
||||
ob_start('mb_output_handler');
|
||||
date_default_timezone_set('Europe/Ljubljana');
|
||||
setlocale(LC_CTYPE, 'en_US'); //correct transliteration
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Optional security
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| if set to true only those will access RF whose url contains the access key(akey) like:
|
||||
| <input type="button" href="../filemanager/dialog.php?field_id=imgField&lang=en_EN&akey=myPrivateKey" value="Files">
|
||||
| in tinymce a new parameter added: filemanager_access_key:"myPrivateKey"
|
||||
| example tinymce config:
|
||||
|
|
||||
| tiny init ...
|
||||
| external_filemanager_path:"../filemanager/",
|
||||
| filemanager_title:"Filemanager" ,
|
||||
| filemanager_access_key:"myPrivateKey" ,
|
||||
| ...
|
||||
|
|
||||
*/
|
||||
|
||||
define('USE_ACCESS_KEYS', false); // TRUE or FALSE
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DON'T COPY THIS VARIABLES IN FOLDERS config.php FILES
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
define('DEBUG_ERROR_MESSAGE', false); // TRUE or FALSE
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Path configuration
|
||||
|--------------------------------------------------------------------------
|
||||
| In this configuration the folder tree is
|
||||
| root
|
||||
| |- source <- upload folder
|
||||
| |- thumbs <- thumbnail folder [must have write permission (755)]
|
||||
| |- filemanager
|
||||
| |- js
|
||||
| | |- tinymce
|
||||
| | | |- plugins
|
||||
| | | | |- responsivefilemanager
|
||||
| | | | | |- plugin.min.js
|
||||
*/
|
||||
|
||||
$config = array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DON'T TOUCH (base url (only domain) of site).
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| without final / (DON'T TOUCH)
|
||||
|
|
||||
*/
|
||||
'base_url' => ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http"). "://". @$_SERVER['HTTP_HOST'],
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| path from base_url to base of upload folder
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| with start and final /
|
||||
|
|
||||
*/
|
||||
'upload_dir' => '/files/media/',
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| relative path from filemanager folder to upload folder
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| with final /
|
||||
|
|
||||
*/
|
||||
'current_path' => '../../../../../files/media/',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| relative path from filemanager folder to thumbs folder
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| with final /
|
||||
| DO NOT put inside upload folder
|
||||
|
|
||||
*/
|
||||
'thumbs_base_path' => '../../../../../files/thumbs/',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| path from base_url to base of thumbs folder
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| with final /
|
||||
| DO NOT put inside upload folder
|
||||
|
|
||||
*/
|
||||
'thumbs_upload_dir' => '/files/thumbs/',
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| mime file control to define files extensions
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If you want to be forced to assign the extension starting from the mime type
|
||||
|
|
||||
*/
|
||||
'mime_extension_rename' => true,
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| FTP configuration BETA VERSION
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If you want enable ftp use write these parametres otherwise leave empty
|
||||
| Remember to set base_url properly to point in the ftp server domain and
|
||||
| upload dir will be ftp_base_folder + upload_dir so without final /
|
||||
|
|
||||
*/
|
||||
'ftp_host' => false, //put the FTP host
|
||||
'ftp_user' => "user",
|
||||
'ftp_pass' => "pass",
|
||||
'ftp_base_folder' => "base_folder",
|
||||
'ftp_base_url' => "http://site to ftp root",
|
||||
// Directory where place files before to send to FTP with final /
|
||||
'ftp_temp_folder' => "../temp/",
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| path from ftp_base_folder to base of thumbs folder with start and final /
|
||||
|---------------------------------------------------------------------------
|
||||
*/
|
||||
'ftp_thumbs_dir' => '/thumbs/',
|
||||
'ftp_ssl' => false,
|
||||
'ftp_port' => 21,
|
||||
|
||||
/* EXAMPLE
|
||||
'ftp_host' => "host.com",
|
||||
'ftp_user' => "test@host.com",
|
||||
'ftp_pass' => "pass.1",
|
||||
'ftp_base_folder' => "",
|
||||
'ftp_base_url' => "http://host.com/testFTP",
|
||||
*/
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Multiple files selection
|
||||
|--------------------------------------------------------------------------
|
||||
| The user can delete multiple files, select all files , deselect all files
|
||||
*/
|
||||
'multiple_selection' => true,
|
||||
|
||||
/*
|
||||
|
|
||||
| The user can have a select button that pass a json to external input or pass the first file selected to editor
|
||||
| If you use responsivefilemanager tinymce extension can copy into editor multiple object like images, videos, audios, links in the same time
|
||||
|
|
||||
*/
|
||||
'multiple_selection_action_button' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Access keys
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| add access keys eg: array('myPrivateKey', 'someoneElseKey');
|
||||
| keys should only containt (a-z A-Z 0-9 \ . _ -) characters
|
||||
| if you are integrating lets say to a cms for admins, i recommend making keys randomized something like this:
|
||||
| $username = 'Admin';
|
||||
| $salt = 'dsflFWR9u2xQa' (a hard coded string)
|
||||
| $akey = md5($username.$salt);
|
||||
| DO NOT use 'key' as access key!
|
||||
| Keys are CASE SENSITIVE!
|
||||
|
|
||||
*/
|
||||
|
||||
'access_keys' => array(),
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
// YOU CAN COPY AND CHANGE THESE VARIABLES INTO FOLDERS config.php FILES TO CUSTOMIZE EACH FOLDER OPTIONS
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Maximum size of all files in source folder
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| in Megabytes
|
||||
|
|
||||
*/
|
||||
'MaxSizeTotal' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Maximum upload size
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| in Megabytes
|
||||
|
|
||||
*/
|
||||
'MaxSizeUpload' => 10,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| File and Folder permission
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
'filePermission' => 0755,
|
||||
'folderPermission' => 0777,
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| default language file name
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
'default_language' => "en_EN",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Icon theme
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Default available: ico and ico_dark
|
||||
| Can be set to custom icon inside filemanager/img
|
||||
|
|
||||
*/
|
||||
'icon_theme' => "ico",
|
||||
|
||||
|
||||
//Show or not total size in filemanager (is possible to greatly increase the calculations)
|
||||
'show_total_size' => false,
|
||||
//Show or not show folder size in list view feature in filemanager (is possible, if there is a large folder, to greatly increase the calculations)
|
||||
'show_folder_size' => false,
|
||||
//Show or not show sorting feature in filemanager
|
||||
'show_sorting_bar' => true,
|
||||
//Show or not show filters button in filemanager
|
||||
'show_filter_buttons' => true,
|
||||
//Show or not language selection feature in filemanager
|
||||
'show_language_selection' => true,
|
||||
//active or deactive the transliteration (mean convert all strange characters in A..Za..z0..9 characters)
|
||||
'transliteration' => false,
|
||||
//convert all spaces on files name and folders name with $replace_with variable
|
||||
'convert_spaces' => false,
|
||||
//convert all spaces on files name and folders name this value
|
||||
'replace_with' => "_",
|
||||
//convert to lowercase the files and folders name
|
||||
'lower_case' => false,
|
||||
|
||||
//Add ?484899493349 (time value) to returned images to prevent cache
|
||||
'add_time_to_img' => false,
|
||||
|
||||
|
||||
//*******************************************
|
||||
//Images limit and resizing configuration
|
||||
//*******************************************
|
||||
|
||||
// set maximum pixel width and/or maximum pixel height for all images
|
||||
// If you set a maximum width or height, oversized images are converted to those limits. Images smaller than the limit(s) are unaffected
|
||||
// if you don't need a limit set both to 0
|
||||
'image_max_width' => 0,
|
||||
'image_max_height' => 0,
|
||||
'image_max_mode' => 'auto',
|
||||
/*
|
||||
# $option: 0 / exact = defined size;
|
||||
# 1 / portrait = keep aspect set height;
|
||||
# 2 / landscape = keep aspect set width;
|
||||
# 3 / auto = auto;
|
||||
# 4 / crop= resize and crop;
|
||||
*/
|
||||
|
||||
//Automatic resizing //
|
||||
// If you set $image_resizing to TRUE the script converts all uploaded images exactly to image_resizing_width x image_resizing_height dimension
|
||||
// If you set width or height to 0 the script automatically calculates the other dimension
|
||||
// Is possible that if you upload very big images the script not work to overcome this increase the php configuration of memory and time limit
|
||||
'image_resizing' => false,
|
||||
'image_resizing_width' => 0,
|
||||
'image_resizing_height' => 0,
|
||||
'image_resizing_mode' => 'auto', // same as $image_max_mode
|
||||
'image_resizing_override' => false,
|
||||
// If set to TRUE then you can specify bigger images than $image_max_width & height otherwise if image_resizing is
|
||||
// bigger than $image_max_width or height then it will be converted to those values
|
||||
|
||||
|
||||
//******************
|
||||
//
|
||||
// WATERMARK IMAGE
|
||||
//
|
||||
//Watermark path or false
|
||||
'image_watermark' => false,//"../watermark.png",
|
||||
# Could be a pre-determined position such as:
|
||||
# tl = top left,
|
||||
# t = top (middle),
|
||||
# tr = top right,
|
||||
# l = left,
|
||||
# m = middle,
|
||||
# r = right,
|
||||
# bl = bottom left,
|
||||
# b = bottom (middle),
|
||||
# br = bottom right
|
||||
# Or, it could be a co-ordinate position such as: 50x100
|
||||
'image_watermark_position' => 'br',
|
||||
# padding: If using a pre-determined position you can
|
||||
# adjust the padding from the edges by passing an amount
|
||||
# in pixels. If using co-ordinates, this value is ignored.
|
||||
'image_watermark_padding' => 10,
|
||||
|
||||
//******************
|
||||
// Default layout setting
|
||||
//
|
||||
// 0 => boxes
|
||||
// 1 => detailed list (1 column)
|
||||
// 2 => columns list (multiple columns depending on the width of the page)
|
||||
// YOU CAN ALSO PASS THIS PARAMETERS USING SESSION VAR => $_SESSION['RF']["VIEW"]=
|
||||
//
|
||||
//******************
|
||||
'default_view' => 0,
|
||||
|
||||
//set if the filename is truncated when overflow first row
|
||||
'ellipsis_title_after_first_row' => true,
|
||||
|
||||
//*************************
|
||||
//Permissions configuration
|
||||
//******************
|
||||
'delete_files' => true,
|
||||
'create_folders' => true,
|
||||
'delete_folders' => true,
|
||||
'upload_files' => true,
|
||||
'rename_files' => true,
|
||||
'rename_folders' => true,
|
||||
'duplicate_files' => true,
|
||||
'extract_files' => true,
|
||||
'copy_cut_files' => true, // for copy/cut files
|
||||
'copy_cut_dirs' => true, // for copy/cut directories
|
||||
'chmod_files' => true, // change file permissions
|
||||
'chmod_dirs' => true, // change folder permissions
|
||||
'preview_text_files' => true, // eg.: txt, log etc.
|
||||
'edit_text_files' => true, // eg.: txt, log etc.
|
||||
'create_text_files' => true, // only create files with exts. defined in $config['editable_text_file_exts']
|
||||
'download_files' => true, // allow download files or just preview
|
||||
|
||||
// you can preview these type of files if $preview_text_files is true
|
||||
'previewable_text_file_exts' => array( "bsh", "c","css", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml","xsl",'txt', 'log','' ),
|
||||
|
||||
// you can edit these type of files if $edit_text_files is true (only text based files)
|
||||
// you can create these type of files if $config['create_text_files'] is true (only text based files)
|
||||
// if you want you can add html,css etc.
|
||||
// but for security reasons it's NOT RECOMMENDED!
|
||||
'editable_text_file_exts' => array( 'txt', 'log', 'xml', 'html', 'css', 'htm', 'js','' ),
|
||||
|
||||
'jplayer_exts' => array("mp4","flv","webmv","webma","webm","m4a","m4v","ogv","oga","mp3","midi","mid","ogg","wav"),
|
||||
|
||||
'cad_exts' => array('dwg', 'dxf', 'hpgl', 'plt', 'spl', 'step', 'stp', 'iges', 'igs', 'sat', 'cgm', 'svg'),
|
||||
|
||||
// Preview with Google Documents
|
||||
'googledoc_enabled' => true,
|
||||
'googledoc_file_exts' => array( 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx' , 'pdf', 'odt', 'odp', 'ods'),
|
||||
|
||||
// defines size limit for paste in MB / operation
|
||||
// set 'FALSE' for no limit
|
||||
'copy_cut_max_size' => 100,
|
||||
// defines file count limit for paste / operation
|
||||
// set 'FALSE' for no limit
|
||||
'copy_cut_max_count' => 200,
|
||||
//IF any of these limits reached, operation won't start and generate warning
|
||||
|
||||
//**********************
|
||||
//Allowed extensions (lowercase insert)
|
||||
//**********************
|
||||
'ext_img' => array( 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'ico', 'webp', 'jfif' ), //Images
|
||||
'ext_file' => array( 'doc', 'docx', 'rtf', 'pdf', 'xls', 'xlsx', 'txt', 'csv', 'html', 'xhtml', 'psd', 'sql', 'log', 'fla', 'xml', 'ade', 'adp', 'mdb', 'accdb', 'ppt', 'pptx', 'odt', 'ots', 'ott', 'odb', 'odg', 'otp', 'otg', 'odf', 'ods', 'odp', 'css', 'ai', 'kmz','dwg', 'dxf', 'hpgl', 'plt', 'spl', 'step', 'stp', 'iges', 'igs', 'sat', 'cgm', 'tiff',''), //Files
|
||||
'ext_video' => array( 'mov', 'mpeg', 'm4v', 'mp4', 'avi', 'mpg', 'wma', "flv", "webm" ), //Video
|
||||
'ext_music' => array( 'mp3', 'mpga', 'm4a', 'ac3', 'aiff', 'mid', 'ogg', 'wav' ), //Audio
|
||||
'ext_misc' => array( 'zip', 'rar', 'gz', 'tar', 'iso', 'dmg' ), //Archives
|
||||
|
||||
|
||||
//*********************
|
||||
// If you insert an extensions blacklist array the filemanager don't check any extensions but simply block the extensions in the list
|
||||
// otherwise check Allowed extensions configuration
|
||||
//*********************
|
||||
'ext_blacklist' => false,//['exe','bat','jpg'],
|
||||
|
||||
|
||||
//Empty filename permits like .htaccess, .env, ...
|
||||
'empty_filename' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| accept files without extension
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If you want to accept files without extension, remember to add '' extension on allowed extension
|
||||
|
|
||||
*/
|
||||
'files_without_extension' => false,
|
||||
|
||||
/******************
|
||||
* TUI Image Editor config
|
||||
*******************/
|
||||
// Add or modify the options below as needed - they will be json encoded when added to the configuration so arrays can be utilized as needed
|
||||
'tui_active' => true,
|
||||
'tui_position' => 'bottom',
|
||||
// 'common.bi.image' => "../assets/images/logo.png",
|
||||
// 'common.bisize.width' => '70px',
|
||||
// 'common.bisize.height' => '25px',
|
||||
'common.backgroundImage' => 'none',
|
||||
'common.backgroundColor' => '#ececec',
|
||||
'common.border' => '1px solid #E6E7E8',
|
||||
|
||||
// header
|
||||
'header.backgroundImage' => 'none',
|
||||
'header.backgroundColor' => '#ececec',
|
||||
'header.border' => '0px',
|
||||
|
||||
// main icons
|
||||
'menu.normalIcon.path' => 'svg/icon-d.svg',
|
||||
'menu.normalIcon.name' => 'icon-d',
|
||||
'menu.activeIcon.path' => 'svg/icon-b.svg',
|
||||
'menu.activeIcon.name' => 'icon-b',
|
||||
'menu.disabledIcon.path' => 'svg/icon-a.svg',
|
||||
'menu.disabledIcon.name' => 'icon-a',
|
||||
'menu.hoverIcon.path' => 'svg/icon-c.svg',
|
||||
'menu.hoverIcon.name' => 'icon-c',
|
||||
'menu.iconSize.width' => '24px',
|
||||
'menu.iconSize.height' => '24px',
|
||||
|
||||
// submenu primary color
|
||||
'submenu.backgroundColor' => '#ececec',
|
||||
'submenu.partition.color' => '#000000',
|
||||
|
||||
// submenu icons
|
||||
'submenu.normalIcon.path' => 'svg/icon-d.svg',
|
||||
'submenu.normalIcon.name' => 'icon-d',
|
||||
'submenu.activeIcon.path' => 'svg/icon-b.svg',
|
||||
'submenu.activeIcon.name' => 'icon-b',
|
||||
'submenu.iconSize.width' => '32px',
|
||||
'submenu.iconSize.height' => '32px',
|
||||
|
||||
// submenu labels
|
||||
'submenu.normalLabel.color' => '#000',
|
||||
'submenu.normalLabel.fontWeight' => 'normal',
|
||||
'submenu.activeLabel.color' => '#000',
|
||||
'submenu.activeLabel.fontWeight' => 'normal',
|
||||
|
||||
// checkbox style
|
||||
'checkbox.border' => '1px solid #E6E7E8',
|
||||
'checkbox.backgroundColor' => '#000',
|
||||
|
||||
// rango style
|
||||
'range.pointer.color' => '#333',
|
||||
'range.bar.color' => '#ccc',
|
||||
'range.subbar.color' => '#606060',
|
||||
|
||||
'range.disabledPointer.color' => '#d3d3d3',
|
||||
'range.disabledBar.color' => 'rgba(85,85,85,0.06)',
|
||||
'range.disabledSubbar.color' => 'rgba(51,51,51,0.2)',
|
||||
|
||||
'range.value.color' => '#000',
|
||||
'range.value.fontWeight' => 'normal',
|
||||
'range.value.fontSize' => '11px',
|
||||
'range.value.border' => '0',
|
||||
'range.value.backgroundColor' => '#f5f5f5',
|
||||
'range.title.color' => '#000',
|
||||
'range.title.fontWeight' => 'lighter',
|
||||
|
||||
// colorpicker style
|
||||
'colorpicker.button.border' => '0px',
|
||||
'colorpicker.title.color' => '#000',
|
||||
|
||||
|
||||
//The filter and sorter are managed through both javascript and php scripts because if you have a lot of
|
||||
//file in a folder the javascript script can't sort all or filter all, so the filemanager switch to php script.
|
||||
//The plugin automatic swich javascript to php when the current folder exceeds the below limit of files number
|
||||
'file_number_limit_js' => 500,
|
||||
|
||||
//**********************
|
||||
// Hidden files and folders
|
||||
//**********************
|
||||
// set the names of any folders you want hidden (eg "hidden_folder1", "hidden_folder2" ) Remember all folders with these names will be hidden (you can set any exceptions in config.php files on folders)
|
||||
'hidden_folders' => array(),
|
||||
// set the names of any files you want hidden. Remember these names will be hidden in all folders (eg "this_document.pdf", "that_image.jpg" )
|
||||
'hidden_files' => array( 'config.php' ),
|
||||
|
||||
/*******************
|
||||
* URL upload
|
||||
*******************/
|
||||
'url_upload' => true,
|
||||
|
||||
|
||||
//************************************
|
||||
//Thumbnail for external use creation
|
||||
//************************************
|
||||
|
||||
|
||||
// New image resized creation with fixed path from filemanager folder after uploading (thumbnails in fixed mode)
|
||||
// If you want create images resized out of upload folder for use with external script you can choose this method,
|
||||
// You can create also more than one image at a time just simply add a value in the array
|
||||
// Remember than the image creation respect the folder hierarchy so if you are inside source/test/test1/ the new image will create at
|
||||
// path_from_filemanager/test/test1/
|
||||
// PS if there isn't write permission in your destination folder you must set it
|
||||
//
|
||||
'fixed_image_creation' => false, //activate or not the creation of one or more image resized with fixed path from filemanager folder
|
||||
'fixed_path_from_filemanager' => array( '../test/', '../test1/' ), //fixed path of the image folder from the current position on upload folder
|
||||
'fixed_image_creation_name_to_prepend' => array( '', 'test_' ), //name to prepend on filename
|
||||
'fixed_image_creation_to_append' => array( '_test', '' ), //name to appendon filename
|
||||
'fixed_image_creation_width' => array( 300, 400 ), //width of image
|
||||
'fixed_image_creation_height' => array( 200, 300 ), //height of image
|
||||
/*
|
||||
# $option: 0 / exact = defined size;
|
||||
# 1 / portrait = keep aspect set height;
|
||||
# 2 / landscape = keep aspect set width;
|
||||
# 3 / auto = auto;
|
||||
# 4 / crop= resize and crop;
|
||||
*/
|
||||
'fixed_image_creation_option' => array( 'crop', 'auto' ), //set the type of the crop
|
||||
|
||||
|
||||
// New image resized creation with relative path inside to upload folder after uploading (thumbnails in relative mode)
|
||||
// With Responsive filemanager you can create automatically resized image inside the upload folder, also more than one at a time
|
||||
// just simply add a value in the array
|
||||
// The image creation path is always relative so if i'm inside source/test/test1 and I upload an image, the path start from here
|
||||
//
|
||||
'relative_image_creation' => false, //activate or not the creation of one or more image resized with relative path from upload folder
|
||||
'relative_path_from_current_pos' => array( './', './' ), //relative path of the image folder from the current position on upload folder
|
||||
'relative_image_creation_name_to_prepend' => array( '', '' ), //name to prepend on filename
|
||||
'relative_image_creation_name_to_append' => array( '_thumb', '_thumb1' ), //name to append on filename
|
||||
'relative_image_creation_width' => array( 300, 400 ), //width of image
|
||||
'relative_image_creation_height' => array( 200, 300 ), //height of image
|
||||
/*
|
||||
* $option: 0 / exact = defined size;
|
||||
* 1 / portrait = keep aspect set height;
|
||||
* 2 / landscape = keep aspect set width;
|
||||
* 3 / auto = auto;
|
||||
* 4 / crop= resize and crop;
|
||||
*/
|
||||
'relative_image_creation_option' => array( 'crop', 'crop' ), //set the type of the crop
|
||||
|
||||
|
||||
// Remember text filter after close filemanager for future session
|
||||
'remember_text_filter' => false,
|
||||
|
||||
);
|
||||
|
||||
return array_merge(
|
||||
$config,
|
||||
array(
|
||||
'ext' => array_merge(
|
||||
$config['ext_img'],
|
||||
$config['ext_file'],
|
||||
$config['ext_misc'],
|
||||
$config['ext_video'],
|
||||
$config['ext_music']
|
||||
),
|
||||
'tui_defaults_config' => array(
|
||||
//'common.bi.image' => $config['common.bi.image'],
|
||||
//'common.bisize.width' => $config['common.bisize.width'],
|
||||
//'common.bisize.height' => $config['common.bisize.height'],
|
||||
'common.backgroundImage' => $config['common.backgroundImage'],
|
||||
'common.backgroundColor' => $config['common.backgroundColor'],
|
||||
'common.border' => $config['common.border'],
|
||||
'header.backgroundImage' => $config['header.backgroundImage'],
|
||||
'header.backgroundColor' => $config['header.backgroundColor'],
|
||||
'header.border' => $config['header.border'],
|
||||
'menu.normalIcon.path' => $config['menu.normalIcon.path'],
|
||||
'menu.normalIcon.name' => $config['menu.normalIcon.name'],
|
||||
'menu.activeIcon.path' => $config['menu.activeIcon.path'],
|
||||
'menu.activeIcon.name' => $config['menu.activeIcon.name'],
|
||||
'menu.disabledIcon.path' => $config['menu.disabledIcon.path'],
|
||||
'menu.disabledIcon.name' => $config['menu.disabledIcon.name'],
|
||||
'menu.hoverIcon.path' => $config['menu.hoverIcon.path'],
|
||||
'menu.hoverIcon.name' => $config['menu.hoverIcon.name'],
|
||||
'menu.iconSize.width' => $config['menu.iconSize.width'],
|
||||
'menu.iconSize.height' => $config['menu.iconSize.height'],
|
||||
'submenu.backgroundColor' => $config['submenu.backgroundColor'],
|
||||
'submenu.partition.color' => $config['submenu.partition.color'],
|
||||
'submenu.normalIcon.path' => $config['submenu.normalIcon.path'],
|
||||
'submenu.normalIcon.name' => $config['submenu.normalIcon.name'],
|
||||
'submenu.activeIcon.path' => $config['submenu.activeIcon.path'],
|
||||
'submenu.activeIcon.name' => $config['submenu.activeIcon.name'],
|
||||
'submenu.iconSize.width' => $config['submenu.iconSize.width'],
|
||||
'submenu.iconSize.height' => $config['submenu.iconSize.height'],
|
||||
'submenu.normalLabel.color' => $config['submenu.normalLabel.color'],
|
||||
'submenu.normalLabel.fontWeight' => $config['submenu.normalLabel.fontWeight'],
|
||||
'submenu.activeLabel.color' => $config['submenu.activeLabel.color'],
|
||||
//'submenu.activeLabel.fontWeight' => $config['submenu.activeLabel.fontWeightcommon.bi.image'],
|
||||
'checkbox.border' => $config['checkbox.border'],
|
||||
'checkbox.backgroundColor' => $config['checkbox.backgroundColor'],
|
||||
'range.pointer.color' => $config['range.pointer.color'],
|
||||
'range.bar.color' => $config['range.bar.color'],
|
||||
'range.subbar.color' => $config['range.subbar.color'],
|
||||
'range.disabledPointer.color' => $config['range.disabledPointer.color'],
|
||||
'range.disabledBar.color' => $config['range.disabledBar.color'],
|
||||
'range.disabledSubbar.color' => $config['range.disabledSubbar.color'],
|
||||
'range.value.color' => $config['range.value.color'],
|
||||
'range.value.fontWeight' => $config['range.value.fontWeight'],
|
||||
'range.value.fontSize' => $config['range.value.fontSize'],
|
||||
'range.value.border' => $config['range.value.border'],
|
||||
'range.value.backgroundColor' => $config['range.value.backgroundColor'],
|
||||
'range.title.color' => $config['range.title.color'],
|
||||
'range.title.fontWeight' => $config['range.title.fontWeight'],
|
||||
'colorpicker.button.border' => $config['colorpicker.button.border'],
|
||||
'colorpicker.title.color' => $config['colorpicker.title.color']
|
||||
),
|
||||
)
|
||||
);
|
||||
@@ -0,0 +1,22 @@
|
||||
@charset "UTF-8";
|
||||
/*
|
||||
* jQuery File Upload Plugin NoScript CSS
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
.fileinput-button input {
|
||||
position: static;
|
||||
opacity: 1;
|
||||
filter: none;
|
||||
font-size: inherit !important;
|
||||
direction: inherit;
|
||||
}
|
||||
.fileinput-button span {
|
||||
display: none;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
@charset "UTF-8";
|
||||
/*
|
||||
* jQuery File Upload UI Plugin NoScript CSS
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2012, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
.fileinput-button i,
|
||||
.fileupload-buttonbar .delete,
|
||||
.fileupload-buttonbar .toggle {
|
||||
display: none;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
@charset "UTF-8";
|
||||
/*
|
||||
* jQuery File Upload UI Plugin CSS
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2010, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
.fileupload-buttonbar .btn,
|
||||
.fileupload-buttonbar .toggle {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.fileupload-process {
|
||||
float: right;
|
||||
display: none;
|
||||
}
|
||||
.fileupload-processing .fileupload-process,
|
||||
.files .processing .preview {
|
||||
display: block;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background: url("../img/loading.gif") center no-repeat;
|
||||
background-size: contain;
|
||||
}
|
||||
.files audio,
|
||||
.files video {
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.fileupload-buttonbar .toggle,
|
||||
.files .toggle,
|
||||
.files .btn span {
|
||||
display: none;
|
||||
}
|
||||
.files .name {
|
||||
width: 80px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.files audio,
|
||||
.files video {
|
||||
max-width: 80px;
|
||||
}
|
||||
.files img,
|
||||
.files canvas {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
@charset "UTF-8";
|
||||
/*
|
||||
* jQuery File Upload Plugin CSS
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
.fileinput-button {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: inline-block;
|
||||
}
|
||||
.fileinput-button input {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
margin: 0;
|
||||
opacity: 0;
|
||||
-ms-filter: 'alpha(opacity=0)';
|
||||
font-size: 200px !important;
|
||||
direction: ltr;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Fixes for IE < 8 */
|
||||
@media screen\9 {
|
||||
.fileinput-button input {
|
||||
filter: alpha(opacity=0);
|
||||
font-size: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,519 @@
|
||||
<?php
|
||||
$config = include 'config/config.php';
|
||||
|
||||
include 'include/utils.php';
|
||||
|
||||
if ($_SESSION['RF']["verify"] != "RESPONSIVEfilemanager") {
|
||||
response(trans('forbidden') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!checkRelativePath($_POST['path'])) {
|
||||
response(trans('wrong path') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (isset($_SESSION['RF']['language']) && file_exists('lang/' . basename($_SESSION['RF']['language']) . '.php')) {
|
||||
$languages = include 'lang/languages.php';
|
||||
if (array_key_exists($_SESSION['RF']['language'], $languages)) {
|
||||
include 'lang/' . basename($_SESSION['RF']['language']) . '.php';
|
||||
} else {
|
||||
response(trans('Lang_Not_Found') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
response(trans('Lang_Not_Found') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$ftp = ftp_con($config);
|
||||
|
||||
$base = $config['current_path'];
|
||||
$path = $base . $_POST['path'];
|
||||
$cycle = true;
|
||||
$max_cycles = 50;
|
||||
$i = 0;
|
||||
|
||||
while ($cycle && $i < $max_cycles) {
|
||||
$i++;
|
||||
if ($path == $base) {
|
||||
$cycle = false;
|
||||
}
|
||||
|
||||
if (file_exists($path . "config.php")) {
|
||||
$configMain = $config;
|
||||
$configTemp = include $path . "config.php";
|
||||
if(is_array($configTemp) && count($configTemp) > 0){
|
||||
$config = array_merge($configMain, $configTemp);
|
||||
$config['ext'] = array_merge(
|
||||
$config['ext_img'],
|
||||
$config['ext_file'],
|
||||
$config['ext_misc'],
|
||||
$config['ext_video'],
|
||||
$config['ext_music']
|
||||
);
|
||||
}
|
||||
else{
|
||||
$config = $configMain;
|
||||
}
|
||||
$cycle = false;
|
||||
}
|
||||
$path = fix_dirname($path) . "/";
|
||||
}
|
||||
|
||||
function returnPaths($_path, $_name, $config)
|
||||
{
|
||||
global $ftp;
|
||||
$path = $config['current_path'] . $_path;
|
||||
$path_thumb = $config['thumbs_base_path'] . $_path;
|
||||
$name = null;
|
||||
if ($ftp) {
|
||||
$path = $config['ftp_base_folder'] . $config['upload_dir'] . $_path;
|
||||
$path_thumb = $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $_path;
|
||||
}
|
||||
if ($_name) {
|
||||
$name = fix_filename($_name, $config);
|
||||
if (strpos($name, '../') !== false || strpos($name, '..\\') !== false) {
|
||||
response(trans('wrong name') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
return array($path, $path_thumb, $name);
|
||||
}
|
||||
|
||||
if(isset($_POST['paths'])){
|
||||
$paths = $paths_thumb = $names = array();
|
||||
foreach ($_POST['paths'] as $key => $path) {
|
||||
if (!checkRelativePath($path))
|
||||
{
|
||||
response(trans('wrong path').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
$name = null;
|
||||
if(isset($_POST['names'][$key])){
|
||||
$name = $_POST['names'][$key];
|
||||
}
|
||||
list($path,$path_thumb,$name) = returnPaths($path,$name,$config);
|
||||
$paths[] = $path;
|
||||
$paths_thumb[] = $path_thumb;
|
||||
$names = $name;
|
||||
}
|
||||
} else {
|
||||
$name = null;
|
||||
if(isset($_POST['name'])){
|
||||
$name = $_POST['name'];
|
||||
}
|
||||
list($path,$path_thumb,$name) = returnPaths($_POST['path'],$name,$config);
|
||||
|
||||
}
|
||||
|
||||
$info = pathinfo($path);
|
||||
if (isset($info['extension']) && !(isset($_GET['action']) && $_GET['action'] == 'delete_folder') &&
|
||||
!check_extension($info['extension'], $config)
|
||||
&& $_GET['action'] != 'create_file') {
|
||||
response(trans('wrong extension') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (isset($_GET['action'])) {
|
||||
switch ($_GET['action']) {
|
||||
case 'delete_file':
|
||||
|
||||
deleteFile($path, $path_thumb, $config);
|
||||
|
||||
break;
|
||||
|
||||
case 'delete_files':
|
||||
foreach ($paths as $key => $p) {
|
||||
deleteFile($p, $paths_thumb[$key], $config);
|
||||
}
|
||||
|
||||
break;
|
||||
case 'delete_folder':
|
||||
if ($config['delete_folders']){
|
||||
|
||||
if($ftp){
|
||||
deleteDir($path,$ftp,$config);
|
||||
deleteDir($path_thumb,$ftp,$config);
|
||||
}else{
|
||||
if (is_dir($path_thumb))
|
||||
{
|
||||
deleteDir($path_thumb,NULL,$config);
|
||||
}
|
||||
|
||||
if (is_dir($path))
|
||||
{
|
||||
deleteDir($path,NULL,$config);
|
||||
if ($config['fixed_image_creation'])
|
||||
{
|
||||
foreach($config['fixed_path_from_filemanager'] as $k=>$paths){
|
||||
if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/";
|
||||
|
||||
$base_dir=$paths.substr_replace($path, '', 0, strlen($config['current_path']));
|
||||
if (is_dir($base_dir)) deleteDir($base_dir,NULL,$config);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'create_folder':
|
||||
if ($config['create_folders'])
|
||||
{
|
||||
|
||||
$name = fix_filename($_POST['name'],$config);
|
||||
$path .= $name;
|
||||
$path_thumb .= $name;
|
||||
$res = create_folder(fix_path($path,$config),fix_path($path_thumb,$config),$ftp,$config);
|
||||
if(!$res){
|
||||
response(trans('Rename_existing_folder').AddErrorLocation())->send();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'rename_folder':
|
||||
if ($config['rename_folders']){
|
||||
if(!is_dir($path)) {
|
||||
response(trans('wrong path').AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
$name = fix_filename($name, $config);
|
||||
$name = str_replace('.', '', $name);
|
||||
|
||||
if (!empty($name)) {
|
||||
if (!rename_folder($path, $name, $ftp, $config)) {
|
||||
response(trans('Rename_existing_folder') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
rename_folder($path_thumb, $name, $ftp, $config);
|
||||
if (!$ftp && $config['fixed_image_creation']) {
|
||||
foreach ($config['fixed_path_from_filemanager'] as $k => $paths) {
|
||||
if ($paths != "" && $paths[strlen($paths) - 1] != "/") {
|
||||
$paths .= "/";
|
||||
}
|
||||
|
||||
$base_dir = $paths . substr_replace($path, '', 0, strlen($config['current_path']));
|
||||
rename_folder($base_dir, $name, $ftp, $config);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
response(trans('Empty_name') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'create_file':
|
||||
if ($config['create_text_files'] === false) {
|
||||
response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!isset($config['editable_text_file_exts']) || !is_array($config['editable_text_file_exts'])) {
|
||||
$config['editable_text_file_exts'] = array();
|
||||
}
|
||||
|
||||
// check if user supplied extension
|
||||
if (strpos($name, '.') === false) {
|
||||
response(trans('No_Extension') . ' ' . sprintf(trans('Valid_Extensions'), implode(', ', $config['editable_text_file_exts'])) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// correct name
|
||||
$old_name = $name;
|
||||
$name = fix_filename($name, $config);
|
||||
if (empty($name)) {
|
||||
response(trans('Empty_name') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// check extension
|
||||
$parts = explode('.', $name);
|
||||
if (!in_array(end($parts), $config['editable_text_file_exts'])) {
|
||||
response(trans('Error_extension') . ' ' . sprintf(trans('Valid_Extensions'), implode(', ', $config['editable_text_file_exts'])) . AddErrorLocation(), 400)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$content = $_POST['new_content'];
|
||||
|
||||
if ($ftp) {
|
||||
$temp = tempnam('/tmp', 'RF');
|
||||
file_put_contents($temp, $content);
|
||||
$ftp->put("/" . $path . $name, $temp, FTP_BINARY);
|
||||
unlink($temp);
|
||||
response(trans('File_Save_OK'))->send();
|
||||
} else {
|
||||
if (!checkresultingsize(strlen($content))) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
// file already exists
|
||||
if (file_exists($path . $name)) {
|
||||
response(trans('Rename_existing_file') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (@file_put_contents($path . $name, $content) === false) {
|
||||
response(trans('File_Save_Error') . AddErrorLocation())->send();
|
||||
exit;
|
||||
} else {
|
||||
if (is_function_callable('chmod') !== false) {
|
||||
chmod($path . $name, 0644);
|
||||
}
|
||||
response(trans('File_Save_OK'))->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'rename_file':
|
||||
if ($config['rename_files']) {
|
||||
$name = fix_filename($name, $config);
|
||||
if (!empty($name)) {
|
||||
if (!rename_file($path, $name, $ftp, $config)) {
|
||||
response(trans('Rename_existing_file') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
rename_file($path_thumb, $name, $ftp, $config);
|
||||
|
||||
if ($config['fixed_image_creation']) {
|
||||
$info = pathinfo($path);
|
||||
|
||||
foreach ($config['fixed_path_from_filemanager'] as $k => $paths) {
|
||||
if ($paths != "" && $paths[strlen($paths) - 1] != "/") {
|
||||
$paths .= "/";
|
||||
}
|
||||
|
||||
$base_dir = $paths . substr_replace($info['dirname'] . "/", '', 0, strlen($config['current_path']));
|
||||
if (file_exists($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'])) {
|
||||
rename_file($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'], $config['fixed_image_creation_name_to_prepend'][$k] . $name . $config['fixed_image_creation_to_append'][$k], $ftp, $config);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
response(trans('Empty_name') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'duplicate_file':
|
||||
if ($config['duplicate_files']) {
|
||||
$name = fix_filename($name, $config);
|
||||
if (!empty($name)) {
|
||||
if (!$ftp && !checkresultingsize(filesize($path))) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if (!duplicate_file($path, $name, $ftp, $config)) {
|
||||
response(trans('Rename_existing_file') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
duplicate_file($path_thumb, $name, $ftp, $config);
|
||||
|
||||
if (!$ftp && $config['fixed_image_creation']) {
|
||||
$info = pathinfo($path);
|
||||
foreach ($config['fixed_path_from_filemanager'] as $k => $paths) {
|
||||
if ($paths != "" && $paths[strlen($paths) - 1] != "/") {
|
||||
$paths .= "/";
|
||||
}
|
||||
|
||||
$base_dir = $paths . substr_replace($info['dirname'] . "/", '', 0, strlen($config['current_path']));
|
||||
|
||||
if (file_exists($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'])) {
|
||||
duplicate_file($base_dir . $config['fixed_image_creation_name_to_prepend'][$k] . $info['filename'] . $config['fixed_image_creation_to_append'][$k] . "." . $info['extension'], $config['fixed_image_creation_name_to_prepend'][$k] . $name . $config['fixed_image_creation_to_append'][$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
response(trans('Empty_name') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'paste_clipboard':
|
||||
if (!isset($_SESSION['RF']['clipboard_action'], $_SESSION['RF']['clipboard']['path'])
|
||||
|| $_SESSION['RF']['clipboard_action'] == ''
|
||||
|| $_SESSION['RF']['clipboard']['path'] == '') {
|
||||
response()->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$action = $_SESSION['RF']['clipboard_action'];
|
||||
$data = $_SESSION['RF']['clipboard'];
|
||||
|
||||
|
||||
if ($ftp) {
|
||||
if ($_POST['path'] != "") {
|
||||
$path .= DIRECTORY_SEPARATOR;
|
||||
$path_thumb .= DIRECTORY_SEPARATOR;
|
||||
}
|
||||
$path_thumb .= basename($data['path']);
|
||||
$path .= basename($data['path']);
|
||||
$data['path_thumb'] = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $data['path'];
|
||||
$data['path'] = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $config['upload_dir'] . $data['path'];
|
||||
} else {
|
||||
$data['path_thumb'] = $config['thumbs_base_path'] . $data['path'];
|
||||
$data['path'] = $config['current_path'] . $data['path'];
|
||||
}
|
||||
|
||||
$pinfo = pathinfo($data['path']);
|
||||
|
||||
// user wants to paste to the same dir. nothing to do here...
|
||||
if ($pinfo['dirname'] == rtrim($path, DIRECTORY_SEPARATOR)) {
|
||||
response()->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// user wants to paste folder to it's own sub folder.. baaaah.
|
||||
if (is_dir($data['path']) && strpos($path, $data['path']) !== false) {
|
||||
response()->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// something terribly gone wrong
|
||||
if ($action != 'copy' && $action != 'cut') {
|
||||
response(trans('wrong action') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if ($ftp) {
|
||||
if ($action == 'copy') {
|
||||
$tmp = time() . basename($data['path']);
|
||||
$ftp->get($tmp, $data['path'], FTP_BINARY);
|
||||
$ftp->put(DIRECTORY_SEPARATOR . $path, $tmp, FTP_BINARY);
|
||||
unlink($tmp);
|
||||
|
||||
if (url_exists($data['path_thumb'])) {
|
||||
$tmp = time() . basename($data['path_thumb']);
|
||||
@$ftp->get($tmp, $data['path_thumb'], FTP_BINARY);
|
||||
@$ftp->put(DIRECTORY_SEPARATOR . $path_thumb, $tmp, FTP_BINARY);
|
||||
unlink($tmp);
|
||||
}
|
||||
} elseif ($action == 'cut') {
|
||||
$ftp->rename($data['path'], DIRECTORY_SEPARATOR . $path);
|
||||
if (url_exists($data['path_thumb'])) {
|
||||
@$ftp->rename($data['path_thumb'], DIRECTORY_SEPARATOR . $path_thumb);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// check for writability
|
||||
if (is_really_writable($path) === false || is_really_writable($path_thumb) === false) {
|
||||
response(trans('Dir_No_Write') . '<br/>' . str_replace('../', '', $path) . '<br/>' . str_replace('../', '', $path_thumb) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// check if server disables copy or rename
|
||||
if (is_function_callable(($action == 'copy' ? 'copy' : 'rename')) === false) {
|
||||
response(sprintf(trans('Function_Disabled'), ($action == 'copy' ? (trans('Copy')) : (trans('Cut')))) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if ($action == 'copy') {
|
||||
list($sizeFolderToCopy, $fileNum, $foldersCount) = folder_info($path, false);
|
||||
if (!checkresultingsize($sizeFolderToCopy)) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
rcopy($data['path'], $path);
|
||||
rcopy($data['path_thumb'], $path_thumb);
|
||||
} elseif ($action == 'cut') {
|
||||
rrename($data['path'], $path);
|
||||
rrename($data['path_thumb'], $path_thumb);
|
||||
|
||||
// cleanup
|
||||
if (is_dir($data['path']) === TRUE){
|
||||
rrename_after_cleaner($data['path']);
|
||||
rrename_after_cleaner($data['path_thumb']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cleanup
|
||||
$_SESSION['RF']['clipboard']['path'] = null;
|
||||
$_SESSION['RF']['clipboard_action'] = null;
|
||||
|
||||
break;
|
||||
|
||||
case 'chmod':
|
||||
$mode = $_POST['new_mode'];
|
||||
$rec_option = $_POST['is_recursive'];
|
||||
$valid_options = array('none', 'files', 'folders', 'both');
|
||||
$chmod_perm = ($_POST['folder'] ? $config['chmod_dirs'] : $config['chmod_files']);
|
||||
|
||||
// check perm
|
||||
if ($chmod_perm === false) {
|
||||
response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? (trans('Folders')) : (trans('Files')))) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
// check mode
|
||||
if (!preg_match("/^[0-7]{3}$/", $mode)) {
|
||||
response(trans('File_Permission_Wrong_Mode') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
// check recursive option
|
||||
if (!in_array($rec_option, $valid_options)) {
|
||||
response(trans("wrong option") . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
// check if server disabled chmod
|
||||
if (!$ftp && is_function_callable('chmod') === false) {
|
||||
response(sprintf(trans('Function_Disabled'), 'chmod') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$mode = "0" . $mode;
|
||||
$mode = octdec($mode);
|
||||
if ($ftp) {
|
||||
$ftp->chmod($mode, "/" . $path);
|
||||
} else {
|
||||
rchmod($path, $mode, $rec_option);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'save_text_file':
|
||||
$content = $_POST['new_content'];
|
||||
// $content = htmlspecialchars($content); not needed
|
||||
// $content = stripslashes($content);
|
||||
|
||||
if ($ftp) {
|
||||
$tmp = time();
|
||||
file_put_contents($tmp, $content);
|
||||
$ftp->put("/" . $path, $tmp, FTP_BINARY);
|
||||
unlink($tmp);
|
||||
response(trans('File_Save_OK'))->send();
|
||||
} else {
|
||||
// no file
|
||||
if (!file_exists($path)) {
|
||||
response(trans('File_Not_Found') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
// not writable or edit not allowed
|
||||
if (!is_writable($path) || $config['edit_text_files'] === false) {
|
||||
response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!checkresultingsize(strlen($content))) {
|
||||
response(sprintf(trans('max_size_reached'), $config['MaxSizeTotal']) . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
if (@file_put_contents($path, $content) === false) {
|
||||
response(trans('File_Save_Error') . AddErrorLocation())->send();
|
||||
exit;
|
||||
} else {
|
||||
response(trans('File_Save_OK'))->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
response(trans('wrong action') . AddErrorLocation())->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
$config = include 'config/config.php';
|
||||
|
||||
include 'include/utils.php';
|
||||
include 'include/mime_type_lib.php';
|
||||
|
||||
if ($_SESSION['RF']["verify"] != "RESPONSIVEfilemanager") {
|
||||
response(trans('forbidden') . AddErrorLocation(), 403)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!checkRelativePath($_POST['path']) || strpos($_POST['path'], '/') === 0) {
|
||||
response(trans('wrong path') . AddErrorLocation(), 400)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (strpos($_POST['name'], '/') !== false) {
|
||||
response(trans('wrong path') . AddErrorLocation(), 400)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$ftp = ftp_con($config);
|
||||
|
||||
if ($ftp) {
|
||||
$path = $config['ftp_base_url'] . $config['upload_dir'] . $_POST['path'];
|
||||
} else {
|
||||
$path = $config['current_path'] . $_POST['path'];
|
||||
}
|
||||
|
||||
$name = $_POST['name'];
|
||||
$info = pathinfo($name);
|
||||
|
||||
if (!check_extension($info['extension'], $config)) {
|
||||
response(trans('wrong extension') . AddErrorLocation(), 400)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$file_name = $info['basename'];
|
||||
$file_ext = $info['extension'];
|
||||
$file_path = $path . $name;
|
||||
|
||||
|
||||
// make sure the file exists
|
||||
if ($ftp) {
|
||||
header('Content-Type: application/octet-stream');
|
||||
header("Content-Transfer-Encoding: Binary");
|
||||
header("Content-disposition: attachment; filename=\"" . $file_name . "\"");
|
||||
readfile($file_path);
|
||||
} elseif (is_file($file_path) && is_readable($file_path)) {
|
||||
if (!file_exists($path . $name)) {
|
||||
response(trans('File_Not_Found') . AddErrorLocation(), 404)->send();
|
||||
exit;
|
||||
}
|
||||
|
||||
$size = filesize($file_path);
|
||||
$file_name = rawurldecode($file_name);
|
||||
|
||||
|
||||
if (function_exists('mime_content_type')) {
|
||||
$mime_type = mime_content_type($file_path);
|
||||
} elseif (function_exists('finfo_open')) {
|
||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||
$mime_type = finfo_file($finfo, $file_path);
|
||||
} else {
|
||||
$mime_type = get_file_mime_type($file_path);
|
||||
}
|
||||
|
||||
|
||||
@ob_end_clean();
|
||||
if (ini_get('zlib.output_compression')) {
|
||||
ini_set('zlib.output_compression', 'Off');
|
||||
}
|
||||
header('Content-Type: ' . $mime_type);
|
||||
header('Content-Disposition: attachment; filename="' . $file_name . '"');
|
||||
header("Content-Transfer-Encoding: binary");
|
||||
header('Accept-Ranges: bytes');
|
||||
|
||||
if (isset($_SERVER['HTTP_RANGE'])) {
|
||||
list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
|
||||
list($range) = explode(",", $range, 2);
|
||||
list($range, $range_end) = explode("-", $range);
|
||||
$range = intval($range);
|
||||
if (!$range_end) {
|
||||
$range_end = $size - 1;
|
||||
} else {
|
||||
$range_end = intval($range_end);
|
||||
}
|
||||
|
||||
$new_length = $range_end - $range + 1;
|
||||
header("HTTP/1.1 206 Partial Content");
|
||||
header("Content-Length: $new_length");
|
||||
header("Content-Range: bytes $range-$range_end/$size");
|
||||
} else {
|
||||
$new_length = $size;
|
||||
header("Content-Length: " . $size);
|
||||
}
|
||||
|
||||
$chunksize = 1 * (1024 * 1024);
|
||||
$bytes_send = 0;
|
||||
|
||||
if ($file = fopen($file_path, 'r')) {
|
||||
if (isset($_SERVER['HTTP_RANGE'])) {
|
||||
fseek($file, $range);
|
||||
}
|
||||
|
||||
while (!feof($file) &&
|
||||
(!connection_aborted()) &&
|
||||
($bytes_send < $new_length)
|
||||
) {
|
||||
$buffer = fread($file, $chunksize);
|
||||
echo $buffer;
|
||||
flush();
|
||||
$bytes_send += strlen($buffer);
|
||||
}
|
||||
fclose($file);
|
||||
} else {
|
||||
die('Error - can not open file.');
|
||||
}
|
||||
|
||||
die();
|
||||
} else {
|
||||
// file does not exist
|
||||
header("HTTP/1.0 404 Not Found");
|
||||
}
|
||||
|
||||
exit;
|
||||
|
After Width: | Height: | Size: 189 B |
|
After Width: | Height: | Size: 195 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 173 B |
|
After Width: | Height: | Size: 611 B |
|
After Width: | Height: | Size: 489 B |
|
After Width: | Height: | Size: 163 B |
|
After Width: | Height: | Size: 674 B |
|
After Width: | Height: | Size: 245 B |
|
After Width: | Height: | Size: 673 B |
|
After Width: | Height: | Size: 764 B |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 737 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |