elFinder.pm

Дмитрий Ривлин, 02.06.2010 17:41

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