Bläddra i källkod

fix: Various oauth issues

jamesread 7 månader sedan
förälder
incheckning
3d763a84df

+ 5 - 5
frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.d.ts

@@ -1,4 +1,4 @@
-// @generated by protoc-gen-es v2.10.0
+// @generated by protoc-gen-es v2.10.1
 // @generated from file olivetin/api/v1/olivetin.proto (package olivetin.api.v1, syntax proto3)
 /* eslint-disable */
 
@@ -1422,14 +1422,14 @@ export declare type OAuth2Provider = Message<"olivetin.api.v1.OAuth2Provider"> &
   title: string;
 
   /**
-   * @generated from field: string url = 2;
+   * @generated from field: string icon = 3;
    */
-  url: string;
+  icon: string;
 
   /**
-   * @generated from field: string icon = 3;
+   * @generated from field: string key = 4;
    */
-  icon: string;
+  key: string;
 };
 
 /**

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.js


+ 15 - 3
frontend/resources/vue/views/LoginView.vue

@@ -8,7 +8,7 @@
       <div v-if="hasOAuth" class="login-oauth2">
         <h3>OAuth Login</h3>
         <div class="oauth-providers">
-          <button v-for="provider in oauthProviders" :key="provider.name || provider.title" class="oauth-button"
+          <button v-for="provider in oauthProviders" :key="provider.key" class="oauth-button"
             @click="loginWithOAuth(provider)">
             <span v-if="provider.icon" class="provider-icon" v-html="provider.icon"></span>
             <span class="provider-name">Login with {{ provider.title }}</span>
@@ -106,9 +106,13 @@ async function handleLocalLogin() {
 }
 
 function loginWithOAuth(provider) {
-  const providerName = provider.title.toLowerCase()
+  if (!provider.key) {
+    console.error('OAuth provider missing key:', provider)
+    return
+  }
   
-  window.location.href = `/oauth/login?provider=${providerName}`
+  const providerKey = encodeURIComponent(provider.key)
+  window.location.href = `/oauth/login?provider=${providerKey}`
 }
 
 onMounted(() => {
@@ -138,4 +142,12 @@ form {
   grid-template-columns: 1fr;
   gap: 1em;
 }
+
+.provider-icon {
+  width: 1em;
+  height: 1em;
+  margin-right: .4em;
+  display: inline-flex;
+  vertical-align: middle;
+}
 </style>

+ 3 - 2
integration-tests/tests/oauthLoginGithub/config.yaml

@@ -11,7 +11,8 @@ checkForUpdates: false
 authOAuth2RedirectUrl: "http://localhost:1337/oauth2/callback"
 authOAuth2Providers:
   github:
-    title: "GitHub"
+    name: github
+    title: "Good old GitHub"
     clientId: "test-client-id"
     clientSecret: "test-client-secret"
 
@@ -21,7 +22,7 @@ authRequireGuestsToLogin: true
 # Simple actions for testing
 actions:
 - title: Ping Google.com
-  shell: ping google.com -c 1
+  shell: echo "ping google.com"
   icon: ping
 
 - title: sleep 2 seconds

+ 12 - 24
integration-tests/tests/oauthLoginGithub/githubOAuth.mjs

@@ -4,13 +4,13 @@ import { By, until, Condition } from 'selenium-webdriver'
 import {
   getRootAndWait,
   takeScreenshotOnFailure,
-} from '../lib/elements.js'
+} from '../../lib/elements.js'
 
 describe('config: githubOAuth', function () {
   this.timeout(30000)
 
   before(async function () {
-    await runner.start('githubOAuth')
+    await runner.start('oauthLoginGithub')
   })
 
   after(async () => {
@@ -75,37 +75,25 @@ describe('config: githubOAuth', function () {
     await new Promise(resolve => setTimeout(resolve, 3000))
 
     // Find GitHub OAuth button
+    // Since the test config only has one provider (GitHub), we can use the first button
     const githubButtons = await webdriver.findElements(By.css('.oauth-button'))
-    expect(githubButtons.length).to.be.greaterThan(0)
-
-    let githubButton = null
-    for (const button of githubButtons) {
-      const buttonText = await button.getText()
-      if (buttonText.toLowerCase().includes('github')) {
-        githubButton = button
-        break
-      }
-    }
-
-    expect(githubButton).to.not.be.null('GitHub OAuth button should be present')
-
-    // Verify button is displayed and enabled
-    const isDisplayed = await githubButton.isDisplayed()
-    expect(isDisplayed).to.be.true('GitHub OAuth button should be displayed')
-
-    const isEnabled = await githubButton.isEnabled()
-    expect(isEnabled).to.be.true('GitHub OAuth button should be enabled')
+    expect(githubButtons.length).to.be.greaterThan(0, 'At least one OAuth button should be present')
+    
+    const githubButton = githubButtons[0]
+    const buttonText = await githubButton.getText()
+    console.log('Button text:', buttonText)
+    
+    // Verify it's the GitHub button (should contain "github" in the text)
+    expect(buttonText.toLowerCase()).to.include('github', 'Button should be GitHub OAuth button')
 
     // Check for provider icon (if present)
     const providerIcons = await githubButton.findElements(By.css('.provider-icon'))
-    // Icon may or may not be present, so we don't assert on it
-
-    // Check for provider name
     const providerNames = await githubButton.findElements(By.css('.provider-name'))
     // Provider name may show "GitHub" (from title) or be undefined (if using name field)
     // Just verify the structure is present
     if (providerNames.length > 0) {
       const providerNameText = await providerNames[0].getText()
+      expect(providerNameText.toLowerCase()).to.include('github', 'Provider name should include "github"')
       expect(providerNameText).to.include('Login with', 'Provider name should have "Login with" prefix')
       console.log('Provider name text:', providerNameText)
     }

+ 1 - 1
proto/olivetin/api/v1/olivetin.proto

@@ -329,8 +329,8 @@ message AdditionalLink {
 
 message OAuth2Provider {
 	string title = 1;
-	string url = 2;
 	string icon = 3;
+	string key = 4;
 }
 
 message GetActionBindingRequest {

+ 8 - 8
service/gen/olivetin/api/v1/olivetin.pb.go

@@ -3390,8 +3390,8 @@ func (x *AdditionalLink) GetUrl() string {
 type OAuth2Provider struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Title         string                 `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
-	Url           string                 `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
 	Icon          string                 `protobuf:"bytes,3,opt,name=icon,proto3" json:"icon,omitempty"`
+	Key           string                 `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
 }
@@ -3433,16 +3433,16 @@ func (x *OAuth2Provider) GetTitle() string {
 	return ""
 }
 
-func (x *OAuth2Provider) GetUrl() string {
+func (x *OAuth2Provider) GetIcon() string {
 	if x != nil {
-		return x.Url
+		return x.Icon
 	}
 	return ""
 }
 
-func (x *OAuth2Provider) GetIcon() string {
+func (x *OAuth2Provider) GetKey() string {
 	if x != nil {
-		return x.Icon
+		return x.Key
 	}
 	return ""
 }
@@ -4003,9 +4003,9 @@ const file_olivetin_api_v1_olivetin_proto_rawDesc = "" +
 	"\x05title\x18\x01 \x01(\tR\x05title\x12\x10\n" +
 	"\x03url\x18\x02 \x01(\tR\x03url\"L\n" +
 	"\x0eOAuth2Provider\x12\x14\n" +
-	"\x05title\x18\x01 \x01(\tR\x05title\x12\x10\n" +
-	"\x03url\x18\x02 \x01(\tR\x03url\x12\x12\n" +
-	"\x04icon\x18\x03 \x01(\tR\x04icon\"8\n" +
+	"\x05title\x18\x01 \x01(\tR\x05title\x12\x12\n" +
+	"\x04icon\x18\x03 \x01(\tR\x04icon\x12\x10\n" +
+	"\x03key\x18\x04 \x01(\tR\x03key\"8\n" +
 	"\x17GetActionBindingRequest\x12\x1d\n" +
 	"\n" +
 	"binding_id\x18\x01 \x01(\tR\tbindingId\"K\n" +

+ 2 - 2
service/internal/api/api.go

@@ -865,11 +865,11 @@ func (api *oliveTinAPI) addCustomDashboards(rootDashboards *[]string, dashboards
 func buildPublicOAuth2ProvidersList(cfg *config.Config) []*apiv1.OAuth2Provider {
 	var publicProviders []*apiv1.OAuth2Provider
 
-	for _, provider := range cfg.AuthOAuth2Providers {
+	for providerKey, provider := range cfg.AuthOAuth2Providers {
 		publicProviders = append(publicProviders, &apiv1.OAuth2Provider{
 			Title: provider.Title,
-			Url:   provider.AuthUrl,
 			Icon:  provider.Icon,
+			Key:   providerKey,
 		})
 	}
 

+ 4 - 3
service/internal/httpservers/restapi_auth_oauth2.go

@@ -8,13 +8,14 @@ import (
 	"encoding/base64"
 	"encoding/json"
 	"fmt"
-	config "github.com/OliveTin/OliveTin/internal/config"
-	log "github.com/sirupsen/logrus"
-	"golang.org/x/oauth2"
 	"io"
 	"net/http"
 	"os"
 	"time"
+
+	config "github.com/OliveTin/OliveTin/internal/config"
+	log "github.com/sirupsen/logrus"
+	"golang.org/x/oauth2"
 )
 
 type OAuth2Handler struct {

Vissa filer visades inte eftersom för många filer har ändrats