File indexing completed on 2024-10-13 13:29:13
0001 <?php 0002 0003 /** 0004 * ocs-webserver 0005 * 0006 * Copyright 2016 by pling GmbH. 0007 * 0008 * This file is part of ocs-webserver. 0009 * 0010 * This program is free software: you can redistribute it and/or modify 0011 * it under the terms of the GNU Affero General Public License as 0012 * published by the Free Software Foundation, either version 3 of the 0013 * License, or (at your option) any later version. 0014 * 0015 * This program is distributed in the hope that it will be useful, 0016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0018 * GNU Affero General Public License for more details. 0019 * 0020 * You should have received a copy of the GNU Affero General Public License 0021 * along with this program. If not, see <http://www.gnu.org/licenses/>. 0022 * 0023 * Created: 26.01.2017 0024 */ 0025 class Application_Model_PpLoad 0026 { 0027 /** 0028 * @inheritDoc 0029 */ 0030 public function __construct() 0031 { 0032 } 0033 0034 public static function createDownloadUrl($collection_id, $file_name, array $params) 0035 { 0036 $valid_until = time() + 3600; // one hour valid 0037 $hash = self::createDownloadHash($collection_id, $valid_until); 0038 $url = PPLOAD_API_URI . 'files/download'; 0039 foreach ($params as $key => $param) { 0040 $url .= '/' . $key . '/' . $param; 0041 } 0042 0043 return $url . '/s/' . $hash . '/t/' . $valid_until . '/' . $file_name; 0044 } 0045 0046 /** 0047 * @param int $collection_id 0048 * @param int $valid_until 0049 * @return string 0050 */ 0051 public static function createDownloadHash($collection_id, $valid_until) 0052 { 0053 return hash('sha512', 0054 PPLOAD_DOWNLOAD_SECRET . $collection_id . $valid_until); // order isn't important at all... just do the same when verifying 0055 } 0056 0057 /** 0058 * @param int $collection_id 0059 * @param string $file_name 0060 * @param array $payload 0061 * @return string 0062 * @throws Zend_Exception 0063 */ 0064 public static function createDownloadUrlJwt($collection_id, $file_name, array $payload) 0065 { 0066 $valid_until = time() + 3600; // one hour valid 0067 $hash = self::createDownloadHash($collection_id, $valid_until); 0068 $payload['s'] = $hash; 0069 $payload['t'] = $valid_until; 0070 try { 0071 $payload['stfp'] = null; 0072 $requestIp = Zend_Controller_Front::getInstance()->getRequest()->getClientIp(); 0073 $payload['stip'] = $requestIp; 0074 } catch (Zend_Session_Exception $e) { 0075 Zend_Registry::get('logger')->err(__METHOD__ . ' ' . $e->getMessage()); 0076 // error_log(__METHOD__ . ' ' . $e->getMessage()); 0077 } 0078 $jwt = Application_Model_Jwt::encodeFromArray($payload); 0079 0080 return PPLOAD_API_URI . 'files/download/j/' . $jwt . '/' . $file_name; 0081 } 0082 0083 /** 0084 * @param int $projectId 0085 * @param string $url 0086 * @param string $filename 0087 * @param string $fileDescription 0088 * @return bool|mixed 0089 * @throws Zend_Auth_Storage_Exception 0090 * @throws Zend_Exception 0091 */ 0092 public function uploadEmptyFileWithLink($projectId, $url, $filename, $fileDescription) 0093 { 0094 $projectId = (int)$projectId; 0095 0096 $projectData = $this->getProjectData($projectId); 0097 0098 if (empty($projectData)) { 0099 Zend_Registry::get('logger')->err(__METHOD__ . ' - ppload upload error. no project data found. project_id:' 0100 . $projectId); 0101 0102 return false; 0103 } 0104 0105 $pploadApi = $this->getPpLoadApi(); 0106 0107 // create empty text file 0108 $fileDummy = '../../data/files/empty'; 0109 0110 $fileRequest = array( 0111 // 'file' => $fileDummy, 0112 'local_file_path' => $fileDummy, 0113 'local_file_name' => $filename, 0114 'owner_id' => $projectData->member_id, 0115 'tags' => 'link##' . urlencode($url) 0116 ); 0117 0118 if ($projectData->ppload_collection_id) { 0119 // Append to existing collection 0120 $fileRequest['collection_id'] = $projectData->ppload_collection_id; 0121 } 0122 if (false == empty($fileDescription)) { 0123 $fileRequest['description'] = mb_substr($fileDescription, 0, 140); 0124 } 0125 0126 //upload to ppload 0127 $fileResponse = $pploadApi->postFile($fileRequest); 0128 0129 Zend_Registry::get('logger')->debug(__METHOD__ . ' - fileResponse: ' . print_r($fileResponse, true)); 0130 0131 if (empty($fileResponse) OR empty($fileResponse->file) OR $fileResponse->status <> 'success') { 0132 Zend_Registry::get('logger')->err(__METHOD__ 0133 . ' - ppload upload error. requestData:' 0134 . print_r($fileRequest, true) . "\n" . 'response:' 0135 . print_r($fileResponse, true) 0136 ); 0137 0138 return false; 0139 } 0140 $log = Zend_Registry::get('logger'); 0141 if ($projectData->ppload_collection_id <> $fileResponse->file->collection_id) { 0142 $projectData->ppload_collection_id = $fileResponse->file->collection_id; 0143 if ($this->isAuthmemberProjectCreator($projectData->member_id)) { 0144 $projectData->changed_at = new Zend_Db_Expr('NOW()'); 0145 } else { 0146 $auth = Zend_Auth::getInstance(); 0147 $authMember = $auth->getStorage()->read(); 0148 $log->info('********** ' . __METHOD__ . ' Project ChangedAt is not set: Auth-Member (' . $authMember->member_id . ') != Project-Owner (' . $projectData->member_id . '): **********' . "\n"); 0149 } 0150 $projectData->save(); 0151 } else { 0152 if ($this->isAuthmemberProjectCreator($projectData->member_id)) { 0153 $projectData->changed_at = new Zend_Db_Expr('NOW()'); 0154 $projectData->save(); 0155 } else { 0156 $auth = Zend_Auth::getInstance(); 0157 $authMember = $auth->getStorage()->read(); 0158 $log->info('********** ' . __METHOD__ . ' Project ChangedAt is not set: Auth-Member (' . $authMember->member_id . ') != Project-Owner (' . $projectData->member_id . '): **********' . "\n"); 0159 } 0160 } 0161 0162 return $fileResponse; 0163 } 0164 0165 /** 0166 * @param int $projectId 0167 * 0168 * @return Zend_Db_Table_Row_Abstract 0169 * @throws Zend_Db_Table_Exception 0170 */ 0171 protected function getProjectData($projectId) 0172 { 0173 $projectTable = new Default_Model_DbTable_Project(); 0174 0175 return $projectTable->find($projectId)->current(); 0176 } 0177 0178 /** 0179 * @return Ppload_Api 0180 */ 0181 protected function getPpLoadApi() 0182 { 0183 return new Ppload_Api(array( 0184 'apiUri' => PPLOAD_API_URI, 0185 'clientId' => PPLOAD_CLIENT_ID, 0186 'secret' => PPLOAD_SECRET 0187 )); 0188 } 0189 0190 /** 0191 * @param int $creator_id 0192 * @return bool 0193 * @throws Zend_Auth_Storage_Exception 0194 */ 0195 public function isAuthmemberProjectCreator($creator_id) 0196 { 0197 $auth = Zend_Auth::getInstance(); 0198 $authMember = $auth->getStorage()->read(); 0199 if ($authMember->member_id == $creator_id) { 0200 return true; 0201 } 0202 0203 return false; 0204 } 0205 0206 }