elFinder.pm

Дмитрий Ривлин, 26.05.2010 17:43

Download (21.2 kB)

 
1
package Libs::elFinder;
2
3
require 5.004;
4
use strict;
5
use vars qw/$VERSION $DIRECTORY_SEPARATOR/;
6
7
use Libs::Others;
8
use Libs::Web;   # Âñå ÷òî ñâÿçàíî ñ WEB çàïðîñû îòâåòû è òàê äàëåå
9
use Libs::ReadF;
10
use Libs::Image;
11
12
13
$VERSION = "0.1.0-dev"; # Âåðñèÿ äâèæêà è API
14
$DIRECTORY_SEPARATOR='/';
15
16
17
18
sub _hash{
19
my ($str)=@_;
20
#return Libs::Others::GenMD5($str);
21
return $str;
22
}
23
24
sub _unhash{
25
my ($str)=@_;
26
#return Libs::Others::GenMD5($str);
27
return $str;
28
}
29
30
31
32
sub new{ # Ñîçäàíèå íîâîãî êëàññà. Îòñþäà íà÷èíàåòñÿ êëàññ
33
 my ($class,%cfg)=@_; #Mod - ñïèñîê ìîäóëåé äëÿ çàãðóçêè
34
 my $self = bless {}, $class;
35
36
%{$self->{CONF}} = (
37
'root'         => '',           # path to root directory
38
'URL'          => '',           # root directory URL
39
'rootAlias'    => 'Home',       # display this instead of root directory name
40
'disabled'     => [],           # list of not allowed commands
41
'dotFiles'     => 'false',      # display dot files
42
'dirSize'      => 'true',       # count total directories sizes
43
'fileMode'     => 0666,         # new files mode
44
'dirMode'      => 0777,         # new folders mode
45
'mimeDetect'   => 'auto',       # files mimetypes detection method (finfo, mime_content_type, linux (file -ib), bsd (file -Ib), internal (by extensions))
46
'uploadAllow'  => [],           # mimetypes which allowed to upload
47
'uploadDeny'   => [],           # mimetypes which not allowed to upload
48
'uploadOrder'  => 'deny,allow', # order to proccess uploadAllow and uploadAllow options
49
'imgLib'       => 'imagick',       # image manipulation library (imagick, mogrify, gd)
50
'tmbDir'       => '.tmb',       # directory name for image thumbnails. Set to "" to avoid thumbnails generation
51
'tmbCleanProb' => 1,            # how frequiently clean thumbnails dir (0 - never, 200 - every init request)
52
'tmbAtOnce'    => 5,            # number of thumbnails to generate per request
53
'tmbSize'      => 48,           # images thumbnails size (px)
54
'fileURL'      => 'true',       # display file URL in "get info"
55
'DateTimeFormat'=> '%d-%m-%Y %H:%i:%S', # file modification date format
56
'@Months'      => 'ßíâàðü,Ôåâðàëü,Ìàðò,Àïðåëü,Ìàé,Èþíü,Èþëü,Àâãóñò,Ñåíòÿáðü,Îêòÿáðü,Íîÿáðü,Äåêàáðü',
57
'@WeekDays'    => 'Âîñêðåñåíüå,Ïîíåäåëüíèê,Âòîðíèê,Ñðåäà,×åòâåð,Ïÿòíèöà,Ñóááîòà',
58
'logger'       => 'null',       # object logger
59
'aclObj'       => 'null',       # acl object (not implemented yet)
60
'aclRole'      => 'user',       # role for acl
61
'defaults'     => {             # default permisions
62
	'read'   => 'true',
63
	'write'  => 'true',
64
	'rm'     => 'true'
65
	},
66
'perms'        => [],           # individual folders/files permisions     
67
'debug'        => 'false',      # send debug to client
68
'archiveMimes' => [],           # allowed archive's mimetypes to create. Leave empty for all available types.
69
'archivers'    => []            # info about archivers to use. See example below. Leave empty for auto detect
70
);
71
$self->{CONF}       = { %{$self->{CONF}},%cfg };     # ×òåíèå ôàéëà êîíôèãóðàöèè
72
#                      { %{$self->{CONF}},Libs::ReadF::LoadCfgDB($self,'') }
73
 
74
 ($self->{FORM} , $self->{URL} ) = Libs::Web::ReadForms($self);      # ×òåíèå è ðàçáîð ñòðîêè URL,multipart,forms
75
 
76
 %{ $self->{CTYPE} }    = Libs::ReadF::LoadCfg($self,"$self->{CONF}->{'DirConf'}/mime.types",1);   # mime.types äëÿ ïðàâèëüíîãî âûâîäà ñàäåðæèìîãî
77
 %{$self->{RES}} = ();
78
79
80
81
 if (substr($self->{CONF}->{'root'}, -1) eq $DIRECTORY_SEPARATOR) {
82
     $self->{CONF}->{'root'} = substr($self->{CONF}->{'root'}, 0, -1); # Óáèðàåì ïîñëåäíèé /
83
   }
84
85
 %{$self->{CMD}} = (
86
'open'      => '_open',
87
'reload'    => '_reload',
88
'mkdir'     => '_mkdir',
89
'mkfile'    => '_mkfile',
90
'rename'    => '_rename',
91
'upload'    => '_upload',
92
'paste'     => '_paste',
93
'rm'        => '_rm',
94
'duplicate' => '_duplicate',
95
'read'      => '_fread',
96
'edit'      => '_edit',
97
'archive'   => '_archive',
98
'extract'   => '_extract',
99
'resize'    => '_resize',
100
'tmb'       => '_thumbnails',
101
'ping'      => '_ping'
102
);
103
104
#$ctr = Text::Iconv->new($self->{CONF}->{'WebCharset'},'UTF-8');
105
106
 return $self;
107
}
108
109
110
111
112
113
114
115
sub _run {
116
my ($self)=@_;
117
118
if ($self->{CONF}->{'root'} eq '' || _is_dir($self->{CONF}->{'root'}) eq 'false') {$self->{RES}->{'error'} = 'Invalid backend configuration';return}
119
if (_isAllowed($self,$self->{CONF}->{'root'}, 'read') eq 'false') {$self->{RES}->{'error'} =  'Access denied';return}
120
121
my $cmd = '';
122
if ($self->{FORM}->{'cmd'} ne '') {$cmd = Libs::Others::SpaceTrim($self->{FORM}->{'cmd'});}
123
elsif ($self->{URL}->{'cmd'} ne '') {$cmd = Libs::Others::SpaceTrim($self->{URL}->{'cmd'});}
124
125
if (exists $self->{URL}->{'init'}) {
126
my $ts = $self->_utime();
127
$self->{RES}->{'disabled'} =  $self->{CONF}->{'disabled'};
128
%{$self->{RES}->{'params'}} = (
129
	'dotFiles'   => $self->{CONF}->{'dotFiles'},
130
	'uplMaxSize' => $self->{CONF}->{'uplMaxSize'},
131
	'archives'   => [],
132
	'extract'    => [],
133
	'url'        => lc($self->{CONF}->{'fileURL'}) eq 'true' ? $self->{CONF}->{'URL'} : ''
134
	);
135
136
#if (isset($this->_commands['archive']) || isset($this->_commands['extract'])) {
137
#$this->_checkArchivers();
138
#if (isset($this->_commands['archive'])) {
139
#$this->_result['params']['archives'] = $this->_options['archiveMimes'];
140
#}
141
#if (isset($this->_commands['extract'])) {
142
#$this->_result['params']['extract'] = array_keys($this->_options['archivers']['extract']);
143
#}
144
#}
145
146
## clean thumbnails dir
147
if ($self->{CONF}->{'tmbDir'} ne '') {
148
   srand( time()* 1000000);
149
   if (rand(200) <= $self->{CONF}->{'tmbCleanProb'}) {
150
       my $ts2 = $self->_utime();
151
       opendir(DIR,$self->{CONF}->{'tmbDir'});
152
       my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
153
       closedir(DIR);
154
       foreach my $subdir (@content){unlink($self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR.$subdir)}
155
   }
156
}
157
}
158
159
160
if ($cmd ne '') {
161
 my $func=$self->{CMD}->{$cmd};
162
 $self->$func($self);
163
 } else {
164
$self->_open();
165
 }
166
}
167
168
169
170
171
172
173
174
175
sub _isAllowed{
176
my ($self,$path, $action)=@_;
177
#print "[$path, $action]\n";
178
#return 'true';
179
#print $self->{CONF}->{'defaults'}{$action};
180
#if    ($action eq 'read'){return 'true'}
181
#elsif ($action eq 'write'){return 'true'}
182
#elsif ($action eq 'rm'){return 'true'}
183
#return 'true';
184
#print "$self->{CONF}->{'root'}[$action]\n";
185
#$path = substr($path, length($self->{CONF}{'root'})+1);
186
187
#foreach ($self->{CONF}->{'perms'} as $regex => $rules) { # Äîâåñòè äî óìà
188
#  if (preg_match($regex, $path)) {
189
#      if (isset($rules[$action])) { return $rules[$action];}
190
#  }
191
#}
192
193
194
return (exists $self->{CONF}->{'defaults'}{$action}) ? $self->{CONF}->{'defaults'}{$action} : 'false';
195
}
196
197
198
199
sub _basename{
200
my ($path)=@_;
201
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
202
return substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)
203
}
204
205
sub _dirname{
206
my ($path)=@_;
207
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
208
return substr($path,0,rindex($path,$DIRECTORY_SEPARATOR))
209
}
210
211
212
sub _is_dir{
213
my ($path)=@_;
214
if (-d "$path"){return 'true'}
215
return 'false';
216
}
217
218
sub _isAccepted{
219
my ($self,$file)=@_;
220
$file=_basename($file);
221
if ('.' eq $file || '..' eq $file) {return 'false';}
222
if ($self->{CONF}->{'dotFiles'} ne 'true' && '.' eq substr($file, 0, 1)) {return 'false';}
223
return 'true';
224
}
225
226
227
sub _tree{
228
    my ($self,$path) = @_;
229
    my %dir = (
230
              'hash'  => _hash("$path"),
231
              'name'  =>  $path eq $self->{CONF}->{'root'} && $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($path),
232
              'read'  => _isAllowed($self,$path, 'read'),
233
              'write' => _isAllowed($self,$path, 'write'),
234
              'dirs'  => []
235
                 );
236
    if ($dir{'read'} eq 'true'){
237
     opendir(DIR,$path);
238
     my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);  
239
     closedir(DIR);
240
     foreach my $subdir (grep {_is_dir("$path/$_") eq 'true' && _isAccepted($self,"$path/$_") eq 'true'} @content){
241
           my %dirs=_tree($self,"$path/$subdir");
242
           push @{$dir{'dirs'}},{%dirs};
243
     }
244
    }
