Skip to content

Commit 93d29ab

Browse files
committed
Fixes #67
1 parent f5317ea commit 93d29ab

8 files changed

Lines changed: 70 additions & 24 deletions

File tree

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
import React from "react";
1+
import React, {useState} from "react";
22
import "./ClipBoardCopy.scss";
33
import Duplicate from "@surfnet/sds//icons/functional-icons/duplicate.svg";
44
import {CopyToClipboard} from "react-copy-to-clipboard";
5+
import I18n from "../locale/I18n";
56

67
export default function ClipBoardCopy({txt}) {
8+
const [copied, setCopied] = useState(false);
9+
710
return (
8-
<CopyToClipboard text={txt}>
9-
<section
10-
className={`copy-to-clipboard`}
11-
onClick={e => {
12-
const me = e.target;
13-
me.classList.add("copied");
14-
setTimeout(() => me.classList.remove("copied"), 1250);
15-
}}>
16-
<Duplicate/>
17-
</section>
18-
</CopyToClipboard>
11+
<>
12+
<CopyToClipboard text={txt}>
13+
<section
14+
className="copy-to-clipboard"
15+
onClick={e => {
16+
const me = e.target;
17+
me.classList.add("copied");
18+
setCopied(true);
19+
setTimeout(() => {
20+
me.classList.remove("copied");
21+
setCopied(false);
22+
}, 1250);
23+
}}>
24+
<Duplicate/>
25+
</section>
26+
</CopyToClipboard>
27+
<div className={`copied ${copied ? "" : "hidden"}`}>{I18n.t("forms.copied")}</div>
28+
</>
1929
);
2030

2131
}

