1# frozen_string_literal: true
 2
 3require "delegate"
 4require "blather"
 5
 6class ProxiedJID < SimpleDelegator
 7	ESCAPED = /20|22|26|27|2f|3a|3c|3e|40|5c/.freeze
 8
 9	def unproxied
10		Blather::JID.new(
11			node&.gsub(/\\(#{ESCAPED})/) { |s|
12				s[1..-1].to_i(16).chr
13			}
14		)
15	end
16
17	def self.proxy(jid, suffix=CONFIG[:upstream_domain])
18		jid = Blather::JID.new(jid)
19		ProxiedJID.new(Blather::JID.new(
20			jid.stripped.to_s
21				.gsub(/([ "&'\/:<>@]|\\(?=#{ESCAPED}))/) { |s|
22					"\\#{s.ord.to_s(16)}"
23				},
24			suffix,
25			jid.resource
26		))
27	end
28end