diff options
Diffstat (limited to 'inc/subscription.php')
-rw-r--r-- | inc/subscription.php | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/inc/subscription.php b/inc/subscription.php index 52091bafe..08d4cb241 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -44,9 +44,26 @@ function subscription_filename($id) { * * @author Adrian Lang <lang@cosmocode.de> */ +function subscription_lock_filename ($id){ + global $conf; + return $conf['lockdir'].'/_subscr_' . $id . '.lock'; +} + function subscription_lock($id) { - $lockf = subscription_filename($id) . '.lock'; - return !file_exists($lockf) && touch($lockf); + // FIXME merge this with the indexer lock generation, abstract out + global $conf; + $lock = subscription_lock_filename($id); + while(!@mkdir($lock,$conf['dmode'])){ + usleep(50); + if(time()-@filemtime($lock) > 60*5){ + // looks like a stale lock - remove it + @rmdir($lock); + }else{ + return false; + } + } + if($conf['dperm']) chmod($lock, $conf['dperm']); + return true; } /** @@ -58,8 +75,8 @@ function subscription_lock($id) { * @author Adrian Lang <lang@cosmocode.de> */ function subscription_unlock($id) { - $lockf = subscription_filename($id) . '.lock'; - return file_exists($lockf) && unlink($lockf); + $lockf = subscription_lock_filename($id); + return @rmdir($lockf); } /** @@ -98,7 +115,7 @@ function subscription_set($user, $page, $style, $data = null, // io_deleteFromFile does not return false if no line matched. return io_deleteFromFile($file, - subscription_regex(array('user' => $user)), + subscription_regex(array('user' => auth_nameencode($user))), true); } @@ -158,6 +175,10 @@ function subscription_find($page, $pre) { // This is an old subscription file. $subscription = trim($subscription) . " every\n"; } + + list($user, $rest) = explode(' ', $subscription, 2); + $subscription = rawurldecode($user) . " " . $rest; + if (preg_match(subscription_regex($pre), $subscription, $line_matches) === 0) { continue; @@ -251,7 +272,7 @@ function subscription_addresslist(&$data){ $self = $data['self']; $addresslist = $data['addresslist']; - if (!$conf['subscribers']) { + if (!$conf['subscribers'] || $auth === null) { return ''; } $pres = array('style' => 'every', 'escaped' => true); |