Project

General

Profile

1
var express = require("express");
2
var bodyParser = require("body-parser");
3
var cookieParser = require('cookie-parser');
4
var multer = require("multer");
5
var PropertiesReader = require('properties-reader');
6
var properties = PropertiesReader('./properties.file');
7
var TinyURL = require('tinyurl');
8
var app = express();
9
var http = null;
10

    
11
if (properties.get('ssl')) {
12
    http = require("https");
13
} else {
14
    http = require("http");
15
}
16

    
17

    
18
// Properties
19
var auth = properties.get('userInfoUrl');
20
var originServer = properties.get('originServer');
21
var allowPostRequests = properties.get('post.allowed').split(',');
22
var localPath = properties.get('localPath');
23
var maxsize = properties.get('photo.size') * 1024;
24

    
25
var storage = multer.diskStorage({
26
    destination: function (req, file, cb) {
27
        cb(null, 'uploads')
28
    },
29
    filename: function (req, file, cb) {
30
        if (req.params.id) {
31
            cb(null, req.params.id + '-' + new Date().getTime() + '.' + file.originalname.split('.').pop());
32
        } else {
33
            cb(null, file.originalname);
34
        }
35
    }
36
});
37

    
38
var upload = multer({storage: storage})
39

    
40
app.use(bodyParser.json());
41
app.use(bodyParser.urlencoded({extended: true}));
42
app.use(cookieParser());
43

    
44
app.use(function (req, res, next) {
45
    if((req.method === 'POST' || req.method === 'DELETE') && allowPostRequests.indexOf(req.url.split('?')[0]) === -1) {
46
        if(checkCookies(req)) {
47
            res.header('Access-Control-Allow-Origin', req.headers.origin);
48
            res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-xsrf-token');
49
            res.header('Access-Control-Allow-Credentials', true);
50
            next();
51
        } else {
52
            res.header('Access-Control-Allow-Origin', '*');
53
            res.header('Access-Control-Allow-Credentials', true);
54
            res.header('Vary', 'Origin');
55
            res.status(403).send(getResponse(403, "Forbidden: You don't have permission to access. Maybe you are not registered."));
56
        }
57
    } else if(req.method === 'OPTIONS' && allowPostRequests.indexOf(req.url.split('?')[0]) === -1){
58
        res.header('Access-Control-Allow-Origin', req.headers.origin);
59
        res.header('Access-Control-Allow-Credentials', true);
60
        res.header('Access-Control-Allow-Methods', 'POST, DELETE');
61
        res.header('Access-Control-Max-Age', 1800);
62
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-xsrf-token');
63
        next();
64
    } else {
65
        res.header('Access-Control-Allow-Origin', req.headers.origin);
66
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
67
        next();
68
    }
69
});
70

    
71
app.post("/upload", upload.array("uploads[]", 12), function (req, res) {
72
    var filepath = (localPath ? "." : __dirname) + "/" + req.files[0].path;
73
    let type = req.query.type;
74
	console.log(type);
75
    if(type == 'json' && req.files[0].mimetype !== 'application/json'){
76
	 console.error("No proper file type");
77
        res.status(500).send(getResponse(500, "No proper file type"));
78
    }else if ((!type || type == 'csv') && req.files[0].mimetype !== 'text/csv' && req.files[0].mimetype !== 'application/vnd.ms-excel') {
79
        console.error("No proper file type");
80
        res.status(500).send(getResponse(500, "No proper file type"));
81
    } else {
82
        res.download(filepath);
83
        setTimeout(function () {
84
            deleteFile(filepath);
85
        }, 3000);
86
//        deleteFile(filepath);
87
    }
88

    
89
});
90

    
91
app.post('/upload/stakeholder/:id', upload.single('photo'), (req, res) => {
92
    sendFile(req, res,  (result) => {
93
        return isAdminOrCurator(result.edu_person_entitlements);
94
    });
95
});
96

    
97
app.post('/upload/:id', upload.single('photo'), (req, res) => {
98
    sendFile(req, res,  (result) => {
99
        return result.sub.indexOf(req.params.id) !== -1 || isAdminOrCurator(result.edu_person_entitlements);
100
    });
101
});
102

    
103
app.get('/download/:filename', function (req, res) {
104
    res.download('./uploads/' + req.params.filename);
105
});
106

    
107
app.get('/tiny', function (req, res) {
108
    TinyURL.shorten(req.query.url, function (res1, err) {
109
        if (err)
110
            console.log(err)
111
        if (res1 !== 'Error') {
112
            res.send(res1);
113
        } else {
114
            res.send(req.query.url);
115
        }
116
    });
117
});
118

    
119
app.delete('/delete/:filename', function (req, res) {
120
    const token = req.cookies['AccessToken'];
121
    if (!token) {
122
        res.status(401).send(getResponse(401, "Unauthorized"));
123
    } else {
124
        http.get(auth + token, function (resp) {
125
            var responseString = "";
126
            resp.on("data", function (data) {
127
                responseString += data;
128
            });
129
            resp.on("end", function () {
130
                var result = JSON.parse(responseString);
131
                if (result.error) {
132
                    res.status(401).send(getResponse(401, "Unauthorized"));
133
                } else {
134
                    // if user id is on filename or is Admin delete file else unauthorized.
135
                    if (result.sub.indexOf(req.params.filename.split('-')[0]) !== -1 || isAdminOrCurator(result.edu_person_entitlements)) {
136
                        deleteFile('./uploads/' + req.params.filename);
137
                        return res.status(200).send(getResponse(200, "File Deleted Successfully"));
138
                    } else {
139
                        res.status(401).send(getResponse(401, "Unauthorized"));
140
                    }
141
                }
142
            });
143
        });
144
    }
145
});
146

    
147
const server = app.listen(8000, function () {
148
    console.log("Listening on port %s...", server.address().port);
149
});
150

    
151
function sendFile(req, res, authorized) {
152
    const token = req.cookies['AccessToken'];
153
    const file = req.file;
154
    var filepath = (localPath ? "." : __dirname) + "/" + file.path;
155
    if (!token) {
156
        res.status(401).send(getResponse(401, "Unauthorized"));
157
        deleteFile(filepath);
158
    } else if (!file || (file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png')) {
159
        res.status(500).send(getResponse(500, "No image file type"));
160
        deleteFile(filepath);
161
    } else if (file.size > maxsize) {
162
        res.status(500).send(getResponse(500, "Exceeds file size limit"));
163
        deleteFile(filepath);
164
    } else {
165
        http.get(auth + token, function (resp) {
166
            var responseString = "";
167
            resp.on("data", function (data) {
168
                responseString += data;
169
            });
170
            resp.on("end", function () {
171
                var result = JSON.parse(responseString);
172
                if (result.error) {
173
                    res.status(401).send(getResponse(401, "Unauthorized"));
174
                    deleteFile(filepath);
175
                } else {
176
                    if (authorized(result)) {
177
                        res.send(file);
178
                    } else {
179
                        res.status(401).send(getResponse(401, "Unauthorized"));
180
                        deleteFile(filepath);
181
                    }
182
                }
183
            });
184
        });
185
    }
186
}
187

    
188
function getResponse(code, message) {
189
    var response = {};
190
    response["code"] = code;
191
    response["message"] = message;
192
    return response;
193
}
194

    
195
function deleteFile(filepath) {
196
    const fs = require('fs');
197
    fs.stat(filepath, function (err, stats) {
198
        console.log(stats); //here we got all information of file in stats variable
199

    
200
        if (err) {
201
            return console.error(err);
202
        }
203

    
204
        fs.unlink(filepath, function (err) {
205
            if (err) return console.log(err);
206
            console.log('file deleted successfully');
207
        });
208
    });
209
}
210

    
211
function isAdminOrCurator(roles) {
212
    var isAdmin = false;
213
    var isCurator = false;
214
    for (var i = 0; i < roles.length; i++) {
215
        if (roles[i] === 'urn:geant:openaire.eu:group:Portal+Administrator#aai.openaire.eu') {
216
            isAdmin = true;
217
        }
218
        if (roles[i] === 'urn:geant:openaire.eu:group:Curator+-+Community#aai.openaire.eu') {
219
            isCurator = true;
220
        }
221
    }
222
    return isAdmin || isCurator;
223
}
224

    
225
function checkCookies(request) {
226
    var valid = true;
227
    var cookieValue = request.cookies.AccessToken;
228
    if (cookieValue === undefined || cookieValue === '') {
229
        console.log("no cookie available");
230
        valid = false;
231
    } else if (!hasValidOrigin(request.headers.origin)) {
232
        console.log("no proper origin");
233
        valid = false;
234
    }
235
    return valid;
236
}
237

    
238

    
239
function hasValidOrigin(origin) {
240
    if (origin !== undefined && origin.indexOf(originServer) !== -1) {
241
        return true;
242
    } else {
243
        console.log("Not valid origin. Origin server is \"" + origin +
244
            "\", but expected value is \"" + originServer +
245
            "\". If the expected value is not right, check originServer variable.");
246
        return false;
247
    }
248
}
(6-6/6)