Fix #4736: Display network prefix length (if present) in API key IP whitelist.

This commit is contained in:
evazion
2021-03-01 02:23:05 -06:00
parent e5bbc039ae
commit 35a0c6b11f
8 changed files with 42 additions and 12 deletions

View File

@@ -0,0 +1,23 @@
# A wrapper around the IPAddress gem that adds some extra utility methods.
#
# https://github.com/ipaddress-gem/ipaddress
module Danbooru
class IpAddress
attr_reader :ip_address
delegate_missing_to :ip_address
def initialize(string)
@ip_address = ::IPAddress.parse(string)
end
# "1.2.3.4/24" if the address is a subnet, "1.2.3.4" otherwise.
def to_s
ip_address.size > 1 ? ip_address.to_string : ip_address.to_s
end
def inspect
"#<Danbooru::IpAddress #{to_s}>"
end
end
end

View File

@@ -1,9 +1,14 @@
# See also config/initializers/types.rb
require "active_record/connection_adapters/postgresql_adapter"
class IpAddressType < ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Inet
def cast(value)
super(IPAddress.parse(value))
return nil if value.blank?
super(Danbooru::IpAddress.new(value))
end
def serialize(value)
value.to_string
value&.to_string
end
end

View File

@@ -1,4 +1,7 @@
class ApiKey < ApplicationRecord
attribute :permitted_ip_addresses, :ip_address, array: true
attribute :last_ip_address, :ip_address
array_attribute :permissions
array_attribute :permitted_ip_addresses

View File

@@ -1,7 +1,7 @@
class IpAddress < ApplicationRecord
belongs_to :model, polymorphic: true
belongs_to :user
attribute :ip_addr, IpAddressType.new
attribute :ip_addr, :ip_address
def self.model_types
%w[Post User Comment Dmail ArtistVersion ArtistCommentaryVersion NoteVersion WikiPageVersion]
@@ -41,8 +41,7 @@ class IpAddress < ApplicationRecord
end
def to_s
# include the subnet mask only when the IP denotes a subnet.
(ip_addr.size > 1) ? ip_addr.to_string : ip_addr.to_s
ip_addr.to_s
end
def readonly?

View File

@@ -1,6 +1,6 @@
<%= edit_form_for(api_key, html: { class: "stacked-hints" }) do |f| %>
<%= f.input :name, as: :string, hint: "An optional name to help you remember what this key is for." %>
<%= f.input :permitted_ip_addresses, label: "IP Addresses", as: :string, hint: "An optional list of IPs allowed to use this key. Leave blank to allow all IPs." %>
<%= f.input :permissions, as: :select, collection: ApiKey.permissions_list, hint: "An optional list of API endpoints this key can use. Ctrl+click to select multiple endpoints. Leave blank to allow all API endpoints.", input_html: { multiple: true } %>
<%= f.input :permitted_ip_addresses, label: "IP Addresses", as: :string, hint: "An optional list of IPs allowed to use this key. Space separated, subnets allowed. Leave blank to allow all IPs." %>
<%= f.input :permissions, as: :select, collection: ApiKey.permissions_list, hint: "An optional list of API endpoints this key is allowed to use. Ctrl+click to select multiple endpoints. Leave blank to allow all API endpoints.", input_html: { multiple: true } %>
<%= f.submit "Create" %>
<% end %>