diff --git a/package.json b/package.json index 1ceafa5..2079eb0 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "author": "Paolo Arena", "license": "MIT", "dependencies": { + "basic-ftp": "^4.5.1", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "cors": "^2.8.4", @@ -25,6 +26,7 @@ "ejs": "^2.7.1", "email-templates": "^5.1.0", "express": "^4.17.1", + "formidable": "^1.2.1", "i18n": "^0.8.3", "jade": "^1.11.0", "jsonwebtoken": "^7.1.9", diff --git a/src/server/ftp/FTPClient.js b/src/server/ftp/FTPClient.js new file mode 100644 index 0000000..1dc9bbe --- /dev/null +++ b/src/server/ftp/FTPClient.js @@ -0,0 +1,52 @@ +'use strict'; + +const ftp = require('basic-ftp'); + +// const fs = require('fs'); + +class FTPClient { + constructor(host = 'localhost', port = 21, username = 'anonymous', password = 'guest', secure = false, secureOptions = '') { + this.client = new ftp.Client(); + // this.client.ftp.verbose = true; + this.settings = { + host: host, + port: port, + user: username, + password: password, + secure: secure, + secureOptions: secureOptions + }; + } + + async upload(sourcePath, remotePath, permissions) { + let self = this; + try { + let access = await self.client.access(self.settings); + let upload = await self.client.uploadFrom(sourcePath, remotePath); + // let permissions = await self.changePermissions(permissions.toString(), remotePath); + self.client.close(); + return true; + } catch (err) { + console.log('upload ERR: ', err); + self.client.close(); + return false; + } + } + + async createDir(miadir) { + let access = await this.client.access(this.settings); + await this.client.ensureDir(miadir); + } + + close() { + this.client.close(); + } + + changePermissions(perms, filepath) { + let cmd = 'SITE CHMOD ' + perms + ' ' + filepath; + return this.client.send(cmd, false); + } +} + + +module.exports = FTPClient; diff --git a/src/server/locales/en.json b/src/server/locales/en.json index af0c29f..c982294 100644 --- a/src/server/locales/en.json +++ b/src/server/locales/en.json @@ -1,4 +1,5 @@ { "Email Verificata!": "Email Verificata!", - "partecipanti": "partecipanti" + "partecipanti": "partecipanti", + "L'Email è già stata Verificata.": "L'Email è già stata Verificata." } \ No newline at end of file diff --git a/src/server/models/mypage.js b/src/server/models/mypage.js new file mode 100644 index 0000000..b48be10 --- /dev/null +++ b/src/server/models/mypage.js @@ -0,0 +1,87 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const tools = require('../tools/general'); + +mongoose.Promise = global.Promise; +mongoose.level = "F"; + + +// Resolving error Unknown modifier: $pushAll +mongoose.plugin(schema => { + schema.options.usePushEach = true +}); + +const MyPageSchema = new Schema({ + idapp: { + type: String, + }, + author_username: { + type: String, + }, + title: { + type: String, + }, + path: { + type: String, + }, + icon: { + type: String, + }, + keywords: { + type: String, + }, + description: { + type: String, + }, + heightimg: { + type: Number, + }, + imgback: { + type: String, + }, + content: { + type: String, + }, + active: { + type: Boolean, + }, + inmenu: { + type: Boolean, + }, + submenu: { + type: Boolean, + }, + l_par: { + type: Number, + }, + l_child: { + type: Number, + }, + infooter: { + type: Boolean, + }, +}); + +MyPageSchema.statics.getFieldsForSearch = function () { + return ['title', 'keywords', 'description', 'content'] +}; + +MyPageSchema.statics.executeQueryTable = function (idapp, params) { + params.fieldsearch = this.getFieldsForSearch(); + return tools.executeQueryTable(this, idapp, params); +}; + +MyPageSchema.statics.findAllIdApp = async function (idapp) { + const MyPage = this; + + const myfind = { idapp }; + + return await MyPage.find(myfind, (err, arrrec) => { + return arrrec + }); +}; + +const MyPage = mongoose.model('MyPage', MyPageSchema); + +module.exports = { MyPage }; diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index 51729fe..ab4c8a5 100644 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -1,5 +1,8 @@ const express = require('express'); -const router = express.Router(); +const router = express.Router(), + fs = require('fs'), + path = require('path'); + const { authenticate, authenticate_noerror } = require('../middleware/authenticate'); @@ -8,6 +11,14 @@ const { ObjectID } = require('mongodb'); const mongoose = require('mongoose'); const cfgserver = mongoose.model('cfgserver'); +const ftp = require('../ftp/FTPClient'), + formidable = require('formidable'), + folder = path.join(__dirname, 'files'); + +if (!fs.existsSync(folder)) { + fs.mkdirSync(folder) +} + const _ = require('lodash'); const { User } = require('../models/user'); @@ -18,6 +29,7 @@ const { MyEvent } = require('../models/myevent'); const { Contribtype } = require('../models/contribtype'); const { Discipline } = require('../models/discipline'); const { Newstosent } = require('../models/newstosent'); +const { MyPage } = require('../models/mypage'); const { TemplEmail } = require('../models/templemail'); const { OpzEmail } = require('../models/opzemail'); const { MailingList } = require('../models/mailinglist'); @@ -82,7 +94,7 @@ router.post(process.env.LINK_REQUEST_NEWPASSWORD, (req, res) => { user.tokenforgot = jwt.sign(user._id.toHexString(), process.env.SIGNCODE).toString(); user.date_tokenforgot = new Date(); user.lasttimeonline = new Date(); - user.save().then( async () => { + user.save().then(async () => { await sendemail.sendEmail_RequestNewPassword(res.locale, user.email, user.idapp, user.tokenforgot); res.send({ code: server_constants.RIS_CODE_OK, msg: '' }); }); @@ -152,6 +164,8 @@ function getTableByTableName(tablename) { mytable = Discipline; else if (tablename === 'newstosent') mytable = Newstosent; + else if (tablename === 'mypage') + mytable = MyPage; else if (tablename === 'templemail') mytable = TemplEmail; else if (tablename === 'opzemail') @@ -362,11 +376,12 @@ router.get('/loadsite/:userId/:idapp/:sall', authenticate_noerror, (req, res) => let newstosent = Promise.resolve([]); let mailinglist = Promise.resolve([]); - if (sall){ + let mypage = MyPage.findAllIdApp(idapp); + if (sall) { newstosent = Newstosent.findAllIdApp(idapp); } - return Promise.all([bookedevent, eventlist, operators, wheres, contribtype, settings, permissions, disciplines, newstosent, mailinglist]) + return Promise.all([bookedevent, eventlist, operators, wheres, contribtype, settings, permissions, disciplines, newstosent, mailinglist, mypage]) .then((arrdata) => { // console.table(arrdata); res.send({ @@ -380,6 +395,7 @@ router.get('/loadsite/:userId/:idapp/:sall', authenticate_noerror, (req, res) => disciplines: arrdata[7], newstosent: arrdata[8], mailinglist: arrdata[9], + mypage: arrdata[10], }); }) .catch((e) => { @@ -437,5 +453,64 @@ router.get(process.env.LINK_CHECK_UPDATES, authenticate, (req, res) => { }); +router.post('/upload/:dir', authenticate, (req, res) => { + const dir = req.params.dir; + const idapp = req.user.idapp; + + const form = new formidable.IncomingForm(); + + form.parse(req); + + const client = new ftp(process.env.FTPSERVER_HOST, process.env.FTPSERVER_PORT, process.env.FTPSERVER_USER + idapp + '@associazioneshen.it', process.env.FTPSERVER_PWD + idapp, false, 134217728); + + // SSL_OP_NO_TLSv1_2 = 134217728 + + // console.log('client', client); + + form.uploadDir = folder; + try { + + form.on('fileBegin', async function (name, file){ + file.path = folder + '/' + file.name; + }); + + form.on('file', async function (name, file){ + try { + // Create directory remote + + if (!!dir) + await client.createDir(dir); + + const miofile = (dir) ? dir + `/` + file.name : file.name; + console.log('Upload...'); + const ret = await client.upload(file.path, miofile, 755); + console.log('Uploaded ' + file.name, 'status:', ret); + if (!ret) + res.status(400).send(); + else + res.end(); + }catch (e) { + console.log('error', e); + res.status(400).send(); + } + }); + + form.on('aborted', () => { + console.error('Request aborted by the user'); + res.status(400).send(); + }); + + form.on('error', (err) => { + console.error('Error Uploading', err); + res.status(400).send(); + }); + + } catch (e) { + console.log('Error', e) + } + + +}); + module.exports = router; diff --git a/src/server/server.js b/src/server/server.js index 07959de..521b963 100644 --- a/src/server/server.js +++ b/src/server/server.js @@ -3,7 +3,9 @@ require('./config/config'); const _ = require('lodash'); const cors = require('cors'); -var fs = require('fs'); +const fs = require('fs'); + +//const throttle = require('express-throttle-bandwidth'); const port = process.env.PORT; @@ -16,6 +18,7 @@ const sendemail = require('./sendemail'); const cron = require('node-cron'); + i18n = require("i18n"); if ((process.env.NODE_ENV === 'production') || (process.env.NODE_ENV === 'test')) { @@ -36,6 +39,7 @@ require('./models/booking'); require('./models/sendmsg'); require('./models/mailinglist'); require('./models/newstosent'); +require('./models/mypage'); const mysql_func = require('./mysql/mysql_func'); @@ -152,6 +156,14 @@ if ((process.env.NODE_ENV === 'production') || (process.env.NODE_ENV === 'test') httpServer.listen(port); } +// app.use(throttle(1024 * 128)); // throttling bandwidth + +// app.use((req, res, next) => { +// res.header('Access-Control-Allow-Origin', '*') +// res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept') +// next() +// }); + if (process.env.PROD !== 1) { // testmsgwebpush(); // sendemail.testemail('2', 'it');