MWSE/Source/Services/Auth.js

252 lines
6.8 KiB
JavaScript

const { Client } = require("../Client.js");
let {addService, addListener} = require("../WebSocket.js");
addListener('disconnect',(global, xclient)=>{
const {intersection, pairs} = xclient.getSucureClients();
for (const [clientid, client] of intersection)
{
client.send([
{
id: clientid
},
"peer/disconnect"
])
}
for (const [id, peer] of pairs)
{
peer.pairs.delete(xclient.id);
xclient.pairs.delete(id);
}
});
addService(({
client,
message,
end,
next
})=>{
let {type,to,value,name} = message;
switch(type)
{
case "auth/pair-system":{
if(value == 'everybody')
{
client.requiredPair = true;
end({status:"success"});
client.sync('requiredPair');
}
if(value == 'disable')
{
client.requiredPair = false;
end({status:"success"});
client.sync('requiredPair');
//CLIENT_UPDATE_PROP(client.id, 'requiredPair', client.requiredPair);
}
break;
}
case "my/socketid":{
end(client.id);
break;
}
case 'auth/public':{
client.requiredPair = false;
client.sync('requiredPair');
return end({
value: 'success',
mode: 'public'
})
}
case 'auth/private':{
client.requiredPair = true;
client.sync('requiredPair');
return end({
value: 'success',
mode: 'private'
})
}
case 'request/pair':{
if(Client.clients.has(to)){
return end({
status: 'fail',
message: 'CLIENT-NOT-FOUND'
})
};
let pairclient = Client.clients.get(to);
if(pairclient.pairs.has(client.id))
{
return end({
status: 'success',
message: 'ALREADY-PAIRED'
})
}
if(client.pairs.has(to))
{
return end({
status: 'fail',
message: 'ALREADY-REQUESTED'
})
};
end({
status: 'success',
message: 'REQUESTED'
})
client.peerRequest(pairclient);
break;
}
case 'accept/pair':{
if(Client.clients.has(to)){
return end({
status: 'fail',
message: 'CLIENT-NOT-FOUND'
})
};
let pairclient = Client.clients.get(to);
if(pairclient.pairs.has(client.id))
{
return end({
status: 'success',
message: 'ALREADY-PAIRED'
})
}
if(!client.pairs.has(to))
{
return end({
status: 'fail',
message: 'NOT-REQUESTED-PAIR'
})
}
client.acceptPeerRequest(pairclient);
break;
}
case 'reject/pair':{
if(Client.clients.has(to)){
return end({
status: 'fail',
message: 'CLIENT-NOT-FOUND'
})
};
let pairclient = Client.clients.get(to);
if(pairclient.pairs.has(client.id))
{
return end({
status: 'success',
message: 'ALREADY-PAIRED'
})
}
if(!client.pairs.has(to))
{
return end({
status: 'fail',
message: 'NOT-REQUESTED-PAIR'
})
}
client.rejectPeerRequest(pairclient);
break;
}
case 'end/pair':{
if(Client.clients.has(to)){
return end({
status: 'fail',
message: 'CLIENT-NOT-FOUND'
})
};
let pairclient = Client.clients.get(to);
if(!pairclient.pairs.has(client.id))
{
return end({
status: 'success',
message: 'NOT-PAIRED'
})
}
client.rejectPeerRequest(pairclient);
break;
}
case 'pair/list':{
end({
type:'pair/list',
value: client.pairList()
})
break;
}
case 'is/reachable':{
if(Client.clients.has(to))
{
let otherPeer = Client.clients.get(to);
if(otherPeer.requiredPair && !otherPeer.pairs.has(to))
{
end(false);
}else{
end(true);
}
}else{
end(false);
}
break;
}
case 'auth/info':{
client.info.set(name, value);
let clients = client.getSucureClients();
for (const [,spair] of clients.pairs)
{
spair.send([{
from: client.id,
name,
value
},"pair/info"]);
};
for (const [,spair] of clients.roompairs)
{
spair.send([{
from: client.id,
name,
value
},"pair/info"]);
};
process.send({
type: 'AUTH/INFO',
uuid: client.id,
name,
value
});
return end({
status: 'success'
});
}
case 'peer/info':{
if(client.isSecure(message.peer))
{
let info = {};
let peer = Client.clients.get(message.peer);
peer.info.forEach((value, name) => info[name] = value);
return end({
status: "success",
info
});
}else{
return end({
status: "fail",
message: "unaccessible user"
});
}
}
default:{
next();
}
}
});
process.on('message',({type, uuid, value, name}) => {
switch(type)
{
case "AUTH/INFO":{
let client = Client.clients.get(uuid);
if(client)
{
client.info.set(name, value);
}
break;
}
}
})