Renamed project to GUI

This commit is contained in:
2023-04-02 21:53:39 +02:00
parent 385dda6611
commit f947949e3b
69 changed files with 483 additions and 19 deletions

14
GUI/Config.cs Normal file
View File

@@ -0,0 +1,14 @@
namespace Password_Manager
{
class Config
{
public string PasswordStorePath { get; set; }
public string Recipient { get; set; }
public Config(string PasswordStorePath, string Recipient)
{
this.PasswordStorePath = PasswordStorePath;
this.Recipient = Recipient;
}
}
}

94
GUI/ConfigFileManager.cs Normal file
View File

@@ -0,0 +1,94 @@
using Microsoft.VisualBasic.FileIO;
namespace Password_Manager
{
static class ConfigFileManager
{
#region Config flags
/*Configuration: (format: fieldname=value)
password_store_path: path to the folder which contains the .gpg files
recipient: whose public key to use for encryption when a new password is created
*/
private static string CONFIGPATH = SpecialDirectories.CurrentUserApplicationData + "\\config.cfg";
private static char DELIMETER = '=';
private static string RECIPIENT = "recipient";
private static string PATH = "password_store_path";
#endregion
private static Config Configuration;
public static void Init()
{
bool success = false;
while (!success)
{
if (File.Exists(CONFIGPATH))
{
StreamReader sr = new StreamReader(CONFIGPATH);
string? path = null, recipient = null;
while (!sr.EndOfStream)
{
string[]? fields = sr.ReadLine().Split(DELIMETER);
if (fields != null)
{
if (fields[0] == PATH)
{
path = fields[1];
}
else if (fields[0] == RECIPIENT)
{
recipient = fields[1];
}
}
else //probably an empty line or something
{
continue;
}
}
if (path != null && recipient != null)
{
Configuration = new Config(path, recipient);
success = true;
}
else
{
throw new InvalidConfigurationException("One or more required fileds were missing from the configuration file.");
}
}
else
{
CreateDefaultConfig();
}
}
}
public static string GetPath()
{
return Configuration.PasswordStorePath;
}
public static string GetRecipient()
{
return Configuration.Recipient;
}
private static void CreateDefaultConfig()
{
try
{
string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
StreamWriter sw = new StreamWriter(CONFIGPATH);
sw.WriteLine(RECIPIENT + DELIMETER + user);
sw.WriteLine(PATH + DELIMETER + SpecialDirectories.CurrentUserApplicationData);
sw.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

12
GUI/GUI.csproj Normal file
View File

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<RootNamespace>Password_Manager</RootNamespace>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>

14
GUI/GUI.csproj.user Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Update="GeneratePassword.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PasswordListBox.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
</Project>

136
GUI/GeneratePassword.Designer.cs generated Normal file
View File

@@ -0,0 +1,136 @@
namespace Password_Manager
{
partial class GeneratePassword
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
passwordName = new TextBox();
label1 = new Label();
label2 = new Label();
passwordLength = new TextBox();
noSymbols = new CheckBox();
generate = new Button();
cancel = new Button();
SuspendLayout();
//
// passwordName
//
passwordName.Location = new Point(12, 33);
passwordName.Name = "passwordName";
passwordName.PlaceholderText = "website.com";
passwordName.Size = new Size(156, 23);
passwordName.TabIndex = 0;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(12, 15);
label1.Name = "label1";
label1.Size = new Size(39, 15);
label1.TabIndex = 1;
label1.Text = "Name";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(12, 59);
label2.Name = "label2";
label2.Size = new Size(44, 15);
label2.TabIndex = 2;
label2.Text = "Length";
//
// passwordLength
//
passwordLength.Location = new Point(12, 77);
passwordLength.Name = "passwordLength";
passwordLength.PlaceholderText = "16";
passwordLength.Size = new Size(156, 23);
passwordLength.TabIndex = 3;
//
// noSymbols
//
noSymbols.AutoSize = true;
noSymbols.Location = new Point(12, 106);
noSymbols.Name = "noSymbols";
noSymbols.Size = new Size(89, 19);
noSymbols.TabIndex = 4;
noSymbols.Text = "No symbols";
noSymbols.UseVisualStyleBackColor = true;
//
// generate
//
generate.Location = new Point(93, 131);
generate.Name = "generate";
generate.Size = new Size(75, 23);
generate.TabIndex = 5;
generate.Text = "Generate";
generate.UseVisualStyleBackColor = true;
generate.Click += Generate;
//
// cancel
//
cancel.Location = new Point(12, 131);
cancel.Name = "cancel";
cancel.Size = new Size(75, 23);
cancel.TabIndex = 6;
cancel.Text = "Cancel";
cancel.UseVisualStyleBackColor = true;
cancel.Click += cancel_Click;
//
// GeneratePassword
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(187, 173);
Controls.Add(cancel);
Controls.Add(generate);
Controls.Add(noSymbols);
Controls.Add(passwordLength);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(passwordName);
Name = "GeneratePassword";
ResumeLayout(false);
PerformLayout();
}
private void Generate_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
#endregion
private TextBox passwordName;
private Label label1;
private Label label2;
private TextBox passwordLength;
private CheckBox noSymbols;
private Button generate;
private Button cancel;
}
}

58
GUI/GeneratePassword.cs Normal file
View File

@@ -0,0 +1,58 @@
using Password_Generator;
namespace Password_Manager
{
public delegate void MethodRequest();
public partial class GeneratePassword : Form
{
private string currentPath;
private string recipient;
public event MethodRequest ReloadRequest;
public GeneratePassword(string currentPath, string recipient, MethodRequest ReloadRequest, string? name)
{
InitializeComponent();
passwordName.Text = name;
this.currentPath = currentPath;
this.recipient = recipient;
this.ReloadRequest = ReloadRequest;
}
public void Generate(object sender, EventArgs e)
{
if (passwordName.Text == "" || passwordLength.Text == "")
{
MessageBox.Show("You must fill in all fields to continue.", "Error: Empty fields", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
try
{
string filePath = $"{currentPath}\\{passwordName.Text}";
File.WriteAllText(
currentPath + $"\\{passwordName.Text}.gpg",
PasswordGenerator.New(
recipient,
Convert.ToInt32(passwordLength.Text),
noSymbols.Checked)
);
}
catch (FormatException)
{
MessageBox.Show("Please enter a valid number for the password's length.", "Error: Invalid field", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (IOException error)
{
MessageBox.Show(error.ToString(), "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
ReloadRequest();
Close();
}
private void cancel_Click(object sender, EventArgs e)
{
Close();
}
}
}

60
GUI/GeneratePassword.resx Normal file
View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,9 @@
namespace Password_Manager
{
class InvalidConfigurationException : Exception
{
public InvalidConfigurationException() : base() { }
public InvalidConfigurationException(string message) : base(message) { }
public InvalidConfigurationException(string message, Exception inner) : base(message, inner) { }
}
}

115
GUI/MainForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,115 @@
namespace Password_Manager
{
sealed partial class MainForm : Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
SearchBox = new TextBox();
GeneratePassword = new Button();
ResultList = new PasswordListBox(PathRequest);
DecryptBtn = new Button();
Cancel = new Button();
SuspendLayout();
//
// SearchBox
//
SearchBox.Location = new Point(10, 20);
SearchBox.Margin = new Padding(3, 2, 3, 2);
SearchBox.Name = "SearchBox";
SearchBox.PlaceholderText = "Search for a password";
SearchBox.Size = new Size(225, 23);
SearchBox.TabIndex = 0;
SearchBox.TextChanged += ReloadResults;
//
// GeneratePassword
//
GeneratePassword.Location = new Point(241, 20);
GeneratePassword.Name = "GeneratePassword";
GeneratePassword.Size = new Size(75, 23);
GeneratePassword.TabIndex = 5;
GeneratePassword.Text = "Generate";
GeneratePassword.UseVisualStyleBackColor = true;
GeneratePassword.Click += OpenPasswordGenerator;
//
// ResultList
//
ResultList.ColumnWidth = 20;
ResultList.FormattingEnabled = true;
ResultList.HorizontalScrollbar = true;
ResultList.ItemHeight = 15;
ResultList.Location = new Point(10, 48);
ResultList.Name = "ResultList";
ResultList.Size = new Size(306, 274);
ResultList.TabIndex = 6;
//
// DecryptBtn
//
DecryptBtn.Location = new Point(241, 328);
DecryptBtn.Name = "DecryptBtn";
DecryptBtn.Size = new Size(75, 23);
DecryptBtn.TabIndex = 7;
DecryptBtn.Text = "Decrypt";
DecryptBtn.UseVisualStyleBackColor = true;
DecryptBtn.Click += Decrypt;
//
// Cancel
//
Cancel.Location = new Point(160, 328);
Cancel.Name = "Cancel";
Cancel.Size = new Size(75, 23);
Cancel.TabIndex = 8;
Cancel.Text = "Cancel";
Cancel.UseVisualStyleBackColor = true;
Cancel.Click += CancelPressed;
//
// MainForm
//
AcceptButton = DecryptBtn;
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(324, 374);
Controls.Add(Cancel);
Controls.Add(DecryptBtn);
Controls.Add(ResultList);
Controls.Add(GeneratePassword);
Controls.Add(SearchBox);
Margin = new Padding(3, 2, 3, 2);
Name = "MainForm";
Text = "Password Manager";
ResumeLayout(false);
PerformLayout();
}
#endregion
private TextBox SearchBox;
private Button GeneratePassword;
private PasswordListBox ResultList;
private Button DecryptBtn;
private Button Cancel;
}
}

69
GUI/MainForm.cs Normal file
View File

@@ -0,0 +1,69 @@
namespace Password_Manager
{
sealed public partial class MainForm : Form
{
public event DataRequest PathRequest;
public event DataRequest? RecipientRequest;
public MainForm(DataRequest PathRequest, DataRequest? RecipientRequest = null)
{
this.PathRequest = PathRequest;
this.RecipientRequest = RecipientRequest;
InitializeComponent();
ResultList.SearchQueryRequest += () => SearchBox.Text;
ResultList.ReloadResults();
}
private void ReloadResults(object? sender, EventArgs? e) //proxy method for SearchBox.TextChanged
{
ResultList.ReloadResults();
}
private void ReloadResults()
{
ResultList.ReloadResults();
}
private void OpenPasswordGenerator(object sender, EventArgs e)
{
if (RecipientRequest != null)
{
GeneratePassword gp = new GeneratePassword(PathRequest(), RecipientRequest(), ReloadResults, SearchBox.Text);
gp.ShowDialog();
}
else
{
throw new InvalidOperationException("You cannot use the OpenPasswordGenerator method if you instantiated this form without a RecipientRequest event handler.");
}
}
private void CancelPressed(object sender, EventArgs e)
{
Close();
}
private void CopyAndNotify(string? line, string fileName)
{
ProcessBuilder pb = new ProcessBuilder();
pb.ProcessFailed += (e) => MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
if (line != null)
{
Clipboard.SetText(line);
pb.Run("./ToastNotification.exe", $"\"{fileName} decrypted\" \"Password copied to clipboard\"");
}
else
{
pb.Run("./ToastNotification.exe", "\"Error\" \"No password copied\"");
}
}
private void Decrypt(object sender, EventArgs e)
{
ProcessBuilder pb = new ProcessBuilder();
pb.ProcessFailed += (e) => MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
CopyAndNotify(pb.GetOutput("gpg.exe", $"--quiet --decrypt {PathRequest()}\\{ResultList.Text}"), ResultList.Text);
Close();
}
}
}

60
GUI/MainForm.resx Normal file
View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

40
GUI/PasswordGenerator.cs Normal file
View File

@@ -0,0 +1,40 @@
using Password_Manager;
using System.Text;
namespace Password_Generator
{
static class PasswordGenerator
{
private static string RandomStr(int length, bool no_symbols = false)
{
StringBuilder builder = new StringBuilder();
Random rnd = new Random();
for (int i = 0; i < length; i++)
{
if (rnd.Next(0, 101) <= 60) //60% chance for a character
{
char c = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * rnd.NextDouble() + 65))); //random character
if (no_symbols && Char.IsSymbol(c))
{
while (Char.IsSymbol(c))
{
c = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * rnd.NextDouble() + 65))); //random character
}
}
builder.Append(c);
}
else //40% change for number
{
builder.Append(Convert.ToChar(rnd.Next(0, 10)));
}
}
return builder.ToString();
}
public static string? New(string recipient, int length, bool no_symbols = false)
{
return new ProcessBuilder().GetOutput("cmd.exe", $"echo {RandomStr(length, no_symbols)} | gpg --quiet --encrypt --recipient {recipient}");
}
}
}

