Fix minor inconsistencies in settings.

- Add missing `app.root_url` key in migration.
- Register `/settings` handler in the backend.
- Add dummy dots in secret fields on the UI for visibility.
This commit is contained in:
Kailash Nadh 2020-08-07 19:28:23 +05:30
parent 16e47dddc1
commit 7ed07550ff
5 changed files with 28 additions and 6 deletions

View File

@ -177,7 +177,8 @@
<b-input v-model="form['upload.s3.aws_access_key_id']" <b-input v-model="form['upload.s3.aws_access_key_id']"
name="upload.s3.aws_access_key_id" :maxlength="200" /> name="upload.s3.aws_access_key_id" :maxlength="200" />
</b-field> </b-field>
<b-field label="AWS access secret" label-position="on-border" expanded> <b-field label="AWS access secret" label-position="on-border" expanded
message="Enter a value to change.">
<b-input v-model="form['upload.s3.aws_secret_access_key']" <b-input v-model="form['upload.s3.aws_secret_access_key']"
name="upload.s3.aws_secret_access_key" type="password" name="upload.s3.aws_secret_access_key" type="password"
:maxlength="200" /> :maxlength="200" />
@ -281,7 +282,7 @@
name="username" placeholder="mysmtp" :maxlength="200" /> name="username" placeholder="mysmtp" :maxlength="200" />
</b-field> </b-field>
<b-field label="Password" label-position="on-border" expanded <b-field label="Password" label-position="on-border" expanded
message="Enter a value to change. Otherwise, leave empty."> message="Enter a value to change.">
<b-input v-model="item.password" <b-input v-model="item.password"
:disabled="item.auth_protocol === 'none'" :disabled="item.auth_protocol === 'none'"
name="password" type="password" placeholder="Enter to change" name="password" type="password" placeholder="Enter to change"
@ -389,6 +390,8 @@ import { mapState } from 'vuex';
import store from '../store'; import store from '../store';
import { models } from '../constants'; import { models } from '../constants';
const dummyPassword = ' '.repeat(8);
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
@ -419,10 +422,15 @@ export default Vue.extend({
}, },
onSubmit() { onSubmit() {
const form = { ...this.form }; const form = JSON.parse(JSON.stringify(this.form));
// De-serialize custom e-mail headers. // De-serialize custom e-mail headers.
for (let i = 0; i < form.smtp.length; i += 1) { for (let i = 0; i < form.smtp.length; i += 1) {
// If it's the dummy UI password placeholder, ignore it.
if (form.smtp[i].password === dummyPassword) {
form.smtp[i].password = '';
}
if (form.smtp[i].strEmailHeaders && form.smtp[i].strEmailHeaders !== '[]') { if (form.smtp[i].strEmailHeaders && form.smtp[i].strEmailHeaders !== '[]') {
form.smtp[i].email_headers = JSON.parse(form.smtp[i].strEmailHeaders); form.smtp[i].email_headers = JSON.parse(form.smtp[i].strEmailHeaders);
} else { } else {
@ -430,8 +438,12 @@ export default Vue.extend({
} }
} }
if (form['upload.s3.aws_secret_access_key'] === dummyPassword) {
form['upload.s3.aws_secret_access_key'] = '';
}
this.isLoading = true; this.isLoading = true;
this.$api.updateSettings(this.form).then((data) => { this.$api.updateSettings(form).then((data) => {
if (data.needsRestart) { if (data.needsRestart) {
// Update the 'needsRestart' flag on the global serverConfig state // Update the 'needsRestart' flag on the global serverConfig state
// as there are running campaigns and the app couldn't auto-restart. // as there are running campaigns and the app couldn't auto-restart.
@ -462,6 +474,14 @@ export default Vue.extend({
// Serialize the `email_headers` array map to display on the form. // Serialize the `email_headers` array map to display on the form.
for (let i = 0; i < d.smtp.length; i += 1) { for (let i = 0; i < d.smtp.length; i += 1) {
d.smtp[i].strEmailHeaders = JSON.stringify(d.smtp[i].email_headers, null, 4); d.smtp[i].strEmailHeaders = JSON.stringify(d.smtp[i].email_headers, null, 4);
// The backend doesn't send passwords, so add a dummy so that it
// the password looks filled on the UI.
d.smtp[i].password = dummyPassword;
}
if (d['upload.provider'] === 's3') {
d['upload.s3.aws_secret_access_key'] = dummyPassword;
} }
this.form = d; this.form = d;

View File

@ -124,6 +124,7 @@ func registerHTTPHandlers(e *echo.Echo) {
e.GET("/campaigns/media", handleIndexPage) e.GET("/campaigns/media", handleIndexPage)
e.GET("/campaigns/templates", handleIndexPage) e.GET("/campaigns/templates", handleIndexPage)
e.GET("/campaigns/:campignID", handleIndexPage) e.GET("/campaigns/:campignID", handleIndexPage)
e.GET("/settings", handleIndexPage)
} }
// handleIndex is the root handler that renders the Javascript frontend. // handleIndex is the root handler that renders the Javascript frontend.

View File

@ -66,6 +66,7 @@ func V0_7_0(db *sqlx.DB, fs stuffbin.FileSystem, ko *koanf.Koanf) error {
-- Insert default settings if the table is empty. -- Insert default settings if the table is empty.
INSERT INTO settings (key, value) SELECT k, v::JSONB FROM (VALUES INSERT INTO settings (key, value) SELECT k, v::JSONB FROM (VALUES
('app.root_url', '"http://localhost:9000"'),
('app.favicon_url', '""'), ('app.favicon_url', '""'),
('app.from_email', '"listmonk <noreply@listmonk.yoursite.com>"'), ('app.from_email', '"listmonk <noreply@listmonk.yoursite.com>"'),
('app.logo_url', '"http://localhost:9000/public/static/logo.png"'), ('app.logo_url', '"http://localhost:9000/public/static/logo.png"'),

View File

@ -733,5 +733,5 @@ SELECT JSON_OBJECT_AGG(key, value) AS settings
-- name: update-settings -- name: update-settings
UPDATE settings AS s SET value = c.value UPDATE settings AS s SET value = c.value
-- For each key in the incoming JSON map, update the row with the key and it's value. -- For each key in the incoming JSON map, update the row with the key and its value.
FROM(SELECT * FROM JSONB_EACH($1)) AS c(key, value) WHERE s.key = c.key; FROM(SELECT * FROM JSONB_EACH($1)) AS c(key, value) WHERE s.key = c.key;

View File

@ -117,7 +117,7 @@ func handleUpdateSettings(c echo.Context) error {
} }
if !has { if !has {
return echo.NewHTTPError(http.StatusBadRequest, return echo.NewHTTPError(http.StatusBadRequest,
"At least one SMTP block should be enabled") "Minimum one SMTP block should be enabled.")
} }
// S3 password? // S3 password?