1 | package com.jsql.util; | |
2 | ||
3 | import com.jsql.model.InjectionModel; | |
4 | import org.apache.commons.codec.digest.DigestUtils; | |
5 | import org.apache.commons.lang3.StringUtils; | |
6 | import org.apache.logging.log4j.LogManager; | |
7 | import org.apache.logging.log4j.Logger; | |
8 | ||
9 | import java.net.MalformedURLException; | |
10 | import java.net.URI; | |
11 | import java.net.URISyntaxException; | |
12 | import java.net.URL; | |
13 | import java.net.http.HttpRequest.Builder; | |
14 | import java.util.AbstractMap.SimpleEntry; | |
15 | import java.util.Arrays; | |
16 | import java.util.Map; | |
17 | import java.util.stream.Collectors; | |
18 | ||
19 | public class DigestUtil { | |
20 | ||
21 | private static final Logger LOGGER = LogManager.getRootLogger(); | |
22 | ||
23 | private String tokenDigest = null; | |
24 | ||
25 | private final InjectionModel injectionModel; | |
26 | ||
27 | public DigestUtil(InjectionModel injectionModel) { | |
28 | this.injectionModel = injectionModel; | |
29 | } | |
30 | ||
31 | public void parseWwwAuthenticate(Map<String, String> mapResponse) { | |
32 | if ( | |
33 |
1
1. parseWwwAuthenticate : negated conditional → NO_COVERAGE |
mapResponse.containsKey(HeaderUtil.WWW_AUTHENTICATE_RESPONSE) |
34 |
1
1. parseWwwAuthenticate : negated conditional → NO_COVERAGE |
&& mapResponse.get(HeaderUtil.WWW_AUTHENTICATE_RESPONSE).trim().startsWith("Digest") |
35 | ) { | |
36 | String[] digestParts = StringUtils.split( | |
37 | mapResponse.get(HeaderUtil.WWW_AUTHENTICATE_RESPONSE).replaceAll("(?i)^\\s*Digest", StringUtils.EMPTY), | |
38 | "," | |
39 | ); | |
40 | ||
41 | Map<String, String> cookieValues = Arrays.stream(digestParts) | |
42 | .map(cookie -> { | |
43 | String[] cookieEntry = StringUtils.split(cookie, "="); | |
44 |
1
1. lambda$parseWwwAuthenticate$0 : replaced return value with null for com/jsql/util/DigestUtil::lambda$parseWwwAuthenticate$0 → NO_COVERAGE |
return new SimpleEntry<>( |
45 | cookieEntry[0].trim(), | |
46 | cookieEntry[1].trim() | |
47 | ); | |
48 | }) | |
49 | .collect( | |
50 | Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue) | |
51 | ); | |
52 | ||
53 | String realm = cookieValues.get("realm").replace("\"", StringUtils.EMPTY); | |
54 | String qop = cookieValues.get("qop").replace("\"", StringUtils.EMPTY); | |
55 | String nonce = cookieValues.get("nonce").replace("\"", StringUtils.EMPTY); | |
56 | ||
57 | try { | |
58 | String username = this.injectionModel.getMediatorUtils().getAuthenticationUtil().getUsernameAuthentication(); | |
59 | String password = this.injectionModel.getMediatorUtils().getAuthenticationUtil().getPasswordAuthentication(); | |
60 | String nc = "00000001"; | |
61 | String cnonce = "2ecb0e39da79fcb5aa6ffb1bd45cb3bb"; | |
62 | ||
63 | URL url = new URI(this.injectionModel.getMediatorUtils().getConnectionUtil().getUrlByUser()).toURL(); | |
64 | String path = url.getFile(); | |
65 | ||
66 | String ha1 = DigestUtils.md5Hex( | |
67 | String.format("%s:%s:%s", username, realm, password) | |
68 | ); | |
69 | String ha2 = DigestUtils.md5Hex( | |
70 | String.format("%s:%s", this.injectionModel.getMediatorUtils().getConnectionUtil().getTypeRequest(), path) | |
71 | ); | |
72 | String response = DigestUtils.md5Hex( | |
73 | String.format("%s:%s:%s:%s:%s:%s", ha1, nonce, nc, cnonce, qop, ha2) | |
74 | ); | |
75 | ||
76 | this.tokenDigest = String.format( | |
77 | "Digest username=\"%s\",realm=\"%s\",nonce=\"%s\",uri=\"%s\",cnonce=\"%s\",nc=%s,response=\"%s\",qop=\"%s\"", | |
78 | username, realm, nonce, path, cnonce, nc, response, qop | |
79 | ); | |
80 | } catch (MalformedURLException | URISyntaxException e) { | |
81 | LOGGER.error("Incorrect URL", e); | |
82 | } | |
83 | } | |
84 | } | |
85 | ||
86 | public void addHeaderToken(Builder httpRequest) { | |
87 |
1
1. addHeaderToken : negated conditional → NO_COVERAGE |
if (this.tokenDigest == null) { |
88 | return; | |
89 | } | |
90 | httpRequest.setHeader("Authorization", this.tokenDigest); | |
91 | } | |
92 | ||
93 | public boolean isDigest() { | |
94 |
2
1. isDigest : negated conditional → NO_COVERAGE 2. isDigest : replaced boolean return with true for com/jsql/util/DigestUtil::isDigest → NO_COVERAGE |
return this.tokenDigest != null; |
95 | } | |
96 | ||
97 | public void setTokenDigest(String tokenDigest) { | |
98 | this.tokenDigest = tokenDigest; | |
99 | } | |
100 | ||
101 | public String getTokenDigest() { | |
102 |
1
1. getTokenDigest : replaced return value with "" for com/jsql/util/DigestUtil::getTokenDigest → NO_COVERAGE |
return this.tokenDigest; |
103 | } | |
104 | } | |
Mutations | ||
33 |
1.1 |
|
34 |
1.1 |
|
44 |
1.1 |
|
87 |
1.1 |
|
94 |
1.1 2.2 |
|
102 |
1.1 |