elFinder.pm

Дмитрий Ривлин, 27.05.2010 18:34

Download (23.3 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
Libs::ReadF::WriteFile($self,'>cmd',"$cmd\n") if ($cmd ne '');
194
195
if ($cmd ne '') {
196
 my $func=$self->{CMD}->{$cmd};
197
 $self->$func($self);
198
 } else {
199
$self->_open();
200
 }
201
}
202
203
204
205
206
207
208
209
210
sub _isAllowed{
211
my ($self,$path, $action)=@_;
212
#print "[$path, $action]\n";
213
#return 'true';
214
#print $self->{CONF}->{'defaults'}{$action};
215
#if    ($action eq 'read'){return 'true'}
216
#elsif ($action eq 'write'){return 'true'}
217
#elsif ($action eq 'rm'){return 'true'}
218
#return 'true';
219
#print "$self->{CONF}->{'root'}[$action]\n";
220
#$path = substr($path, length($self->{CONF}{'root'})+1);
221
222
#foreach ($self->{CONF}->{'perms'} as $regex => $rules) { # Äîâåñòè äî óìà
223
#  if (preg_match($regex, $path)) {
224
#      if (isset($rules[$action])) { return $rules[$action];}
225
#  }
226
#}
227
228
229
return (exists $self->{CONF}->{'defaults'}{$action}) ? $self->{CONF}->{'defaults'}{$action} : 'false';
230
}
231
232
233
234
sub _basename{
235
my ($path)=@_;
236
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
237
return substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)
238
}
239
240
sub _dirname{
241
my ($path)=@_;
242
if (rindex($path,$DIRECTORY_SEPARATOR)==-1){return $path}
243
return substr($path,0,rindex($path,$DIRECTORY_SEPARATOR))
244
}
245
246
247
sub _is_dir{
248
my ($path)=@_;
249
if (-d "$path"){return 'true'}
250
return 'false';
251
}
252
253
sub _isAccepted{
254
my ($self,$file)=@_;
255
$file=_basename($file);
256
if ('.' eq $file || '..' eq $file) {return 'false';}
257
if ($self->{CONF}->{'dotFiles'} ne 'true' && '.' eq substr($file, 0, 1)) {return 'false';}
258
return 'true';
259
}
260
261
262
sub _tree{
263
    my ($self,$path) = @_;
264
    my %dir = (
265
              'hash'  => _hash("$path"),
266
              'name'  =>  $path eq $self->{CONF}->{'root'} && $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($path),
267
              'read'  => _isAllowed($self,$path, 'read'),
268
              'write' => _isAllowed($self,$path, 'write'),
269
              'dirs'  => []
270
                 );
271
    if ($dir{'read'} eq 'true'){
272
     opendir(DIR,$path);
273
     my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);  
274
     closedir(DIR);
275
     foreach my $subdir (grep {_is_dir("$path/$_") eq 'true' && _isAccepted($self,"$path/$_") eq 'true'} @content){
276
           my %dirs=_tree($self,"$path/$subdir");
277
           push @{$dir{'dirs'}},{%dirs};
278
     }
279
    }
280
   return %dir;
281
 }
