emailengine-app 2.61.0 → 2.61.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/data/google-crawlers.json +1 -1
  3. package/lib/account/account-state.js +248 -0
  4. package/lib/account.js +17 -178
  5. package/lib/api-routes/account-routes.js +1006 -0
  6. package/lib/api-routes/message-routes.js +1377 -0
  7. package/lib/consts.js +12 -2
  8. package/lib/email-client/base-client.js +282 -771
  9. package/lib/email-client/gmail/gmail-api.js +243 -0
  10. package/lib/email-client/gmail-client.js +145 -53
  11. package/lib/email-client/imap/mailbox.js +24 -698
  12. package/lib/email-client/imap/sync-operations.js +812 -0
  13. package/lib/email-client/imap-client.js +3 -1
  14. package/lib/email-client/message-builder.js +566 -0
  15. package/lib/email-client/notification-handler.js +314 -0
  16. package/lib/email-client/outlook/graph-api.js +326 -0
  17. package/lib/email-client/outlook-client.js +159 -113
  18. package/lib/email-client/smtp-pool-manager.js +196 -0
  19. package/lib/imapproxy/imap-server.js +3 -12
  20. package/lib/oauth/gmail.js +4 -4
  21. package/lib/oauth/mail-ru.js +30 -5
  22. package/lib/oauth/outlook.js +57 -3
  23. package/lib/oauth/pubsub/google.js +30 -11
  24. package/lib/oauth/scope-checker.js +202 -0
  25. package/lib/oauth2-apps.js +8 -4
  26. package/lib/redis-operations.js +484 -0
  27. package/lib/routes-ui.js +283 -2582
  28. package/lib/tools.js +5 -196
  29. package/lib/ui-routes/account-routes.js +1931 -0
  30. package/lib/ui-routes/admin-config-routes.js +1233 -0
  31. package/lib/ui-routes/admin-entities-routes.js +2367 -0
  32. package/lib/ui-routes/oauth-routes.js +992 -0
  33. package/lib/utils/network.js +237 -0
  34. package/package.json +12 -12
  35. package/sbom.json +1 -1
  36. package/static/js/app.js +5 -5
  37. package/static/licenses.html +91 -21
  38. package/translations/de.mo +0 -0
  39. package/translations/de.po +85 -82
  40. package/translations/en.mo +0 -0
  41. package/translations/en.po +63 -71
  42. package/translations/et.mo +0 -0
  43. package/translations/et.po +84 -82
  44. package/translations/fr.mo +0 -0
  45. package/translations/fr.po +85 -82
  46. package/translations/ja.mo +0 -0
  47. package/translations/ja.po +84 -82
  48. package/translations/messages.pot +67 -80
  49. package/translations/nl.mo +0 -0
  50. package/translations/nl.po +86 -82
  51. package/translations/pl.mo +0 -0
  52. package/translations/pl.po +84 -82
  53. package/views/account/security.hbs +4 -4
  54. package/views/accounts/account.hbs +13 -13
  55. package/views/accounts/register/imap-server.hbs +12 -12
  56. package/views/config/document-store/pre-processing/index.hbs +4 -2
  57. package/views/config/oauth/app.hbs +6 -7
  58. package/views/config/oauth/index.hbs +2 -2
  59. package/views/config/service.hbs +3 -4
  60. package/views/dashboard.hbs +5 -7
  61. package/views/error.hbs +22 -7
  62. package/views/gateways/gateway.hbs +2 -2
  63. package/views/partials/add_account_modal.hbs +7 -10
  64. package/views/partials/document_store_header.hbs +1 -1
  65. package/views/partials/editor_scope_info.hbs +0 -1
  66. package/views/partials/oauth_config_header.hbs +1 -1
  67. package/views/partials/side_menu.hbs +3 -3
  68. package/views/partials/webhook_form.hbs +2 -2
  69. package/views/templates/index.hbs +1 -1
  70. package/views/templates/template.hbs +8 -8
  71. package/views/tokens/index.hbs +6 -6
  72. package/views/tokens/new.hbs +1 -1
  73. package/views/webhooks/index.hbs +4 -4
  74. package/views/webhooks/webhook.hbs +7 -7
  75. package/workers/api.js +148 -2436
  76. package/workers/smtp.js +2 -1
  77. package/workers/webhooks.js +6 -0
  78. package/lib/imapproxy/imap-core/test/client.js +0 -46
  79. package/lib/imapproxy/imap-core/test/fixtures/append.eml +0 -1196
  80. package/lib/imapproxy/imap-core/test/fixtures/chunks.js +0 -44
  81. package/lib/imapproxy/imap-core/test/fixtures/fix1.eml +0 -6
  82. package/lib/imapproxy/imap-core/test/fixtures/fix2.eml +0 -599
  83. package/lib/imapproxy/imap-core/test/fixtures/fix3.eml +0 -32
  84. package/lib/imapproxy/imap-core/test/fixtures/fix4.eml +0 -6
  85. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.eml +0 -599
  86. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.js +0 -2740
  87. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.json +0 -1411
  88. package/lib/imapproxy/imap-core/test/fixtures/mimetree.js +0 -85
  89. package/lib/imapproxy/imap-core/test/fixtures/nodemailer.eml +0 -582
  90. package/lib/imapproxy/imap-core/test/fixtures/ryan_finnie_mime_torture.eml +0 -599
  91. package/lib/imapproxy/imap-core/test/fixtures/simple.eml +0 -42
  92. package/lib/imapproxy/imap-core/test/fixtures/simple.json +0 -164
  93. package/lib/imapproxy/imap-core/test/imap-compile-stream-test.js +0 -671
  94. package/lib/imapproxy/imap-core/test/imap-compiler-test.js +0 -272
  95. package/lib/imapproxy/imap-core/test/imap-indexer-test.js +0 -236
  96. package/lib/imapproxy/imap-core/test/imap-parser-test.js +0 -922
  97. package/lib/imapproxy/imap-core/test/memory-notifier.js +0 -129
  98. package/lib/imapproxy/imap-core/test/prepare.sh +0 -74
  99. package/lib/imapproxy/imap-core/test/protocol-test.js +0 -1756
  100. package/lib/imapproxy/imap-core/test/search-test.js +0 -1356
  101. package/lib/imapproxy/imap-core/test/test-client.js +0 -152
  102. package/lib/imapproxy/imap-core/test/test-server.js +0 -623
  103. package/lib/imapproxy/imap-core/test/tools-test.js +0 -22
  104. package/test/api-test.js +0 -899
  105. package/test/autoreply-test.js +0 -327
  106. package/test/bounce-test.js +0 -151
  107. package/test/complaint-test.js +0 -256
  108. package/test/fixtures/autoreply/LICENSE +0 -27
  109. package/test/fixtures/autoreply/rfc3834-01.eml +0 -23
  110. package/test/fixtures/autoreply/rfc3834-02.eml +0 -24
  111. package/test/fixtures/autoreply/rfc3834-03.eml +0 -26
  112. package/test/fixtures/autoreply/rfc3834-04.eml +0 -48
  113. package/test/fixtures/autoreply/rfc3834-05.eml +0 -19
  114. package/test/fixtures/autoreply/rfc3834-06.eml +0 -59
  115. package/test/fixtures/bounces/163.eml +0 -2521
  116. package/test/fixtures/bounces/fastmail.eml +0 -242
  117. package/test/fixtures/bounces/gmail.eml +0 -252
  118. package/test/fixtures/bounces/hotmail.eml +0 -655
  119. package/test/fixtures/bounces/mailru.eml +0 -121
  120. package/test/fixtures/bounces/outlook.eml +0 -1107
  121. package/test/fixtures/bounces/postfix.eml +0 -101
  122. package/test/fixtures/bounces/rambler.eml +0 -116
  123. package/test/fixtures/bounces/workmail.eml +0 -142
  124. package/test/fixtures/bounces/yahoo.eml +0 -139
  125. package/test/fixtures/bounces/zoho.eml +0 -83
  126. package/test/fixtures/bounces/zonemta.eml +0 -100
  127. package/test/fixtures/complaints/LICENSE +0 -27
  128. package/test/fixtures/complaints/amazonses.eml +0 -72
  129. package/test/fixtures/complaints/dmarc.eml +0 -59
  130. package/test/fixtures/complaints/hotmail.eml +0 -49
  131. package/test/fixtures/complaints/optout.eml +0 -40
  132. package/test/fixtures/complaints/standard-arf.eml +0 -68
  133. package/test/fixtures/complaints/yahoo.eml +0 -68
  134. package/test/oauth2-apps-test.js +0 -301
  135. package/test/sendonly-test.js +0 -160
  136. package/test/test-config.js +0 -34
  137. package/test/webhooks-server.js +0 -39
