Module:Sensitive IP addresses/blocktext

-- This module creates a warning about sensitive IP addresses that is intended
-- to be placed in [[Special:Block]] via the [[Mediawiki:Blockiptext]] message.

local querySensitiveIPs = require('Module:Sensitive IP addresses').query
local mIP = require('Module:IP')
local IPAddress = mIP.IPAddress
local Subnet = mIP.Subnet

local function normalizeIPOrSubnet(ipOrSubnet)
	-- Normalize an IP address or subnet.
	-- If ipOrSubnet is not a valid IP address or subnet, returns nil.
	local ipSuccess, ipObj = pcall(IPAddress.new, ipOrSubnet)
	if ipSuccess and ipObj then
		return tostring(ipObj)
	end
	local subnetSuccess, subnetObj = pcall(Subnet.new, ipOrSubnet)
	if subnetSuccess and subnetObj then
		return tostring(subnetObj)
	end
	return nil
end

local function parseTitle(title)
	-- Parse a title. If the subpage(s) of the root page are a valid IP
	-- address or subnet, then return the normalized IP address or subnet.
	local ipOrSubnet = title.text:gsub('^.-/', '')
	return normalizeIPOrSubnet(ipOrSubnet)
end

local function fetchSensitivityData(ipOrSubnet)
	return querySensitiveIPs{test = {ipOrSubnet}}
end

local function parseSensitivityData(sensitivityData)
	-- Parse the data from the sensitive IP API call, and return a table with
	-- information about the first match that we can use as arguments to a
	-- template call.
	local function parse(sensitivityData)
		sensitivityData = sensitivityData.sensitiveips
		if #sensitivityData.matches == 0 then
			return nil
		end
		local ret = {}
		ret.type = sensitivityData.matches[1].type
		if ret.type == 'ip' then
			ret.ip = sensitivityData.matches[1].ip
		elseif ret.type == 'range' then
			ret.range = sensitivityData.matches[1].range
		else
			return nil
		end
		ret['entity-id'] = sensitivityData.matches[1]['entity-id']
		ret['matches-range'] = sensitivityData.matches[1]['matches-range']
		ret['entity-name'] = sensitivityData.entities[ret['entity-id']].name
		ret['entity-description'] = sensitivityData.entities[ret['entity-id']].description
		ret.reason = sensitivityData.entities[ret['entity-id']].reason
		return ret
	end

	local success, ret = pcall(parse, sensitivityData)
	if success and ret then
		return ret
	else
		return nil
	end
end

local function renderMessage(rawMessage, messageArgs)
	local message
	if rawMessage then
		message = mw.message.newRawMessage(rawMessage)
	else
		message = mw.message.new('sensitive-ip-block-text')
	end
	local wikitext = message:params(
		messageArgs.type,
		messageArgs.type == 'ip' and messageArgs.ip or messageArgs.range,
		messageArgs['matches-range'],
		messageArgs['entity-id'],
		messageArgs['entity-name'],
		messageArgs['entity-description'],
		messageArgs.reason
	):plain()
	local frame = mw.getCurrentFrame()
	return frame:preprocess(wikitext)
end

local p = {}

function p._main(args, title)
	args = args or {}
	title = title or mw.title.getCurrentTitle()
	local ipOrSubnet = parseTitle(title)
	if not ipOrSubnet then
		return nil
	end
	local sensitivityData = fetchSensitivityData(ipOrSubnet)
	if not sensitivityData then
		return nil
	end
	local messageArgs = parseSensitivityData(sensitivityData)
	return renderMessage(args.message, messageArgs)
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame)
	return p._main(args)
end

function p._exportFunctions()
	return {
		parseTitle = parseTitle,
		fetchSensitivityData = fetchSensitivityData,
		parseSensitivityData = parseSensitivityData,
		renderMessage = renderMessage,
	}
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.