This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 706f25c6d [OPENMEETINGS-2834] state is set and checked during OAuth 
login
706f25c6d is described below

commit 706f25c6d42169f3e0502d4559c18c474f326c50
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Sep 8 09:15:25 2026 +0700

    [OPENMEETINGS-2834] state is set and checked during OAuth login
---
 .../openmeetings/installation/ImportInitvalues.java     |  2 +-
 .../org/apache/openmeetings/web/app/UserManager.java    |  5 +++--
 .../org/apache/openmeetings/web/app/WebSession.java     | 10 ++++++++++
 .../apache/openmeetings/web/pages/auth/SignInPage.java  | 17 +++++++++++------
 4 files changed, 25 insertions(+), 9 deletions(-)

diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
 
b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
index 2643f3305..88bd3b16a 100644
--- 
a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
+++ 
b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
@@ -519,7 +519,7 @@ public class ImportInitvalues {
                                .setEnabled(false)
                                .setClientId(CLIENT_PLACEHOLDER)
                                .setClientSecret(SECRET_PLACEHOLDER)
-                               
.setRequestKeyUrl("https://oauth.yandex.ru/authorize?response_type=code&client_id={$client_id}";)
+                               
.setRequestKeyUrl("https://oauth.yandex.ru/authorize?response_type=code&client_id={$client_id}";)
 // &redirect_uri={$redirect_uri} is optional, can be taken from client_id
                                
.setRequestTokenUrl("https://oauth.yandex.ru/token";)
                                .setRequestTokenMethod(RequestTokenMethod.POST)
                                
.setRequestTokenAttributes("grant_type=authorization_code&code={$code}&client_id={$client_id}&client_secret={$client_secret}")
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
index 7391d9cce..17778dbe0 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
@@ -344,12 +344,13 @@ public class UserManager implements IUserManager {
                Map<String, String> params = new HashMap<>();
                params.put("{$client_id}", s.getClientId());
                params.put("{$redirect_uri}", getRedirectUri(s));
-               params.put("{$state}", randomUUID().toString());
                return params;
        }
 
        public static void showAuth(final OAuthServer s) {
-               String authUrl = prepareUrl(s.getRequestKeyUrl(), 
getInitParams(s));
+               final String state = randomUUID().toString();
+               WebSession.get().setOauthState(state);
+               String authUrl = prepareUrl(s.getRequestKeyUrl(), 
getInitParams(s)) + "&state=" + state;
                log.debug("redirectUrl={}", authUrl);
                throw new RedirectToUrlException(authUrl);
        }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 3ceb92044..f46231d87 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -118,6 +118,7 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
        private Long roomId = null;
        private Long recordingId = null;
        private boolean kickedByAdmin = false;
+       private String oauthState = null;
        private ExtendedClientProperties extProps = new 
ExtendedClientProperties();
        @Inject
        private ClientManager cm;
@@ -158,6 +159,7 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
                recordingId = null;
                tz = null;
                browserTz = null;
+               oauthState = null;
                extProps = new ExtendedClientProperties();
        }
 
@@ -430,6 +432,14 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
                return get().roomId;
        }
 
+       public String getOauthState() {
+               return oauthState;
+       }
+
+       public void setOauthState(String oauthState) {
+               this.oauthState = oauthState;
+       }
+
        public Invitation getInvitation() {
                return invitation;
        }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index 19cc0668f..85ed1b306 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -119,14 +119,19 @@ public class SignInPage extends BaseInitedPage {
 
        public SignInPage(PageParameters p) throws InterruptedException {
                super();
-               WebSession.get().checkToken(p.get(TOKEN_PARAM));
+               WebSession ws = WebSession.get();
+               ws.checkToken(p.get(TOKEN_PARAM));
                if (WebSession.get().isSignedIn()) {
                        setResponsePage(Application.get().getHomePage());
                }
-               StringValue oauthid = p.get("oauthid");
-               if (!oauthid.isEmpty()) { // oauth2 login
+               StringValue oauthId = p.get("oauthid");
+               StringValue oauthState = p.get("state");
+               if (!oauthId.isEmpty() && ws.getOauthState() != null && 
!oauthState.isEmpty()
+                               && 
ws.getOauthState().equals(oauthState.toString()))
+               { // oauth2 login
                        try {
-                               long serverId = oauthid.toLong(-1);
+                               ws.setOauthState(null);
+                               long serverId = oauthId.toLong(-1);
                                OAuthServer server = oauthDao.get(serverId);
                                log.debug("OAuthServer={}", server);
                                if (server == null) {
@@ -136,7 +141,7 @@ public class SignInPage extends BaseInitedPage {
 
                                User u = 
userManager.loginOAuth(p.get("code").toOptionalString(), server);
 
-                               if (u != null && WebSession.get().signIn(u)) {
+                               if (u != null && ws.signIn(u)) {
                                        
setResponsePage(Application.get().getHomePage());
                                } else {
                                        log.error("Failed to login via 
OAuth2!");
@@ -150,7 +155,7 @@ public class SignInPage extends BaseInitedPage {
                StringValue login = pp.getParameterValue("login"), password = 
pp.getParameterValue("password");
                if (!login.isEmpty() && !password.isEmpty()) {
                        try {
-                               if (WebSession.get().signIn(login.toString(), 
password.toString(), Type.USER, null)) {
+                               if (ws.signIn(login.toString(), 
password.toString(), Type.USER, null)) {
                                        
setResponsePage(Application.get().getHomePage());
                                } else {
                                        log.error("Failed to login using POST 
parameters passed");

Reply via email to