Blame view

sources/apps/documents/lib/genesis.php 2.92 KB
d1bafeea1   Kload   [fix] Upgrade to ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  <?php
  /**
   * ownCloud - Documents App
   *
   * @author Victor Dubiniuk
   * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
   * License as published by the Free Software Foundation; either 
   * version 3 of the License, or any later version.
   * 
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
   *  
6d9380f96   Cédric Dupont   Update sources OC...
18
   * You should have received a copy of the GNU Affero General Public
d1bafeea1   Kload   [fix] Upgrade to ...
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
   * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
   * 
   */
  
  namespace OCA\Documents;
  
  class Genesis {
  	
  	const DOCUMENTS_DIRNAME='/documents';
  	
  	protected $view;
  	
  	protected $path;
  	
  	protected $hash;
  	
  	
  	/**
  	 * Create new genesis document
  	 * @param OCA\Documents\File $file 
  	 * */	
  	public function __construct(\OCA\Documents\File $file){
  		list($view, $path) = $file->getOwnerViewAndPath();
  		$owner = $file->getOwner();
  		
  		$this->view = new View('/' . $owner);
  		
  		if (!$this->view->file_exists(self::DOCUMENTS_DIRNAME)){
  			$this->view->mkdir(self::DOCUMENTS_DIRNAME );
  		}
  		
  		$this->hash = $this->getDocumentHash($view, $path);
  		$this->path = self::DOCUMENTS_DIRNAME . '/' . $this->hash . '.odt';
  		if (!$this->view->file_exists($this->path)){
  			//copy new genesis to /user/documents/{hash}.odt
  			// get decrypted content
  			$content = $view->file_get_contents($path);
  			$mimetype = $view->getMimeType($path);
  			
  			$data = Filter::read($content, $mimetype);
  			
  			$proxyStatus = \OC_FileProxy::$enabled;
  			\OC_FileProxy::$enabled = false;	
  			
  			$this->view->file_put_contents($this->path, $data['content']);
  			\OC_FileProxy::$enabled = $proxyStatus;
  		}
  		
  		try {
  			$this->validate($this->view, $this->path);
  		} catch (\Exception $e){
  			throw new \Exception('Failed to copy genesis');
  		}
  	}
  	
  	public function getPath(){
  		return $this->path;
  	}
  	
  	public function getHash(){
  		return $this->hash;
  	}
  	
  	public static function getHashByPath($path){
  		return preg_replace('|([a-zA-Z0-9])*\..*$|', '\1', $path);
  	}
  	
  	protected function getDocumentHash($view, $path){
  		$this->validate($view, $path);
  		$proxyStatus = \OC_FileProxy::$enabled;
  		\OC_FileProxy::$enabled = false;
  		
  		$hash = sha1($view->file_get_contents($path));
  		
  		\OC_FileProxy::$enabled = $proxyStatus;
  		return $hash;
  	}
  	
  	/**
  	 * Check if genesis is valid
  	 * @param OCA\Documents\View $view 
  	 * @param string $path relative to the view
  	 * @throws \Exception
  	 */
  	protected function validate($view, $path){
  		if (!$view->file_exists($path)){
  			throw new \Exception('Document not found ' . $path);
  		}
  		if (!$view->is_file($path)){
  			throw new \Exception('Object ' . $path . ' is not a file.');
  		}
  		//TODO check if it is a valid odt
  	}
  
  }