elFinder.pm

Дмитрий Ривлин, 31.05.2010 18:37

Download (22.9 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
#if (isset($this->_commands['archive']) || isset($this->_commands['extract'])) {
171
#$this->_checkArchivers();
172
#if (isset($this->_commands['archive'])) {
173
#$this->_result['params']['archives'] = $this->_options['archiveMimes'];
174
#}
175
#if (isset($this->_commands['extract'])) {
176
#$this->_result['params']['extract'] = array_keys($this->_options['archivers']['extract']);
177
#}
178
#}
179
180
## clean thumbnails dir
181
if ($self->{CONF}->{'tmbDir'} ne '') {
182
   srand( time()* 1000000);
183
   if (rand(200) <= $self->{CONF}->{'tmbCleanProb'}) {
184
       my $ts2 = $self->_utime();
185
       opendir(DIR,$self->{CONF}->{'tmbDir'});
186
       my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
187
       closedir(DIR);
188
       foreach my $subdir (@content){unlink($self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR.$subdir)}
189
   }
190
}
191
}
192
193
if ($cmd ne '') {
194
 my $func=$self->{CMD}->{$cmd};
195
 $self->$func($self);
196
 } else {
197
$self->_open();
198
 }
199
}
200
201
202
203
204
205
206
207
208
sub _isAllowed{
209
my ($self,$path, $action)=@_;
210
#print "[$path, $action]\n";
211
#return 'true';
212
#print $self->{CONF}->{'defaults'}{$action};
213
#if    ($action eq 'read'){return 'true'}
214
#elsif ($action eq 'write'){return 'true'}
215
#elsif ($action eq 'rm'){return 'true'}
216
#return 'true';
217
#print "$self->{CONF}->{'root'}[$action]\n";
218
#$path = substr($path, length($self->{CONF}{'root'})+1);
219
220
#foreach ($self->{CONF}->{'perms'} as $regex => $rules) { # Äîâåñòè äî óìà
221
#  if (preg_match($regex, $path)) {
222
#      if (isset($rules[$action])) { return $rules[$action];}
223
#  }
224
#}
225
226
227
return (exists $self->{CONF}->{'defaults'}{$action}) ? $self->{CONF}->{'defaults'}{$action} : 'false';
228
}
229
230
231
232
sub _basename{
233
my ($path)=@_;
234
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
235
return substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)
236
}
237
238
sub _dirname{
239
my ($path)=@_;
240
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
241
return substr($path,0,rindex($path,$DIRECTORY_SEPARATOR))
242
}
243
244
245
sub _is_dir{
246
my ($path)=@_;
247
if (-d "$path"){return 'true'}
248
return 'false';
249
}
250
251
sub _isAccepted{
252
my ($self,$file)=@_;
253
$file=_basename($file);
254
if ('.' eq $file || '..' eq $file) {return 'false';}
255
if ($self->{CONF}->{'dotFiles'} ne 'true' && '.' eq substr($file, 0, 1)) {return 'false';}
256
return 'true';
257
}
258
259
260
sub _tree{
261
    my ($self,$path) = @_;
262
    my %dir = (
263
              'hash'  => _hash("$path"),
264
              'name'  =>  $path eq $self->{CONF}->{'root'} && $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($path),
265
              'read'  => _isAllowed($self,$path, 'read'),
266
              'write' => _isAllowed($self,$path, 'write'),
267
              'dirs'  => []
268
                 );
269
    if ($dir{'read'} eq 'true'){
270
     opendir(DIR,$path);
271
     my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);  
272
     closedir(DIR);
273
     foreach my $subdir (grep {_is_dir("$path/$_") eq 'true' && _isAccepted($self,"$path/$_") eq 'true'} @content){
274
           my %dirs=_tree($self,"$path/$subdir");
275
           push @{$dir{'dirs'}},{%dirs};
276
     }
277
    }
278
   return %dir;
279
 }
