Первый из макросов вызывает скрипт с настройками. Его ключи
CtrlAltShiftP
и
парольСнастройкой
можно изменять произвольно. С учётом того, что второй из них всё же целесообразно оставлять постоянным и виртуальным. Поскольку он предназначен для упрощения вызова макроса из F2 – Меню пользователя. Но это тоже на усмотрение пользователя.
А второй макрос помещает сгенерированный на базе последних настроек скрипта пароль сразу в буфер обмена. В скрипт внесены изменения, чтобы его настройки сохранялись между сессиями Фара. Ключи второго макроса
CtrlAltShiftВ
и
парольВбуфер
также можно изменять произвольно. С учётом тех же резонов, что и по первому макросу.
В Меню пользователя целесообразно поместить следующие строки:
Code: Select all
: создать пароль с настройкой его длины и состава символов
lua:eval("парольСнастройкой",2) --см. https://forum.farmanager.com/viewtopic.php?p=165159#p165159
: пароль, ранее заданных параметров, поместить в буфер обмена
lua:eval("парольВбуфер",2) -- = -- тоже
Code: Select all
local F = far.Flags
local function Fill(From, To)
local res = ''
for i=utf8.byte(From), utf8.byte(To) do
res = res .. utf8.char(i)
end
return res
end -- Fill
local function cInc(c,i)
return utf8.char(utf8.byte(c) + i)
end
local alp ={Fill(cInc(' ',1), cInc('0',-1) ), -- Cpc -- 1
Fill('A','Z'); -- 2
Fill( 'a', 'z' ); -- 3
Fill( 'А', 'Я' ); -- 4
Fill( 'а', 'я' ); -- 5
Fill( '0', '9' ); -- 6
}
local function PassGener(aPar)
local len, Spc, Num, Cyr, CaseSens, FirstAlpha = aPar.len, aPar.Spc, aPar.Num, aPar.Cyr, aPar.CaseSens, aPar.FirstAlpha
local set = alp[2]
if CaseSens then set = set .. alp[3] end
if Cyr then
set = set .. alp[4]
if CaseSens then set = set .. alp[5] end
end
if Spc then set = set .. alp[1] end
if Num then set = set .. alp[6] end
local n,res, i = set:len(),''
math.randomseed(Far.UpTime)
if FirstAlpha then
i = math.random(alp[2]:len())
res = alp[2]:sub(i,i)
end
while res:len() < len do
i = math.random(n)
res = res .. set:sub(i,i)
end
return res
end -- PassGener
local aDlg = mf.mload('PASS', 'PassGenerate') or -- вставку "mf.mload('PASS', 'PassGenerate') or" подсказал buniak_a_h (чтобы настройки запоминались межуд сессиями Фара)
{
{"DI_DOUBLEBOX"; 3; 0; 64; 8; 0; 0; 0; 0; "Генерация пароля"};
{"DI_TEXT"; 15; 2; 0; 0; 0; 0; 0; 0; "Длина"};
{"DI_EDIT"; 22; 2; 25; 0; 0,[10]='20'};
{"DI_CHECKBOX"; 5; 4; 0; 0; 1; 0; 0; F.DIF_DISABLE; "Латиница"};
{"DI_CHECKBOX"; 27; 4; 0; 0; 0; 0; 0; 0; "Кириллица"};
{"DI_CHECKBOX"; 45; 4; 0; 0; 0; 0; 0; 0; "Цифры"};
{"DI_CHECKBOX"; 5; 5; 0; 0; 0; 0; 0; 0; "Регистрозависимый"};
{"DI_CHECKBOX"; 27; 5; 0; 0; 0; 0; 0; 0; "Спец.символы"};
{"DI_CHECKBOX"; 45; 5; 0; 0; 0; 0; 0; 0; "Первый - буква"};
{"DI_TEXT"; 0; 6; 0; 0; 0; 0; 0; F.DIF_SEPARATOR};
{"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; bor(F.DIF_CENTERGROUP, F.DIF_DEFAULTBUTTON); "Ok"};
{"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; F.DIF_CENTERGROUP; "Cancel"}
}
local function aParol() -- подсказал buniak_a_h, а сначала ошибочно было так: local action = function(aParol), а потом (уже более-менее норм) local aParol = function(aParol)
while far.Dialog(win.Uuid'A9D9BD9D-F0C6-4CFD-911B-268BDE54A4BD',-1,-1,68,9,nil,aDlg) == #aDlg-1 do
mf.msave('PASS', 'PassGenerate', aDlg) --подсказал buniak_a_h (чтобы настройки запоминались межуд сессиями Фара)
local aPars =
{len=tonumber(aDlg[3][10]) or 6;
CaseSens= aDlg[7][6] == 1;
Spc = aDlg[8][6] == 1;
Num = aDlg[6][6] == 1;
Cyr = aDlg[5][6] == 1;
FirstAlpha = aDlg[9][6] == 1;
}
local Pass = PassGener(aPars)
local aButt = {'Повторить';'В буфер';'Выйти'}
if Area.Dialog and Dlg.ItemType == 4 or Dlg.ItemType == 5 then
table.insert(aButt, 3, 'В поле ввода')
end
local iChoice = far.Message('Сгенерирован пароль:\n'..Pass, 'PassGenerate', table.concat(aButt, ';'))
if iChoice == -1 or iChoice == #aButt then break end
if iChoice == 2 then
far.CopyToClipboard(Pass)
elseif iChoice == 3 then
local hDlg = far.AdvControl(F.ACTL_GETWINDOWINFO).Id
hDlg:send(F.DM_SETTEXT, Dlg.CurPos, Pass)
end
if iChoice ~= 1 then break end
end;
end;
MenuItem {
description = 'Генерация пароля';
menu = 'Plugins';
area = 'Shell Dialog';
guid = '71A5BEB9-5150-4316-B580-AA1F1A748D9E';
text = 'BAX - Сгенерировать пароль';
action = function()
aParol() -- сначала ошибочно было так: action(aParol)
end;
}
Macro {
area = 'Shell Dialog';
guid = '515CAD01-FD7A-45BE-82E4-51F77CAFFE33';
key="CtrlAltShiftP парольСнастройкой";
description="создать пароль с настройкой его длины и состава символов";
action = function()
aParol() -- сначала ошибочно было так: action(aParol)
end;
}
Macro { area="Shell"; key="CtrlAltShiftB парольВбуфер";
description="пароль, ранее заданных параметров, поместить в буфер обмена"; --'насадка' на PassGenerate (Ann)
action = function()
local aPars =
{len=tonumber(aDlg[3][10]) or 6;
CaseSens= aDlg[7][6] == 1;
Spc = aDlg[8][6] == 1;
Num = aDlg[6][6] == 1;
Cyr = aDlg[5][6] == 1;
FirstAlpha = aDlg[9][6] == 1;
}
local Pass = PassGener(aPars)
far.CopyToClipboard(Pass)
end;
}
--[=[
макросы основаны на скрипте (автор buniak_a_h), опубликованном здесь:
https://forum.farmanager.com/viewtopic.php?p=165131#p165131
]=]--