-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b062c44
commit 618dc10
Showing
11 changed files
with
348 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,137 @@ | ||
import express from 'express'; | ||
import express, { Request, Response } from 'express'; | ||
import { requireAuth, validateRequest } from '../../middleware'; | ||
import { ISecret, Secret } from '../../models'; | ||
import { decryptSymmetric } from '../../utils/crypto'; | ||
import { getLogger } from '../../utils/logger'; | ||
import { body, param, query, check } from 'express-validator'; | ||
import { BadRequestError } from '../../utils/errors'; | ||
const router = express.Router(); | ||
|
||
/** | ||
* Create a single secret for a given workspace and environment | ||
*/ | ||
router.post( | ||
'/', requireAuth, | ||
body('secret').exists().isObject(), | ||
async (req: Request, res: Response) => { | ||
try { | ||
const { secret }: { secret: ISecret[] } = req.body; | ||
const newlyCreatedSecret = await Secret.create(secret) | ||
res.status(200).json(newlyCreatedSecret) | ||
} catch { | ||
throw BadRequestError({ message: "Unable to create the secret" }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Create many secrets | ||
*/ | ||
router.post( | ||
'/bulk-create', requireAuth, | ||
body('secrets').exists().isArray().custom((value) => value.every((item: ISecret) => typeof item === 'object')), | ||
async (req: Request, res: Response) => { | ||
try { | ||
const { secrets }: { secrets: ISecret[] } = req.body; | ||
const newlyCreatedSecrets = await Secret.insertMany(secrets) | ||
res.status(200).json(newlyCreatedSecrets) | ||
} catch { | ||
throw BadRequestError({ message: "Unable to create the secret" }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Get a single secret by secret id | ||
*/ | ||
router.get( | ||
'/:secretId', requireAuth, param('secretId').exists().trim(), | ||
validateRequest, async (req: Request, res: Response) => { | ||
try { | ||
const secretFromDB = await Secret.findById(req.params.secretId) | ||
return res.status(200).send(secretFromDB); | ||
} catch (e) { | ||
throw BadRequestError({ message: "Unable to find the requested secret" }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Get a single secret by secret id | ||
*/ | ||
router.get( | ||
'/:bulk', requireAuth, param('secretId').exists().trim(), | ||
validateRequest, async (req: Request, res: Response) => { | ||
try { | ||
const secretFromDB = await Secret.findById(req.params.secretId) | ||
return res.status(200).send(secretFromDB); | ||
} catch (e) { | ||
throw BadRequestError({ message: "Unable to find the requested secret" }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Delete a single secret by secret id | ||
*/ | ||
router.delete( | ||
'/:secretId', | ||
requireAuth, | ||
param('secretId').exists().trim(), | ||
validateRequest, async (req: Request, res: Response) => { | ||
try { | ||
const secretFromDB = await Secret.deleteOne({ | ||
_id: req.params.secretId | ||
}) | ||
return res.status(200).send(secretFromDB); | ||
} catch (e) { | ||
throw BadRequestError({ message: "Unable to find the requested secret" }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Delete many secrets by secret ids | ||
*/ | ||
router.delete( | ||
'/batch', | ||
requireAuth, | ||
body('secretIds').exists().isArray(), | ||
validateRequest, async (req: Request, res: Response) => { | ||
try { | ||
const secretIdsToDelete: string[] = req.body.secretIds | ||
const secretFromDB = await Secret.deleteMany({ | ||
_id: { $in: secretIdsToDelete } | ||
}) | ||
return res.status(200).send(secretFromDB); | ||
} catch (error) { | ||
throw BadRequestError({ message: `Unable to delete the requested secrets by ids [${req.body.secretIds}]` }) | ||
} | ||
} | ||
); | ||
|
||
/** | ||
* Apply modifications to many existing secrets | ||
*/ | ||
router.patch( | ||
'/bulk-update', | ||
requireAuth, | ||
body('secrets').exists().isArray().custom((value) => value.every((item: ISecret) => typeof item === 'object')), | ||
validateRequest, async (req: Request, res: Response) => { | ||
try { | ||
const { secrets }: { secrets: ISecret[] } = req.body; | ||
|
||
const operations = secrets.map((secretToUpdate: ISecret) => ({ | ||
updateOne: { filter: { _id: secretToUpdate._id }, update: secretToUpdate }, | ||
})); | ||
|
||
const bulkModificationInfo = await Secret.bulkWrite(operations); | ||
|
||
return res.status(200).json(bulkModificationInfo) | ||
} catch (error) { | ||
throw BadRequestError({ message: `Unable to process the bulk update. Double check the ids of the secrets` }) | ||
} | ||
} | ||
); | ||
|
||
export default router; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* | ||
Copyright © 2022 NAME HERE <EMAIL ADDRESS> | ||
*/ | ||
package cmd | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/Infisical/infisical-merge/packages/models" | ||
"github.com/Infisical/infisical-merge/packages/util" | ||
"github.com/Infisical/infisical-merge/packages/visualize" | ||
log "github.com/sirupsen/logrus" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
var secretsCmd = &cobra.Command{ | ||
Example: `infisical secrets"`, | ||
Short: "Used to create, read update and delete secrets", | ||
Use: "secrets", | ||
DisableFlagsInUseLine: true, | ||
PreRun: toggleDebug, | ||
Args: cobra.NoArgs, | ||
Run: func(cmd *cobra.Command, args []string) { | ||
|
||
secrets, err := util.GetAllEnvironmentVariables("", "dev") | ||
secrets = util.SubstituteSecrets(secrets) | ||
if err != nil { | ||
log.Debugln(err) | ||
return | ||
} | ||
visualize.PrintAllSecretDetails(secrets) | ||
}, | ||
} | ||
|
||
var secretsGetCmd = &cobra.Command{ | ||
Example: `secrets get <secret name A> <secret name B>..."`, | ||
Short: "Used to retrieve secrets by name", | ||
Use: "get [secrets]", | ||
DisableFlagsInUseLine: true, | ||
Args: cobra.MinimumNArgs(1), | ||
PreRun: toggleDebug, | ||
Run: getSecretsByNames, | ||
} | ||
|
||
var secretsSetCmd = &cobra.Command{ | ||
Example: `secrets set <secret name A> <secret value A> <secret name B> <secret value B>..."`, | ||
Short: "Used update retrieve secrets by name", | ||
Use: "set [secrets]", | ||
DisableFlagsInUseLine: true, | ||
PreRun: toggleDebug, | ||
Args: cobra.NoArgs, | ||
Run: func(cmd *cobra.Command, args []string) { | ||
fmt.Println("set secret") | ||
}, | ||
} | ||
|
||
var secretsDeleteCmd = &cobra.Command{ | ||
Example: `secrets delete <secret name A> <secret name B>..."`, | ||
Short: "Used to delete secrets by name", | ||
Use: "delete [secrets]", | ||
DisableFlagsInUseLine: true, | ||
PreRun: toggleDebug, | ||
Args: cobra.NoArgs, | ||
Run: func(cmd *cobra.Command, args []string) { | ||
fmt.Println("Delete secret") | ||
}, | ||
} | ||
|
||
func init() { | ||
secretsCmd.AddCommand(secretsGetCmd) | ||
secretsCmd.AddCommand(secretsSetCmd) | ||
secretsCmd.AddCommand(secretsDeleteCmd) | ||
rootCmd.AddCommand(secretsCmd) | ||
} | ||
|
||
func getSecretsByNames(cmd *cobra.Command, args []string) { | ||
secrets, err := util.GetAllEnvironmentVariables("", "dev") | ||
if err != nil { | ||
log.Error("Unable to retrieve secrets. Run with -d to see full logs") | ||
log.Debug(err) | ||
} | ||
|
||
requestedSecrets := []models.SingleEnvironmentVariable{} | ||
|
||
secretsMap := make(map[string]models.SingleEnvironmentVariable) | ||
for _, secret := range secrets { | ||
secretsMap[secret.Key] = secret | ||
} | ||
|
||
for _, secretKeyFromArg := range args { | ||
if value, ok := secretsMap[secretKeyFromArg]; ok { | ||
requestedSecrets = append(requestedSecrets, value) | ||
} else { | ||
requestedSecrets = append(requestedSecrets, models.SingleEnvironmentVariable{ | ||
Key: secretKeyFromArg, | ||
Type: "NOT FOUND", | ||
Value: "NOT FOUND", | ||
}) | ||
} | ||
} | ||
|
||
visualize.PrintAllSecretDetails(requestedSecrets) | ||
} |
Oops, something went wrong.