Files
ubicloud/db.rb
Jeremy Evans 451229fecc Enforce restriction that UbiCli/UbiRodish do not query the database
This uses the new block_queries extension in Sequel, to block
queries around the call to UbiCli.process, and only allow them
when UbiCli internally calls Clover.call.

With this, if UbiCli/UbiRodish tries to access the database
directly, it will fail.

This restriction is only added when running frozen specs, so that
code must pass both with and without the restriction (useful as
the restriction is not used in production).
2025-02-05 11:01:58 -08:00

43 lines
2.0 KiB
Ruby

# frozen_string_literal: true
require "netaddr"
require "sequel/core"
require_relative "config"
require_relative "lib/util"
db_ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", "db_ca_bundle.crt")
Util.safe_write_to_file(db_ca_bundle_filename, Config.clover_database_root_certs)
max_connections = Config.db_pool - 1
max_connections = 1 if ENV["SHARED_CONNECTION"] == "1"
DB = Sequel.connect(Config.clover_database_url, max_connections:, pool_timeout: Config.database_timeout).tap do |db|
# Replace dangerous (for cidrs) Ruby IPAddr type that is otherwise
# used by sequel_pg. Has come up more than once in the bug tracker:
#
# https://github.com/jeremyevans/sequel_pg/issues?q=inet
# https://github.com/jeremyevans/sequel_pg/issues/30
# https://github.com/jeremyevans/sequel_pg/pull/37
db.add_conversion_proc(650, NetAddr.method(:parse_net))
db.add_conversion_proc(869, NetAddr.method(:parse_ip))
end
postgres_monitor_db_ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", "postgres_monitor_db.crt")
Util.safe_write_to_file(postgres_monitor_db_ca_bundle_filename, Config.postgres_monitor_database_root_certs)
begin
POSTGRES_MONITOR_DB = Sequel.connect(Config.postgres_monitor_database_url, max_connections: Config.db_pool, pool_timeout: Config.database_timeout) if Config.postgres_monitor_database_url
rescue Sequel::DatabaseConnectionError => ex
Clog.emit("Failed to connect to Postgres Monitor database") { {database_connection_failed: {exception: Util.exception_to_hash(ex)}} }
end
# Load Sequel Database/Global extensions here
# DB.extension :date_arithmetic
DB.extension :pg_array, :pg_json, :pg_auto_parameterize, :pg_timestamptz, :pg_range
Sequel.extension :pg_range_ops, :pg_json_ops
DB.extension :pg_schema_caching
DB.extension :index_caching
DB.load_schema_cache?("cache/schema.cache")
DB.load_index_cache?("cache/index.cache")
DB.extension :temporarily_release_connection if ENV["SHARED_CONNECTION"] == "1"
DB.extension :query_blocker if Config.test? && ENV["CLOVER_FREEZE"] == "1"