Beispiel #1
0
 /**
  * @param string $path
  * @param int $size
  * @return int|bool
  */
 public function postFileSize($path, $size, $fileInfo = null)
 {
     $view = new \OC\Files\View('/');
     $userId = Helper::getUser($path);
     $util = new Util($view, $userId);
     // if encryption is no longer enabled or if the files aren't migrated yet
     // we return the default file size
     if (!\OCP\App::isEnabled('files_encryption') || $util->getMigrationStatus() !== Util::MIGRATION_COMPLETED) {
         return $size;
     }
     // if path is a folder do nothing
     if ($view->is_dir($path)) {
         $proxyState = \OC_FileProxy::$enabled;
         \OC_FileProxy::$enabled = false;
         $fileInfo = $view->getFileInfo($path);
         \OC_FileProxy::$enabled = $proxyState;
         if (isset($fileInfo['unencrypted_size']) && $fileInfo['unencrypted_size'] > 0) {
             return $fileInfo['unencrypted_size'];
         }
         return $size;
     }
     // get relative path
     $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path);
     // if path is empty we cannot resolve anything
     if (empty($relativePath)) {
         return $size;
     }
     // get file info from database/cache if not .part file
     if (empty($fileInfo) && !Helper::isPartialFilePath($path)) {
         $proxyState = \OC_FileProxy::$enabled;
         \OC_FileProxy::$enabled = false;
         $fileInfo = $view->getFileInfo($path);
         \OC_FileProxy::$enabled = $proxyState;
     }
     // if file is encrypted return real file size
     if (isset($fileInfo['encrypted']) && $fileInfo['encrypted'] === true) {
         // try to fix unencrypted file size if it doesn't look plausible
         if ((int) $fileInfo['size'] > 0 && (int) $fileInfo['unencrypted_size'] === 0) {
             $fixSize = $util->getFileSize($path);
             $fileInfo['unencrypted_size'] = $fixSize;
             // put file info if not .part file
             if (!Helper::isPartialFilePath($relativePath)) {
                 $view->putFileInfo($path, array('unencrypted_size' => $fixSize));
             }
         }
         $size = $fileInfo['unencrypted_size'];
     } else {
         $fileInfoUpdates = array();
         $fixSize = $util->getFileSize($path);
         if ($fixSize > 0) {
             $size = $fixSize;
             $fileInfoUpdates['encrypted'] = true;
             $fileInfoUpdates['unencrypted_size'] = $size;
             // put file info if not .part file
             if (!Helper::isPartialFilePath($relativePath)) {
                 $view->putFileInfo($path, $fileInfoUpdates);
             }
         }
     }
     return $size;
 }
Beispiel #2
0
 /**
  * @param $path
  */
 public function handleFile($path)
 {
     // Disable encryption proxy to prevent recursive calls
     $proxyStatus = \OC_FileProxy::$enabled;
     \OC_FileProxy::$enabled = false;
     $view = new \OC_FilesystemView('/');
     $session = new \OCA\Encryption\Session($view);
     $userId = Helper::getUser($path);
     $util = new Util($view, $userId);
     // split the path parts
     $pathParts = explode('/', $path);
     // get relative path
     $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path);
     // only if file is on 'files' folder fix file size and sharing
     if (isset($pathParts[2]) && $pathParts[2] === 'files' && $util->fixFileSize($path)) {
         // get sharing app state
         $sharingEnabled = \OCP\Share::isEnabled();
         // get users
         $usersSharing = $util->getSharingUsersArray($sharingEnabled, $relativePath);
         // update sharing-keys
         $util->setSharedFileKeyfiles($session, $usersSharing, $relativePath);
     }
     \OC_FileProxy::$enabled = $proxyStatus;
 }
 public function actionIndex()
 {
     $user = Helper::getUser();
     Helper::renderJSON(["id" => $user->id, "username" => $user->username]);
 }
