114 lines
2.2 KiB
Lua
114 lines
2.2 KiB
Lua
local Config = require('opus.config')
|
|
local Util = require('opus.util')
|
|
|
|
local device = _G.device
|
|
local kernel = _G.kernel
|
|
local keyboard = device.keyboard
|
|
local multishell = _ENV.multishell
|
|
|
|
if not multishell then
|
|
return
|
|
end
|
|
|
|
local config = Config.load('secure', {
|
|
enabled = false,
|
|
timeout = 60,
|
|
})
|
|
|
|
local timer = config.enabled and os.startTimer(config.timeout)
|
|
|
|
local function buildLockScreen()
|
|
local Event = require('opus.event')
|
|
local Security = require('opus.security')
|
|
local SHA = require('opus.crypto.sha2')
|
|
local UI = require('opus.ui')
|
|
|
|
local counter = .1
|
|
|
|
local page = UI.Page {
|
|
pass = UI.TextEntry {
|
|
x = 10, ex = -10, y = "50%",
|
|
limit = 32,
|
|
mask = true,
|
|
shadowText = 'password',
|
|
accelerators = {
|
|
enter = 'password',
|
|
},
|
|
},
|
|
notification = UI.Notification(),
|
|
}
|
|
function page:eventHandler(event)
|
|
if event.type == 'password' then
|
|
|
|
if self.pass.value and
|
|
#self.pass.value > 0 and
|
|
Security.verifyPassword(SHA.compute(self.pass.value)) then
|
|
|
|
UI:quit() -- valid
|
|
else
|
|
self.notification:error('Invalid password', math.max(counter, 2))
|
|
self:sync()
|
|
os.sleep(counter)
|
|
counter = counter * 2
|
|
|
|
self.pass:reset()
|
|
end
|
|
else
|
|
UI.Page.eventHandler(self, event)
|
|
end
|
|
end
|
|
|
|
Event.onTerminate(function() return false end)
|
|
|
|
UI:setPage(page)
|
|
UI:start()
|
|
|
|
-- restart lock timer
|
|
timer = os.startTimer(config.timeout)
|
|
end
|
|
|
|
local function showLockScreen()
|
|
timer = nil
|
|
multishell.openTab(_ENV, {
|
|
path = 'sys/apps/Lock.lua',
|
|
fn = buildLockScreen,
|
|
noTerminate = true,
|
|
pinned = true,
|
|
focused = true,
|
|
title = 'Lock',
|
|
})
|
|
end
|
|
|
|
keyboard.addHotkey('control-l', function()
|
|
if timer then
|
|
os.cancelTimer(timer)
|
|
showLockScreen()
|
|
end
|
|
end)
|
|
|
|
kernel.hook({ 'mouse_up', 'mouse_drag', 'key_up', 'mouse_scroll' }, function()
|
|
if timer then
|
|
os.cancelTimer(timer)
|
|
timer = os.startTimer(config.timeout)
|
|
end
|
|
end)
|
|
|
|
kernel.hook('timer', function(_, eventData)
|
|
if timer and eventData[1] == timer then
|
|
showLockScreen()
|
|
end
|
|
end)
|
|
|
|
kernel.hook('config_update', function(_, eventData)
|
|
if eventData[1] == 'secure' then
|
|
Util.merge(config, eventData[2])
|
|
if timer then
|
|
os.cancelTimer(timer)
|
|
timer = nil
|
|
end
|
|
if config.enabled then
|
|
timer = os.startTimer(config.timeout)
|
|
end
|
|
end
|
|
end)
|