| | |
| | | * Edit the owner of a file |
| | | * |
| | | */ |
| | | function chown($file, $owner, $group = ''){ |
| | | $owner_change = @chown($file, $owner); |
| | | if($group != ''){ |
| | | $group_change = @chgrp($file, $group); |
| | | } else { |
| | | $group_change = 1; |
| | | function chown($file, $owner, $allow_symlink = false){ |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if($owner_change && $group_change){ |
| | | return true; |
| | | } else { |
| | | return false; |
| | | return chown($file, $owner); |
| | | } |
| | | |
| | | function chgrp($file, $group = '', $allow_symlink = false){ |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return chgrp($file, $group); |
| | | } |
| | | |
| | | //* Change the mode of a file |
| | | function chmod($file, $mode, $allow_symlink = false) { |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return chmod($file, $mode); |
| | | } |
| | | |
| | | function file_put_contents($filename, $data, $allow_symlink = false) { |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | unlink($filename); |
| | | return file_put_contents($filename, $data); |
| | | } |
| | | |
| | | function file_get_contents($filename, $allow_symlink = false) { |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return file_put_contents($filename, $data); |
| | | } |
| | | |
| | | function rename($filename, $new_filename, $allow_symlink = false) { |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return rename($filename, $new_filename); |
| | | } |
| | | |
| | | function mkdir($dirname, $allow_symlink = false) { |
| | | if($allow_symlink == false && $this->checkpath($dirname) == false) { |
| | | $app->log("Action aborted, file is a symlink: $dirname",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return mkdir($dirname); |
| | | } |
| | | |
| | | function unlink($file) { |
| | | return unlink($file); |
| | | } |
| | | |
| | | function copy($file1,$file2) { |
| | | return copy($file1,$file2); |
| | | } |
| | | |
| | | function checkpath($path) { |
| | | $path = trim($path); |
| | | //* We allow only absolute paths |
| | | if(substr($path,0,1) != '/') return false; |
| | | |
| | | //* We allow only some characters in the path |
| | | if(!preg_match('/[a-zA-Z0-9_\.\-]{1,}/',$path)) return false; |
| | | |
| | | //* Check path for symlinks |
| | | $path_parts = explode($path); |
| | | $testpath = ''; |
| | | foreach($path_parts as $p) { |
| | | $testpath .= '/'.$p; |
| | | if(is_link($testpath)) return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | function replaceLine($filename,$search_pattern,$new_line,$strict = 0,$append = 1) { |
| | | if($this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | $lines = @file($filename); |
| | | $out = ''; |
| | | $found = 0; |
| | |
| | | } |
| | | |
| | | function removeLine($filename,$search_pattern,$strict = 0) { |
| | | if($this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if($lines = @file($filename)) { |
| | | $out = ''; |
| | | foreach($lines as $line) { |
| | |
| | | $user = escapeshellcmd($user); |
| | | // I assume that the name of the (vmail group) is the same as the name of the mail user in ISPConfig 3 |
| | | $group = $user; |
| | | if(is_dir($dir)) chown($dir,$user); |
| | | if(is_dir($dir)) chgrp($dir,$group); |
| | | if(is_dir($dir)) $this->chown($dir,$user); |
| | | if(is_dir($dir)) $this->chgrp($dir,$group); |
| | | |
| | | $chown_mdsub = true; |
| | | } |
| | |
| | | foreach($path_parts as $part) { |
| | | $new_path .= '/'.$part; |
| | | if(!@is_dir($new_path)) { |
| | | mkdir($new_path); |
| | | chmod($new_path,$mode); |
| | | if($user != '') chown($new_path,$user); |
| | | if($group != '') chgrp($new_path,$group); |
| | | $this->mkdir($new_path); |
| | | $this->chmod($new_path,$mode); |
| | | if($user != '') $this->chown($new_path,$user); |
| | | if($group != '') $this->chgrp($new_path,$group); |
| | | } |
| | | } |
| | | } |
| | |
| | | function web_folder_protection($document_root,$protect) { |
| | | global $app,$conf; |
| | | |
| | | if($this->checkpath($document_root) == false) { |
| | | $app->log("Action aborted, target is a symlink: $document_root",LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | |
| | | //* load the server configuration options |
| | | $app->uses('getconf'); |
| | | $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); |