108 lines
3.5 KiB
CoffeeScript
Executable File
108 lines
3.5 KiB
CoffeeScript
Executable File
Redirect =
|
|
init: ->
|
|
o =
|
|
thread: {}
|
|
post: {}
|
|
file: {}
|
|
report: {}
|
|
|
|
archives = {}
|
|
for data in Redirect.archives
|
|
{name, boards, files, software, withCredentials} = data
|
|
archives[name] = data
|
|
for boardID in boards
|
|
unless withCredentials
|
|
o.thread[boardID] = data unless boardID of o.thread
|
|
o.post[boardID] = data unless boardID of o.post or software isnt 'foolfuuka'
|
|
o.file[boardID] = data unless boardID of o.file or boardID not in files
|
|
o.report[boardID] = data if name is 'fgts'
|
|
|
|
for boardID, record of Conf['selectedArchives']
|
|
for type, id of record
|
|
if id is 'disabled'
|
|
delete o[type][boardID]
|
|
else if archive = archives[id]
|
|
boards = if type is 'file' then archive.files else archive.boards
|
|
o[type][boardID] = archive if boardID in boards
|
|
|
|
Redirect.data = o
|
|
|
|
archives: `<%= JSON.stringify(grunt.file.readJSON('src/Archive/archives.json')) %>`
|
|
|
|
to: (dest, data) ->
|
|
archive = (if dest in ['search', 'board'] then Redirect.data.thread else Redirect.data[dest])[data.boardID]
|
|
return '' unless archive
|
|
Redirect[dest] archive, data
|
|
|
|
protocol: (archive) ->
|
|
protocol = location.protocol
|
|
unless archive[protocol[0...-1]]
|
|
protocol = if protocol is 'https:' then 'http:' else 'https:'
|
|
"#{protocol}//"
|
|
|
|
thread: (archive, {boardID, threadID, postID}) ->
|
|
# Keep the post number only if the location.hash was sent f.e.
|
|
path = if threadID
|
|
"#{boardID}/thread/#{threadID}"
|
|
else
|
|
"#{boardID}/post/#{postID}"
|
|
if archive.software is 'foolfuuka'
|
|
path += '/'
|
|
if threadID and postID
|
|
path += if archive.software is 'foolfuuka'
|
|
"##{postID}"
|
|
else
|
|
"#p#{postID}"
|
|
"#{Redirect.protocol archive}#{archive.domain}/#{path}"
|
|
|
|
post: (archive, {boardID, postID}) ->
|
|
# For fuuka-based archives:
|
|
# https://github.com/eksopl/fuuka/issues/27
|
|
protocol = Redirect.protocol archive
|
|
URL = new String "#{protocol}#{archive.domain}/_/api/chan/post/?board=#{boardID}&num=#{postID}"
|
|
return '' unless Redirect.securityCheck URL
|
|
|
|
URL.archive = archive
|
|
URL
|
|
|
|
file: (archive, {boardID, filename}) ->
|
|
"#{Redirect.protocol archive}#{archive.domain}/#{boardID}/full_image/#{filename}"
|
|
|
|
board: (archive, {boardID}) ->
|
|
"#{Redirect.protocol archive}#{archive.domain}/#{boardID}/"
|
|
|
|
search: (archive, {boardID, type, value}) ->
|
|
type = if type is 'name'
|
|
'username'
|
|
else if type is 'MD5'
|
|
'image'
|
|
else
|
|
type
|
|
if type is 'capcode'
|
|
value = {'Developer': 'dev'}[value] or value.toLowerCase()
|
|
value = encodeURIComponent value
|
|
path = if archive.software is 'foolfuuka'
|
|
"#{boardID}/search/#{type}/#{value}"
|
|
else
|
|
"#{boardID}/?task=search2&search_#{if type is 'image' then 'media_hash' else type}=#{value}"
|
|
"#{Redirect.protocol archive}#{archive.domain}/#{path}"
|
|
|
|
report: (archive, {boardID, postID}) ->
|
|
"https://so.fgts.jp/report/?board=#{boardID}&no=#{postID}"
|
|
|
|
securityCheck: (URL) ->
|
|
/^https:\/\//.test(URL) or
|
|
location.protocol is 'http:' or
|
|
Conf['Except Archives from Encryption']
|
|
|
|
navigate: (dest, data, alternative) ->
|
|
Redirect.init() unless Redirect.data
|
|
url = Redirect.to dest, data
|
|
if url and (
|
|
Redirect.securityCheck(url) or
|
|
confirm "Redirect to #{url}?\n\nYour connection will not be encrypted."
|
|
)
|
|
location.replace url
|
|
else if alternative
|
|
location.replace alternative
|