source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/out/webdav/lib/Sabre/DAV/Locks/Backend/File.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 4.2 KB
Line 
1<?php
2
3namespace Sabre\DAV\Locks\Backend;
4
5use Sabre\DAV\Locks\LockInfo;
6
7/**
8 * The Lock manager allows you to handle all file-locks centrally.
9 *
10 * This Lock Manager stores all its data in a single file.
11 *
12 * Note that this is not nearly as robust as a database, you are encouraged
13 * to use the PDO backend instead.
14 *
15 * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
16 * @author Evert Pot (http://www.rooftopsolutions.nl/)
17 * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
18 */
19class File extends AbstractBackend {
20
21    /**
22     * The storage file
23     *
24     * @var string
25     */
26    private $locksFile;
27
28    /**
29     * Constructor
30     *
31     * @param string $locksFile path to file
32     */
33    public function __construct($locksFile) {
34
35        $this->locksFile = $locksFile;
36
37    }
38
39    /**
40     * Returns a list of Sabre\DAV\Locks\LockInfo objects
41     *
42     * This method should return all the locks for a particular uri, including
43     * locks that might be set on a parent uri.
44     *
45     * If returnChildLocks is set to true, this method should also look for
46     * any locks in the subtree of the uri for locks.
47     *
48     * @param string $uri
49     * @param bool $returnChildLocks
50     * @return array
51     */
52    public function getLocks($uri, $returnChildLocks) {
53
54        $newLocks = array();
55
56        $locks = $this->getData();
57
58        foreach($locks as $lock) {
59
60            if ($lock->uri === $uri ||
61                //deep locks on parents
62                ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) ||
63
64                // locks on children
65                ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) {
66
67                $newLocks[] = $lock;
68
69            }
70
71        }
72
73        // Checking if we can remove any of these locks
74        foreach($newLocks as $k=>$lock) {
75            if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]);
76        }
77        return $newLocks;
78
79    }
80
81    /**
82     * Locks a uri
83     *
84     * @param string $uri
85     * @param LockInfo $lockInfo
86     * @return bool
87     */
88    public function lock($uri, LockInfo $lockInfo) {
89
90        // We're making the lock timeout 30 minutes
91        $lockInfo->timeout = 1800;
92        $lockInfo->created = time();
93        $lockInfo->uri = $uri;
94
95        $locks = $this->getData();
96
97        foreach($locks as $k=>$lock) {
98            if (
99                ($lock->token == $lockInfo->token) ||
100                (time() > $lock->timeout + $lock->created)
101            ) {
102                unset($locks[$k]);
103            }
104        }
105        $locks[] = $lockInfo;
106        $this->putData($locks);
107        return true;
108
109    }
110
111    /**
112     * Removes a lock from a uri
113     *
114     * @param string $uri
115     * @param LockInfo $lockInfo
116     * @return bool
117     */
118    public function unlock($uri, LockInfo $lockInfo) {
119
120        $locks = $this->getData();
121        foreach($locks as $k=>$lock) {
122
123            if ($lock->token == $lockInfo->token) {
124
125                unset($locks[$k]);
126                $this->putData($locks);
127                return true;
128
129            }
130        }
131        return false;
132
133    }
134
135    /**
136     * Loads the lockdata from the filesystem.
137     *
138     * @return array
139     */
140    protected function getData() {
141
142        if (!file_exists($this->locksFile)) return array();
143
144        // opening up the file, and creating a shared lock
145        $handle = fopen($this->locksFile,'r');
146        flock($handle,LOCK_SH);
147
148        // Reading data until the eof
149        $data = stream_get_contents($handle);
150
151        // We're all good
152        fclose($handle);
153
154        // Unserializing and checking if the resource file contains data for this file
155        $data = unserialize($data);
156        if (!$data) return array();
157        return $data;
158
159    }
160
161    /**
162     * Saves the lockdata
163     *
164     * @param array $newData
165     * @return void
166     */
167    protected function putData(array $newData) {
168
169        // opening up the file, and creating an exclusive lock
170        $handle = fopen($this->locksFile,'a+');
171        flock($handle,LOCK_EX);
172
173        // We can only truncate and rewind once the lock is acquired.
174        ftruncate($handle,0);
175        rewind($handle);
176
177        fwrite($handle,serialize($newData));
178        fclose($handle);
179
180    }
181
182}
183
Note: See TracBrowser for help on using the repository browser.