Advertisement
Guest User

Untitled

a guest
Nov 26th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.46 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. using System.IO;
  9. using KeePass.Forms;
  10. using KeePass.Plugins;
  11. using KeePass.UI;
  12. using KeePass.Util;
  13. using KeePassLib;
  14. using KeePass.Ecas;
  15. using KeePass.Plugins;
  16. using KeePass.Util;
  17.  
  18. using KeePassLib;
  19. using KeePassLib.Collections;
  20. using KeePassLib.Utility;
  21.  
  22. namespace KeePass
  23. {
  24. public sealed class KeePassExt : Plugin
  25. {
  26. private IPluginHost m_host = null;
  27.  
  28. internal class Entry
  29. {
  30. // Auto-implemented properties.
  31. public string Uuid { get; set; }
  32. public string Title { get; set; }
  33. public string UserName { get; set; }
  34. public string Password { get; set; }
  35. }
  36.  
  37. private IList<Entry> oldEntriesList;
  38. private IList<Entry> newEntriesLIst;//facultatif ?
  39. private IList<Entry> modifiedEntriesList;
  40.  
  41. private ToolStripSeparator m_tsSeparator = null;
  42. private ToolStripMenuItem m_tsmiPopup = null;
  43. private ToolStripMenuItem m_tsmiAddGroups = null;
  44. private ToolStripMenuItem m_tsmiAddEntries = null;
  45.  
  46. public static readonly PwUuid OpenedDatabaseFile = new PwUuid(new byte[] {
  47. 0xE5, 0xFF, 0x13, 0x06, 0x85, 0xB8, 0x41, 0x89,
  48. 0xB9, 0x06, 0xF6, 0x9E, 0x2B, 0x3B, 0x40, 0xA7
  49. });
  50.  
  51. public static readonly PwUuid ClosingDatabaseFilePost = new PwUuid(new byte[] {
  52. 0x94, 0xFA, 0x70, 0xE5, 0xB1, 0x3F, 0x41, 0x26,
  53. 0xA6, 0x4E, 0x06, 0x4F, 0xD8, 0xC3, 0x6C, 0x95
  54. });
  55.  
  56. private static readonly PwUuid CopiedEntryInfo = new PwUuid(new byte[] {
  57. 0x3F, 0x7E, 0x5E, 0xC6, 0x2A, 0x54, 0x4C, 0x58,
  58. 0x95, 0x44, 0x85, 0xFB, 0xF2, 0x6F, 0x56, 0xDC
  59. });
  60.  
  61. public override bool Initialize(IPluginHost host)
  62. {
  63. if (host == null) return false;
  64. m_host = host;
  65.  
  66. ToolStripItemCollection tsMenu = m_host.MainWindow.ToolsMenu.DropDownItems;
  67.  
  68. m_tsSeparator = new ToolStripSeparator();
  69. tsMenu.Add(m_tsSeparator);
  70.  
  71. // Add the popup menu item
  72. m_tsmiPopup = new ToolStripMenuItem();
  73. m_tsmiPopup.Text = "FormindPlugin";
  74. tsMenu.Add(m_tsmiPopup);
  75.  
  76. // Add menu item 'Add Some Groups'
  77. m_tsmiAddGroups = new ToolStripMenuItem();
  78. m_tsmiAddGroups.Text = "Choisir l'emplacement des Logs";
  79. m_tsmiAddGroups.Click += ChoosePath;
  80. m_tsmiPopup.DropDownItems.Add(m_tsmiAddGroups);
  81.  
  82. m_host.TriggerSystem.RaisingEvent += this.OnEcasEvent;
  83.  
  84. GlobalWindowManager.WindowRemoved += this.OnSavedEntry; //eventhandler sur la fermeture d'une fenetre quelconque (pas seulement une fenetre de modification d'entrée !!!)
  85.  
  86. return true;
  87. }
  88.  
  89. //Permet d'enregistrer les dates de modification de toutes les entrées ainsi que toutes les valeurs des champs
  90. internal IList<Entry> FindLastModEnt(PwDatabase pd)
  91. {
  92. PwObjectList<PwEntry> lEntries = m_host.Database.RootGroup.GetEntries(true);
  93. IList<Entry> lResults = new List<Entry>();
  94.  
  95. Entry newEntry;
  96.  
  97. foreach (PwEntry pe in lEntries)
  98. {
  99.  
  100. newEntry = new Entry{Uuid = pe.Uuid.ToHexString() , UserName = pe.Strings.ReadSafe(PwDefs.UserNameField), Title = pe.Strings.ReadSafe(PwDefs.TitleField), Password = pe.Strings.ReadSafe(PwDefs.PasswordField) };
  101. lResults.Add(newEntry);
  102. }
  103.  
  104. return lResults;
  105. }
  106.  
  107. //Permet de comparer deux listes d'Entry/PwEntry
  108. internal void EntriesListCompare(IList<Entry> oldEntriesList, PwEntry selectedEntry)
  109. {
  110. PwObjectList<PwEntry> lEntries = m_host.Database.RootGroup.GetEntries(true);
  111.  
  112. foreach (Entry e in oldEntriesList)
  113. {
  114. if(e.Uuid.Equals(selectedEntry.Uuid.ToHexString())) //si l'élément est bien le même au niveau du ID
  115. {
  116. if (e.Title != selectedEntry.Strings.ReadSafe(PwDefs.TitleField))
  117. {
  118. // genere un log disant que l'entrée en question a été modifiée sous la forme "pe.LasModificationTime L'entrée e.Uuid a été modifié / oldTitle : ... - newTitle : ...
  119. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", selectedEntry.LastModificationTime + " L'entrée " + e.Uuid + " à été modifié / oldTitle : " + e.Title + " - newTitle : " + selectedEntry.Strings.ReadSafe(PwDefs.TitleField) + Environment.NewLine);
  120. e.Title = selectedEntry.Strings.ReadSafe(PwDefs.TitleField); //on met à jour la oldEntriesList en cas de re-modification
  121. }
  122. if (e.UserName != selectedEntry.Strings.ReadSafe(PwDefs.UserNameField))
  123. {
  124. // genere un log disant que l'entrée en question a été modifiée sous la forme "pe.LasModificationTime L'entrée e.Uuid.ToHexString() a été modifié / oldUserName : ... - newUserName : ...
  125. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", selectedEntry.LastModificationTime + " L'entrée " + e.Uuid + " à été modifié / oldUsername : " + e.UserName + " - newUsername : " + selectedEntry.Strings.ReadSafe(PwDefs.UserNameField) + Environment.NewLine);
  126. e.UserName = selectedEntry.Strings.ReadSafe(PwDefs.UserNameField); //on met à jour la oldEntriesList en cas de re-modification
  127. }
  128. if (e.Password != selectedEntry.Strings.ReadSafe(PwDefs.PasswordField))
  129. {
  130. // genere un log disant que l'entrée en question a été modifiée sous la forme "pe.LasModificationTime L'entrée e.Uuid.ToHexString() a été modifié / oldPassword : ... - newPassword : ...
  131. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", selectedEntry.LastModificationTime + " L'entrée " + e.Uuid + " à été modifié / oldPassword : " + e.Password + " - newPassword : " + selectedEntry.Strings.ReadSafe(PwDefs.PasswordField) + Environment.NewLine);
  132. e.Password = selectedEntry.Strings.ReadSafe(PwDefs.PasswordField); //on met à jour la oldEntriesList en cas de re-modification
  133. }
  134. }
  135. }
  136. }
  137.  
  138. private void OnEcasEvent(object sender, EcasRaisingEventArgs e)
  139. {
  140. if (e.Event.Type.Equals(CopiedEntryInfo))
  141. {
  142. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", m_host.MainWindow.GetSelectedEntry(true).LastAccessTime + m_host.MainWindow.GetSelectedEntry(true).Strings.ReadSafe(PwDefs.TitleField) + " has been copied to the clipboar at " + Environment.NewLine);
  143. }
  144.  
  145. // else if entrée modifiée globalwindowsmanager
  146.  
  147. else if (e.Event.Type.Equals(OpenedDatabaseFile))
  148. {
  149. //appel d'une fcontion qui enregistre l'etat actuel de la bdd
  150. oldEntriesList = FindLastModEnt(m_host.Database);
  151.  
  152. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", DateTime.Now.ToString("HH:mm:ss") + " / " + DateTime.Today.ToString("dd-MM-yyyy") + "Ouverture de la Database" + Environment.NewLine);
  153.  
  154. }
  155. else if (e.Event.Type.Equals(ClosingDatabaseFilePost))
  156. {
  157. File.AppendAllText(@"C:\Program Files (x86)\KeePass Password Safe 2\Plugins", DateTime.Now.ToString("HH:mm:ss") + " / " + DateTime.Today.ToString("dd-MM-yyyy") + "Fermeture de la Database" + Environment.NewLine);
  158.  
  159. //recuperation de l'état actuel de la bdd + comparaison avec celle enregistrée à l'ouverture de la bdd pour voir les différences et les logger
  160. EntriesListCompare(oldEntriesList, m_host.MainWindow.GetSelectedEntry(true));
  161.  
  162. //reste encore à log les ajouts et suppressions d'entrées
  163. }
  164. }
  165.  
  166. private void OnSavedEntry(object sender, GwmWindowEventArgs e)
  167. {
  168. if (!m_host.Database.IsOpen)
  169. {
  170. //Quand la base n'est pas ouverte l'instance de EntriesListCompare n'existe pas
  171. return;
  172. }
  173.  
  174. EntriesListCompare(oldEntriesList, m_host.MainWindow.GetSelectedEntry(true));
  175. }
  176.  
  177. private void ChoosePath(object sender, EventArgs e)
  178. {
  179. if (!m_host.Database.IsOpen)
  180. {
  181. MessageBox.Show("Vous devez ouvrir une database d'abord!", "Formind Plugin");
  182. return;
  183. }
  184.  
  185. MessageBox.Show("Choisissez l'emplacement où seront sauvegardés les Logs");
  186. FolderBrowserDialog dialog = new FolderBrowserDialog();
  187. dialog.Description = "Choisir un chemin";
  188. dialog.ShowDialog();
  189. if (dialog.SelectedPath.Equals(""))
  190. {
  191. return;
  192. }
  193.  
  194. // Open up filestream
  195. FileStream fs;
  196. try
  197. {
  198. fs = new FileStream(Path.Combine(dialog.SelectedPath, "Logs.txt"), FileMode.Create);
  199. }
  200. catch (UnauthorizedAccessException ex)
  201. {
  202. MessageBox.Show("Accès refusé");
  203. return;
  204. }
  205.  
  206. }
  207.  
  208. public override void Terminate()
  209. {
  210.  
  211. // Remove all of our menu items
  212. ToolStripItemCollection tsMenu = m_host.MainWindow.ToolsMenu.DropDownItems;
  213. tsMenu.Remove(m_tsSeparator);
  214. tsMenu.Remove(m_tsmiPopup);
  215. tsMenu.Remove(m_tsmiAddGroups);
  216. tsMenu.Remove(m_tsmiAddEntries);
  217.  
  218. // Important! Remove event handlers!
  219. m_host.MainWindow.FileSaved -= OnFileSaved;
  220. }
  221.  
  222. private void OnFileSaved(object sender, FileSavedEventArgs e)
  223. {
  224. MessageBox.Show("Notification received: the user has tried to save the current database to:\r\n" +
  225. m_host.Database.IOConnectionInfo.Path + "\r\n\r\nResult:\r\n" +
  226. (e.Success ? "Success" : "Failed"), "Formind Plugin",
  227. MessageBoxButtons.OK, MessageBoxIcon.Information);
  228. }
  229. }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement