Skip to content

Commit b6e8023

Browse files
authored
Merge pull request #211 from authorizerdev/fix/email-template
fix email template
2 parents ad3e615 + 4f1597e commit b6e8023

File tree

13 files changed

+123
-81
lines changed

13 files changed

+123
-81
lines changed

dashboard/package-lock.json

Lines changed: 14 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dashboard/src/components/EnvComponents/Features.tsx

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { Flex, Stack, Text } from '@chakra-ui/react';
2+
import { Divider, Flex, Stack, Text } from '@chakra-ui/react';
33
import InputField from '../InputField';
44
import { SwitchInputType } from '../../constants';
55

@@ -10,7 +10,7 @@ const Features = ({ variables, setVariables }: any) => {
1010
<Text fontSize="md" paddingTop="2%" fontWeight="bold" mb={5}>
1111
Disable Features
1212
</Text>
13-
<Stack spacing={6} padding="2% 0%">
13+
<Stack spacing={6}>
1414
<Flex>
1515
<Flex w="100%" justifyContent="start" alignItems="center">
1616
<Text fontSize="sm">Disable Login Page:</Text>
@@ -83,9 +83,15 @@ const Features = ({ variables, setVariables }: any) => {
8383
/>
8484
</Flex>
8585
</Flex>
86-
<Flex>
87-
<Flex w="100%" justifyContent="start" alignItems="center">
88-
<Text fontSize="sm">Disable Multi Factor Authentication:</Text>
86+
<Flex alignItems="center">
87+
<Flex w="100%" alignItems="baseline" flexDir="column">
88+
<Text fontSize="sm">
89+
Disable Multi Factor Authentication (MFA):
90+
</Text>
91+
<Text fontSize="x-small">
92+
Note: Enabling this will ignore Enforcing MFA shown below and will
93+
also ignore the user MFA setting.
94+
</Text>
8995
</Flex>
9096
<Flex justifyContent="start" mb={3}>
9197
<InputField
@@ -96,13 +102,20 @@ const Features = ({ variables, setVariables }: any) => {
96102
</Flex>
97103
</Flex>
98104
</Stack>
99-
<Text fontSize="md" paddingTop="2%" fontWeight="bold" mb={5}>
105+
<Divider paddingY={5} />
106+
<Text fontSize="md" paddingTop={5} fontWeight="bold" mb={5}>
100107
Enable Features
101108
</Text>
102-
<Stack spacing={6} padding="2% 0%">
103-
<Flex>
104-
<Flex w="100%" justifyContent="start" alignItems="center">
105-
<Text fontSize="sm">Enforce Multi Factor Authentication:</Text>
109+
<Stack spacing={6}>
110+
<Flex alignItems="center">
111+
<Flex w="100%" alignItems="baseline" flexDir="column">
112+
<Text fontSize="sm">
113+
Enforce Multi Factor Authentication (MFA):
114+
</Text>
115+
<Text fontSize="x-small">
116+
Note: If you disable enforcing after it was enabled, it will still
117+
keep MFA enabled for older users.
118+
</Text>
106119
</Flex>
107120
<Flex justifyContent="start" mb={3}>
108121
<InputField

dashboard/src/components/UpdateEmailTemplateModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ const UpdateEmailTemplate = ({
333333
{templateVariables.map((i) => (
334334
<Tr key={i.text}>
335335
<Td>
336-
<Code fontSize="sm">{`{{${i.text}}}`}</Code>
336+
<Code fontSize="sm">{`{{.${i.text}}}`}</Code>
337337
</Td>
338338
<Td>
339339
<Text

dashboard/src/graphql/queries/index.ts

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,50 +18,50 @@ export const AdminSessionQuery = `
1818
export const EnvVariablesQuery = `
1919
query {
2020
_env{
21-
CLIENT_ID,
22-
CLIENT_SECRET,
23-
GOOGLE_CLIENT_ID,
24-
GOOGLE_CLIENT_SECRET,
25-
GITHUB_CLIENT_ID,
26-
GITHUB_CLIENT_SECRET,
27-
FACEBOOK_CLIENT_ID,
28-
FACEBOOK_CLIENT_SECRET,
29-
LINKEDIN_CLIENT_ID,
30-
LINKEDIN_CLIENT_SECRET,
31-
APPLE_CLIENT_ID,
32-
APPLE_CLIENT_SECRET,
33-
DEFAULT_ROLES,
34-
PROTECTED_ROLES,
35-
ROLES,
36-
JWT_TYPE,
37-
JWT_SECRET,
38-
JWT_ROLE_CLAIM,
39-
JWT_PRIVATE_KEY,
40-
JWT_PUBLIC_KEY,
41-
REDIS_URL,
42-
SMTP_HOST,
43-
SMTP_PORT,
44-
SMTP_USERNAME,
45-
SMTP_PASSWORD,
46-
SENDER_EMAIL,
47-
ALLOWED_ORIGINS,
48-
ORGANIZATION_NAME,
49-
ORGANIZATION_LOGO,
50-
ADMIN_SECRET,
51-
DISABLE_LOGIN_PAGE,
52-
DISABLE_MAGIC_LINK_LOGIN,
53-
DISABLE_EMAIL_VERIFICATION,
54-
DISABLE_BASIC_AUTHENTICATION,
55-
DISABLE_SIGN_UP,
56-
DISABLE_STRONG_PASSWORD,
57-
DISABLE_REDIS_FOR_ENV,
58-
CUSTOM_ACCESS_TOKEN_SCRIPT,
59-
DATABASE_NAME,
60-
DATABASE_TYPE,
61-
DATABASE_URL,
62-
ACCESS_TOKEN_EXPIRY_TIME,
63-
DISABLE_MULTI_FACTOR_AUTHENTICATION,
64-
ENFORCE_MULTI_FACTOR_AUTHENTICATION,
21+
CLIENT_ID
22+
CLIENT_SECRET
23+
GOOGLE_CLIENT_ID
24+
GOOGLE_CLIENT_SECRET
25+
GITHUB_CLIENT_ID
26+
GITHUB_CLIENT_SECRET
27+
FACEBOOK_CLIENT_ID
28+
FACEBOOK_CLIENT_SECRET
29+
LINKEDIN_CLIENT_ID
30+
LINKEDIN_CLIENT_SECRET
31+
APPLE_CLIENT_ID
32+
APPLE_CLIENT_SECRET
33+
DEFAULT_ROLES
34+
PROTECTED_ROLES
35+
ROLES
36+
JWT_TYPE
37+
JWT_SECRET
38+
JWT_ROLE_CLAIM
39+
JWT_PRIVATE_KEY
40+
JWT_PUBLIC_KEY
41+
REDIS_URL
42+
SMTP_HOST
43+
SMTP_PORT
44+
SMTP_USERNAME
45+
SMTP_PASSWORD
46+
SENDER_EMAIL
47+
ALLOWED_ORIGINS
48+
ORGANIZATION_NAME
49+
ORGANIZATION_LOGO
50+
ADMIN_SECRET
51+
DISABLE_LOGIN_PAGE
52+
DISABLE_MAGIC_LINK_LOGIN
53+
DISABLE_EMAIL_VERIFICATION
54+
DISABLE_BASIC_AUTHENTICATION
55+
DISABLE_SIGN_UP
56+
DISABLE_STRONG_PASSWORD
57+
DISABLE_REDIS_FOR_ENV
58+
CUSTOM_ACCESS_TOKEN_SCRIPT
59+
DATABASE_NAME
60+
DATABASE_TYPE
61+
DATABASE_URL
62+
ACCESS_TOKEN_EXPIRY_TIME
63+
DISABLE_MULTI_FACTOR_AUTHENTICATION
64+
ENFORCE_MULTI_FACTOR_AUTHENTICATION
6565
}
6666
}
6767
`;

dashboard/src/pages/Users.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,11 @@ export default function Users() {
302302
<Th>Roles</Th>
303303
<Th>Verified</Th>
304304
<Th>Access</Th>
305-
<Th>MFA</Th>
305+
<Th>
306+
<Tooltip label="MultiFactor Authentication Enabled / Disabled">
307+
MFA
308+
</Tooltip>
309+
</Th>
306310
<Th>Actions</Th>
307311
</Tr>
308312
</Thead>
@@ -404,13 +408,13 @@ export default function Users() {
404408
<MenuItem
405409
onClick={() => multiFactorAuthUpdateHandler(user)}
406410
>
407-
Disable MFA
411+
Disable MultiFactor Authentication
408412
</MenuItem>
409413
) : (
410414
<MenuItem
411415
onClick={() => multiFactorAuthUpdateHandler(user)}
412416
>
413-
Enable MFA
417+
Enable MultiFactor Authentication
414418
</MenuItem>
415419
)}
416420
</MenuList>

server/constants/verification_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ const (
1212
// VerificationTypeInviteMember is the invite_member verification type
1313
VerificationTypeInviteMember = "invite_member"
1414
// VerificationTypeOTP is the otp verification type
15-
VerificationTypeOTP = "otp"
15+
VerificationTypeOTP = "verify_otp"
1616
)

server/db/providers/cassandradb/email_template.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (p *provider) AddEmailTemplate(ctx context.Context, emailTemplate models.Em
2929
return nil, fmt.Errorf("Email template with %s event_name already exists", emailTemplate.EventName)
3030
}
3131

32-
insertQuery := fmt.Sprintf("INSERT INTO %s (id, event_name, subject, template, created_at, updated_at) VALUES ('%s', '%s', '%s','%s', %d, %d)", KeySpace+"."+models.Collections.EmailTemplate, emailTemplate.ID, emailTemplate.EventName, emailTemplate.Subject, emailTemplate.Template, emailTemplate.CreatedAt, emailTemplate.UpdatedAt)
32+
insertQuery := fmt.Sprintf("INSERT INTO %s (id, event_name, subject, design, template, created_at, updated_at) VALUES ('%s', '%s', '%s','%s','%s', %d, %d)", KeySpace+"."+models.Collections.EmailTemplate, emailTemplate.ID, emailTemplate.EventName, emailTemplate.Subject, emailTemplate.Design, emailTemplate.Template, emailTemplate.CreatedAt, emailTemplate.UpdatedAt)
3333
err := p.db.Query(insertQuery).Exec()
3434
if err != nil {
3535
return nil, err
@@ -103,14 +103,14 @@ func (p *provider) ListEmailTemplate(ctx context.Context, pagination model.Pagin
103103
// there is no offset in cassandra
104104
// so we fetch till limit + offset
105105
// and return the results from offset to limit
106-
query := fmt.Sprintf("SELECT id, event_name, subject, template, created_at, updated_at FROM %s LIMIT %d", KeySpace+"."+models.Collections.EmailTemplate, pagination.Limit+pagination.Offset)
106+
query := fmt.Sprintf("SELECT id, event_name, subject, design, template, created_at, updated_at FROM %s LIMIT %d", KeySpace+"."+models.Collections.EmailTemplate, pagination.Limit+pagination.Offset)
107107

108108
scanner := p.db.Query(query).Iter().Scanner()
109109
counter := int64(0)
110110
for scanner.Next() {
111111
if counter >= pagination.Offset {
112112
var emailTemplate models.EmailTemplate
113-
err := scanner.Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
113+
err := scanner.Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Design, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
114114
if err != nil {
115115
return nil, err
116116
}
@@ -128,8 +128,8 @@ func (p *provider) ListEmailTemplate(ctx context.Context, pagination model.Pagin
128128
// GetEmailTemplateByID to get EmailTemplate by id
129129
func (p *provider) GetEmailTemplateByID(ctx context.Context, emailTemplateID string) (*model.EmailTemplate, error) {
130130
var emailTemplate models.EmailTemplate
131-
query := fmt.Sprintf(`SELECT id, event_name, subject, template, created_at, updated_at FROM %s WHERE id = '%s' LIMIT 1`, KeySpace+"."+models.Collections.EmailTemplate, emailTemplateID)
132-
err := p.db.Query(query).Consistency(gocql.One).Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
131+
query := fmt.Sprintf(`SELECT id, event_name, subject, design, template, created_at, updated_at FROM %s WHERE id = '%s' LIMIT 1`, KeySpace+"."+models.Collections.EmailTemplate, emailTemplateID)
132+
err := p.db.Query(query).Consistency(gocql.One).Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Design, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
133133
if err != nil {
134134
return nil, err
135135
}
@@ -139,8 +139,8 @@ func (p *provider) GetEmailTemplateByID(ctx context.Context, emailTemplateID str
139139
// GetEmailTemplateByEventName to get EmailTemplate by event_name
140140
func (p *provider) GetEmailTemplateByEventName(ctx context.Context, eventName string) (*model.EmailTemplate, error) {
141141
var emailTemplate models.EmailTemplate
142-
query := fmt.Sprintf(`SELECT id, event_name, subject, template, created_at, updated_at FROM %s WHERE event_name = '%s' LIMIT 1 ALLOW FILTERING`, KeySpace+"."+models.Collections.EmailTemplate, eventName)
143-
err := p.db.Query(query).Consistency(gocql.One).Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
142+
query := fmt.Sprintf(`SELECT id, event_name, subject, design, template, created_at, updated_at FROM %s WHERE event_name = '%s' LIMIT 1 ALLOW FILTERING`, KeySpace+"."+models.Collections.EmailTemplate, eventName)
143+
err := p.db.Query(query).Consistency(gocql.One).Scan(&emailTemplate.ID, &emailTemplate.EventName, &emailTemplate.Subject, &emailTemplate.Design, &emailTemplate.Template, &emailTemplate.CreatedAt, &emailTemplate.UpdatedAt)
144144
if err != nil {
145145
return nil, err
146146
}

server/db/providers/cassandradb/provider.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,11 @@ func NewProvider() (*provider, error) {
224224
return nil, err
225225
}
226226
// add subject on email_templates table
227-
emailTemplateAlterQuery := fmt.Sprintf(`ALTER TABLE %s.%s ADD subject text;`, KeySpace, models.Collections.EmailTemplate)
227+
emailTemplateAlterQuery := fmt.Sprintf(`ALTER TABLE %s.%s ADD (subject text, design text);`, KeySpace, models.Collections.EmailTemplate)
228228
err = session.Query(emailTemplateAlterQuery).Exec()
229229
if err != nil {
230-
return nil, err
230+
log.Debug("Failed to alter table as column exists: ", err)
231+
// continue
231232
}
232233

233234
otpCollection := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, email text, otp text, expires_at bigint, updated_at bigint, created_at bigint, PRIMARY KEY (id))", KeySpace, models.Collections.OTP)

server/email/email.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818

1919
func getDefaultTemplate(event string) *model.EmailTemplate {
2020
switch event {
21-
case constants.VerificationTypeBasicAuthSignup, constants.VerificationTypeMagicLinkLogin:
21+
case constants.VerificationTypeBasicAuthSignup, constants.VerificationTypeMagicLinkLogin, constants.VerificationTypeUpdateEmail:
2222
return &model.EmailTemplate{
2323
Subject: emailVerificationSubject,
2424
Template: emailVerificationTemplate,

server/resolvers/forgot_password.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/authorizerdev/authorizer/server/graph/model"
1616
"github.com/authorizerdev/authorizer/server/memorystore"
1717
"github.com/authorizerdev/authorizer/server/parsers"
18+
"github.com/authorizerdev/authorizer/server/refs"
1819
"github.com/authorizerdev/authorizer/server/token"
1920
"github.com/authorizerdev/authorizer/server/utils"
2021
"github.com/authorizerdev/authorizer/server/validators"
@@ -61,9 +62,9 @@ func ForgotPasswordResolver(ctx context.Context, params model.ForgotPasswordInpu
6162
log.Debug("Failed to generate nonce: ", err)
6263
return res, err
6364
}
64-
redirectURL := parsers.GetAppURL(gc) + "/reset-password"
65-
if params.RedirectURI != nil {
66-
redirectURL = *params.RedirectURI
65+
redirectURL := parsers.GetAppURL(gc)
66+
if strings.TrimSpace(refs.StringValue(params.RedirectURI)) != "" {
67+
redirectURL = refs.StringValue(params.RedirectURI)
6768
}
6869

6970
verificationToken, err := token.CreateVerificationToken(params.Email, constants.VerificationTypeForgotPassword, hostname, nonceHash, redirectURL)

0 commit comments

Comments
 (0)