JWTokenApi.java 9.76 KB
Newer Older
1
package web.multitask.trismegistoservices.api;
2 3 4 5 6

import org.json.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
7
import web.multitask.trismegistoservices.model.User;
8
import web.multitask.trismegistoservices.repository.UserRepository;
9
import web.multitask.trismegistoservices.singleton.TokenSingleton;
10
import web.multitask.trismegistoservices.utils.JWTokenUtil;
11

12
import java.math.BigInteger;
13 14
import java.text.SimpleDateFormat;
import java.util.Date;
15
import java.util.Objects;
16

17 18 19 20 21 22 23 24
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@RestController
@RequestMapping("/token")
@CrossOrigin
class JWTokenApi {

25 26
    private final UserRepository userRepo = new UserRepository();

27
    private final JWTokenUtil jwtTokenUtil;
28 29
    private final TokenSingleton tokenSingleton;

30
    public JWTokenApi(JWTokenUtil jwtTokenUtil, TokenSingleton tokenSingleton) {
31 32 33 34
        this.jwtTokenUtil = jwtTokenUtil;
        this.tokenSingleton = tokenSingleton;
    }

35 36 37
    @PostMapping("/database")
    public ResponseEntity<?> setDatabase(@RequestBody String token) {
        JSONObject json = new JSONObject(token);
38
        if (json.has("db") && json.has("user") && json.has("password") && json.has("url")) {
39 40
            String dataToken = jwtTokenUtil.generateDataSource(json);
            return ResponseEntity.ok(new JSONObject().put("token", dataToken).put("message", "Generated").put("status", true).toMap());
41
        } else {
42 43 44
            return ResponseEntity.status(400).body(new JSONObject().put("token", "").put("message", "Invalid Data").put("status", false).toMap());
        }
    }
45 46 47 48 49 50

    @PostMapping("/authenticate")
    public ResponseEntity<?> createAuthenticationToken(@RequestBody String authenticationRequest) {
        JSONObject response;
        JSONObject json = new JSONObject(authenticationRequest);
        String username = json.getString("username");
51 52 53 54 55 56
        try {
            UserDetails userDetails = userRepo.findByUsername(username);
            if (!Objects.equals(userDetails.getPassword(), json.getString("password"))) {
                response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false);
                return ResponseEntity.status(401).body(response.toMap());
            } else {
57
                boolean onelife = json.optBoolean("onelife", false);
58 59
                String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)), onelife);
                if (onelife) {
60 61
                    tokenSingleton.addToken(generatedToken);
                }
62
                return ResponseEntity.ok(new JSONObject().put("token", generatedToken).put("message", "Generated").put("status", true).toMap());
63 64
            }
        } catch (Exception e) {
65 66 67
            response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false);
            return ResponseEntity.status(401).body(response.toMap());
        }
68 69 70 71 72
    }

    @PostMapping("/validate")
    public ResponseEntity<?> validateToken(@RequestBody String token) {
        JSONObject json = new JSONObject(token);
73 74
        JSONObject response = new JSONObject();

75 76 77 78 79 80
        boolean isTokenExpired = jwtTokenUtil.isTokenExpired(json.getString("token"));
        if (isTokenExpired) {
            response.put("message", "Expired Token").put("status", false);
            return ResponseEntity.status(403).body(response.toMap());
        }

81 82
        boolean oneLifeToken = tokenSingleton.isTokenAvailable(json.getString("token"));

83
        if (oneLifeToken) {
84 85 86 87 88 89 90
            response.put("message", "1-life Token is still up").put("status", true);
            return ResponseEntity.ok(response.toMap());
        }

        boolean validToken = jwtTokenUtil.validateToken(json.getString("token"));
        if (!validToken) {
            response.put("message", "This token doesn't exist, it might be created on malicious purposes").put("status", false);
91
            return ResponseEntity.status(401).body(response.toMap());
92
        }
93 94 95 96 97 98 99 100 101

        String dataToken = jwtTokenUtil.getDataToken(json.getString("token"));
        if (dataToken == null) {
            response.put("message", "Invalid Token").put("status", false);
            return ResponseEntity.status(401).body(response.toMap());
        }

        response.put("message", "Valid Token").put("status", true);
        return ResponseEntity.ok(response.toMap());
102 103 104 105 106 107 108 109 110
    }

    @PostMapping("/service/authenticate")
    public ResponseEntity<?> generateToken(@RequestBody String token) {
        JSONObject json = new JSONObject(token);
        UserDetails userDetails = userRepo.findByUsername(json.getString("username"));
        if (userDetails == null) {
            return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
        } else if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("SERVICE"))) {
111
            boolean onelife = json.optBoolean("onelife", false);
112 113
            String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)), false);
            if (onelife) {
114 115
                tokenSingleton.addToken(generatedToken);
            }
