elFinder.pm

Дмитрий Ривлин, 09.06.2010 10:07

Download (26.4 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
$str =~ s/(.)/uc(sprintf("%02x",ord($1)))/eg;
21
return $str;
22
}
23
24
sub _unhash{
25
my ($str)=@_;
26
$str =~ s/([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
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'    => 10,            # 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
if ($self->{CONF}->{'tmbDir'} ne '') {
86
 my $tmbDir = $self->{CONF}->{'root'}.$DIRECTORY_SEPARATOR.$self->{CONF}->{'tmbDir'};
87
 $self->{CONF}->{'tmbDir'} = (_is_dir($tmbDir) eq 'true' || mkdir($tmbDir, $self->{CONF}->{'dirMode'})) ? $tmbDir : '';
88
}
89
90
91
92
 %{$self->{CMD}} = (
93
'open'      => '_open',
94
'reload'    => '_reload',
95
'mkdir'     => '_mkdir',
96
'mkfile'    => '_mkfile',
97
'rename'    => '_rename',
98
'upload'    => '_upload',
99
'paste'     => '_paste',
100
'rm'        => '_rm',
101
'duplicate' => '_duplicate',
102
'read'      => '_fread',
103
'edit'      => '_edit',
104
'archive'   => '_archive',
105
'extract'   => '_extract',
106
'resize'    => '_resize',
107
'tmb'       => '_thumbnails',
108
'ping'      => '_ping'
109
);
110
111
#$ctr = Text::Iconv->new($self->{CONF}->{'WebCharset'},'UTF-8');
112
113
 return $self;
114
}
115
116
117
118
119
120
121
122
sub _run {
123
my ($self)=@_;
124
125
if ($self->{CONF}->{'root'} eq '' || _is_dir($self->{CONF}->{'root'}) eq 'false') {$self->{RES}->{'error'} = 'Invalid backend configuration';return}
126
if (_isAllowed($self,$self->{CONF}->{'root'}, 'read') eq 'false') {$self->{RES}->{'error'} =  'Access denied';return}
127
128
my $cmd = '';
129
if ($self->{FORM}->{'cmd'} ne '') {$cmd = Libs::Others::SpaceTrim($self->{FORM}->{'cmd'});}
130
elsif ($self->{URL}->{'cmd'} ne '') {$cmd = Libs::Others::SpaceTrim($self->{URL}->{'cmd'});}
131
132
if (exists $self->{URL}->{'init'}) {
133
my $ts = $self->_utime();
134
$self->{RES}->{'disabled'} =  $self->{CONF}->{'disabled'};
135
%{$self->{RES}->{'params'}} = (
136
	'dotFiles'   => $self->{CONF}->{'dotFiles'},
137
	'uplMaxSize' => $self->{CONF}->{'uplMaxSize'},
138
	'archives'   => [],
139
	'extract'    => [],
140
	'url'        => lc($self->{CONF}->{'fileURL'}) eq 'true' ? $self->{CONF}->{'URL'} : ''
141
	);
142
143
144
if (exists $self->{CMD}->{'archive'}) {
145
 $self->{RES}->{'params'}{'archives'}=[keys %{$self->{CONF}->{'archivers'}{'create'}}];
146
}
147
if (exists $self->{CMD}->{'extract'}) {
148
  $self->{RES}->{'params'}{'extract'}=[keys %{$self->{CONF}->{'archivers'}{'extractC'}}];
149
}
150
151
152
## clean thumbnails dir
153
if ($self->{CONF}->{'tmbDir'} ne '') {
154
   srand( time()* 1000000);
155
   if (rand(200) <= $self->{CONF}->{'tmbCleanProb'}) {
156
       my $ts2 = $self->_utime();
157
       opendir(DIR,$self->{CONF}->{'tmbDir'});
158
        my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
159
       closedir(DIR);
160
       foreach my $subdir (@content){unlink($self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR.$subdir)}
161
   }
162
}
163
}
164
165
if ($cmd ne '') {
166
 my $func=$self->{CMD}->{$cmd};
167
 $self->$func($self);
168
 } else {
169
$self->_open();
170
 }
171
}
172
173
174
175
176
177
178
179
180
sub _isAllowed{
181
my ($self,$path, $action)=@_;
182
#print "[$path, $action]\n";
183
#return 'true';
184
#print $self->{CONF}->{'defaults'}{$action};
185
#if    ($action eq 'read'){return 'true'}
186
#elsif ($action eq 'write'){return 'true'}
187
#elsif ($action eq 'rm'){return 'true'}
188
#return 'true';
189
#print "$self->{CONF}->{'root'}[$action]\n";
190
#$path = substr($path, length($self->{CONF}{'root'})+1);
191
192
#foreach ($self->{CONF}->{'perms'} as $regex => $rules) { # Äîâåñòè äî óìà
193
#  if (preg_match($regex, $path)) {
194
#      if (isset($rules[$action])) { return $rules[$action];}
195
#  }
196
#}
197
198
199
return (exists $self->{CONF}->{'defaults'}{$action}) ? $self->{CONF}->{'defaults'}{$action} : 'false';
200
}
201
202
203
204
sub _basename{
205
my ($path)=@_;
206
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
207
return substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)
208
}
209
210
sub _dirname{
211
my ($path)=@_;
212
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
213
return substr($path,0,rindex($path,$DIRECTORY_SEPARATOR))
214
}
215
216
217
sub _is_dir{
218
my ($path)=@_;
219
if (-d "$path"){return 'true'}
220
return 'false';
221
}
222
223
sub _isAccepted{
224
my ($self,$file)=@_;
225
$file=_basename($file);
226
if ('.' eq $file || '..' eq $file) {return 'false';}
227
if ($self->{CONF}->{'dotFiles'} ne 'true' && '.' eq substr($file, 0, 1)) {return 'false';}
228
return 'true';
229
}
230
231
232
sub _tree{
233
    my ($self,$path) = @_;
234
    my %dir = (
235
              'hash'  => _hash("$path"),
236
              'name'  =>  $path eq $self->{CONF}->{'root'} && $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($path),
237
              'read'  => _isAllowed($self,$path, 'read'),
238
              'write' => _isAllowed($self,$path, 'write'),
239
              'dirs'  => []
240
                 );
241
    if ($dir{'read'} eq 'true'){
242
     opendir(DIR,$path);
243
     my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);  
244
     closedir(DIR);
245
     foreach my $subdir (grep {_is_dir("$path/$_") eq 'true' && _isAccepted($self,"$path/$_") eq 'true'} @content){
246
           my %dirs=_tree($self,"$path/$subdir");
247
           push @{$dir{'dirs'}},{%dirs};
248
     }
249
    }
250
   return %dir;
251
 }