Beispiel #4
0
 /**
  * Delete a keyfile
  *
  * @param \OC\Files\View $view
  * @param string $path path of the file the key belongs to
  * @param string $userId the user to whom the file belongs
  * @return bool Outcome of unlink operation
  * @note $path must be relative to data/user/files. e.g. mydoc.txt NOT
  *       /data/admin/files/mydoc.txt
  */
 public static function deleteFileKey($view, $path, $userId = null)
 {
     $trimmed = ltrim($path, '/');
     if ($trimmed === '') {
         \OCP\Util::writeLog('Encryption library', 'Can\'t delete file-key empty path given!', \OCP\Util::ERROR);
         return false;
     }
     if ($userId === null) {
         $userId = Helper::getUser($path);
     }
     $util = new Util($view, $userId);
     if ($util->isSystemWideMountPoint($path)) {
         $keyPath = '/files_encryption/keyfiles/' . $trimmed;
     } else {
         $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed;
     }
     $result = false;
     $fileExists = $view->file_exists('/' . $userId . '/files/' . $trimmed);
     if ($view->is_dir($keyPath) && !$fileExists) {
         \OCP\Util::writeLog('files_encryption', 'deleteFileKey: delete file key: ' . $keyPath, \OCP\Util::DEBUG);
         $result = $view->unlink($keyPath);
     } elseif ($view->file_exists($keyPath . '.key') && !$fileExists) {
         \OCP\Util::writeLog('files_encryption', 'deleteFileKey: delete file key: ' . $keyPath, \OCP\Util::DEBUG);
         $result = $view->unlink($keyPath . '.key');
     }
     if ($fileExists) {
         \OCP\Util::writeLog('Encryption library', 'Did not delete the file key, file still exists: ' . '/' . $userId . '/files/' . $trimmed, \OCP\Util::ERROR);
     } elseif (!$result) {
         \OCP\Util::writeLog('Encryption library', 'Could not delete keyfile; does not exist: "' . $keyPath, \OCP\Util::ERROR);
     }
     return $result;
 }
Beispiel #5
0
 /**
  * @param string $path raw path relative to data/
  * @param string $mode
  * @param int $options
  * @param string $opened_path
  * @return bool
  */
 public function stream_open($path, $mode, $options, &$opened_path)
 {
     // assume that the file already exist before we decide it finally in getKey()
     $this->newFile = false;
     if (!isset($this->rootView)) {
         $this->rootView = new \OC\Files\View('/');
     }
     $this->session = new \OCA\Encryption\Session($this->rootView);
     $this->privateKey = $this->session->getPrivateKey();
     $normalizedPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path));
     if ($originalFile = Helper::getPathFromTmpFile($normalizedPath)) {
         $this->rawPath = $originalFile;
         $this->isLocalTmpFile = true;
         $this->localTmpFile = $normalizedPath;
     } else {
         $this->rawPath = $normalizedPath;
     }
     $this->userId = Helper::getUser($this->rawPath);
     $util = new Util($this->rootView, $this->userId);
     // get the key ID which we want to use, can be the users key or the
     // public share key
     $this->keyId = $util->getKeyId();
     // Strip identifier text from path, this gives us the path relative to data/<user>/files
     $this->relPath = Helper::stripUserFilesPath($this->rawPath);
     // if raw path doesn't point to a real file, check if it is a version or a file in the trash bin
     if ($this->relPath === false) {
         $this->relPath = Helper::getPathToRealFile($this->rawPath);
     }
     if ($this->relPath === false) {
         \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR);
         return false;
     }
     // Disable fileproxies so we can get the file size and open the source file without recursive encryption
     $proxyStatus = \OC_FileProxy::$enabled;
     \OC_FileProxy::$enabled = false;
     if ($mode === 'w' or $mode === 'w+' or $mode === 'wb' or $mode === 'wb+') {
         // We're writing a new file so start write counter with 0 bytes
         $this->size = 0;
         $this->unencryptedSize = 0;
     } else {
         if ($this->privateKey === false) {
             // if private key is not valid redirect user to a error page
             \OCA\Encryption\Helper::redirectToErrorPage($this->session);
         }
         $this->size = $this->rootView->filesize($this->rawPath);
     }
     if ($this->isLocalTmpFile) {
         $this->handle = fopen($this->localTmpFile, $mode);
     } else {
         $this->handle = $this->rootView->fopen($this->rawPath, $mode);
     }
     \OC_FileProxy::$enabled = $proxyStatus;
     if (!is_resource($this->handle)) {
         \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR);
     } else {
         $this->meta = stream_get_meta_data($this->handle);
         // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+"
         // but we need to remember the original access type
         $this->meta['mode'] = $mode;
     }
     return is_resource($this->handle);
 }
