1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.opencastproject.kernel.security;
23
24 import org.apache.commons.io.IOUtils;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27 import org.springframework.security.crypto.codec.Hex;
28
29 import java.io.File;
30 import java.io.FileInputStream;
31 import java.io.IOException;
32 import java.net.InetAddress;
33 import java.net.UnknownHostException;
34 import java.nio.charset.StandardCharsets;
35 import java.security.MessageDigest;
36 import java.security.NoSuchAlgorithmException;
37 import java.util.Arrays;
38 import java.util.Objects;
39
40
41
42
43 public final class SystemTokenRememberMeUtils {
44
45 private static final Logger logger = LoggerFactory.getLogger(SystemTokenRememberMeUtils.class);
46
47
48 private static final String DEFAULT_COOKIE_KEY = "opencast";
49
50 private SystemTokenRememberMeUtils() {
51 }
52
53 public static String augmentKey(String key) {
54
55 if (!DEFAULT_COOKIE_KEY.equals(key)) {
56 logger.debug("The default cookie key '{}' is not in use. The given key won't be augmented.", DEFAULT_COOKIE_KEY);
57 return key;
58 }
59
60
61 StringBuilder keyBuilder = new StringBuilder(Objects.toString(key, ""));
62
63
64
65 try {
66 keyBuilder.append(InetAddress.getLocalHost());
67 } catch (UnknownHostException e) {
68
69 }
70
71
72
73
74 for (String procFile: Arrays.asList("/proc/version", "/proc/partitions")) {
75 try (FileInputStream fileInputStream = new FileInputStream(new File(procFile))) {
76 keyBuilder.append(IOUtils.toString(fileInputStream, StandardCharsets.UTF_8));
77 } catch (IOException e) {
78
79 }
80 }
81
82
83
84
85 key = keyBuilder.toString();
86 if (key.isEmpty()) {
87 logger.warn("Could not generate semi-persistent remember-me key. Will generate a non-persistent random one.");
88 key = Double.toString(Math.random());
89 }
90 logger.debug("Remember me key before hashing: {}", key);
91
92
93 try {
94 MessageDigest digest = MessageDigest.getInstance("SHA-512");
95 key = new String(Hex.encode(digest.digest(key.getBytes())));
96 } catch (NoSuchAlgorithmException e) {
97 logger.warn("No SHA-512 algorithm available!");
98 }
99 logger.debug("Calculated remember me key: {}", key);
100 return key;
101 }
102 }