|
|
|
|
@@ -47,14 +47,14 @@ switch(mods){
|
|
|
|
|
case 0: //no modifier
|
|
|
|
|
break;
|
|
|
|
|
case 1: //Shift
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,5);
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2);
|
|
|
|
|
break;
|
|
|
|
|
case 2: //AltGr
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,5);
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2);
|
|
|
|
|
break;
|
|
|
|
|
case 3: //Shift+AltGr
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,5);
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,5);
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2);
|
|
|
|
|
XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -79,46 +79,102 @@ if(c==1){
|
|
|
|
|
else
|
|
|
|
|
str="{USERNAME}{TAB}{PASSWORD}{ENTER}";
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
KeePass/Win template compatibility:
|
|
|
|
|
only supported syntax is:{TEMPLATE-NAME}
|
|
|
|
|
%TEMPLATE-NAME% syntax is not supported!
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
str.replace("{TITLE}",entry->Title,Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{USERNAME}",entry->UserName,Qt::CaseInsensitive);
|
|
|
|
|
entry->Password.unlock();
|
|
|
|
|
str.replace("{PASSWORD}",entry->Password.string(),Qt::CaseInsensitive);
|
|
|
|
|
entry->Password.lock();
|
|
|
|
|
str.replace("{URL}",entry->URL,Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{SPACE}",QString(" "),Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{ADD}",QString("+"),Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{SUBTRACT}",QString("-"),Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{DIVIDE}",QString("/"),Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{MULTIPLY}",QString("*"),Qt::CaseInsensitive);
|
|
|
|
|
str.replace("{PLUS}",QString("+"),Qt::CaseInsensitive);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QList<Q_UINT16> Keys;
|
|
|
|
|
for(int i=0;i<str.length();i++){
|
|
|
|
|
Keys << getKeysym(str.at(i));
|
|
|
|
|
for(int i=0;i<str.size();i++){
|
|
|
|
|
if(str[i]=='{'){
|
|
|
|
|
int start=i;
|
|
|
|
|
QString tmpl;
|
|
|
|
|
i++;
|
|
|
|
|
while(str[i]!='}' && i<str.size()){
|
|
|
|
|
tmpl += str[i];
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
if(i>=str.size()){
|
|
|
|
|
err=tr("Syntax Error in Auto-Type sequence near character %1\n\
|
|
|
|
|
Found '{' without closing '}'").arg(i+10);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
templateToKeysyms(tmpl.lower(),Keys,entry);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
Keys << getKeysym(str[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MainWin->hide();
|
|
|
|
|
Display* pDisplay = XOpenDisplay( NULL );
|
|
|
|
|
for(int i=0;i<Keys.size();i++){
|
|
|
|
|
int keycode=XKeysymToKeycode(pDisplay,Keys[i]);
|
|
|
|
|
int mods=getModifiers(pDisplay,Keys[i],keycode);
|
|
|
|
|
pressModifiers(pDisplay,mods);
|
|
|
|
|
XTestFakeKeyEvent(pDisplay,keycode,True,5);
|
|
|
|
|
XTestFakeKeyEvent(pDisplay,keycode,False,5);
|
|
|
|
|
XTestFakeKeyEvent(pDisplay,keycode,True,0);
|
|
|
|
|
XTestFakeKeyEvent(pDisplay,keycode,False,1);
|
|
|
|
|
releaseModifiers(pDisplay,mods);
|
|
|
|
|
}
|
|
|
|
|
XCloseDisplay(pDisplay);
|
|
|
|
|
MainWin->show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AutoType::templateToKeysyms(const QString& tmpl, QList<quint16>& keys,CEntry* entry){
|
|
|
|
|
//tmpl must be lower case!!!
|
|
|
|
|
if(!tmpl.compare("title")){
|
|
|
|
|
stringToKeysyms(entry->Title,keys);
|
|
|
|
|
return;}
|
|
|
|
|
if(!tmpl.compare("username")){
|
|
|
|
|
stringToKeysyms(entry->UserName,keys);
|
|
|
|
|
return;}
|
|
|
|
|
if(!tmpl.compare("url")){
|
|
|
|
|
stringToKeysyms(entry->URL,keys);
|
|
|
|
|
return;}
|
|
|
|
|
if(!tmpl.compare("password")){
|
|
|
|
|
entry->Password.unlock();
|
|
|
|
|
stringToKeysyms(entry->Password.string(),keys);
|
|
|
|
|
entry->Password.lock();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(!tmpl.compare("space")){
|
|
|
|
|
keys << getKeysym(' ');
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){
|
|
|
|
|
keys << XK_BackSpace;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("break")){
|
|
|
|
|
keys << XK_Break;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("capslock")){
|
|
|
|
|
keys << XK_Caps_Lock;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("del") || !tmpl.compare("delete")){
|
|
|
|
|
keys << XK_Delete;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("end")){
|
|
|
|
|
keys << XK_End;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("enter")){
|
|
|
|
|
keys << XK_Return;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("esc")){
|
|
|
|
|
keys << XK_Escape;
|
|
|
|
|
return;}
|
|
|
|
|
|
|
|
|
|
if(!tmpl.compare("help")){
|
|
|
|
|
keys << XK_Help;
|
|
|
|
|
return;}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AutoType::stringToKeysyms(const QString& string,QList<quint16>& KeySymList){
|
|
|
|
|
for(int i=0; i<string.length();i++)
|
|
|
|
|
KeySymList << getKeysym(string[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|