-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Options.cs
120 lines (103 loc) · 3.16 KB
/
Options.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
KeePassDiceware Plugin
Copyright (C) 2021 cmd <https://github.com/cmdwtf>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace KeePassDiceware
{
[Serializable]
public class Options
{
public int WordCount { get; set; } = 4;
public string WordSeparator { get; set; } = "-";
public WordCasingType WordCasing { get; set; } = WordCasingType.TitleCase;
public L33tSpeakType L33tSpeak { get; set; } = L33tSpeakType.None;
public SaltType Salt { get; set; } = SaltType.None;
public List<SaltSource> SaltSources { get; set; } = new();
public WordLists WordLists { get; set; } =
WordLists.Diceware
| WordLists.EffLarge
| WordLists.Google;
public AdvancedStrategy AdvancedStrategy { get; set; } = AdvancedStrategy.Drop;
public Options() { }
public static Options Default()
{
return new()
{
SaltSources = SaltSource.DefaultSources,
};
}
internal static Options Deserialize(string serialized)
{
using StringReader stream = new(serialized);
using var reader = XmlReader.Create(stream);
XmlSerializer xml = new(typeof(Options));
xml.UnknownElement += Xml_UnknownElement;
Options result = xml.Deserialize(reader) as Options;
return result;
}
private static void Xml_UnknownElement(object sender, XmlElementEventArgs e)
{
if (e.ObjectBeingDeserialized is not Options opts)
{
return;
}
// handle legacy salt character source option
if (e.Element.Name == "SaltCharacterSources")
{
string[] saltSourceNames = e.Element.InnerText.Split(new char[] { ' ' });
// start from the defaults
opts.SaltSources = SaltSource.DefaultSources;
foreach (SaltSource ss in opts.SaltSources)
{
if (saltSourceNames.Any(ssn => string.Compare(ssn, ss.Key) == 0) == false)
{
ss.Disable();
}
}
}
e.ToString();
}
internal static bool TryDeserialize(string serialized, out Options result)
{
result = null;
if (string.IsNullOrWhiteSpace(serialized))
{
return false;
}
try
{
result = Deserialize(serialized);
return true;
}
catch
{
return false;
}
}
internal string Serialize()
{
var xml = new XmlSerializer(typeof(Options));
var sb = new StringBuilder();
var outputStream = new StringWriter(sb);
xml.Serialize(outputStream, this);
return sb.ToString();
}
}
}