1. Patrick Schaller
  2. KeePassTrueCryptMount

Commits

Patrick Schaller  committed 94b2a46

New Features:
TrueCryptOptions: Options dialog for setup TrueCrypt executable and another nice option.
KeepassTrueCryptMountExt: added nice feature with the shift key; press shift inside of the entry menu item.
Tasks:
Moved some code to better locations.
Changed the namespace of the project.
TrueCryptMountForm: changed button form save to apply, changes must be applied before can used for mount operation.

Duration 9h

  • Participants
  • Parent commits 3b3a929
  • Branches master

Comments (0)

Files changed (31)

File KeepassTrueCryptMount.sln

View file
  • Ignore whitespace
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Express 2012 for Windows Desktop
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeepassTrueCryptMount", "src\KeepassTrueCryptMount\KeepassTrueCryptMount.csproj", "{82CE2EA5-3D2F-44DF-A5D2-89DD2E911469}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassTrueCryptMount", "src\KeepassTrueCryptMount\KeePassTrueCryptMount.csproj", "{82CE2EA5-3D2F-44DF-A5D2-89DD2E911469}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

File License.txt

View file
  • Ignore whitespace
+KeePass.TrueCryptMount: Copyright (c) 2010-2013 Patrick Schaller
+
+The software is distributed under the terms of the GNU General Public
+License version 2 or later.
+
+
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

File LicenseInfo.txt

View file
  • Ignore whitespace
+Plugin for KeePass Password Safe - The Open-Source Password Manager
+KeePass.TrueCryptMount
+Copyright (C) 2010-2013 Patrick Schaller
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+References of other Authors and Artists.
+
+-------------------------------Code----------------------------------------
+
+File path regurlar expression
+	Author:		FailedDev
+			http://stackoverflow.com/users/880096/faileddev
+	Source:		http://stackoverflow.com/a/7804916
+
+
+-------------------------------Icons---------------------------------------
+
+TrueCrypt-Icon: 
+	Artist:		Unknown
+	Source:		http://truecrypt.org
+
+Registry-Icon:
+	Artist:		TpdkDesign.net
+	Iconset:	Refresh CI Icons
+	License:	Free for non-commercial use.
+	Source:		http://www.iconarchive.com
+
+ReloadButton-Icon:
+	Artist:		Deleket
+	Iconset: 	Plastic Mini Icons
+	License: 	CC Attribution-Noncommercial-No Derivate 3.0
+	Source:		http://www.iconarchive.com

File src/KeepassTrueCryptMount/App.config

  • Ignore whitespace
-<?xml version="1.0"?>
-<configuration>
-  <appSettings>
-    <add key="truecrypt.executable" value="C:\Program Files\TrueCrypt\TrueCrypt.exe"/>
-    <add key="truecrypt.menuitem.always.visible" value="true"/>
-  </appSettings>
-  <startup>
-    <supportedRuntime version="v2.0.50727" sku="Client"/>
-  </startup>
-</configuration>

File src/KeepassTrueCryptMount/AssemblySettingKeys.cs

  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace KeepassTrueCryptMount
-{
-    internal static class AssemblySettingKeys
-    {
-        public const string TrueCryptExecuteable = "truecrypt.executable";
-
-        public const string TrueCryptMenuItemAlwaysVisible = "truecrypt.menuitem.always.visible";
-    }
-}

File src/KeepassTrueCryptMount/AssemblySettings.cs

  • Ignore whitespace
