2012-01-20 18:10:48 +01:00
< ? php
2015-09-10 23:13:48 +02:00
2012-01-20 18:10:48 +01:00
/**
2015-09-10 23:13:48 +02:00
* Check that the given file is writable .
2012-01-20 18:10:48 +01:00
*/
2015-11-21 07:18:35 +01:00
class FileWriteableCheck implements EnvironmentCheck
{
/**
* @ var string
*/
protected $path ;
2015-09-10 23:13:48 +02:00
2015-11-21 07:18:35 +01:00
/**
* @ param string $path The full path . If a relative path , it will relative to the BASE_PATH .
*/
public function __construct ( $path )
{
$this -> path = $path ;
}
2015-09-10 23:13:48 +02:00
2015-11-21 07:18:35 +01:00
/**
* @ inheritdoc
*
* @ return array
*/
public function check ()
{
if ( $this -> path [ 0 ] == '/' ) {
$filename = $this -> path ;
} else {
$filename = BASE_PATH . DIRECTORY_SEPARATOR . str_replace ( '/' , DIRECTORY_SEPARATOR , $this -> path );
}
if ( file_exists ( $filename )) {
$isWriteable = is_writeable ( $filename );
} else {
$isWriteable = is_writeable ( dirname ( $filename ));
}
if ( ! $isWriteable ) {
if ( function_exists ( 'posix_getgroups' )) {
$userID = posix_geteuid ();
$user = posix_getpwuid ( $userID );
2012-01-20 18:10:48 +01:00
2015-11-21 07:18:35 +01:00
$currentOwnerID = fileowner ( file_exists ( $filename ) ? $filename : dirname ( $filename ));
$currentOwner = posix_getpwuid ( $currentOwnerID );
2012-01-20 18:10:48 +01:00
2015-11-21 07:18:35 +01:00
$message = " User ' $user[name] ' needs to be able to write to this file: \n $filename\n\nThe file is currently owned by ' $currentOwner[name] '. " ;
2012-01-20 18:10:48 +01:00
2015-11-21 07:18:35 +01:00
if ( $user [ 'name' ] == $currentOwner [ 'name' ]) {
$message .= " We recommend that you make the file writeable. " ;
} else {
$groups = posix_getgroups ();
$groupList = array ();
foreach ( $groups as $group ) {
$groupInfo = posix_getgrgid ( $group );
if ( in_array ( $currentOwner [ 'name' ], $groupInfo [ 'members' ])) {
$groupList [] = $groupInfo [ 'name' ];
}
}
if ( $groupList ) {
$message .= " We recommend that you make the file group-writeable and change the group to one of these groups: \n - " . implode ( " \n - " , $groupList )
. " \n \n For example: \n chmod g+w $filename\nchgrp " . $groupList [ 0 ] . " $filename " ;
} else {
$message .= " There is no user-group that contains both the web-server user and the owner of this file. Change the ownership of the file, create a new group, or temporarily make the file writeable by everyone during the install process. " ;
}
}
} else {
$message = " The webserver user needs to be able to write to this file: \n $filename " ;
}
return array ( EnvironmentCheck :: ERROR , $message );
}
2012-01-20 18:10:48 +01:00
2015-11-21 07:18:35 +01:00
return array ( EnvironmentCheck :: OK , '' );
}
2015-09-10 23:13:48 +02:00
}