Module:Sensitive IP addresses/summary

local mSIPA_API = require('Module:Sensitive IP addresses/API') local yesno = require('Module:Yesno')

local p = {}

-- Strips a suffix from a CIDR string if the suffix is of a given bitLength. -- bitLength must be either 32 or 128. -- This is intended to allow CIDR strings to be represented as a single IP -- address if this can be done unambiguously. local function stripCIDRSuffix(cidr, bitLength) assert(bitLength == 32 or bitLength == 128, 'bitLength was not 32 or 128') local pattern = '/' .. bitLength .. '$'	cidr = cidr:gsub(pattern, '') return cidr end

-- Takes an array of CIDR ranges and returns a new array with ranges -- appropriate for printing. local function prettifyRanges(ranges, bitLength) local ret = {} for i, cidr in ipairs(ranges) do		ret[i] = stripCIDRSuffix(cidr, bitLength) end return ret end

-- Turns an array of CIDR ranges into its string representation. local function stringifyRanges(ranges, bitLength, separator) if not ranges then return '' end ranges = prettifyRanges(ranges, bitLength) return table.concat(ranges, separator) end

function p._table(options) -- Return a wikitext table summarizing all the sensitive IP ranges -- and the entities they belong to.

-- Load dependencies local lang = mw.language.getContentLanguage

-- Set up options options = options or {} local rangeSeparator = options.rangeseparator or ', ' local showNotes = yesno(options.notes) local nColumns = showNotes and 3 or 4

-- Get the entity data local data = mSIPA_API.query{entities={'all'}} if data['error'] then error(string.format('%s: %s', data['error'].code, data['error'].info)) end

-- Make the table root local root = mw.html.create('table') root:addClass('sensitive-ip-addresses') if options.class then root:addClass(options.class) end if options.style then root:cssText(options.style) end

-- Add main header if options.mainheader then root:tag('tr'):tag('td') :attr('colspan', nColumns) :cssText(options.cellstyle) :wikitext(options.mainheader) end

-- Add column headers local headerRow = root:tag('tr') headerRow :tag('th') :cssText(options.cellstyle) :wikitext('IPv4') :done :tag('th') :cssText(options.cellstyle) :wikitext('IPv6') :done :tag('th') :cssText(options.cellstyle) :wikitext('Description') if showNotes then headerRow:tag('th') :cssText(options.cellstyle) :wikitext('Notes') end

-- Add data cells for i, id in ipairs(data.sensitiveips['entity-ids']) do		local entityData = data.sensitiveips.entities[id] if not options.reason or options.reason == entityData.reason then local dataRow = root:tag('tr') dataRow :tag('td') :cssText(options.cellstyle) :wikitext(stringifyRanges( entityData.ipv4Ranges, 32,						rangeSeparator ))					:done :tag('td') :cssText(options.cellstyle) :wikitext(stringifyRanges( entityData.ipv6Ranges, 128,						rangeSeparator ))					:done :tag('td') :cssText(options.cellstyle) :wikitext(lang:ucfirst(entityData.description)) if showNotes then dataRow:tag('td') :cssText(options.cellstyle) :wikitext(entityData.notes) end end end

return tostring(root) end

function p.table(frame) local args = require('Module:Arguments').getArgs(frame, {		frameOnly = true	}) return p._table(args) end

return p