|
14 | 14 | import edu.harvard.iq.dataverse.authorization.providers.oauth2.OAuth2UserRecord; |
15 | 15 | import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; |
16 | 16 | import edu.harvard.iq.dataverse.util.BundleUtil; |
| 17 | +import edu.harvard.iq.dataverse.util.xml.XmlUtil; |
| 18 | + |
17 | 19 | import java.io.IOException; |
18 | 20 | import java.io.StringReader; |
19 | 21 | import java.util.*; |
@@ -111,52 +113,50 @@ final protected OAuth2UserRecord getUserRecord(@NotNull String responseBody, @No |
111 | 113 |
|
112 | 114 | @Override |
113 | 115 | protected ParsedUserResponse parseUserResponse(String responseBody) { |
114 | | - DocumentBuilderFactory dbFact = DocumentBuilderFactory.newInstance(); |
115 | 116 | try ( StringReader reader = new StringReader(responseBody)) { |
116 | | - DocumentBuilder db = dbFact.newDocumentBuilder(); |
117 | | - Document doc = db.parse( new InputSource(reader) ); |
118 | | - |
119 | | - String firstName = getNodes(doc, "person:person", "person:name", "personal-details:given-names" ) |
120 | | - .stream().findFirst().map( Node::getTextContent ) |
121 | | - .map( String::trim ).orElse(""); |
122 | | - String familyName = getNodes(doc, "person:person", "person:name", "personal-details:family-name") |
123 | | - .stream().findFirst().map( Node::getTextContent ) |
124 | | - .map( String::trim ).orElse(""); |
125 | | - |
126 | | - // fallback - try to use the credit-name |
127 | | - if ( (firstName + familyName).equals("") ) { |
128 | | - firstName = getNodes(doc, "person:person", "person:name", "personal-details:credit-name" ) |
129 | | - .stream().findFirst().map( Node::getTextContent ) |
130 | | - .map( String::trim ).orElse(""); |
131 | | - } |
132 | | - |
133 | | - String primaryEmail = getPrimaryEmail(doc); |
134 | | - List<String> emails = getAllEmails(doc); |
135 | | - |
136 | | - // make the username up |
137 | | - String username; |
138 | | - if ( primaryEmail.length() > 0 ) { |
139 | | - username = primaryEmail.split("@")[0]; |
140 | | - } else { |
141 | | - username = firstName.split(" ")[0] + "." + familyName; |
| 117 | + DocumentBuilder db = XmlUtil.getSecureDocumentBuilder(); |
| 118 | + if (db != null) { |
| 119 | + Document doc = db.parse(new InputSource(reader)); |
| 120 | + |
| 121 | + String firstName = getNodes(doc, "person:person", "person:name", "personal-details:given-names") |
| 122 | + .stream().findFirst().map(Node::getTextContent) |
| 123 | + .map(String::trim).orElse(""); |
| 124 | + String familyName = getNodes(doc, "person:person", "person:name", "personal-details:family-name") |
| 125 | + .stream().findFirst().map(Node::getTextContent) |
| 126 | + .map(String::trim).orElse(""); |
| 127 | + |
| 128 | + // fallback - try to use the credit-name |
| 129 | + if ((firstName + familyName).equals("")) { |
| 130 | + firstName = getNodes(doc, "person:person", "person:name", "personal-details:credit-name") |
| 131 | + .stream().findFirst().map(Node::getTextContent) |
| 132 | + .map(String::trim).orElse(""); |
| 133 | + } |
| 134 | + |
| 135 | + String primaryEmail = getPrimaryEmail(doc); |
| 136 | + List<String> emails = getAllEmails(doc); |
| 137 | + |
| 138 | + // make the username up |
| 139 | + String username; |
| 140 | + if (primaryEmail.length() > 0) { |
| 141 | + username = primaryEmail.split("@")[0]; |
| 142 | + } else { |
| 143 | + username = firstName.split(" ")[0] + "." + familyName; |
| 144 | + } |
| 145 | + username = username.replaceAll("[^a-zA-Z0-9.]", ""); |
| 146 | + |
| 147 | + // returning the parsed user. The user-id-in-provider will be added by the caller, since ORCiD passes it |
| 148 | + // on the access token response. |
| 149 | + // Affiliation added after a later call. |
| 150 | + final ParsedUserResponse userResponse = new ParsedUserResponse( |
| 151 | + new AuthenticatedUserDisplayInfo(firstName, familyName, primaryEmail, "", ""), null, username); |
| 152 | + userResponse.emails.addAll(emails); |
| 153 | + |
| 154 | + return userResponse; |
142 | 155 | } |
143 | | - username = username.replaceAll("[^a-zA-Z0-9.]",""); |
144 | | - |
145 | | - // returning the parsed user. The user-id-in-provider will be added by the caller, since ORCiD passes it |
146 | | - // on the access token response. |
147 | | - // Affilifation added after a later call. |
148 | | - final ParsedUserResponse userResponse = new ParsedUserResponse( |
149 | | - new AuthenticatedUserDisplayInfo(firstName, familyName, primaryEmail, "", ""), null, username); |
150 | | - userResponse.emails.addAll(emails); |
151 | | - |
152 | | - return userResponse; |
153 | | - |
154 | 156 | } catch (SAXException ex) { |
155 | 157 | logger.log(Level.SEVERE, "XML error parsing response body from ORCiD: " + ex.getMessage(), ex); |
156 | 158 | } catch (IOException ex) { |
157 | 159 | logger.log(Level.SEVERE, "I/O error parsing response body from ORCiD: " + ex.getMessage(), ex); |
158 | | - } catch (ParserConfigurationException ex) { |
159 | | - logger.log(Level.SEVERE, "While parsing the ORCiD response: Bad parse configuration. " + ex.getMessage(), ex); |
160 | 160 | } |
161 | 161 |
|
162 | 162 | return null; |
|
0 commit comments