Diff: Module:Effective protection level
Comparing revision #1 (2020-09-29 03:38:47) with revision #2 (2023-02-02 05:25:38).
| Old | New |
|---|---|
local p = {} |
local p = {} |
-- Returns the permission required to perform a given action on a given title. |
-- Returns the permission required to perform a given action on a given title. |
-- If no title is specified, the title of the page being displayed is used. |
-- If no title is specified, the title of the page being displayed is used. |
function p._main(action, pagename) |
function p._main(action, pagename) |
local title |
local title |
if type(pagename) == 'table' and pagename.prefixedText then |
if type(pagename) == 'table' and pagename.prefixedText then |
title = pagename |
title = pagename |
elseif pagename then |
elseif pagename then |
title = mw.title.new(pagename) |
title = mw.title.new(pagename) |
else |
else |
title = mw.title.getCurrentTitle() |
title = mw.title.getCurrentTitle() |
end |
end |
pagename = title.prefixedText |
pagename = title.prefixedText |
if action == 'autoreview' then |
if action == 'autoreview' then |
local level = mw.ext.FlaggedRevs.getStabilitySettings(title) |
local level = mw.ext.FlaggedRevs.getStabilitySettings(title) |
level = level and level.autoreview |
level = level and level.autoreview |
if level == 'review' then |
if level == 'review' then |
return 'reviewer' |
return 'reviewer' |
elseif level ~= '' then |
elseif level ~= '' then |
return level |
return level |
else |
else |
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review |
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review |
end |
end |
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then |
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then |
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 ) |
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 ) |
end |
end |
if title.namespace == 8 then -- MediaWiki namespace |
if title.namespace == 8 then -- MediaWiki namespace |
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page |
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page |
return 'interfaceadmin' |
return 'interfaceadmin' |
else -- any non-JS/CSS MediaWiki page |
else -- any non-JS/CSS MediaWiki page |
return 'sysop' |
return 'sysop' |
end |
end |
elseif title.namespace == 2 and title.isSubpage then |
elseif title.namespace == 2 and title.isSubpage then |
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page |
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page |
return 'interfaceadmin' |
return 'interfaceadmin' |
elseif title.contentModel == 'json' then -- user JSON page |
elseif title.contentModel == 'json' then -- user JSON page |
return 'sysop' |
return 'sysop' |
end |
end |
end |
end |
if action == 'undelete' then |
if action == 'undelete' then |
return 'sysop' |
return 'sysop' |
end |
end |
local level = title.protectionLevels[action] and title.protectionLevels[action][1] |
local level = title.protectionLevels[action] and title.protectionLevels[action][1] |
if level == 'sysop' or level == 'editprotected' then |
if level == 'sysop' or level == 'editprotected' then |
return 'sysop' |
return 'sysop' |
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page |
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page |
return 'sysop' |
return 'sysop' |
elseif level == 'templateeditor' then |
elseif level == 'templateeditor' then |
return 'templateeditor' |
return 'templateeditor' |
elseif action == 'move' then |
elseif action == 'move' then |
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move. |
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move. |
if blacklistentry and not blacklistentry.params.autoconfirmed then |
if blacklistentry and not blacklistentry.params.autoconfirmed then |
return 'templateeditor' |
return 'templateeditor' |
elseif title.namespace == 6 then |
elseif title.namespace == 6 then |
return 'filemover' |
return 'filemover' |
elseif level == 'extendedconfirmed' then |
elseif level == 'extendedconfirmed' then |
return 'extendedconfirmed' |
return 'extendedconfirmed' |
else |
else |
return 'autoconfirmed' |
return 'autoconfirmed' |
end |
end |
end |
end |
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename) |
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename) |
if blacklistentry then |
if blacklistentry then |
if not blacklistentry.params.autoconfirmed then |
if not blacklistentry.params.autoconfirmed then |
return 'templateeditor' |
return 'templateeditor' |
elseif level == 'extendedconfirmed' then |
elseif level == 'extendedconfirmed' then |
return 'extendedconfirmed' |
return 'extendedconfirmed' |
else |
else |
return 'autoconfirmed' |
return 'autoconfirmed' |
end |
end |
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason |
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason |
return 'autoconfirmed' |
return 'autoconfirmed' |
elseif level then |
elseif level then |
return level |
return level |
elseif action == 'upload' then |
elseif action == 'upload' then |
return 'autoconfirmed' |
return 'autoconfirmed' |
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts |
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts |
return 'user' |
return 'user' |
else |
else |
return '*' |
return '*' |
end |
end |
end |
end |
setmetatable(p, { __index = function(t, k) |
setmetatable(p, { __index = function(t, k) |
return function(frame) |
return function(frame) |
return t._main(k, frame.args[1]) |
return t._main(k, frame.args[1]) |
end |
end |
end }) |
end }) |
return p |
return p |