package/views/error.hbs CHANGED
@@ -1,7 +1,22 @@
1
- <h1>Error {{statusCode}}</h1>
2
- <p>{{message}}</p>
3
- {{#if details}}
4
- {{#each details}}
5
- <div class="alert alert-danger">{{this}}</div>
6
- {{/each}}
7
- {{/if}}
1
+ <div class="container mt-4">
2
+ <div class="card border-left-danger">
3
+ <div class="card-body">
4
+ <h1 class="h4 mb-3">Something went wrong</h1>
5
+ <p class="mb-2">{{message}}</p>
6
+ <p class="text-muted small mb-3">Error code: {{statusCode}}</p>
7
+ {{#if details}}
8
+ {{#each details}}
9
+ <div class="alert alert-danger mb-2">{{this}}</div>
10
+ {{/each}}
11
+ {{/if}}
12
+ <div class="mt-3">
13
+ <a href="javascript:history.back()" class="btn btn-secondary btn-sm">
14
+ <i class="fas fa-arrow-left"></i> Go back
15
+ </a>
16
+ <a href="/admin" class="btn btn-primary btn-sm ml-2">
17
+ <i class="fas fa-home"></i> Dashboard
18
+ </a>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
@@ -15,12 +15,12 @@
15
15
 
16
16
  <a type="button" class="btn btn-light" href="/admin/gateways/edit/{{gateway.gateway}}"
17
17
  title="Modify gateway settings" data-toggle="tooltip" data-placement="top">
18
- <i class="fas fa-user-edit fa-fw"></i> Edit
18
+ <i class="fas fa-user-edit fa-fw"></i> Edit gateway
19
19
  </a>
20
20
 
21
21
  <button type="button" class="btn btn-light" data-toggle="modal" data-target="#deleteModal"
22
22
  title="Remove this gateway" id="delete-btn" data-placement="top">
23
- <i class="fas fa-trash-alt fa-fw"></i> Delete
23
+ <i class="fas fa-trash-alt fa-fw"></i> Delete gateway
24
24
  </button>
25
25
 
26
26
  </div>
@@ -13,24 +13,21 @@
13
13
  <div class="form-group">
14
14
  <label for="account-name" class="col-form-label">Full name:</label>
15
15
  <input type="text" class="form-control" id="account-name" name="name"
16
- placeholder="Name of the person, for example &quot;John Smith&quot;">
16
+ placeholder="e.g., John Smith">
17
17
  </div>
18
18
  <div class="form-group">
19
- <label for="account-id" class="col-form-label">Account ID:</label>
19
+ <label for="account-id" class="col-form-label">Account identifier (optional):</label>
20
20
  <input type="text" class="form-control" id="account-id" name="account"
21
- placeholder="Optional account ID, for example &quot;account_123&quot;">
22
- <small class="form-text text-muted">If an account with the same ID
23
- already exists, EmailEngine will update its settings.</small>
21
+ placeholder="e.g., account_123">
22
+ <small class="form-text text-muted">Leave blank to auto-generate. Existing accounts with this ID will be updated.</small>
24
23
  </div>
25
24
 
26
- <p><small>By clicking "Continue," EmailEngine will redirect you to the publicly hosted
27
- authentication form. You can also use that form from your own application. See the details
28
- <a href="https://emailengine.app/hosted-authentication" target="_blank"
29
- rel="noopener noreferrer" referrerpolicy="no-referrer">here</a>.</small>
25
+ <p><small>You'll be redirected to a hosted authentication form. You can also <a href="https://emailengine.app/hosted-authentication" target="_blank"
26
+ rel="noopener noreferrer" referrerpolicy="no-referrer">use this form in your own app</a>.</small>
30
27
  </p>
31
28
  </div>
32
29
  <div class="modal-footer">
33
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
30
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
34
31
 
35
32
  <button type="submit" class="btn btn-primary btn-icon-split">
36
33
  <span class="icon text-white-50">
@@ -1,7 +1,7 @@
1
1
  <div class="d-sm-flex align-items-center justify-content-between mb-1">
2
2
  <h1 class="h3 mb-0 text-gray-800">
3
3
  <small><i class="fas fa-database fa-fw"></i></small>
4
- Document Store</label>
4
+ Document Store
5
5
  </h1>
6
6
  </div>
7
7
 
@@ -4,7 +4,6 @@
4
4
  <li>Top level <code>await</code> is allowed
5
5
  <li>Allowed APIs: <code>fetch</code>, <code>URL</code>
6
6
  <li><code>logger</code> is a Pino.js logger
7
- <li><code>env</code> is the <code>scriptEnv</code> settings object
8
7
  </ul>
9
8
  ">
10
9
  <i class="fas fa-info-circle"></i></a>
@@ -1,7 +1,7 @@
1
1
  <div class="d-sm-flex align-items-center justify-content-between mb-1">
2
2
  <h1 class="h3 mb-0 text-gray-800">
3
3
  <small><i class="fas fa-cog fa-fw"></i></small>
4
- OAuth2</label>
4
+ OAuth2
5
5
  </h1>
6
6
  </div>
7
7
 
@@ -62,11 +62,11 @@
62
62
 
63
63
  <a class="collapse-item {{#if menuToolsArena}}active{{/if}}" href="/admin/bull-board"> <i
64
64
  class="fas fa-fw fa-layer-group"></i>
65
- <span>Bull Board</span></a>
65
+ <span>Job Queue</span></a>
66
66
 
67
67
  <a class="collapse-item {{#if menuToolsInternals}}active{{/if}}" href="/admin/internals"> <i
68
68
  class="fas fa-fw fa-cog"></i>
69
- <span>System Threads</span></a>
69
+ <span>Workers</span></a>
70
70
 
71
71
  </div>
72
72
  </div>
@@ -95,7 +95,7 @@
95
95
 
96
96
  {{#if showDocumentStore}}
97
97
  <a class="collapse-item {{#if menuConfigDocumentStore}}active{{/if}}"
98
- href="/admin/config/document-store">Document Store</label></a>
98
+ href="/admin/config/document-store">Document Store</a>
99
99
  {{/if}}
100
100
 
101
101
  <a class="collapse-item {{#if menuConfigLicense}}active{{/if}}" href="/admin/config/license">
@@ -83,7 +83,7 @@
83
83
  <small>JavaScript code to determine if the webhook should be sent. If the code evaluates to
84
84
  <code>true</code> then the webhook is sent, otherwise it is skipped.
85
85
  The script includes <code>payload</code> as a global variable that contains the webhook
86
- payload.</small>
86
+ payload. Use <code>env</code> to access <a href="/admin/config/service#scriptEnv">script variables</a>.</small>
87
87
  </div>
88
88
  <div id="editor-fn" class="code-editor"></div>
89
89
  <div class="editor-embed-block">
@@ -112,7 +112,7 @@
112
112
  <div style="line-height: 1; margin-bottom: 10px;">
113
113
  <small>JavaScript code to modify webhook payload output. Some services might expect incoming data using
114
114
  a specific format. Whatever is returned by this function will be used as the webhook
115
- payload.</small>
115
+ payload. Use <code>env</code> to access <a href="/admin/config/service#scriptEnv">script variables</a>.</small>
116
116
  </div>
117
117
 
118
118
  <div class="row">
@@ -3,7 +3,7 @@
3
3
  <span class="icon text-white-50">
4
4
  <i class="fas fa-plus"></i>
5
5
  </span>
6
- <span class="text">Create new</span>
6
+ <span class="text">Create template</span>
7
7
  </a>
8
8
  </div>
9
9
 
@@ -19,12 +19,12 @@
19
19
 
20
20
  <a type="button" class="btn btn-light" href="/admin/templates/template/{{template.id}}/edit"
21
21
  title="Edit template contents" data-toggle="tooltip" data-placement="top">
22
- <i class="fas fa-file-signature fa-fw"></i> Edit
22
+ <i class="fas fa-file-signature fa-fw"></i> Edit template
23
23
  </a>
24
24
 
25
25
  <button type="button" class="btn btn-light has-tooltip" data-toggle="modal" data-target="#deleteModal"
26
26
  title="Delete this template" id="delete-btn" data-placement="top">
27
- <i class="fas fa-trash-alt fa-fw"></i> Delete
27
+ <i class="fas fa-trash-alt fa-fw"></i> Delete template
28
28
  </button>
29
29
 
30
30
  </div>
@@ -126,21 +126,21 @@
126
126
  <div class="modal-dialog">
127
127
  <div class="modal-content">
128
128
  <div class="modal-header">
129
- <h5 class="modal-title" id="deleteModalLabel">Delete template</h5>
129
+ <h5 class="modal-title" id="deleteModalLabel">Delete Template</h5>
130
130
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
131
131
  <span aria-hidden="true">&times;</span>
132
132
  </button>
133
133
  </div>
134
134
  <div class="modal-body">
135
- <p>Are you sure you want to delete <strong>{{template.name}}</strong>? This action is not
136
- recoverable.</p>
135
+ <p>Are you sure you want to delete <strong>{{template.name}}</strong>? This action cannot be
136
+ undone.</p>
137
137
  </div>
138
138
  <div class="modal-footer">
139
139
  <form method="post" action="/admin/templates/delete">
140
140
  <input type="hidden" name="crumb" value="{{crumb}}" />
141
141
  <input type="hidden" name="template" value="{{template.id}}" />
142
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
143
- <button type="submit" class="btn btn-danger">Delete</button>
142
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
143
+ <button type="submit" class="btn btn-danger">Delete template</button>
144
144
  </form>
145
145
  </div>
146
146
  </div>
@@ -197,7 +197,7 @@
197
197
  </div>
198
198
  <div class="modal-footer">
199
199
 
200
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
200
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
201
201
  <button type="button" id="send-test-btn" class="btn btn-primary btn-icon-split">
202
202
 
203
203
  <span class="icon text-white-50">
@@ -3,7 +3,7 @@
3
3
  <span class="icon text-white-50">
4
4
  <i class="fas fa-plus"></i>
5
5
  </span>
6
- <span class="text">Create new</span>
6
+ <span class="text">Create access token</span>
7
7
  </a>
8
8
  </div>
9
9
 
@@ -119,7 +119,7 @@
119
119
 
120
120
  <p>
121
121
  {{#if firstPage}}
122
- No access tokens have been created. Generate a new token <a href="{{newLink}}">here</a>.
122
+ No access tokens have been created yet. <a href="{{newLink}}">Create your first access token</a>.
123
123
  {{else}}
124
124
  No tokens found.
125
125
  {{/if}}
@@ -171,21 +171,21 @@ $ curl "<span class="cur-base-url" data-origin="">http://127.0.0.1:3000</span>/v
171
171
  <div class="modal-content">
172
172
 
173
173
  <div class="modal-header">
174
- <h5 class="modal-title" id="deleteTokenLabel">Delete token</h5>
174
+ <h5 class="modal-title" id="deleteTokenLabel">Delete access token</h5>
175
175
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
176
176
  <span aria-hidden="true">&times;</span>
177
177
  </button>
178
178
  </div>
179
179
  <div class="modal-body">
180
180
  Are you sure you want to delete <strong id="delete-token-description"></strong>? This action
181
- can not be reversed.
181
+ cannot be undone.
182
182
  </div>
183
183
  <div class="modal-footer">
184
184
  <form method="post" action="/admin/tokens/delete">
185
185
  <input type="hidden" name="crumb" value="{{crumb}}">
186
186
  <input type="hidden" id="token-delete" name="token" value="">
187
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
188
- <button type="submit" class="btn btn-danger">Delete</button>
187
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
188
+ <button type="submit" class="btn btn-danger">Delete token</button>
189
189
  </form>
190
190
  </div>
191
191
 
@@ -138,7 +138,7 @@
138
138
  <div id="showTokenError" class="d-none alert alert-danger" style="white-space: pre-line;"></div>
139
139
  </div>
140
140
  <div class="modal-footer">
141
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
141
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Done</button>
142
142
  </div>
143
143
  </div>
144
144
  </div>
@@ -3,7 +3,7 @@
3
3
  <span class="icon text-white-50">
4
4
  <i class="fas fa-plus"></i>
5
5
  </span>
6
- <span class="text">Create new</span>
6
+ <span class="text">Create webhook route</span>
7
7
  </a>
8
8
  </div>
9
9
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  {{#unless webhooksEnabled}}
14
14
  <div class="alert alert-warning mt-3"><strong>Note:</strong> Webhook processing is currently disabled for EmailEngine.
15
- Enable webhooks on the configuration page <a href="/admin/config/webhooks">here</a>.</div>
15
+ <a href="/admin/config/webhooks">Enable webhooks in configuration settings</a>.</div>
16
16
  {{/unless}}
17
17
 
18
18
  <p>Webhook routing allows you to define custom conditions that trigger webhooks to specific targets.</p>
@@ -27,8 +27,8 @@
27
27
  the webhook target requires a specific payload format, you can define a <em>mapping
28
28
  function</em> to modify the payload before sending.
29
29
  </p>
30
- <p>Read more about using webhook routes <a href="https://docs.emailengine.app/low-code-integrations/"
31
- target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">here</a>.</p>
30
+ <p><a href="https://docs.emailengine.app/low-code-integrations/"
31
+ target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">Learn more about webhook routes</a>.</p>
32
32
  </div>
33
33
  <div class="col-auto">
34
34
  <i class="fas fa-info-circle fa-2x text-gray-300"></i>
@@ -15,12 +15,12 @@
15
15
 
16
16
  <a type="button" class="btn btn-light" href="/admin/webhooks/webhook/{{webhook.id}}/edit"
17
17
  title="Edit Webhook Route contents" data-toggle="tooltip" data-placement="top">
18
- <i class="fas fa-file-signature fa-fw"></i> Edit
18
+ <i class="fas fa-file-signature fa-fw"></i> Edit route
19
19
  </a>
20
20
 
21
21
  <button type="button" class="btn btn-light has-tooltip" data-toggle="modal" data-target="#deleteModal"
22
22
  title="Delete this Webhook Route" id="delete-btn" data-placement="top">
23
- <i class="fas fa-trash-alt fa-fw"></i> Delete
23
+ <i class="fas fa-trash-alt fa-fw"></i> Delete route
24
24
  </button>
25
25
  </div>
26
26
  </div>
@@ -39,7 +39,7 @@
39
39
  <span aria-hidden="true">&times;</span>
40
40
  </button>
41
41
 
42
- <p><strong>NB!</strong> The last attempted webhook failed with the response below.</p>
42
+ <p><strong>Warning:</strong> The last attempted webhook failed with the response below.</p>
43
43
  <hr>
44
44
  <p class="mb-0">
45
45
  <code>
@@ -184,15 +184,15 @@
184
184
  </button>
185
185
  </div>
186
186
  <div class="modal-body">
187
- <p>Are you sure you want to delete <strong>{{webhook.name}}</strong>? This action is not
188
- recoverable.</p>
187
+ <p>Are you sure you want to delete <strong>{{webhook.name}}</strong>? This action cannot be
188
+ undone.</p>
189
189
  </div>
190
190
  <div class="modal-footer">
191
191
  <form method="post" action="/admin/webhooks/delete">
192
192
  <input type="hidden" name="crumb" value="{{crumb}}" />
193
193
  <input type="hidden" name="webhook" value="{{webhook.id}}" />
194
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
195
- <button type="submit" class="btn btn-danger">Delete</button>
194
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
195
+ <button type="submit" class="btn btn-danger">Delete route</button>
196
196
  </form>
197
197
  </div>
198
198
  </div>