|
@@ -12,6 +12,10 @@ const sendToWormhole = require('stream-wormhole');
|
|
|
const path = require('path');
|
|
const path = require('path');
|
|
|
const advanceConst = require('../const/advance');
|
|
const advanceConst = require('../const/advance');
|
|
|
|
|
|
|
|
|
|
+const FILE_MANAGEMENT_EXTRA_EXTENSIONS = [
|
|
|
|
|
+ '.sbp', '.jygs', '.gkgs', '.sjgs', '.sgys', '.qdys', '.gcjs', '.sjys',
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
module.exports = app => {
|
|
module.exports = app => {
|
|
|
class FileController extends app.BaseController {
|
|
class FileController extends app.BaseController {
|
|
|
|
|
|
|
@@ -27,6 +31,28 @@ module.exports = app => {
|
|
|
return Number(ctx.session.sessionUser.is_admin) === 1;
|
|
return Number(ctx.session.sessionUser.is_admin) === 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ getFileUploadWhitelist(ctx) {
|
|
|
|
|
+ const defaultWhitelist = ctx.app.config.multipart.whitelist || [];
|
|
|
|
|
+ return Array.from(new Set(defaultWhitelist.concat(FILE_MANAGEMENT_EXTRA_EXTENSIONS).map(ext => ext.toLowerCase())));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ isFileUploadExtensionAllowed(ctx, filename) {
|
|
|
|
|
+ const ext = path.extname(filename || '').toLowerCase();
|
|
|
|
|
+ return this.getFileUploadWhitelist(ctx).indexOf(ext) >= 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ getFileUploadCheck(ctx) {
|
|
|
|
|
+ const whitelist = this.getFileUploadWhitelist(ctx);
|
|
|
|
|
+ return (fieldname, fileStream, filename) => {
|
|
|
|
|
+ if (!fileStream || !filename) return null;
|
|
|
|
|
+ const ext = path.extname(filename).toLowerCase();
|
|
|
|
|
+ if (whitelist.indexOf(ext) >= 0) return null;
|
|
|
|
|
+ const error = new Error(`资料管理不支持${ext || '无扩展名'}格式文件`);
|
|
|
|
|
+ error.status = 400;
|
|
|
|
|
+ return error;
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
hasFilePermission(ctx, permissionKey) {
|
|
hasFilePermission(ctx, permissionKey) {
|
|
|
if (this.isAdmin(ctx)) return true;
|
|
if (this.isAdmin(ctx)) return true;
|
|
|
const permission = ctx.service.subProjPermission.PermissionConst.file[permissionKey];
|
|
const permission = ctx.service.subProjPermission.PermissionConst.file[permissionKey];
|
|
@@ -229,6 +255,7 @@ module.exports = app => {
|
|
|
try {
|
|
try {
|
|
|
const renderData = {
|
|
const renderData = {
|
|
|
jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.file.filesjs),
|
|
jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.file.filesjs),
|
|
|
|
|
+ fileUploadWhitelist: this.getFileUploadWhitelist(ctx),
|
|
|
};
|
|
};
|
|
|
const allFiling = await ctx.service.filing.getValidFiling(ctx.params.id, 'all');
|
|
const allFiling = await ctx.service.filing.getValidFiling(ctx.params.id, 'all');
|
|
|
const canManageDir = this.hasFilePermission(ctx, 'manage_dir');
|
|
const canManageDir = this.hasFilePermission(ctx, 'manage_dir');
|
|
@@ -715,7 +742,10 @@ module.exports = app => {
|
|
|
async uploadFile(ctx){
|
|
async uploadFile(ctx){
|
|
|
let stream;
|
|
let stream;
|
|
|
try {
|
|
try {
|
|
|
- const parts = ctx.multipart({ autoFields: true });
|
|
|
|
|
|
|
+ const parts = ctx.multipart({
|
|
|
|
|
+ autoFields: true,
|
|
|
|
|
+ checkFile: this.getFileUploadCheck(ctx),
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
let index = 0;
|
|
let index = 0;
|
|
|
const create_time = Date.parse(new Date()) / 1000;
|
|
const create_time = Date.parse(new Date()) / 1000;
|
|
@@ -819,6 +849,9 @@ module.exports = app => {
|
|
|
|
|
|
|
|
let result;
|
|
let result;
|
|
|
const fileInfo = path.parse(data.fileInfo.filename);
|
|
const fileInfo = path.parse(data.fileInfo.filename);
|
|
|
|
|
+ if (!this.isFileUploadExtensionAllowed(ctx, data.fileInfo.filename)) {
|
|
|
|
|
+ throw `资料管理不支持${fileInfo.ext || '无扩展名'}格式文件`;
|
|
|
|
|
+ }
|
|
|
switch(data.type) {
|
|
switch(data.type) {
|
|
|
case 'begin':
|
|
case 'begin':
|
|
|
const create_time = Date.parse(new Date()) / 1000;
|
|
const create_time = Date.parse(new Date()) / 1000;
|