1 /* 2 KeePass Password Safe - The Open-Source Password Manager 3 Copyright (C) 2003-2021 Dominik Reichl <dominik.reichl@t-online.de> 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 using System; 21 using System.Collections.Generic; 22 using System.ComponentModel; 23 using System.Diagnostics; 24 using System.Text; 25 using System.Windows.Forms; 26 using System.Xml.Serialization; 27 28 using KeePassLib; 29 using KeePassLib.Interfaces; 30 using KeePassLib.Utility; 31 32 namespace KeePass.App.Configuration 33 { 34 public sealed class AceIntegration 35 { 36 private long m_hkAutoType = (long)(Keys.Control | Keys.Alt | Keys.A); 37 [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.A))] 38 public long HotKeyGlobalAutoType 39 { 40 get { return m_hkAutoType; } 41 set { m_hkAutoType = value; } 42 } 43 44 private long m_hkAutoTypePw = (long)(Keys.Control | Keys.Alt | Keys.Shift | Keys.A); 45 [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.Shift | Keys.A))] 46 public long HotKeyGlobalAutoTypePassword 47 { 48 get { return m_hkAutoTypePw; } 49 set { m_hkAutoTypePw = value; } 50 } 51 52 private long m_hkAutoTypeSel = (long)Keys.None; 53 [DefaultValue((long)Keys.None)] 54 public long HotKeySelectedAutoType 55 { 56 get { return m_hkAutoTypeSel; } 57 set { m_hkAutoTypeSel = value; } 58 } 59 60 private long m_hkShowWindow = (long)(Keys.Control | Keys.Alt | Keys.K); 61 [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.K))] 62 public long HotKeyShowWindow 63 { 64 get { return m_hkShowWindow; } 65 set { m_hkShowWindow = value; } 66 } 67 68 private long m_hkEntryMenu = (long)Keys.None; 69 [DefaultValue((long)Keys.None)] 70 public long HotKeyEntryMenu 71 { 72 get { return m_hkEntryMenu; } 73 set { m_hkEntryMenu = value; } 74 } 75 76 private bool m_bCheckHotKeys = true; 77 [DefaultValue(true)] 78 public bool CheckHotKeys 79 { 80 get { return m_bCheckHotKeys; } 81 set { m_bCheckHotKeys = value; } 82 } 83 84 private string m_strUrlOverride = string.Empty; 85 [DefaultValue("")] 86 public string UrlOverride 87 { 88 get { return m_strUrlOverride; } 89 set 90 { 91 if(value == null) throw new ArgumentNullException("value"); 92 m_strUrlOverride = value; 93 } 94 } 95 96 private AceUrlSchemeOverrides m_vSchemeOverrides = new AceUrlSchemeOverrides(); 97 public AceUrlSchemeOverrides UrlSchemeOverrides 98 { 99 get { return m_vSchemeOverrides; } 100 set 101 { 102 if(value == null) throw new ArgumentNullException("value"); 103 m_vSchemeOverrides = value; 104 } 105 } 106 107 private bool m_bSearchKeyFiles = true; 108 [DefaultValue(true)] 109 public bool SearchKeyFiles 110 { 111 get { return m_bSearchKeyFiles; } 112 set { m_bSearchKeyFiles = value; } 113 } 114 115 private bool m_bSearchKeyFilesOnRemovable = false; 116 [DefaultValue(false)] 117 public bool SearchKeyFilesOnRemovableMedia 118 { 119 get { return m_bSearchKeyFilesOnRemovable; } 120 set { m_bSearchKeyFilesOnRemovable = value; } 121 } 122 123 private bool m_bSingleInstance = true; 124 [DefaultValue(true)] 125 public bool LimitToSingleInstance 126 { 127 get { return m_bSingleInstance; } 128 set { m_bSingleInstance = value; } 129 } 130 131 private bool m_bMatchByTitle = true; 132 [DefaultValue(true)] 133 public bool AutoTypeMatchByTitle 134 { 135 get { return m_bMatchByTitle; } 136 set { m_bMatchByTitle = value; } 137 } 138 139 private bool m_bMatchByUrlInTitle = false; 140 [DefaultValue(false)] 141 public bool AutoTypeMatchByUrlInTitle 142 { 143 get { return m_bMatchByUrlInTitle; } 144 set { m_bMatchByUrlInTitle = value; } 145 } 146 147 private bool m_bMatchByUrlHostInTitle = false; 148 [DefaultValue(false)] 149 public bool AutoTypeMatchByUrlHostInTitle 150 { 151 get { return m_bMatchByUrlHostInTitle; } 152 set { m_bMatchByUrlHostInTitle = value; } 153 } 154 155 private bool m_bMatchByTagInTitle = false; 156 [DefaultValue(false)] 157 public bool AutoTypeMatchByTagInTitle 158 { 159 get { return m_bMatchByTagInTitle; } 160 set { m_bMatchByTagInTitle = value; } 161 } 162 163 private bool m_bMatchNormDashes = true; 164 [DefaultValue(true)] 165 public bool AutoTypeMatchNormDashes 166 { 167 get { return m_bMatchNormDashes; } 168 set { m_bMatchNormDashes = value; } 169 } 170 171 private bool m_bExpiredCanMatch = false; 172 [DefaultValue(false)] 173 public bool AutoTypeExpiredCanMatch 174 { 175 get { return m_bExpiredCanMatch; } 176 set { m_bExpiredCanMatch = value; } 177 } 178 179 private bool m_bAutoTypeAlwaysShowSelDlg = false; 180 [DefaultValue(false)] 181 public bool AutoTypeAlwaysShowSelDialog 182 { 183 get { return m_bAutoTypeAlwaysShowSelDlg; } 184 set { m_bAutoTypeAlwaysShowSelDlg = value; } 185 } 186 187 private bool m_bPrependInitSeqIE = true; 188 [DefaultValue(true)] 189 public bool AutoTypePrependInitSequenceForIE 190 { 191 get { return m_bPrependInitSeqIE; } 192 set { m_bPrependInitSeqIE = value; } 193 } 194 195 private bool m_bSpecialReleaseAlt = true; 196 [DefaultValue(true)] 197 public bool AutoTypeReleaseAltWithKeyPress 198 { 199 get { return m_bSpecialReleaseAlt; } 200 set { m_bSpecialReleaseAlt = value; } 201 } 202 203 private bool m_bAdjustKeybLayout = true; 204 [DefaultValue(true)] 205 public bool AutoTypeAdjustKeyboardLayout 206 { 207 get { return m_bAdjustKeybLayout; } 208 set { m_bAdjustKeybLayout = value; } 209 } 210 211 private bool m_bAllowInterleaved = false; 212 [DefaultValue(false)] 213 public bool AutoTypeAllowInterleaved 214 { 215 get { return m_bAllowInterleaved; } 216 set { m_bAllowInterleaved = value; } 217 } 218 219 private bool m_bCancelOnWindowChange = false; 220 [DefaultValue(false)] 221 public bool AutoTypeCancelOnWindowChange 222 { 223 get { return m_bCancelOnWindowChange; } 224 set { m_bCancelOnWindowChange = value; } 225 } 226 227 private bool m_bCancelOnTitleChange = false; 228 [DefaultValue(false)] 229 public bool AutoTypeCancelOnTitleChange 230 { 231 get { return m_bCancelOnTitleChange; } 232 set { m_bCancelOnTitleChange = value; } 233 } 234 235 private int m_iInterKeyDelay = -1; 236 [DefaultValue(-1)] 237 public int AutoTypeInterKeyDelay 238 { 239 get { return m_iInterKeyDelay; } 240 set { m_iInterKeyDelay = value; } 241 } 242 243 private List<string> m_lAbortWindows = new List<string>(); 244 [XmlArrayItem("Window")] 245 public List<string> AutoTypeAbortOnWindows 246 { 247 get { return m_lAbortWindows; } 248 set 249 { 250 if(value == null) throw new ArgumentNullException("value"); 251 m_lAbortWindows = value; 252 } 253 } 254 255 private ProxyServerType m_pstProxyType = ProxyServerType.System; 256 [DefaultValue(ProxyServerType.System)] 257 public ProxyServerType ProxyType 258 { 259 get { return m_pstProxyType; } 260 set { m_pstProxyType = value; } 261 } 262 263 private string m_strProxyAddr = string.Empty; 264 [DefaultValue("")] 265 public string ProxyAddress 266 { 267 get { return m_strProxyAddr; } 268 set 269 { 270 if(value == null) throw new ArgumentNullException("value"); 271 m_strProxyAddr = value; 272 } 273 } 274 275 private string m_strProxyPort = string.Empty; 276 [DefaultValue("")] 277 public string ProxyPort 278 { 279 get { return m_strProxyPort; } 280 set 281 { 282 if(value == null) throw new ArgumentNullException("value"); 283 m_strProxyPort = value; 284 } 285 } 286 287 private ProxyAuthType m_pstProxyAuthType = ProxyAuthType.Auto; 288 [DefaultValue(ProxyAuthType.Auto)] 289 public ProxyAuthType ProxyAuthType 290 { 291 get { return m_pstProxyAuthType; } 292 set { m_pstProxyAuthType = value; } 293 } 294 295 private string m_strProxyUser = string.Empty; 296 [DefaultValue("")] 297 public string ProxyUserName 298 { 299 get { return m_strProxyUser; } 300 set 301 { 302 if(value == null) throw new ArgumentNullException("value"); 303 m_strProxyUser = value; 304 } 305 } 306 307 private string m_strProxyPassword = string.Empty; 308 [DefaultValue("")] 309 public string ProxyPassword 310 { 311 get { return m_strProxyPassword; } 312 set 313 { 314 if(value == null) throw new ArgumentNullException("value"); 315 m_strProxyPassword = value; 316 } 317 } 318 AceIntegration()319 public AceIntegration() 320 { 321 } 322 } 323 324 public sealed class AceUrlSchemeOverrides : IDeepCloneable<AceUrlSchemeOverrides> 325 { 326 private List<AceUrlSchemeOverride> m_lBuiltInOverrides = 327 new List<AceUrlSchemeOverride>(); 328 [XmlIgnore] 329 public List<AceUrlSchemeOverride> BuiltInOverrides 330 { 331 get { return m_lBuiltInOverrides; } 332 set 333 { 334 if(value == null) throw new ArgumentNullException("value"); 335 m_lBuiltInOverrides = value; 336 } 337 } 338 339 public ulong BuiltInOverridesEnabled 340 { 341 get { return GetEnabledBuiltInOverrides(); } 342 set { SetEnabledBuiltInOverrides(value); } 343 } 344 345 private List<AceUrlSchemeOverride> m_lCustomOverrides = 346 new List<AceUrlSchemeOverride>(); 347 [XmlArrayItem("Override")] 348 public List<AceUrlSchemeOverride> CustomOverrides 349 { 350 get { return m_lCustomOverrides; } 351 set 352 { 353 if(value == null) throw new ArgumentNullException("value"); 354 m_lCustomOverrides = value; 355 } 356 } 357 AceUrlSchemeOverrides()358 public AceUrlSchemeOverrides() 359 { 360 MakeBuiltInList(); 361 } 362 MakeBuiltInList()363 private void MakeBuiltInList() 364 { 365 m_lBuiltInOverrides.Clear(); 366 367 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(true, "ssh", 368 "cmd://SSH.exe -l \"{USERNAME}\" {BASE:RMVSCM}", 0x1000000)); 369 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "ssh", 370 "cmd://PuTTY.exe -ssh {USERNAME}@{BASE:RMVSCM}", 0x1)); 371 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 372 "cmd://{INTERNETEXPLORER} \"{BASE}\"", 0x2)); 373 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 374 "cmd://{INTERNETEXPLORER} \"{BASE}\"", 0x4)); 375 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 376 "cmd://{INTERNETEXPLORER} -private \"{BASE}\"", 0x10000)); 377 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 378 "cmd://{INTERNETEXPLORER} -private \"{BASE}\"", 0x20000)); 379 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 380 "microsoft-edge:{BASE}", 0x4000)); 381 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 382 "microsoft-edge:{BASE}", 0x8000)); 383 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 384 "cmd://{FIREFOX} \"{BASE}\"", 0x8)); 385 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 386 "cmd://{FIREFOX} \"{BASE}\"", 0x10)); 387 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 388 "cmd://{FIREFOX} -private-window \"{BASE}\"", 0x100000)); 389 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 390 "cmd://{FIREFOX} -private-window \"{BASE}\"", 0x200000)); 391 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "chrome", 392 "cmd://{FIREFOX} -chrome \"{BASE}\"", 0x20)); 393 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 394 "cmd://{GOOGLECHROME} \"{BASE}\"", 0x100)); 395 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 396 "cmd://{GOOGLECHROME} \"{BASE}\"", 0x200)); 397 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 398 "cmd://{GOOGLECHROME} --incognito \"{BASE}\"", 0x40000)); 399 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 400 "cmd://{GOOGLECHROME} --incognito \"{BASE}\"", 0x80000)); 401 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 402 "cmd://{OPERA} \"{BASE}\"", 0x40)); 403 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 404 "cmd://{OPERA} \"{BASE}\"", 0x80)); 405 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 406 "cmd://{OPERA} --private \"{BASE}\"", 0x400000)); 407 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 408 "cmd://{OPERA} --private \"{BASE}\"", 0x800000)); 409 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", 410 "cmd://{SAFARI} \"{BASE}\"", 0x400)); 411 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", 412 "cmd://{SAFARI} \"{BASE}\"", 0x800)); 413 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", 414 "cmd://\"{APPDIR}\\KeePass.exe\" \"{BASE:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x1000)); 415 m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", 416 "cmd://mono \"{APPDIR}/KeePass.exe\" \"{BASE:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x2000)); 417 // Free: 0x2000000 418 419 #if DEBUG 420 ulong u = 0; 421 foreach(AceUrlSchemeOverride o in m_lBuiltInOverrides) 422 { 423 Debug.Assert(o.IsBuiltIn); 424 ulong f = o.BuiltInFlagID; 425 Debug.Assert((f != 0) && ((f & (f - 1)) == 0)); // Check power of 2 426 u += f; 427 } 428 Debug.Assert(u == ((1UL << m_lBuiltInOverrides.Count) - 1UL)); 429 #endif 430 } 431 GetOverrideForUrl(string strUrl)432 public string GetOverrideForUrl(string strUrl) 433 { 434 if(string.IsNullOrEmpty(strUrl)) return null; 435 436 for(int i = 0; i < 2; ++i) 437 { 438 List<AceUrlSchemeOverride> l = ((i == 0) ? m_lBuiltInOverrides : 439 m_lCustomOverrides); 440 441 foreach(AceUrlSchemeOverride ovr in l) 442 { 443 if(!ovr.Enabled) continue; 444 445 if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp)) 446 return ovr.UrlOverride; 447 } 448 } 449 450 return null; 451 } 452 CloneDeep()453 public AceUrlSchemeOverrides CloneDeep() 454 { 455 AceUrlSchemeOverrides ovr = new AceUrlSchemeOverrides(); 456 CopyTo(ovr); 457 return ovr; 458 } 459 CopyTo(AceUrlSchemeOverrides ovrTarget)460 public void CopyTo(AceUrlSchemeOverrides ovrTarget) 461 { 462 ovrTarget.m_lBuiltInOverrides.Clear(); 463 foreach(AceUrlSchemeOverride shB in m_lBuiltInOverrides) 464 { 465 ovrTarget.m_lBuiltInOverrides.Add(shB.CloneDeep()); 466 } 467 468 ovrTarget.m_lCustomOverrides.Clear(); 469 foreach(AceUrlSchemeOverride shC in m_lCustomOverrides) 470 { 471 ovrTarget.m_lCustomOverrides.Add(shC.CloneDeep()); 472 } 473 } 474 GetEnabledBuiltInOverrides()475 private ulong GetEnabledBuiltInOverrides() 476 { 477 ulong u = 0; 478 for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) 479 { 480 if(m_lBuiltInOverrides[i].Enabled) 481 u |= m_lBuiltInOverrides[i].BuiltInFlagID; 482 } 483 484 return u; 485 } 486 SetEnabledBuiltInOverrides(ulong uFlags)487 private void SetEnabledBuiltInOverrides(ulong uFlags) 488 { 489 for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) 490 m_lBuiltInOverrides[i].Enabled = ((uFlags & 491 m_lBuiltInOverrides[i].BuiltInFlagID) != 0UL); 492 } 493 AddCustomOverride(string strScheme, string strOverride, bool bEnable, bool bDisableOthers)494 internal void AddCustomOverride(string strScheme, string strOverride, 495 bool bEnable, bool bDisableOthers) 496 { 497 if(string.IsNullOrEmpty(strScheme)) return; // No assert 498 if(strOverride == null) return; // No assert 499 500 if(bDisableOthers) 501 { 502 List<AceUrlSchemeOverride> l = new List<AceUrlSchemeOverride>(); 503 l.AddRange(m_lBuiltInOverrides); 504 l.AddRange(m_lCustomOverrides); 505 506 foreach(AceUrlSchemeOverride o in l) 507 { 508 if(o.Scheme.Equals(strScheme, StrUtil.CaseIgnoreCmp)) 509 o.Enabled = false; 510 } 511 } 512 513 m_lCustomOverrides.Add(new AceUrlSchemeOverride(bEnable, 514 strScheme, strOverride)); 515 } 516 RemoveCustomOverride(string strScheme, string strOverride)517 internal void RemoveCustomOverride(string strScheme, string strOverride) 518 { 519 if(string.IsNullOrEmpty(strScheme)) return; // No assert 520 if(strOverride == null) return; // No assert 521 522 for(int i = m_lCustomOverrides.Count - 1; i >= 0; --i) 523 { 524 AceUrlSchemeOverride o = m_lCustomOverrides[i]; 525 if(o.Scheme.Equals(strScheme, StrUtil.CaseIgnoreCmp) && 526 (o.UrlOverride == strOverride)) 527 { 528 m_lCustomOverrides.RemoveAt(i); 529 return; // Remove one item only 530 } 531 } 532 } 533 } 534 535 public sealed class AceUrlSchemeOverride : IDeepCloneable<AceUrlSchemeOverride> 536 { 537 private bool m_bEnabled = true; 538 public bool Enabled 539 { 540 get { return m_bEnabled; } 541 set { m_bEnabled = value; } 542 } 543 544 private string m_strScheme = string.Empty; 545 public string Scheme 546 { 547 get { return m_strScheme; } 548 set 549 { 550 if(value == null) throw new ArgumentNullException("value"); 551 m_strScheme = value; 552 } 553 } 554 555 private string m_strOvr = string.Empty; 556 public string UrlOverride 557 { 558 get { return m_strOvr; } 559 set 560 { 561 if(value == null) throw new ArgumentNullException("value"); 562 m_strOvr = value; 563 } 564 } 565 566 private ulong m_uBuiltInFlagID = 0; 567 [XmlIgnore] 568 internal ulong BuiltInFlagID 569 { 570 get { return m_uBuiltInFlagID; } 571 } 572 573 [XmlIgnore] 574 public bool IsBuiltIn 575 { 576 get { return (m_uBuiltInFlagID != 0UL); } 577 } 578 AceUrlSchemeOverride()579 public AceUrlSchemeOverride() 580 { 581 } 582 AceUrlSchemeOverride(bool bEnable, string strScheme, string strUrlOverride)583 public AceUrlSchemeOverride(bool bEnable, string strScheme, 584 string strUrlOverride) 585 { 586 Init(bEnable, strScheme, strUrlOverride, 0); 587 } 588 AceUrlSchemeOverride(bool bEnable, string strScheme, string strUrlOverride, ulong uBuiltInFlagID)589 internal AceUrlSchemeOverride(bool bEnable, string strScheme, 590 string strUrlOverride, ulong uBuiltInFlagID) 591 { 592 Init(bEnable, strScheme, strUrlOverride, uBuiltInFlagID); 593 } 594 Init(bool bEnable, string strScheme, string strUrlOverride, ulong uBuiltInFlagID)595 private void Init(bool bEnable, string strScheme, string strUrlOverride, 596 ulong uBuiltInFlagID) 597 { 598 if(strScheme == null) throw new ArgumentNullException("strScheme"); 599 if(strUrlOverride == null) throw new ArgumentNullException("strUrlOverride"); 600 601 m_bEnabled = bEnable; 602 m_strScheme = strScheme; 603 m_strOvr = strUrlOverride; 604 m_uBuiltInFlagID = uBuiltInFlagID; 605 } 606 CloneDeep()607 public AceUrlSchemeOverride CloneDeep() 608 { 609 return new AceUrlSchemeOverride(m_bEnabled, m_strScheme, 610 m_strOvr, m_uBuiltInFlagID); 611 } 612 } 613 } 614