Path: blob/main/test/tests/smoke-test/papi_create_temp_token_test.go
2498 views
// Copyright (c) 2024 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package smoketest56import (7"context"8"fmt"9"os"10"strings"11"testing"12"time"1314connect "github.com/bufbuild/connect-go"15v1 "github.com/gitpod-io/gitpod/components/public-api/go/v1"16v1connect "github.com/gitpod-io/gitpod/components/public-api/go/v1/v1connect"17)1819/*20*21export TEST_CREATE_TMP_TOKEN=true22export GITPOD_HOST=hw-token-exp-1084.preview.gitpod-dev.com2324export INSTALLATION_ADMIN_PAT=<admin_pat>25# PAT of a member or an owner or a collaborator26export MEMBER_USER_PAT=<other_pat>2728export MEMBER_USER_ID=fffbc8e0-7f70-4afc-a370-63c889f7e64429export TARGET_USER_ID=fffbc8e0-7f70-4afc-a370-63c889f7e6443031go test -run "^TestCreateTemporaryAccessToken" github.com/gitpod-io/gitpod/test/tests/smoke-test -v -count=132*/33const BUILTIN_INSTLLATION_ADMIN_USER_ID = "f071bb8e-b5d1-46cf-a436-da03ae63bcd2"3435func TestCreateTemporaryAccessToken(t *testing.T) {36if !shouldTestPAPICreateTmpToken() {37t.Skip("skip papi create temporary access token test")38return39}40gitpodHost, _ := os.LookupEnv("GITPOD_HOST")41adminPAT, _ := os.LookupEnv("INSTALLATION_ADMIN_PAT")42targetUserID, _ := os.LookupEnv("TARGET_USER_ID")43ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)44defer cancel()4546assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")47newTargetToken := assertTemporaryAccessToken(ctx, t, gitpodHost, adminPAT, targetUserID, 60, "")48if newTargetToken == "" {49return50}5152assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")53assertGetUser(ctx, t, gitpodHost, newTargetToken, targetUserID, "")54}5556func TestCreateTemporaryAccessTokenDeniedToCreateInstallationAdmin(t *testing.T) {57// because installation admin is not an organization owned user58if !shouldTestPAPICreateTmpToken() {59t.Skip("skip papi create temporary access token test")60return61}62gitpodHost, _ := os.LookupEnv("GITPOD_HOST")63adminPAT, _ := os.LookupEnv("INSTALLATION_ADMIN_PAT")64ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)65defer cancel()6667assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")68assertTemporaryAccessToken(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, 60, "permission_denied")69}7071func TestCreateTemporaryAccessTokenWithNotFoundUser(t *testing.T) {72if !shouldTestPAPICreateTmpToken() {73t.Skip("skip papi create temporary access token test")74return75}76gitpodHost, _ := os.LookupEnv("GITPOD_HOST")77adminPAT, _ := os.LookupEnv("INSTALLATION_ADMIN_PAT")78ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)79defer cancel()8081assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")82assertTemporaryAccessToken(ctx, t, gitpodHost, adminPAT, "00000000-0000-0000-0000-000000000000", 60, "not_found")83}8485func TestCreateTemporaryAccessTokenViaMember(t *testing.T) {86if !shouldTestPAPICreateTmpToken() {87t.Skip("skip papi create temporary access token test")88return89}90gitpodHost, _ := os.LookupEnv("GITPOD_HOST")91memberUserPAT, _ := os.LookupEnv("MEMBER_USER_PAT")92memberUserID, _ := os.LookupEnv("MEMBER_USER_ID")93targetUserID, _ := os.LookupEnv("TARGET_USER_ID")94ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)95defer cancel()9697assertGetUser(ctx, t, gitpodHost, memberUserPAT, memberUserID, "")98assertTemporaryAccessToken(ctx, t, gitpodHost, memberUserPAT, targetUserID, 60, "permission_denied")99}100101func TestCreateTemporaryAccessTokenExpiry(t *testing.T) {102if !shouldTestPAPICreateTmpToken() {103t.Skip("skip papi create temporary access token test")104return105}106gitpodHost, _ := os.LookupEnv("GITPOD_HOST")107adminPAT, _ := os.LookupEnv("INSTALLATION_ADMIN_PAT")108targetUserID, _ := os.LookupEnv("TARGET_USER_ID")109ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)110defer cancel()111112assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")113newTargetToken := assertTemporaryAccessToken(ctx, t, gitpodHost, adminPAT, targetUserID, 3, "")114if newTargetToken == "" {115return116}117assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")118assertGetUser(ctx, t, gitpodHost, newTargetToken, targetUserID, "")119120time.Sleep(time.Second * 3)121122assertGetUser(ctx, t, gitpodHost, newTargetToken, targetUserID, "unauthenticated")123}124125func TestCreateTemporaryAccessTokenCreateEnv(t *testing.T) {126if !shouldTestPAPICreateTmpToken() {127t.Skip("skip papi create temporary access token test")128return129}130gitpodHost, _ := os.LookupEnv("GITPOD_HOST")131adminPAT, _ := os.LookupEnv("INSTALLATION_ADMIN_PAT")132targetUserID, _ := os.LookupEnv("TARGET_USER_ID")133ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)134defer cancel()135136assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")137newTargetToken := assertTemporaryAccessToken(ctx, t, gitpodHost, adminPAT, targetUserID, 60, "")138if newTargetToken == "" {139return140}141142assertGetUser(ctx, t, gitpodHost, adminPAT, BUILTIN_INSTLLATION_ADMIN_USER_ID, "")143assertGetUser(ctx, t, gitpodHost, newTargetToken, targetUserID, "")144145assertCreateEnvVar(ctx, t, gitpodHost, newTargetToken, "foo", "boo")146}147148func assertTemporaryAccessToken(ctx context.Context, t *testing.T, gitpodHost, userToken, targetUserID string, expirySeconds int32, wantedErrMsg string) string {149useCookie := !strings.HasPrefix(userToken, "gitpod_pat_")150v1Http, v1Opts, v1Host := getPAPIConnSettings(gitpodHost, userToken, useCookie, false)151v1Client := v1connect.NewTokenServiceClient(v1Http, v1Host, v1Opts...)152targetInfo, err := v1Client.CreateTemporaryAccessToken(ctx, connect.NewRequest(&v1.CreateTemporaryAccessTokenRequest{153UserId: targetUserID,154ExpirySeconds: expirySeconds,155}))156if wantedErrMsg != "" {157if err == nil {158t.Errorf("CreateTemporaryAccessToken() error = %v", err)159}160if !strings.Contains(err.Error(), wantedErrMsg) {161t.Errorf("CreateTemporaryAccessToken() error = %v, wantErr %v", err, wantedErrMsg)162}163return ""164}165if err != nil && wantedErrMsg == "" {166t.Errorf("CreateTemporaryAccessToken() error = %v", err)167return ""168}169return fmt.Sprintf("%s=%s", targetInfo.Msg.CookieName, targetInfo.Msg.Token)170}171172func assertGetUser(ctx context.Context, t *testing.T, gitpodHost, userToken string, wantedUser, wantedErrMsg string) {173useCookie := !strings.HasPrefix(userToken, "gitpod_pat_")174v1Http, v1Opts, v1Host := getPAPIConnSettings(gitpodHost, userToken, useCookie, false)175v1Client := v1connect.NewUserServiceClient(v1Http, v1Host, v1Opts...)176user, err := v1Client.GetAuthenticatedUser(ctx, connect.NewRequest(&v1.GetAuthenticatedUserRequest{}))177if wantedErrMsg != "" {178if err == nil {179t.Errorf("GetAuthenticatedUser() error = nil, wantErr %s", wantedErrMsg)180return181}182if !strings.Contains(err.Error(), wantedErrMsg) {183t.Errorf("GetAuthenticatedUser() error = %v, wantErr %s", err, wantedErrMsg)184}185return186}187if err != nil {188t.Errorf("GetAuthenticatedUser() error = %v", err)189return190}191if user.Msg.User.Id != wantedUser {192t.Errorf("GetAuthenticatedUser() = %v, wantUser %v", user.Msg.User.Id, wantedUser)193}194}195196func assertCreateEnvVar(ctx context.Context, t *testing.T, gitpodHost, userToken string, envVarName, envVarVal string) {197useCookie := !strings.HasPrefix(userToken, "gitpod_pat_")198v1Http, v1Opts, v1Host := getPAPIConnSettings(gitpodHost, userToken, useCookie, false)199v1Client := v1connect.NewEnvironmentVariableServiceClient(v1Http, v1Host, v1Opts...)200201list, err := v1Client.ListUserEnvironmentVariables(ctx, connect.NewRequest(&v1.ListUserEnvironmentVariablesRequest{}))202if err != nil {203t.Errorf("ListUserEnvironmentVariables() error = %v", err)204return205}206var found *v1.UserEnvironmentVariable = nil207for _, envVar := range list.Msg.EnvironmentVariables {208if envVar.Name == envVarName {209found = envVar210break211}212}213if found != nil {214fmt.Printf("found env var %+v\n", found)215}216if found == nil {217_, err := v1Client.CreateUserEnvironmentVariable(ctx, connect.NewRequest(&v1.CreateUserEnvironmentVariableRequest{218Name: envVarName,219Value: envVarVal,220RepositoryPattern: "*/*",221}))222if err != nil {223t.Errorf("CreateUserEnvironmentVariable() error = %v", err)224return225}226} else {227scope := "*/*"228_, err := v1Client.UpdateUserEnvironmentVariable(ctx, connect.NewRequest(&v1.UpdateUserEnvironmentVariableRequest{229EnvironmentVariableId: found.Id,230Name: &envVarName,231Value: &envVarVal,232RepositoryPattern: &scope,233}))234if err != nil {235t.Errorf("UpdateUserEnvironmentVariable() error = %v", err)236return237}238}239list2, err := v1Client.ListUserEnvironmentVariables(ctx, connect.NewRequest(&v1.ListUserEnvironmentVariablesRequest{}))240if err != nil {241t.Errorf("ListUserEnvironmentVariables() error = %v", err)242return243}244for _, envVar := range list2.Msg.EnvironmentVariables {245if envVar.Name == envVarName && envVar.Value == envVarVal {246return247}248}249t.Errorf("Cannot found env var %s=%s", envVarName, envVarVal)250}251252func shouldTestPAPICreateTmpToken() bool {253should, _ := os.LookupEnv("TEST_CREATE_TMP_TOKEN")254return should == "true"255}256257258