diff --git a/.github/workflows/ci_production.yml b/.github/workflows/ci_production.yml index 85a65c2a..9e06ef35 100644 --- a/.github/workflows/ci_production.yml +++ b/.github/workflows/ci_production.yml @@ -34,6 +34,7 @@ jobs: echo "VITE_API_URL=${{ secrets.PROD_VITE_API_URL }}" >> app/.env echo "VITE_DOMAINS=${{ secrets.PROD_VITE_DOMAINS }}" >> app/.env echo "VITE_APP_NAME=${{ secrets.PROD_VITE_APP_NAME }}" >> app/.env + echo "VITE_RESYNC_URL=${{ secrets.PROD_VITE_RESYNC_URL }}" >> app/.env - name: Build api image run: docker build -t $REGISTRY/$API_IMAGE:$TAG api/. diff --git a/.github/workflows/ci_staging.yml b/.github/workflows/ci_staging.yml index 6e526582..ada0ba60 100644 --- a/.github/workflows/ci_staging.yml +++ b/.github/workflows/ci_staging.yml @@ -32,6 +32,7 @@ jobs: echo "VITE_API_URL=${{ secrets.STAGING_VITE_API_URL }}" >> app/.env echo "VITE_DOMAINS=${{ secrets.STAGING_VITE_DOMAINS }}" >> app/.env echo "VITE_APP_NAME=${{ secrets.STAGING_VITE_APP_NAME }}" >> app/.env + echo "VITE_RESYNC_URL=${{ secrets.STAGING_VITE_RESYNC_URL }}" >> app/.env - name: Build api image run: docker build -t $REGISTRY/$API_IMAGE:$TAG api/. diff --git a/api/.env.sample b/api/.env.sample index e8b4ca96..6780872d 100644 --- a/api/.env.sample +++ b/api/.env.sample @@ -1,54 +1,55 @@ -FQDN="localhost" -API_NAME="Service Name" -API_PORT="3000" -API_ALLOW_ORIGIN="http://localhost:3001" -TOKEN_SECRET="secret" +FQDN=localhost +API_NAME=Service Name +API_PORT=3000 +API_ALLOW_ORIGIN=http://localhost:3001 +API_TRUSTED_PROXIES=127.0.0.1,10.0.0.0/8,172.16.0.0/12 +API_ALLOW_IPS=127.0.0.1 +TOKEN_SECRET=secret TOKEN_EXPIRATION=168h API_TOKEN_EXPIRATION=8760h -PSK="" -PSK_ALLOW_ORIGIN="http://localhost:3001" -DOMAINS="example1.net,example2.com" -LOG_FILE="/var/log/api.log" -BASIC_AUTH_USER="" -BASIC_AUTH_PASSWORD="" -NET_SUBNET="" -NET_GATEWAY="" -SIGNUP_WEBHOOK_URL="" -SIGNUP_WEBHOOK_PSK="" +PSK= +DOMAINS=example1.net,example2.com +LOG_FILE=/var/log/api.log +BASIC_AUTH_USER= +BASIC_AUTH_PASSWORD= +NET_SUBNET= +NET_GATEWAY= +SIGNUP_WEBHOOK_URL= +SIGNUP_WEBHOOK_PSK= -APP_PORT="3001" +APP_PORT=3001 -DB_HOSTS="db" -DB_PORT="3306" -DB_NAME="email" -DB_USER="email" -DB_PASSWORD="email" -DB_ROOT_USER="root" -DB_ROOT_PASSWORD="root" +DB_HOSTS=db +DB_PORT=3306 +DB_NAME=email +DB_USER=email +DB_PASSWORD=email +DB_ROOT_USER=root +DB_ROOT_PASSWORD=root -REDIS_ADDR="redis:6379" -REDIS_ADDRS="" -REDIS_MASTER_NAME="" -REDIS_USERNAME="" -REDIS_PASSWORD="" -REDIS_FAILOVER_USERNAME="" -REDIS_FAILOVER_PASSWORD="" -REDIS_TLS_ENABLED="false" -REDIS_CERT_FILE="" -REDIS_KEY_FILE="" -REDIS_CA_CERT_FILE="" -REDIS_TLS_INSECURE_SKIP_VERIFY="false" +REDIS_ADDR=redis:6379 +REDIS_ADDRS= +REDIS_MASTER_NAME= +REDIS_USERNAME= +REDIS_PASSWORD= +REDIS_FAILOVER_USERNAME= +REDIS_FAILOVER_PASSWORD= +REDIS_TLS_ENABLED=false +REDIS_CERT_FILE= +REDIS_KEY_FILE= +REDIS_CA_CERT_FILE= +REDIS_TLS_INSECURE_SKIP_VERIFY=false -SMTP_CLIENT_HOST="smtp.example.net" -SMTP_CLIENT_PORT="2525" -SMTP_CLIENT_USER="" -SMTP_CLIENT_PASSWORD="" -SMTP_CLIENT_SENDER="from@example.net" -SMTP_CLIENT_SENDER_NAME="From Name" -SMTP_CLIENT_REPORT="" +SMTP_CLIENT_HOST=smtp.example.net +SMTP_CLIENT_PORT=2525 +SMTP_CLIENT_USER= +SMTP_CLIENT_PASSWORD= +SMTP_CLIENT_SENDER=from@example.net +SMTP_CLIENT_SENDER_NAME=From Name +SMTP_CLIENT_REPORT= OTP_EXPIRATION=15m -SUBSCRIPTION_TYPE="" +SUBSCRIPTION_TYPE= MAX_CREDENTIALS=10 MAX_RECIPIENTS=10 MAX_DAILY_ALIASES=100 @@ -59,10 +60,10 @@ ACCOUNT_GRACE_PERIOD_DAYS=194 ID_LIMITER_MAX=5 ID_LIMITER_EXPIRATION=60m -BACKUP_FILENAME="backup" -BACKUP_CRON_EXPRESSION="0 0 29 2 1" +BACKUP_FILENAME=backup +BACKUP_CRON_EXPRESSION=0 0 29 2 1 BACKUP_RETENTION_DAYS=7 -GPG_PASSPHRASE="" -AWS_S3_BUCKET_NAME="" -AWS_ACCESS_KEY_ID="" -AWS_SECRET_ACCESS_KEY="" +GPG_PASSPHRASE= +AWS_S3_BUCKET_NAME= +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= diff --git a/api/config/config.go b/api/config/config.go index 5f672eeb..0f2261dd 100644 --- a/api/config/config.go +++ b/api/config/config.go @@ -12,11 +12,12 @@ type APIConfig struct { Name string Port string ApiAllowOrigin string + ApiTrustedProxies []string + ApiAllowIPs []string TokenSecret string TokenExpiration time.Duration ApiTokenExpiration time.Duration PSK string - PSKAllowOrigin string Domains string LogFile string BasicAuthUser string @@ -147,6 +148,8 @@ func New() (Config, error) { dbHosts := strings.Split(os.Getenv("DB_HOSTS"), ",") redisAddrs := strings.Split(os.Getenv("REDIS_ADDRESSES"), ",") + apiTrustedProxies := strings.Split(os.Getenv("API_TRUSTED_PROXIES"), ",") + apiAllowIPs := strings.Split(os.Getenv("API_ALLOW_IPS"), ",") return Config{ API: APIConfig{ @@ -154,11 +157,12 @@ func New() (Config, error) { Name: os.Getenv("API_NAME"), Port: os.Getenv("API_PORT"), ApiAllowOrigin: os.Getenv("API_ALLOW_ORIGIN"), + ApiTrustedProxies: apiTrustedProxies, + ApiAllowIPs: apiAllowIPs, TokenSecret: os.Getenv("TOKEN_SECRET"), TokenExpiration: tokenExp, ApiTokenExpiration: apiTokenExp, PSK: os.Getenv("PSK"), - PSKAllowOrigin: os.Getenv("PSK_ALLOW_ORIGIN"), Domains: os.Getenv("DOMAINS"), LogFile: os.Getenv("LOG_FILE"), BasicAuthUser: os.Getenv("BASIC_AUTH_USER"), diff --git a/api/internal/client/mailer/templates/password_reset.tmpl b/api/internal/client/mailer/templates/password_reset.tmpl index e32387e9..3f29d8d3 100644 --- a/api/internal/client/mailer/templates/password_reset.tmpl +++ b/api/internal/client/mailer/templates/password_reset.tmpl @@ -3,7 +3,7 @@ You are receiving this email because we received a password reset request for your account. To reset your password, please visit the url below: -{{.origin}}/reset/password/{{.otp}} +{{.origin}}/reset-password/{{.otp}} If you did not make this request, please ignore this email. This request will expire in {{.expiration}} minutes. @@ -18,7 +18,7 @@ a password reset request for your account.