73
GUI/PasswordListBox.cs Normal file
View File

@@ -0,0 +1,73 @@
using System.Collections;
namespace Password_Manager
{
public delegate string SearchQuery();
public class PasswordListBox : ListBox
{
public event DataRequest? PathRequest;
public event SearchQuery? SearchQueryRequest;
public PasswordListBox(DataRequest PathRequest, SearchQuery? SearchQueryRequest = null) : base()
{
this.PathRequest = PathRequest;
this.SearchQueryRequest = SearchQueryRequest;
}
public PasswordListBox() : base() { }
/*do not instantiate this class using this constructor if you want to use the ReloadResults method afterwards.
Use this so that the MainForm.Designer.cs file doesn't have a stroke due to Event References, then re-instantiate the object
afterwards using the other constructor*/
public void ReloadResults(object? sender = null, EventArgs? arg = null)
{
DirectoryInfo d;
FileInfo[] files = new FileInfo[0];
try
{
if (PathRequest != null)
{
d = new DirectoryInfo(PathRequest());
}
else
{
throw new InvalidOperationException("You cannot use the ReloadResults method if you instantiated the object using the parameterless constructor");
}
files = d.GetFiles("*.gpg");
}
catch (ArgumentNullException e)
{
MessageBox.Show(e.ToString(), "Error: Invalid path", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
List<string> elements = new List<string>();
for (int i = 0; i < files.Length; i++)
{
elements.Add(files[i].Name);
}
string[] copy = elements.ToArray();
string? searchQuery = SearchQueryRequest?.Invoke();
if (searchQuery != null) //we have a search query
{
foreach (string s in copy)
{
if (!s.Contains(searchQuery))
{
elements.Remove(s);
}
}
}
this.DataSource = elements;
try
{
SelectedIndex = 0;
} catch (ArgumentOutOfRangeException)
{
SelectedIndex = -1;
}
}
}
}

61
GUI/ProcessBuilder.cs Normal file
View File

@@ -0,0 +1,61 @@
using System.Diagnostics;
using System.Text;
namespace Password_Manager
{
public delegate void ProcessSuccess();
public delegate void ProcessFailure(Exception e);
sealed class ProcessBuilder
{
public event ProcessSuccess? ProcessFinished;
public event ProcessFailure? ProcessFailed;
public void Run(string procName, string args)
{
try
{
Process.Start(procName, args);
ProcessFinished?.Invoke();
}
catch (Exception e)
{
ProcessFailed?.Invoke(e);
}
}
public string? GetOutput(string procName, string args)
{
try
{
Process proc = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = procName,
Arguments = args,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
proc.Start();
StringBuilder builder = new StringBuilder();
while (!proc.StandardOutput.EndOfStream)
{
builder.Append(proc.StandardOutput.ReadLine());
}
ProcessFinished?.Invoke();
return builder.ToString();
} catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
ProcessFailed?.Invoke(e);
}
return null;
}
}
}

22
GUI/Program.cs Normal file
View File

@@ -0,0 +1,22 @@
namespace Password_Manager
{
public delegate string DataRequest(); //Fire whenever a specific field of ProfileHandler.CurrentProfile is needed
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
ConfigFileManager.Init();
ApplicationConfiguration.Initialize();
Application.Run(mainForm);
}
public static MainForm mainForm = new MainForm(
() => ConfigFileManager.GetPath(),
() => ConfigFileManager.GetRecipient()
); //needed at creation so that MainForm may pass this method down to other classes in its constructor
}
}

