mirror of
https://github.com/kepler155c/opus
synced 2025-01-01 03:10:28 +00:00
network group wip + virtual dirs + better trust
This commit is contained in:
parent
9413785248
commit
70733ab4f2
@ -1,20 +1,18 @@
|
|||||||
local Config = require('config')
|
local Config = require('config')
|
||||||
|
|
||||||
local config = { }
|
|
||||||
|
|
||||||
local Security = { }
|
local Security = { }
|
||||||
|
|
||||||
function Security.verifyPassword(password)
|
function Security.verifyPassword(password)
|
||||||
Config.load('os', config)
|
local current = Security.getPassword()
|
||||||
return config.password and password == config.password
|
return current and password == current
|
||||||
end
|
end
|
||||||
|
|
||||||
function Security.hasPassword()
|
function Security.hasPassword()
|
||||||
return not not config.password
|
return not not Security.getPassword()
|
||||||
end
|
end
|
||||||
|
|
||||||
function Security.getSecretKey()
|
function Security.getSecretKey()
|
||||||
Config.load('os', config)
|
local config = Config.load('os')
|
||||||
if not config.secretKey then
|
if not config.secretKey then
|
||||||
config.secretKey = math.random(100000, 999999)
|
config.secretKey = math.random(100000, 999999)
|
||||||
Config.update('os', config)
|
Config.update('os', config)
|
||||||
@ -23,7 +21,6 @@ function Security.getSecretKey()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Security.getPublicKey()
|
function Security.getPublicKey()
|
||||||
|
|
||||||
local exchange = {
|
local exchange = {
|
||||||
base = 11,
|
base = 11,
|
||||||
primeMod = 625210769
|
primeMod = 625210769
|
||||||
@ -47,14 +44,13 @@ function Security.getPublicKey()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Security.updatePassword(password)
|
function Security.updatePassword(password)
|
||||||
Config.load('os', config)
|
local config = Config.load('os')
|
||||||
config.password = password
|
config.password = password
|
||||||
Config.update('os', config)
|
Config.update('os', config)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Security.getPassword()
|
function Security.getPassword()
|
||||||
Config.load('os', config)
|
return Config.load('os').password
|
||||||
return config.password
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return Security
|
return Security
|
||||||
|
@ -105,7 +105,7 @@ end
|
|||||||
|
|
||||||
function Socket.connect(host, port)
|
function Socket.connect(host, port)
|
||||||
if not device.wireless_modem then
|
if not device.wireless_modem then
|
||||||
return false, 'Wireless modem not found'
|
return false, 'Wireless modem not found', 'NOMODEM'
|
||||||
end
|
end
|
||||||
|
|
||||||
local socket = newSocket(host == os.getComputerID())
|
local socket = newSocket(host == os.getComputerID())
|
||||||
@ -138,15 +138,19 @@ function Socket.connect(host, port)
|
|||||||
_G.transport.open(socket)
|
_G.transport.open(socket)
|
||||||
return socket
|
return socket
|
||||||
|
|
||||||
|
elseif msg.type == 'NOPASS' then
|
||||||
|
socket:close()
|
||||||
|
return false, 'Password not set on target', 'NOPASS'
|
||||||
|
|
||||||
elseif msg.type == 'REJE' then
|
elseif msg.type == 'REJE' then
|
||||||
socket:close()
|
socket:close()
|
||||||
return false, 'Password not set on target or not trusted'
|
return false, 'Trust not established', 'NOTRUST'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
until e == 'timer' and id == timerId
|
until e == 'timer' and id == timerId
|
||||||
|
|
||||||
socket:close()
|
socket:close()
|
||||||
return false, 'Connection timed out'
|
return false, 'Connection timed out', 'TIMEOUT'
|
||||||
end
|
end
|
||||||
|
|
||||||
local function trusted(msg, port)
|
local function trusted(msg, port)
|
||||||
@ -190,7 +194,15 @@ function Socket.server(port)
|
|||||||
socket.wseq = msg.wseq
|
socket.wseq = msg.wseq
|
||||||
socket.rseq = msg.rseq
|
socket.rseq = msg.rseq
|
||||||
|
|
||||||
if trusted(msg, port) then
|
if not Security.hasPassword() then
|
||||||
|
socket.transmit(socket.dport, socket.sport, {
|
||||||
|
type = 'NOPASS',
|
||||||
|
dhost = socket.dhost,
|
||||||
|
shost = socket.shost,
|
||||||
|
})
|
||||||
|
socket:close()
|
||||||
|
|
||||||
|
elseif trusted(msg, port) then
|
||||||
socket.connected = true
|
socket.connected = true
|
||||||
socket.transmit(socket.dport, socket.sport, {
|
socket.transmit(socket.dport, socket.sport, {
|
||||||
type = 'CONN',
|
type = 'CONN',
|
||||||
@ -201,14 +213,15 @@ function Socket.server(port)
|
|||||||
|
|
||||||
_G.transport.open(socket)
|
_G.transport.open(socket)
|
||||||
return socket
|
return socket
|
||||||
end
|
|
||||||
|
|
||||||
socket.transmit(socket.dport, socket.sport, {
|
else
|
||||||
type = 'REJE',
|
socket.transmit(socket.dport, socket.sport, {
|
||||||
dhost = socket.dhost,
|
type = 'REJE',
|
||||||
shost = socket.shost,
|
dhost = socket.dhost,
|
||||||
})
|
shost = socket.shost,
|
||||||
socket:close()
|
})
|
||||||
|
socket:close()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
local Ansi = require('ansi')
|
local Ansi = require('ansi')
|
||||||
|
local Config = require('config')
|
||||||
local Security = require('security')
|
local Security = require('security')
|
||||||
local SHA1 = require('sha1')
|
local SHA1 = require('sha1')
|
||||||
local UI = require('ui')
|
local UI = require('ui')
|
||||||
@ -53,7 +54,7 @@ local page = UI.Page {
|
|||||||
},
|
},
|
||||||
password = UI.WizardPage {
|
password = UI.WizardPage {
|
||||||
index = 3,
|
index = 3,
|
||||||
labelText = UI.Text {
|
passwordLabel = UI.Text {
|
||||||
x = 3, y = 2,
|
x = 3, y = 2,
|
||||||
value = 'Password'
|
value = 'Password'
|
||||||
},
|
},
|
||||||
@ -62,14 +63,22 @@ local page = UI.Page {
|
|||||||
limit = 32,
|
limit = 32,
|
||||||
mask = true,
|
mask = true,
|
||||||
shadowText = 'password',
|
shadowText = 'password',
|
||||||
accelerators = {
|
|
||||||
enter = 'new_password',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
--[[
|
||||||
|
groupLabel = UI.Text {
|
||||||
|
x = 3, y = 3,
|
||||||
|
value = 'Group'
|
||||||
|
},
|
||||||
|
group = UI.TextEntry {
|
||||||
|
x = 12, ex = -3, y = 3,
|
||||||
|
limit = 32,
|
||||||
|
shadowText = 'network group',
|
||||||
|
},
|
||||||
|
]]
|
||||||
intro = UI.TextArea {
|
intro = UI.TextArea {
|
||||||
textColor = colors.yellow,
|
textColor = colors.yellow,
|
||||||
inactive = true,
|
inactive = true,
|
||||||
x = 3, ex = -3, y = 4, ey = -3,
|
x = 3, ex = -3, y = 5, ey = -3,
|
||||||
value = string.format(passwordIntro, Ansi.white),
|
value = string.format(passwordIntro, Ansi.white),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -101,6 +110,11 @@ function page.wizard.pages.password:validate()
|
|||||||
if #self.newPass.value > 0 then
|
if #self.newPass.value > 0 then
|
||||||
Security.updatePassword(SHA1.sha1(self.newPass.value))
|
Security.updatePassword(SHA1.sha1(self.newPass.value))
|
||||||
end
|
end
|
||||||
|
if #self.group.value > 0 then
|
||||||
|
local config = Config.load('os')
|
||||||
|
config.group = self.group.value
|
||||||
|
Config.update('os', config)
|
||||||
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -141,6 +141,7 @@ local function sendInfo()
|
|||||||
infoTimer = os.clock()
|
infoTimer = os.clock()
|
||||||
info.label = os.getComputerLabel()
|
info.label = os.getComputerLabel()
|
||||||
info.uptime = math.floor(os.clock())
|
info.uptime = math.floor(os.clock())
|
||||||
|
info.group = network.getGroup()
|
||||||
if turtle then
|
if turtle then
|
||||||
info.fuel = turtle.getFuelLevel()
|
info.fuel = turtle.getFuelLevel()
|
||||||
info.status = turtle.getStatus()
|
info.status = turtle.getStatus()
|
||||||
|
@ -24,10 +24,21 @@ if multishell then
|
|||||||
multishell.setTitle(multishell.getCurrent(), 'Telnet ' .. remoteId)
|
multishell.setTitle(multishell.getCurrent(), 'Telnet ' .. remoteId)
|
||||||
end
|
end
|
||||||
|
|
||||||
local socket, msg = Socket.connect(remoteId, 23)
|
local socket, msg, reason
|
||||||
|
|
||||||
if not socket then
|
while true do
|
||||||
error(msg)
|
socket, msg, reason = Socket.connect(remoteId, 23)
|
||||||
|
|
||||||
|
if socket then
|
||||||
|
break
|
||||||
|
elseif reason ~= 'NOTRUST' then
|
||||||
|
error(msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
local s, m = shell.run('trust ' .. remoteId)
|
||||||
|
if not s then
|
||||||
|
error(m)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local ct = Util.shallowCopy(term.current())
|
local ct = Util.shallowCopy(term.current())
|
||||||
|
@ -6,6 +6,7 @@ local Util = require('util')
|
|||||||
local colors = _G.colors
|
local colors = _G.colors
|
||||||
local multishell = _ENV.multishell
|
local multishell = _ENV.multishell
|
||||||
local os = _G.os
|
local os = _G.os
|
||||||
|
local shell = _ENV.shell
|
||||||
local term = _G.term
|
local term = _G.term
|
||||||
|
|
||||||
local remoteId
|
local remoteId
|
||||||
@ -26,7 +27,15 @@ if multishell then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function connect()
|
local function connect()
|
||||||
local socket, msg = Socket.connect(remoteId, 5900)
|
local socket, msg, reason = Socket.connect(remoteId, 5900)
|
||||||
|
|
||||||
|
if reason == 'NOTRUST' then
|
||||||
|
local s, m = shell.run('trust ' .. remoteId)
|
||||||
|
if not s then
|
||||||
|
return s, m
|
||||||
|
end
|
||||||
|
socket, msg = Socket.connect(remoteId, 5900)
|
||||||
|
end
|
||||||
|
|
||||||
if not socket then
|
if not socket then
|
||||||
return false, msg
|
return false, msg
|
||||||
|
@ -5,6 +5,8 @@ end
|
|||||||
_G.requireInjector(_ENV)
|
_G.requireInjector(_ENV)
|
||||||
local Util = require('util')
|
local Util = require('util')
|
||||||
|
|
||||||
|
-- TODO: support getDrive for virtual nodes
|
||||||
|
|
||||||
local fs = _G.fs
|
local fs = _G.fs
|
||||||
|
|
||||||
fs.native = Util.shallowCopy(fs)
|
fs.native = Util.shallowCopy(fs)
|
||||||
@ -88,6 +90,13 @@ function nativefs.exists(node, dir)
|
|||||||
return fs.native.exists(dir)
|
return fs.native.exists(dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function nativefs.getDrive(node, dir)
|
||||||
|
if node.mountPoint == dir then
|
||||||
|
return fs.native.getDrive(dir) or 'virt'
|
||||||
|
end
|
||||||
|
return fs.native.getDrive(dir)
|
||||||
|
end
|
||||||
|
|
||||||
function nativefs.delete(node, dir)
|
function nativefs.delete(node, dir)
|
||||||
if node.mountPoint == dir then
|
if node.mountPoint == dir then
|
||||||
fs.unmount(dir)
|
fs.unmount(dir)
|
||||||
|
@ -6,7 +6,15 @@ local device = _G.device
|
|||||||
local kernel = _G.kernel
|
local kernel = _G.kernel
|
||||||
local os = _G.os
|
local os = _G.os
|
||||||
|
|
||||||
_G.network = { }
|
do
|
||||||
|
local config = Config.load('os')
|
||||||
|
_G.network = setmetatable({ }, { __index = {
|
||||||
|
getGroup = function() return config.group end,
|
||||||
|
setGroup = function(name)
|
||||||
|
config.group = name
|
||||||
|
end
|
||||||
|
}})
|
||||||
|
end
|
||||||
|
|
||||||
local function startNetwork()
|
local function startNetwork()
|
||||||
kernel.run({
|
kernel.run({
|
||||||
|
Loading…
Reference in New Issue
Block a user