This commit is contained in:
parent
e13c5f6744
commit
d388fd4cd4
292
lib/fediblock.js
292
lib/fediblock.js
@ -1,4 +1,5 @@
|
||||
let servers
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0
|
||||
module.exports = async (client, apex, app) => {
|
||||
const util = require('./util')(apex),
|
||||
constant = require('./constant'),
|
||||
@ -18,122 +19,92 @@ module.exports = async (client, apex, app) => {
|
||||
}
|
||||
},
|
||||
requestPart = async uri => {
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0
|
||||
const ac = new AbortController()
|
||||
try {
|
||||
setTimeout(() => {
|
||||
ac.abort()
|
||||
}, 5000)
|
||||
const response = await fetch(uri, {
|
||||
headers: { 'User-Agent': constant.agent },
|
||||
agent: new https.Agent({
|
||||
keepAlive: false
|
||||
}),
|
||||
signal: ac.signal,
|
||||
keepalive: false,
|
||||
timeout: 3000
|
||||
setTimeout(() => {
|
||||
ac.abort()
|
||||
}, 5000)
|
||||
const response = await fetch(uri, {
|
||||
headers: { 'User-Agent': constant.agent },
|
||||
agent: new https.Agent({
|
||||
keepAlive: false
|
||||
}),
|
||||
json = await response.json()
|
||||
// setImmediate(() => { ac.abort() })
|
||||
return json
|
||||
} catch (e) {
|
||||
// setImmediate(() => { ac.abort() })
|
||||
// console.error(e)
|
||||
throw e
|
||||
}
|
||||
signal: ac.signal,
|
||||
keepalive: false,
|
||||
timeout: 3000
|
||||
}),
|
||||
json = await response.json()
|
||||
// setImmediate(() => { ac.abort() })
|
||||
return json
|
||||
s
|
||||
},
|
||||
scanInstance = async instance => {
|
||||
try {
|
||||
const json = await requestPart(`https://${instance}/api/v1/instance/domain_blocks`)
|
||||
if (Array.isArray(json) && json.length > 0) {
|
||||
const result = await client.search({
|
||||
index: constant.index,
|
||||
size: 1,
|
||||
query: {
|
||||
term: {
|
||||
instance: instance
|
||||
}
|
||||
}
|
||||
}),
|
||||
instancelocated = result.hits && result.hits.hits ? result.hits.hits : [],
|
||||
blocks = json.map(block => {
|
||||
if (block.comment && block.comment.length > 8190) {
|
||||
block.comment = block.comment.slice(0, 8190)
|
||||
}
|
||||
return block
|
||||
}),
|
||||
[api, nodeinfo, peers] = await Promise.all([
|
||||
requestPart(`https://${instance}/api/v1/instance`),
|
||||
requestPart(`https://${instance}/nodeinfo/2.0`),
|
||||
requestPart(`https://${instance}/api/v1/instance/peers`)
|
||||
])
|
||||
if (instancelocated.length === 0) {
|
||||
try {
|
||||
await client.index({
|
||||
index: constant.index,
|
||||
body: {
|
||||
instance,
|
||||
api,
|
||||
nodeinfo,
|
||||
blocks,
|
||||
peers,
|
||||
last: new Date()
|
||||
}
|
||||
})
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return
|
||||
}
|
||||
app.locals.created++
|
||||
return await util.sendFederatedMessage(constant.nick, 'New Fediblock Instance', `Fediblock Instance ${instance} with ${json.length} blocks - https://${constant.apexdomain}#${instance}`, getAccount(api))
|
||||
} else {
|
||||
const elasticinstance = instancelocated[0]._source.blocks || []
|
||||
if (Array.isArray(elasticinstance)) {
|
||||
if (json.length !== elasticinstance.length
|
||||
|| (instancelocated[0]._source.last && instancelocated[0]._source.last < new Date(Date.now() - 2678400000))
|
||||
|| !instancelocated[0]._source.api
|
||||
|| !instancelocated[0]._source.nodeinfo
|
||||
|| !instancelocated[0]._source.peers) {
|
||||
try {
|
||||
await client.update({
|
||||
index: constant.index,
|
||||
id: instancelocated[0]._id,
|
||||
doc: {
|
||||
api: api ? api : instancelocated[0]._source.api,
|
||||
nodeinfo: nodeinfo ? nodeinfo : instancelocated[0]._source.nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : elasticinstance,
|
||||
peers: peers && peers.length > 0 ? peers : instancelocated[0]._source.peers,
|
||||
last: new Date()
|
||||
},
|
||||
doc_as_upsert: true
|
||||
})
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return
|
||||
}
|
||||
app.locals.updated++
|
||||
if (instancelocated[0]._source.api && instancelocated[0]._source.api.uri && instancelocated[0]._source.api.contact_account && instancelocated[0]._source.api.contact_account.acct) {
|
||||
const difference = blocks.filter(block => block.domain && block.domain.trim().length > 0 && !elasticinstance.some(instance => block.domain === instance.domain))
|
||||
if (difference.length > 0 && difference.length < 50) {
|
||||
return await util.sendFederatedMessage(constant.nick, 'Detected #Fediblock by Fediblock Instance', `You blocked new instances: ${difference.map(d => d.domain).join(', ')} - https://${constant.apexdomain}#${instance}`, getAccount(instancelocated[0]._source.api))
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
return
|
||||
const json = await requestPart(`https://${instance}/api/v1/instance/domain_blocks`)
|
||||
if (Array.isArray(json) && json.length > 0) {
|
||||
const result = await client.search({
|
||||
index: constant.index,
|
||||
size: 1,
|
||||
query: {
|
||||
term: {
|
||||
instance: instance
|
||||
}
|
||||
}
|
||||
}),
|
||||
instancelocated = result.hits && result.hits.hits ? result.hits.hits : [],
|
||||
blocks = json.map(block => {
|
||||
if (block.comment && block.comment.length > 8190) {
|
||||
block.comment = block.comment.slice(0, 8190)
|
||||
}
|
||||
return block
|
||||
}),
|
||||
[api, nodeinfo, peers] = await Promise.all([
|
||||
requestPart(`https://${instance}/api/v1/instance`),
|
||||
requestPart(`https://${instance}/nodeinfo/2.0`),
|
||||
requestPart(`https://${instance}/api/v1/instance/peers`)
|
||||
])
|
||||
if (instancelocated.length === 0) {
|
||||
await client.index({
|
||||
index: constant.index,
|
||||
body: {
|
||||
instance,
|
||||
api,
|
||||
nodeinfo,
|
||||
blocks,
|
||||
peers,
|
||||
last: new Date()
|
||||
}
|
||||
})
|
||||
app.locals.created++
|
||||
return await util.sendFederatedMessage(constant.nick, 'New Fediblock Instance', `Fediblock Instance ${instance} with ${json.length} blocks - https://${constant.apexdomain}#${instance}`, getAccount(api))
|
||||
} else {
|
||||
return
|
||||
const elasticinstance = instancelocated[0]._source.blocks || []
|
||||
if (Array.isArray(elasticinstance)) {
|
||||
if (json.length !== elasticinstance.length
|
||||
|| (instancelocated[0]._source.last && instancelocated[0]._source.last < new Date(Date.now() - 2678400000))
|
||||
|| !instancelocated[0]._source.api
|
||||
|| !instancelocated[0]._source.nodeinfo
|
||||
|| !instancelocated[0]._source.peers) {
|
||||
await client.update({
|
||||
index: constant.index,
|
||||
id: instancelocated[0]._id,
|
||||
doc: {
|
||||
api: api ? api : instancelocated[0]._source.api,
|
||||
nodeinfo: nodeinfo ? nodeinfo : instancelocated[0]._source.nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : elasticinstance,
|
||||
peers: peers && peers.length > 0 ? peers : instancelocated[0]._source.peers,
|
||||
last: new Date()
|
||||
},
|
||||
doc_as_upsert: true
|
||||
})
|
||||
app.locals.updated++
|
||||
if (instancelocated[0]._source.api && instancelocated[0]._source.api.uri && instancelocated[0]._source.api.contact_account && instancelocated[0]._source.api.contact_account.acct) {
|
||||
const difference = blocks.filter(block => block.domain && block.domain.trim().length > 0 && !elasticinstance.some(instance => block.domain === instance.domain))
|
||||
if (difference.length > 0 && difference.length < 50) {
|
||||
return await util.sendFederatedMessage(constant.nick, 'Detected #Fediblock by Fediblock Instance', `You blocked new instances: ${difference.map(d => d.domain).join(', ')} - https://${constant.apexdomain}#${instance}`, getAccount(instancelocated[0]._source.api))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
throw e
|
||||
}
|
||||
},
|
||||
scanPart = async function* (instancesall, index) {
|
||||
@ -154,66 +125,55 @@ module.exports = async (client, apex, app) => {
|
||||
}
|
||||
},
|
||||
scanIndex = async (server, instancesall) => {
|
||||
try {
|
||||
const [api, nodeinfo, blocks] = await Promise.all([
|
||||
requestPart(`https://${server}/api/v1/instance`),
|
||||
requestPart(`https://${server}/nodeinfo/2.0`),
|
||||
requestPart(`https://${server}/api/v1/instance/domain_blocks`)
|
||||
])
|
||||
if (api && typeof api === 'object' && api.version) {
|
||||
const result = await client.search({
|
||||
index: constant.index,
|
||||
size: 1,
|
||||
query: {
|
||||
term: {
|
||||
instance: server
|
||||
}
|
||||
}
|
||||
}),
|
||||
instancelocated = result.hits && result.hits.hits ? result.hits.hits : []
|
||||
if (instancelocated.length === 0) {
|
||||
await client.index({
|
||||
index: constant.index,
|
||||
body: {
|
||||
instance: server,
|
||||
peers: instancesall,
|
||||
api,
|
||||
nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : [],
|
||||
last: new Date()
|
||||
}
|
||||
})
|
||||
app.locals.created++
|
||||
} else {
|
||||
const elasticinstance = instancelocated[0]._source.peers || []
|
||||
if (Array.isArray(elasticinstance) && Array.isArray(instancesall) && instancesall.length > 0) {
|
||||
if (instancesall.length !== elasticinstance.filter(i => !constant.filterdomains.some(d => i.endsWith(d))).length) {
|
||||
await client.update({
|
||||
index: constant.index,
|
||||
id: instancelocated[0]._id,
|
||||
doc: {
|
||||
peers: instancesall.length > 0 ? instancesall : elasticinstance,
|
||||
api: api ? api : instancelocated[0]._source.api,
|
||||
nodeinfo: nodeinfo ? nodeinfo : instancelocated[0]._source.nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : instancelocated[0]._source.blocks,
|
||||
last: new Date()
|
||||
},
|
||||
doc_as_upsert: true
|
||||
})
|
||||
app.locals.updated++
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
return
|
||||
const [api, nodeinfo, blocks] = await Promise.all([
|
||||
requestPart(`https://${server}/api/v1/instance`),
|
||||
requestPart(`https://${server}/nodeinfo/2.0`),
|
||||
requestPart(`https://${server}/api/v1/instance/domain_blocks`)
|
||||
])
|
||||
if (api && typeof api === 'object' && api.version) {
|
||||
const result = await client.search({
|
||||
index: constant.index,
|
||||
size: 1,
|
||||
query: {
|
||||
term: {
|
||||
instance: server
|
||||
}
|
||||
}
|
||||
}),
|
||||
instancelocated = result.hits && result.hits.hits ? result.hits.hits : []
|
||||
if (instancelocated.length === 0) {
|
||||
await client.index({
|
||||
index: constant.index,
|
||||
body: {
|
||||
instance: server,
|
||||
peers: instancesall,
|
||||
api,
|
||||
nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : [],
|
||||
last: new Date()
|
||||
}
|
||||
})
|
||||
app.locals.created++
|
||||
} else {
|
||||
return
|
||||
const elasticinstance = instancelocated[0]._source.peers || []
|
||||
if (Array.isArray(elasticinstance) && Array.isArray(instancesall) && instancesall.length > 0) {
|
||||
if (instancesall.length !== elasticinstance.filter(i => !constant.filterdomains.some(d => i.endsWith(d))).length) {
|
||||
await client.update({
|
||||
index: constant.index,
|
||||
id: instancelocated[0]._id,
|
||||
doc: {
|
||||
peers: instancesall.length > 0 ? instancesall : elasticinstance,
|
||||
api: api ? api : instancelocated[0]._source.api,
|
||||
nodeinfo: nodeinfo ? nodeinfo : instancelocated[0]._source.nodeinfo,
|
||||
blocks: blocks && blocks.length > 0 ? blocks : instancelocated[0]._source.blocks,
|
||||
last: new Date()
|
||||
},
|
||||
doc_as_upsert: true
|
||||
})
|
||||
app.locals.updated++
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return
|
||||
}
|
||||
},
|
||||
scanReturn = async () => {
|
||||
@ -242,7 +202,7 @@ module.exports = async (client, apex, app) => {
|
||||
if (!servers || servers.length === 0) {
|
||||
servers = instancesall.sort(() => Math.random() - 0.5)
|
||||
}
|
||||
if (server && server === constant.initialscan) {
|
||||
if (server === constant.initialscan) {
|
||||
return await scan(servers.shift())
|
||||
}
|
||||
app.locals.scannum = instancessorted.length
|
||||
@ -263,7 +223,7 @@ module.exports = async (client, apex, app) => {
|
||||
return await scanReturn()
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
// console.error(e)
|
||||
return await scanReturn()
|
||||
}
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user