Skip to content

Commit c5a58c0

Browse files
committed
cleanup jk_socketd.ini. fixes #2946
1 parent a5ea9f0 commit c5a58c0

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

server/lib/classes/ini_parser.inc.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,75 @@ function parse_ini_string($ini) {
5252

5353

5454

55+
function parse_ini_file($file) {
56+
if(!is_file($file)) {
57+
return false;
58+
}
59+
return $this->parse_ini_string(file_get_contents($file));
60+
}
61+
62+
63+
64+
function array_to_ini($array,$out="") {
65+
if(!is_array($array)) {
66+
return $array;
67+
}
68+
$t="";
69+
$q=false;
70+
foreach($array as $c=>$d) {
71+
if(is_array($d)) {
72+
$t .= $this->array_to_ini($d,$c);
73+
} else {
74+
if($c===intval($c)) {
75+
if(!empty($out)) {
76+
$t.="\r\n".$out." = \"".$d."\"";
77+
if($q!=2) {
78+
$q=true;
79+
}
80+
} else {
81+
$t.="\r\n".$d;
82+
}
83+
} else {
84+
$t.="\r\n".$c." = \"".$d."\"";
85+
$q=2;
86+
}
87+
}
88+
}
89+
if($q!=true && !empty($out))
90+
return "[".$out."]\r\n".$t;
91+
if(!empty($out))
92+
return $t;
93+
return trim($t);
94+
}
95+
96+
97+
98+
function write_ini_file($array, $file) {
99+
$ret = false;
100+
$ini = $this->array_to_ini($array);
101+
102+
if ($fp = fopen($file, 'w')) {
103+
$startTime = microtime();
104+
do
105+
{
106+
$canWrite = flock($fp, LOCK_EX);
107+
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
108+
if(!$canWrite) usleep(round(rand(0, 100)*1000));
109+
} while ((!$canWrite) and ((microtime()-$startTime) < 1000));
110+
111+
// file was locked so now we can store information
112+
if ($canWrite) {
113+
$ret = fwrite($fp, $ini);
114+
flock($fp, LOCK_UN);
115+
}
116+
fclose($fp);
117+
}
118+
return $ret;
119+
}
120+
121+
122+
123+
// unused function, and misleading arg ($file is unused)
55124
function get_ini_string($file) {
56125
$content = '';
57126
foreach($this->config as $section => $data) {

server/lib/classes/system.inc.php

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,6 +2376,10 @@ public function create_jailkit_programs($home_dir, $programs = array(), $options
23762376
}
23772377

23782378
public function update_jailkit_chroot($home_dir, $sections = array(), $programs = array(), $options = array()) {
2379+
global $app;
2380+
2381+
$app->uses('ini_parser');
2382+
23792383
// Disallow operating on root directory
23802384
if(realpath($home_dir) == '/') {
23812385
$app->log("update_jailkit_chroot: invalid home_dir: $home_dir", LOGLEVEL_WARN);
@@ -2434,9 +2438,6 @@ public function update_jailkit_chroot($home_dir, $sections = array(), $programs
24342438
continue;
24352439
}
24362440

2437-
// remove dangling symlinks
2438-
$app->log("TODO: search for and remove dangling symlinks", LOGLEVEL_DEBUG);
2439-
24402441
// save list of hardlinked files
24412442
if (!in_array($opts, 'hardlink') && !in_array($options, 'allow_hardlink')) {
24422443
$find_multiple_links = function ( $path ) use ( &$find_multiple_links ) {
@@ -2463,13 +2464,16 @@ public function update_jailkit_chroot($home_dir, $sections = array(), $programs
24632464
$multiple_links = array_merge($multiple_links, $ret);
24642465
}
24652466
}
2467+
2468+
// remove dangling symlinks
2469+
$app->log("TODO: search for and remove dangling symlinks", LOGLEVEL_DEBUG);
24662470
}
24672471

24682472

24692473
$cmd = 'jk_update --jail='.escapeshellarg($home_dir) . $skips;
24702474
exec($cmd, $out, $ret);
24712475
foreach ($out as $line) {
2472-
if (substr( $line, 0, 4 ) === "skip")) {
2476+
if (substr( $line, 0, 4 ) === "skip") {
24732477
continue;
24742478
}
24752479
if (preg_match('|^(? [^ ]+){6}(.+)$'.preg_quote($home_dir, '|').'|', $line, $matches)) {
@@ -2522,10 +2526,31 @@ public function update_jailkit_chroot($home_dir, $sections = array(), $programs
25222526
// Fix permissions of the root firectory
25232527
$this->chmod($home_dir . '/bin', 0755, true); // was chmod g-w $CHROOT_HOMEDIR/bin
25242528

2529+
// remove non-existent jails from /etc/jailkit/jk_socketd.ini
2530+
if (is_file('/etc/jailkit/jk_socketd.ini')) {
2531+
$rewrite = false;
2532+
$jk_socketd_ini = $app->ini_parser->parse_ini_file('/etc/jailkit/jk_socketd.ini');
2533+
foreach ($jk_socketd_ini as $log => $settings) {
2534+
$jail = preg_replace('|/dev/log$|', '', $log);
2535+
if ($jail != $log && !is_dir($jail)) {
2536+
unset($jk_socketd_ini[$log]);
2537+
$rewrite=true;
2538+
}
2539+
}
2540+
if ($rewrite) {
2541+
$app->log('update_jailkit_chroot: writing /etc/jailkit/jk_socketd.ini', LOGLEVEL_DEBUG);
2542+
$app->ini_parse->write_ini_file($jk_socketd_ini, '/etc/jailkit/jk_socketd.ini');
2543+
}
2544+
}
2545+
25252546
return true;
25262547
}
25272548

25282549
public function delete_jailkit_chroot($home_dir) {
2550+
global $app;
2551+
2552+
$app->uses('ini_parser');
2553+
25292554
// Disallow operating on root directory
25302555
if(realpath($home_dir) == '/') {
25312556
$app->log("delete_jailkit_chroot: invalid home_dir: $home_dir", LOGLEVEL_WARN);
@@ -2573,6 +2598,17 @@ public function delete_jailkit_chroot($home_dir) {
25732598
rename($home, $archive);
25742599
}
25752600

2601+
// remove $home_dir from /etc/jailkit/jk_socketd.ini
2602+
if (is_file('/etc/jailkit/jk_socketd.ini')) {
2603+
$jk_socketd_ini = $app->ini_parser->parse_ini_file('/etc/jailkit/jk_socketd.ini');
2604+
$log = $home . '/dev/log';
2605+
if (isset($jk_socketd_ini[$log]) {
2606+
unset($jk_socketd_ini[$log]);
2607+
$app->log('delete_jailkit_chroot: writing /etc/jailkit/jk_socketd.ini', LOGLEVEL_DEBUG);
2608+
$app->ini_parse->write_ini_file($jk_socketd_ini, '/etc/jailkit/jk_socketd.ini');
2609+
}
2610+
}
2611+
25762612
return true;
25772613
}
25782614

0 commit comments

Comments
 (0)