2014-02-12 05:23:40 -05:00
async = require " async "
fs = require " fs "
_ = require " underscore "
FileTypeManager = require " ./FileTypeManager "
EditorController = require " ../Editor/EditorController "
ProjectLocator = require " ../Project/ProjectLocator "
2016-03-12 07:01:36 -05:00
logger = require ( " logger-sharelatex " )
2014-02-12 05:23:40 -05:00
module.exports = FileSystemImportManager =
2016-02-23 11:46:14 -05:00
addDoc: ( user_id , project_id , folder_id , name , path , replace , callback = (error, doc)-> ) ->
2016-03-12 10:05:29 -05:00
FileSystemImportManager . _isSafeOnFileSystem path , (err, isSafe)->
if ! isSafe
2016-03-12 07:01:36 -05:00
logger . log user_id : user_id , project_id : project_id , folder_id : folder_id , name : name , path : path , " add doc is from symlink, stopping process "
return callback ( " path is symlink " )
fs . readFile path , " utf8 " , (error, content = "") ->
return callback ( error ) if error ?
content = content . replace ( /\r/g , " " )
lines = content . split ( " \n " )
if replace
ProjectLocator . findElement project_id: project_id , element_id: folder_id , type: " folder " , (error, folder) ->
return callback ( error ) if error ?
return callback ( new Error ( " Couldn ' t find folder " ) ) if ! folder ?
existingDoc = null
for doc in folder . docs
if doc . name == name
existingDoc = doc
break
if existingDoc ?
EditorController . setDoc project_id , existingDoc . _id , user_id , lines , " upload " , callback
else
2017-11-23 10:34:24 -05:00
EditorController . addDocWithoutLock project_id , folder_id , name , lines , " upload " , user_id , callback
2016-03-12 07:01:36 -05:00
else
2017-11-23 10:34:24 -05:00
EditorController . addDocWithoutLock project_id , folder_id , name , lines , " upload " , user_id , callback
2016-03-12 07:01:36 -05:00
addFile: ( user_id , project_id , folder_id , name , path , replace , callback = (error, file)-> ) ->
2016-03-12 10:05:29 -05:00
FileSystemImportManager . _isSafeOnFileSystem path , (err, isSafe)->
if ! isSafe
2016-03-12 07:01:36 -05:00
logger . log user_id : user_id , project_id : project_id , folder_id : folder_id , name : name , path : path , " add file is from symlink, stopping insert "
return callback ( " path is symlink " )
if ! replace
2017-11-13 07:20:14 -05:00
EditorController . addFileWithoutLock project_id , folder_id , name , path , " upload " , user_id , callback
2016-03-12 07:01:36 -05:00
else
2016-02-23 11:46:14 -05:00
ProjectLocator . findElement project_id: project_id , element_id: folder_id , type: " folder " , (error, folder) ->
return callback ( error ) if error ?
return callback ( new Error ( " Couldn ' t find folder " ) ) if ! folder ?
2016-03-12 07:01:36 -05:00
existingFile = null
for fileRef in folder . fileRefs
if fileRef . name == name
existingFile = fileRef
2016-02-23 11:46:14 -05:00
break
2016-03-12 07:01:36 -05:00
if existingFile ?
2017-12-20 10:52:28 -05:00
EditorController . replaceFileWithoutLock project_id , existingFile . _id , path , " upload " , user_id , callback
2016-02-23 11:46:14 -05:00
else
2017-11-13 07:20:14 -05:00
EditorController . addFileWithoutLock project_id , folder_id , name , path , " upload " , user_id , callback
2014-02-12 05:23:40 -05:00
2016-02-23 11:46:14 -05:00
addFolder: ( user_id , project_id , folder_id , name , path , replace , callback = (error)-> ) ->
2016-03-12 10:05:29 -05:00
FileSystemImportManager . _isSafeOnFileSystem path , (err, isSafe)->
if ! isSafe
2016-03-12 07:01:36 -05:00
logger . log user_id : user_id , project_id : project_id , folder_id : folder_id , path : path , " add folder is from symlink, stopping insert "
return callback ( " path is symlink " )
EditorController . addFolderWithoutLock project_id , folder_id , name , " upload " , (error, new_folder) =>
2014-02-12 05:23:40 -05:00
return callback ( error ) if error ?
2016-03-12 07:01:36 -05:00
FileSystemImportManager . addFolderContents user_id , project_id , new_folder . _id , path , replace , (error) ->
return callback ( error ) if error ?
callback null , new_folder
2014-02-12 05:23:40 -05:00
2016-02-23 11:46:14 -05:00
addFolderContents: ( user_id , project_id , parent_folder_id , folderPath , replace , callback = (error)-> ) ->
2016-03-12 10:05:29 -05:00
FileSystemImportManager . _isSafeOnFileSystem folderPath , (err, isSafe)->
if ! isSafe
2016-03-12 07:01:36 -05:00
logger . log user_id : user_id , project_id : project_id , parent_folder_id : parent_folder_id , folderPath : folderPath , " add folder contents is from symlink, stopping insert "
return callback ( " path is symlink " )
fs . readdir folderPath , (error, entries = []) =>
return callback ( error ) if error ?
jobs = _ . map entries , (entry) =>
(callback) =>
FileTypeManager . shouldIgnore entry , (error, ignore) =>
return callback ( error ) if error ?
if ! ignore
FileSystemImportManager . addEntity user_id , project_id , parent_folder_id , entry , " #{ folderPath } / #{ entry } " , replace , callback
else
callback ( )
async . parallelLimit jobs , 5 , callback
addEntity: ( user_id , project_id , folder_id , name , path , replace , callback = (error, entity)-> ) ->
2016-03-12 10:05:29 -05:00
FileSystemImportManager . _isSafeOnFileSystem path , (err, isSafe)->
if ! isSafe
2016-03-12 07:01:36 -05:00
logger . log user_id : user_id , project_id : project_id , folder_id : folder_id , path : path , " add entry is from symlink, stopping insert "
return callback ( " path is symlink " )
FileTypeManager . isDirectory path , (error, isDirectory) =>
return callback ( error ) if error ?
if isDirectory
FileSystemImportManager . addFolder user_id , project_id , folder_id , name , path , replace , callback
else
FileTypeManager . isBinary name , path , (error, isBinary) =>
2014-02-12 05:23:40 -05:00
return callback ( error ) if error ?
2016-03-12 07:01:36 -05:00
if isBinary
2017-06-08 10:55:17 -04:00
FileSystemImportManager . addFile user_id , project_id , folder_id , name , path , replace , (err, entity) ->
entity ? . type = ' file '
callback ( err , entity )
2014-02-12 05:23:40 -05:00
else
2017-06-08 10:55:17 -04:00
FileSystemImportManager . addDoc user_id , project_id , folder_id , name , path , replace , (err, entity) ->
entity ? . type = ' doc '
callback ( err , entity )
2014-02-12 05:23:40 -05:00
2016-03-12 07:01:36 -05:00
2016-03-12 10:05:29 -05:00
_isSafeOnFileSystem: ( path , callback = (err, isSafe)-> ) ->
2016-03-12 07:01:36 -05:00
fs . lstat path , (err, stat)->
if err ?
logger . err err : err , " error with path symlink check "
return callback ( err )
2016-03-12 10:05:29 -05:00
isSafe = stat . isFile ( ) or stat . isDirectory ( )
callback ( err , isSafe )
2014-02-12 05:23:40 -05:00