1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
<?php /** * Abstraction of PHP "posix" extension. * Basic functionality substitution, but cannot get user/group names so falls back to numeric */ abstract class Loco_compat_PosixExtension {
/** * @var int|null */ private static $uid = null;
/** * @var int|null */ private static $gid = null; /** * @return int */ public static function getuid(){ if( is_null(self::$uid) ){ // use posix function if extension available if( function_exists('posix_geteuid') ){ self::$uid = posix_geteuid(); } // else use temp file system to establish owner else { self::$uid = self::getuidViaTempDir(); // @codeCoverageIgnore } } return self::$uid; }
/** * @return int */ public static function getgid(){ if( is_null(self::$gid) ){ // use posix function if extension available if( function_exists('posix_getegid') ){ self::$gid = posix_getegid(); } // else use temp file system to establish group owner else { self::$gid = self::getgidViaTempDir(); // @codeCoverageIgnore } } return self::$gid; }
/** * Attempt to get effective user ID by reading a temporary file * @return int */ public static function getuidViaTempDir( $dir = '' ){ if( ! $dir ) { $dir = get_temp_dir(); } if( 04000 & fileperms($dir) ){ trigger_error( sprintf('%s directory has setuid bit, getuid may not be accurate',basename($dir) ) ); } $path = wp_tempnam( 'loco-sniff-'.time(), $dir ); $uid = fileowner($path); unlink( $path );
return $uid; }
/** * Attempt to get effective group ID by reading a temporary file * @return int */ public static function getgidViaTempDir( $dir = '' ){ if( ! $dir ) { $dir = get_temp_dir(); } if( 02000 & fileperms($dir) ){ trigger_error( sprintf('%s directory has setgid bit, getgid may not be accurate',basename($dir) ) ); } $path = wp_tempnam( 'loco-sniff-'.time(), $dir ); $gid = filegroup($path); unlink( $path );
return $gid; }
/** * Get the name of the user that the web server runs under * This is only for visual/info purposes. * @return string */ public static function getHttpdUser(){ if( function_exists('posix_getpwuid') ){ $info = posix_getpwuid( self::getuid() ); if( isset($info['name']) ){ return $info['name']; } } // @codeCoverageIgnoreStart foreach( ['apache','nginx'] as $name ){ if( false !== stripos(PHP_SAPI,$name) ){ return $name; } if( isset($_SERVER['SERVER_SOFTWARE']) && false !== stripos($_SERVER['SERVER_SOFTWARE'],$name) ){ return $name; } } // translators: used when username of web server process is unknown return __('the web server','loco-translate'); // @codeCoverageIgnoreEnd }
}
|