282
283
sub _cwd{
284
my ($self,$path)=@_;
285
my $rel  = $self->{CONF}->{'rootAlias'} ne '' ? $self->{CONF}->{'rootAlias'} : _basename($self->{CONF}->{'root'});
286
my $name;
287
if ($path eq $self->{CONF}->{'root'}) {$name = $rel;}
288
else {
289
      $name = _basename($path);
290
      $rel .= $DIRECTORY_SEPARATOR.substr($path, length($self->{CONF}->{'root'})+1);
291
}
292
%{$self->{RES}->{'cwd'}} = (
293
'hash'       => _hash("$path"),
294
'name'       => $name,
295
'mime'       => 'directory',
296
'rel'        => $rel,
297
'size'       => 0,
298
'date'       => Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',int(-M "$path")),
299
'read'       => 'true',
300
'write'      => _isAllowed($self,$path, 'write'),
301
'rm'         => $path eq $self->{CONF}->{'root'} ? 'false' : _isAllowed($self,$path, 'rm')
302
);
303
}
304
305
306
sub _cdc{
307
my ($self,$path)=@_;
308
opendir(DIR,$path); 
309
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
310
closedir(DIR);
311
foreach my $subdir ( grep {_isAccepted($self,"$path/$_") eq 'true'} sort {-f "$path/$a" cmp -f "$path/$b"} @content)
312
{push @{$self->{RES}->{'cdc'}},{_info($self,"$path/$subdir")};}
313
}
314
315
316
sub _info{
317
my ($self,$path)=@_;
318
my @info=(-l "$path") ? lstat("$path") : stat("$path");
319
my %info= (
320
 'hash'  => _hash("$path"),
321
 'mime'  => (_is_dir("$path") eq 'true') ? 'directory' : $self->_mimetype("$path"),
322
 'name'  => _basename("$path"),
323
 'date'  =>  Libs::Others::LocalDate($self,$self->{CONF}->{'DateTimeFormat'},'',$info[9]),
324
 'size'  => (_is_dir("$path") eq 'true') ?  0 : $info[7],
325
 'read'  => _isAllowed($self,"$path", 'read'),
326
 'write' => _isAllowed($self,"$path", 'write'),
327
 'rm'    => _isAllowed($self,"$path", 'rm'),
328
);
329
if ($info{'mime'} ne 'directory') {
330
 if (lc($self->{CONF}->{'fileURL'}) eq 'true' && $info{'read'} eq 'true') {
331
     $info{'url'} = _path2url($self,$path);
332
 }
333
334
if ($info{'mime'} =~ /image/) {
335
336
  if ('false' ne (my @s = Libs::Image::GetImgInfo($self,$path))) { $info{'dim'} = $s[0].'x'.$s[1];}
337
  if ($info{'read'} eq 'true') {
338
      $info{'resize'} = ( exists $info{'dim'});
339
      my $tmb = _tmbPath($self,$path);
340
      if (-f $tmb) {$info{'tmb'}  = _path2url($self,$tmb);}
341
      elsif ($info{'resize'}) {$self->{RES}->{'tmb'} = 'true'}
342
   }
343
 }
344
}
345
return %info;
346
}
347
348
349
sub _mimetype{
350
my ($self,$path)=@_;
351
if (rindex($path,$DIRECTORY_SEPARATOR)!=-1){$path=substr($path,rindex($path,$DIRECTORY_SEPARATOR)+1)}
352
my ($name,$ext);
353
if (rindex($path,'.')!=-1){
354
 $ext=substr($path,rindex($path,'.')+1);
355
 $name=substr($path,0,rindex($path,'.'))
356
}
357
else {$name=$path}
358
my $mt=$self->{CTYPE}->{lc($ext)};
359
$mt=($mt ne '') ? $mt :'unknown;';
360
return $mt;
361
}
362
363
sub _content{
364
my ($self,$path,$flag)=@_;
365
_cwd($self,$path);
366
_cdc($self,$path);
367
if ($self->{RES}->{'cdc'} eq '') {push @{$self->{RES}->{'cdc'}},;}
368
if (exists $self->{URL}->{tree} || lc($flag) eq 'true') { $self->{RES}->{'tree'} = {_tree($self,$self->{CONF}->{'root'})};}
369
}
370
371
372
373
374
375
sub _open{
376
my ($self)=@_;
377
378
if ($self->{URL}->{'current'} ne '') { # read file
379
380
my $dir=_unhash($self->{URL}->{'current'});
381
my $file=_unhash($self->{URL}->{'target'});
382
383
if (($self->{URL}->{'current'} eq '')
384
|| ($self->{URL}->{'target'} eq '')
385
|| (-r (Libs::Others::SpaceTrim($dir))==0)
386
|| (-r (Libs::Others::SpaceTrim($file))==0)
387
|| (_is_dir($self,$file) eq 'true')
388
)
389
  {
390
   #Libs::ReadF::WriteFile($self,'>header',"ÆÎÏÀ\n"); #Ðàçîáðàòüñÿ ñ ðàñøèðåíèÿìè 	     
391
   print "Status: 404 Not Found\n";
392
   exit(0);
393
   }
394
if (_isAllowed($self,$dir, 'read') eq 'false' || _isAllowed($self,$file, 'read') eq 'false') {
395
   print "Status: 403 Access Denied\n";
396
   exit(0);
397
 }
398
399
400
my $mime  = _mimetype($self,$file);
401
my @parts = split('/', $mime);
402
my $disp  = ($parts[0] eq 'image' || $parts[0] eq 'text') ? 'inline' : 'attachments';
403
404
my $header="Content-Type: $mime\n";
405
  $header.="Content-Disposition: ".$disp."; filename="._basename($file)."\n";
406
#print "Content-Location: ".str_replace($this->_options['root'], '', $file));
407
  $header.='Content-Transfer-Encoding: binary'."\n\n";
408
#print "Content-Length: ".filesize($file));
409
#print "Connection: close\n\n";
410
  $header.=Libs::ReadF::ReadBinFile($self,$file);
411
  print $header;
412
  exit(0);
413
}
414
else {
415
 my $path = $self->{CONF}->{'root'};
416
 if ($self->{URL}->{'target'} ne '' ){
417
 my $p=_unhash($self->{URL}->{'target'});
418
   if (-e ($p)!=1){
419
     if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Invalid parameters open';}
420
   } elsif (_isAllowed($self,$p, 'read') eq 'false') {
421
    if (! exists $self->{URL}->{'init'}) {$self->{RES}->{'error'} .= 'Access denied';}
422
   } else {$path = $p;}
423
 }
424
425
 if (exists $self->{URL}->{current}) {$self->{RES}->{'error'} .= "$self->{URL}->{current}<br>"}
426
 _content($self,$path);
427
 }
428
}
429
430
sub _rm{
431
my ($self)=@_;
432
if (($self->{URL}->{'current'} eq '')
433
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
434
|| ($self->{URL}->{'targets[]'} eq '')) {
435
return $self->{RES}->{'error'}.= 'Invalid parameters '. $self->{URL}->{'targets[]'};
436
}
437
438
foreach my $hash (split(',',$self->{URL}->{'targets[]'})) {
439
 $hash=_unhash($hash);
440
 if (_is_dir("$hash") eq 'true') {$hash=~ s/ /\\ /mg;system("rm -r $hash")}
441
 else {unlink($hash);}
442
 if ($? == -1) { $self->{RES}->{'error'}.= 'Error in rm '.$hash." $!"}
443
}
444
_content($self,_unhash($self->{URL}->{'current'}),'true');
445
}
446
447
sub _rename{
448
my ($self)=@_;
449
if (($self->{URL}->{'current'} eq '')
450
|| ($self->{URL}->{'target'} eq '')
451
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
452
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
453
   {
454
   return $self->{RES}->{'error'}.= 'File not found';
455
   }
456
457
my $dir=_unhash($self->{URL}->{'current'});
458
my $name;
459
my $target=_unhash($self->{URL}->{'target'});
460
461
if (_isAllowed($self,$dir, 'write') eq 'false') {
462
   $self->{RES}->{'error'} = 'Access denied';
463
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
464
   $self->{RES}->{'error'} = 'Invalid name';
465
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
466
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
467
} elsif (! rename($target,$dir.$DIRECTORY_SEPARATOR.$name)) {
468
   $self->{RES}->{'error'} = 'Unable to rename file';
469
} else {
470
  #$this->_rmTmb($target);
471
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
472
  _content($self,$self->{URL}->{'current'},_is_dir($dir.$DIRECTORY_SEPARATOR.$name));
473
}
474
}
475
476
sub _mkdir{
477
my ($self)=@_;
478
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
479
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
480
 }
481
my $dir=_unhash($self->{URL}->{'current'});
482
my $name;
483
if (_isAllowed($self,$dir, 'write') eq 'false') {
484
   $self->{RES}->{'error'} = 'Access denied';
485
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
486
   $self->{RES}->{'error'} = 'Invalid name';
487
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
488
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
489
} elsif (! mkdir($dir.$DIRECTORY_SEPARATOR.$name, $self->{CONF}->{'dirMode'})) {
490
   $self->{RES}->{'error'} = 'Unable to create folder';
491
} else {
492
  $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
493
  _content($self,$self->{URL}->{'current'},'true');
494
}
495
}
496
497
498
sub _mkfile{
499
my ($self)=@_;
500
if (($self->{URL}->{'current'} eq '') || (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)){
501
    return $self->{RES}->{'error'}.= 'Invalid parameters ';
502
 }
503
my $dir=_unhash($self->{URL}->{'current'});
504
my $name;
505
if (_isAllowed($self,$dir, 'write') eq 'false') {
506
   $self->{RES}->{'error'} = 'Access denied';
507
} elsif ('false' eq ($name = _checkName($self,$self->{URL}->{'name'})) ) {
508
   $self->{RES}->{'error'} = 'Invalid name';
509
} elsif (-r ($dir.$DIRECTORY_SEPARATOR.$name)) {
510
   $self->{RES}->{'error'} = 'File or folder with the same name already exists';
511
} else {
512
        $name=$dir.$DIRECTORY_SEPARATOR.$name;
513
        if (! open(FILE,">$name"))
514
         {
515
           $self->{RES}->{'error'} = 'Unable to create file '.$name;
516
         }
517
         else {
518
          close(FILE);
519
          $self->{RES}->{'select'} =[_hash($dir.$DIRECTORY_SEPARATOR.$name)];
520
          _content($self,$self->{URL}->{'current'});
521
         }
522
523
 }
524
}
525
526
sub _duplicate{
527
my ($self)=@_;
528
if (($self->{URL}->{'current'} eq '')
529
|| ($self->{URL}->{'target'} eq '')
530
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
531
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
532
   {
533
   return $self->{RES}->{'error'}.= 'Invalid parameters';
534
   }
535
536
my $dir=_unhash($self->{URL}->{'current'});
537
my $target=_unhash($self->{URL}->{'target'});
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,$self->{URL}->{'current'},_is_dir($target));
556
}
557
558
559
560
561
sub _fread{
562
my ($self)=@_;
563
if (($self->{URL}->{'current'} eq '')
564
|| ($self->{URL}->{'target'} eq '')
565
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
566
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0))
567
   {
568
   return $self->{RES}->{'error'}.= 'Invalid parameters';
569
   }
