2012-02-25 17:23:44 +01:00
var hasPadAccess = require ( "../../padaccess" ) ;
var settings = require ( '../../utils/Settings' ) ;
var exportHandler = require ( '../../handler/ExportHandler' ) ;
var importHandler = require ( '../../handler/ImportHandler' ) ;
2018-04-04 21:48:32 +01:00
var padManager = require ( "../../db/PadManager" ) ;
2020-04-04 21:43:33 +00:00
var authorManager = require ( "../../db/AuthorManager" ) ;
2012-02-25 16:06:08 +01:00
exports . expressCreateServer = function ( hook _name , args , cb ) {
2020-04-13 01:33:43 +02:00
// handle export requests
2019-01-23 16:29:36 +00:00
args . app . get ( '/p/:pad/:rev?/export/:type' , async function ( req , res , next ) {
2014-12-29 20:57:58 +01:00
var types = [ "pdf" , "doc" , "txt" , "html" , "odt" , "etherpad" ] ;
2012-02-25 16:06:08 +01:00
//send a 404 if we don't support this filetype
if ( types . indexOf ( req . params . type ) == - 1 ) {
2019-01-23 16:29:36 +00:00
return next ( ) ;
2012-02-25 16:06:08 +01:00
}
2019-02-08 23:20:57 +01:00
// if abiword is disabled, and this is a format we only support with abiword, output a message
2015-12-18 00:14:13 -06:00
if ( settings . exportAvailable ( ) == "no" &&
2012-02-25 16:06:08 +01:00
[ "odt" , "pdf" , "doc" ] . indexOf ( req . params . type ) !== - 1 ) {
2020-04-13 01:33:43 +02:00
console . error ( ` Impossible to export pad " ${ req . params . pad } " in ${ req . params . type } format. There is no converter configured ` ) ;
// ACHTUNG: do not include req.params.type in res.send() because there is no HTML escaping and it would lead to an XSS
res . send ( "This export is not enabled at this Etherpad instance. Set the path to Abiword or soffice (LibreOffice) in settings.json to enable this feature" ) ;
2012-02-25 16:06:08 +01:00
return ;
}
res . header ( "Access-Control-Allow-Origin" , "*" ) ;
2019-01-23 16:29:36 +00:00
if ( await hasPadAccess ( req , res ) ) {
let exists = await padManager . doesPadExists ( req . params . pad ) ;
if ( ! exists ) {
2020-04-13 01:33:43 +02:00
console . warn ( ` Someone tried to export a pad that doesn't exist ( ${ req . params . pad } ) ` ) ;
2019-01-23 16:29:36 +00:00
return next ( ) ;
}
2018-04-04 21:48:32 +01:00
2020-04-13 01:33:43 +02:00
console . log ( ` Exporting pad " ${ req . params . pad } " in ${ req . params . type } format ` ) ;
2019-01-23 16:29:36 +00:00
exportHandler . doExport ( req , res , req . params . pad , req . params . type ) ;
}
2012-02-25 16:06:08 +01:00
} ) ;
2019-02-08 23:20:57 +01:00
// handle import requests
2019-01-23 16:29:36 +00:00
args . app . post ( '/p/:pad/import' , async function ( req , res , next ) {
if ( await hasPadAccess ( req , res ) ) {
let exists = await padManager . doesPadExists ( req . params . pad ) ;
if ( ! exists ) {
2020-04-13 01:33:43 +02:00
console . warn ( ` Someone tried to import into a pad that doesn't exist ( ${ req . params . pad } ) ` ) ;
2019-01-23 16:29:36 +00:00
return next ( ) ;
}
2018-04-04 21:48:32 +01:00
2020-04-04 21:43:33 +00:00
/ *
* Starting from Etherpad 1.8 . 3 onwards , importing into a pad is allowed
* only if a user has his browser opened and connected to the pad ( i . e . a
* Socket . IO session is estabilished for him ) and he has already
* contributed to that specific pad .
*
* Note that this does not have anything to do with the "session" , used
* for logging into "group pads" . That kind of session is not needed here .
*
* This behaviour does not apply to API requests , only to / p / $PAD$ / import
*
* See : https : //github.com/ether/etherpad-lite/pull/3833#discussion_r407490205
* /
if ( ! req . cookies ) {
console . warn ( ` Unable to import file into " ${ req . params . pad } ". No cookies included in request ` ) ;
return next ( ) ;
}
if ( ! req . cookies . token ) {
console . warn ( ` Unable to import file into " ${ req . params . pad } ". No token in the cookies ` ) ;
return next ( ) ;
}
let author = await authorManager . getAuthor4Token ( req . cookies . token ) ;
// author is of the form: "a.g2droBYw1prY7HW9"
if ( ! author ) {
console . warn ( ` Unable to import file into " ${ req . params . pad } ". No Author found for token ${ req . cookies . token } ` ) ;
return next ( ) ;
}
let authorsPads = await authorManager . listPadsOfAuthor ( author ) ;
if ( ! authorsPads ) {
console . warn ( ` Unable to import file into " ${ req . params . pad } ". Author " ${ author } " exists but he never contributed to any pad ` ) ;
return next ( ) ;
}
let authorsPadIDs = authorsPads . padIDs ;
if ( authorsPadIDs . indexOf ( req . params . pad ) === - 1 ) {
console . warn ( ` Unable to import file into " ${ req . params . pad } ". Author " ${ author } " exists but he never contributed to this pad ` ) ;
return next ( ) ;
}
2019-01-23 16:29:36 +00:00
importHandler . doImport ( req , res , req . params . pad ) ;
}
2012-02-25 16:06:08 +01:00
} ) ;
}