Skip to content

Commit 618dc10

Browse files
vmatsiiakomaidul98
authored andcommitted
Added .NET to available frameworks
1 parent b062c44 commit 618dc10

File tree

11 files changed

+348
-15
lines changed

11 files changed

+348
-15
lines changed

README.md

+14-4
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,13 @@ We're currently setting the foundation and building [integrations](https://infis
270270
</tr>
271271
<tr>
272272
<td align="left" valign="middle">
273-
<a href="https://infisical.com/docs/integrations/frameworks/rails?ref=github.com">
274-
✔️ Ruby on Rails
273+
<a href="https://infisical.com/docs/integrations/frameworks/vue?ref=github.com">
274+
✔️ Vue
275275
</a>
276276
</td>
277277
<td align="left" valign="middle">
278-
<a href="https://infisical.com/docs/integrations/frameworks/vue?ref=github.com">
279-
✔️ Vue
278+
<a href="https://infisical.com/docs/integrations/frameworks/rails?ref=github.com">
279+
✔️ Ruby on Rails
280280
</a>
281281
</td>
282282
</tr>
@@ -292,6 +292,16 @@ We're currently setting the foundation and building [integrations](https://infis
292292
</a>
293293
</td>
294294
</tr>
295+
<tr>
296+
<td align="left" valign="middle">
297+
<a href="https://infisical.com/docs/integrations/frameworks/dotnet?ref=github.com">
298+
✔️ .NET
299+
</a>
300+
</td>
301+
<td align="left" valign="middle">
302+
And more...
303+
</td>
304+
</tr>
295305
</tbody>
296306
</table>
297307

