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