570
571
my $dir=_unhash($self->{URL}->{'current'});
572
my $target=_unhash($self->{URL}->{'target'});
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
#$self->{RES}->{'content'} = Lib::ReadF::ReadBinFile($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
sub _resize{
641
my ($self)=@_;
642
if (($self->{URL}->{'current'} eq '')
643
|| ($self->{URL}->{'target'} eq '')
644
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'current'})))==0)
645
|| (-r (Libs::Others::SpaceTrim(_unhash($self->{URL}->{'target'})))==0)
646
|| ($self->{URL}->{'width'} eq '')
647
|| ($self->{URL}->{'height'} eq '')
648
)
649
   {
650
   return $self->{RES}->{'error'}.= 'Invalid parameters';
651
   }
652
653
my $dir=_unhash($self->{URL}->{'current'});
654
my $target=_unhash($self->{URL}->{'target'});
655
656
if (_isAllowed($self,$target, 'write') eq 'false') {
657
   return $self->{RES}->{'error'} = 'Access denied';
658
}
659
if (!(_mimetype($self,$target) =~ 'image')) {
660
   return $self->{RES}->{'error'} = 'File is not an image';
661
}
662
663
#$self->{RES}->{'error'} = $target;
664
my $image=Libs::Image::ResizeImageWH($self,$target,$self->{URL}->{'width'},$self->{URL}->{'height'});
665
$image->Write(filename=>$target);
666
667
$self->{RES}->{'select'} =[_hash($target)];
668
_content($self,$self->{URL}->{'current'});
669
670
}
671
672
673
674
675
676
677
678
679
680
681
682
sub _thumbnails{
683
my ($self)=@_;
684
my $current=_unhash($self->{URL}->{'current'});
685
if ($self->{CONF}->{'tmbDir'} ne '' && $current ne '' && (-r (Libs::Others::SpaceTrim($current))!=0)) {
686
$self->{RES}->{'select'} =[_hash($current)];
687
$self->{RES}->{'images'} =[];
688
opendir(DIR,$current);
689
my @content = grep {!/^\.{1,2}$/} sort readdir(DIR);
690
closedir(DIR);
691
my $cnt=0;
692
my $max=($self->{CONF}->{'tmbAtOnce'} > 0) ? $self->{CONF}->{'tmbAtOnce'} : 5;
693
foreach my $item (@content)
694
{
695
 my $path = $current.$DIRECTORY_SEPARATOR.$item;
696
 if (_is_dir($path) eq 'true'){next}
697
 
698
 if (_isAccepted($self,$item) eq 'true') {
699
   if (-e ($path)==1 && 'true' eq _canCreateTmb($self,_mimetype($self,$path))) {
700
    my $tmb = _tmbPath($self,$path);
701
     if (-e ($tmb)!=1) {
702
      if ($cnt>=$max) {
703
       return $self->{RES}->{'tmb'} = 'true';
704
      } elsif (_tmb($self,$path, $tmb) ne 'false') {
705
           push @{$self->{RES}->{'images'}},{_hash($path) => _path2url($self,$tmb)};
706
         $cnt++;
707
      }
708
     }
709
    }
710
   }
711
  }
712
 }
713
}
714
715
sub _tmb{
716
my ($self,$img, $tmb)=@_;
717
718
if ('false' eq (my @s = Libs::Image::GetImgInfo($self,$img))){
719
  return 'false';
720
 }
721
722
my $tmbSize = $self->{CONF}->{'tmbSize'};
723
if ($self->{CONF}->{'imgLib'} eq 'imagick')
724
 {
725
 return Libs::Image::ThumbnailImage($self,$img,$tmbSize,$tmb);
726
 }
727
 return 'false';
728
}
729
730
731
sub _ping{
732
print "Connection: close\n\n";
733
exit(0);
734
}
735
736
737
sub _utime{
738
my ($self)=@_;
739
return time().'0';
740
}
741
742
sub _checkName{
743
my ($self,$n)=@_;
744
if ($self->{CONF}->{'dotFiles'} eq 'false' && '.' eq substr($n, 0, 1)) { return 'false';}
745
return ($n =~ /[>|<|\/|:]+/) ? 'false' : $n;
746
}
747
748
sub _uniqueName{
749
my ($self,$f,$suffix)=@_;
750
$suffix=($suffix eq '') ? 'copy ' : $suffix;
751
752
my $dir  = _dirname($f);
753
my $name = _basename($f);
754
#if (_is_dir($f) eq 'false') {
755
 #if (!( $name =~ /\.(tar\.gz|tar\.bz|tar\.bz2|[a-z0-9]{1,4})$/i)) {
756
 #  $ext = '.'.$1;
757
 #  $name = substr($name, 0, -length($m[0]));
758
 # }
759
  $name=$suffix.$name;
760
# }
761
762
return $dir.$DIRECTORY_SEPARATOR.$name;
763
}
764
765
sub _path2url{
766
my ($self,$path)=@_;
767
my $dir  = substr(_dirname($path), length($self->{CONF}->{'root'})+1);
768
my $file = _basename($path);
769
return $self->{CONF}->{'URL'}.(($dir ne  '') ? '/'.$dir :'' ).'/'.$file;
770
}
771
772
sub _canCreateTmb{
773
my ($self,$mime)=@_;
774
if ($self->{CONF}->{'tmbDir'} ne '' && $self->{CONF}->{'imgLib'} ne '' && index($mime,'image')!=-1)
775
 {
776
  return 'true';
777
 }
778
return 'false';
779
}
780
781
782
sub _tmbPath{
783
my ($self,$path)=@_;
784
my $tmb;
785
if ($self->{CONF}->{'tmbDir'} ne '')
786
 {
787
  $tmb = (_dirname($path) ne $self->{CONF}->{'tmbDir'}) ? $self->{CONF}->{'tmbDir'}.$DIRECTORY_SEPARATOR._hash($path).'.png' : $path;
788
 }
789
return $tmb;
790
}
791
792
1;