diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b90f69b..398c57b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Fixed a bug where background jobs to import Immich and Photoprism geolocation data data could not be created by non-admin users. +### Changed + +- Restrict access to Sidekiq in non self-hosted mode. +- Restrict access to background jobs in non self-hosted mode. +- Restrict access to users management in non self-hosted mode. + # 0.24.1 - 2025-02-13 ## Custom map tiles diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f1a5e617..7b7c27d0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base include Pundit::Authorization - before_action :unread_notifications + before_action :unread_notifications, :set_self_hosted_status protected @@ -24,4 +24,10 @@ class ApplicationController < ActionController::Base redirect_to root_path, notice: 'You are not authorized to perform this action.', status: :see_other end + + private + + def set_self_hosted_status + @self_hosted = DawarichSettings.self_hosted? + end end diff --git a/app/javascript/controllers/base_controller.js b/app/javascript/controllers/base_controller.js new file mode 100644 index 00000000..ab6f12f7 --- /dev/null +++ b/app/javascript/controllers/base_controller.js @@ -0,0 +1,23 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static values = { + selfHosted: Boolean + } + + // Every controller that extends BaseController and uses initialize() + // should call super.initialize() + // Example: + // export default class extends BaseController { + // initialize() { + // super.initialize() + // } + // } + initialize() { + // Get the self-hosted value from the HTML root element + if (!this.hasSelfHostedValue) { + const selfHosted = document.documentElement.dataset.selfHosted === 'true' + this.selfHostedValue = selfHosted + } + } +} diff --git a/app/javascript/controllers/checkbox_select_all_controller.js b/app/javascript/controllers/checkbox_select_all_controller.js index 5e77773f..1b542f84 100644 --- a/app/javascript/controllers/checkbox_select_all_controller.js +++ b/app/javascript/controllers/checkbox_select_all_controller.js @@ -1,7 +1,7 @@ -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" // Connects to data-controller="checkbox-select-all" -export default class extends Controller { +export default class extends BaseController { static targets = ["parent", "child"] connect() { diff --git a/app/javascript/controllers/datetime_controller.js b/app/javascript/controllers/datetime_controller.js index b56f07e3..b03df4ca 100644 --- a/app/javascript/controllers/datetime_controller.js +++ b/app/javascript/controllers/datetime_controller.js @@ -2,9 +2,9 @@ // - trips/new // - trips/edit -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" -export default class extends Controller { +export default class extends BaseController { static targets = ["startedAt", "endedAt", "apiKey"] static values = { tripsId: String } diff --git a/app/javascript/controllers/imports_controller.js b/app/javascript/controllers/imports_controller.js index fd00d5c9..d39455a0 100644 --- a/app/javascript/controllers/imports_controller.js +++ b/app/javascript/controllers/imports_controller.js @@ -1,7 +1,7 @@ -import { Controller } from "@hotwired/stimulus"; +import BaseController from "./base_controller"; import consumer from "../channels/consumer"; -export default class extends Controller { +export default class extends BaseController { static targets = ["index"]; connect() { diff --git a/app/javascript/controllers/map_preview_controller.js b/app/javascript/controllers/map_preview_controller.js index 3b610a33..e55f2b83 100644 --- a/app/javascript/controllers/map_preview_controller.js +++ b/app/javascript/controllers/map_preview_controller.js @@ -1,8 +1,8 @@ -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" import L from "leaflet" import { showFlashMessage } from "../maps/helpers" -export default class extends Controller { +export default class extends BaseController { static targets = ["urlInput", "mapContainer", "saveButton"] DEFAULT_TILE_URL = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' diff --git a/app/javascript/controllers/maps_controller.js b/app/javascript/controllers/maps_controller.js index d2f59dbb..9cf82ee4 100644 --- a/app/javascript/controllers/maps_controller.js +++ b/app/javascript/controllers/maps_controller.js @@ -13,7 +13,7 @@ import { import { fetchAndDrawAreas, handleAreaCreated } from "../maps/areas"; -import { showFlashMessage, fetchAndDisplayPhotos, debounce } from "../maps/helpers"; +import { showFlashMessage, fetchAndDisplayPhotos } from "../maps/helpers"; import { osmMapLayer, @@ -31,8 +31,9 @@ import { countryCodesMap } from "../maps/country_codes"; import "leaflet-draw"; import { initializeFogCanvas, drawFogCanvas, createFogOverlay } from "../maps/fog_of_war"; import { TileMonitor } from "../maps/tile_monitor"; +import BaseController from "./base_controller"; -export default class extends Controller { +export default class extends BaseController { static targets = ["container"]; settingsButtonAdded = false; @@ -41,6 +42,7 @@ export default class extends Controller { trackedMonthsCache = null; connect() { + super.connect(); console.log("Map controller connected"); this.apiKey = this.element.dataset.api_key; diff --git a/app/javascript/controllers/notifications_controller.js b/app/javascript/controllers/notifications_controller.js index 6ba44514..c40a4db5 100644 --- a/app/javascript/controllers/notifications_controller.js +++ b/app/javascript/controllers/notifications_controller.js @@ -1,11 +1,12 @@ -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" import consumer from "../channels/consumer" -export default class extends Controller { +export default class extends BaseController { static targets = ["badge", "list"] static values = { userId: Number } initialize() { + super.initialize() this.subscription = null } diff --git a/app/javascript/controllers/removals_controller.js b/app/javascript/controllers/removals_controller.js index cf487d07..c5f30b32 100644 --- a/app/javascript/controllers/removals_controller.js +++ b/app/javascript/controllers/removals_controller.js @@ -1,6 +1,6 @@ -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" -export default class extends Controller { +export default class extends BaseController { static values = { timeout: Number } diff --git a/app/javascript/controllers/trip_map_controller.js b/app/javascript/controllers/trip_map_controller.js index 1bbdc207..01b4a9e5 100644 --- a/app/javascript/controllers/trip_map_controller.js +++ b/app/javascript/controllers/trip_map_controller.js @@ -1,10 +1,10 @@ // This controller is being used on: // - trips/index -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" import L from "leaflet" -export default class extends Controller { +export default class extends BaseController { static values = { tripId: Number, path: String, diff --git a/app/javascript/controllers/trips_controller.js b/app/javascript/controllers/trips_controller.js index 974feb30..6dc0c544 100644 --- a/app/javascript/controllers/trips_controller.js +++ b/app/javascript/controllers/trips_controller.js @@ -3,7 +3,7 @@ // - trips/edit // - trips/new -import { Controller } from "@hotwired/stimulus" +import BaseController from "./base_controller" import L from "leaflet" import { osmMapLayer, @@ -22,7 +22,7 @@ import { showFlashMessage } from '../maps/helpers'; -export default class extends Controller { +export default class extends BaseController { static targets = ["container", "startedAt", "endedAt"] static values = { } diff --git a/app/javascript/controllers/visit_modal_map_controller.js b/app/javascript/controllers/visit_modal_map_controller.js index 5fcb0547..f9b164f6 100644 --- a/app/javascript/controllers/visit_modal_map_controller.js +++ b/app/javascript/controllers/visit_modal_map_controller.js @@ -1,12 +1,12 @@ -import { Controller } from "@hotwired/stimulus" -import L, { latLng } from "leaflet"; -import { osmMapLayer } from "../maps/layers"; +import BaseController from "./base_controller" +import L from "leaflet" +import { osmMapLayer } from "../maps/layers" // This controller is used to display a map of all coordinates for a visit // on the "Map" modal of a visit on the Visits page -export default class extends Controller { - static targets = ["container"]; +export default class extends BaseController { + static targets = ["container"] connect() { this.coordinates = JSON.parse(this.element.dataset.coordinates); diff --git a/app/javascript/controllers/visit_modal_places_controller.js b/app/javascript/controllers/visit_modal_places_controller.js index ad6259f2..b697622e 100644 --- a/app/javascript/controllers/visit_modal_places_controller.js +++ b/app/javascript/controllers/visit_modal_places_controller.js @@ -1,10 +1,13 @@ -import { Controller } from "@hotwired/stimulus"; +import BaseController from "./base_controller" -export default class extends Controller { +export default class extends BaseController { + static targets = ["name", "input"] connect() { - this.visitId = this.element.dataset.id; this.apiKey = this.element.dataset.api_key; + this.visitId = this.element.dataset.id; + + this.element.addEventListener("visit-name:updated", this.updateAll.bind(this)); } // Action to handle selection change diff --git a/app/javascript/controllers/visit_name_controller.js b/app/javascript/controllers/visit_name_controller.js index 70af33b2..24b33273 100644 --- a/app/javascript/controllers/visit_name_controller.js +++ b/app/javascript/controllers/visit_name_controller.js @@ -1,7 +1,7 @@ -import { Controller } from "@hotwired/stimulus"; +import BaseController from "./base_controller" // This controller is used to handle the updating of visit names on the Visits page -export default class extends Controller { +export default class extends BaseController { static targets = ["name", "input"]; connect() { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4063fad1..f41baeda 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,5 +1,5 @@ - + <%= full_title(yield(:title)) %>