36
GUI/ToastNotification.ps1 Normal file
View File

@@ -0,0 +1,36 @@
function Show-Notification {
[cmdletbinding()]
Param (
[string]
$ToastTitle,
[string]
[parameter(ValueFromPipeline)]
$ToastText
)
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
$Template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)
$RawXml = [xml] $Template.GetXml()
($RawXml.toast.visual.binding.text | Where-Object {$_.id -eq "1"}).AppendChild($RawXml.CreateTextNode($ToastTitle)) > $null
($RawXml.toast.visual.binding.text | Where-Object {$_.id -eq "2"}).AppendChild($RawXml.CreateTextNode($ToastText)) > $null
$SerializedXml = New-Object Windows.Data.Xml.Dom.XmlDocument
$SerializedXml.LoadXml($RawXml.OuterXml)
$Toast = [Windows.UI.Notifications.ToastNotification]::new($SerializedXml)
$Toast.Tag = "PowerShell"
$Toast.Group = "PowerShell"
$Toast.ExpirationTime = [DateTimeOffset]::Now.AddMinutes(1)
$Notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("Password Manager")
$Notifier.Show($Toast);
}
param(
[Parameter(Mandatory)]
[String]$toastTitle,
[String]$toastText
)
Show-Notification -ToastTitle "$toastTitle" -ToastText "$toastText"

