From df33170f716a44107b6de9adab53219cdc40cb47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miskolczi=20Rich=C3=A1rd?= Date: Mon, 27 Mar 2023 00:19:30 +0200 Subject: [PATCH] kill me --- .../DesignTimeBuild/.dtbcache.v2 | Bin 96732 -> 97423 bytes .vs/Password Manager/v17/.futdcache.v2 | Bin 275 -> 424 bytes .vs/Password Manager/v17/.suo | Bin 53760 -> 76800 bytes .../password manager.metadata.v6.1 | Bin 164449 -> 169710 bytes .../password manager.projects.v6.1 | Bin 177814 -> 268126 bytes Password Manager/GeneratePassword.Designer.cs | 135 ++++++++++++++++++ Password Manager/GeneratePassword.cs | 48 +++++++ Password Manager/GeneratePassword.resx | 60 ++++++++ Password Manager/MainForm.Designer.cs | 61 +++++--- Password Manager/MainForm.cs | 47 +++++- Password Manager/NewProfileForm.cs | 23 ++- Password Manager/Password Manager.csproj.user | 5 +- Password Manager/PasswordGenerator.cs | 34 +++++ Password Manager/PasswordListBox.cs | 47 ++++++ Password Manager/{ => Profiles}/IList.cs | 4 +- Password Manager/Profiles/Profile.cs | 8 +- Password Manager/Profiles/ProfileHandler.cs | 84 ++++++++++- Password Manager/Profiles/ProfileList.cs | 14 +- .../Profiles/ProfileNotFoundException.cs | 5 +- Password Manager/Program.cs | 13 +- Password Manager/ResultListBox.cs | 40 ------ ....GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../Password Manager.assets.cache | Bin 163 -> 151 bytes ...ssword Manager.designer.runtimeconfig.json | 4 +- .../Password Manager.csproj.nuget.dgspec.json | 14 +- .../obj/Password Manager.csproj.nuget.g.props | 4 +- Password Manager/obj/project.assets.json | 12 +- Password Manager/obj/project.nuget.cache | 4 +- 28 files changed, 543 insertions(+), 125 deletions(-) create mode 100644 Password Manager/GeneratePassword.Designer.cs create mode 100644 Password Manager/GeneratePassword.cs create mode 100644 Password Manager/GeneratePassword.resx create mode 100644 Password Manager/PasswordGenerator.cs create mode 100644 Password Manager/PasswordListBox.cs rename Password Manager/{ => Profiles}/IList.cs (93%) delete mode 100644 Password Manager/ResultListBox.cs diff --git a/.vs/Password Manager/DesignTimeBuild/.dtbcache.v2 b/.vs/Password Manager/DesignTimeBuild/.dtbcache.v2 index 03c9a0905d32369ecd27330557a01ac95bb3d232..b6703d90c47155a017f419459b17a483f51e1bda 100644 GIT binary patch delta 3958 zcmbW24{Q_H9mntdmXNeSfGjj__!k1p0wlyq9oOB~lmg8^0;CB`DGtH0FUCM@V>?Y# z#vBH1m!XOhmwH{tSjRfXs;R2bgeo*mRmZAns;X+Ls%f2CG@-%Jx_i1-sAbXieeWAj z>848atbFhD@w?yee0T5NdE0=Wq1g-Qx9n!k+L@lQrxewtT)O zZ?oU>w)jJLTRuHurC#l88!Ke72UyDFk&UKkEfuE za*0lJ>AjyBGK$#wa3Me4RBQDA&*$0XGWKS#%&*K24%Or)yUfMz{B7wSO(f#UbVE9r zj9BTEu`yp3m>CHeOS_|?WIPogPB(1b+}H3Qokq#Od!H~1xqwYY`nKfubefAR*L}`S z(|gy~e$HOp+a#wo6psx@BgSog>N0Za?PgzTNk!2>K-cO+}ybZ-R6Q! zLnxKN3UL|y%mWr9cOaFB8@UsyLY5#)k!8qoWCc=<7hbvXjMk7T9*-gW_NBX)15C@KgoUR(@`9vy3JGHJD#5*qc2Y z8K_#8FHZ&XHq#Toa4YiOmAZnSKexJs+`XMT46V9u(0zg z?4iDRPq#TO{-2edJJw^CXC4)XF^)Wj;LkXO%{P$4h+4DX1l8KlfD~*rnbmS@%PkzG#a#+UDC0TE_JN9Cf zHkfif4$)|$kDnzD_EM!MU)E&GW>uC8^_#2B#@rQ7`m$VThM3#7!c%LZR zsVmnKJ;WGsns}YKPLw^Y8@$9W;s|k$c$07l_b%PgN?62k;uYduVw$K4=!Om=PMjhx z5m$&g1G=)F=q1L9GsI=$2C;CrZtxKU#8Kir@fPthQ8lO=HV_fwDdGb02jZW^>OH!l zi#SN+h+h(aCQ5_4ay_wwI7GZayg~epC?C=deqxY#oOp?No483V4e5rBM3gu|{DSx+ zVTN^OEzwP+i06o35m$-ZE#2TD`iaBDS>m_E--(K0-S8D6NIXgWocKNQ39&q)8#WXB ziIc=d;!lLwt1Ih>ZNw%t`3VdZL#YC(aO;i5tYigSx>-3=l_&^Tb=k$3#_9H*6px z#8beIS+7e+?i4d`%Yc}9sSXIaTYToF>c~L8YEY<``X0RvVyoZA9eC+p{AV;K*$jxW17CH;^AJ)65l2bP8$R0{-aKn4Y- zne*$YAxmUt&v2)n&ZwHssIH$i+m0H-jB6?a9-3W=v00T96aNBqY(@tF delta 2754 zcmajge@v8h90%~{dtX6azaS{!%&91v3J8b7U9F7akATbsnVBHmJ@?#ka@@fksAzgB z7#SIGkM?M0WM<}EYmPP6%$jS?x#pZ}&ADpLIakiHo^Lm2uAF_I?;FasDYtunU(fgZ zd_LcMzWnjfdpqf;M3U_o@3+0Y(BbtuTwYgUL6PPxaCm&4`5u?*obM`eXdYE{Iy^;A zP1AhEnzKZ678e)!3JMlD3Vrhno$dt=M{$2|RyHqmxDFn% zfIqY{(5xw2_5PGhJ*F<#OVx}C%DA>jyQXXyS*+(u7t`I3Kd*o7ovE+zPPI`zrZ3o( zjsM|i7FbiLa@yIGl0rA5QR z_1Y_LwaM+*7HKV7$g73afOhW#&lx#PS-7QRWq5geTT6S}qCkX>7mjq4w`tAy9Im14 zncA8t9k{kCpf-6E|xq3X=K1SK#aPpZ3 z{hGga(A{|Hihbjldm85|Seh|Z!B*I7#wxaFDpmJC2|c0R_^Ohf9^(;l;@&{2as4Is z)EK{N6;H}|z^@KbLB=?H^#h;XXslqV#)K-C7Hj8X%? z+%mGZl}x6!7`ctIonq~?gEG2LCtZ*BWKnGw&397XpmbB-q)=~6*+my`QFmvX4SvWj_s8&3lwbX?}pT4)Z?cAmszf0Odo< zAs$ndkLbc`I86DNa)j~;C54)glGX;+Deu3@{r9l`f}c{a^|?G#QB0-NWTwsJ<~TFS zO#U<7*jLR?u;HPKmFzcLEYAAG6c%T3Gj~bC%oS5vLQG@kL^FSh$Yy4~m_D)~W>D20 zGjnMokq|jdG84=KPg6mkm`&r~C&e80V#0iqO6M|>OIzeI>KpmcOjZ~|Nccfj=3vY{M=!Cr6@Tmj=>la+a( z8gzgGa0c7}scU3I38({|;25|7Zh}d*vY{0C!EP`JE`z%ur%pChf>vOFQ{XC?xK>uq z12teXI0VjuVUSiY8(g3s>;%WbMQ{sDZjcRSAOL#77vM+0+_G{OSO%hCKllb*0}pv* zLm^lNwt&On9QYkPp~{A5fg5y#&%pQKHkjg-4U0h&=m$gKXTUXCIU6ho?ce}74SofW z_+SPf#}2>1>Nkl~jN&jA(e0-u8)z+Yfmqik3Tnt=|!1iyf!fUKMgR)7uQAovzs z2am0j4GX{;upJx)=RpEwHOYpBKm$GC1h@q5fayWmP!7UiFE|OVfbq?;G7nUP4ln@D zfEyq+BpXUV9q0tdzy)v!63K{?t+{a*-!~ufdNi|t6*ZQtegjGz-Dj= zoCU)mEg~CSpdRc5$H7H#3rvo(jH%XZw~kxmS{micw>)9JWJNxsi~OP1DCuY%Z0{;k0-1pKNpQ$1h`noMH8>2{{)$&nMH$D9^|5#ix3xKDyO9u UE?T*W$nvOshBh8o`nGNR2V5#VDgXcg diff --git a/.vs/Password Manager/v17/.futdcache.v2 b/.vs/Password Manager/v17/.futdcache.v2 index 84f93c6002f5e60f44549b593351b57111ff551a..a34e4199798c1a11da813be120e6d8923a90cd1f 100644 GIT binary patch delta 83 zcmbQtw1SzDc_X6`qd|nTRZM7cYEf}aNM%8OOh8e7R%&udaZGq-UP^v>v2H+OadCNm mQHri_VqRi;YSBcwK#?TpnWo3iWx3nx-R20NGvTZ|kOly#v>u!Q delta 10 RcmZ3%Jei4+X(OW$BLEIp0to;B diff --git a/.vs/Password Manager/v17/.suo b/.vs/Password Manager/v17/.suo index 532e0ffe8318f1fa43f0dca72f7856367f1fb7ba..22215e2f7bf648f5bf42c5d12ad0dd3a27770712 100644 GIT binary patch literal 76800 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 delta 6141 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 diff --git a/.vs/ProjectEvaluation/password manager.metadata.v6.1 b/.vs/ProjectEvaluation/password manager.metadata.v6.1 index 041f23ea38ab31ef46155d9da383ebaba0192480..642a14571a88a0c3e720f4a2dc9984779e4e4fe9 100644 GIT binary patch delta 6070 zcmbtYdsGzX6=yzmcV`j8`yrr96eH-2%R|(t)pZvHSzvi84V=&$e8qmci0qo)wH6(M8&FGE8@jOIt}RU+pV?UijF!EW;ktGNcB zXs>bcPN7v~Yz|Ru6}(QS*uguRIIn#(fGnd0;na4Nz_Fs6e-U6aM++OUwFNNCMvEb) zjLb^_S)>M%knu7=7K~~O&$De=bTQ?`72n34$1irSV!9JciG(u zR4V5U_&-hQb1BbRysj3`z!(lo^=q9Dmw{_)&Ykac-Ub)luuWH1X}kKmQVv)fj+ ziOcL}p}AS$i3%v-CaoW}#TV91_fSitLCoX=3{bu@5Z zLoS;ow!8%*I^*ojEQ{G>_QN8f!qvnV@-;5sssf>ztK@hG?TrAU{-HQBhKn zS79wNRpeVO<@s`FPB(E}mnIVUr!)6*PNh0k>fS(8Ack+IpJCIxei9H=?Eb|_~R;z|#Lmy?x z@^}T0_&z95b+-|_@wN{DHc@Gp<<~YrU3wtha6yaq4?)DP6dCzeClO7+5tGpb<|yDE zQ-e#CBH9y~j{wH2g)z)AfO%EH$iDY%rV?=J6co!G2fRrYKI#NOYzhcD;tA4ZJbm0r z;O)ZOr=U+KeNP{hYk)+KPo*IZeF}i29m++yi0y;r2b99d_tcXSvr~~kp9Ww}P)`n? zf0CNSoB>*^8eMX2;@W=g$I*2{_O zE&?m=-k$#%ScUgy1$)q)p)_!Po$o^0&P#y1JNKN^1!)iT-7kSZWdyzKP{F@|;DQkZ zN1TdTys85Z++P7(GFq&BlVGbrg)x5v969}??m`nV1RdLX8E|(8-Q*VP9qvHTUjcu_ zpoa=x0l^0dTF*exR{^UsXqrJ`%r(HN51Q^A>i2cfk*M6b0GnMc3jE)J`>>Kbcxs1; z-2gG=?026#yBMEoMN!Pxfaw@P^{^_DGfn!Jd^bxQPiXOZvUC3cB@Wd}pa~{3-vCtI zRW@kf=ybdP`2*k{XZ^oa!{L6VC5d1 zgFUCI7>talApCKKLelLEa7QlE;-{CQ`I7NssAQ|sNIQ(lxaboq+<(xB5-E-TYyrP( zvj2-rlt58|(G$D!Q7C4!(W|_lqu{~CIp{3y9<%w4T|lXosDwFE@%~iF zcu1qCik|xD1ww9-wk$T|t}#@a|Mo0UscV|LrI|3K)Kn9$n~hldYI{JZ2S*;G?D%{i z6{DrTdz83=4=h75xN8G77klQTBx&PkT0M2fQY5Q>A|Ov@1ud0wM3z547j2?%{RGP< zL@AOhz_!IG4R3rO7MoF0Y5$YU_#0nF40=~8gvGRWV*DOR1D(=GPOU97B8=jUN zY+Hzu!j?ti8Fmv zEuLA3E|Y@&Mss*~KB>&EBD4_EwQp~Go_OGdfRb?Ua+Hee8Y!(mv;^USx(yr!KNz!7 znm|qXO=YMQQ8j*eQGJCpfy(oDS0k%V3KO%uGBTCPD)vkOjFywCWL++jyOh%S}Nc+?iEpt)Yojq zGxAZGmU=CL=*C-`kQwi6MAtQebKwU<;#kcSJ!F6JfiV zy3sQfee~NI&k;jj*}r%DDLp&BfyG2jZTpbd^MxU3T;;zR3DRJ!^}D=s`up;cCv zuKqoll0NFm64!R1I6PrJniD=%VVeY=pQIq!6;r#~36zZ887jW~tn5Y;)0Ze67@Q@C s4}2h=fNyjl9q#Q$b#s-Uz{Xok%_ghKX0w!U{+dSpAL$feZvX%Q delta 1917 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 delta 13 Vcmcb&PGH(wu7(!IElkt40RS!m1~C8t diff --git a/Password Manager/GeneratePassword.Designer.cs b/Password Manager/GeneratePassword.Designer.cs new file mode 100644 index 0000000..186a1cb --- /dev/null +++ b/Password Manager/GeneratePassword.Designer.cs @@ -0,0 +1,135 @@ +namespace Password_Manager +{ + partial class GeneratePassword + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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(); + // + // textBox1 + // + passwordName.Location = new Point(12, 33); + passwordName.Name = "textBox1"; + 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"; + // + // textBox2 + // + passwordLength.Location = new Point(12, 77); + passwordLength.Name = "textBox2"; + passwordLength.PlaceholderText = "16"; + passwordLength.Size = new Size(156, 23); + passwordLength.TabIndex = 3; + // + // checkBox1 + // + noSymbols.AutoSize = true; + noSymbols.Location = new Point(12, 106); + noSymbols.Name = "checkBox1"; + noSymbols.Size = new Size(89, 19); + noSymbols.TabIndex = 4; + noSymbols.Text = "No symbols"; + noSymbols.UseVisualStyleBackColor = true; + // + // button1 + // + generate.Location = new Point(93, 131); + generate.Name = "button1"; + generate.Size = new Size(75, 23); + generate.TabIndex = 5; + generate.Text = "Generate"; + generate.UseVisualStyleBackColor = true; + generate.Click += Generate; + // + // button2 + // + cancel.Location = new Point(12, 131); + cancel.Name = "button2"; + cancel.Size = new Size(75, 23); + cancel.TabIndex = 6; + cancel.Text = "Cancel"; + cancel.UseVisualStyleBackColor = true; + // + // 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; + } +} \ No newline at end of file diff --git a/Password Manager/GeneratePassword.cs b/Password Manager/GeneratePassword.cs new file mode 100644 index 0000000..a2f59e2 --- /dev/null +++ b/Password Manager/GeneratePassword.cs @@ -0,0 +1,48 @@ +using Password_Generator; + +namespace Password_Manager +{ + public partial class GeneratePassword : Form + { + private string currentPath; + + public GeneratePassword(string name, string currentPath) + { + InitializeComponent(); + passwordName.Text = name; + this.currentPath = currentPath; + } + + 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); + } + + bool valid = false; + while (!valid) + { + try + { + StreamWriter sw = new StreamWriter(currentPath + $"{passwordName.Text}.txt"); //TODO: rename to .gpg when encryption is possible + valid = true; + sw.Write(Generator.New(Convert.ToInt32(passwordLength.Text), noSymbols.Checked)); + sw.Close(); + } + catch (FormatException) + { + MessageBox.Show("Please enter a valid number for the password's length.", "Error: Invalid field", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + catch (ArgumentNullException error) + { + MessageBox.Show(error.ToString(), "Error: No profile path", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + catch (IOException error) + { + MessageBox.Show(error.ToString(), "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } +} diff --git a/Password Manager/GeneratePassword.resx b/Password Manager/GeneratePassword.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Password Manager/GeneratePassword.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Password Manager/MainForm.Designer.cs b/Password Manager/MainForm.Designer.cs index cf66e95..2f7fbb8 100644 --- a/Password Manager/MainForm.Designer.cs +++ b/Password Manager/MainForm.Designer.cs @@ -29,29 +29,34 @@ private void InitializeComponent() { searchBox = new TextBox(); - resultList = new ResultListBox(); + resultList = new PasswordListBox(); profileSelection = new ComboBox(); addProfile = new Button(); removeProfile = new Button(); + generatePassword = new Button(); SuspendLayout(); // // searchBox // - searchBox.Location = new Point(12, 27); + 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(257, 27); + searchBox.Size = new Size(225, 23); searchBox.TabIndex = 0; searchBox.TextChanged += resultList.ReloadResults; // // resultList // resultList.FormattingEnabled = true; - resultList.ItemHeight = 20; - resultList.Location = new Point(12, 60); + resultList.ItemHeight = 15; + resultList.Location = new Point(10, 45); + resultList.Margin = new Padding(3, 2, 3, 2); resultList.Name = "resultList"; - resultList.Size = new Size(257, 364); + resultList.Size = new Size(225, 274); resultList.TabIndex = 1; + resultList.CurrentProfilePathRequest += CurrentProfilePathRequest; + resultList.SearchQueryRequest += () => searchBox.Text; // // profileSelection // @@ -60,17 +65,19 @@ profileSelection.DropDownWidth = 200; profileSelection.FormattingEnabled = true; profileSelection.IntegralHeight = false; - profileSelection.Location = new Point(586, 26); + profileSelection.Location = new Point(513, 20); + profileSelection.Margin = new Padding(3, 2, 3, 2); profileSelection.Name = "profileSelection"; - profileSelection.Size = new Size(200, 28); + profileSelection.Size = new Size(176, 23); profileSelection.TabIndex = 2; - profileSelection.SelectedIndexChanged += ProfileHandler.ProfileChange; + profileSelection.SelectionChangeCommitted += ChangeProfile; // // addProfile // - addProfile.Location = new Point(586, 60); + addProfile.Location = new Point(513, 45); + addProfile.Margin = new Padding(3, 2, 3, 2); addProfile.Name = "addProfile"; - addProfile.Size = new Size(95, 29); + addProfile.Size = new Size(83, 22); addProfile.TabIndex = 3; addProfile.Text = "Add"; addProfile.UseVisualStyleBackColor = true; @@ -78,23 +85,36 @@ // // removeProfile // - removeProfile.Location = new Point(691, 60); + removeProfile.Location = new Point(605, 45); + removeProfile.Margin = new Padding(3, 2, 3, 2); removeProfile.Name = "removeProfile"; - removeProfile.Size = new Size(95, 29); + removeProfile.Size = new Size(83, 22); removeProfile.TabIndex = 4; removeProfile.Text = "Delete"; removeProfile.UseVisualStyleBackColor = true; // + // button1 + // + generatePassword.Location = new Point(241, 20); + generatePassword.Name = "button1"; + generatePassword.Size = new Size(75, 23); + generatePassword.TabIndex = 5; + generatePassword.Text = "Generate"; + generatePassword.UseVisualStyleBackColor = true; + generatePassword.Click += Generate; + // // MainForm // - AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); + ClientSize = new Size(700, 338); + Controls.Add(generatePassword); Controls.Add(removeProfile); Controls.Add(addProfile); Controls.Add(profileSelection); Controls.Add(resultList); Controls.Add(searchBox); + Margin = new Padding(3, 2, 3, 2); Name = "MainForm"; Text = "Password Manager"; ResumeLayout(false); @@ -103,10 +123,11 @@ #endregion - public TextBox searchBox; - public ResultListBox resultList; - public ComboBox profileSelection; - public Button addProfile; - public Button removeProfile; + private TextBox searchBox; + private PasswordListBox resultList; + private ComboBox profileSelection; + private Button addProfile; + private Button removeProfile; + private Button generatePassword; } } \ No newline at end of file diff --git a/Password Manager/MainForm.cs b/Password Manager/MainForm.cs index d33ce4c..0bdf045 100644 --- a/Password Manager/MainForm.cs +++ b/Password Manager/MainForm.cs @@ -1,24 +1,61 @@ namespace Password_Manager { + public delegate void ProfileChanges(string profileName); + public delegate string[] ProfileList(); + public delegate void Save(); public partial class MainForm : Form { - public MainForm() + public event ProfileDataRequest? CurrentProfilePathRequest; + public event ProfileDataRequest? CurrentProfileNameRequest; + public event ProfileList? CurrentProfileListRequest; + public event ProfileChanges? CurrentProfileChanged; + public event Save? SaveRequest; + + public MainForm(ProfileDataRequest CurrentProfileNameRequest, ProfileDataRequest CurrentProfilePathRequest, ProfileList CurrentProfileListRequest, ProfileChanges CurrentProfileChanged) { + this.CurrentProfileNameRequest = CurrentProfileNameRequest; + this.CurrentProfilePathRequest = CurrentProfilePathRequest; + this.CurrentProfileListRequest = CurrentProfileListRequest; + this.CurrentProfileChanged = CurrentProfileChanged; InitializeComponent(); + LoadCurrentProfile(); + + foreach (string s in CurrentProfileListRequest?.Invoke()) + { + profileSelection.Items.Add(s); + } + profileSelection.SelectedIndex = 0; + + SaveRequest?.Invoke(); + } + + private void LoadCurrentProfile() + { + this.Text = CurrentProfileNameRequest?.Invoke(); + resultList.ReloadResults(); } private void ChangeProfile(object sender, EventArgs e) { - ComboBox cb = (ComboBox)sender; - ProfileHandler.CurrentProfile = ProfileHandler.ListOfProfiles.SearchByName(cb.Text); - searchBox.Clear(); - this.Text = ProfileHandler.CurrentProfile == null ? "Password Manager" : $"Current profile: {ProfileHandler.CurrentProfile.Name}"; + CurrentProfileChanged?.Invoke(profileSelection.Text); + + foreach (string s in CurrentProfileListRequest?.Invoke()) + { + profileSelection.Items.Add(s); + } } private void AddProfile(object sender, EventArgs e) { NewProfileForm npf = new NewProfileForm(); + npf.ReloadPasswordsRequest += () => resultList.ReloadResults(); npf.Show(); } + + private void Generate(object sender, EventArgs e) + { + GeneratePassword gp = new GeneratePassword(searchBox.Text, CurrentProfilePathRequest?.Invoke()); + gp.Show(); + } } } \ No newline at end of file diff --git a/Password Manager/NewProfileForm.cs b/Password Manager/NewProfileForm.cs index 7b0407b..f3d1222 100644 --- a/Password Manager/NewProfileForm.cs +++ b/Password Manager/NewProfileForm.cs @@ -1,17 +1,12 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace Password_Manager +namespace Password_Manager { + public delegate void NewProfile(string profileName, string profilePath); + public delegate void ReloadPasswords(); public partial class NewProfileForm : Form { + public event NewProfile NewProfileRequest; + public event ReloadPasswords ReloadPasswordsRequest; + public NewProfileForm() { InitializeComponent(); @@ -30,10 +25,8 @@ namespace Password_Manager { if (nameTextBox.Text != "" && pathTextBox.Text != "") { - Profile profile = new Profile(nameTextBox.Text, pathTextBox.Text); - ProfileHandler.ListOfProfiles.Add(profile); - ProfileHandler.CurrentProfile = profile; - Program.mainForm.resultList.ReloadResults(); + NewProfileRequest?.Invoke(nameTextBox.Text, pathTextBox.Text); + ReloadPasswordsRequest?.Invoke(); this.Close(); } else diff --git a/Password Manager/Password Manager.csproj.user b/Password Manager/Password Manager.csproj.user index d61e8d1..b307696 100644 --- a/Password Manager/Password Manager.csproj.user +++ b/Password Manager/Password Manager.csproj.user @@ -1,13 +1,16 @@  + + Form + Form Form - + Component diff --git a/Password Manager/PasswordGenerator.cs b/Password Manager/PasswordGenerator.cs new file mode 100644 index 0000000..4a2394c --- /dev/null +++ b/Password Manager/PasswordGenerator.cs @@ -0,0 +1,34 @@ +using System.Text; + +namespace Password_Generator +{ + static class Generator + { + public static string New(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(); + } + } +} diff --git a/Password Manager/PasswordListBox.cs b/Password Manager/PasswordListBox.cs new file mode 100644 index 0000000..c5773a4 --- /dev/null +++ b/Password Manager/PasswordListBox.cs @@ -0,0 +1,47 @@ +namespace Password_Manager +{ + public delegate string SearchQuery(); + public class PasswordListBox : ListBox + { + public event ProfileDataRequest? CurrentProfilePathRequest; + public event SearchQuery? SearchQueryRequest; + + public PasswordListBox() : base() { } + + public void ReloadResults(object sender = null, EventArgs arg = null) + { + DirectoryInfo d; + FileInfo[] files = new FileInfo[0]; + try + { + d = new DirectoryInfo(CurrentProfilePathRequest?.Invoke()); + files = d.GetFiles("*.gpg"); + } catch (ArgumentNullException e) + { + MessageBox.Show(e.ToString(), "Error: Invalid profile path", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + string[] arrayTmp = new string[files.Length]; + for (int i = 0; i < arrayTmp.Length; i++) + { + arrayTmp[i] = files[i].Name; + } + List elements = new List(arrayTmp); + + string[] copy = elements.ToArray(); + string searchQuery = SearchQueryRequest?.Invoke(); + if (searchQuery != "") //we have a search query + { + foreach (string s in copy) + { + if (!s.Contains(searchQuery)) + { + elements.Remove(s); + } + } + } + + this.DataSource = elements; + } + } +} diff --git a/Password Manager/IList.cs b/Password Manager/Profiles/IList.cs similarity index 93% rename from Password Manager/IList.cs rename to Password Manager/Profiles/IList.cs index 34fa6d4..0d89055 100644 --- a/Password Manager/IList.cs +++ b/Password Manager/Profiles/IList.cs @@ -1,6 +1,4 @@ -using System; - -namespace Password_Manager +namespace Profiles { abstract class IList { diff --git a/Password Manager/Profiles/Profile.cs b/Password Manager/Profiles/Profile.cs index fddb468..fcbec87 100644 --- a/Password Manager/Profiles/Profile.cs +++ b/Password Manager/Profiles/Profile.cs @@ -1,10 +1,6 @@ -using System; - -namespace Password_Manager +namespace Profiles { - public delegate void PasswordStoreChange(); - - sealed class Profile + public sealed class Profile { public string Name { get; } //the name of the password store profile ("personal", "work", or similar) public string Path { get; } //path of the folder containing the password store diff --git a/Password Manager/Profiles/ProfileHandler.cs b/Password Manager/Profiles/ProfileHandler.cs index 60a1a7f..d14d3f2 100644 --- a/Password Manager/Profiles/ProfileHandler.cs +++ b/Password Manager/Profiles/ProfileHandler.cs @@ -1,17 +1,89 @@ -using System; +using Password_Manager; +using Microsoft.VisualBasic.FileIO; -namespace Password_Manager +namespace Profiles { static class ProfileHandler { public static Profile CurrentProfile; public static ProfileList ListOfProfiles; + private static string filePath = SpecialDirectories.CurrentUserApplicationData + "Profiles.csv"; - public static void ProfileChange(object sender, EventArgs e) + public static void ChangeProfiles(string profileName) { - Program.mainForm.searchBox.Clear(); - Program.mainForm.resultList.ReloadResults(); - Program.mainForm.profileSelection.DataSource = ListOfProfiles; + CurrentProfile = ListOfProfiles.SearchByName(profileName); + } + + public static void Init() + { + ListOfProfiles = new ProfileList(); + + if (File.Exists(filePath)) + { + LoadProfiles(); + } + else + { + CreateProfiles(); + } + } + private static void LoadProfiles() + { + try + { + StreamReader sr = new StreamReader(filePath); + string[] lines = sr.ReadToEnd().Split("\n"); + foreach (string line in lines) + { + string[] fields = line.Split(','); + try + { + ListOfProfiles.Add(new Profile(fields[0], fields[1])); + } catch (IndexOutOfRangeException) + { + //File is messed up, creating new one + sr.Close(); + CreateProfiles(); + break; + } + } + sr.Close(); + } catch (IOException e) + { + MessageBox.Show(e.ToString(), "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private static void TrimLastLine() + { + List lines = File.ReadAllLines(filePath).ToList(); + File.WriteAllLines(filePath, lines.GetRange(0, lines.Count - 1).ToArray()); + } + + private static void CreateProfiles() + { + try + { + StreamWriter sw = new StreamWriter(filePath); + + string[] parameters = new string[2]; + + NewProfileForm np = new NewProfileForm(); + Profile firstProfile = null; + np.NewProfileRequest += (string profileName, string profilePath) => + { + firstProfile = new Profile(profileName, profilePath); + ListOfProfiles.Add(firstProfile); + ChangeProfiles(firstProfile.Name); + sw.WriteLine($"{firstProfile.Name},{firstProfile.Path}"); + sw.Close(); + TrimLastLine(); + }; + np.ShowDialog(); + } catch (IOException e) + { + MessageBox.Show(e.ToString(), "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } } diff --git a/Password Manager/Profiles/ProfileList.cs b/Password Manager/Profiles/ProfileList.cs index a8eac2c..ee8073e 100644 --- a/Password Manager/Profiles/ProfileList.cs +++ b/Password Manager/Profiles/ProfileList.cs @@ -1,6 +1,4 @@ -using System; - -namespace Password_Manager +namespace Profiles { sealed class ProfileList : IList { @@ -59,5 +57,15 @@ namespace Password_Manager return result; } } + + public string[] GetNameList() + { + string[] array = new string[this.Length]; + for (int i = 0; i < this.Length; i++) + { + array[i] = this[i].Name; + } + return array; + } } } diff --git a/Password Manager/Profiles/ProfileNotFoundException.cs b/Password Manager/Profiles/ProfileNotFoundException.cs index bda9248..afcffd5 100644 --- a/Password Manager/Profiles/ProfileNotFoundException.cs +++ b/Password Manager/Profiles/ProfileNotFoundException.cs @@ -1,7 +1,4 @@ -using System; -using System.Runtime.CompilerServices; - -namespace Password_Manager +namespace Profiles { sealed class ProfileNotFoundException : Exception { diff --git a/Password Manager/Program.cs b/Password Manager/Program.cs index f0634cd..6e90c91 100644 --- a/Password Manager/Program.cs +++ b/Password Manager/Program.cs @@ -1,5 +1,8 @@ +using Profiles; + namespace Password_Manager { + public delegate string ProfileDataRequest(); internal static class Program { /// @@ -8,11 +11,17 @@ namespace Password_Manager [STAThread] static void Main() { - ProfileHandler.ListOfProfiles = new ProfileList(); ApplicationConfiguration.Initialize(); + ProfileHandler.Init(); + Application.Run(mainForm); } - public static MainForm mainForm = new MainForm(); + public static MainForm mainForm = new MainForm( + () => ProfileHandler.CurrentProfile.Name, + () => ProfileHandler.CurrentProfile.Path, + () => ProfileHandler.ListOfProfiles.GetNameList(), + (profileName) => ProfileHandler.ChangeProfiles(profileName) + ); //needed at creation so that MainForm may pass this method down to other classes in its constructor } } \ No newline at end of file diff --git a/Password Manager/ResultListBox.cs b/Password Manager/ResultListBox.cs deleted file mode 100644 index 1cb2027..0000000 --- a/Password Manager/ResultListBox.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -namespace Password_Manager -{ - public class ResultListBox : ListBox - { - public ResultListBox() : base() { } - - public void ReloadResults() - { - DirectoryInfo d = new DirectoryInfo(ProfileHandler.CurrentProfile.Path); - FileInfo[] files = d.GetFiles("*.gpg"); - string[] arrayTmp = new string[files.Length]; - for (int i = 0; i < arrayTmp.Length; i++) - { - arrayTmp[i] = files[i].Name; - } - List elements = new List(arrayTmp); - - string[] copy = elements.ToArray(); - if (Program.mainForm.searchBox.Text != "") //we have a search query - { - foreach (string s in copy) - { - if (!s.Contains(Program.mainForm.searchBox.Text)) - { - elements.Remove(s); - } - } - } - - this.DataSource = elements; - } - - public void ReloadResults(object o, EventArgs e) //needed so that I can subscribe this method to a delegate in MainForm - { - ReloadResults(); - } - } -} diff --git a/Password Manager/obj/Debug/net7.0-windows/Password Manager.GeneratedMSBuildEditorConfig.editorconfig b/Password Manager/obj/Debug/net7.0-windows/Password Manager.GeneratedMSBuildEditorConfig.editorconfig index 3affcda..76747c7 100644 --- a/Password Manager/obj/Debug/net7.0-windows/Password Manager.GeneratedMSBuildEditorConfig.editorconfig +++ b/Password Manager/obj/Debug/net7.0-windows/Password Manager.GeneratedMSBuildEditorConfig.editorconfig @@ -14,4 +14,4 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = Password_Manager -build_property.ProjectDir = C:\Users\RichardMiskolczi\Password Manager\Password Manager\ +build_property.ProjectDir = C:\Users\Typo\Projects\Windows-Password-Manager\Password Manager\ diff --git a/Password Manager/obj/Debug/net7.0-windows/Password Manager.assets.cache b/Password Manager/obj/Debug/net7.0-windows/Password Manager.assets.cache index 0f81bb2b97c6b3d530e63c17cb66138545bdc947..83257b2a4d8a3d56bdff84929c25dc2007579f1d 100644 GIT binary patch literal 151 zcmWIWc6a1qU|_giK7~iQB1wz=j^?aSWi_#$3sU7OJU=Tn>9uOK+}mzG8K{O>zz9?* l=WG=dTAW%`91~JmkRPL$SDKz$5>t?voSm4SS{y^jC;$ik8)yIk literal 163 zcmWIWc6a1qU|_g)O6OQQmyrTb{nMs8t;r@)wpvqG?Tb&C5tTCQ>urmc`9L+q0!E-h yEoZBk(Bjmh;+UY!~R@ywdd4l9+NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\RichardMiskolczi\.nuget\packages\ + C:\Users\Typo\.nuget\packages\ PackageReference 6.5.0 - + \ No newline at end of file diff --git a/Password Manager/obj/project.assets.json b/Password Manager/obj/project.assets.json index 45f1b26..b9d987f 100644 --- a/Password Manager/obj/project.assets.json +++ b/Password Manager/obj/project.assets.json @@ -8,19 +8,19 @@ "net7.0-windows7.0": [] }, "packageFolders": { - "C:\\Users\\RichardMiskolczi\\.nuget\\packages\\": {} + "C:\\Users\\Typo\\.nuget\\packages\\": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\RichardMiskolczi\\Password Manager\\Password Manager\\Password Manager.csproj", + "projectUniqueName": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj", "projectName": "Password Manager", - "projectPath": "C:\\Users\\RichardMiskolczi\\Password Manager\\Password Manager\\Password Manager.csproj", - "packagesPath": "C:\\Users\\RichardMiskolczi\\.nuget\\packages\\", - "outputPath": "C:\\Users\\RichardMiskolczi\\Password Manager\\Password Manager\\obj\\", + "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\\RichardMiskolczi\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\Typo\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ diff --git a/Password Manager/obj/project.nuget.cache b/Password Manager/obj/project.nuget.cache index c3c051c..6a33339 100644 --- a/Password Manager/obj/project.nuget.cache +++ b/Password Manager/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "j+Af3msCh5F346C/nQWI7qovMW8Vd2PEbp7ynx42JtS4tfpFIR2p1HtRmEyrqVdFgQ1kz/RvVO6rZ8LL+kAtoA==", + "dgSpecHash": "pORlMyjnmPISFrdLakbVEwbRIXTIF7StLLdawRpMvRY01tBOhcBNA+U3VV7qwceV2a898Rx6Vw+s/NGbmgKQVQ==", "success": true, - "projectFilePath": "C:\\Users\\RichardMiskolczi\\Password Manager\\Password Manager\\Password Manager.csproj", + "projectFilePath": "C:\\Users\\Typo\\Projects\\Windows-Password-Manager\\Password Manager\\Password Manager.csproj", "expectedPackageFiles": [], "logs": [] } \ No newline at end of file