Skip to content

Commit 46d2c47

Browse files
committed
Check expiry of invitation link
1 parent 0fe5bc7 commit 46d2c47

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public enum BizError {
105105
ID_NOT_EXIST(500, 5620),
106106
DUPLICATE_AUTH_CONFIG_ADDITION(400, 5621),
107107
EMAIL_PROVIDER_DISABLED(403, 5622),
108+
LINK_EXPIRED(401, 5623),
108109

109110

110111
// asset related, code range 5700 - 5799

server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ UNABLE_TO_FIND_VALID_ORG=Cannot find a valid workspace for current user.
1919
USER_BANNED=Current account is frozen.
2020
SENDING_EMAIL_FAILED=Email could not be sent. Please check the smtp settings for the org.
2121
TOKEN_EXPIRED=Token to reset the password has expired
22+
LINK_EXPIRED=Link has expired
2223
INVALID_TOKEN=Invalid token received for password reset request
2324
# invitation
2425
INVALID_INVITATION_CODE=Invitation code not found.

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.lowcoder.domain.authentication.FindAuthConfig;
2424
import org.lowcoder.domain.authentication.context.AuthRequestContext;
2525
import org.lowcoder.domain.authentication.context.FormAuthRequestContext;
26+
import org.lowcoder.domain.invitation.service.InvitationService;
2627
import org.lowcoder.domain.organization.model.OrgMember;
2728
import org.lowcoder.domain.organization.model.Organization;
2829
import org.lowcoder.domain.organization.model.OrganizationDomain;
@@ -41,6 +42,8 @@
4142
import reactor.core.publisher.Flux;
4243
import reactor.core.publisher.Mono;
4344

45+
import java.time.Duration;
46+
import java.time.Instant;
4447
import java.util.*;
4548
import java.util.function.Function;
4649
import java.util.function.Predicate;
@@ -69,6 +72,7 @@ public class AuthenticationApiServiceImpl implements AuthenticationApiService {
6972
private final OrgMemberService orgMemberService;
7073
private final JWTUtils jwtUtils;
7174
private final AuthProperties authProperties;
75+
private final InvitationService invitationService;
7276

7377
@Override
7478
public Mono<AuthUser> authenticateByForm(String loginId, String password, String source, boolean register, String authId, String orgId) {
@@ -120,7 +124,18 @@ protected Mono<AuthUser> authenticate(String authId, @Deprecated String source,
120124
@Override
121125
public Mono<Void> loginOrRegister(AuthUser authUser, ServerWebExchange exchange,
122126
String invitationId, boolean linKExistingUser) {
123-
return updateOrCreateUser(authUser, linKExistingUser, false)
127+
Mono<Boolean> expiryCheckMono;
128+
if(invitationId != null && !invitationId.trim().isEmpty()) {
129+
expiryCheckMono = invitationService.getById(invitationId)
130+
.handle((invitation, sink) -> {
131+
boolean expired = Instant.now().isAfter(invitation.getCreatedAt().plus(Duration.ofHours(12)));
132+
if(expired) sink.error(new BizException(LINK_EXPIRED, "LINK_EXPIRED"));
133+
sink.next(true);
134+
});
135+
} else {
136+
expiryCheckMono = Mono.just(true);
137+
}
138+
return expiryCheckMono.then(updateOrCreateUser(authUser, linKExistingUser, false)
124139
.delayUntil(user -> ReactiveSecurityContextHolder.getContext()
125140
.doOnNext(securityContext -> securityContext.setAuthentication(AuthenticationUtils.toAuthentication(user))))
126141
// save token and set cookie
@@ -148,7 +163,7 @@ public Mono<Void> loginOrRegister(AuthUser authUser, ServerWebExchange exchange,
148163
return invitationApiService.inviteUser(invitationId);
149164
})
150165
// publish event
151-
.then(businessEventPublisher.publishUserLoginEvent(authUser.getSource()));
166+
.then(businessEventPublisher.publishUserLoginEvent(authUser.getSource())));
152167
}
153168

154169
public Mono<User> updateOrCreateUser(AuthUser authUser, boolean linkExistingUser, boolean isSuperAdmin) {

0 commit comments

Comments
 (0)