245
   return %dir;
246
 }
247
248
sub _cwd{
249
my ($self,$path)=@_;
250
my $rel  = $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($self->{CONF}->{'root'});
251
my $name;
252
if ($path eq $self->{CONF}->{'root'}) {$name = $rel;}
253
else {
254
      $name = _basename($path);
255
      $rel .= $DIRECTORY_SEPARATOR.substr($path, length($self->{CONF}->{'root'})+1);
256
}
257
%{$self->{RES}->{'cwd'}} = (
258
'hash'       => _hash("$path"),
259
'name'       => $name,
260
'mime'       => 'directory',
261
'rel'        => $rel,
262
'size'       => 0,
263
'date'       => Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',int(-M "$path")),
264
'read'       => 'true',
265
'write'      => _isAllowed($self,$path, 'write'),
266
'rm'         => $path eq $self->{CONF}->{'root'} ? 'false' : _isAllowed($self,$path, 'rm')
267
);
268
}
269
270
271
sub _cdc{
272
my ($self,$path)=@_;
273
opendir(DIR,$path); 
274
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
275
closedir(DIR);
276
foreach my $subdir ( grep {_isAccepted($self,"$path/$_") eq 'true'} sort {-f "$path/$a" cmp -f "$path/$b"} @content)
277
{push @{$self->{RES}->{'cdc'}},{_info($self,"$path/$subdir")};}
278
}
279
280
281
sub _info{
282
my ($self,$path)=@_;
283
my @info=(-l "$path") ? lstat("$path") : stat("$path");
284
my %info= (
285
 'hash'  => _hash("$path"),
286
 'mime'  => (_is_dir("$path") eq 'true') ? 'directory' : $self->_mimetype("$path"),
287
 'name'  => _basename("$path"),
288
 'date'  =>  Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',$info[9]),
289
 'size'  => (_is_dir("$path") eq 'true') ?  0 : $info[7],
290
 'read'  => _isAllowed($self,"$path", 'read'),
291
 'write' => _isAllowed($self,"$path", 'write'),
292
 'rm'    => _isAllowed($self,"$path", 'rm'),
293
);
294
if ($info{'mime'} ne 'directory') {
295
 if (lc($self->{CONF}->{'fileURL'}) eq 'true' && $info{'read'} eq 'true') {
296
     $info{'url'} = _path2url($self,$path);
297
 }
298
299
if ($info{'mime'} =~ /image/) {
300
301
  if ('false' ne (my @s = Libs::Image::GetImgInfo($self,$path))) { $info{'dim'} = $s[0].'x'.$s[1];}
302
  if ($info{'read'} eq 'true') {
303
      $info{'resize'} = ( exists $info{'dim'});
304
      #$tmb = _tmbPath($self,$path);
305
306
      #if (-f $tmb) {$info{'tmb'}  = _path2url($self,$tmb);}
307
      #elsif ($info{'resize'}) {$self->{RES}->{'tmb'} = 'true'}
308
   }
309
 }
310
}
311
return %info;
312
}
313
314
315
sub _mimetype{
316
my ($self,$path)=@_;
317
if (rindex($path,$DIRECTORY_SEPARATOR)!=-1){$path=substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)}
318
my ($name,$ext);
319
if (rindex($path,'.')!=-1){
320
 $ext=substr($path,rindex($path,'.')+1);
321
 $name=substr($path,0,rindex($path,'.'))
322
}
323
else {$name=$path}
324
my $mt=$self->{CTYPE}->{lc($ext)};
325
$mt=($mt ne '') ? $mt :'unknown;';
326
return $mt;
327
}
328
329
sub _content{
330
my ($self,$path,$flag)=@_;
331
_cwd($self,$path);
332
_cdc($self,$path);
333
if ($self->{RES}->{'cdc'} eq '') {push @{$self->{RES}->{'cdc'}},;}
334
if (exists $self->{URL}->{tree} || lc($flag) eq 'true') { $self->{RES}->{'tree'} = {_tree($self,$self->{CONF}->{'root'})};}
335
}
336
337
338
339
340
341
sub _open{
342
my ($self)=@_;
343
344
if ($self->{URL}->{'current'} ne '') { # read file
345
346
my $dir=_unhash($self->{URL}->{'current'});
347
my $file=_unhash($self->{URL}->{'target'});
348
349
if (($self->{URL}->{'current'} eq '')
350
|| ($self->{URL}->{'target'} eq '')
351
|| (-r (Libs::Others::SpaceTrim($dir))==0)
352
|| (-r (Libs::Others::SpaceTrim($file))==0)
353
|| (_is_dir($self,$file) eq 'true')
354
)
355
  {
356
   #Libs::ReadF::WriteFile($self,'>header',"ÆÎÏÀ\n"); #Ðàçîáðàòüñÿ ñ ðàñøèðåíèÿìè 	     
357
   print "Status: 404 Not Found\n";
358
   exit(0);
359
   }
360
if (_isAllowed($self,$dir, 'read') eq 'false' || _isAllowed($self,$file, 'read') eq 'false') {
361
   print "Status: 403 Access Denied\n";
362
   exit(0);
363
 }
364
365
366
my $mime  = _mimetype($self,$file);
367
my @parts = split('/', $mime);
368
my $disp  = ($parts[0] eq 'image' || $parts[0] eq 'text') ? 'inline' : 'attachments';
369
370
my $header="Content-Type: $mime\n";
371
  $header.="Content-Disposition: ".$disp."; filename="._basename($file)."\n";
372
#print "Content-Location: ".str_replace($this->_options['root'], '', $file));
373
  $header.='Content-Transfer-Encoding: binary'."\n\n";
374
#print "Content-Length: ".filesize($file));
375
#print "Connection: close\n\n";
376
  $header.=Libs::ReadF::ReadBinFile($self,$file);
377
  #print STDERR $header;
378
  Libs::ReadF::WriteFile($self,'>header',"$header\n"); #Ðàçîáðàòüñÿ ñ ðàñøèðåíèÿìè 	     
379
  print $header;
380
  exit(0);
381
}
382
else {
383
 my $path = $self->{CONF}->{'root'};
384
 if ($self->{URL}->{'target'} ne '' ){
385
 my $p=_unhash($self->{URL}->{'target'});
386
   if (-r ($self->{URL}->{'target'})==0){
387
     if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Invalid parameters';}
388
   } elsif (_isAllowed($self,$p, 'read') eq 'false') {
389
    if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Access denied';}
390
   } else {$path = $p;}
391
 }
392
393
 if (exists $self->{URL}->{current}) {$self->{RES}->{'error'} .= "$self->{URL}->{current}<br>"}
394
 _content($self,$path);
395
 }
396
}
397
398
sub _rm{
399
my ($self)=@_;
400
if (($self->{URL}->{'current'} eq '')
401
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
402
|| ($self->{URL}->{'targets[]'} eq '')) {
403
return $self->{RES}->{'error'}.= 'Invalid parameters '. $self->{URL}->{'targets[]'};
404
}
405
406
foreach my $hash (split(',',$self->{URL}->{'targets[]'})) {
407
 $hash=_unhash($hash);
408
 if (_is_dir("$hash") eq 'true') {$hash=~ s/ /\\ /mg;system("rm -r $hash")}
409
 else {unlink($hash);}
410
 if ($? == -1) { $self->{RES}->{'error'}.= 'Error in rm '.$hash." $!"}
411
}
412
_content($self,_unhash($self->{URL}->{'current'}),'true');
413
}
414
415
sub _rename{
416
my ($self)=@_;
417
if (($self->{URL}->{'current'} eq '')
418
|| ($self->{URL}->{'target'} eq '')
419
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
420
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
421
   {
422
   return $self->{RES}->{'error'}.= 'File not found';
423
   }
424
425
my $dir=_unhash($self->{URL}->{'current'});
426
my $name;
427
my $target=_unhash($self->{URL}->{'target'});
428
429
if (_isAllowed($self,$dir, 'write') eq 'false') {
430
   $self->{RES}->{'error'} = 'Access denied';
431
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
432
   $self->{RES}->{'error'} = 'Invalid name';
433
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
434
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
435
} elsif (! rename($target,$dir.$DIRECTORY_SEPARATOR.$name)) {
436
   $self->{RES}->{'error'} = 'Unable to rename file';
437
} else {
438
  #$this->_rmTmb($target);
439
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
440
  _content($self,$self->{URL}->{'current'},_is_dir($dir.$DIRECTORY_SEPARATOR.$name));
441
}
442
}
443
444
sub _mkdir{
445
my ($self)=@_;
446
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
447
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
448
 }
449
my $dir=_unhash($self->{URL}->{'current'});
450
my $name;
451
if (_isAllowed($self,$dir, 'write') eq 'false') {
452
   $self->{RES}->{'error'} = 'Access denied';
453
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
454
   $self->{RES}->{'error'} = 'Invalid name';
455
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
456
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
457
} elsif (! mkdir($dir.$DIRECTORY_SEPARATOR.$name, $self->{CONF}->{'dirMode'})) {
458
   $self->{RES}->{'error'} = 'Unable to create folder';
459
} else {
460
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
461
  _content($self,$self->{URL}->{'current'},'true');
462
}
463
}
464
465
466
sub _mkfile{
467
my ($self)=@_;
468
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
469
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
470
 }