backend/src/models/secret.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ const secretSchema = new Schema<ISecret>(
3333
{
3434
version: {
3535
type: Number,
36-
required: true
36+
required: true,
37+
default: 1
3738
},
3839
workspace: {
3940
type: Schema.Types.ObjectId,

backend/src/routes/v2/secret.ts

+134-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,137 @@
1-
import express from 'express';
1+
import express, { Request, Response } from 'express';
2+
import { requireAuth, validateRequest } from '../../middleware';
3+
import { ISecret, Secret } from '../../models';
4+
import { decryptSymmetric } from '../../utils/crypto';
5+
import { getLogger } from '../../utils/logger';
6+
import { body, param, query, check } from 'express-validator';
7+
import { BadRequestError } from '../../utils/errors';
28
const router = express.Router();
39

10+
/**
11+
* Create a single secret for a given workspace and environment
12+
*/
13+
router.post(
14+
'/', requireAuth,
15+
body('secret').exists().isObject(),
16+
async (req: Request, res: Response) => {
17+
try {
18+
const { secret }: { secret: ISecret[] } = req.body;
19+
const newlyCreatedSecret = await Secret.create(secret)
20+
res.status(200).json(newlyCreatedSecret)
21+
} catch {
22+
throw BadRequestError({ message: "Unable to create the secret" })
23+
}
24+
}
25+
);
26+
27+
/**
28+
* Create many secrets
29+
*/
30+
router.post(
31+
'/bulk-create', requireAuth,
32+
body('secrets').exists().isArray().custom((value) => value.every((item: ISecret) => typeof item === 'object')),
33+
async (req: Request, res: Response) => {
34+
try {
35+
const { secrets }: { secrets: ISecret[] } = req.body;
36+
const newlyCreatedSecrets = await Secret.insertMany(secrets)
37+
res.status(200).json(newlyCreatedSecrets)
38+
} catch {
39+
throw BadRequestError({ message: "Unable to create the secret" })
40+
}
41+
}
42+
);
43+
44+
/**
45+
* Get a single secret by secret id
46+
*/
47+
router.get(
48+
'/:secretId', requireAuth, param('secretId').exists().trim(),
49+
validateRequest, async (req: Request, res: Response) => {
50+
try {
51+
const secretFromDB = await Secret.findById(req.params.secretId)
52+
return res.status(200).send(secretFromDB);
53+
} catch (e) {
54+
throw BadRequestError({ message: "Unable to find the requested secret" })
55+
}
56+
}
57+
);
58+
59+
/**
60+
* Get a single secret by secret id
61+
*/
62+
router.get(
63+
'/:bulk', requireAuth, param('secretId').exists().trim(),
64+
validateRequest, async (req: Request, res: Response) => {
65+
try {
66+
const secretFromDB = await Secret.findById(req.params.secretId)
67+
return res.status(200).send(secretFromDB);
68+
} catch (e) {
69+
throw BadRequestError({ message: "Unable to find the requested secret" })
70+
}
71+
}
72+
);
73+
74+
/**
75+
* Delete a single secret by secret id
76+
*/
77+
router.delete(
78+
'/:secretId',
79+
requireAuth,
80+
param('secretId').exists().trim(),
81+
validateRequest, async (req: Request, res: Response) => {
82+
try {
83+
const secretFromDB = await Secret.deleteOne({
84+
_id: req.params.secretId
85+
})
86+
return res.status(200).send(secretFromDB);
87+
} catch (e) {
88+
throw BadRequestError({ message: "Unable to find the requested secret" })
89+
}
90+
}
91+
);
92+
93+
/**
94+
* Delete many secrets by secret ids
95+
*/
96+
router.delete(
97+
'/batch',
98+
requireAuth,
99+
body('secretIds').exists().isArray(),
100+
validateRequest, async (req: Request, res: Response) => {
101+
try {
102+
const secretIdsToDelete: string[] = req.body.secretIds
103+
const secretFromDB = await Secret.deleteMany({
104+
_id: { $in: secretIdsToDelete }
105+
})
106+
return res.status(200).send(secretFromDB);
107+
} catch (error) {
108+
throw BadRequestError({ message: `Unable to delete the requested secrets by ids [${req.body.secretIds}]` })
109+
}
110+
}
111+
);
112+
113+
/**
114+
* Apply modifications to many existing secrets
115+
*/
116+
router.patch(
117+
'/bulk-update',
118+
requireAuth,
119+
body('secrets').exists().isArray().custom((value) => value.every((item: ISecret) => typeof item === 'object')),
120+
validateRequest, async (req: Request, res: Response) => {
121+
try {
122+
const { secrets }: { secrets: ISecret[] } = req.body;
123+
124+
const operations = secrets.map((secretToUpdate: ISecret) => ({
125+
updateOne: { filter: { _id: secretToUpdate._id }, update: secretToUpdate },
126+
}));
127+
128+
const bulkModificationInfo = await Secret.bulkWrite(operations);
129+
130+
return res.status(200).json(bulkModificationInfo)
131+
} catch (error) {
132+
throw BadRequestError({ message: `Unable to process the bulk update. Double check the ids of the secrets` })
133+
}
134+
}
135+
);
136+
4137
export default router;

cli/go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ require (
1313

1414
require (
1515
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
16+
github.com/Luzifer/go-openssl/v4 v4.1.0 // indirect
1617
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
1718
github.com/chzyer/readline v1.5.1 // indirect
1819
github.com/danieljoos/wincred v1.1.2 // indirect
@@ -34,6 +35,7 @@ require (
3435
)
3536

3637
require (
38+
github.com/Luzifer/go-openssl v2.0.0+incompatible
3739
github.com/go-resty/resty/v2 v2.7.0
3840
github.com/inconshreveable/mousetrap v1.0.1 // indirect
3941
github.com/jedib0t/go-pretty v4.3.0+incompatible

cli/go.sum

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMb
22
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
33
github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0=
44
github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk=
5+
github.com/Luzifer/go-openssl v2.0.0+incompatible h1:EpNNxrPDji4rRzE0KeOeIeV7pHyKe8zF9oNnAXy4mBY=
6+
github.com/Luzifer/go-openssl v2.0.0+incompatible/go.mod h1:t2qnLjT8WQ3usGU1R8uAqjY4T7CK7eMg9vhQ3l9Ue/Y=
7+
github.com/Luzifer/go-openssl/v4 v4.1.0 h1:8qi3Z6f8Aflwub/Cs4FVSmKUEg/lC8GlODbR2TyZ+nM=
8+
github.com/Luzifer/go-openssl/v4 v4.1.0/go.mod h1:3i1T3Pe6eQK19d86WhuQzjLyMwBaNmGmt3ZceWpWVa4=
59
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg=
610
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
711
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -96,15 +100,20 @@ github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgk
96100
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
97101
go.mongodb.org/mongo-driver v1.10.0 h1:UtV6N5k14upNp4LTduX0QCufG124fSu25Wz9tu94GLg=
98102
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
103+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
104+
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
99105
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
100106
golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=
101107
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
108+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
102109
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
103110
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
104111
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
105112
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
106113
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
107114
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
115+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
116+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
108117
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
109118
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
110119
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -116,6 +125,7 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
116125
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
117126
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
118127
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
128+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
119129
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
120130
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
121131
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

cli/packages/cmd/secrets.go

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
3+
*/
4+
package cmd
5+
6+
import (
7+
"fmt"
8+
9+
"github.com/Infisical/infisical-merge/packages/models"
10+
"github.com/Infisical/infisical-merge/packages/util"
11+
"github.com/Infisical/infisical-merge/packages/visualize"
12+
log "github.com/sirupsen/logrus"
13+
"github.com/spf13/cobra"
14+
)
15+
16+
var secretsCmd = &cobra.Command{
17+
Example: `infisical secrets"`,
18+
Short: "Used to create, read update and delete secrets",
19+
Use: "secrets",
20+
DisableFlagsInUseLine: true,
21+
PreRun: toggleDebug,
22+
Args: cobra.NoArgs,
23+
Run: func(cmd *cobra.Command, args []string) {
24+
25+
secrets, err := util.GetAllEnvironmentVariables("", "dev")
26+
secrets = util.SubstituteSecrets(secrets)
27+
if err != nil {
28+
log.Debugln(err)
29+
return
30+
}
31+
visualize.PrintAllSecretDetails(secrets)
32+
},
33+
}
34+
35+
var secretsGetCmd = &cobra.Command{
36+
Example: `secrets get <secret name A> <secret name B>..."`,
37+
Short: "Used to retrieve secrets by name",
38+
Use: "get [secrets]",
39+
DisableFlagsInUseLine: true,
40+
Args: cobra.MinimumNArgs(1),
41+
PreRun: toggleDebug,
42+
Run: getSecretsByNames,
43+
}
44+
45+
var secretsSetCmd = &cobra.Command{
46+
Example: `secrets set <secret name A> <secret value A> <secret name B> <secret value B>..."`,
47+
Short: "Used update retrieve secrets by name",
48+
Use: "set [secrets]",
49+
DisableFlagsInUseLine: true,
50+
PreRun: toggleDebug,
51+
Args: cobra.NoArgs,
52+
Run: func(cmd *cobra.Command, args []string) {
53+
fmt.Println("set secret")
54+
},
55+
}
56+
57+
var secretsDeleteCmd = &cobra.Command{
58+
Example: `secrets delete <secret name A> <secret name B>..."`,
59+
Short: "Used to delete secrets by name",
60+
Use: "delete [secrets]",
61+
DisableFlagsInUseLine: true,
62+
PreRun: toggleDebug,
63+
Args: cobra.NoArgs,
64+
Run: func(cmd *cobra.Command, args []string) {
65+
fmt.Println("Delete secret")
66+
},
67+
}
68+
69+
func init() {
70+
secretsCmd.AddCommand(secretsGetCmd)
71+
secretsCmd.AddCommand(secretsSetCmd)
72+
secretsCmd.AddCommand(secretsDeleteCmd)
73+
rootCmd.AddCommand(secretsCmd)
74+
}
75+
76+
func getSecretsByNames(cmd *cobra.Command, args []string) {
77+
secrets, err := util.GetAllEnvironmentVariables("", "dev")
78+
if err != nil {
79+
log.Error("Unable to retrieve secrets. Run with -d to see full logs")
80+
log.Debug(err)
81+
}
82+
83+
requestedSecrets := []models.SingleEnvironmentVariable{}
84+
85+
secretsMap := make(map[string]models.SingleEnvironmentVariable)
86+
for _, secret := range secrets {
87+
secretsMap[secret.Key] = secret
88+
}
89+
90+
for _, secretKeyFromArg := range args {
91+
if value, ok := secretsMap[secretKeyFromArg]; ok {
92+
requestedSecrets = append(requestedSecrets, value)
93+
} else {
94+
requestedSecrets = append(requestedSecrets, models.SingleEnvironmentVariable{
95+
Key: secretKeyFromArg,
96+
Type: "NOT FOUND",
97+
Value: "NOT FOUND",
98+
})
99+
}
100+
}
101+
102+
visualize.PrintAllSecretDetails(requestedSecrets)
103+
}

0 commit comments

Comments
 (0)