To reset your password, please visit the url below:
-{{.origin}}/reset/password/{{.otp}} +{{.origin}}/reset-password/{{.otp}}

If you did not make this request,
diff --git a/api/internal/middleware/auth/auth.go b/api/internal/middleware/auth/auth.go index 8a6b2c82..1bebb607 100644 --- a/api/internal/middleware/auth/auth.go +++ b/api/internal/middleware/auth/auth.go @@ -3,6 +3,7 @@ package auth import ( "context" "fmt" + "slices" "strings" "time" @@ -54,14 +55,26 @@ func New(cfg config.APIConfig, cache Cache, service Service) fiber.Handler { } } -func NewPSK(cfg config.APIConfig) fiber.Handler { +func NewIPFilter(allowedIPs []string) fiber.Handler { return func(c *fiber.Ctx) error { - if GetAuthToken(c) != cfg.PSK { - return c.SendStatus(fiber.StatusUnauthorized) + clientIP := c.IP() + if slices.Contains(allowedIPs, clientIP) { + return c.Next() } - return c.Next() + return c.SendStatus(fiber.StatusForbidden) + } +} + +func NewPSK(psk string) fiber.Handler { + + return func(c *fiber.Ctx) error { + if GetAuthToken(c) == psk { + return c.Next() + } + + return c.SendStatus(fiber.StatusUnauthorized) } } diff --git a/api/internal/transport/api/routes.go b/api/internal/transport/api/routes.go index 5156d508..759d828e 100644 --- a/api/internal/transport/api/routes.go +++ b/api/internal/transport/api/routes.go @@ -15,7 +15,8 @@ import ( func (h *Handler) SetupRoutes(cfg config.APIConfig) { email := h.Server.Group("/v1/email") - email.Use(auth.NewPSK(cfg)) + email.Use(auth.NewIPFilter(cfg.ApiAllowIPs)) + email.Use(auth.NewPSK(cfg.PSK)) email.Post("", h.HandleEmail) h.Server.Use(auth.NewAPICORS(cfg)) @@ -34,7 +35,8 @@ func (h *Handler) SetupRoutes(cfg config.APIConfig) { h.Server.Post("/v1/login/finish", limiter.New(), h.FinishLogin) sub := h.Server.Group("/v1/subscription") - sub.Use(auth.NewPSK(cfg)) + sub.Use(auth.NewIPFilter(cfg.ApiAllowIPs)) + sub.Use(auth.NewPSK(cfg.PSK)) sub.Post("/add", h.AddSubscription) api := h.Server.Group("/v1/api") diff --git a/api/internal/transport/api/server.go b/api/internal/transport/api/server.go index 9c959c7c..143bba38 100644 --- a/api/internal/transport/api/server.go +++ b/api/internal/transport/api/server.go @@ -40,7 +40,11 @@ type Cache interface { func Start(cfg config.APIConfig, service Service, cache Cache) error { log.Printf("API server starting on :%s", cfg.Port) - app := fiber.New() + app := fiber.New(fiber.Config{ + EnableTrustedProxyCheck: true, + TrustedProxies: cfg.ApiTrustedProxies, + ProxyHeader: fiber.HeaderXForwardedFor, + }) h := &Handler{ Cfg: cfg, diff --git a/app/.env.sample b/app/.env.sample index 62273699..c5e89042 100644 --- a/app/.env.sample +++ b/app/.env.sample @@ -1,3 +1,4 @@ VITE_API_URL=http://localhost:3000 VITE_DOMAINS=example1.net,example2.net -VITE_APP_NAME=App \ No newline at end of file +VITE_APP_NAME=App +VITE_RESYNC_URL=http://localhost:8010/en/account/?action=resync \ No newline at end of file diff --git a/app/src/api/api.ts b/app/src/api/api.ts index 07e5c42c..caac4303 100644 --- a/app/src/api/api.ts +++ b/app/src/api/api.ts @@ -9,7 +9,7 @@ export const api = axios.create({ api.interceptors.response.use( response => response, // simply return the response in case of success error => { - if (error.response && error.response.status === 401 && window.location.pathname !== '/login') { + if (error.response && error.response.status === 401 && window.location.pathname.startsWith('/account')) { // Handle the 401 error userApi.clearSession() } diff --git a/app/src/api/user.ts b/app/src/api/user.ts index 3b1161d9..e89ac4de 100644 --- a/app/src/api/user.ts +++ b/app/src/api/user.ts @@ -30,6 +30,6 @@ export const userApi = { accessKeyDelete: (id: string) => api.delete('/accesskeys/' + id), clearSession: () => { localStorage.removeItem('email') - window.location.href = '/login' + window.location.href = '/' }, } diff --git a/app/src/assets/feature-set-alias-dark.png b/app/src/assets/feature-set-alias-dark.png new file mode 100644 index 00000000..b1d109a2 Binary files /dev/null and b/app/src/assets/feature-set-alias-dark.png differ diff --git a/app/src/assets/feature-set-alias-light.png b/app/src/assets/feature-set-alias-light.png new file mode 100644 index 00000000..150ac50e Binary files /dev/null and b/app/src/assets/feature-set-alias-light.png differ diff --git a/app/src/assets/feature-set-stats-dark.png b/app/src/assets/feature-set-stats-dark.png new file mode 100644 index 00000000..9f8f2044 Binary files /dev/null and b/app/src/assets/feature-set-stats-dark.png differ diff --git a/app/src/assets/feature-set-stats-light.png b/app/src/assets/feature-set-stats-light.png new file mode 100644 index 00000000..84c5709a Binary files /dev/null and b/app/src/assets/feature-set-stats-light.png differ diff --git a/app/src/assets/hero-bg-dark-desktop.svg b/app/src/assets/hero-bg-dark-desktop.svg new file mode 100644 index 00000000..f0dcfa6a --- /dev/null +++ b/app/src/assets/hero-bg-dark-desktop.svg @@ -0,0 +1,25 @@ + + +
+ + + + + + + +
+ + + + + + + + + + + + + +
diff --git a/app/src/assets/hero-bg-dark-tablet.svg b/app/src/assets/hero-bg-dark-tablet.svg new file mode 100644 index 00000000..e8ab17a7 --- /dev/null +++ b/app/src/assets/hero-bg-dark-tablet.svg @@ -0,0 +1,28 @@ + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + +
diff --git a/app/src/assets/hero-bg-light-desktop.svg b/app/src/assets/hero-bg-light-desktop.svg new file mode 100644 index 00000000..716cb87c --- /dev/null +++ b/app/src/assets/hero-bg-light-desktop.svg @@ -0,0 +1,25 @@ + + +
+ + + + + + + +
+ + + + + + + + + + + + + +
diff --git a/app/src/assets/hero-bg-light-tablet.svg b/app/src/assets/hero-bg-light-tablet.svg new file mode 100644 index 00000000..52034b3a --- /dev/null +++ b/app/src/assets/hero-bg-light-tablet.svg @@ -0,0 +1,28 @@ + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + +
diff --git a/app/src/assets/icons/comp-arrow-left-dark.svg b/app/src/assets/icons/comp-arrow-left-dark.svg new file mode 100644 index 00000000..4152ffc6 --- /dev/null +++ b/app/src/assets/icons/comp-arrow-left-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-arrow-left-light.svg b/app/src/assets/icons/comp-arrow-left-light.svg new file mode 100644 index 00000000..9320a7f1 --- /dev/null +++ b/app/src/assets/icons/comp-arrow-left-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-arrow-right-dark.svg b/app/src/assets/icons/comp-arrow-right-dark.svg new file mode 100644 index 00000000..5e058ee3 --- /dev/null +++ b/app/src/assets/icons/comp-arrow-right-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-arrow-right-light.svg b/app/src/assets/icons/comp-arrow-right-light.svg new file mode 100644 index 00000000..ed625e0c --- /dev/null +++ b/app/src/assets/icons/comp-arrow-right-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-arrow-vertical-dark.svg b/app/src/assets/icons/comp-arrow-vertical-dark.svg new file mode 100644 index 00000000..9ec69b71 --- /dev/null +++ b/app/src/assets/icons/comp-arrow-vertical-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-arrow-vertical-light.svg b/app/src/assets/icons/comp-arrow-vertical-light.svg new file mode 100644 index 00000000..56cb9d55 --- /dev/null +++ b/app/src/assets/icons/comp-arrow-vertical-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-bulb-dark.svg b/app/src/assets/icons/comp-bulb-dark.svg new file mode 100644 index 00000000..fdb9c408 --- /dev/null +++ b/app/src/assets/icons/comp-bulb-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-bulb-light.svg b/app/src/assets/icons/comp-bulb-light.svg new file mode 100644 index 00000000..703d1826 --- /dev/null +++ b/app/src/assets/icons/comp-bulb-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-cross-dark.svg b/app/src/assets/icons/comp-cross-dark.svg new file mode 100644 index 00000000..268a1102 --- /dev/null +++ b/app/src/assets/icons/comp-cross-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/assets/icons/comp-cross-light.svg b/app/src/assets/icons/comp-cross-light.svg new file mode 100644 index 00000000..5a0bca3c --- /dev/null +++ b/app/src/assets/icons/comp-cross-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/assets/icons/comp-db-dark.svg b/app/src/assets/icons/comp-db-dark.svg new file mode 100644 index 00000000..eaa5276a --- /dev/null +++ b/app/src/assets/icons/comp-db-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-db-light.svg b/app/src/assets/icons/comp-db-light.svg new file mode 100644 index 00000000..66b7e771 --- /dev/null +++ b/app/src/assets/icons/comp-db-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-ivpn-desktop.svg b/app/src/assets/icons/comp-ivpn-desktop.svg new file mode 100644 index 00000000..26679f1a --- /dev/null +++ b/app/src/assets/icons/comp-ivpn-desktop.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/assets/icons/comp-ivpn-mobile.svg b/app/src/assets/icons/comp-ivpn-mobile.svg new file mode 100644 index 00000000..aced5ab4 --- /dev/null +++ b/app/src/assets/icons/comp-ivpn-mobile.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mailx-dark.svg b/app/src/assets/icons/comp-mailx-dark.svg new file mode 100644 index 00000000..5a167bbb --- /dev/null +++ b/app/src/assets/icons/comp-mailx-dark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mailx-light.svg b/app/src/assets/icons/comp-mailx-light.svg new file mode 100644 index 00000000..b232afe9 --- /dev/null +++ b/app/src/assets/icons/comp-mailx-light.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-left-dark.svg b/app/src/assets/icons/comp-mobile-left-dark.svg new file mode 100644 index 00000000..3ec353af --- /dev/null +++ b/app/src/assets/icons/comp-mobile-left-dark.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-left-light.svg b/app/src/assets/icons/comp-mobile-left-light.svg new file mode 100644 index 00000000..cf864841 --- /dev/null +++ b/app/src/assets/icons/comp-mobile-left-light.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-right-dark.svg b/app/src/assets/icons/comp-mobile-right-dark.svg new file mode 100644 index 00000000..5c184772 --- /dev/null +++ b/app/src/assets/icons/comp-mobile-right-dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-right-light.svg b/app/src/assets/icons/comp-mobile-right-light.svg new file mode 100644 index 00000000..0c519497 --- /dev/null +++ b/app/src/assets/icons/comp-mobile-right-light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-vertical-dark.svg b/app/src/assets/icons/comp-mobile-vertical-dark.svg new file mode 100644 index 00000000..a267f4d2 --- /dev/null +++ b/app/src/assets/icons/comp-mobile-vertical-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-mobile-vertical-light.svg b/app/src/assets/icons/comp-mobile-vertical-light.svg new file mode 100644 index 00000000..2cdabd88 --- /dev/null +++ b/app/src/assets/icons/comp-mobile-vertical-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/assets/icons/comp-moddns-dark.svg b/app/src/assets/icons/comp-moddns-dark.svg new file mode 100644 index 00000000..dbea3209 --- /dev/null +++ b/app/src/assets/icons/comp-moddns-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-moddns-light.svg b/app/src/assets/icons/comp-moddns-light.svg new file mode 100644 index 00000000..1253c43b --- /dev/null +++ b/app/src/assets/icons/comp-moddns-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-portmark-dark.svg b/app/src/assets/icons/comp-portmark-dark.svg new file mode 100644 index 00000000..cbbb3785 --- /dev/null +++ b/app/src/assets/icons/comp-portmark-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-portmark-light.svg b/app/src/assets/icons/comp-portmark-light.svg new file mode 100644 index 00000000..e02210c2 --- /dev/null +++ b/app/src/assets/icons/comp-portmark-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-repeat-dark.svg b/app/src/assets/icons/comp-repeat-dark.svg new file mode 100644 index 00000000..bb93c7b9 --- /dev/null +++ b/app/src/assets/icons/comp-repeat-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-repeat-light.svg b/app/src/assets/icons/comp-repeat-light.svg new file mode 100644 index 00000000..5dd37abc --- /dev/null +++ b/app/src/assets/icons/comp-repeat-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/comp-signin-dark.svg b/app/src/assets/icons/comp-signin-dark.svg new file mode 100644 index 00000000..e5ba78e0 --- /dev/null +++ b/app/src/assets/icons/comp-signin-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/comp-signin-light.svg b/app/src/assets/icons/comp-signin-light.svg new file mode 100644 index 00000000..f3c62c8d --- /dev/null +++ b/app/src/assets/icons/comp-signin-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/feature-icon-data-leak-dark.svg b/app/src/assets/icons/feature-icon-data-leak-dark.svg new file mode 100644 index 00000000..b0a663ef --- /dev/null +++ b/app/src/assets/icons/feature-icon-data-leak-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/src/assets/icons/feature-icon-data-leak-light.svg b/app/src/assets/icons/feature-icon-data-leak-light.svg new file mode 100644 index 00000000..ed9a1faa --- /dev/null +++ b/app/src/assets/icons/feature-icon-data-leak-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/src/assets/icons/feature-icon-data-leak.svg b/app/src/assets/icons/feature-icon-data-leak.svg new file mode 100644 index 00000000..b0a663ef --- /dev/null +++ b/app/src/assets/icons/feature-icon-data-leak.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/src/assets/icons/feature-icon-lock-dark.svg b/app/src/assets/icons/feature-icon-lock-dark.svg new file mode 100644 index 00000000..e984f748 --- /dev/null +++ b/app/src/assets/icons/feature-icon-lock-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/feature-icon-lock-light.svg b/app/src/assets/icons/feature-icon-lock-light.svg new file mode 100644 index 00000000..9fc8fb4a --- /dev/null +++ b/app/src/assets/icons/feature-icon-lock-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/feature-icon-lock.svg b/app/src/assets/icons/feature-icon-lock.svg new file mode 100644 index 00000000..e984f748 --- /dev/null +++ b/app/src/assets/icons/feature-icon-lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/feature-icon-users-dark.svg b/app/src/assets/icons/feature-icon-users-dark.svg new file mode 100644 index 00000000..80cebd6c --- /dev/null +++ b/app/src/assets/icons/feature-icon-users-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/feature-icon-users-light.svg b/app/src/assets/icons/feature-icon-users-light.svg new file mode 100644 index 00000000..7a370579 --- /dev/null +++ b/app/src/assets/icons/feature-icon-users-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/feature-icon-users.svg b/app/src/assets/icons/feature-icon-users.svg new file mode 100644 index 00000000..80cebd6c --- /dev/null +++ b/app/src/assets/icons/feature-icon-users.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-mail-dark.svg b/app/src/assets/icons/flow-icon-mail-dark.svg new file mode 100644 index 00000000..7d8a1d74 --- /dev/null +++ b/app/src/assets/icons/flow-icon-mail-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-mail-light.svg b/app/src/assets/icons/flow-icon-mail-light.svg new file mode 100644 index 00000000..1f613672 --- /dev/null +++ b/app/src/assets/icons/flow-icon-mail-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-mail.svg b/app/src/assets/icons/flow-icon-mail.svg new file mode 100644 index 00000000..7d8a1d74 --- /dev/null +++ b/app/src/assets/icons/flow-icon-mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-server-dark.svg b/app/src/assets/icons/flow-icon-server-dark.svg new file mode 100644 index 00000000..d873f7d0 --- /dev/null +++ b/app/src/assets/icons/flow-icon-server-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/flow-icon-server-light.svg b/app/src/assets/icons/flow-icon-server-light.svg new file mode 100644 index 00000000..e203cfc8 --- /dev/null +++ b/app/src/assets/icons/flow-icon-server-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/flow-icon-server.svg b/app/src/assets/icons/flow-icon-server.svg new file mode 100644 index 00000000..d873f7d0 --- /dev/null +++ b/app/src/assets/icons/flow-icon-server.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/flow-icon-user-dark.svg b/app/src/assets/icons/flow-icon-user-dark.svg new file mode 100644 index 00000000..5d4e27b3 --- /dev/null +++ b/app/src/assets/icons/flow-icon-user-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-user-light.svg b/app/src/assets/icons/flow-icon-user-light.svg new file mode 100644 index 00000000..d073fc07 --- /dev/null +++ b/app/src/assets/icons/flow-icon-user-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/flow-icon-user.svg b/app/src/assets/icons/flow-icon-user.svg new file mode 100644 index 00000000..5d4e27b3 --- /dev/null +++ b/app/src/assets/icons/flow-icon-user.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/icon-data-leak.svg b/app/src/assets/icons/icon-data-leak.svg new file mode 100644 index 00000000..35249f44 --- /dev/null +++ b/app/src/assets/icons/icon-data-leak.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/icon-lock.svg b/app/src/assets/icons/icon-lock.svg new file mode 100644 index 00000000..739fec36 --- /dev/null +++ b/app/src/assets/icons/icon-lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/icon-server.svg b/app/src/assets/icons/icon-server.svg new file mode 100644 index 00000000..860a5aaa --- /dev/null +++ b/app/src/assets/icons/icon-server.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/icons/icon-users.svg b/app/src/assets/icons/icon-users.svg new file mode 100644 index 00000000..7dcece05 --- /dev/null +++ b/app/src/assets/icons/icon-users.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/src/assets/icons/trust-accountable-dark.svg b/app/src/assets/icons/trust-accountable-dark.svg new file mode 100644 index 00000000..5ed45147 --- /dev/null +++ b/app/src/assets/icons/trust-accountable-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/trust-accountable-light.svg b/app/src/assets/icons/trust-accountable-light.svg new file mode 100644 index 00000000..18adec8c --- /dev/null +++ b/app/src/assets/icons/trust-accountable-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/icons/trust-audit-dark.svg b/app/src/assets/icons/trust-audit-dark.svg new file mode 100644 index 00000000..cd93e348 --- /dev/null +++ b/app/src/assets/icons/trust-audit-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/trust-audit-light.svg b/app/src/assets/icons/trust-audit-light.svg new file mode 100644 index 00000000..56610b14 --- /dev/null +++ b/app/src/assets/icons/trust-audit-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/trust-no-tracking-dark.svg b/app/src/assets/icons/trust-no-tracking-dark.svg new file mode 100644 index 00000000..abb5dcdf --- /dev/null +++ b/app/src/assets/icons/trust-no-tracking-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/trust-no-tracking-light.svg b/app/src/assets/icons/trust-no-tracking-light.svg new file mode 100644 index 00000000..61db9c74 --- /dev/null +++ b/app/src/assets/icons/trust-no-tracking-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/assets/icons/trust-open-source-dark.svg b/app/src/assets/icons/trust-open-source-dark.svg new file mode 100644 index 00000000..83ef1820 --- /dev/null +++ b/app/src/assets/icons/trust-open-source-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/assets/icons/trust-open-source-light.svg b/app/src/assets/icons/trust-open-source-light.svg new file mode 100644 index 00000000..4afb6a51 --- /dev/null +++ b/app/src/assets/icons/trust-open-source-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/assets/landing-screenshot-dark.png b/app/src/assets/landing-screenshot-dark.png new file mode 100644 index 00000000..90e0ae6c Binary files /dev/null and b/app/src/assets/landing-screenshot-dark.png differ diff --git a/app/src/assets/landing-screenshot-dark@2x.png b/app/src/assets/landing-screenshot-dark@2x.png new file mode 100644 index 00000000..ca769345 Binary files /dev/null and b/app/src/assets/landing-screenshot-dark@2x.png differ diff --git a/app/src/assets/landing-screenshot-light.png b/app/src/assets/landing-screenshot-light.png new file mode 100644 index 00000000..921e4f87 Binary files /dev/null and b/app/src/assets/landing-screenshot-light.png differ diff --git a/app/src/assets/landing-screenshot-light@2x.png b/app/src/assets/landing-screenshot-light@2x.png new file mode 100644 index 00000000..b1838164 Binary files /dev/null and b/app/src/assets/landing-screenshot-light@2x.png differ diff --git a/app/src/assets/mailX-3.svg b/app/src/assets/mailX-3.svg index 2bc33c42..0a70d3d9 100644 --- a/app/src/assets/mailX-3.svg +++ b/app/src/assets/mailX-3.svg @@ -1,6 +1,6 @@ - + diff --git a/app/src/assets/mailX-5.svg b/app/src/assets/mailX-5.svg index ec222944..5626bd2c 100644 --- a/app/src/assets/mailX-5.svg +++ b/app/src/assets/mailX-5.svg @@ -1,6 +1,6 @@ - + diff --git a/app/src/components/AccountSubscriptionStatus.vue b/app/src/components/AccountSubscriptionStatus.vue index 6be4e96a..b837fcc9 100644 --- a/app/src/components/AccountSubscriptionStatus.vue +++ b/app/src/components/AccountSubscriptionStatus.vue @@ -1,7 +1,7 @@

- Your subscription is inactive + Your subscription is inactive

diff --git a/app/src/components/AccountVerify.vue b/app/src/components/AccountVerify.vue index 474648a1..9fc0d8ba 100644 --- a/app/src/components/AccountVerify.vue +++ b/app/src/components/AccountVerify.vue @@ -1,6 +1,6 @@