471
my $dir=_unhash($self->{URL}->{'current'});
472
my $name;
473
if (_isAllowed($self,$dir, 'write') eq 'false') {
474
   $self->{RES}->{'error'} = 'Access denied';
475
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
476
   $self->{RES}->{'error'} = 'Invalid name';
477
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
478
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
479
} else {
480
        $name=$dir.$DIRECTORY_SEPARATOR.$name;
481
        if (! open(FILE,">$name"))
482
         {
483
           $self->{RES}->{'error'} = 'Unable to create file '.$name;
484
         }
485
         else {
486
          close(FILE);
487
          $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
488
          _content($self,$self->{URL}->{'current'});
489
         }
490
491
 }
492
}
493
494
sub _duplicate{
495
my ($self)=@_;
496
if (($self->{URL}->{'current'} eq '')
497
|| ($self->{URL}->{'target'} eq '')
498
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
499
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
500
   {
501
   return $self->{RES}->{'error'}.= 'Invalid parameters';
502
   }
503
504
my $dir=_unhash($self->{URL}->{'current'});
505
my $target=_unhash($self->{URL}->{'target'});
506
507
if (_isAllowed($self,$dir, 'write') eq 'false') {
508
   return $self->{RES}->{'error'} = 'Access denied';
509
}
510
511
my $dup = _uniqueName($self,$target);
512
my $dupt=$dup;
513
my $targett=$target;
514
515
$dupt =~ s/ /\\ /mg;
516
$targett =~ s/ /\\ /mg;
517
518
if (_is_dir("$target") eq 'true') {system("cp -r $targett $dupt")}
519
else {system("cp $targett $dupt")}
520
if ($? == -1) { $self->{RES}->{'error'}='Error in copy '.$target." $!"}
521
522
$self->{RES}->{'select'} =[_hash($dup)];
523
_content($self,$self->{URL}->{'current'},_is_dir($target));
524
}
525
526
527
528
529
sub _fread{
530
my ($self)=@_;
531
if (($self->{URL}->{'current'} eq '')
532
|| ($self->{URL}->{'target'} eq '')
533
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
534
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
535
   {
536
   return $self->{RES}->{'error'}.= 'Invalid parameters';
537
   }
538
539
my $dir=_unhash($self->{URL}->{'current'});
540
my $target=_unhash($self->{URL}->{'target'});
541
542
if (_isAllowed($self,$target, 'read') eq 'false') {
543
   $self->{RES}->{'error'} = 'Access denied';
544
}
545
$self->{RES}->{'content'} = Libs::ReadF::ReadBinFile($self,$target);
546
}
547
548
549
sub _edit{
550
my ($self)=@_;
551
if (($self->{FORM}->{'current'} eq '')
552
|| ($self->{FORM}->{'target'} eq '')
553
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{FORM}->{'current'})))==0)
554
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{FORM}->{'target'})))==0)
555
|| ($self->{FORM}->{'content'} eq '')
556
)
557
   {
558
   return $self->{RES}->{'error'}.= 'Invalid parameters';
559
   }
