ADD: Version 1.2

main
Kamal Curi 4 years ago
parent d16f40cd46
commit cac29d9a8a

@ -46,3 +46,5 @@
- 1.1 - 1.1
· Added license to source code to better comply with GPLv2; · Added license to source code to better comply with GPLv2;
· Added confirmation dialog for modification of passwords · Added confirmation dialog for modification of passwords
- 1.2
· Added search function

Binary file not shown.

@ -51,6 +51,7 @@
\begin{itemize} \begin{itemize}
\item Navigate through your passwords \item Navigate through your passwords
\item View a password (ENTER or E) \item View a password (ENTER or E)
\item Search for a passwrd (S or F6)
\item Create a new password (N or F4) \item Create a new password (N or F4)
\item Modify an existing password (M or F5) \item Modify an existing password (M or F5)
\item Copy the password to your clipboard (C or F3) \item Copy the password to your clipboard (C or F3)
@ -67,6 +68,13 @@
\subsection{View a password} \subsection{View a password}
To view a password, press ENTER. The view password window will open. You can modify, copy or delete the password in the view password window. To view a password, press ENTER. The view password window will open. You can modify, copy or delete the password in the view password window.
\subsection{Search for a password}
To search for the password for a specific service, press S. The search window will open, you can type your service's name on the window
and press ENTER to search. If no passwords are found, you'll see a warning and the query will not complete, showing all items on the
screen again. To reset your search filter, just open the search window again.\\
\textbf{Important: The search filter is case-sensitive.}
\subsection{Create a new password} \subsection{Create a new password}
To create a new password, press N, the new password window will open, first type the service name (\texttt{SRVC}), then the username (\texttt{USER}), To create a new password, press N, the new password window will open, first type the service name (\texttt{SRVC}), then the username (\texttt{USER}),
then the password (\texttt{PSWD}). \textbf{To cancel the addition of a new password, lave either the \texttt{SRVC} or the \texttt{USER} fields then the password (\texttt{PSWD}). \textbf{To cancel the addition of a new password, lave either the \texttt{SRVC} or the \texttt{USER} fields

@ -24,7 +24,7 @@ User Manual</h2>
<div class="author" ><span <div class="author" ><span
class="cmr-12">Kamal &#8217;brejela&#8217; Curi</span></div><br /> class="cmr-12">Kamal &#8217;brejela&#8217; Curi</span></div><br />
<div class="date" ><span <div class="date" ><span
class="cmr-12">January 1, 2022</span></div> class="cmr-12">January 10, 2022</span></div>
</div> </div>
<h3 class="likesectionHead"><a <h3 class="likesectionHead"><a
id="x1-1000"></a>Contents</h3> id="x1-1000"></a>Contents</h3>
@ -46,29 +46,31 @@ href="#x1-80003.1" id="QQ2-1-8">Navigate through passwords</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.2 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.2 <a
href="#x1-90003.2" id="QQ2-1-9">View a password</a></span> href="#x1-90003.2" id="QQ2-1-9">View a password</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.3 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.3 <a
href="#x1-100003.3" id="QQ2-1-10">Create a new password</a></span> href="#x1-100003.3" id="QQ2-1-10">Search for a password</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.4 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.4 <a
href="#x1-130003.4" id="QQ2-1-13">Modify a password</a></span> href="#x1-110003.4" id="QQ2-1-11">Create a new password</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.5 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.5 <a
href="#x1-140003.5" id="QQ2-1-14">Copy the password to your clipboard</a></span> href="#x1-140003.5" id="QQ2-1-14">Modify a password</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.6 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.6 <a
href="#x1-150003.6" id="QQ2-1-15">Delete a password</a></span> href="#x1-150003.6" id="QQ2-1-15">Copy the password to your clipboard</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.7 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.7 <a
href="#x1-160003.7" id="QQ2-1-16">Generate a random string</a></span> href="#x1-160003.7" id="QQ2-1-16">Delete a password</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.8 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.8 <a
href="#x1-170003.8" id="QQ2-1-17">Open the help window</a></span> href="#x1-170003.8" id="QQ2-1-17">Generate a random string</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.9 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.9 <a
href="#x1-180003.9" id="QQ2-1-18">Quit steelbox</a></span> href="#x1-180003.9" id="QQ2-1-18">Open the help window</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >3.10 <a
href="#x1-190003.10" id="QQ2-1-19">Quit steelbox</a></span>
<br /> &#x00A0;<span class="sectionToc" >4 <a <br /> &#x00A0;<span class="sectionToc" >4 <a
href="#x1-190004" id="QQ2-1-19">F.A.Q.</a></span> href="#x1-200004" id="QQ2-1-20">F.A.Q.</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >4.1 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >4.1 <a
href="#x1-200004.1" id="QQ2-1-20">Contact</a></span> href="#x1-210004.1" id="QQ2-1-21">Contact</a></span>
<br /> &#x00A0;<span class="sectionToc" >5 <a <br /> &#x00A0;<span class="sectionToc" >5 <a
href="#x1-210005" id="QQ2-1-21">Licenses</a></span> href="#x1-220005" id="QQ2-1-22">Licenses</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >5.1 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >5.1 <a
href="#x1-220005.1" id="QQ2-1-22">pyperclip</a></span> href="#x1-230005.1" id="QQ2-1-23">pyperclip</a></span>
<br /> &#x00A0;&#x00A0;<span class="subsectionToc" >5.2 <a <br /> &#x00A0;&#x00A0;<span class="subsectionToc" >5.2 <a
href="#x1-230005.2" id="QQ2-1-23">Steelbox</a></span> href="#x1-240005.2" id="QQ2-1-24">Steelbox</a></span>
</div> </div>
@ -153,43 +155,56 @@ password saved. You can:
<!--l. 53--><p class="noindent" >View a password (ENTER or E) <!--l. 53--><p class="noindent" >View a password (ENTER or E)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 54--><p class="noindent" >Create a new password (N or F4) <!--l. 54--><p class="noindent" >Search for a passwrd (S or F6)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 55--><p class="noindent" >Modify an existing password (M or F5) <!--l. 55--><p class="noindent" >Create a new password (N or F4)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 56--><p class="noindent" >Copy the password to your clipboard (C or F3) <!--l. 56--><p class="noindent" >Modify an existing password (M or F5)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 57--><p class="noindent" >Delete a password (D or Delete) <!--l. 57--><p class="noindent" >Copy the password to your clipboard (C or F3)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 58--><p class="noindent" >Generate a random string (R) <!--l. 58--><p class="noindent" >Delete a password (D or Delete)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 59--><p class="noindent" >Open the help window (H) <!--l. 59--><p class="noindent" >Generate a random string (R)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 60--><p class="noindent" >Quit Steelbox (Q)</li></ul> <!--l. 60--><p class="noindent" >Open the help window (H)
<!--l. 63--><p class="noindent" > </li>
<li class="itemize">
<!--l. 61--><p class="noindent" >Quit Steelbox (Q)</li></ul>
<!--l. 64--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.1 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.1 </span> <a
id="x1-80003.1"></a>Navigate through passwords</h4> id="x1-80003.1"></a>Navigate through passwords</h4>
<!--l. 64--><p class="noindent" >You can move around the main window with the directional keys. If you have more <!--l. 65--><p class="noindent" >You can move around the main window with the directional keys. If you have more
passwords than can fit on the screen, your list will have multiple pages. You can passwords than can fit on the screen, your list will have multiple pages. You can
change your current page with PageUp/F2 and PageDown/F1. change your current page with PageUp/F2 and PageDown/F1.
<!--l. 67--><p class="noindent" > <!--l. 68--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.2 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.2 </span> <a
id="x1-90003.2"></a>View a password</h4> id="x1-90003.2"></a>View a password</h4>
<!--l. 68--><p class="noindent" >To view a password, press ENTER. The view password window will open. You can <!--l. 69--><p class="noindent" >To view a password, press ENTER. The view password window will open. You can
modify, copy or delete the password in the view password window. modify, copy or delete the password in the view password window.
<!--l. 70--><p class="noindent" > <!--l. 72--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.3 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.3 </span> <a
id="x1-100003.3"></a>Create a new password</h4> id="x1-100003.3"></a>Search for a password</h4>
<!--l. 71--><p class="noindent" >To create a new password, press N, the new password window will open, first type <!--l. 73--><p class="noindent" >To search for the password for a specific service, press S. The search window will
open, you can type your service&#8217;s name on the window and press ENTER to search.
If no passwords are found, you&#8217;ll see a warning and the query will not complete,
showing all items on the screen again. To reset your search filter, just open the search
window again.<br
class="newline" /><span
class="cmbx-10">Important: The search filter is case-sensitive.</span>
<!--l. 78--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.4 </span> <a
id="x1-110003.4"></a>Create a new password</h4>
<!--l. 79--><p class="noindent" >To create a new password, press N, the new password window will open, first type
the service name (<span the service name (<span
class="cmtt-10">SRVC</span>), then the username (<span class="cmtt-10">SRVC</span>), then the username (<span
class="cmtt-10">USER</span>), then the password (<span class="cmtt-10">USER</span>), then the password (<span
@ -202,26 +217,29 @@ class="cmbx-10">or the </span><span
class="cmtt-10">USER</span> class="cmtt-10">USER</span>
<span <span
class="cmbx-10">fields empty </span>. Press ENTER to move to the next field class="cmbx-10">fields empty </span>. Press ENTER to move to the next field
<!--l. 75--><p class="noindent" > <!--l. 83--><p class="noindent" >
<h5 class="subsubsectionHead"><span class="titlemark">3.3.1 </span> <a <h5 class="subsubsectionHead"><span class="titlemark">3.4.1 </span> <a
id="x1-110003.3.1"></a>Using random strings as passwords</h5> id="x1-120003.4.1"></a>Using random strings as passwords</h5>
<!--l. 76--><p class="noindent" >To create a random password for your service, leave the <span <!--l. 84--><p class="noindent" >To create a random password for your service, leave the <span
class="cmtt-10">PSWD </span>field empty. A random class="cmtt-10">PSWD </span>field empty. A random
string will be given to it as a password. string will be given to it as a password.
<!--l. 78--><p class="noindent" >
<h5 class="subsubsectionHead"><span class="titlemark">3.3.2 </span> <a
id="x1-120003.3.2"></a>Setting up the length of a random string in a password</h5>
<!--l. 79--><p class="noindent" >You can specify the length of a random password when creating (or modifying) one. <!--l. 86--><p class="noindent" >
<h5 class="subsubsectionHead"><span class="titlemark">3.4.2 </span> <a
id="x1-130003.4.2"></a>Setting up the length of a random string in a password</h5>
<!--l. 87--><p class="noindent" >You can specify the length of a random password when creating (or modifying) one.
Steelbox will recognize any integer between 0 and 45 after a colon(<span Steelbox will recognize any integer between 0 and 45 after a colon(<span
class="cmtt-10">:</span>). For example, if class="cmtt-10">:</span>). For example, if
you need a random password of <span you need a random password of <span
class="cmbx-10">16 </span>characters in length:<br class="cmbx-10">16 </span>characters in length:<br
class="newline" /><span class="newline" /><span
class="cmtt-10">PSWD::16</span> class="cmtt-10">PSWD::16</span>
<!--l. 83--><p class="noindent" > <!--l. 91--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.4 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.5 </span> <a
id="x1-130003.4"></a>Modify a password</h4> id="x1-140003.5"></a>Modify a password</h4>
<!--l. 84--><p class="noindent" >To modify a password, press M, the modify password window will open, first edit the <!--l. 92--><p class="noindent" >To modify a password, press M, the modify password window will open, first edit the
service name, then the username, then the password. <span service name, then the username, then the password. <span
class="cmbx-10">Leaving the </span><span class="cmbx-10">Leaving the </span><span
class="cmtt-10">PSWD </span><span class="cmtt-10">PSWD </span><span
@ -231,57 +249,54 @@ class="cmbx-10">empty in the modify window will give it a random string. </span>
through the currently selected field with: through the currently selected field with:
<ul class="itemize1"> <ul class="itemize1">
<li class="itemize"> <li class="itemize">
<!--l. 88--><p class="noindent" >CTRL+A to go to the far left of the field <!--l. 96--><p class="noindent" >CTRL+A to go to the far left of the field
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 89--><p class="noindent" >CTRL+E to go to the far right of the field <!--l. 97--><p class="noindent" >CTRL+E to go to the far right of the field
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 90--><p class="noindent" >CTRL+B to move the cursor once to the left <!--l. 98--><p class="noindent" >CTRL+B to move the cursor once to the left
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 91--><p class="noindent" >CTRL+F to move the cursor once to the right <!--l. 99--><p class="noindent" >CTRL+F to move the cursor once to the right
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 92--><p class="noindent" >CTRL+H to remove one character (Backspace) <!--l. 100--><p class="noindent" >CTRL+H to remove one character (Backspace)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 93--><p class="noindent" >CTRL+D to remove highlghted character (Delete) <!--l. 101--><p class="noindent" >CTRL+D to remove highlghted character (Delete)
</li> </li>
<li class="itemize"> <li class="itemize">
<!--l. 94--><p class="noindent" >CTRL+O to clear the field</li></ul> <!--l. 102--><p class="noindent" >CTRL+O to clear the field</li></ul>
<!--l. 96--><p class="noindent" >You can see these commands with in the help window. <!--l. 104--><p class="noindent" >You can see these commands with in the help window.
<!--l. 98--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.5 </span> <a
id="x1-140003.5"></a>Copy the password to your clipboard</h4>
<!--l. 99--><p class="noindent" >To copy a highlighted service&#8217;s password, press C. You can do this in the main
window or in the View Password window.
<!--l. 101--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.6 </span> <a
id="x1-150003.6"></a>Delete a password</h4>
<!--l. 102--><p class="noindent" >To delete a password, press D. You can do this in the main window or in the View
Password window. Steelbox will prompt you for confirmation, pressing anything but
Y will not remove your password.
<!--l. 105--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.7 </span> <a
id="x1-160003.7"></a>Generate a random string</h4>
<!--l. 106--><p class="noindent" >If you just wish to generate a random string, you can press R. It will open a window
with a random string in it.
<!--l. 108--><p class="noindent" > <!--l. 106--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.6 </span> <a
id="x1-150003.6"></a>Copy the password to your clipboard</h4>
<!--l. 107--><p class="noindent" >To copy a highlighted service&#8217;s password, press C. You can do this in the main
window or in the View Password window.
<!--l. 109--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.7 </span> <a
id="x1-160003.7"></a>Delete a password</h4>
<!--l. 110--><p class="noindent" >To delete a password, press D. You can do this in the main window or in the View
Password window. Steelbox will prompt you for confirmation, pressing anything but
Y will not remove your password.
<!--l. 113--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.8 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.8 </span> <a
id="x1-170003.8"></a>Open the help window</h4> id="x1-170003.8"></a>Generate a random string</h4>
<!--l. 109--><p class="noindent" >To open the help window, press H. The help window has information on <!--l. 114--><p class="noindent" >If you just wish to generate a random string, you can press R. It will open a window
steelbox. with a random string in it.
<!--l. 111--><p class="noindent" > <!--l. 116--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.9 </span> <a <h4 class="subsectionHead"><span class="titlemark">3.9 </span> <a
id="x1-180003.9"></a>Quit steelbox</h4> id="x1-180003.9"></a>Open the help window</h4>
<!--l. 112--><p class="noindent" >To quit steelbox, press Q from the main window. Steelbox will close its windows and <!--l. 117--><p class="noindent" >To open the help window, press H. The help window has information on
steelbox.
<!--l. 119--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">3.10 </span> <a
id="x1-190003.10"></a>Quit steelbox</h4>
<!--l. 120--><p class="noindent" >To quit steelbox, press Q from the main window. Steelbox will close its windows and
you&#8217;ll be asked to lock your password file with a password again. <span you&#8217;ll be asked to lock your password file with a password again. <span
class="cmbx-10">If you quit the</span> class="cmbx-10">If you quit the</span>
<span <span
@ -293,10 +308,10 @@ class="cmtt-10">HOME/pasfile.csv. </span>Opening steelbox again will throw a war
saying that no encrypted password file could be found, it will then try to open saying that no encrypted password file could be found, it will then try to open
the unencrypted file. Quitting steelbox and entering a password solves this the unencrypted file. Quitting steelbox and entering a password solves this
problem. problem.
<!--l. 117--><p class="noindent" > <!--l. 125--><p class="noindent" >
<h3 class="sectionHead"><span class="titlemark">4 </span> <a <h3 class="sectionHead"><span class="titlemark">4 </span> <a
id="x1-190004"></a>F.A.Q.</h3> id="x1-200004"></a>F.A.Q.</h3>
<!--l. 118--><p class="noindent" ><span <!--l. 126--><p class="noindent" ><span
class="cmbx-10">Q: Why do I need to put my password when I enter *and* when I quit</span> class="cmbx-10">Q: Why do I need to put my password when I enter *and* when I quit</span>
<span <span
class="cmbx-10">steelbox</span><br class="cmbx-10">steelbox</span><br
@ -309,81 +324,85 @@ class="newline" />A: Yes. You first create a password with a dummy entry in whic
to leave empty, and then modify it, leaving it empty.<br to leave empty, and then modify it, leaving it empty.<br
class="newline" /><span class="newline" /><span
class="cmbx-10">Q: Can I have a service with an empty password? </span>A: Yes. With <span class="cmbx-10">Q: Can I have a service with an empty password? </span>A: Yes. With <span
class="cmtt-10">PSWD::0</span> class="cmtt-10">PSWD::0 </span><span
class="cmbx-10">Q:</span>
<span
class="cmbx-10">Can I migrate my password file from one system to another?</span><br
class="newline" />A: The password file in <span
class="tctt-1000">$</span><span
class="cmtt-10">HOME/.pasfile.csv.gpg </span>contains all saved passwords, that
file can be moved from one home directory to another.
<h4 class="subsectionHead"><span class="titlemark">4.1 </span> <a <h4 class="subsectionHead"><span class="titlemark">4.1 </span> <a
id="x1-200004.1"></a>Contact</h4> id="x1-210004.1"></a>Contact</h4>
<!--l. 126--><p class="noindent" >The author of this software can be contacted in kamalcuri@outlook.com. <!--l. 136--><p class="noindent" >The author of this software can be contacted in kamalcuri@outlook.com.
<!--l. 128--><p class="noindent" > <!--l. 138--><p class="noindent" >
<h3 class="sectionHead"><span class="titlemark">5 </span> <a <h3 class="sectionHead"><span class="titlemark">5 </span> <a
id="x1-210005"></a>Licenses</h3> id="x1-220005"></a>Licenses</h3>
<!--l. 129--><p class="noindent" > <!--l. 139--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">5.1 </span> <a <h4 class="subsectionHead"><span class="titlemark">5.1 </span> <a
id="x1-220005.1"></a>pyperclip</h4> id="x1-230005.1"></a>pyperclip</h4>
<!--l. 130--><p class="noindent" >pyperclip&#8217;s license can be found in <a <!--l. 140--><p class="noindent" >pyperclip&#8217;s license can be found in <a
href="https://github.com/asweigart/pyperclip/blob/master/LICENSE.txt" class="url" ><span href="https://github.com/asweigart/pyperclip/blob/master/LICENSE.txt" class="url" ><span
class="cmtt-10">https://github.com/asweigart/pyperclip/blob/master/LICENSE.txt</span></a> class="cmtt-10">https://github.com/asweigart/pyperclip/blob/master/LICENSE.txt</span></a>
<h4 class="subsectionHead"><span class="titlemark">5.2 </span> <a <h4 class="subsectionHead"><span class="titlemark">5.2 </span> <a
id="x1-230005.2"></a>Steelbox</h4> id="x1-240005.2"></a>Steelbox</h4>
<div class="center" <div class="center"
> >
<!--l. 132--><p class="noindent" > <!--l. 142--><p class="noindent" >
<!--l. 135--><p class="noindent" >Copyright <span <!--l. 145--><p class="noindent" >Copyright <span
class="tcrm-1000">©</span>&#x00A0;1989, 1991 Free Software Foundation, Inc. class="tcrm-1000">©</span>&#x00A0;1989, 1991 Free Software Foundation, Inc.
<!--l. 139--><p class="noindent" >51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA <!--l. 149--><p class="noindent" >51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
<!--l. 143--><p class="noindent" >Everyone is permitted to copy and distribute verbatim copies of this license <!--l. 153--><p class="noindent" >Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed. </div> document, but changing it is not allowed. </div>
<div class="center" <div class="center"
> >
<!--l. 148--><p class="noindent" > <!--l. 158--><p class="noindent" >
<!--l. 149--><p class="noindent" ><span <!--l. 159--><p class="noindent" ><span
class="cmbx-12">Preamble</span></div> class="cmbx-12">Preamble</span></div>
<!--l. 153--><p class="noindent" >The licenses for most software are designed to take away your freedom to share and <!--l. 163--><p class="noindent" >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 change it. By contrast, the GNU General Public License is intended to guarantee
your freedom to share and change free software&#8212;to make sure the software is free for your freedom to share and change free software&#8212;to make sure the software is free for
all its users. This General Public License applies to most of the Free Software all its users. This General Public License applies to most of the Free Software
Foundation&#8217;s software and to any other program whose authors commit to using Foundation&#8217;s software and to any other program whose authors commit to using
it. (Some other Free Software Foundation software is covered by the GNU it. (Some other Free Software Foundation software is covered by the GNU
Library General Public License instead.) You can apply it to your programs, Library General Public License instead.) You can apply it to your programs,
too. too.
<!--l. 162--><p class="indent" > When we speak of free software, we are referring to freedom, not price. Our <!--l. 172--><p class="indent" > 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 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 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 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 use pieces of it in new free programs; and that you know you can do these
things. things.
<!--l. 169--><p class="indent" > To protect your rights, we need to make restrictions that forbid anyone to deny <!--l. 179--><p class="indent" > 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 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 certain responsibilities for you if you distribute copies of the software, or if you
modify it. modify it.
<!--l. 174--><p class="indent" > For example, if you distribute copies of such a program, whether gratis or for a <!--l. 184--><p class="indent" > 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 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 that they, too, receive or can get the source code. And you must show them these
terms so they know their rights. terms so they know their rights.
<!--l. 179--><p class="indent" > We protect your rights with two steps: (1) copyright the software, and (2) offer <!--l. 189--><p class="indent" > 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 you this license which gives you legal permission to copy, distribute and/or modify
the software. the software.
<!--l. 193--><p class="indent" > Also, for each author&#8217;s protection and ours, we want to make certain that
<!--l. 183--><p class="indent" > Also, for each author&#8217;s protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software. If the software 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 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 they have is not the original, so that any problems introduced by others will not
reflect on the original authors&#8217; reputations. reflect on the original authors&#8217; reputations.
<!--l. 190--><p class="indent" > Finally, any free program is threatened constantly by software patents. We wish <!--l. 200--><p class="indent" > 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 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 patent licenses, in effect making the program proprietary. To prevent this, we have
made it clear that any patent must be licensed for everyone&#8217;s free use or not licensed made it clear that any patent must be licensed for everyone&#8217;s free use or not licensed
at all. at all.
<!--l. 196--><p class="indent" > The precise terms and conditions for copying, distribution and modification <!--l. 206--><p class="indent" > The precise terms and conditions for copying, distribution and modification
follow. follow.
<div class="center" <div class="center"
> >
<!--l. 199--><p class="noindent" > <!--l. 209--><p class="noindent" >
<!--l. 200--><p class="noindent" ><span <!--l. 210--><p class="noindent" ><span
class="cmcsc-10x-x-144">T<span class="cmcsc-10x-x-144">T<span
class="small-caps">e</span><span class="small-caps">e</span><span
class="small-caps">r</span><span class="small-caps">r</span><span
@ -436,12 +455,15 @@ class="small-caps">t</span><span
class="small-caps">i</span><span class="small-caps">i</span><span
class="small-caps">o</span><span class="small-caps">o</span><span
class="small-caps">n</span></span></div> class="small-caps">n</span></span></div>
<!--l. 206--><p class="indent" > <!--l. 216--><p class="indent" >
<ol class="enumerate1" > <ol class="enumerate1" >
<li <li
class="enumerate" id="x1-23002x0"> class="enumerate" id="x1-24002x0">
<!--l. 211--><p class="noindent" > <!--l. 221--><p class="noindent" >
<!--l. 212--><p class="noindent" >This License applies to any program or other work which contains a notice
<!--l. 222--><p class="noindent" >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 placed by the copyright holder saying it may be distributed under the
terms of this General Public License. The &#8220;Program&#8221;, below, refers to terms of this General Public License. The &#8220;Program&#8221;, below, refers to
any such program or work, and a &#8220;work based on the Program&#8221; means any such program or work, and a &#8220;work based on the Program&#8221; means
@ -450,7 +472,7 @@ class="small-caps">n</span></span></div>
with modifications and/or translated into another language. (Hereinafter, with modifications and/or translated into another language. (Hereinafter,
translation is included without limitation in the term &#8220;modification&#8221;.) translation is included without limitation in the term &#8220;modification&#8221;.)
Each licensee is addressed as &#8220;you&#8221;. Each licensee is addressed as &#8220;you&#8221;.
<!--l. 222--><p class="noindent" >Activities other than copying, distribution and modification are not <!--l. 232--><p class="noindent" >Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of running the 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 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 if its contents constitute a work based on the Program (independent of
@ -458,45 +480,45 @@ class="small-caps">n</span></span></div>
on what the Program does. on what the Program does.
</li> </li>
<li <li
class="enumerate" id="x1-23004x1"> class="enumerate" id="x1-24004x1">
<!--l. 239--><p class="noindent" >You may copy and distribute verbatim copies of the Program&#8217;s source code
<!--l. 229--><p class="noindent" >You may copy and distribute verbatim copies of the Program&#8217;s source code
as you receive it, in any medium, provided that you conspicuously and as you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this License 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 and to the absence of any warranty; and give any other recipients of the
Program a copy of this License along with the Program. Program a copy of this License along with the Program.
<!--l. 236--><p class="noindent" >You may charge a fee for the physical act of transferring a copy, and you <!--l. 246--><p class="noindent" >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. may at your option offer warranty protection in exchange for a fee.
</li> </li>
<li <li
class="enumerate" id="x1-23006x2"> class="enumerate" id="x1-24006x2">
<!--l. 240--><p class="noindent" > <!--l. 250--><p class="noindent" >
<!--l. 241--><p class="noindent" >You may modify your copy or copies of the Program or any portion of it, <!--l. 251--><p class="noindent" >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 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 modifications or work under the terms of Section 1 above, provided that
you also meet all of these conditions: you also meet all of these conditions:
<!--l. 246--><p class="noindent" > <!--l. 256--><p class="noindent" >
<ol class="enumerate2" > <ol class="enumerate2" >
<li <li
class="enumerate" id="x1-23008x1"> class="enumerate" id="x1-24008x1">
<!--l. 249--><p class="noindent" > <!--l. 259--><p class="noindent" >
<!--l. 250--><p class="noindent" >You must cause the modified files to carry prominent notices stating <!--l. 260--><p class="noindent" >You must cause the modified files to carry prominent notices stating
that you changed the files and the date of any change. that you changed the files and the date of any change.
</li> </li>
<li <li
class="enumerate" id="x1-23010x2"> class="enumerate" id="x1-24010x2">
<!--l. 254--><p class="noindent" > <!--l. 264--><p class="noindent" >
<!--l. 255--><p class="noindent" >You must cause any work that you distribute or publish, that in <!--l. 265--><p class="noindent" >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 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 thereof, to be licensed as a whole at no charge to all third parties
under the terms of this License. under the terms of this License.
</li> </li>
<li <li
class="enumerate" id="x1-23012x3"> class="enumerate" id="x1-24012x3">
<!--l. 261--><p class="noindent" >If the modified program normally reads commands interactively when <!--l. 271--><p class="noindent" >If the modified program normally reads commands interactively when
run, you must cause it, when started running for such interactive run, you must cause it, when started running for such interactive
use in the most ordinary way, to print or display an announcement use in the most ordinary way, to print or display an announcement
including an appropriate copyright notice and a notice that there including an appropriate copyright notice and a notice that there
@ -504,13 +526,10 @@ class="small-caps">n</span></span></div>
that users may redistribute the program under these conditions, and that users may redistribute the program under these conditions, and
telling the user how to view a copy of this License. (Exception: if 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 the Program itself is interactive but does not normally print such an
announcement, your work based on the Program is not required to announcement, your work based on the Program is not required to
print an announcement.) print an announcement.)
</li></ol> </li></ol>
<!--l. 275--><p class="noindent" >These requirements apply to the modified work as a whole. If identifiable <!--l. 285--><p class="noindent" >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 sections of that work are not derived from the Program, and can be reasonably
considered independent and separate works in themselves, then this License, considered independent and separate works in themselves, then this License,
and its terms, do not apply to those sections when you distribute them as and its terms, do not apply to those sections when you distribute them as
@ -519,53 +538,53 @@ class="small-caps">n</span></span></div>
the terms of this License, whose permissions for other licensees extend to the 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 entire whole, and thus to each and every part regardless of who wrote
it. it.
<!--l. 285--><p class="noindent" >Thus, it is not the intent of this section to claim rights or contest your rights to <!--l. 295--><p class="noindent" >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 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 control the distribution of derivative or collective works based on the
Program. Program.
<!--l. 290--><p class="noindent" >In addition, mere aggregation of another work not based on the Program with <!--l. 300--><p class="noindent" >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 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 or distribution medium does not bring the other work under the scope of this
License. License.
</li> </li>
<li <li
class="enumerate" id="x1-23014x3"> class="enumerate" id="x1-24014x3">
<!--l. 296--><p class="noindent" >You may copy and distribute the Program (or a work based on it, under
<!--l. 306--><p class="noindent" >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 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: 2 above provided that you also do one of the following:
<!--l. 300--><p class="noindent" > <!--l. 310--><p class="noindent" >
<ol class="enumerate2" > <ol class="enumerate2" >
<li <li
class="enumerate" id="x1-23016x1"> class="enumerate" id="x1-24016x1">
<!--l. 303--><p class="noindent" > <!--l. 313--><p class="noindent" >
<!--l. 304--><p class="noindent" >Accompany it with the complete corresponding machine-readable <!--l. 314--><p class="noindent" >Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections 1 source code, which must be distributed under the terms of Sections 1
and 2 above on a medium customarily used for software interchange; and 2 above on a medium customarily used for software interchange;
or, or,
</li> </li>
<li <li
class="enumerate" id="x1-23018x2"> class="enumerate" id="x1-24018x2">
<!--l. 309--><p class="noindent" > <!--l. 319--><p class="noindent" >
<!--l. 310--><p class="noindent" >Accompany it with a written offer, valid for at least three years, to <!--l. 320--><p class="noindent" >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 give any third party, for a charge no more than your cost of physically
performing source distribution, a complete machine-readable copy of performing source distribution, a complete machine-readable copy of
the corresponding source code, to be distributed under the terms of the corresponding source code, to be distributed under the terms of
Sections 1 and 2 above on a medium customarily used for software Sections 1 and 2 above on a medium customarily used for software
interchange; or, interchange; or,
</li> </li>
<li <li
class="enumerate" id="x1-23020x3"> class="enumerate" id="x1-24020x3">
<!--l. 318--><p class="noindent" > <!--l. 328--><p class="noindent" >
<!--l. 319--><p class="noindent" >Accompany it with the information you received as to the offer to <!--l. 329--><p class="noindent" >Accompany it with the information you received as to the offer to
distribute corresponding source code. (This alternative is allowed distribute corresponding source code. (This alternative is allowed
only for noncommercial distribution and only if you received the only for noncommercial distribution and only if you received the
program in object code or executable form with such an offer, in program in object code or executable form with such an offer, in
accord with Subsection b above.) accord with Subsection b above.)
</li></ol> </li></ol>
<!--l. 328--><p class="noindent" >The source code for a work means the preferred form of the work for <!--l. 338--><p class="noindent" >The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to control associated interface definition files, plus the scripts used to control
@ -575,15 +594,18 @@ class="small-caps">n</span></span></div>
components (compiler, kernel, and so on) of the operating system on which components (compiler, kernel, and so on) of the operating system on which
the executable runs, unless that component itself accompanies the the executable runs, unless that component itself accompanies the
executable. executable.
<!--l. 339--><p class="noindent" >If distribution of executable or object code is made by offering access to copy
<!--l. 349--><p class="noindent" >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 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 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 third parties are not compelled to copy the source along with the object
code. code.
</li> </li>
<li <li
class="enumerate" id="x1-23022x4"> class="enumerate" id="x1-24022x4">
<!--l. 346--><p class="noindent" >You may not copy, modify, sublicense, or distribute the Program except <!--l. 356--><p class="noindent" >You may not copy, modify, sublicense, or distribute the Program except
as expressly provided under this License. Any attempt otherwise to as expressly provided under this License. Any attempt otherwise to
copy, modify, sublicense or distribute the Program is void, and will copy, modify, sublicense or distribute the Program is void, and will
automatically terminate your rights under this License. However, parties who automatically terminate your rights under this License. However, parties who
@ -592,11 +614,8 @@ class="small-caps">n</span></span></div>
compliance. compliance.
</li> </li>
<li <li
class="enumerate" id="x1-23024x5"> class="enumerate" id="x1-24024x5">
<!--l. 365--><p class="noindent" >You are not required to accept this License, since you have not signed it.
<!--l. 355--><p class="noindent" >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 However, nothing else grants you permission to modify or distribute the
Program or its derivative works. These actions are prohibited by law if you Program or its derivative works. These actions are prohibited by law if you
do not accept this License. Therefore, by modifying or distributing do not accept this License. Therefore, by modifying or distributing
@ -606,8 +625,8 @@ class="small-caps">n</span></span></div>
it. it.
</li> </li>
<li <li
class="enumerate" id="x1-23026x6"> class="enumerate" id="x1-24026x6">
<!--l. 365--><p class="noindent" >Each time you redistribute the Program (or any work based on the Program), <!--l. 375--><p class="noindent" >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, the recipient automatically receives a license from the original licensor to copy,
distribute or modify the Program subject to these terms and conditions. You distribute or modify the Program subject to these terms and conditions. You
may not impose any further restrictions on the recipients&#8217; exercise of the rights may not impose any further restrictions on the recipients&#8217; exercise of the rights
@ -615,11 +634,14 @@ class="small-caps">n</span></span></div>
parties to this License. parties to this License.
</li> </li>
<li <li
class="enumerate" id="x1-23028x7"> class="enumerate" id="x1-24028x7">
<!--l. 374--><p class="noindent" >If, as a consequence of a court judgment or allegation of patent infringement <!--l. 384--><p class="noindent" >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 or for any other reason (not limited to patent issues), conditions are
imposed on you (whether by court order, agreement or otherwise) that imposed on you (whether by court order, agreement or otherwise) that
contradict the conditions of this License, they do not excuse you from the 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 conditions of this License. If you cannot distribute so as to satisfy
simultaneously your obligations under this License and any other pertinent simultaneously your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the Program obligations, then as a consequence you may not distribute the Program
@ -628,10 +650,10 @@ class="small-caps">n</span></span></div>
indirectly through you, then the only way you could satisfy both it indirectly through you, then the only way you could satisfy both it
and this License would be to refrain entirely from distribution of the and this License would be to refrain entirely from distribution of the
Program. Program.
<!--l. 387--><p class="noindent" >If any portion of this section is held invalid or unenforceable under any <!--l. 397--><p class="noindent" >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 particular circumstance, the balance of the section is intended to apply and the
section as a whole is intended to apply in other circumstances. section as a whole is intended to apply in other circumstances.
<!--l. 392--><p class="noindent" >It is not the purpose of this section to induce you to infringe any patents or <!--l. 402--><p class="noindent" >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 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 section has the sole purpose of protecting the integrity of the free software
distribution system, which is implemented by public license practices. Many distribution system, which is implemented by public license practices. Many
@ -639,16 +661,13 @@ class="small-caps">n</span></span></div>
distributed through that system in reliance on consistent application of that 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 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 distribute software through any other system and a licensee cannot impose that
choice. choice.
<!--l. 403--><p class="noindent" >This section is intended to make thoroughly clear what is believed to be a <!--l. 413--><p class="noindent" >This section is intended to make thoroughly clear what is believed to be a
consequence of the rest of this License. consequence of the rest of this License.
</li> </li>
<li <li
class="enumerate" id="x1-23030x8"> class="enumerate" id="x1-24030x8">
<!--l. 407--><p class="noindent" >If the distribution and/or use of the Program is restricted in certain countries <!--l. 417--><p class="noindent" >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 either by patents or by copyrighted interfaces, the original copyright holder who
places the Program under this License may add an explicit geographical places the Program under this License may add an explicit geographical
distribution limitation excluding those countries, so that distribution is distribution limitation excluding those countries, so that distribution is
@ -657,22 +676,25 @@ class="small-caps">n</span></span></div>
License. License.
</li> </li>
<li <li
class="enumerate" id="x1-23032x9"> class="enumerate" id="x1-24032x9">
<!--l. 416--><p class="noindent" >The Free Software Foundation may publish revised and/or new versions of the <!--l. 426--><p class="noindent" >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 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 spirit to the present version, but may differ in detail to address new problems
or concerns. or concerns.
<!--l. 421--><p class="noindent" >Each version is given a distinguishing version number. If the Program specifies <!--l. 431--><p class="noindent" >Each version is given a distinguishing version number. If the Program specifies
a version number of this License which applies to it and &#8220;any later version&#8221;, a version number of this License which applies to it and &#8220;any later version&#8221;,
you have the option of following the terms and conditions either of you have the option of following the terms and conditions either of
that version or of any later version published by the Free Software that version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of this Foundation. If the Program does not specify a version number of this
License, you may choose any version ever published by the Free Software License, you may choose any version ever published by the Free Software
Foundation. Foundation.
</li> </li>
<li <li
class="enumerate" id="x1-23034x10"> class="enumerate" id="x1-24034x10">
<!--l. 430--><p class="noindent" >If you wish to incorporate parts of the Program into other free programs whose <!--l. 440--><p class="noindent" >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. 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 For software which is copyrighted by the Free Software Foundation, write to the
Free Software Foundation; we sometimes make exceptions for this. Our decision Free Software Foundation; we sometimes make exceptions for this. Our decision
@ -681,11 +703,8 @@ class="small-caps">n</span></span></div>
generally. generally.
<div class="center" <div class="center"
> >
<!--l. 438--><p class="noindent" > <!--l. 448--><p class="noindent" >
<!--l. 450--><p class="noindent" ><span
<!--l. 440--><p class="noindent" ><span
class="cmcsc-10x-x-144">N<span class="cmcsc-10x-x-144">N<span
class="small-caps">o</span> W<span class="small-caps">o</span> W<span
class="small-caps">a</span><span class="small-caps">a</span><span
@ -697,8 +716,8 @@ class="small-caps">t</span><span
class="small-caps">y</span> </span></div> class="small-caps">y</span> </span></div>
</li> </li>
<li <li
class="enumerate" id="x1-23036x11"> class="enumerate" id="x1-24036x11">
<!--l. 445--><p class="noindent" ><span <!--l. 455--><p class="noindent" ><span
class="cmcsc-10">B<span class="cmcsc-10">B<span
class="small-caps">e</span><span class="small-caps">e</span><span
class="small-caps">c</span><span class="small-caps">c</span><span
@ -1202,8 +1221,8 @@ class="small-caps">o</span><span
class="small-caps">n</span>.</span> class="small-caps">n</span>.</span>
</li> </li>
<li <li
class="enumerate" id="x1-23038x12"> class="enumerate" id="x1-24038x12">
<!--l. 456--><p class="noindent" ><span <!--l. 466--><p class="noindent" ><span
class="cmcsc-10">I<span class="cmcsc-10">I<span
class="small-caps">n</span> <span class="small-caps">n</span> <span
class="small-caps">n</span><span class="small-caps">n</span><span
@ -1518,6 +1537,9 @@ class="small-caps">s</span><span
class="small-caps">s</span> <span class="small-caps">s</span> <span
class="small-caps">o</span><span class="small-caps">o</span><span
class="small-caps">f</span></span> class="small-caps">f</span></span>
<span <span
class="cmcsc-10"><span class="cmcsc-10"><span
class="small-caps">d</span><span class="small-caps">d</span><span
@ -1722,8 +1744,8 @@ class="small-caps">s</span>.</span>
</li></ol> </li></ol>
<div class="center" <div class="center"
> >
<!--l. 469--><p class="noindent" > <!--l. 479--><p class="noindent" >
<!--l. 470--><p class="noindent" ><span <!--l. 480--><p class="noindent" ><span
class="cmcsc-10x-x-144">E<span class="cmcsc-10x-x-144">E<span
class="small-caps">n</span><span class="small-caps">n</span><span
class="small-caps">d</span> <span class="small-caps">d</span> <span
@ -1745,49 +1767,49 @@ class="small-caps">i</span><span
class="small-caps">o</span><span class="small-caps">o</span><span
class="small-caps">n</span><span class="small-caps">n</span><span
class="small-caps">s</span></span></div> class="small-caps">s</span></span></div>
<!--l. 476--><p class="noindent" > <!--l. 486--><p class="noindent" >
<h3 class="likesectionHead"><a <h3 class="likesectionHead"><a
id="x1-240005.2"></a>Appendix: How to Apply These Terms to Your New Programs</h3> id="x1-250005.2"></a>Appendix: How to Apply These Terms to Your New Programs</h3>
<!--l. 488--><p class="noindent" >If you develop a new program, and you want it to be of the greatest possible use to
<!--l. 478--><p class="noindent" >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 the public, the best way to achieve this is to make it free software which everyone can
redistribute and change under these terms. redistribute and change under these terms.
<!--l. 483--><p class="indent" > To do so, attach the following notices to the program. It is safest to attach them <!--l. 493--><p class="indent" > 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; to the start of each source file to most effectively convey the exclusion of warranty;
and each file should have at least the &#8220;copyright&#8221; line and a pointer to where the full and each file should have at least the &#8220;copyright&#8221; line and a pointer to where the full
notice is found. notice is found.
<!--l. 488--><p class="indent" > <!--l. 498--><p class="indent" >
<blockquote class="quote"> <blockquote class="quote">
<!--l. 489--><p class="noindent" >one line to give the program&#8217;s name and a brief idea of what it does. <!--l. 499--><p class="noindent" >one line to give the program&#8217;s name and a brief idea of what it does.
<br <br
class="newline" />Copyright (C) yyyy name of author <br class="newline" />Copyright (C) yyyy name of author <br
class="newline" /> class="newline" />
<!--l. 492--><p class="noindent" >This program is free software; you can redistribute it and/or modify <!--l. 502--><p class="noindent" >This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License, or by the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
<!--l. 497--><p class="noindent" >This program is distributed in the hope that it will be useful, but <!--l. 507--><p class="noindent" >This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details. PURPOSE. See the GNU General Public License for more details.
<!--l. 502--><p class="noindent" >You should have received a copy of the GNU General Public <!--l. 512--><p class="noindent" >You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.</blockquote> 02110-1301, USA.</blockquote>
<!--l. 507--><p class="indent" > Also add information on how to contact you by electronic and paper
<!--l. 517--><p class="indent" > Also add information on how to contact you by electronic and paper
mail. mail.
<!--l. 509--><p class="indent" > If the program is interactive, make it output a short notice like this when it starts <!--l. 519--><p class="indent" > If the program is interactive, make it output a short notice like this when it starts
in an interactive mode: in an interactive mode:
<!--l. 512--><p class="indent" > <!--l. 522--><p class="indent" >
<blockquote class="quote"> <blockquote class="quote">
<!--l. 513--><p class="noindent" >Gnomovision version 69, Copyright (C) yyyy name of author <br <!--l. 523--><p class="noindent" >Gnomovision version 69, Copyright (C) yyyy name of author <br
class="newline" />Gnomovision comes with ABSOLUTELY NO WARRANTY; for class="newline" />Gnomovision comes with ABSOLUTELY NO WARRANTY; for
details type &#8216;show w&#8217;. <br details type &#8216;show w&#8217;. <br
class="newline" />This is free software, and you are welcome to redistribute it under class="newline" />This is free software, and you are welcome to redistribute it under
certain conditions; type &#8216;show c&#8217; for details.</blockquote> certain conditions; type &#8216;show c&#8217; for details.</blockquote>
<!--l. 520--><p class="indent" > The hypothetical commands <span <!--l. 530--><p class="indent" > The hypothetical commands <span
class="cmtt-10">show w </span>and <span class="cmtt-10">show w </span>and <span
class="cmtt-10">show c </span>should show the appropriate class="cmtt-10">show c </span>should show the appropriate
parts of the General Public License. Of course, the commands you use may be called parts of the General Public License. Of course, the commands you use may be called
@ -1795,22 +1817,19 @@ something other than <span
class="cmtt-10">show w </span>and <span class="cmtt-10">show w </span>and <span
class="cmtt-10">show c</span>; they could even be mouse-clicks or menu class="cmtt-10">show c</span>; they could even be mouse-clicks or menu
items&#8212;whatever suits your program. items&#8212;whatever suits your program.
<!--l. 536--><p class="indent" > You should also get your employer (if you work as a programmer) or your school,
<!--l. 526--><p class="indent" > You should also get your employer (if you work as a programmer) or your school,
if any, to sign a &#8220;copyright disclaimer&#8221; for the program, if necessary. Here is a if any, to sign a &#8220;copyright disclaimer&#8221; for the program, if necessary. Here is a
sample; alter the names: sample; alter the names:
<!--l. 530--><p class="indent" > <!--l. 540--><p class="indent" >
<blockquote class="quote"> <blockquote class="quote">
<!--l. 531--><p class="noindent" >Yoyodyne, Inc., hereby disclaims all copyright interest in the <!--l. 541--><p class="noindent" >Yoyodyne, Inc., hereby disclaims all copyright interest in the
program <br program <br
class="newline" />&#8216;Gnomovision&#8217; (which makes passes at compilers) written by James class="newline" />&#8216;Gnomovision&#8217; (which makes passes at compilers) written by James
Hacker. <br Hacker. <br
class="newline" /> class="newline" />
<!--l. 534--><p class="noindent" >signature of Ty Coon, 1 April 1989 <br <!--l. 544--><p class="noindent" >signature of Ty Coon, 1 April 1989 <br
class="newline" />Ty Coon, President of Vice</blockquote> class="newline" />Ty Coon, President of Vice</blockquote>
<!--l. 539--><p class="indent" > This General Public License does not permit incorporating your program into <!--l. 549--><p class="indent" > This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may consider it 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 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 you want to do, use the GNU Library General Public License instead of this

@ -23,7 +23,7 @@ import os
import pyperclip as pc import pyperclip as pc
import random import random
version = "v120d" version = sys.argv[1]
## Initialization of bottomline dependencies ## Initialization of bottomline dependencies
@ -37,17 +37,24 @@ fields = ["service", "user", "pswd"]
# Password file # Password file
HOMEDIR = os.environ['HOME'] HOMEDIR = os.environ['HOME']
PASFILE="pasfile.csv" PASFILE=HOMEDIR+"/.pasfile.csv"
def reloadFiles(): def reloadFiles():
global SQUERY
files.clear() files.clear()
with open(PASFILE, mode='r') as pasfile: with open(PASFILE, mode='r') as pasfile:
# Creates reader object # Creates reader object
csvreader=csv.DictReader(pasfile) csvreader=csv.DictReader(pasfile)
if SQUERY == '':
for ids in csvreader:
files.append(ids)
else:
for ids in csvreader: for ids in csvreader:
if ids['service'].find(SQUERY) != -1:
files.append(ids) files.append(ids)
# Initializes the curses screen # Initializes the curses screen
stdscr = curses.initscr() stdscr = curses.initscr()
curses.noecho() curses.noecho()
@ -87,7 +94,7 @@ def steelbox():
while True: while True:
termGlobals() termGlobals()
reloadFiles() reloadFiles()
if len(files) < 1: if len(files) < 1 and SQUERY == '':
populate() populate()
displayItems() displayItems()
stdscr.move(0, 0) stdscr.move(0, 0)
@ -103,13 +110,7 @@ def displayItems():
global displayList global displayList
displayList = [] displayList = []
# Appends the names in the CSV to display on the main window # Appends the names in the CSV to display on the main window
if SQUERY == '':
for ps_name in files:
displayList.append(ps_name['service'][:15])
else:
for ps_name in files: for ps_name in files:
sname = ps_name['service']
if ps_name['service'].find(SQUERY) != -1:
displayList.append(ps_name['service'][:15]) displayList.append(ps_name['service'][:15])
# Reset global necessities # Reset global necessities
@ -120,8 +121,8 @@ def displayItems():
global highOpt global highOpt
highOpt = () highOpt = ()
# Defines what to display # Defines what to display
startDisplay = (CURR_PAGE-1)*len(displayList) startDisplay = (CURR_PAGE-1)*MAX_ITEMS
stopDisplay = CURR_PAGE*len(displayList) stopDisplay = CURR_PAGE*MAX_ITEMS
for item in displayList[startDisplay:stopDisplay]: for item in displayList[startDisplay:stopDisplay]:
# If the item is the one with the cursor, highlight it # If the item is the one with the cursor, highlight it
@ -215,6 +216,11 @@ def termGlobals():
# Gets user command # Gets user command
def command(): def command():
# This solution, for the case where the search function finds nothing, is cursed beyond belief,
global displayList
if len(displayList) < 1:
noMatch()
return()
# The GLOBAL_CURSOR points to the main files object, so that it gets the right file. # The GLOBAL_CURSOR points to the main files object, so that it gets the right file.
global c global c
global CUROW global CUROW
@ -379,10 +385,9 @@ def examine():
copy() copy()
def modFile(): def modFile():
global files
# Extracts the file to be modified # Extracts the file to be modified
modFile = files[GLOBAL_CURSOR] modFile = files[GLOBAL_CURSOR]
# Removes it from the main file
files.pop(GLOBAL_CURSOR)
# Creates the 'modify password' window # Creates the 'modify password' window
modWin = curses.newwin(5, 60,int(TERM_LINES/2)-2, int(TERM_COLS/2)-18) modWin = curses.newwin(5, 60,int(TERM_LINES/2)-2, int(TERM_COLS/2)-18)
# Gets the coordinates for the top left corner of said window # Gets the coordinates for the top left corner of said window
@ -446,7 +451,6 @@ def modFile():
pSize = 45 pSize = 45
passPswd = randString(pSize) passPswd = randString(pSize)
modFile = {'service' : passService, 'user' : passUser, 'pswd' : passPswd} modFile = {'service' : passService, 'user' : passUser, 'pswd' : passPswd}
# This is just a copy of delfile's confirmation routine # This is just a copy of delfile's confirmation routine
dlWin = curses.newwin(3, 22, int(TERM_LINES/2), int(TERM_COLS/2)) dlWin = curses.newwin(3, 22, int(TERM_LINES/2), int(TERM_COLS/2))
dlWin.border() dlWin.border()
@ -456,9 +460,20 @@ def modFile():
dlWin.addstr(1, 1, "Are you sure? (y/N)") dlWin.addstr(1, 1, "Are you sure? (y/N)")
c = dlWin.getch() c = dlWin.getch()
if c == ord('y'): if c == ord('y'):
files.insert(GLOBAL_CURSOR, modFile) iCount = 0
with open(PASFILE, mode='r') as pasfile:
oldFiles = []
csvreader = csv.DictReader(pasfile)
for ids in csvreader:
oldFiles.append(ids)
for ids in oldFiles:
if ids['service'] == files[GLOBAL_CURSOR]['service'] and ids['user'] == files[GLOBAL_CURSOR]['user'] and ids['pswd'] == files[GLOBAL_CURSOR]['pswd']:
oldFiles.pop(iCount)
iPos = iCount
iCount += 1
oldFiles.insert(iPos, modFile)
files = oldFiles
with open(PASFILE, mode='w') as pasfile: with open(PASFILE, mode='w') as pasfile:
# Creates writer object and writes to the csv file
csvwriter = csv.DictWriter(pasfile, fields) csvwriter = csv.DictWriter(pasfile, fields)
csvwriter.writeheader() csvwriter.writeheader()
csvwriter.writerows(files) csvwriter.writerows(files)
@ -468,6 +483,7 @@ def modFile():
def delFile(): def delFile():
global GLOBAL_CURSOR global GLOBAL_CURSOR
global ITEM_CURSOR global ITEM_CURSOR
global files
dlWin = curses.newwin(3, 22, int(TERM_LINES/2), int(TERM_COLS/2)) dlWin = curses.newwin(3, 22, int(TERM_LINES/2), int(TERM_COLS/2))
dlWin.border() dlWin.border()
dlWin.refresh() dlWin.refresh()
@ -476,7 +492,17 @@ def delFile():
dlWin.addstr(1, 1, "Are you sure? (y/N)") dlWin.addstr(1, 1, "Are you sure? (y/N)")
c = dlWin.getch() c = dlWin.getch()
if c == ord('y'): if c == ord('y'):
files.pop(GLOBAL_CURSOR) iCount = 0
with open(PASFILE, mode='r') as pasfile:
oldFiles = []
csvreader = csv.DictReader(pasfile)
for ids in csvreader:
oldFiles.append(ids)
for ids in oldFiles:
if ids['service'] == files[GLOBAL_CURSOR]['service'] and ids['user'] == files[GLOBAL_CURSOR]['user'] and ids['pswd'] == files[GLOBAL_CURSOR]['pswd']:
oldFiles.pop(iCount)
iCount += 1
files = oldFiles
with open(PASFILE, mode='w') as pasfile: with open(PASFILE, mode='w') as pasfile:
csvwriter = csv.DictWriter(pasfile, fields) csvwriter = csv.DictWriter(pasfile, fields)
csvwriter.writeheader() csvwriter.writeheader()
@ -511,6 +537,8 @@ def searchWin():
global TERM_LINES global TERM_LINES
global TERM_COLS global TERM_COLS
global SQUERY global SQUERY
global ITEM_CURSOR
global GLOBAL_CURSOR
searchWin = curses.newwin(3, 49, int(TERM_LINES/2), int(TERM_COLS/2)) searchWin = curses.newwin(3, 49, int(TERM_LINES/2), int(TERM_COLS/2))
searchWin.border() searchWin.border()
searchWin.addstr(0, 1, "Search service") searchWin.addstr(0, 1, "Search service")
@ -525,6 +553,17 @@ def searchWin():
SQUERY = sbox.gather() SQUERY = sbox.gather()
l = len(SQUERY) l = len(SQUERY)
SQUERY = SQUERY[:l-1] SQUERY = SQUERY[:l-1]
ITEM_CURSOR = 0
GLOBAL_CURSOR = 0
def noMatch():
global SQUERY
nomwin = curses.newwin(3, 40, int(TERM_LINES/2), int(TERM_COLS/2))
nomwin.border()
nomwin.addstr(1, 1, "No passwords match the search criteria")
SQUERY = ''
nomwin.getch()
# Cleans the windows # Cleans the windows

@ -3,10 +3,10 @@
#!/usr/bin/env bash #!/usr/bin/env bash
version="1.04" version="1.2"
echo "Steelbox V$version, Copyright (C) 2022 Kamal Curi" echo "Steelbox V$version, Copyright (C) 2022 Kamal Curi"
echo "Steelbox comes with ABSOLUTELY NO WARRANTY; for details, read the manual in doc/" echo "Steelbox comes with ABSOLUTELY NO WARRANTY; For license details, read the manual in doc/"
if [ -f $HOME/.pasfile.csv.gpg ] if [ -f $HOME/.pasfile.csv.gpg ]

Loading…
Cancel
Save