4
0

settings.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package form // import "miniflux.app/v2/internal/ui/form"
  4. import (
  5. "net/http"
  6. "strconv"
  7. "miniflux.app/v2/internal/locale"
  8. "miniflux.app/v2/internal/model"
  9. )
  10. // SettingsForm represents the settings form.
  11. type SettingsForm struct {
  12. Username string
  13. Password string
  14. Confirmation string
  15. Theme string
  16. Language string
  17. Timezone string
  18. EntryDirection string
  19. EntryOrder string
  20. EntriesPerPage int
  21. KeyboardShortcuts bool
  22. ShowReadingTime bool
  23. CustomCSS string
  24. EntrySwipe bool
  25. GestureNav string
  26. DisplayMode string
  27. DefaultReadingSpeed int
  28. CJKReadingSpeed int
  29. DefaultHomePage string
  30. CategoriesSortingOrder string
  31. MarkReadOnView bool
  32. MediaPlaybackRate float64
  33. }
  34. // Merge updates the fields of the given user.
  35. func (s *SettingsForm) Merge(user *model.User) *model.User {
  36. user.Username = s.Username
  37. user.Theme = s.Theme
  38. user.Language = s.Language
  39. user.Timezone = s.Timezone
  40. user.EntryDirection = s.EntryDirection
  41. user.EntryOrder = s.EntryOrder
  42. user.EntriesPerPage = s.EntriesPerPage
  43. user.KeyboardShortcuts = s.KeyboardShortcuts
  44. user.ShowReadingTime = s.ShowReadingTime
  45. user.Stylesheet = s.CustomCSS
  46. user.EntrySwipe = s.EntrySwipe
  47. user.GestureNav = s.GestureNav
  48. user.DisplayMode = s.DisplayMode
  49. user.CJKReadingSpeed = s.CJKReadingSpeed
  50. user.DefaultReadingSpeed = s.DefaultReadingSpeed
  51. user.DefaultHomePage = s.DefaultHomePage
  52. user.CategoriesSortingOrder = s.CategoriesSortingOrder
  53. user.MarkReadOnView = s.MarkReadOnView
  54. user.MediaPlaybackRate = s.MediaPlaybackRate
  55. if s.Password != "" {
  56. user.Password = s.Password
  57. }
  58. return user
  59. }
  60. // Validate makes sure the form values are valid.
  61. func (s *SettingsForm) Validate() *locale.LocalizedError {
  62. if s.Username == "" || s.Theme == "" || s.Language == "" || s.Timezone == "" || s.EntryDirection == "" || s.DisplayMode == "" || s.DefaultHomePage == "" {
  63. return locale.NewLocalizedError("error.settings_mandatory_fields")
  64. }
  65. if s.CJKReadingSpeed <= 0 || s.DefaultReadingSpeed <= 0 {
  66. return locale.NewLocalizedError("error.settings_reading_speed_is_positive")
  67. }
  68. if s.Confirmation == "" {
  69. // Firefox insists on auto-completing the password field.
  70. // If the confirmation field is blank, the user probably
  71. // didn't intend to change their password.
  72. s.Password = ""
  73. } else if s.Password != "" {
  74. if s.Password != s.Confirmation {
  75. return locale.NewLocalizedError("error.different_passwords")
  76. }
  77. }
  78. if s.MediaPlaybackRate < 0.25 || s.MediaPlaybackRate > 4 {
  79. return locale.NewLocalizedError("error.settings_media_playback_rate_range")
  80. }
  81. return nil
  82. }
  83. // NewSettingsForm returns a new SettingsForm.
  84. func NewSettingsForm(r *http.Request) *SettingsForm {
  85. entriesPerPage, err := strconv.ParseInt(r.FormValue("entries_per_page"), 10, 0)
  86. if err != nil {
  87. entriesPerPage = 0
  88. }
  89. defaultReadingSpeed, err := strconv.ParseInt(r.FormValue("default_reading_speed"), 10, 0)
  90. if err != nil {
  91. defaultReadingSpeed = 0
  92. }
  93. cjkReadingSpeed, err := strconv.ParseInt(r.FormValue("cjk_reading_speed"), 10, 0)
  94. if err != nil {
  95. cjkReadingSpeed = 0
  96. }
  97. mediaPlaybackRate, err := strconv.ParseFloat(r.FormValue("media_playback_rate"), 64)
  98. if err != nil {
  99. mediaPlaybackRate = 1
  100. }
  101. return &SettingsForm{
  102. Username: r.FormValue("username"),
  103. Password: r.FormValue("password"),
  104. Confirmation: r.FormValue("confirmation"),
  105. Theme: r.FormValue("theme"),
  106. Language: r.FormValue("language"),
  107. Timezone: r.FormValue("timezone"),
  108. EntryDirection: r.FormValue("entry_direction"),
  109. EntryOrder: r.FormValue("entry_order"),
  110. EntriesPerPage: int(entriesPerPage),
  111. KeyboardShortcuts: r.FormValue("keyboard_shortcuts") == "1",
  112. ShowReadingTime: r.FormValue("show_reading_time") == "1",
  113. CustomCSS: r.FormValue("custom_css"),
  114. EntrySwipe: r.FormValue("entry_swipe") == "1",
  115. GestureNav: r.FormValue("gesture_nav"),
  116. DisplayMode: r.FormValue("display_mode"),
  117. DefaultReadingSpeed: int(defaultReadingSpeed),
  118. CJKReadingSpeed: int(cjkReadingSpeed),
  119. DefaultHomePage: r.FormValue("default_home_page"),
  120. CategoriesSortingOrder: r.FormValue("categories_sorting_order"),
  121. MarkReadOnView: r.FormValue("mark_read_on_view") == "1",
  122. MediaPlaybackRate: mediaPlaybackRate,
  123. }
  124. }