560
561
my $dir=_unhash($self->{URL}->{'current'});
562
my $target=_unhash($self->{URL}->{'target'});
563
564
if (_isAllowed($self,$target, 'write') eq 'false') {
565
   $self->{RES}->{'error'} = 'Access denied';
566
}
567
568
Libs::ReadF::WriteFile($self,$target,$self->{FORM}->{'content'});
569
$self->{RES}->{'target'} = _info($self,$target);
570
#$self->{RES}->{'content'} = Lib::ReadF::ReadBinFile($self,$target);
571
}
572
573
574
575
sub _resize{
576
my ($self)=@_;
577
if (($self->{URL}->{'current'} eq '')
578
|| ($self->{URL}->{'target'} eq '')
579
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
580
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0)
581
|| ($self->{URL}->{'width'} eq '')
582
|| ($self->{URL}->{'height'} eq '')
583
)
584
   {
585
   return $self->{RES}->{'error'}.= 'Invalid parameters';
586
   }
587
588
my $dir=_unhash($self->{URL}->{'current'});
589
my $target=_unhash($self->{URL}->{'target'});
590
591
if (_isAllowed($self,$target, 'write') eq 'false') {
592
   return $self->{RES}->{'error'} = 'Access denied';
593
}
594
if (!(_mimetype($self,$target) =~ 'image')) {
595
   return $self->{RES}->{'error'} = 'File is not an image';
596
}
597
598
#$self->{RES}->{'error'} = $target;
599
my $image=Libs::Image::ResizeImageWH($self,$target,$self->{URL}->{'width'},$self->{URL}->{'height'});
600
$image->Write(filename=>$target);
601
602
$self->{RES}->{'select'} =[_hash($target)];
603
_content($self,$self->{URL}->{'current'});
604
605
}
606
607
608
sub _thumbnails{
609
my ($self)=@_;
610
my $current=_unhash($self->{URL}->{'current'});
611
if ($self->{CONF}->{'tmbDir'} ne '' && $current ne '' && (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))!=0)) {
612
$self->{RES}->{'select'} =[_hash($current)];
613
$self->{RES}->{'images'} =[];
614
opendir(DIR,$current);
615
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
616
closedir(DIR);
617
my $cnt=0;
618
my $max=($self->{CONF}->{'tmbAtOnce'} > 0) ? $self->{CONF}->{'tmbAtOnce'} : 5;
619
foreach my $item (@content)
620
{
621
if (_isAccepted($self,$item) eq 'true') {
622
  my $path = $current.$DIRECTORY_SEPARATOR.$item;
623
   if (-r ($path)==0 && _canCreateTmb($self,_mimetype($self,$path))) {
624
    my $tmb = _tmbPath($self,$path);
625
     if (-r ($tmb)!=0) {
626
      if ($cnt>=$max) {
627
       return $self->{RES}->{'tmb'} = 'true';
628
      } elsif (_tmb($self,$path, $tmb) ne 'false') {
629
         $self->{RES}->{'images'}[_hash($path)] = _path2url($tmb);
630
         $cnt++;
631
      }
632
     }
633
    }
634
   }
635
  }
636
 }
