Merge remote-tracking branch 'origin' into ldap

This commit is contained in:
Tuan Dang
2024-03-11 14:20:45 -07:00
7 changed files with 59 additions and 22 deletions
+2 -1
View File
@@ -59,7 +59,8 @@ var exportCmd = &cobra.Command{
util.HandleError(err, "Unable to parse flag") util.HandleError(err, "Unable to parse flag")
} }
infisicalToken, err := cmd.Flags().GetString("token") infisicalToken, err := util.GetInfisicalServiceToken(cmd)
if err != nil { if err != nil {
util.HandleError(err, "Unable to parse flag") util.HandleError(err, "Unable to parse flag")
} }
+2 -1
View File
@@ -36,7 +36,8 @@ var getCmd = &cobra.Command{
} }
} }
infisicalToken, err := cmd.Flags().GetString("token") infisicalToken, err := util.GetInfisicalServiceToken(cmd)
if err != nil { if err != nil {
util.HandleError(err, "Unable to parse flag") util.HandleError(err, "Unable to parse flag")
} }
+2 -1
View File
@@ -62,7 +62,8 @@ var runCmd = &cobra.Command{
} }
} }
infisicalToken, err := cmd.Flags().GetString("token") infisicalToken, err := util.GetInfisicalServiceToken(cmd)
if err != nil { if err != nil {
util.HandleError(err, "Unable to parse flag") util.HandleError(err, "Unable to parse flag")
} }
+7 -6
View File
@@ -7,7 +7,6 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"os"
"regexp" "regexp"
"sort" "sort"
"strings" "strings"
@@ -39,10 +38,10 @@ var secretsCmd = &cobra.Command{
} }
} }
infisicalToken, err := cmd.Flags().GetString("token") infisicalToken, err := util.GetInfisicalServiceToken(cmd)
if infisicalToken == "" { if err != nil {
infisicalToken = os.Getenv(util.INFISICAL_TOKEN_NAME) util.HandleError(err, "Unable to parse flag")
} }
if err != nil { 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 { if err != nil {
util.HandleError(err, "Unable to parse flag") 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") util.HandleError(err, "Unable to parse flag")
} }
infisicalToken, err := cmd.Flags().GetString("token") infisicalToken, err := util.GetInfisicalServiceToken(cmd)
if err != nil { if err != nil {
util.HandleError(err, "Unable to parse flag") util.HandleError(err, "Unable to parse flag")
} }
+15
View File
@@ -11,6 +11,7 @@ import (
"strings" "strings"
"github.com/Infisical/infisical-merge/packages/models" "github.com/Infisical/infisical-merge/packages/models"
"github.com/spf13/cobra"
) )
type DecodedSymmetricEncryptionDetails = struct { type DecodedSymmetricEncryptionDetails = struct {
@@ -63,6 +64,20 @@ func IsSecretTypeValid(s string) bool {
return false 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 // Checks if the passed in email already exists in the users slice
func ConfigContainsEmail(users []models.LoggedInUser, email string) bool { func ConfigContainsEmail(users []models.LoggedInUser, email string) bool {
for _, value := range users { for _, value := range users {
@@ -1,10 +1,11 @@
import { useCallback, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { subject } from "@casl/ability"; import { subject } from "@casl/ability";
import { faArrowDown, faArrowUp } from "@fortawesome/free-solid-svg-icons"; import { faArrowDown, faArrowUp } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { useNotificationContext } from "@app/components/context/Notifications/NotificationProvider";
import NavHeader from "@app/components/navigation/NavHeader"; import NavHeader from "@app/components/navigation/NavHeader";
import { PermissionDeniedBanner } from "@app/components/permissions"; import { PermissionDeniedBanner } from "@app/components/permissions";
import { ContentLoader } from "@app/components/v2"; import { ContentLoader } from "@app/components/v2";
@@ -47,9 +48,10 @@ const LOADER_TEXT = [
export const SecretMainPage = () => { export const SecretMainPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { currentWorkspace } = useWorkspace(); const { currentWorkspace, isLoading: isWorkspaceLoading } = useWorkspace();
const router = useRouter(); const router = useRouter();
const { permission } = useProjectPermission(); const { permission } = useProjectPermission();
const { createNotification } = useNotificationContext();
const [isVisible, setIsVisible] = useState(false); const [isVisible, setIsVisible] = useState(false);
const [sortDir, setSortDir] = useState<SortDir>(SortDir.ASC); const [sortDir, setSortDir] = useState<SortDir>(SortDir.ASC);
@@ -75,6 +77,20 @@ export const SecretMainPage = () => {
ProjectPermissionSub.SecretRollback 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); const { data: decryptFileKey } = useGetUserWsKey(workspaceId);
// fetch secrets // fetch secrets
@@ -2,15 +2,15 @@ import { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { faCheckCircle } from "@fortawesome/free-regular-svg-icons";
import { subject } from "@casl/ability"; import { subject } from "@casl/ability";
import { faCheckCircle } from "@fortawesome/free-regular-svg-icons";
import { import {
faAngleDown, faAngleDown,
faArrowDown, faArrowDown,
faArrowUp, faArrowUp,
faFolderBlank, faFolderBlank,
faList,
faFolderPlus, faFolderPlus,
faList,
faMagnifyingGlass, faMagnifyingGlass,
faPlus faPlus
} from "@fortawesome/free-solid-svg-icons"; } from "@fortawesome/free-solid-svg-icons";
@@ -207,10 +207,10 @@ export const SecretOverviewPage = () => {
}; };
const handleEnvSelect = (envId: string) => { const handleEnvSelect = (envId: string) => {
if (visibleEnvs.map(env => env.id).includes(envId)) { if (visibleEnvs.map((env) => env.id).includes(envId)) {
setVisisbleEnvs(visibleEnvs.filter(env => env.id !== envId)) setVisisbleEnvs(visibleEnvs.filter((env) => env.id !== envId));
} else { } 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" ariaLabel="Environments"
variant="plain" variant="plain"
size="sm" 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"
> >
<Tooltip content="Choose visible environments" className="mb-2"> <Tooltip content="Choose visible environments" className="mb-2">
<FontAwesomeIcon icon={faList} /> <FontAwesomeIcon icon={faList} />
@@ -408,17 +408,19 @@ export const SecretOverviewPage = () => {
{userAvailableEnvs.map((avaiableEnv) => { {userAvailableEnvs.map((avaiableEnv) => {
const { id: envId, name } = 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 ( return (
<DropdownMenuItem <DropdownMenuItem
onClick={() => handleEnvSelect(envId)} onClick={() => handleEnvSelect(envId)}
key={envId} key={envId}
icon={isEnvSelected && <FontAwesomeIcon className="text-primary" icon={faCheckCircle} />} icon={
isEnvSelected && (
<FontAwesomeIcon className="text-primary" icon={faCheckCircle} />
)
}
iconPos="left" iconPos="left"
> >
<div className="flex items-center"> <div className="flex items-center">{name}</div>
{name}
</div>
</DropdownMenuItem> </DropdownMenuItem>
); );
})} })}