Modul:UrlCheck: Unterschied zwischen den Versionen
K
+Fehlermeldungen
K (+ip4) |
K (+Fehlermeldungen) |
||
| Zeile 1: | Zeile 1: | ||
local uc = {} | local uc = {} | ||
uc.msg = { | |||
[0] = 'No error detected', | |||
[1] = 'Host with non-ASCII characters', | |||
[2] = 'Host is IP address', | |||
[3] = 'URL is empty', | |||
[4] = 'URL has more then 2048 characters', | |||
[5] = 'URL contains control marks or spaces', | |||
[6] = 'Missing or wrong protocol', | |||
[7] = 'Host starts with slash / character', | |||
[8] = 'Host contains invalid character combinations', | |||
[9] = 'More than one commercial ats @ in host detected', | |||
[10] = 'Commercial at @ detected but user or host are missing', | |||
[11] = 'More than one colon : in user detected', | |||
[12] = 'Colon : detected but user or password are missing', | |||
[13] = 'User has more than 64 characters', | |||
[14] = 'Host ist empty', | |||
[15] = 'More than one colon : in host detected', | |||
[16] = 'Colon : detected but host or port are missing', | |||
[17] = 'Port out of range of 0 ... 65535', | |||
[18] = 'Host has more than 253 characters', | |||
[19] = 'Host with missing dot as domain separator', | |||
[20] = 'Host has dot but no top-level domain', | |||
[21] = 'Unknown top-level domain', | |||
[22] = 'Invalid host structure', | |||
} | |||
function uc.ip4( address ) | function uc.ip4( address ) | ||
| Zeile 16: | Zeile 42: | ||
function uc.isUrl( url ) | function uc.isUrl( url ) | ||
-- return codes 0 | -- return codes 0 through 2 reserved | ||
if ( url == nil ) or ( type( url ) ~= 'string' ) then return | if ( url == nil ) or ( type( url ) ~= 'string' ) then return 3 end | ||
local s = mw.text.trim( url ) | local s = mw.text.trim( url ) | ||
if | if s == '' then return 3 end | ||
if #s > 2048 then return 4 end | |||
-- limitation because of search engines or IE | -- limitation because of search engines or IE | ||
if s:find( '%s' ) or s:find( '%c' ) or s:match( '^%.' ) then return | if s:find( '%s' ) or s:find( '%c' ) or s:match( '^%.' ) then return 5 end | ||
-- https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource | -- https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource | ||
| Zeile 35: | Zeile 62: | ||
-- end | -- end | ||
end | end | ||
if count == 0 then return | if count == 0 then return 6 end -- missing or wrong protocol | ||
local user = '' | local user = '' | ||
| Zeile 50: | Zeile 77: | ||
path = s:sub( at + 1, #s ) | path = s:sub( at + 1, #s ) | ||
s = s:sub( 1, at - 1 ) | s = s:sub( 1, at - 1 ) | ||
if not s then return | if not s then return 7 end | ||
end | end | ||
| Zeile 58: | Zeile 85: | ||
if s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) | if s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) | ||
or s:find( '%-%.' ) or s:find( '%.%-' ) or s:find( '%./' ) or s:find( '/%.' ) | or s:find( '%-%.' ) or s:find( '%.%-' ) or s:find( '%./' ) or s:find( '/%.' ) | ||
then return | then return 8 end | ||
-- user and password | -- user and password | ||
_,count = s:gsub( '@', '@' ) | _,count = s:gsub( '@', '@' ) | ||
if count > 1 then return | if count > 1 then return 9 end | ||
if count == 1 then | if count == 1 then | ||
at = s:find( '@' ) | at = s:find( '@' ) | ||
user = s:sub( 1, at - 1 ) | user = s:sub( 1, at - 1 ) | ||
host = s:sub( at + 1, #s ) | host = s:sub( at + 1, #s ) | ||
if not user or not s then return | if not user or not s then return 10 end | ||
_,count = user:gsub( ':', ':' ) | _,count = user:gsub( ':', ':' ) | ||
if count > 1 then return | if count > 1 then return 11 end | ||
if count == 1 then | if count == 1 then | ||
at = user:find( ':' ) | at = user:find( ':' ) | ||
password = user:sub( at + 1, #user ) | password = user:sub( at + 1, #user ) | ||
user = user:sub( 1, at - 1 ) | user = user:sub( 1, at - 1 ) | ||
if not user or not password then return | if not user or not password then return 12 end | ||
if #user > 64 then return | if #user > 64 then return 13 end | ||
end | end | ||
else | else | ||
host = s | host = s | ||
end | end | ||
if host == '' then return | if host == '' then return 14 end | ||
-- host and port | -- host and port | ||
_,count = host:gsub( ':', ':' ) | _,count = host:gsub( ':', ':' ) | ||
if count > 1 then return | if count > 1 then return 15 end | ||
if count == 1 then | if count == 1 then | ||
at = host:find( ':' ) | at = host:find( ':' ) | ||
port = host:sub( at + 1, #host ) | port = host:sub( at + 1, #host ) | ||
host = host:sub( 1, at - 1 ) | host = host:sub( 1, at - 1 ) | ||
if not host or not port then return | if not host or not port then return 16 end | ||
if ( port:match( '^[1-9]%d*$' ) == nil ) or | if ( port:match( '^[1-9]%d*$' ) == nil ) or | ||
( tonumber( port ) > 65535 ) then return | ( tonumber( port ) > 65535 ) then return 17 end | ||
end | end | ||
-- handle host part | -- handle host part | ||
if #host > 253 then return | if #host > 253 then return 18 end | ||
-- getting top-level domain | -- getting top-level domain | ||
at = host:match( '^.*()%.' ) -- find last dot | at = host:match( '^.*()%.' ) -- find last dot | ||
if at == nil then return | if at == nil then return 19 end | ||
topLevel = host:sub( at + 1, #host ) | topLevel = host:sub( at + 1, #host ) | ||
if not topLevel then return | if not topLevel then return 20 end | ||
-- future: check of top-level domain | -- future: check of top-level domain | ||
if uc.ip4( host ) == 1 then return | if uc.ip4( host ) == 1 then return 2 end -- is ip4 address | ||
if not mw.ustring.match( host, '^[%w%.%-]+%.%a%a+$' ) then return | if not mw.ustring.match( host, '^[%w%.%-]+%.%a%a+$' ) then return 22 end | ||
if not host:match( '^[%w%.%-]+%.%a%a+$' ) then | if not host:match( '^[%w%.%-]+%.%a%a+$' ) then | ||
return 1 -- matches domain only in UTF 8 mode | return 1 -- matches domain only in UTF 8 mode | ||
| Zeile 117: | Zeile 144: | ||
function uc.checkUrl( frame ) | function uc.checkUrl( frame ) | ||
local args = frame.args | local args = frame.args | ||
args.url = args.url or '' | |||
args.show = args.show or '' | |||
local result = uc.isUrl( args.url ) | |||
if args.show.lower() == 'msg' then | |||
if uc.msg[result] == nil then | |||
return 'Unknown error' | |||
else | |||
return uc.msg[result] | |||
end | |||
else | |||
return result | |||
end | |||
end | end | ||
return uc | return uc | ||