116
            return ResponseEntity.ok(new JSONObject().put("token", generatedToken).put("message", "Generated").put("status", true).toMap());
117 118 119 120 121
        } else {
            return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
        }
    }

122 123 124
    @PostMapping("/remaining")
    public ResponseEntity<?> remainingTime(@RequestBody String token) {
        JSONObject json = new JSONObject(token);
125
        try {
126 127 128
            Long remaining = jwtTokenUtil.getExperyTime(json.getString("token"));
            Date expirationDate = new Date(System.currentTimeMillis() + remaining);
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
129
            return ResponseEntity.ok(new JSONObject().put("remaining", remaining).put("message", "OK").put("expiration", dateFormat.format(expirationDate)).put("status", true).toMap());
130 131 132
        } catch (Exception e) {
            return ResponseEntity.status(401).body(new JSONObject().put("remaining", 0).put("message", "Invalid Token").put("status", false).toMap());
        }
133 134
    }

135 136 137 138 139
    @PostMapping("/tokenize")
    public ResponseEntity<?> tokenize(@RequestBody String data) {
        JSONObject json = new JSONObject(data);
        try {
            boolean onelife = json.optBoolean("onelife", false);
140
            BigInteger ms = json.optBigInteger("ms", BigInteger.valueOf(3600000));
141 142 143 144 145 146
            if (json.optBoolean("onelife", false)) {
                json.remove("onelife");
            }
            if (json.has("ms")) {
                json.remove("ms");
            }
147
            String tokenized = jwtTokenUtil.tokenizeData(json.toString(), ms, onelife);
148
            if (onelife) {
149 150 151 152 153 154 155 156 157
                tokenSingleton.addToken(tokenized);
            }
            return ResponseEntity.ok(new JSONObject().put("token", tokenized).put("message", "OK").put("status", true).toMap());
        } catch (Exception e) {
            return ResponseEntity.status(400).body(new JSONObject().put("token", "").put("message", e.getMessage()).put("status", false).toMap());
        }
    }

    @PostMapping("/detokenize")
158 159 160 161
    public ResponseEntity<?> detokenize(@RequestBody String tokenBody) {
        JSONObject json = new JSONObject(tokenBody);
        String token = json.getString("token");
        boolean doConsume = json.optBoolean("consume", false);
162
        try {
163 164
            if (jwtTokenUtil.isTokenExpired(token)) {
                return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Token has expired").put("status", false).toMap());
165
            } else {
166 167
                if (!tokenSingleton.isTokenAvailable(token)) {
                    return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "token has been already consumed").put("status", false).toMap());
168
                } else {
169 170 171 172 173 174 175 176
                    String detokenized = jwtTokenUtil.detokenizeData(token, doConsume);
                    if(detokenized.isEmpty()){
                        return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Invalid Token").put("status", false).toMap());
                    }else{
                        if (doConsume) {
                            tokenSingleton.consumeToken(token);
                        }
                    }
177 178 179
                    return ResponseEntity.ok(new JSONObject().put("data", detokenized).put("message", "OK").put("status", true).toMap());
                }
            }
180 181 182 183 184 185 186 187 188
        } catch (Exception e) {
            return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", e.getMessage()).put("status", false).toMap());
        }
    }

    @PostMapping("/consume")
    public ResponseEntity<?> consumeToken(@RequestBody String token) {
        JSONObject json = new JSONObject(token);
        try {
189
            if (tokenSingleton.consumeToken(json.getString("token"))) {
190
                return ResponseEntity.ok(new JSONObject().put("message", "OK").put("status", true).toMap());
191
            } else {
192 193 194 195 196 197
                return ResponseEntity.status(400).body(new JSONObject().put("message", "Invalid Token").put("status", false).toMap());
            }
        } catch (Exception e) {
            return ResponseEntity.status(400).body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
        }
    }
198
}