Project

General

Profile

1
var express = require("express");
2
var bodyParser = require("body-parser");
3
var multer = require("multer");
4
var app = express();
5
// TODO change to https on production
6
var http = require("http");
7

    
8

    
9
// Properties
10
var auth = 'http://scoobydoo.di.uoa.gr:8080/dnet-openaire-users-1.0.0-SNAPSHOT/api/users/getUserInfo?accessToken=';
11
var originServer = '.di.uoa.gr';
12

    
13
var storage = multer.diskStorage({
14
    destination: function (req, file, cb) {
15
        cb(null, 'uploads')
16
    },
17
    filename: function (req, file, cb) {
18
        if(req.params.id) {
19
            cb(null, req.params.id + '-' + new Date().getTime() + '.' + file.originalname.split('.').pop());
20
        } else {
21
            cb(null, file.originalname);
22
        }
23
    }
24
});
25

    
26
var upload = multer({ storage: storage })
27

    
28
app.use(bodyParser.json());
29
app.use(bodyParser.urlencoded({extended: true}));
30

    
31
app.use(function (req, res, next) {
32
    if(req.method !== 'GET') {
33
        if(req.headers.origin && hasValidOrigin(req.headers.origin)) {
34
            res.header('Access-Control-Allow-Origin', req.headers.origin);
35
            res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-xsrf-token');
36
            res.header('Access-Control-Allow-Methods', 'OPTIONS, POST, DELETE');
37
            res.header('Access-Control-Allow-Credentials', true);
38
            next();
39
        } else {
40
            res.header('Access-Control-Allow-Origin', '*');
41
            res.header('Access-Control-Allow-Credentials', true);
42
            res.header('Vary', 'Origin');
43
            res.status(403).send(getResponse(403, "Forbidden: You don't have permission to access. Maybe you are not registered."));
44
        }
45
    } else {
46
        res.header('Access-Control-Allow-Origin', '*');
47
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-xsrf-token');
48
        next();
49
    }
50
});
51

    
52
app.post("/upload", upload.array("uploads[]", 12), function (req, res) {
53
    var filepath = "./" + req.files[0].path;
54
    if (req.files[0].mimetype !== 'text/csv') {
55
        console.error("No proper file type");
56
        res.status(500).send(getResponse(500, "No proper file type"));
57
    } else {
58
        //send file
59
        res.download(filepath);
60
    }
61
    deleteFile(filepath);
62

    
63
});
64

    
65
app.post('/upload/:id', upload.single('photo'), (req, res) => {
66
    const token = req.headers['x-xsrf-token'];
67
    const file = req.file;
68
    const filepath = "./" + file.path;
69
    if(!token) {
70
        res.status(401).send(getResponse(401, "Unauthorized"));
71
        deleteFile(filepath);
72
    }
73
    else if (!file || (file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png')) {
74
        res.status(500).send(getResponse(500, "No image file type"));
75
        deleteFile(filepath);
76
    }
77
    else {
78
        http.get(auth+token, function (resp) {
79
            var responseString = "";
80
            resp.on("data", function (data) {
81
                responseString += data;
82
            });
83
            resp.on("end", function () {
84
                var result = JSON.parse(responseString);
85
                if(result.error) {
86
                    res.status(401).send(getResponse(401, "Unauthorized"));
87
                    deleteFile(filepath);
88
                } else {
89
                    // if user id contains id param or is Admin or Curator keep file and send information, else delete it.
90
                    if(result.sub.indexOf(req.params.id) !== -1 || isAdminOrCurator(result.edu_person_entitlements)) {
91
                        res.send(file);
92
                    } else {
93
                        res.status(401).send(getResponse(401, "Unauthorized"));
94
                        deleteFile(filepath);
95
                    }
96
                }
97
            });
98
        });
99
    }
100

    
101
});
102

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

    
107
app.delete('/delete/:filename', function (req, res) {
108
    const token = req.headers['x-xsrf-token'];
109
    if(!token) {
110
        res.status(401).send(getResponse(401, "Unauthorized"));
111
    } else {
112
        http.get(auth+token, function (resp) {
113
            var responseString = "";
114
            resp.on("data", function (data) {
115
                responseString += data;
116
            });
117
            resp.on("end", function () {
118
                var result = JSON.parse(responseString);
119
                if(result.error) {
120
                    res.status(401).send(getResponse(401, "Unauthorized"));
121
                } else {
122
                    // if user id is on filename or is Admin delete file else unauthorized.
123
                    if(result.sub.indexOf(req.params.filename.split('-')[0]) !== -1 || isAdminOrCurator(result.edu_person_entitlements)) {
124
                        deleteFile('./uploads/' + req.params.filename);
125
                        return res.status(200).send(getResponse(200, "File Deleted Successfully"));
126
                    } else {
127
                        res.status(401).send(getResponse(401, "Unauthorized"));
128
                    }
129
                }
130
            });
131
        });
132
    }
133
});
134

    
135
const server = app.listen(8000, function () {
136
    console.log("Listening on port %s...", server.address().port);
137
});
138

    
139
function getResponse(code, message) {
140
    var response = {};
141
    response["code"] = code;
142
    response["message"] = message;
143
    return response;
144
}
145

    
146
function deleteFile(filepath) {
147
    const fs = require('fs');
148
    fs.stat(filepath, function (err, stats) {
149
        console.log(stats); //here we got all information of file in stats variable
150

    
151
        if (err) {
152
            return console.error(err);
153
        }
154

    
155
        fs.unlink(filepath, function (err) {
156
            if (err) return console.log(err);
157
            console.log('file deleted successfully');
158
        });
159
    });
160
}
161

    
162
function isAdminOrCurator(roles) {
163
    var isAdmin = false;
164
    var isCurator = false;
165
    for(var i = 0; i < roles.length; i++) {
166
        if(roles[i] === 'urn:geant:openaire.eu:group:Portal+Administrator#aai.openaire.eu') {
167
            isAdmin = true;
168
        }
169
        if(roles[i] === 'urn:geant:openaire.eu:group:Curator+-+Community#aai.openaire.eu') {
170
            isCurator = true;
171
        }
172
    }
173
    return isAdmin || isCurator;
174
}
175

    
176

    
177
function hasValidOrigin(origin) {
178
    if(origin !== undefined && origin.indexOf(originServer) !== -1) {
179
        return true;
180
    } else {
181
        console.log("Not valid origin. Origin server is \"" + origin +
182
            "\", but expected value is \"" + originServer +
183
            "\". If the expected value is not right, check originServer variable.");
184
        return false;
185
    }
186
}
187

    
(2-2/2)