280
281
sub _cwd{
282
my ($self,$path)=@_;
283
my $rel  = $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($self->{CONF}->{'root'});
284
my $name;
285
if ($path eq $self->{CONF}->{'root'}) {$name = $rel;}
286
else {
287
      $name = _basename($path);
288
      $rel .= $DIRECTORY_SEPARATOR.substr($path, length($self->{CONF}->{'root'})+1);
289
}
290
%{$self->{RES}->{'cwd'}} = (
291
'hash'       => _hash("$path"),
292
'name'       => $name,
293
'mime'       => 'directory',
294
'rel'        => $rel,
295
'size'       => 0,
296
'date'       => Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',int(-M "$path")),
297
'read'       => 'true',
298
'write'      => _isAllowed($self,$path, 'write'),
299
'rm'         => $path eq $self->{CONF}->{'root'} ? 'false' : _isAllowed($self,$path, 'rm')
300
);
301
}
302
303
304
sub _cdc{
305
my ($self,$path)=@_;
306
opendir(DIR,$path); 
307
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
308
closedir(DIR);
309
foreach my $subdir ( grep {_isAccepted($self,"$path/$_") eq 'true'} sort {-f "$path/$a" cmp -f "$path/$b"} @content)
310
{push @{$self->{RES}->{'cdc'}},{_info($self,"$path/$subdir")};}
311
}
312
313
314
sub _info{
315
my ($self,$path)=@_;
316
my @info=(-l "$path") ? lstat("$path") : stat("$path");
317
my %info= (
318
 'hash'  => _hash("$path"),
319
 'mime'  => (_is_dir("$path") eq 'true') ? 'directory' : $self->_mimetype("$path"),
320
 'name'  => _basename("$path"),
321
 'date'  =>  Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',$info[9]),
322
 'size'  => (_is_dir("$path") eq 'true') ?  0 : $info[7],
323
 'read'  => _isAllowed($self,"$path", 'read'),
324
 'write' => _isAllowed($self,"$path", 'write'),
325
 'rm'    => _isAllowed($self,"$path", 'rm'),
326
);
327
if ($info{'mime'} ne 'directory') {
328
 if (lc($self->{CONF}->{'fileURL'}) eq 'true' && $info{'read'} eq 'true') {
329
     $info{'url'} = _path2url($self,$path);
330
 }
331
332
if ($info{'mime'} =~ /image/) {
333
334
  if ('false' ne (my @s = Libs::Image::GetImgInfo($self,$path))) { $info{'dim'} = $s[0].'x'.$s[1];}
335
  if ($info{'read'} eq 'true') {
336
      $info{'resize'} = ( exists $info{'dim'});
337
      my $tmb = _tmbPath($self,$path);
338
      if (-f $tmb) {$info{'tmb'}  = _path2url($self,$tmb);}
339
      elsif ($info{'resize'}) {$self->{RES}->{'tmb'} = 'true'}
340
   }
341
 }
342
}
343
return %info;
344
}
345
346
347
sub _mimetype{
348
my ($self,$path)=@_;
349
if (rindex($path,$DIRECTORY_SEPARATOR)!=-1){$path=substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)}
350
my ($name,$ext);
351
if (rindex($path,'.')!=-1){
352
 $ext=substr($path,rindex($path,'.')+1);
353
 $name=substr($path,0,rindex($path,'.'))
354
}
355
else {$name=$path}
356
my $mt=$self->{CTYPE}->{lc($ext)};
357
$mt=($mt ne '') ? $mt :'unknown;';
358
return $mt;
359
}
360
361
sub _content{
362
my ($self,$path,$flag)=@_;
363
_cwd($self,$path);
364
_cdc($self,$path);
365
if ($self->{RES}->{'cdc'} eq '') {push @{$self->{RES}->{'cdc'}},;}
366
if (exists $self->{URL}->{tree} || lc($flag) eq 'true') { $self->{RES}->{'tree'} = {_tree($self,$self->{CONF}->{'root'})};}
367
}
368
369
370
371
372
373
sub _open{
374
my ($self)=@_;
375
376
if ($self->{URL}->{'current'} ne '') { # read file
377
378
my $dir=_unhash($self->{URL}->{'current'});
379
my $file=_unhash($self->{URL}->{'target'});
380
381
if (($self->{URL}->{'current'} eq '')
382
|| ($self->{URL}->{'target'} eq '')
383
|| (-r (Libs::Others::SpaceTrim($dir))==0)
384
|| (-r (Libs::Others::SpaceTrim($file))==0)
385
|| (_is_dir($self,$file) eq 'true')
386
)
387
  {
388
   #Libs::ReadF::WriteFile($self,'>header',"ÆÎÏÀ\n"); #Ðàçîáðàòüñÿ ñ ðàñøèðåíèÿìè 	     
389
   print "Status: 404 Not Found\n";
390
   exit(0);
391
   }
392
if (_isAllowed($self,$dir, 'read') eq 'false' || _isAllowed($self,$file, 'read') eq 'false') {
393
   print "Status: 403 Access Denied\n";
394
   exit(0);
395
 }
396
397
398
my $mime  = _mimetype($self,$file);
399
my @parts = split('/', $mime);
400
my $disp  = ($parts[0] eq 'image' || $parts[0] eq 'text') ? 'inline' : 'attachments';
401
402
my $header="Content-Type: $mime\n";
403
  $header.="Content-Disposition: ".$disp."; filename="._basename($file)."\n";
404
#print "Content-Location: ".str_replace($this->_options['root'], '', $file));
405
  $header.='Content-Transfer-Encoding: binary'."\n\n";
406
#print "Content-Length: ".filesize($file));
407
#print "Connection: close\n\n";
408
  $header.=Libs::ReadF::ReadBinFile($self,$file);
409
  print $header;
410
  exit(0);
411
}
412
else {
413
 my $path = $self->{CONF}->{'root'};
414
 if ($self->{URL}->{'target'} ne '' ){
415
 my $p=_unhash($self->{URL}->{'target'});
416
   if (-e ($p)!=1){
417
     if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Invalid parameters open';}
418
   } elsif (_isAllowed($self,$p, 'read') eq 'false') {
419
    if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Access denied';}
420
   } else {$path = $p;}
421
 }
422
423
 if (exists $self->{URL}->{current}) {$self->{RES}->{'error'} .= "$self->{URL}->{current}<br>"}
424
 _content($self,$path);
425
 }
426
}
427
428
sub _rm{
429
my ($self)=@_;
430
my $current=_unhash($self->{URL}->{'current'});
431
if (($self->{URL}->{'current'} eq '')
432
|| (-r (Libs::Others::SpaceTrim($current))==0)
433
|| ($self->{URL}->{'targets[]'} eq '')) {
434
return $self->{RES}->{'error'}.= 'Invalid parameters '. $self->{URL}->{'targets[]'};
435
}
436
437
foreach my $hash (split(',',$self->{URL}->{'targets[]'})) {
438
 $hash=_unhash($hash);
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,$self->{URL}->{'current'},'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
if (($self->{FORM}->{'current'} eq '')
584
|| ($self->{FORM}->{'target'} eq '')
585
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{FORM}->{'current'})))==0)
586
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{FORM}->{'target'})))==0)
587
|| ($self->{FORM}->{'content'} eq '')
588
)
589
   {
590
   return $self->{RES}->{'error'}.= 'Invalid parameters';
591
   }
