/** * @NoAdminRequired */ public function create() { $mimetype = $this->request->post['mimetype']; $view = new View('/' . $this->uid . '/files'); $dir = $this->settings->getUserValue($this->uid, $this->appName, 'save_path', '/'); if (!$view->is_dir($dir)) { $dir = '/'; } $basename = $this->l10n->t('New Document.odt'); switch ($mimetype) { case 'application/vnd.oasis.opendocument.spreadsheet': $basename = $this->l10n->t('New Spreadsheet.ods'); break; case 'application/vnd.oasis.opendocument.presentation': $basename = $this->l10n->t('New Presentation.odp'); break; default: // to be safe $mimetype = 'application/vnd.oasis.opendocument.text'; break; } $path = Helper::getNewFileName($view, $dir . '/' . $basename); $content = ''; if (class_exists('\\OC\\Files\\Type\\TemplateManager')) { $manager = \OC_Helper::getFileTemplateManager(); $content = $manager->getTemplate($mimetype); } if (!$content) { $content = file_get_contents(dirname(__DIR__) . self::ODT_TEMPLATE_PATH); } if ($content && $view->file_put_contents($path, $content)) { $info = $view->getFileInfo($path); $response = array('status' => 'success', 'fileid' => $info['fileid']); } else { $response = array('status' => 'error', 'message' => (string) $this->l10n->t('Can\'t create document')); } return $response; }
/** * Store the document content to its origin * @NoAdminRequired */ public function save() { $response = new JSONResponse(); try { $esId = $this->request->server['HTTP_WEBODF_SESSION_ID']; $session = $this->loadSession($esId); $memberId = $this->request->server['HTTP_WEBODF_MEMBER_ID']; $currentMember = $this->loadMember($memberId, $esId); // Extra info for future usage // $sessionRevision = $this->request->server['HTTP_WEBODF_SESSION_REVISION']; //NB ouch! New document content is passed as an input stream content $stream = fopen('php://input', 'r'); if (!$stream) { throw new \Exception('New content missing'); } $content = stream_get_contents($stream); try { if ($currentMember->getIsGuest()) { $file = File::getByShareToken($currentMember->getToken()); } else { $file = new File($session->getFileId()); } $view = $file->getOwnerView(true); $path = $file->getPath(true); } catch (\Exception $e) { //File was deleted or unshared. We need to save content as new file anyway //Sorry, but for guests it would be lost :( if ($this->uid) { $view = new View('/' . $this->uid . '/files'); $dir = \OC::$server->getConfig()->getUserValue($this->uid, 'richdocuments', 'save_path', ''); $path = Helper::getNewFileName($view, $dir . 'New Document.odt'); } else { throw $e; } } $member = new Db\Member(); $members = $member->getActiveCollection($esId); $memberIds = array_map(function ($x) { return $x['member_id']; }, $members); // Active users except current user $memberCount = count($memberIds) - 1; if ($view->file_exists($path)) { $currentHash = $view->hash('sha1', $path, false); if (!Helper::isVersionsEnabled() && $currentHash !== $session->getGenesisHash()) { // Original file was modified externally. Save to a new one $path = Helper::getNewFileName($view, $path, '-conflict'); } $mimetype = $view->getMimeType($path); } else { $mimetype = Storage::MIMETYPE_LIBREOFFICE_WORDPROCESSOR; } $data = Filter::write($content, $mimetype); if ($view->file_put_contents($path, $data['content'])) { // Not a last user if ($memberCount > 0) { // Update genesis hash to prevent conflicts $this->logger->debug('Update hash', ['app' => $this->appName]); $session->updateGenesisHash($esId, sha1($data['content'])); } else { // Last user. Kill session data Db\Session::cleanUp($esId); } $view->touch($path); } $response->setData(['status' => 'success']); } catch (\Exception $e) { $response->setStatus(Http::STATUS_INTERNAL_SERVER_ERROR); $response->setData([]); $this->logger->warning('Saving failed. Reason:' . $e->getMessage(), ['app' => $this->appName]); } return $response; }
/** * @NoAdminRequired */ public function create() { $mimetype = $this->request->post['mimetype']; $filename = $this->request->post['filename']; $dir = $this->request->post['dir']; $view = new View('/' . $this->uid . '/files'); if (!$dir) { $dir = '/'; } $basename = $this->l10n->t('New Document.odt'); switch ($mimetype) { case 'application/vnd.oasis.opendocument.spreadsheet': $basename = $this->l10n->t('New Spreadsheet.ods'); break; case 'application/vnd.oasis.opendocument.presentation': $basename = $this->l10n->t('New Presentation.odp'); break; default: // to be safe $mimetype = 'application/vnd.oasis.opendocument.text'; break; } if (!$filename) { $path = Helper::getNewFileName($view, $dir . '/' . $basename); } else { $path = $dir . '/' . $filename; } $content = ''; if (class_exists('\\OC\\Files\\Type\\TemplateManager')) { $manager = \OC_Helper::getFileTemplateManager(); $content = $manager->getTemplate($mimetype); } if (!$content) { $content = file_get_contents(dirname(__DIR__) . self::ODT_TEMPLATE_PATH); } $discovery_parsed = null; try { $discovery = $this->getDiscovery(); $loadEntities = libxml_disable_entity_loader(true); $discovery_parsed = simplexml_load_string($discovery); libxml_disable_entity_loader($loadEntities); if ($discovery_parsed === false) { $this->cache->remove('discovery.xml'); $wopiRemote = $this->appConfig->getAppValue('wopi_url'); return array('status' => 'error', 'message' => $this->l10n->t('Collabora Online: discovery.xml from "%s" is not a well-formed XML string.', array($wopiRemote)), 'hint' => $this->l10n->t('Please contact the "%s" administrator.', array($wopiRemote))); } } catch (ResponseException $e) { return array('status' => 'error', 'message' => $e->getMessage(), 'hint' => $e->getHint()); } if ($content && $view->file_put_contents($path, $content)) { $info = $view->getFileInfo($path); $ret = $this->getWopiSrcUrl($discovery_parsed, $mimetype); $response = array('status' => 'success', 'fileid' => $info['fileid'], 'urlsrc' => $ret['urlsrc'], 'action' => $ret['action'], 'lolang' => $this->settings->getUserValue($this->uid, 'core', 'lang', 'en'), 'data' => \OCA\Files\Helper::formatFileInfo($info)); } else { $response = array('status' => 'error', 'message' => (string) $this->l10n->t('Can\'t create document')); } return $response; }