This commit is contained in:
Tuan Dang
2023-01-11 10:20:34 +07:00
12 changed files with 145 additions and 133 deletions
+18 -10
View File
@@ -1,4 +1,4 @@
name: Push to Docker Hub name: Push frontend and backend to Dockerhub
on: [workflow_dispatch] on: [workflow_dispatch]
@@ -13,8 +13,6 @@ jobs:
- name: Save commit hashes for tag - name: Save commit hashes for tag
id: commit id: commit
uses: pr-mpt/actions-commit-hash@v2 uses: pr-mpt/actions-commit-hash@v2
- name: 🔧 Set up QEMU
uses: docker/setup-qemu-action@v2
- name: 🔧 Set up Docker Buildx - name: 🔧 Set up Docker Buildx
uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
- name: 🐋 Login to Docker Hub - name: 🐋 Login to Docker Hub
@@ -22,9 +20,13 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Depot CLI
uses: depot/setup-action@v1
- name: 📦 Build backend and export to Docker - name: 📦 Build backend and export to Docker
uses: docker/build-push-action@v3 uses: depot/build-push-action@v1
with: with:
project: 64mmf0n610
token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
load: true load: true
context: backend context: backend
tags: infisical/backend:test tags: infisical/backend:test
@@ -38,8 +40,10 @@ jobs:
run: | run: |
docker compose -f .github/resources/docker-compose.be-test.yml down docker compose -f .github/resources/docker-compose.be-test.yml down
- name: 🏗️ Build backend and push - name: 🏗️ Build backend and push
uses: docker/build-push-action@v3 uses: depot/build-push-action@v1
with: with:
project: 64mmf0n610
token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
push: true push: true
context: backend context: backend
tags: infisical/backend:${{ steps.commit.outputs.short }}, tags: infisical/backend:${{ steps.commit.outputs.short }},
@@ -56,8 +60,6 @@ jobs:
- name: Save commit hashes for tag - name: Save commit hashes for tag
id: commit id: commit
uses: pr-mpt/actions-commit-hash@v2 uses: pr-mpt/actions-commit-hash@v2
- name: 🔧 Set up QEMU
uses: docker/setup-qemu-action@v2
- name: 🔧 Set up Docker Buildx - name: 🔧 Set up Docker Buildx
uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
- name: 🐋 Login to Docker Hub - name: 🐋 Login to Docker Hub
@@ -65,10 +67,14 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Depot CLI
uses: depot/setup-action@v1
- name: 📦 Build frontend and export to Docker - name: 📦 Build frontend and export to Docker
uses: docker/build-push-action@v3 uses: depot/build-push-action@v1
with: with:
load: true load: true
token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
project: 64mmf0n610
context: frontend context: frontend
tags: infisical/frontend:test tags: infisical/frontend:test
build-args: | build-args: |
@@ -83,12 +89,14 @@ jobs:
run: | run: |
docker stop infisical-frontend-test docker stop infisical-frontend-test
- name: 🏗️ Build frontend and push - name: 🏗️ Build frontend and push
uses: docker/build-push-action@v3 uses: depot/build-push-action@v1
with: with:
project: 64mmf0n610
push: true push: true
token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
context: frontend context: frontend
tags: infisical/frontend:${{ steps.commit.outputs.short }}, tags: infisical/frontend:${{ steps.commit.outputs.short }},
infisical/frontend:latest infisical/frontend:latest
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: | build-args: |
POSTHOG_API_KEY=${{ secrets.PUBLIC_POSTHOG_API_KEY }} POSTHOG_API_KEY=${{ secrets.PUBLIC_POSTHOG_API_KEY }}
+1 -1
View File
@@ -1,4 +1,4 @@
name: Go releaser name: Build and release CLI
on: on:
push: push:
+1 -1
View File
@@ -337,6 +337,6 @@ Infisical officially launched as v.1.0 on November 21st, 2022. There are a lot o
## 🌎 Translations ## 🌎 Translations
Infisical is currently aviable in English and Korean. Help us translate Infisical to your language! Infisical is currently available in English and Korean. Help us translate Infisical to your language!
You can find all the info in [this issue](https://github.com/Infisical/infisical/issues/181). You can find all the info in [this issue](https://github.com/Infisical/infisical/issues/181).
+106 -106
View File
@@ -7,7 +7,7 @@ const { ValidationError } = mongoose.Error;
import { BadRequestError, InternalServerError, UnauthorizedRequestError, ValidationError as RouteValidationError } from '../../utils/errors'; import { BadRequestError, InternalServerError, UnauthorizedRequestError, ValidationError as RouteValidationError } from '../../utils/errors';
import { AnyBulkWriteOperation } from 'mongodb'; import { AnyBulkWriteOperation } from 'mongodb';
import { SECRET_PERSONAL, SECRET_SHARED } from "../../variables"; import { SECRET_PERSONAL, SECRET_SHARED } from "../../variables";
import { postHogClient } from '../../services'; // import { postHogClient } from '../../services';
/** /**
* Create secret for workspace with id [workspaceId] and environment [environment] * Create secret for workspace with id [workspaceId] and environment [environment]
@@ -42,19 +42,19 @@ export const createSecret = async (req: Request, res: Response) => {
throw RouteValidationError({ message: error.message, stack: error.stack }) throw RouteValidationError({ message: error.message, stack: error.stack })
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets added', // event: 'secrets added',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: 1, // numberOfSecrets: 1,
workspaceId, // workspaceId,
environment, // environment,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
res.status(200).send({ res.status(200).send({
secret secret
@@ -103,19 +103,19 @@ export const createSecrets = async (req: Request, res: Response) => {
throw InternalServerError({ message: "Unable to process your batch create request. Please try again", stack: bulkCreateError.stack }) throw InternalServerError({ message: "Unable to process your batch create request. Please try again", stack: bulkCreateError.stack })
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets added', // event: 'secrets added',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: (secretsToCreate ?? []).length, // numberOfSecrets: (secretsToCreate ?? []).length,
workspaceId, // workspaceId,
environment, // environment,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
res.status(200).send({ res.status(200).send({
secrets secrets
@@ -158,19 +158,19 @@ export const deleteSecrets = async (req: Request, res: Response) => {
throw InternalServerError() throw InternalServerError()
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets deleted', // event: 'secrets deleted',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: numSecretsDeleted, // numberOfSecrets: numSecretsDeleted,
environment: environmentName, // environment: environmentName,
workspaceId, // workspaceId,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
res.status(200).send() res.status(200).send()
} }
@@ -183,19 +183,19 @@ export const deleteSecrets = async (req: Request, res: Response) => {
export const deleteSecret = async (req: Request, res: Response) => { export const deleteSecret = async (req: Request, res: Response) => {
await Secret.findByIdAndDelete(req._secret._id) await Secret.findByIdAndDelete(req._secret._id)
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets deleted', // event: 'secrets deleted',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: 1, // numberOfSecrets: 1,
workspaceId: req._secret.workspace.toString(), // workspaceId: req._secret.workspace.toString(),
environment: req._secret.environment, // environment: req._secret.environment,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
res.status(200).send({ res.status(200).send({
secret: req._secret secret: req._secret
@@ -252,19 +252,19 @@ export const updateSecrets = async (req: Request, res: Response) => {
throw InternalServerError() throw InternalServerError()
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets modified', // event: 'secrets modified',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: (secretsModificationsRequested ?? []).length, // numberOfSecrets: (secretsModificationsRequested ?? []).length,
environment: environmentName, // environment: environmentName,
workspaceId, // workspaceId,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
return res.status(200).send() return res.status(200).send()
} }
@@ -304,19 +304,19 @@ export const updateSecret = async (req: Request, res: Response) => {
throw RouteValidationError({ message: "Unable to apply modifications, please try again", stack: error.stack }) throw RouteValidationError({ message: "Unable to apply modifications, please try again", stack: error.stack })
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets modified', // event: 'secrets modified',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: 1, // numberOfSecrets: 1,
environment: environmentName, // environment: environmentName,
workspaceId, // workspaceId,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
return res.status(200).send(singleModificationUpdate) return res.status(200).send(singleModificationUpdate)
} }
@@ -354,19 +354,19 @@ export const getSecrets = async (req: Request, res: Response) => {
throw RouteValidationError({ message: "Failed to get secrets, please try again", stack: err.stack }) throw RouteValidationError({ message: "Failed to get secrets, please try again", stack: err.stack })
} }
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets pulled', // event: 'secrets pulled',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: (secrets ?? []).length, // numberOfSecrets: (secrets ?? []).length,
environment, // environment,
workspaceId, // workspaceId,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
return res.json(secrets) return res.json(secrets)
} }
@@ -378,20 +378,20 @@ export const getSecrets = async (req: Request, res: Response) => {
* @returns * @returns
*/ */
export const getSecret = async (req: Request, res: Response) => { export const getSecret = async (req: Request, res: Response) => {
if (postHogClient) { // if (postHogClient) {
postHogClient.capture({ // postHogClient.capture({
event: 'secrets pulled', // event: 'secrets pulled',
distinctId: req.user.email, // distinctId: req.user.email,
properties: { // properties: {
numberOfSecrets: 1, // numberOfSecrets: 1,
workspaceId: req._secret.workspace.toString(), // workspaceId: req._secret.workspace.toString(),
environment: req._secret.environment, // environment: req._secret.environment,
channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli', // channel: req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli',
userAgent: req.headers?.['user-agent'] // userAgent: req.headers?.['user-agent']
} // }
}); // });
} // }
return res.status(200).send({ return res.status(200).send({
secret: req._secret secret: req._secret
}); });
+3 -3
View File
@@ -48,7 +48,7 @@ const INTEGRATION_OPTIONS = [
name: 'Vercel', name: 'Vercel',
slug: 'vercel', slug: 'vercel',
image: 'Vercel', image: 'Vercel',
isAvailable: true, isAvailable: false,
type: 'vercel', type: 'vercel',
clientId: '', clientId: '',
clientSlug: CLIENT_SLUG_VERCEL, clientSlug: CLIENT_SLUG_VERCEL,
@@ -58,7 +58,7 @@ const INTEGRATION_OPTIONS = [
name: 'Netlify', name: 'Netlify',
slug: 'netlify', slug: 'netlify',
image: 'Netlify', image: 'Netlify',
isAvailable: true, isAvailable: false,
type: 'oauth2', type: 'oauth2',
clientId: CLIENT_ID_NETLIFY, clientId: CLIENT_ID_NETLIFY,
docsLink: '' docsLink: ''
@@ -67,7 +67,7 @@ const INTEGRATION_OPTIONS = [
name: 'GitHub', name: 'GitHub',
slug: 'github', slug: 'github',
image: 'GitHub', image: 'GitHub',
isAvailable: true, isAvailable: false,
type: 'oauth2', type: 'oauth2',
clientId: CLIENT_ID_GITHUB, clientId: CLIENT_ID_GITHUB,
docsLink: '' docsLink: ''
-1
View File
@@ -9,7 +9,6 @@ export const initPostHog = () => {
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
// @ts-ignore // @ts-ignore
if (ENV == 'production' && TELEMETRY_CAPTURING_ENABLED) { if (ENV == 'production' && TELEMETRY_CAPTURING_ENABLED) {
console.log("Outside of posthog", "POSTHOG_API_KEY", POSTHOG_API_KEY, "POSTHOG_HOST", POSTHOG_HOST)
posthog.init(POSTHOG_API_KEY, { posthog.init(POSTHOG_API_KEY, {
api_host: POSTHOG_HOST api_host: POSTHOG_HOST
}); });
+12 -5
View File
@@ -211,9 +211,16 @@ export default function Layout({ children }: LayoutProps) {
const intendedWorkspaceId = router.asPath const intendedWorkspaceId = router.asPath
.split("/") .split("/")
[router.asPath.split("/").length - 1].split("?")[0]; [router.asPath.split("/").length - 1].split("?")[0];
if (
!["heroku", "vercel", "github", "netlify"].includes(intendedWorkspaceId)
) {
localStorage.setItem("projectData.id", intendedWorkspaceId);
}
// If a user is not a member of a workspace they are trying to access, just push them to one of theirs // If a user is not a member of a workspace they are trying to access, just push them to one of theirs
if ( if (
intendedWorkspaceId != "heroku" && !["heroku", "vercel", "github", "netlify"].includes(intendedWorkspaceId) &&
!userWorkspaces !userWorkspaces
.map((workspace: { _id: string }) => workspace._id) .map((workspace: { _id: string }) => workspace._id)
.includes(intendedWorkspaceId) .includes(intendedWorkspaceId)
@@ -259,14 +266,14 @@ export default function Layout({ children }: LayoutProps) {
.split("/") .split("/")
[router.asPath.split("/").length - 1].split("?")[0] [router.asPath.split("/").length - 1].split("?")[0]
) { ) {
router.push(
"/dashboard/" +
workspaceMapping[workspaceSelected as any]
);
localStorage.setItem( localStorage.setItem(
"projectData.id", "projectData.id",
`${workspaceMapping[workspaceSelected as any]}` `${workspaceMapping[workspaceSelected as any]}`
); );
router.push(
"/dashboard/" +
workspaceMapping[workspaceSelected as any]
);
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@@ -73,8 +73,6 @@ const AddServiceTokenDialog = ({
tag tag
}); });
console.log('newServiceToken', newServiceToken);
setServiceTokens(serviceTokens.concat([newServiceToken.serviceTokenData])); setServiceTokens(serviceTokens.concat([newServiceToken.serviceTokenData]));
setServiceToken(newServiceToken.serviceToken + "." + randomBytes); setServiceToken(newServiceToken.serviceToken + "." + randomBytes);
}; };
+1 -1
View File
@@ -4,7 +4,7 @@
"no-integrations1": "You don't have any integrations set up yet. When you do, they will appear here.", "no-integrations1": "You don't have any integrations set up yet. When you do, they will appear here.",
"no-integrations2": "To start, click on any of the options below. It takes 5 clicks to set up.", "no-integrations2": "To start, click on any of the options below. It takes 5 clicks to set up.",
"available": "Platform & Cloud Integrations", "available": "Platform & Cloud Integrations",
"available-text1": "Click on the itegration you want to connect. This will let your environment variables flow automatically into selected third-party services.", "available-text1": "Click on the integration you want to connect. This will let your environment variables flow automatically into selected third-party services.",
"available-text2": "Note: during an integration with Heroku, for security reasons, it is impossible to maintain end-to-end encryption. In theory, this lets Infisical decrypt yor environment variables. In practice, we can assure you that this will never be done, and it allows us to protect your secrets from bad actors online. The core Infisical service will always stay end-to-end encrypted. With any questions, reach out [email protected].", "available-text2": "Note: during an integration with Heroku, for security reasons, it is impossible to maintain end-to-end encryption. In theory, this lets Infisical decrypt yor environment variables. In practice, we can assure you that this will never be done, and it allows us to protect your secrets from bad actors online. The core Infisical service will always stay end-to-end encrypted. With any questions, reach out [email protected].",
"cloud-integrations": "Cloud Integrations", "cloud-integrations": "Cloud Integrations",
"framework-integrations": "Framework Integrations", "framework-integrations": "Framework Integrations",
@@ -1,4 +1,4 @@
{ {
"title": "Project Members", "title": "Project Members",
"description": "This pages shows the members of the selected project." "description": "This page shows the members of the selected project."
} }
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"title": "Sign Up", "title": "Sign Up",
"og-title": "Replace .env files with 1 line of code. Sign Up for Infisical in 3 minutes.", "og-title": "Replace .env files with 1 line of code. Sign Up for Infisical in 3 minutes.",
"og-description": "Infisical a simple end-to-end encrypted platform that enables teams to sync and manage API-keys and environemntal variables. Works with Node.js, Next.js, Gatsby, Nest.js...", "og-description": "Infisical a simple end-to-end encrypted platform that enables teams to sync and manage API-keys and environemntal variables. Works with Node.js, Next.js, Gatsby, Nest.js...",
"signup": "Sign Up", "signup": "Sign Up",
"already-have-account": "Have an account? Log in", "already-have-account": "Have an account? Log in",
"forgot-password": "Forgot your password?", "forgot-password": "Forgot your password?",
+1 -1
View File
@@ -325,6 +325,6 @@ Infisical officially launched as v.1.0 on November 21st, 2022. However, a lot of
## 🌎 Translations ## 🌎 Translations
Infisical is currently aviable in English and Korean. Help us translate Infisical to your language! Infisical is currently available in English and Korean. Help us translate Infisical to your language!
You can find all the info in [this issue](https://github.com/Infisical/infisical/issues/181). You can find all the info in [this issue](https://github.com/Infisical/infisical/issues/181).