-using System.Collections;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Xml;
-
-namespace KeepassTrueCryptMount
-{
-    /// <summary>
-    /// A class for reading settings of an assembly file.
-    /// </summary>
-    /// <example>
-    /// AssemblySettings usage:
-    /// <para/>
-    /// If you know the keys you're after, the following is probably
-    /// the most convenient:
-    /// <code> 
-    /// AssemblySettings settings = new AssemblySettings();
-    /// string someSetting1 = settings["someKey1"];
-    /// string someSetting2 = settings["someKey2"];
-    /// </code>
-    /// <para/>
-    /// If you want to enumerate over the settings (or just as an
-    /// alternative approach), you can do this too:
-    /// <code>
-    /// IDictionary settings = AssemblySettings.GetConfig();
-    /// foreach (DictionaryEntry entry in settings)
-    /// {
-    ///     // Use entry.Key or entry.Value as desired...
-    /// }
-    /// </code>
-    /// In either of the above two scenarios, the calling assembly
-    /// (the one that called the constructor or GetConfig) is used
-    /// to determine what file to parse and what the name of the
-    /// settings collection element is.  For example, if the calling
-    /// assembly is c:\foo\bar\TestLib.dll, then the configuration file
-    /// that's parsed is c:\foo\bar\TestLib.dll.config, and the
-    /// configuration section that's parsed must be named &lt;assemblySettings&gt;.
-    /// <para/>
-    /// To retrieve the configuration information for an arbitrary assembly,
-    /// use the overloaded constructor or GetConfig method that takes an
-    /// Assembly reference as input.
-    /// <para/>
-    /// If your assembly is being automatically downloaded from a web
-    /// site by an "href-exe" (an application that's run directly from a link
-    /// on a web page), then the enclosed web.config shows the mechanism
-    /// for allowing the AssemblySettings library to download the
-    /// configuration files you're using for your assemblies (while not
-    /// allowing web.config itself to be downloaded).
-    /// <para/>
-    /// If the assembly you are trying to use this with is installed in, and loaded
-    /// from, the GAC then you'll need to place the config file in the GAC directory where
-    /// the assembly is installed.  On the first release of the CLR, this directory is
-    /// %windir%\assembly\gac\libName\verNum__pubKeyToken.  For example,
-    /// the assembly "SomeLib, Version=1.2.3.4, Culture=neutral, PublicKeyToken=abcd1234"
-    /// would be installed to the c:\winnt\assembly\gac\SomeLib\1.2.3.4__abcd1234 diretory
-    /// (assuming the OS is installed in c:\winnt).  For future versions of the CLR, this
-    /// directory scheme may change, so you'll need to check the <code>CodeBase</code> property
-    /// of a GAC-loaded assembly in the debugger to determine the correct directory location.
-    /// </example>
-    /// <remarks>
-    /// Author: Mike Woodring
-    /// http://www.bearcanyon.com
-    /// </remarks>
-    public class AssemblySettings
-    {
-        /// <summary>The dictionary of the key value pair settings.</summary>
-        private IDictionary settings;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="AssemblySettings"/> class.
-        /// </summary>
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        public AssemblySettings()
-            : this(Assembly.GetCallingAssembly())
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="AssemblySettings"/> class.
-        /// </summary>
-        /// <param name="asm">The assembly.</param>
-        public AssemblySettings(Assembly asm)
-        {
-            if (asm == null)
-            {
-                this.settings = new Dictionary<string, string>();
-            }
-            else
-            {
-                this.settings = GetConfig(asm);               
-            }
-        }
-
-        /// <summary>
-        /// Gets the value of the specified key.
-        /// </summary>
-        /// <param name="key">Key of the configuration parameter.</param>
-        /// <value>The value of the specified key.</value>
-        public string this[string key]
-        {
-            get
-            {
-                string settingValue = null;
-
-                if (this.settings != null)
-                {
-                    settingValue = this.settings[key] as string;
-                }
-
-                return settingValue ?? string.Empty;
-            }
-        }
-
-        /// <summary>
-        /// Gets the configuration of the current assembly.
-        /// </summary>
-        /// <returns>A dictionary containing the assembly settings.</returns>
-        public static IDictionary GetConfig()
-        {
-            return GetConfig(Assembly.GetCallingAssembly());
-        }
-
-        /// <summary>
-        /// Gets the configuration of the specified assembly.
-        /// </summary>
-        /// <param name="asm">An assembly.</param>
-        /// <returns>A dictionary containing the assembly settings.</returns>
-        public static IDictionary GetConfig(Assembly asm)
-        {
-            if (asm == null)
-            {
-                return new Dictionary<string, string>();
-            }
-
-            // Open and parse configuration file for specified
-            // assembly, returning collection to caller for future
-            // use outside of this class.
-            try
-            {
-                string cfgFile = asm.CodeBase + ".config";
-                const string NodeName = "appSettings";
-
-                XmlDocument doc = new XmlDocument();
-                doc.Load(new XmlTextReader(cfgFile));
-
-                XmlNodeList nodes = doc.GetElementsByTagName(NodeName);
-
-                foreach (XmlNode node in nodes)
-                {
-                    if (node.LocalName == NodeName)
-                    {
-                        var handler = new DictionarySectionHandler();
-                        return (IDictionary)handler.Create(null, null, node);
-                    }
-                }
-            }
-            catch
-            {
-            }
-
-            return new Dictionary<string, string>();
-        }
-    }
-}

File src/KeepassTrueCryptMount/ChangesDetector.cs

  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-
-namespace KeepassTrueCryptMount
-{
-    public class ChangesDetector : IDisposable
-    {
-        public ChangesDetector()
-        {
-            
-        }
-
-        public void Dispose()
-        {
-            
-        }
-
-        public ChangesDetector Subscribe<TControl>(Expression<Func<TControl, EventHandler>> eventDefinition)
-        {
-            
-
-            return this;
-        }
-    }
-}

File src/KeepassTrueCryptMount/CustomConfigAccessor.cs

View file
  • Ignore whitespace
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
+{   
+    using KeePass.Plugins;
+    
+    internal static class CustomConfigAccessor
+    {
+        public static string GetTrueCryptExecutable(this IPluginHost host)
+        {
+            return host != null ? host.CustomConfig.GetString(CustomConfigKeys.TrueCryptExecuteable) : string.Empty;
+        }
+
+        public static void SetTrueCryptExecutable(this IPluginHost host, string filePath)
+        {
+            if (host != null)
+            {
+                host.CustomConfig.SetString(CustomConfigKeys.TrueCryptExecuteable, filePath);
+            }
+        }
+
+        public static bool GetTrueCryptMenuItemAlwaysVisible(this IPluginHost host)
+        {
+            return host != null ? host.CustomConfig.GetBool(CustomConfigKeys.TrueCryptMenuItemAlwaysVisible, false) : false;
+        }
+
+        public static void SetTrueCryptMenuItemAlwaysVisible(this IPluginHost host, bool value)
+        {
+            if (host != null)
+            {
+                host.CustomConfig.SetBool(CustomConfigKeys.TrueCryptMenuItemAlwaysVisible, value);
+            }
+        }
+    }
+}

