1+ import * as crypto from "crypto" ;
12import * as url from "url" ;
23import * as winston from "winston" ;
34import * as express from "express" ;
@@ -13,7 +14,8 @@ import * as LocalStrategy from "passport-local";
1314import * as passport from "passport" ;
1415import { Config } from "./Config" ;
1516import { User } from "./User" ;
16- import { Base } from "./base" ;
17+ import { Base , Rights , WellknownIds } from "./base" ;
18+
1719import { TokenUser } from "./TokenUser" ;
1820import { Crypt } from "./Crypt" ;
1921import { Role } from "./Role" ;
@@ -22,6 +24,12 @@ import { Audit } from "./Audit";
2224import * as saml from "saml20" ;
2325import { SamlProvider } from "./SamlProvider" ;
2426import { Util } from "./Util" ;
27+ // import { multer } from "multer";
28+ // import { GridFsStorage } from "multer-gridfs-storage";
29+ var multer = require ( 'multer' ) ;
30+ var GridFsStorage = require ( 'multer-gridfs-storage' ) ;
31+ import { GridFSBucket , ObjectID , Db , Cursor } from "mongodb" ;
32+ const safeObjectID = ( s : string | number | ObjectID ) => ObjectID . isValid ( s ) ? new ObjectID ( s ) : null ;
2533
2634interface IVerifyFunction { ( error : any , profile : any ) : void ; }
2735export class Provider extends Base {
@@ -212,7 +220,8 @@ export class LoginProvider {
212220 allow_personal_nodered : Config . allow_personal_nodered ,
213221 auto_create_personal_nodered_group : Config . auto_create_personal_nodered_group ,
214222 namespace : Config . namespace ,
215- nodered_domain_schema : Config . nodered_domain_schema
223+ nodered_domain_schema : Config . nodered_domain_schema ,
224+ websocket_package_size : Config . websocket_package_size
216225 }
217226 res . end ( JSON . stringify ( res2 ) ) ;
218227 } ) ;
@@ -249,6 +258,125 @@ export class LoginProvider {
249258 } catch ( error ) {
250259 }
251260 } ) ;
261+
262+
263+ app . get ( "/download/:id" , async ( req , res ) => {
264+ try {
265+ var user : TokenUser = null ;
266+ var jwt : string = null ;
267+ var authHeader = req . headers . authorization ;
268+ if ( authHeader ) {
269+ user = Crypt . verityToken ( authHeader ) ;
270+ jwt = Crypt . createToken ( user , "15m" ) ;
271+ }
272+ else if ( req . user ) {
273+ user = new TokenUser ( req . user ) ;
274+ jwt = Crypt . createToken ( user , "15m" ) ;
275+ }
276+ if ( user == null ) {
277+ return res . status ( 404 ) . send ( { message : 'Route ' + req . url + ' Not found.' } ) ;
278+ }
279+
280+ var id = req . params . id ;
281+ var rows = await Config . db . query ( { _id : safeObjectID ( id ) } , null , 1 , 0 , null , "files" , jwt ) ;
282+ if ( rows == null || rows . length != 1 ) { return res . status ( 404 ) . send ( { message : 'id ' + id + ' Not found.' } ) ; }
283+ var file = rows [ 0 ] as any ;
284+
285+ var bucket = new GridFSBucket ( Config . db . db ) ;
286+ let downloadStream = bucket . openDownloadStream ( safeObjectID ( id ) ) ;
287+ res . set ( 'Content-Type' , file . contentType ) ;
288+ res . set ( 'Content-Disposition' , 'attachment; filename="' + file . filename + '"' ) ;
289+ res . set ( 'Content-Length' , file . length ) ;
290+ downloadStream . on ( "error" , function ( err ) {
291+ res . end ( ) ;
292+ } ) ;
293+ downloadStream . pipe ( res ) ;
294+ } catch ( error ) {
295+ return res . status ( 500 ) . send ( { message : error } ) ;
296+ }
297+ } ) ;
298+ try {
299+
300+ var t = new Role ( ) ;
301+
302+ var storage = GridFsStorage ( {
303+ db : Config . db ,
304+ file : ( req , file ) => {
305+ return new Promise ( ( resolve , reject ) => {
306+ crypto . randomBytes ( 16 , ( err , buf ) => {
307+ if ( err ) {
308+ return reject ( err ) ;
309+ }
310+ // const filename = buf.toString('hex') + path.extname(file.originalname);
311+ const filename = file . originalname ;
312+ const fileInfo = {
313+ filename : filename ,
314+ metadata : new Base ( )
315+ } ;
316+ var user : TokenUser = null ;
317+ var jwt : string = null ;
318+ var authHeader = req . headers . authorization ;
319+ if ( authHeader ) {
320+ user = Crypt . verityToken ( authHeader ) ;
321+ jwt = Crypt . createToken ( user , "15m" ) ;
322+ }
323+ else if ( req . user ) {
324+ user = new TokenUser ( req . user ) ;
325+ jwt = Crypt . createToken ( user , "15m" ) ;
326+ }
327+
328+ fileInfo . metadata . name = file . originalname ;
329+ ( fileInfo . metadata as any ) . filename = file . originalname ;
330+ ( fileInfo . metadata as any ) . path = "" ;
331+ fileInfo . metadata . _acl = [ ] ;
332+ fileInfo . metadata . _createdby = user . name ;
333+ fileInfo . metadata . _createdbyid = user . _id ;
334+ fileInfo . metadata . _created = new Date ( new Date ( ) . toISOString ( ) ) ;
335+ fileInfo . metadata . _modifiedby = user . name ;
336+ fileInfo . metadata . _modifiedbyid = user . _id ;
337+ fileInfo . metadata . _modified = fileInfo . metadata . _created ;
338+ fileInfo . metadata . addRight ( user . _id , user . name , [ Rights . full_control ] ) ;
339+ fileInfo . metadata . addRight ( WellknownIds . filestore_admins , "filestore admins" , [ Rights . full_control ] ) ;
340+ fileInfo . metadata . addRight ( WellknownIds . filestore_users , "filestore users" , [ Rights . read ] ) ;
341+
342+ resolve ( fileInfo ) ;
343+ } ) ;
344+ } ) ;
345+ } ,
346+ } ) ;
347+ var upload = multer ( { //multer settings for single upload
348+ storage : storage
349+ } ) . any ( ) ;
350+
351+ app . post ( "/upload" , async ( req , res ) => {
352+ var user : TokenUser = null ;
353+ var jwt : string = null ;
354+ var authHeader = req . headers . authorization ;
355+ if ( authHeader ) {
356+ user = Crypt . verityToken ( authHeader ) ;
357+ jwt = Crypt . createToken ( user , "15m" ) ;
358+ }
359+ else if ( req . user ) {
360+ user = new TokenUser ( req . user ) ;
361+ jwt = Crypt . createToken ( user , "15m" ) ;
362+ }
363+ if ( user == null ) {
364+ return res . status ( 404 ) . send ( { message : 'Route ' + req . url + ' Not found.' } ) ;
365+ }
366+
367+ upload ( req , res , function ( err ) {
368+ if ( err ) {
369+ res . json ( { error_code : 1 , err_desc : err } ) ;
370+ return ;
371+ }
372+ LoginProvider . redirect ( res , req . headers . referer ) ;
373+ // res.json({ error_code: 0, err_desc: null });
374+ } ) ;
375+ } ) ;
376+ } catch ( error ) {
377+ console . error ( error ) ;
378+ }
379+
252380 }
253381 static async RegisterProviders ( app : express . Express , baseurl : string ) {
254382 if ( LoginProvider . login_providers . length === 0 ) {
0 commit comments