252
253
sub _cwd{
254
my ($self,$path)=@_;
255
my $rel  = $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($self->{CONF}->{'root'});
256
my $name;
257
if ($path eq $self->{CONF}->{'root'}) {$name = $rel;}
258
else {
259
      $name = _basename($path);
260
      $rel .= $DIRECTORY_SEPARATOR.substr($path, length($self->{CONF}->{'root'})+1);
261
}
262
%{$self->{RES}->{'cwd'}} = (
263
'hash'       => _hash("$path"),
264
'name'       => $name,
265
'mime'       => 'directory',
266
'rel'        => $rel,
267
'size'       => 0,
268
'date'       => Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',int(-M "$path")),
269
'read'       => 'true',
270
'write'      => _isAllowed($self,$path, 'write'),
271
'rm'         => $path eq $self->{CONF}->{'root'} ? 'false' : _isAllowed($self,$path, 'rm')
272
);
273
}
274
275
276
sub _cdc{
277
my ($self,$path)=@_;
278
opendir(DIR,$path); 
279
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
280
closedir(DIR);
281
foreach my $subdir ( grep {_isAccepted($self,"$path/$_") eq 'true'} sort {-f "$path/$a" cmp -f "$path/$b"} @content)
282
{push @{$self->{RES}->{'cdc'}},{_info($self,"$path/$subdir")};}
283
}
284
285
286
sub _info{
287
my ($self,$path)=@_;
288
my @info=(-l "$path") ? lstat("$path") : stat("$path");
289
my %info= (
290
 'hash'  => _hash("$path"),
291
 'mime'  => (_is_dir("$path") eq 'true') ? 'directory' : $self->_mimetype("$path"),
292
 'name'  => _basename("$path"),
293
 'date'  =>  Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',$info[9]),
294
 'size'  => (_is_dir("$path") eq 'true') ?  0 : $info[7],
295
 'read'  => _isAllowed($self,"$path", 'read'),
296
 'write' => _isAllowed($self,"$path", 'write'),
297
 'rm'    => _isAllowed($self,"$path", 'rm'),
298
);
299
if ($info{'mime'} ne 'directory') {
300
 if (lc($self->{CONF}->{'fileURL'}) eq 'true' && $info{'read'} eq 'true') {
301
     $info{'url'} = _path2url($self,$path);
302
 }
303
304
if ($info{'mime'} =~ /image/) {
305
306
  if ('false' ne (my @s = Libs::Image::GetImgInfo($self,$path))) { $info{'dim'} = $s[0].'x'.$s[1];}
307
  if ($info{'read'} eq 'true') {
308
      $info{'resize'} = ( exists $info{'dim'});
309
      my $tmb = _tmbPath($self,$path);
310
      if (-f $tmb) {$info{'tmb'}  = _path2url($self,$tmb);}
311
      elsif ($info{'resize'}) {$self->{RES}->{'tmb'} = 'true'}
312
   }
313
 }
314
}
315
return %info;
316
}
317
318
319
sub _mimetype{
320
my ($self,$path)=@_;
321
if (rindex($path,$DIRECTORY_SEPARATOR)!=-1){$path=substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)}
322
my ($name,$ext);
323
if (rindex($path,'.')!=-1){
324
 $ext=substr($path,rindex($path,'.')+1);
325
 $name=substr($path,0,rindex($path,'.'))
326
}
327
else {$name=$path}
328
my $mt=$self->{CTYPE}->{lc($ext)};
329
$mt=($mt ne '') ? $mt :'unknown;';
330
return $mt;
331
}
332
333
sub _content{
334
my ($self,$path,$flag)=@_;
335
_cwd($self,$path);
336
_cdc($self,$path);
337
if ($self->{RES}->{'cdc'} eq '') {push @{$self->{RES}->{'cdc'}},;}
338
if (exists $self->{URL}->{tree} || lc($flag) eq 'true') { $self->{RES}->{'tree'} = {_tree($self,$self->{CONF}->{'root'})};}
339
return '';
340
}
341
342
343
344
345
346
sub _open{
347
my ($self)=@_;
348
349
if ($self->{URL}->{'current'} ne '') { # read file
350
351
my $dir=_unhash($self->{URL}->{'current'});
352
my $file=_unhash($self->{URL}->{'target'});
353
354
if (($self->{URL}->{'current'} eq '')
355
|| ($self->{URL}->{'target'} eq '')
356
|| (-r (Libs::Others::SpaceTrim($dir))==0)
357
|| (-r (Libs::Others::SpaceTrim($file))==0)
358
|| (_is_dir($self,$file) eq 'true')
359
)
360
  {
361
   #Libs::ReadF::WriteFile($self,'>header',"ÆÎÏÀ\n"); #Ðàçîáðàòüñÿ ñ ðàñøèðåíèÿìè 	     
362
   print "Status: 404 Not Found\n";
363
   exit(0);
364
   }
365
if (_isAllowed($self,$dir, 'read') eq 'false' || _isAllowed($self,$file, 'read') eq 'false') {
366
   print "Status: 403 Access Denied\n";
367
   exit(0);
368
 }
369
370
371
my $mime  = _mimetype($self,$file);
372
my @parts = split('/', $mime);
373
my $disp  = ($parts[0] eq 'image' || $parts[0] eq 'text') ? 'inline' : 'attachments';
374
375
my $header="Content-Type: $mime\n";
376
  $header.="Content-Disposition: ".$disp."; filename="._basename($file)."\n";
377
#print "Content-Location: ".str_replace($this->_options['root'], '', $file));
378
  $header.='Content-Transfer-Encoding: binary'."\n\n";
379
#print "Content-Length: ".filesize($file));
380
#print "Connection: close\n\n";
381
  $header.=Libs::ReadF::ReadBinFile($self,$file);
382
  print $header;
383
  exit(0);
384
}
385
else {
386
 my $path = $self->{CONF}->{'root'};
387
 if ($self->{URL}->{'target'} ne '' ){
388
 my $p=_unhash($self->{URL}->{'target'});
389
   if (-e ($p)!=1){
390
     if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Invalid parameters open';}
391
   } elsif (_isAllowed($self,$p, 'read') eq 'false') {
392
    if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Access denied';}
393
   } else {$path = $p;}
394
 }
395
396
 if (exists $self->{URL}->{current}) {$self->{RES}->{'error'} .= "$self->{URL}->{current}<br>"}
397
 _content($self,$path);
398
 }
399
}
400
401
sub _rm{
402
my ($self)=@_;
403
my $current=_unhash($self->{URL}->{'current'});
404
if (($self->{URL}->{'current'} eq '')
405
|| (-r (Libs::Others::SpaceTrim($current))==0)
406
|| ($self->{URL}->{'targets[]'} eq '')) {
407
return $self->{RES}->{'error'}.= 'Invalid parameters '. $self->{URL}->{'targets[]'};
408
}
409
410
foreach my $hash (split(',',$self->{URL}->{'targets[]'})) {
411
 $hash=_unhash($hash);
412
 #$self->{RES}->{'error'}.="$hash<br>";
413
 if (_is_dir("$hash") eq 'true') {$hash=~ s/ /\\ /mg;system("rm -r $hash")}
414
 else {unlink($hash);}
415
 if ($? == -1) { $self->{RES}->{'error'}.= 'Error in rm '.$hash." $!"}
416
}
417
 _content($self,$current,'true');
418
}
419
420
sub _rename{
421
my ($self)=@_;
422
if (($self->{URL}->{'current'} eq '')
423
|| ($self->{URL}->{'target'} eq '')
424
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
425
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
426
   {
427
   return $self->{RES}->{'error'}.= 'File not found';
428
   }
429
430
my $dir=_unhash($self->{URL}->{'current'});
431
my $name;
432
my $target=_unhash($self->{URL}->{'target'});
433
434
if (_isAllowed($self,$dir, 'write') eq 'false') {
435
   $self->{RES}->{'error'} = 'Access denied';
436
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
437
   $self->{RES}->{'error'} = 'Invalid name';
438
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
439
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
440
} elsif (! rename($target,$dir.$DIRECTORY_SEPARATOR.$name)) {
441
   $self->{RES}->{'error'} = 'Unable to rename file';
442
} else {
443
  _rmTmb($self,$target);
444
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
445
  _content($self,$dir,_is_dir($dir.$DIRECTORY_SEPARATOR.$name));
446
}
447
}
448
449
sub _mkdir{
450
my ($self)=@_;
451
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
452
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
453
 }
454
my $dir=_unhash($self->{URL}->{'current'});
455
my $name;
456
if (_isAllowed($self,$dir, 'write') eq 'false') {
457
   $self->{RES}->{'error'} = 'Access denied';
458
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
459
   $self->{RES}->{'error'} = 'Invalid name';
460
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
461
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
462
} elsif (! mkdir($dir.$DIRECTORY_SEPARATOR.$name, $self->{CONF}->{'dirMode'})) {
463
   $self->{RES}->{'error'} = 'Unable to create folder';
464
} else {
465
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
466
  _content($self,$dir,'true');
467
}
468
}
469
470
471
sub _mkfile{
472
my ($self)=@_;
473
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
474
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
475
 }