637
}
638
639
sub _tmb{
640
my ($self,$img, $tmb)=@_;
641
if ('false' ne (my @s = Libs::Image::GetImgInfo($self,$img))){
642
  return 'false';
643
 }
644
my $tmbSize = $self->{CONF}->{'tmbSize'};
645
if ($self->{CONF}->{'imgLib'} eq 'imagick')
646
 {
647
 return Libs::Image::ThumbnailImage($self,$img,$tmbSize);
648
 }
649
 return 'false';
650
}
651
652
653
sub _utime{
654
my ($self)=@_;
655
return time().'0';
656
}
657
658
sub _checkName{
659
my ($self,$n)=@_;
660
if ($self->{CONF}->{'dotFiles'} eq 'false' && '.' eq substr($n, 0, 1)) { return 'false';}
661
return ($n =~ /[>|<|\/|:]+/) ? 'false' : $n;
662
}
663
664
sub _uniqueName{
665
my ($self,$f,$suffix)=@_;
666
$suffix=($suffix eq '') ? 'copy ' : $suffix;
667
668
my $dir  = _dirname($f);
669
my $name = _basename($f);
670
#if (_is_dir($f) eq 'false') {
671
 #if (!( $name =~ /\.(tar\.gz|tar\.bz|tar\.bz2|[a-z0-9]{1,4})$/i)) {
672
 #  $ext = '.'.$1;
673
 #  $name = substr($name, 0, -length($m[0]));
674
 # }
675
  $name=$suffix.$name;
676
# }
677
678
return $dir.$DIRECTORY_SEPARATOR.$name;
679
}
680
681
sub _path2url{
682
my ($self,$path)=@_;
683
my $dir  = substr(_dirname($path), length($self->{CONF}->{'root'})+1);
684
my $file = _basename($path);
685
return $self->{CONF}->{'URL'}.(($dir ne  '') ? '/'.$dir :'' ).'/'.$file;
686
}
687
688
sub _canCreateTmb{
689
my ($self,$mime)=@_;
690
if ($self->{CONF}->{'tmbDir'} ne '' && $self->{CONF}->{'imgLib'} ne '' && index($mime,'image')!=-1)
691
 {
692
  return 'true';
693
 }
694
return 'false';
695
}
696
697
698
sub _tmbPath{
699
my ($self,$path)=@_;
700
my $tmb;
701
if ($self->{CONF}->{'tmbDir'} ne '')
702
 {
703
  $tmb = (_dirname($path) ne $self->{CONF}->{'tmbDir'}) ? $self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR.$path.'.png' : $path;
704
 }
705
return $tmb;
706
}
707
708
1;