View File

@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"Password Manager/1.0.0": {
"runtime": {
"Password Manager.dll": {}
}
}
}
},
"libraries": {
"Password Manager/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,15 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "7.0.0"
}
]
}
}

Binary file not shown.

View File

@@ -0,0 +1 @@
924da642a7442ec5c33c7b2317d77ee457cd12d8

View File

@@ -0,0 +1,18 @@
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Debug\net7.0-windows\Password Manager.exe
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Debug\net7.0-windows\Password Manager.deps.json
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Debug\net7.0-windows\Password Manager.runtimeconfig.json
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Debug\net7.0-windows\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Debug\net7.0-windows\Password Manager.pdb
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.csproj.AssemblyReference.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password_Manager.GeneratePassword.resources
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password_Manager.MainForm.resources
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.csproj.GenerateResource.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.AssemblyInfoInputs.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.AssemblyInfo.cs
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.csproj.CoreCompileInputs.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\refint\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.pdb
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\Password Manager.genruntimeconfig.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Debug\net7.0-windows\ref\Password Manager.dll

Binary file not shown.

View File

@@ -0,0 +1 @@
388ec1841f093da200833ba32f6d8bfa703eda5a

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,65 @@
{
"format": 1,
"restore": {
"C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj": {}
},
"projects": {
"C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj",
"projectName": "GUI",
"projectPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj",
"packagesPath": "C:\\Users\\Typo\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Typo\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
},
"Microsoft.WindowsDesktop.App.WindowsForms": {
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Typo\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Typo\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,65 @@
{
"format": 1,
"restore": {
"C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj": {}
},
"projects": {
"C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj",
"projectName": "Password Manager",
"projectPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj",
"packagesPath": "C:\\Users\\Typo\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Typo\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
},
"Microsoft.WindowsDesktop.App.WindowsForms": {
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Typo\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Typo\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("GUI")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("GUI")]
[assembly: System.Reflection.AssemblyTitleAttribute("GUI")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -0,0 +1 @@
3b5697c9172c5c221036b2c986dfa23bab2c5116

View File

@@ -0,0 +1,17 @@
is_global = true
build_property.ApplicationManifest =
build_property.StartupObject =
build_property.ApplicationDefaultFont =
build_property.ApplicationHighDpiMode =
build_property.ApplicationUseCompatibleTextRendering =
build_property.ApplicationVisualStyles =
build_property.TargetFramework = net7.0-windows
build_property.TargetPlatformMinVersion = 7.0
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Password_Manager
build_property.ProjectDir = C:\Users\Typo\Projects\Windows-Password-Manager\GUI\

View File

@@ -0,0 +1,10 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.Drawing;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using global::System.Windows.Forms;

Binary file not shown.

View File

@@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Password Manager")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Password Manager")]
[assembly: System.Reflection.AssemblyTitleAttribute("Password Manager")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -0,0 +1 @@
e47eb23f04f19d033ddc60dbac85e73f17fbdc7a

View File

@@ -0,0 +1,17 @@
is_global = true
build_property.ApplicationManifest =
build_property.StartupObject =
build_property.ApplicationDefaultFont =
build_property.ApplicationHighDpiMode =
build_property.ApplicationUseCompatibleTextRendering =
build_property.ApplicationVisualStyles =
build_property.TargetFramework = net7.0-windows
build_property.TargetPlatformMinVersion = 7.0
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Password_Manager
build_property.ProjectDir = C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\

View File

@@ -0,0 +1,10 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.Drawing;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using global::System.Windows.Forms;

View File

@@ -0,0 +1 @@
9be76c6f2b146ccaf4e05b6c1fd7708b8991998a

View File

@@ -0,0 +1,18 @@
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Release\net7.0-windows\Password Manager.exe
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Release\net7.0-windows\Password Manager.deps.json
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Release\net7.0-windows\Password Manager.runtimeconfig.json
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Release\net7.0-windows\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\bin\Release\net7.0-windows\Password Manager.pdb
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.csproj.AssemblyReference.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password_Manager.GeneratePassword.resources
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password_Manager.MainForm.resources
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.csproj.GenerateResource.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.AssemblyInfoInputs.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.AssemblyInfo.cs
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.csproj.CoreCompileInputs.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\refint\Password Manager.dll
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.pdb
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\Password Manager.genruntimeconfig.cache
C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\obj\Release\net7.0-windows\ref\Password Manager.dll

View File

@@ -0,0 +1,11 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {}
},
"libraries": {}
}

View File

@@ -0,0 +1,23 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "7.0.0"
}
],
"additionalProbingPaths": [
"C:\\Users\\Typo\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\Typo\\.nuget\\packages"
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true
}
}
}

Binary file not shown.

View File

@@ -0,0 +1 @@
2e99e7c3531053203d08be2ec50814766b8c79bb

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,70 @@
{
"version": 3,
"targets": {
"net7.0-windows7.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net7.0-windows7.0": []
},
"packageFolders": {
"C:\\Users\\Typo\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj",
"projectName": "GUI",
"projectPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj",
"packagesPath": "C:\\Users\\Typo\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Typo\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
},
"Microsoft.WindowsDesktop.App.WindowsForms": {
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.201\\RuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "xaQBQGwURe1doe22aGJbi0HP95BxuO3cRTGnqxZ81KyO175G+7XH7+HrQ+5nqIv097lQVB83fMvc2QzSX3cXAA==",
"success": true,
"projectFilePath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\GUI\\GUI.csproj",
"expectedPackageFiles": [],
"logs": []
}