592
593
my $dir=_unhash($self->{URL}->{'current'});
594
my $target=_unhash($self->{URL}->{'target'});
595
596
if (_isAllowed($self,$target, 'write') eq 'false') {
597
   $self->{RES}->{'error'} = 'Access denied';
598
}
599
600
Libs::ReadF::WriteFile($self,$target,$self->{FORM}->{'content'});
601
$self->{RES}->{'target'} = _info($self,$target);
602
}
603
604
605
sub _upload{
606
my ($self)=@_;
607
my $dir=_unhash($self->{FORM}->{'current'});
608
if (($self->{FORM}->{'current'} eq '')
609
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{FORM}->{'current'})))==0)
610
)
611
   {
612
   return $self->{RES}->{'error'}.= 'Invalid parameters';
613
   }
614
615
if (_isAllowed($self,$dir, 'write') eq 'false') {
616
   $self->{RES}->{'error'} = 'Access denied';
617
}
618
my $total;
619
foreach my $i (keys %{$self->{FORM}->{'_FILES_'}}){
620
 if ($self->{FORM}->{'_FILES_'}{$i} ne '')
621
 {
622
 $total++;
623
 my $name;
624
 if ('false' eq ($name = _checkName($self,$i))) {
625
     #$this->_errorData($_FILES['upload']['name'][$i], 'Invalid name');
626
     $self->{RES}->{'errorData'}={$i=>'Invalid name'};
627
 #} elsif (!$this->_isUploadAllow($_FILES['upload']['name'][$i], $_FILES['upload']['tmp_name'][$i])) {
628
#     $this->_errorData($_FILES['upload']['name'][$i], 'Not allowed file type');
629
 } else {
630
     my $file = $dir.$DIRECTORY_SEPARATOR.$i;
631
     Libs::ReadF::WriteFile($self,$file,$self->{FORM}->{'_FILES_'}{$i});
632
     chmod($file, $self->{CONF}->{'fileMode'});
633
     $self->{RES}->{'select'} = [_hash($file)];
634
    }
635
   }
636
  }
637
_content($self,$dir);  
638
}
639
sub _resize{
640
my ($self)=@_;
641
if (($self->{URL}->{'current'} eq '')
642
|| ($self->{URL}->{'target'} eq '')
643
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
644
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0)
645
|| ($self->{URL}->{'width'} eq '')
646
|| ($self->{URL}->{'height'} eq '')
647
)
648
   {
649
   return $self->{RES}->{'error'}.= 'Invalid parameters';
650
   }