Beispiel #6
0
 /**
  * @brief Delete a single user's shareKey for a single file
  */
 public static function delShareKey(\OC_FilesystemView $view, $userIds, $filePath)
 {
     $proxyStatus = \OC_FileProxy::$enabled;
     \OC_FileProxy::$enabled = false;
     $userId = Helper::getUser($filePath);
     $util = new Util($view, $userId);
     list($owner, $filename) = $util->getUidAndFilename($filePath);
     if ($util->isSystemWideMountPoint($filename)) {
         $shareKeyPath = \OC\Files\Filesystem::normalizePath('/files_encryption/share-keys/' . $filename);
     } else {
         $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename);
     }
     if ($view->is_dir($shareKeyPath)) {
         $localPath = \OC\Files\Filesystem::normalizePath($view->getLocalFolder($shareKeyPath));
         self::recursiveDelShareKeys($localPath, $userIds);
     } else {
         foreach ($userIds as $userId) {
             if (!$view->unlink($shareKeyPath . '.' . $userId . '.shareKey')) {
                 \OCP\Util::writeLog('Encryption library', 'Could not delete shareKey; does not exist: "' . $shareKeyPath . '.' . $userId . '.shareKey"', \OCP\Util::ERROR);
             }
         }
     }
     \OC_FileProxy::$enabled = $proxyStatus;
 }
Beispiel #7
0
 /**
  * @brief Delete a single user's shareKey for a single file
  */
 public static function delShareKey(\OC_FilesystemView $view, $userIds, $filePath)
 {
     $proxyStatus = \OC_FileProxy::$enabled;
     \OC_FileProxy::$enabled = false;
     $userId = Helper::getUser($filePath);
     $util = new Util($view, $userId);
     list($owner, $filename) = $util->getUidAndFilename($filePath);
     if ($util->isSystemWideMountPoint($filename)) {
         $shareKeyPath = \OC\Files\Filesystem::normalizePath('/files_encryption/share-keys/' . $filename);
     } else {
         $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename);
     }
     if ($view->is_dir($shareKeyPath)) {
         self::recursiveDelShareKeys($shareKeyPath, $userIds, $owner, $view);
     } else {
         foreach ($userIds as $userId) {
             if ($userId === $owner && $view->file_exists('/' . $owner . '/files/' . $filename)) {
                 \OCP\Util::writeLog('files_encryption', 'Tried to delete owner key, but the file still exists!', \OCP\Util::FATAL);
                 continue;
             }
             $result = $view->unlink($shareKeyPath . '.' . $userId . '.shareKey');
             \OCP\Util::writeLog('files_encryption', 'delShareKey: delete share key: ' . $shareKeyPath . '.' . $userId . '.shareKey', \OCP\Util::DEBUG);
             if (!$result) {
                 \OCP\Util::writeLog('Encryption library', 'Could not delete shareKey; does not exist: "' . $shareKeyPath . '.' . $userId . '.shareKey"', \OCP\Util::ERROR);
             }
         }
     }
     \OC_FileProxy::$enabled = $proxyStatus;
 }
 public function sms(Request $request)
 {
     $validator = \Validator::make($request->all(), ['phone' => 'required|digits:11|unique:customers,phone']);
     if ($validator->fails()) {
         return response()->json(['success' => false, 'error_message' => $validator->errors()->getMessages()]);
     }
     $phone = $request->input(['phone']);
     $code = \MessageSender::generateMessageVerify();
     \MessageSender::sendMessageVerify($phone, $code);
     $user = \Helper::getUser();
     try {
         $customer = \Helper::getCustomerOrFail();
     } catch (\Exception $e) {
         $customer = Customer::create(['openid' => $user['openid'], 'type_id' => 1, 'phone' => $phone]);
     }
     $customer->update(['auth_code' => $code, 'auth_code_expired' => Carbon::now()->addMinute(AppConstant::AUTH_CODE_EXPIRE_INTERVAL)]);
     return response()->json(['success' => true]);
 }
 private function _checkAuth()
 {
     $user = Helper::getUser();
     if (!$user) {
         Helper::renderJSONErorr("Internal user error");
     }
     return $user;
 }