diff --git a/cli/packages/cmd/export.go b/cli/packages/cmd/export.go index 9c3590e89..1a34219eb 100644 --- a/cli/packages/cmd/export.go +++ b/cli/packages/cmd/export.go @@ -59,7 +59,8 @@ var exportCmd = &cobra.Command{ util.HandleError(err, "Unable to parse flag") } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) + if err != nil { util.HandleError(err, "Unable to parse flag") } diff --git a/cli/packages/cmd/folder.go b/cli/packages/cmd/folder.go index 12e2206fa..290f32c38 100644 --- a/cli/packages/cmd/folder.go +++ b/cli/packages/cmd/folder.go @@ -36,7 +36,8 @@ var getCmd = &cobra.Command{ } } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) + if err != nil { util.HandleError(err, "Unable to parse flag") } diff --git a/cli/packages/cmd/run.go b/cli/packages/cmd/run.go index 48eaffea9..d008af1ec 100644 --- a/cli/packages/cmd/run.go +++ b/cli/packages/cmd/run.go @@ -62,7 +62,8 @@ var runCmd = &cobra.Command{ } } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) + if err != nil { util.HandleError(err, "Unable to parse flag") } diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 667f39b95..ffe82179c 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -7,7 +7,6 @@ import ( "crypto/sha256" "encoding/base64" "fmt" - "os" "regexp" "sort" "strings" @@ -39,10 +38,10 @@ var secretsCmd = &cobra.Command{ } } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) - if infisicalToken == "" { - infisicalToken = os.Getenv(util.INFISICAL_TOKEN_NAME) + if err != nil { + util.HandleError(err, "Unable to parse flag") } if err != nil { @@ -399,7 +398,8 @@ func getSecretsByNames(cmd *cobra.Command, args []string) { } } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) + if err != nil { util.HandleError(err, "Unable to parse flag") } @@ -466,7 +466,8 @@ func generateExampleEnv(cmd *cobra.Command, args []string) { util.HandleError(err, "Unable to parse flag") } - infisicalToken, err := cmd.Flags().GetString("token") + infisicalToken, err := util.GetInfisicalServiceToken(cmd) + if err != nil { util.HandleError(err, "Unable to parse flag") } diff --git a/cli/packages/util/helper.go b/cli/packages/util/helper.go index 043db468e..413afb2b8 100644 --- a/cli/packages/util/helper.go +++ b/cli/packages/util/helper.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/Infisical/infisical-merge/packages/models" + "github.com/spf13/cobra" ) type DecodedSymmetricEncryptionDetails = struct { @@ -63,6 +64,20 @@ func IsSecretTypeValid(s string) bool { return false } +func GetInfisicalServiceToken(cmd *cobra.Command) (serviceToken string, err error) { + infisicalToken, err := cmd.Flags().GetString("token") + + if infisicalToken == "" { + infisicalToken = os.Getenv(INFISICAL_TOKEN_NAME) + } + + if err != nil { + return "", err + } + + return infisicalToken, nil +} + // Checks if the passed in email already exists in the users slice func ConfigContainsEmail(users []models.LoggedInUser, email string) bool { for _, value := range users { diff --git a/frontend/src/views/SecretMainPage/SecretMainPage.tsx b/frontend/src/views/SecretMainPage/SecretMainPage.tsx index b0e34d507..312b676b7 100644 --- a/frontend/src/views/SecretMainPage/SecretMainPage.tsx +++ b/frontend/src/views/SecretMainPage/SecretMainPage.tsx @@ -1,10 +1,11 @@ -import { useCallback, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useRouter } from "next/router"; import { subject } from "@casl/ability"; import { faArrowDown, faArrowUp } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useNotificationContext } from "@app/components/context/Notifications/NotificationProvider"; import NavHeader from "@app/components/navigation/NavHeader"; import { PermissionDeniedBanner } from "@app/components/permissions"; import { ContentLoader } from "@app/components/v2"; @@ -47,9 +48,10 @@ const LOADER_TEXT = [ export const SecretMainPage = () => { const { t } = useTranslation(); - const { currentWorkspace } = useWorkspace(); + const { currentWorkspace, isLoading: isWorkspaceLoading } = useWorkspace(); const router = useRouter(); const { permission } = useProjectPermission(); + const { createNotification } = useNotificationContext(); const [isVisible, setIsVisible] = useState(false); const [sortDir, setSortDir] = useState(SortDir.ASC); @@ -75,6 +77,20 @@ export const SecretMainPage = () => { ProjectPermissionSub.SecretRollback ); + useEffect(() => { + if ( + !isWorkspaceLoading && + !currentWorkspace?.environments.find((env) => env.slug === environment) && + router.isReady + ) { + router.push(`/project/${workspaceId}/secrets/overview`); + createNotification({ + text: "No envronment found with given slug", + type: "error" + }); + } + }, [isWorkspaceLoading, currentWorkspace, environment, router.isReady]); + const { data: decryptFileKey } = useGetUserWsKey(workspaceId); // fetch secrets diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 1fba46266..37916884b 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -2,15 +2,15 @@ import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import Link from "next/link"; import { useRouter } from "next/router"; -import { faCheckCircle } from "@fortawesome/free-regular-svg-icons"; import { subject } from "@casl/ability"; +import { faCheckCircle } from "@fortawesome/free-regular-svg-icons"; import { faAngleDown, faArrowDown, faArrowUp, faFolderBlank, - faList, faFolderPlus, + faList, faMagnifyingGlass, faPlus } from "@fortawesome/free-solid-svg-icons"; @@ -207,10 +207,10 @@ export const SecretOverviewPage = () => { }; const handleEnvSelect = (envId: string) => { - if (visibleEnvs.map(env => env.id).includes(envId)) { - setVisisbleEnvs(visibleEnvs.filter(env => env.id !== envId)) + if (visibleEnvs.map((env) => env.id).includes(envId)) { + setVisisbleEnvs(visibleEnvs.filter((env) => env.id !== envId)); } else { - setVisisbleEnvs(visibleEnvs.concat(userAvailableEnvs.filter(env => env.id === envId))) + setVisisbleEnvs(visibleEnvs.concat(userAvailableEnvs.filter((env) => env.id === envId))); } }; @@ -396,7 +396,7 @@ export const SecretOverviewPage = () => { ariaLabel="Environments" variant="plain" size="sm" - className="flex justify-center items-center overflow-hidden p-0 w-11 bg-mineshaft-800 hover:bg-primary/10 hover:border-primary/60 border border-mineshaft-600 mr-2" + className="mr-2 flex w-11 items-center justify-center overflow-hidden border border-mineshaft-600 bg-mineshaft-800 p-0 hover:border-primary/60 hover:bg-primary/10" > @@ -408,17 +408,19 @@ export const SecretOverviewPage = () => { {userAvailableEnvs.map((avaiableEnv) => { const { id: envId, name } = avaiableEnv; - const isEnvSelected = visibleEnvs.map(env => env.id).includes(envId); + const isEnvSelected = visibleEnvs.map((env) => env.id).includes(envId); return ( handleEnvSelect(envId)} key={envId} - icon={isEnvSelected && } + icon={ + isEnvSelected && ( + + ) + } iconPos="left" > -
- {name} -
+
{name}
); })}