client/src/components/ClipBoardCopy.scss

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ section.copy-to-clipboard {
66
position: absolute;
77
right: 10px;
88
top: 14px;
9+
910
svg {
1011
margin: 0;
1112
width: 18px;
@@ -15,14 +16,30 @@ section.copy-to-clipboard {
1516
&:hover {
1617
color: var(--sds--color--black);
1718
}
18-
transition: width .4s ease, color .4s ease ;
19+
20+
transition: color .4s ease;
1921
}
2022

2123
&.copied, svg.copied {
22-
width: 22px;
2324
color: var(--sds--color--green--400);
2425
}
2526

2627
}
2728

29+
div.copied {
30+
position: absolute;
31+
background-color: var(--sds--color--gray--300);
32+
color: white;
33+
font-size: 13px;
34+
padding: 4px;
35+
border-radius: $br;
36+
right: -6px;
37+
top: -20px;
38+
transition: opacity .4s ease;
39+
40+
&.hidden {
41+
opacity: 0;
42+
}
43+
}
44+
2845

client/src/locale/en.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ const en = {
758758
moreLabel: "Show me more",
759759
lessLabel: "Show me less",
760760
you: "You",
761+
copied: "Copied"
761762
},
762763
footer: {
763764
terms: "Terms of Use",

client/src/pages/Connection.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const Connection = () => {
3232
const {applicationId, tab = "overview"} = useParams();
3333
const {user, arp, privacy} = useAppStore(state => state);
3434

35-
const [application, setApplication] = useState({});
35+
const [application, setApplication] = useState({organization: {}});
3636
const [profileOptions, setProfileOptions] = useState([]);
3737
const [currentTab, setCurrentTab] = useState(tab);
3838
const [connection, setConnection] = useState(null);
@@ -64,8 +64,8 @@ export const Connection = () => {
6464
breadcrumbPaths: [
6565
{path: "/home", value: I18n.t("breadCrumb.access"), menuItemName: "yourApps"},
6666
{
67-
path: `/organization/${application.organization.id}`,
68-
value: application.organization.name,
67+
path: `/organization/${res.organization.id}`,
68+
value: res.organization.name,
6969
menuItemName: "yourApps"
7070
},
7171
{path: `/application/${applicationId}`, value: I18n.t("breadCrumb.applications")},

server/src/main/java/access/api/ApplicationController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,17 @@ public ResponseEntity<Application> update(User user, @Validated @RequestBody App
124124
confirmApplicationMembership(user, organization, application, Authority.MEMBER);
125125

126126
//If the metadata has changed, we must propagate this to manage
127-
boolean metaDataHasChanged = application.getMetaData().equals(applicationData.getMetaData());
127+
boolean metaDataHasChanged = !application.getMetaData().equals(applicationData.getMetaData());
128128
//However, we first need to merge the data; otherwise the outdated application metadata is used
129129
application.merge(applicationData);
130130
//Upload base64 encoded image to s3 storage if the logo has changed
131131
String logoUrl = application.getLogoUrl();
132132
if (StringUtils.hasText(logoUrl) && !logoUrl.startsWith("http")) {
133133
String url = s3Storage.uploadFile(logoUrl);
134134
application.setLogoUrl(url);
135+
metaDataHasChanged = true;
135136
}
136-
if (!metaDataHasChanged) {
137+
if (metaDataHasChanged) {
137138
application.getConnections().forEach(connection -> {
138139
Map<String, Object> provider = manage.saveProvider(connection);
139140
connection.updateRemoteManageData(provider);

server/src/main/java/access/api/ConnectionController.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
public class ConnectionController implements UserAccessRights {
4444

4545
private static final Log LOG = LogFactory.getLog(ConnectionController.class);
46+
private static final int SECRET_LENGTH = 36;
4647

4748
private final ConnectionRepository connectionRepository;
4849
private final ApplicationRepository applicationRepository;
@@ -135,7 +136,7 @@ public Map<String, String> secret(User user, @PathVariable("connectionId") Long
135136
user = this.reinitializeUser(user, userRepository);
136137
confirmApplicationMembership(user, organization, application, Authority.MEMBER);
137138

138-
String secret = passwordGenerator.generatePassword(36, rules);
139+
String secret = passwordGenerator.generatePassword(SECRET_LENGTH, rules);
139140
connection.getMetaData().put("secret", secret);
140141
saveConnection(connection);
141142

@@ -217,16 +218,27 @@ public ResponseEntity<Map<String, Integer>> delete(User user, @PathVariable("con
217218
private Connection saveConnection(Connection connection) {
218219
//Put / Post to Manage only if the status is not OPEN
219220
if (!connection.getStatus().equals(ConnectionStatus.OPEN)) {
220-
if (connection.getProtocol().equals(EntityType.oidc10_rp) &&
221-
!StringUtils.hasText((String) connection.getMetaData().get("secret")) &&
222-
connection.getMetaData().getOrDefault("pkce", false) == Boolean.FALSE) {
221+
boolean isPublicRelyingParty = connection.getProtocol().equals(EntityType.oidc10_rp) &&
222+
connection.getMetaData().getOrDefault("pkce", false) == Boolean.FALSE;
223+
boolean hasSecret = StringUtils.hasText((String) connection.getMetaData().get("secret")) ;
224+
if (isPublicRelyingParty && !hasSecret) {
223225
//generate secret but store the raw-text variant, because Manage encodes it
224-
String secret = passwordGenerator.generatePassword(36, rules);
226+
String secret = passwordGenerator.generatePassword(SECRET_LENGTH, rules);
225227
connection.getMetaData().put("secret", secret);
228+
connection.setSecretSet(true);
226229
}
227230

228231
Map<String, Object> provider = manage.saveProvider(connection);
229232
connection.updateRemoteManageData(provider);
233+
if (isPublicRelyingParty) {
234+
//We must store the encrypted secret, otherwise manage will keep encrypting it again and again
235+
Map<String, Object> data = (Map<String, Object>) provider.get("data");
236+
Map<String, Object> metaDataFields = (Map<String, Object>) data.get("metaDataFields");
237+
String secretFromManage = (String) metaDataFields.get("secret");
238+
if (StringUtils.hasText(secretFromManage) && secretFromManage.length() != SECRET_LENGTH) {
239+
connection.getMetaData().put("secret", secretFromManage);
240+
}
241+
}
230242

231243
List<Map<String, Object>> contactPersons = (List<Map<String, Object>>) connection.getMetaData().get("contactPersons");
232244
if (!CollectionUtils.isEmpty(contactPersons)) {

server/src/main/java/access/model/Connection.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public class Connection implements NameHolder {
6161
@NotNull
6262
private ConnectionStatus status = ConnectionStatus.OPEN;
6363

64+
@Column(name = "secret_set")
65+
private boolean secretSet;
66+
6467
@Column(name = "manage_identifier")
6568
private String manageIdentifier;
6669

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE connections
2+
ADD COLUMN secret_set BOOLEAN NOT NULL DEFAULT 0;

0 commit comments

Comments
 (0)