476
my $dir=_unhash($self->{URL}->{'current'});
477
my $name;
478
if (_isAllowed($self,$dir, 'write') eq 'false') {
479
   $self->{RES}->{'error'} = 'Access denied';
480
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
481
   $self->{RES}->{'error'} = 'Invalid name';
482
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
483
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
484
} else {
485
        $name=$dir.$DIRECTORY_SEPARATOR.$name;
486
        if (! open(FILE,">$name"))
487
         {
488
           $self->{RES}->{'error'} = 'Unable to create file '.$name;
489
         }
490
         else {
491
          close(FILE);
492
          $self->{RES}->{'select'} =[_hash($name)];
493
          _content($self,$dir);
494
         }
495
496
 }
497
}
498
499
sub _duplicate{
500
my ($self)=@_;
501
my $dir=_unhash($self->{URL}->{'current'});
502
my $target=_unhash($self->{URL}->{'target'});
503
504
if (($self->{URL}->{'current'} eq '')
505
|| ($self->{URL}->{'target'} eq '')
506
|| (-r (Libs::Others::SpaceTrim($dir))==0)
507
|| (-r (Libs::Others::SpaceTrim($target))==0))
508
   {
509
   return $self->{RES}->{'error'}.= 'Invalid parameters';
510
   }
511
512
513
if (_isAllowed($self,$dir, 'write') eq 'false') {
514
   return $self->{RES}->{'error'} = 'Access denied';
515
}
516
517
my $dup = _uniqueName($self,$target);
518
my $dupt=$dup;
519
my $targett=$target;
520
521
$dupt =~ s/ /\\ /mg;
522
$targett =~ s/ /\\ /mg;
523
524
if (_is_dir("$target") eq 'true') {system("cp -r $targett $dupt")}
525
else {system("cp $targett $dupt")}
526
if ($? == -1) { $self->{RES}->{'error'}='Error in copy '.$target." $!"}
527
528
$self->{RES}->{'select'} =[_hash($dup)];
529
_content($self,$dir,_is_dir($target));
530
}
531
532
533
534
535
sub _fread{
536
my ($self)=@_;
537
my $dir=_unhash($self->{URL}->{'current'});
538
my $target=_unhash($self->{URL}->{'target'});
539
540
if (($self->{URL}->{'current'} eq '')
541
|| ($self->{URL}->{'target'} eq '')
542
|| (-r (Libs::Others::SpaceTrim($dir))==0)
543
|| (-r (Libs::Others::SpaceTrim($target))==0))
544
   {
545
   return $self->{RES}->{'error'}.= 'Invalid parameters';
546
   }
547
548
if (_isAllowed($self,$target, 'read') eq 'false') {
549
   $self->{RES}->{'error'} = 'Access denied';
550
}
551
552
my $File=Libs::ReadF::ReadBinFile($self,$target);
553
my $ctr = Text::Iconv->new('UTF-8',$self->{CONF}->{'WebCharset'});
554
$File=$ctr->convert($File);
555
556
#Libs::ReadF::WriteFile($self,">FILE","$target\n$File");
557
$self->{RES}->{'content'} = $File;
558
}
559
560
561
sub _edit{
562
my ($self)=@_;
563
my $dir=_unhash($self->{FORM}->{'current'});
564
my $target=_unhash($self->{FORM}->{'target'});
565
566
567
if (($dir eq '')
568
|| ($target eq '')
569
|| (-r (Libs::Others::SpaceTrim($dir))==0)
570
|| (-r (Libs::Others::SpaceTrim($target))==0)
571
|| ($self->{FORM}->{'content'} eq '')
572
)
573
   {
574
   return $self->{RES}->{'error'}.= 'Invalid parameters';
575
   }
576
577
578
if (_isAllowed($self,$target, 'write') eq 'false') {
579
   $self->{RES}->{'error'} = 'Access denied';
580
}
581
#Libs::ReadF::WriteFile($self,">FILE","$target\n$self->{FORM}->{'content'}");
582
583
my $ctr = Text::Iconv->new('UTF-8',$self->{CONF}->{'WebCharset'});
584
$self->{FORM}->{'content'}=$ctr->convert($self->{FORM}->{'content'});
585
586
#Libs::ReadF::WriteFile($self,">FILE","$target\n$self->{FORM}->{'content'}");
587
Libs::ReadF::WriteFile($self,$target,$self->{FORM}->{'content'});
588
$self->{RES}->{'target'} = {_info($self,$target)};
589
}
590
591
592
sub _upload{
593
my ($self)=@_;
594
my $dir=_unhash($self->{FORM}->{'current'});
595
596
if (($self->{FORM}->{'current'} eq '')
597
|| (-r (Libs::Others::SpaceTrim($dir))==0)
598
)
599
   {
600
   return $self->{RES}->{'error'}.= 'Invalid parameters';
601
   }
602
603
if (_isAllowed($self,$dir, 'write') eq 'false') {
604
   $self->{RES}->{'error'} = 'Access denied';
605
}
606
my $total;
607
foreach my $i (keys %{$self->{FORM}->{'_FILES_'}}){
608
 if ($self->{FORM}->{'_FILES_'}{$i} ne '')
609
 {
610
 $total++;
611
 my $name;
612
 if ('false' eq ($name = _checkName($self,$i))) {
613
     #$this->_errorData($_FILES['upload']['name'][$i], 'Invalid name');
614
     $self->{RES}->{'errorData'}={$i=>'Invalid name'};
615
 #} elsif (!$this->_isUploadAllow($_FILES['upload']['name'][$i], $_FILES['upload']['tmp_name'][$i])) {
616
#     $this->_errorData($_FILES['upload']['name'][$i], 'Not allowed file type');
617
 } else {
618
     my $file = $dir.$DIRECTORY_SEPARATOR.$i;
619
     Libs::ReadF::WriteFile($self,$file,$self->{FORM}->{'_FILES_'}{$i});
620
     chmod($file, $self->{CONF}->{'fileMode'});
621
     $self->{RES}->{'select'} = [_hash($file)];
622
    }
623
   }
624
  }
625
_content($self,$dir);
626
}
627
628
sub _resize{
629
my ($self)=@_;
630
if (($self->{URL}->{'current'} eq '')
631
|| ($self->{URL}->{'target'} eq '')
632
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
633
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0)
634
|| ($self->{URL}->{'width'} eq '')
635
|| ($self->{URL}->{'height'} eq '')
636
)
637
{
638
  return $self->{RES}->{'error'}.= 'Invalid parameters';
639
}
640
641
my $dir=_unhash($self->{URL}->{'current'});
642
my $target=_unhash($self->{URL}->{'target'});
643
644
if (_isAllowed($self,$target, 'write') eq 'false') {
645
   return $self->{RES}->{'error'} = 'Access denied';
646
}
647
if (!(_mimetype($self,$target) =~ 'image')) {
648
   return $self->{RES}->{'error'} = 'File is not an image';
649
}
650
651
652
my $image=Libs::Image::ResizeImageWH($self,$target,$self->{URL}->{'width'},$self->{URL}->{'height'});
653
$image->Write($target);
654
$self->{RES}->{'select'} =[_hash($target)];
655
_content($self,$dir);
656
}
657
658
659
sub _archive{
660
my ($self)=@_;
661
662
my $dir=_unhash($self->{URL}->{'current'});
663
my $target=_unhash($self->{URL}->{'targets[]'});
664
665
if (($dir eq '')
666
|| ($target eq '')
667
|| (-r (Libs::Others::SpaceTrim($dir))==0)
668
|| (!(exists $self->{CONF}->{'archivers'}{'create'}{$self->{URL}->{'type'}}))
669
)
670
   {
671
   return $self->{RES}->{'error'}.= 'Invalid parameters Archive';
672
   }
673
674
if (_isAllowed($self,$dir, 'write') eq 'false') {
675
   $self->{RES}->{'error'} = 'Access denied';
676
}
677
678
my $argc;
679
my @targets=split(',',$self->{URL}->{'targets[]'});
680
my $name=(int(@targets)==1) ? _unhash($targets[0]) : $self->{URL}->{'name'};
681
$name = _basename(_uniqueName($self,$name.'.'.$self->{CONF}->{'archivers'}{'create'}{$self->{URL}->{'type'}}{'ext'}, ''));
682
foreach my $hash (@targets) {
683
 $hash=_unhash($hash);
684
 $argc.=_basename($hash).' ';
685
}
686
687
my $line="$self->{CONF}->{'archivers'}{'create'}{$self->{URL}->{'type'}}{'cmd'} $self->{CONF}->{'archivers'}{'create'}{$self->{URL}->{'type'}}{'argc'} '"._basename($name)."' $argc";
688
chdir($dir);
689
system("$line");# or $self->{RES}->{'error'} = 'Unable to extract files from archive '." $!";
690
chdir(_dirname($0));
691
if (-e ($dir.$DIRECTORY_SEPARATOR.$name)==1){
692
 _content($self,$dir);
693
 $self->{RES}->{'select'} = [_hash($dir.$DIRECTORY_SEPARATOR.$name)];
694
} else {
695
    $self->{RES}->{'error'} = 'Unable to create archive<br>'.$dir.$DIRECTORY_SEPARATOR.$name."<br> $line<br>$name";
696
}
697
}
698
699
700
701
sub _extract{
702
my ($self)=@_;
703
704
my $dir=_unhash($self->{URL}->{'current'});
705
my $target=_unhash($self->{URL}->{'target'});
706
707
if (($dir eq '')
708
|| ($target eq '')
709
|| (-r (Libs::Others::SpaceTrim($dir))==0)
710
|| (-r (Libs::Others::SpaceTrim($target))==0)
711
)
712
   {
713
   return $self->{RES}->{'error'}.= 'Invalid parameters';
714
   }
715
716
if (_isAllowed($self,$dir, 'write') eq 'false') {
717
   $self->{RES}->{'error'} = 'Access denied';
718
}
719
720
foreach my $i (sort{length($b) <=> length($a)} keys %{$self->{CONF}->{'archivers'}{'extract'}}){
721
  if ($target =~ /\.$i$/)
722
   {
723
724
   my $line="$self->{CONF}->{'archivers'}{'extract'}{$i}{'cmd'} $self->{CONF}->{'archivers'}{'extract'}{$i}{'argc'} '"._basename($target)."'";
725
   chdir($dir);
726
   system("$line");# or $self->{RES}->{'error'} = 'Unable to extract files from archive '." $!";
727
   chdir(_dirname($0));
728
   _content($self,$dir, 'true');
729
   return;
730
   }
731
}
732
733
return $self->{RES}->{'error'} .= 'Invalid parameters in extract';
734
}
735
736
737
738
739
740
741
sub _thumbnails{
742
my ($self)=@_;
743
my $current=_unhash($self->{URL}->{'current'});
744
if ($self->{CONF}->{'tmbDir'} ne '' && $current ne '' && (-r (Libs::Others::SpaceTrim($current))!=0)) {
745
$self->{RES}->{'select'} =[_hash($current)];
746
$self->{RES}->{'images'} =[];
747
opendir(DIR,$current);
748
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
749
closedir(DIR);
750
my $cnt=0;
751
my $max=($self->{CONF}->{'tmbAtOnce'} > 0) ? $self->{CONF}->{'tmbAtOnce'} : 5;
752
foreach my $item (@content)
753
{
754
 my $path = $current.$DIRECTORY_SEPARATOR.$item;
755
 if (_is_dir($path) eq 'true'){next}
756
 
757
 if (_isAccepted($self,$item) eq 'true') {
758
   if (-e ($path)==1 && 'true' eq _canCreateTmb($self,_mimetype($self,$path))) {
759
    my $tmb = _tmbPath($self,$path);
760
     if (-e ($tmb)!=1) {
761
      if ($cnt>=$max) {
762
       return $self->{RES}->{'tmb'} = 'true';
763
      } elsif (_tmb($self,$path, $tmb) ne 'false') {
764
           push @{$self->{RES}->{'images'}},{_hash($path) => _path2url($self,$tmb)};
765
         $cnt++;
766
      }
767
     }
768
    }
769
   }
770
  }
771
 }
772
}
773
774
sub _paste{
775
my ($self)=@_;
776
my $dir=_unhash($self->{URL}->{'current'});
777
my $target=_unhash($self->{URL}->{'targets[]'});
778
my $src=_unhash($self->{URL}->{'src'});
779
my $dst=_unhash($self->{URL}->{'dst'});
780
781
if (($dir eq '')
782
|| (-r (Libs::Others::SpaceTrim($dir))==0)
783
|| ($src eq '')
784
|| (-r (Libs::Others::SpaceTrim($src))==0)
785
|| ($dst eq '')
786
|| (-r (Libs::Others::SpaceTrim($dst))==0)
787
|| ($target eq '')
788
)
789
   {
790
   return $self->{RES}->{'error'}.= 'Invalid parameters Paste';
791
   }
792
793
if (_isAllowed($self,$dst, 'write') eq 'false' || _isAllowed($self,$src, 'read') eq 'false') {
794
   $self->{RES}->{'error'} = 'Access denied';
795
}
796
my $cut=($self->{URL}->{'cut'} eq '1') ? 'true' : 'false';
797
if (-e (Libs::Others::SpaceTrim($dst))!=1){return $self->{RES}->{'error'}='File not found'.(-r (Libs::Others::SpaceTrim($dst))) && _content($self,$src, 'true');}
798
799
my $ddst;
800
801
foreach my $hash (split(',',$self->{URL}->{'targets[]'})) {
802
 $hash=_unhash($hash);
803
 $ddst =(_is_dir("$hash") ne 'true') ? $dst.$DIRECTORY_SEPARATOR._basename($hash) : $dst.$DIRECTORY_SEPARATOR;
804
805
 if ($cut eq 'true'){
806
   if (! rename($hash,$ddst)) { return $self->{RES}->{'error'} = 'Unable to move files' && _content($self,$src, 'true');}
807
   elsif(_is_dir($hash) eq 'false'){_rmTmb($self,$hash)}
808
 }else{
809
    if (_is_dir("$hash") eq 'true') {system("cp -r $src $ddst")}
810
    else {system("cp $hash $ddst")}
811
    if ($? == -1) { return $self->{RES}->{'error'}='Error in copy '.$ddst." $!" && _content($self,$src, 'true')}
812
  }
813
}
814
_content($self,$src, 'true');
815
}
816
817
sub _tmb{
818
my ($self,$img, $tmb)=@_;
819
820
if ('false' eq (my @s = Libs::Image::GetImgInfo($self,$img))){
821
  return 'false';
822
 }
823
824
my $tmbSize = $self->{CONF}->{'tmbSize'};
825
if ($self->{CONF}->{'imgLib'} eq 'imagick')
826
 {
827
 return Libs::Image::ThumbnailImage($self,$img,$tmbSize,$tmb);
828
 }
829
 return 'false';
830
}
831
832
833
sub _ping{
834
print "Connection: close\n\n";
835
exit(0);
836
}
837
838
839
sub _utime{
840
my ($self)=@_;
841
return time().'0';
842
}
843
844
sub _checkName{
845
my ($self,$n)=@_;
846
if ($self->{CONF}->{'dotFiles'} eq 'false' && '.' eq substr($n, 0, 1)) { return 'false';}
847
return ($n =~ /[>|<|\/|:]+/) ? 'false' : $n;
848
}
849
850
sub _uniqueName{
851
my ($self,$f,$suffix)=@_;
852
$suffix=(undef($suffix)) ? 'copy ' : $suffix;
853
854
my $dir  = _dirname($f);
855
my $name = _basename($f);
856
#if (_is_dir($f) eq 'false') {
857
 #if (!( $name =~ /\.(tar\.gz|tar\.bz|tar\.bz2|[a-z0-9]{1,4})$/i)) {
858
 #  $ext = '.'.$1;
859
 #  $name = substr($name, 0, -length($m[0]));
860
 # }
861
  $name=$suffix.$name;
862
# }
863
864
return $dir.$DIRECTORY_SEPARATOR.$name;
865
}
866
867
sub _path2url{
868
my ($self,$path)=@_;
869
my $dir  = substr(_dirname($path), length($self->{CONF}->{'root'})+1);
870
my $file = _basename($path);
871
return $self->{CONF}->{'URL'}.(($dir ne  '') ? '/'.$dir :'' ).'/'.$file;
872
}
873
874
sub _canCreateTmb{
875
my ($self,$mime)=@_;
876
if ($self->{CONF}->{'tmbDir'} ne '' && $self->{CONF}->{'imgLib'} ne '' && index($mime,'image')!=-1)
877
 {
878
  return 'true';
879
 }
880
return 'false';
881
}
882
883
884
sub _tmbPath{
885
my ($self,$path)=@_;
886
my $tmb;
887
if ($self->{CONF}->{'tmbDir'} ne '')
888
 {
889
  $tmb = (_dirname($path) ne $self->{CONF}->{'tmbDir'}) ? $self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR._hash($path).'.png' : $path;
890
 }
891
return $tmb;
892
}
893
894
sub _rmTmb{
895
my ($self,$img)=@_;
896
my $tmb;
897
if ($self->{CONF}->{'tmbDir'} && 'false' ne ($tmb = _tmbPath($self,$img)) && (-r($tmb)==0)) {unlink($tmb);}
898
}
899
900
1;