651
652
my $dir=_unhash($self->{URL}->{'current'});
653
my $target=_unhash($self->{URL}->{'target'});
654
655
if (_isAllowed($self,$target, 'write') eq 'false') {
656
   return $self->{RES}->{'error'} = 'Access denied';
657
}
658
if (!(_mimetype($self,$target) =~ 'image')) {
659
   return $self->{RES}->{'error'} = 'File is not an image';
660
}
661
662
#$self->{RES}->{'error'} = $target;
663
my $image=Libs::Image::ResizeImageWH($self,$target,$self->{URL}->{'width'},$self->{URL}->{'height'});
664
$image->Write(filename=>$target);
665
666
$self->{RES}->{'select'} =[_hash($target)];
667
_content($self,$self->{URL}->{'current'});
668
669
}
670
671
672
673
674
675
676
677
678
679
680
681
sub _thumbnails{
682
my ($self)=@_;
683
my $current=_unhash($self->{URL}->{'current'});
684
if ($self->{CONF}->{'tmbDir'} ne '' && $current ne '' && (-r (Libs::Others::SpaceTrim($current))!=0)) {
685
$self->{RES}->{'select'} =[_hash($current)];
686
$self->{RES}->{'images'} =[];
687
opendir(DIR,$current);
688
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
689
closedir(DIR);
690
my $cnt=0;
691
my $max=($self->{CONF}->{'tmbAtOnce'} > 0) ? $self->{CONF}->{'tmbAtOnce'} : 5;
692
foreach my $item (@content)
693
{
694
 my $path = $current.$DIRECTORY_SEPARATOR.$item;
695
 if (_is_dir($path) eq 'true'){next}
696
 
697
 if (_isAccepted($self,$item) eq 'true') {
698
   if (-e ($path)==1 && 'true' eq _canCreateTmb($self,_mimetype($self,$path))) {
699
    my $tmb = _tmbPath($self,$path);
700
     if (-e ($tmb)!=1) {
701
      if ($cnt>=$max) {
702
       return $self->{RES}->{'tmb'} = 'true';
703
      } elsif (_tmb($self,$path, $tmb) ne 'false') {
704
           push @{$self->{RES}->{'images'}},{_hash($path) => _path2url($self,$tmb)};
705
         $cnt++;
706
      }
707
     }
708
    }
709
   }
710
  }
711
 }
712
}
713
714
sub _tmb{
715
my ($self,$img, $tmb)=@_;
716
717
if ('false' eq (my @s = Libs::Image::GetImgInfo($self,$img))){
718
  return 'false';
719
 }
720
721
my $tmbSize = $self->{CONF}->{'tmbSize'};
722
if ($self->{CONF}->{'imgLib'} eq 'imagick')
723
 {
724
 return Libs::Image::ThumbnailImage($self,$img,$tmbSize,$tmb);
725
 }
726
 return 'false';
727
}
728
729
730
sub _ping{
731
print "Connection: close\n\n";
732
exit(0);
733
}
734
735
736
sub _utime{
737
my ($self)=@_;
738
return time().'0';
739
}
740
741
sub _checkName{
742
my ($self,$n)=@_;
743
if ($self->{CONF}->{'dotFiles'} eq 'false' && '.' eq substr($n, 0, 1)) { return 'false';}
744
return ($n =~ /[>|<|\/|:]+/) ? 'false' : $n;
745
}
746
747
sub _uniqueName{
748
my ($self,$f,$suffix)=@_;
749
$suffix=($suffix eq '') ? 'copy ' : $suffix;
750
751
my $dir  = _dirname($f);
752
my $name = _basename($f);
753
#if (_is_dir($f) eq 'false') {
754
 #if (!( $name =~ /\.(tar\.gz|tar\.bz|tar\.bz2|[a-z0-9]{1,4})$/i)) {
755
 #  $ext = '.'.$1;
756
 #  $name = substr($name, 0, -length($m[0]));
757
 # }
758
  $name=$suffix.$name;
759
# }
760
761
return $dir.$DIRECTORY_SEPARATOR.$name;
762
}
763
764
sub _path2url{
765
my ($self,$path)=@_;
766
my $dir  = substr(_dirname($path), length($self->{CONF}->{'root'})+1);
767
my $file = _basename($path);
768
return $self->{CONF}->{'URL'}.(($dir ne  '') ? '/'.$dir :'' ).'/'.$file;
769
}
770
771
sub _canCreateTmb{
772
my ($self,$mime)=@_;
773
if ($self->{CONF}->{'tmbDir'} ne '' && $self->{CONF}->{'imgLib'} ne '' && index($mime,'image')!=-1)
774
 {
775
  return 'true';
776
 }
777
return 'false';
778
}
779
780
781
sub _tmbPath{
782
my ($self,$path)=@_;
783
my $tmb;
784
if ($self->{CONF}->{'tmbDir'} ne '')
785
 {
786
  $tmb = (_dirname($path) ne $self->{CONF}->{'tmbDir'}) ? $self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR._hash($path).'.png' : $path;
787
 }
788
return $tmb;
789
}
790
791
1;