File src/KeepassTrueCryptMount/CustomConfigKeys.cs

View file
  • Ignore whitespace
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
+{
+    internal static class CustomConfigKeys
+    {
+        public const string TrueCryptExecuteable = "truecrypt.exe.location";
+
+        public const string TrueCryptMenuItemAlwaysVisible = "truecrypt.menuitem.always.visible";
+    }
+}

File src/KeepassTrueCryptMount/EntryStrings.cs

View file
  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace KeepassTrueCryptMount
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
 {
     internal static class EntryStrings
     {

File src/KeepassTrueCryptMount/FormExtensions.cs

View file
  • Ignore whitespace
-using System;
-using System.Windows.Forms;
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
 
-namespace KeepassTrueCryptMount
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
 {
+    using System;
+    using System.Windows.Forms;
+
     public static class FormExtensions
     {
         public static TForm WithStartPosition<TForm>(this TForm form, FormStartPosition startPosition)

File src/KeepassTrueCryptMount/KeepassTrueCryptMount.csproj

View file
  • Ignore whitespace
     <ProjectGuid>{82CE2EA5-3D2F-44DF-A5D2-89DD2E911469}</ProjectGuid>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>KeepassTrueCryptMount</RootNamespace>
-    <AssemblyName>KeepassTrueCryptMount</AssemblyName>
+    <RootNamespace>KeePass.TrueCryptMount</RootNamespace>
+    <AssemblyName>KeePassTrueCryptMount</AssemblyName>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <FileUpgradeFlags>
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AssemblySettingKeys.cs" />
-    <Compile Include="AssemblySettings.cs" />
-    <Compile Include="ChangesDetector.cs" />
+    <Compile Include="CustomConfigAccessor.cs" />
+    <Compile Include="CustomConfigKeys.cs" />
+    <Compile Include="LanguageTexts.cs" />
+    <Compile Include="TrueCryptInfo.cs" />
     <Compile Include="EntryStrings.cs" />
     <Compile Include="FormExtensions.cs" />
-    <Compile Include="KeepassTrueCryptMountExt.cs" />
+    <Compile Include="KeePassTrueCryptMountExt.cs" />
     <Compile Include="LogicalDriveLetters.cs" />
     <Compile Include="ProcessStartInfoExtensions.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="TrueCryptMountForm.Designer.cs">
       <DependentUpon>TrueCryptMountForm.cs</DependentUpon>
     </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config" />
+    <Compile Include="TrueCryptMountForm.AutoDriveLetterComboBoxItem.cs">
+      <DependentUpon>TrueCryptMountForm.cs</DependentUpon>
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TrueCryptOptionsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TrueCryptOptionsForm.Designer.cs">
+      <DependentUpon>TrueCryptOptionsForm.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Resource1.resx">
     <EmbeddedResource Include="TrueCryptMountForm.resx">
       <DependentUpon>TrueCryptMountForm.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="TrueCryptOptionsForm.resx">
+      <DependentUpon>TrueCryptOptionsForm.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
+    <Content Include="..\..\License.txt">
+      <Link>Properties\License.txt</Link>
+    </Content>
+    <Content Include="..\..\LicenseInfo.txt">
+      <Link>Properties\LicenseInfo.txt</Link>
+    </Content>
+    <Content Include="Resources\B16x16_Button_Reload.png" />
     <Content Include="Resources\B16x16_Folder_Yellow_Open.png" />
+    <Content Include="Resources\B16x16_System_Registry.png" />
     <Content Include="Resources\B48_TrueCrypt.png" />
+    <Content Include="Resources\MenuItemSample.png" />
     <Content Include="Resources\TrueCryptError.png" />
     <Content Include="Resources\TrueCryptNormal.png" />
   </ItemGroup>

File src/KeepassTrueCryptMount/KeepassTrueCryptMountExt.cs

View file
  • Ignore whitespace
-using System;
-using System.Diagnostics;
-using System.Drawing;
-using System.IO;
-using System.Windows.Forms;
-using KeePass.Plugins;
-
-namespace KeepassTrueCryptMount
-{
-    public sealed class KeepassTrueCryptMountExt : Plugin
-    {
-        private IPluginHost application;
-        private ToolStripMenuItem trueCryptMenuItem;
-        private readonly string trueCryptExecutable;
-        private readonly bool trueCryptExecutableExists;
-        private readonly bool trueCryptMenuItemAlwaysVisible;
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
 
-        public KeepassTrueCryptMountExt()
-        {
-            var settings = AssemblySettings.GetConfig(this.GetType().Assembly);
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
 
-            // read the key of path of true crypt exe.
-            this.trueCryptExecutable = settings[AssemblySettingKeys.TrueCryptExecuteable] as string;
+namespace KeePassTrueCryptMount
+{
+    /* 
+     * It seems like a mistake, but the plugin namespace must the same
+     * than the plugin class name (with suffix Ext), so no dots allowed. 
+     * The assembly file must also have the name of the namespace.
+     */
+
+    using System;
+    using System.Diagnostics;
+    using System.Drawing;
+    using System.IO;
+    using System.Windows.Forms;
 
-            // analyze exe file exists.
-            this.trueCryptExecutableExists = File.Exists(this.trueCryptExecutable);
+    using KeePass.Plugins;
+    using KeePass.TrueCryptMount;
 
-            // read and parse menu item visibility.
-            bool.TryParse(
-                settings[AssemblySettingKeys.TrueCryptMenuItemAlwaysVisible] as string,
-                out trueCryptMenuItemAlwaysVisible);
+    public sealed class KeePassTrueCryptMountExt : Plugin
+    {
+        private IPluginHost pluginHost;
+        private ToolStripMenuItem mnuEntryTrueCryptMount;
+        private ToolStripMenuItem mnuToolsTrueCryptOptions;
+        private bool doNotHideMountWindowByShiftKey;
 
+        public KeePassTrueCryptMountExt()
+        {
         }
 
         public override Image SmallIcon
         {
             get
             {
-                return this.trueCryptExecutableExists
+                return TrueCryptInfo.ExecutableExists(this.pluginHost.GetTrueCryptExecutable())
                     ? Resource1.TrueCryptNormal
                     : Resource1.TrueCryptError;
             }
         }
 
+        private bool IsMountMenuIstAlwaysVisible
+        {
+            get
+            {
+                return this.pluginHost.GetTrueCryptMenuItemAlwaysVisible();
+            }
+        }
+        
         public override bool Initialize(IPluginHost host)
         {
-            this.application = host;
+            this.pluginHost = host;
 
-            this.application.MainWindow.EntryContextMenu.Opened += this.OnEntryContextMenuOpened;
-            this.trueCryptMenuItem = new ToolStripMenuItem("Mount True Crypt volume");
-            this.trueCryptMenuItem.ShortcutKeys = Keys.Control | Keys.T;
-            this.trueCryptMenuItem.ShowShortcutKeys = true;
-            this.trueCryptMenuItem.Click += this.OnTrueCryptMenuItemClicked;
-            this.trueCryptMenuItem.Image = Resource1.TrueCryptNormal;
-            this.application.MainWindow.EntryContextMenu.Items.Insert(4, this.trueCryptMenuItem);
+            // insert the options menu item inside of the tools menu.
+            var toolsMenuItem = this.pluginHost.MainWindow.ToolsMenu;
 
-            // in case of missing executeable, disable the menu item and load another overlay image.
-            if (!this.trueCryptExecutableExists)
-            {
-                this.trueCryptMenuItem.Enabled = false;
-                this.trueCryptMenuItem.Image = Resource1.TrueCryptError;
-            }
+            this.mnuToolsTrueCryptOptions = new ToolStripMenuItem(LanguageTexts.TCOptionsMenuItemText + LanguageTexts.MenuItemOpenDialogSuffix);
+            this.mnuToolsTrueCryptOptions.Image = Resource1.TrueCryptNormal;
+            this.mnuToolsTrueCryptOptions.Click += this.OnTrueCryptOptionsMenuItemClicked;
+
+            toolsMenuItem.DropDownItems.Add(this.mnuToolsTrueCryptOptions);
+
+            // insert the mount menu item inside of the entry menu.
+            this.pluginHost.MainWindow.EntryContextMenu.KeyDown += this.OnEntryContextMenuKeyDown;
+            this.pluginHost.MainWindow.EntryContextMenu.KeyUp += this.OnEntryContextMenuKeyUp;
+            this.pluginHost.MainWindow.EntryContextMenu.Opened += this.OnEntryContextMenuOpened;
+            this.mnuEntryTrueCryptMount = new ToolStripMenuItem();
+            this.mnuEntryTrueCryptMount.ShortcutKeys = Keys.Control | Keys.T;
+            this.mnuEntryTrueCryptMount.ShowShortcutKeys = true;
+            this.mnuEntryTrueCryptMount.Click += this.OnTrueCryptMenuItemClicked;
+            this.mnuEntryTrueCryptMount.Image = Resource1.TrueCryptNormal;
+            this.pluginHost.MainWindow.EntryContextMenu.Items.Insert(4, this.mnuEntryTrueCryptMount);
+
+            this.SetTrueCryptMountMenuMenuAppearance();
 
             return true;
         }
         
         public override void Terminate()
         {
-            this.application.MainWindow.EntryContextMenu.Opened -= this.OnEntryContextMenuOpened;
-            this.application.MainWindow.EntryContextMenu.Items.Remove(this.trueCryptMenuItem);
-            this.trueCryptMenuItem.Click -= this.OnTrueCryptMenuItemClicked;
-            this.trueCryptMenuItem.Dispose();
+            this.pluginHost.MainWindow.ToolsMenu.DropDownItems.Remove(this.mnuToolsTrueCryptOptions);
+            this.mnuToolsTrueCryptOptions.Click -= this.OnTrueCryptOptionsMenuItemClicked;
+            this.mnuToolsTrueCryptOptions.Dispose();
+            
+            this.pluginHost.MainWindow.EntryContextMenu.KeyDown -= this.OnEntryContextMenuKeyDown;
+            this.pluginHost.MainWindow.EntryContextMenu.KeyUp -= this.OnEntryContextMenuKeyUp;
+            this.pluginHost.MainWindow.EntryContextMenu.Opened -= this.OnEntryContextMenuOpened;
+            this.pluginHost.MainWindow.EntryContextMenu.Items.Remove(this.mnuEntryTrueCryptMount);
+            this.mnuEntryTrueCryptMount.Click -= this.OnTrueCryptMenuItemClicked;
+            this.mnuEntryTrueCryptMount.Dispose();
             base.Terminate();
         }
 
-        private void OnEntryContextMenuOpened(object sender, EventArgs e)
+        private void OnEntryContextMenuKeyDown(object sender, KeyEventArgs e)
         {
-            var entry = this.application.MainWindow.GetSelectedEntry(false);
-
-            if (this.trueCryptMenuItemAlwaysVisible)
+            if (e.KeyCode == Keys.ShiftKey && this.ShouldMountMenuItemAccessible())
             {
-                this.trueCryptMenuItem.Visible = true;
-                return;
+                this.mnuEntryTrueCryptMount.Text = LanguageTexts.TCMountMenuItemText + LanguageTexts.MenuItemOpenDialogSuffix;
+                this.mnuEntryTrueCryptMount.Visible = true;
+                this.doNotHideMountWindowByShiftKey = true;
             }
-
-            if (entry != null)
+        }
+        
+        private void OnEntryContextMenuKeyUp(object sender, KeyEventArgs e)
+        {
+            if (e.KeyCode == Keys.ShiftKey)
             {
-                var enabled = entry.Strings.GetSafe(EntryStrings.Enabled).ReadString();
+                if (!this.ShouldMountMenuItemAccessible())
+                {
+                    return;
+                }
+
+                var entry = this.pluginHost.MainWindow.GetSelectedEntry(false);
 
-                if (bool.TrueString.Equals(enabled))
+                if (entry.ShouldHideMountDialog())
                 {
-                    this.trueCryptMenuItem.Visible = true;
+                    this.mnuEntryTrueCryptMount.Text = LanguageTexts.TCMountMenuItemText;
                 }
                 else
                 {
-                    this.trueCryptMenuItem.Visible = false;
+                    this.mnuEntryTrueCryptMount.Text = LanguageTexts.TCMountMenuItemText + LanguageTexts.MenuItemOpenDialogSuffix;
                 }
+
+                this.doNotHideMountWindowByShiftKey = false;
+
+                this.mnuEntryTrueCryptMount.Visible = this.IsMountMenuIstAlwaysVisible || entry.HasMountSettings();
             }
-            else
+        }
+
+        private void OnEntryContextMenuOpened(object sender, EventArgs e)
+        {
+            if (!this.ShouldMountMenuItemAccessible())
             {
-                this.trueCryptMenuItem.Visible = false;
+                return;
             }
+
+            var entry = this.pluginHost.MainWindow.GetSelectedEntry(false);
+            
+            if (entry.ShouldHideMountDialog())
+            {
+                this.mnuEntryTrueCryptMount.Text = LanguageTexts.TCMountMenuItemText;
+            }
+            else
+            {
+                this.mnuEntryTrueCryptMount.Text = LanguageTexts.TCMountMenuItemText + LanguageTexts.MenuItemOpenDialogSuffix;
+            }  
+
+            this.mnuEntryTrueCryptMount.Visible = this.IsMountMenuIstAlwaysVisible || entry.HasMountSettings();
         }
 
         private void OnTrueCryptMenuItemClicked(object sender, EventArgs e)
         {
-            var entry = this.application.MainWindow.GetSelectedEntry(false);
+            var entry = this.pluginHost.MainWindow.GetSelectedEntry(false);
 
             if (entry == null)
             {
                 return;
             }
 
-            bool hideDialog;
-            {
-                var hideDialogString = entry.Strings.GetSafe(EntryStrings.MountWithoutDialog);
-
-                if (!hideDialogString.IsEmpty)
-                {
-                    bool.TryParse(hideDialogString.ReadString(), out hideDialog);
-                }
-                else
-                {
-                    hideDialog = false;
-                }
-            }
+            bool hideDialog = entry.ShouldHideMountDialog();
 
-            if (!hideDialog)
+            if (!hideDialog || this.doNotHideMountWindowByShiftKey)
             {
                 var dialog = new TrueCryptMountForm()
                     .WithShowInTaskBar(false)
                     .WithStartPosition(FormStartPosition.CenterParent)
                     .ReadFrom(entry);
 
-                var result = dialog.ShowDialog(this.application.MainWindow);
+                var result = dialog.ShowDialog(this.pluginHost.MainWindow);
 
                 if (result == DialogResult.Cancel)
                 {
                 }
 
                 // save settings
-                if (dialog.SaveWasClicked)
+                if (dialog.ChangesApplied)
                 {
                     dialog.WriteTo(entry);
                     entry.Touch(true);
-                    this.application.Database.Modified = true;
-                    this.application.MainWindow.UpdateUI(false, null, false, null, false, null, true);
+                    this.pluginHost.Database.Modified = true;
+                    this.pluginHost.MainWindow.UpdateUI(false, null, false, null, false, null, true);
                 }
             }
-        
+
             // do mount...
-            new ProcessStartInfo(this.trueCryptExecutable)
+            new ProcessStartInfo(this.pluginHost.GetTrueCryptExecutable())
                 .HideExecution()
                 .WithCommandLine(entry.ToTrueCryptArguments())
                 .Execute();
         }
+
+        private void OnTrueCryptOptionsMenuItemClicked(object sender, EventArgs e)
+        {
+            // open the plugin options dialog.
+            using (var optionsDialog = new TrueCryptOptionsForm(this.pluginHost))
+            {
+                optionsDialog.WithShowInTaskBar(false)
+                             .WithStartPosition(FormStartPosition.CenterParent)
+                             .ShowDialog(this.pluginHost.MainWindow);
+            }
+
+            this.SetTrueCryptMountMenuMenuAppearance();
+        }
+
+        /// <summary>
+        /// Changes the appearance and accessibilty of the mount menu item after option change.
+        /// </summary>
+        private void SetTrueCryptMountMenuMenuAppearance()
+        {
+            // in case of missing executeable, disable the menu item and load another overlay image.
+            if (!TrueCryptInfo.ExecutableExists(this.pluginHost.GetTrueCryptExecutable()))
+            {
+                this.mnuEntryTrueCryptMount.Enabled = false;
+                this.mnuEntryTrueCryptMount.Image = Resource1.TrueCryptError;
+            }
+            else
+            {
+                this.mnuEntryTrueCryptMount.Enabled = true;
+                this.mnuEntryTrueCryptMount.Image = Resource1.TrueCryptNormal;
+            }
+        }
+
+        /// <summary>
+        /// Checks if it is neccessary to show the mount menu item.
+        /// When nothing or more than one entries selected it hides the mount menu item.
+        /// </summary>
+        /// <returns><c>True</c> when it is neccessary to show the menu item; otherwise <c>false</c>.</returns>
+        private bool ShouldMountMenuItemAccessible()
+        {
+            var selectedEntryCount = this.pluginHost.MainWindow.GetSelectedEntriesCount();
+
+            // it makes no sense to show the menu item when no item selected or more than one.
+            if (selectedEntryCount == 0 || selectedEntryCount > 1 )
+            {
+                this.mnuEntryTrueCryptMount.Visible = false;
+                return false;
+            }
+
+            return true;
+        }
     }
 }

File src/KeepassTrueCryptMount/LanguageTexts.cs

View file
  • Ignore whitespace
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
+{
+    static class LanguageTexts
+    {
+        public const string MenuItemOpenDialogSuffix = "...";
+
+        public const string BannerPluginTitleText = "TrueCrypt Mount Helper Plugin";
+
+        public const string BannerOptionsDescriptionText = "Setup TrueCrypt options";
+
+        public const string BannerMountFormDescriptionText = "Edit the TrueCrypt mount settings";
+
+        public const string TCMountMenuItemText = "Mount volume";
+
+        public const string TCOptionsMenuItemText = "TrueCrpyt Plugin Options";
+    }
+}

File src/KeepassTrueCryptMount/LogicalDriveLetters.cs

View file
  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
 
-namespace KeepassTrueCryptMount
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
 {
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Linq;
+    using System.Text;
+
     internal static class LogicalDriveLetters
     {
         static LogicalDriveLetters()
         {
             get
             {
-                return AllDriveLetters.Except(DriveInfo.GetDrives().Select(di => di.Name));
+                string[] usedDriveLetters = null;
+
+                try
+                {
+                    usedDriveLetters = DriveInfo.GetDrives().Select(di => di.Name).ToArray();
+                }
+                catch (IOException)
+                {
+                }
+                catch(UnauthorizedAccessException) 
+                {
+                }
+
+                return usedDriveLetters == null ? AllDriveLetters : AllDriveLetters.Except(usedDriveLetters);
             }
         }
 

File src/KeepassTrueCryptMount/ProcessStartInfoExtensions.cs

View file
  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Text;
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
 
-namespace KeepassTrueCryptMount
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
 {
+    using System;
+    using System.ComponentModel;
+    using System.Diagnostics;
+    using System.IO;
+    using System.Windows.Forms;
+    
     public static class ProcessStartInfoExtensions
     {
         public static void ExecuteAndWait(this ProcessStartInfo info)
                 return;
             }
 
-            var process = Process.Start(info);
-            
-            if (process != null)
+            try
+            {
+                var process = Process.Start(info);
+
+                if (process != null)
+                {
+                    process.WaitForExit();
+                }
+                else
+                {
+                    Console.WriteLine("Process could not start.");
+                }
+            }
+            catch (InvalidOperationException ex)
+            {
+                ShowInvalidOperationExceptionMessageBox(ex);
+            }
+            catch (FileNotFoundException)
             {
-                process.WaitForExit();
+                ShowFileNotFoundExceptionMessageBox(info.FileName);
             }
-            else
+            catch (Win32Exception ex)
             {
-                Console.WriteLine("Process could not start.");
+                ShowWin32ExceptionMessageBox(ex);
+            }
+            catch (SystemException)
+            {
+                // maybe process execution is to fast for WaitForExit.
             }
         }
 
+        public static void Execute(string fileNameOrUri)
+        {
+            Execute(new ProcessStartInfo(fileNameOrUri));
+        }
+
         public static void Execute(this ProcessStartInfo info)
         {
             if (info == null)
                 return;
             }
 
-            var process = Process.Start(info);
-
-            if (process != null)
+            try
             {
-                process.Start();
+                Process.Start(info);
+            }
+            catch (InvalidOperationException ex)
+            {
+                ShowInvalidOperationExceptionMessageBox(ex);
+            }
+            catch (FileNotFoundException)
+            {
+                ShowFileNotFoundExceptionMessageBox(info.FileName);
+            }
+            catch (Win32Exception ex)
+            {
+                ShowWin32ExceptionMessageBox(ex);
             }
         }
 
             info.Arguments = arguments;
             return info;
         }
+
+        private static void ShowInvalidOperationExceptionMessageBox(InvalidOperationException exception)
+        {
+            MessageBox.Show(
+                string.Format("TrueCrypt process could not start.{0}{1}", Environment.NewLine, exception.Message),
+                "InvalidOperationException",
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Error);
+        }
+
+        private static void ShowFileNotFoundExceptionMessageBox(string fileName)
+        {
+            MessageBox.Show(
+                string.Format("TrueCrypt executable was not found.{0}{1}", Environment.NewLine, fileName),
+                "FileNotFoundException",
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Error);
+        }
+
+        private static void ShowWin32ExceptionMessageBox(Win32Exception exception)
+        {
+            MessageBox.Show(
+                string.Format("TrueCrypt process could not start.{0}{1}", Environment.NewLine, exception.Message),
+                "Win32Exception",
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Error);
+        }
     }
 }

File src/KeepassTrueCryptMount/Properties/AssemblyInfo.cs

View file
  • Ignore whitespace
 // General Information about an assembly is controlled through the following 
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
-[assembly: AssemblyTitle("KeepassTrueCryptMount")]
-[assembly: AssemblyDescription("Plugin to mount true crypt volumes")]
+[assembly: AssemblyTitle("KeePassTrueCryptMount")]
+[assembly: AssemblyDescription("Plugin to mount TrueCrypt volumes")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Schaller Patrick home.inc")]
+[assembly: AssemblyCompany("Schaller Patrick")]
 [assembly: AssemblyProduct("KeePass Plugin")]
-[assembly: AssemblyCopyright("Copyright © Schaller Patrick 2010")]
+[assembly: AssemblyCopyright("Copyright © Schaller Patrick 2013")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.0.9.*")]
-[assembly: AssemblyFileVersion("2.0.9.0")]
+[assembly: AssemblyVersion("2.0.10.*")]
+[assembly: AssemblyFileVersion("2.0.10.0")]

File src/KeepassTrueCryptMount/PwEntryExtension.cs

View file
  • Ignore whitespace
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using KeePassLib;
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
 
-namespace KeepassTrueCryptMount
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
 {
+    using System;
+    using System.Text;
+
+    using KeePassLib;
+
     internal static class PwEntryExtension
     {
         public static string ToTrueCryptArguments(this PwEntry entry)
             
             return arguments.ToString();
         }
+
+        public static bool ShouldHideMountDialog(this PwEntry entry)
+        {
+            if (entry == null)
+            {
+                return true;
+            }
+
+            bool hideDialog;
+            var hideDialogString = entry.Strings.GetSafe(EntryStrings.MountWithoutDialog);
+
+            if (!hideDialogString.IsEmpty)
+            {
+                bool.TryParse(hideDialogString.ReadString(), out hideDialog);
+            }
+            else
+            {
+                hideDialog = false;
+            }
+
+            return hideDialog;
+        }
+
+        public static bool HasMountSettings(this PwEntry entry)
+        {
+            if (entry == null)
+            {
+                return false;
+            }
+
+            return bool.TrueString.Equals(entry.Strings.GetSafe(EntryStrings.Enabled).ReadString());
+        }
     }
 }

File src/KeepassTrueCryptMount/Resource1.Designer.cs

View file
  • Ignore whitespace
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:2.0.50727.3603
+//     Dieser Code wurde von einem Tool generiert.
+//     Laufzeitversion:4.0.30319.18034
 //
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
+//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+//     der Code erneut generiert wird.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace KeepassTrueCryptMount {
+namespace KeePass.TrueCryptMount {
     using System;
     
     
     /// <summary>
-    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    ///   Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
     /// </summary>
-    // This class was auto-generated by the StronglyTypedResourceBuilder
-    // class via a tool like ResGen or Visual Studio.
-    // To add or remove a member, edit your .ResX file then rerun ResGen
-    // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+    // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+    // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+    // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class Resource1 {
         }
         
         /// <summary>
-        ///   Returns the cached ResourceManager instance used by this class.
+        ///   Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         internal static global::System.Resources.ResourceManager ResourceManager {
             get {
                 if (object.ReferenceEquals(resourceMan, null)) {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KeepassTrueCryptMount.Resource1", typeof(Resource1).Assembly);
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KeePass.TrueCryptMount.Resource1", typeof(Resource1).Assembly);
                     resourceMan = temp;
                 }
                 return resourceMan;
         }
         
         /// <summary>
-        ///   Overrides the current thread's CurrentUICulture property for all
-        ///   resource lookups using this strongly typed resource class.
+        ///   Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+        ///   Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         internal static global::System.Globalization.CultureInfo Culture {
             }
         }
         
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap B16x16_Button_Reload {
+            get {
+                object obj = ResourceManager.GetObject("B16x16_Button_Reload", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
         internal static System.Drawing.Bitmap B16x16_Folder_Yellow_Open {
             get {
                 object obj = ResourceManager.GetObject("B16x16_Folder_Yellow_Open", resourceCulture);
             }
         }
         
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap B16x16_System_Registry {
+            get {
+                object obj = ResourceManager.GetObject("B16x16_System_Registry", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
         internal static System.Drawing.Bitmap B48_TrueCrypt {
             get {
                 object obj = ResourceManager.GetObject("B48_TrueCrypt", resourceCulture);
             }
         }
         
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap MenuItemSample {
+            get {
+                object obj = ResourceManager.GetObject("MenuItemSample", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
         internal static System.Drawing.Bitmap TrueCryptError {
             get {
                 object obj = ResourceManager.GetObject("TrueCryptError", resourceCulture);
             }
         }
         
+        /// <summary>
+        ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+        /// </summary>
         internal static System.Drawing.Bitmap TrueCryptNormal {
             get {
                 object obj = ResourceManager.GetObject("TrueCryptNormal", resourceCulture);

File src/KeepassTrueCryptMount/Resource1.resx

View file
  • Ignore whitespace
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="B16x16_Button_Reload" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>resources\b16x16_button_reload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="B16x16_Folder_Yellow_Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>resources\b16x16_folder_yellow_open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="B16x16_System_Registry" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>resources\b16x16_system_registry.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="B48_TrueCrypt" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>resources\b48_truecrypt.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="MenuItemSample" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>resources\menuitemsample.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="TrueCryptError" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>resources\truecrypterror.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>

File src/KeepassTrueCryptMount/Resources/B16x16_Button_Reload.png

  • Ignore whitespace
Added
New image

File src/KeepassTrueCryptMount/Resources/B16x16_System_Registry.png

  • Ignore whitespace
Added
New image

File src/KeepassTrueCryptMount/Resources/MenuItemSample.png

  • Ignore whitespace
Added
New image

File src/KeepassTrueCryptMount/TrueCryptInfo.cs

View file
  • Ignore whitespace
+/*
+  Plugin for KeePass Password Safe - The Open-Source Password Manager
+  KeePassTrueCryptMount
+  Copyright (C) 2010-2013 Patrick Schaller
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+namespace KeePass.TrueCryptMount
+{
+    using System;
+    using System.Diagnostics;
+    using System.IO;
+    using System.Security;
+    using System.Security.AccessControl;
+    using System.Text;
+    using System.Text.RegularExpressions;
+
+    using KeePass.Plugins;
+
+    using Microsoft.Win32;
+    
+    public static class TrueCryptInfo
+    {
+        /*
+         *  The complete description of the file path regex pattern
+         *  Thanks to FailedDev -> http://stackoverflow.com/users/880096/faileddev
+        @"
+        (                             # Match the regular expression below and capture its match into backreference number 1
+           (                             # Match the regular expression below and capture its match into backreference number 2
+              |                             # Match either the regular expression below (attempting the next alternative only if this one fails)
+                 [a-zA-Z]                      # Match a single character in the range between “a” and “z”
+                 :                             # Match the character “:” literally
+              |                             # Or match regular expression number 2 below (the entire group fails if this one fails to match)
+                 \\                            # Match the character “\” literally
+                 \\                            # Match the character “\” literally
+                 [a-z0-9_.$]                   # Match a single character present in the list below
+                                                  # A character in the range between “a” and “z”
+                                                  # A character in the range between “0” and “9”
+                                                  # One of the characters “_.$”
+                    +                             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
+                 \\                            # Match the character “\” literally
+                 [a-z0-9_.$]                   # Match a single character present in the list below
+                                                  # A character in the range between “a” and “z”
+                                                  # A character in the range between “0” and “9”
+                                                  # One of the characters “_.$”
+                    +                             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
+           )?                            # Between zero and one times, as many times as possible, giving back as needed (greedy)
+           (                             # Match the regular expression below and capture its match into backreference number 3
+              \\                            # Match the character “\” literally
+                 ?                             # Between zero and one times, as many times as possible, giving back as needed (greedy)
+              (?:                           # Match the regular expression below
+                 [^\\/:*?""<>|\r\n]             # Match a single character NOT present in the list below
+                                                  # A \ character
+                                                  # One of the characters “/:*?""<>|”
+                                                  # A carriage return character
+                                                  # A line feed character
+                    +                             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
+                 \\                            # Match the character “\” literally
+              )+                            # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
+           )
+           [^\\/:*?""<>|\r\n]             # Match a single character NOT present in the list below
+                                            # A \ character
+                                            # One of the characters “/:*?""<>|”
+                                            # A carriage return character
+                                            # A line feed character
+              +                             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
+        )
+        "
+        */
+
+        private static Regex FilePathRegex = new Regex(@"(([a-zA-Z]:|\\\\[a-z0-9_.$]+\\[a-z0-9_.$]+)?(\\?(?:[^\\/:*?""<>|\r\n]+\\)+)[^\\/:*?""<>|\r\n]+)", RegexOptions.Compiled);
+
+        public static bool ExecutableExists(string filePath)
+        {
+            if (string.IsNullOrEmpty(filePath))
+            {
+                return false;
+            }
+
+            try
+            {
+                return File.Exists(filePath);
+            }