Annotation of truecrypt/main/forms/volumepasswordpanel.cpp, revision 1.1.1.1

1.1       root        1: /*
                      2:  Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
                      3: 
                      4:  Governed by the TrueCrypt License 2.4 the full text of which is contained
                      5:  in the file License.txt included in TrueCrypt binary and source code
                      6:  distribution packages.
                      7: */
                      8: 
                      9: #include "System.h"
                     10: #include "Main/GraphicUserInterface.h"
                     11: #include "KeyfilesDialog.h"
                     12: #include "VolumePasswordPanel.h"
                     13: 
                     14: namespace TrueCrypt
                     15: {
                     16:        VolumePasswordPanel::VolumePasswordPanel (wxWindow* parent, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, bool enableCache, bool enablePassword, bool enableKeyfiles, bool enableConfirmation, bool enablePkcs5Prf, const wxString &passwordLabel)
                     17:                : VolumePasswordPanelBase (parent), Keyfiles (new KeyfileList)
                     18:        {
                     19:                if (keyfiles)
                     20:                {
                     21:                        *Keyfiles = *keyfiles;
                     22:                        UseKeyfilesCheckBox->SetValue (!Keyfiles->empty());
                     23:                }
                     24:                else
                     25:                {
                     26:                        *Keyfiles = Gui->GetPreferences().DefaultKeyfiles;
                     27:                        UseKeyfilesCheckBox->SetValue (Gui->GetPreferences().UseKeyfiles && !Keyfiles->empty());
                     28:                }
                     29: 
                     30:                PasswordTextCtrl->SetMaxLength (VolumePassword::MaxSize);
                     31:                ConfirmPasswordTextCtrl->SetMaxLength (VolumePassword::MaxSize);
                     32: 
                     33:                if (!passwordLabel.empty())
                     34:                {
                     35:                        PasswordStaticText->SetLabel (passwordLabel);
                     36:                        GridBagSizer->Detach (PasswordStaticText);
                     37:                        GridBagSizer->Add (PasswordStaticText, wxGBPosition (0, 1), wxGBSpan (1, 1), wxALIGN_CENTER_VERTICAL | wxBOTTOM, Gui->GetDefaultBorderSize());
                     38:                }
                     39: 
                     40:                CacheCheckBox->Show (enableCache);
                     41:                
                     42:                if (!enablePassword && enableKeyfiles)
                     43:                {
                     44:                        Layout();
                     45:                        Fit();
                     46:                        PasswordPlaceholderSizer->SetMinSize (wxSize (PasswordTextCtrl->GetSize().GetWidth(), -1));
                     47:                }
                     48:                else if (!enablePkcs5Prf)
                     49:                {
                     50:                        GridBagSizer->Remove (PasswordPlaceholderSizer);
                     51:                }
                     52: 
                     53:                PasswordStaticText->Show (enablePassword);
                     54:                PasswordTextCtrl->Show (enablePassword);
                     55:                DisplayPasswordCheckBox->Show (enablePassword);
                     56: 
                     57:                ConfirmPasswordStaticText->Show (enableConfirmation);
                     58:                ConfirmPasswordTextCtrl->Show (enableConfirmation);
                     59:                
                     60:                UseKeyfilesCheckBox->Show (enableKeyfiles);
                     61:                KeyfilesButton->Show (enableKeyfiles);
                     62: 
                     63:                Pkcs5PrfStaticText->Show (enablePkcs5Prf);
                     64:                Pkcs5PrfChoice->Show (enablePkcs5Prf);
                     65: 
                     66:                if (enablePkcs5Prf)
                     67:                {       
                     68:                        foreach_ref (const Pkcs5Kdf &kdf, Pkcs5Kdf::GetAvailableAlgorithms())
                     69:                        {
                     70:                                if (!kdf.IsDeprecated())
                     71:                                        Pkcs5PrfChoice->Append (kdf.GetName());
                     72:                        }
                     73:                        Pkcs5PrfChoice->Select (0);
                     74:                }
                     75: 
                     76:                if (!enablePkcs5Prf || (!enablePassword && !enableKeyfiles))
                     77:                {
                     78:                        GridBagSizer->Remove (Pkcs5PrfSizer);
                     79:                }
                     80: 
                     81:                // Keyfiles drag & drop
                     82:                class FileDropTarget : public wxFileDropTarget
                     83:                {
                     84:                public:
                     85:                        FileDropTarget (VolumePasswordPanel *panel) : Panel (panel) { }
                     86: 
                     87:                        wxDragResult OnDragOver (wxCoord x, wxCoord y, wxDragResult def)
                     88:                        {
                     89:                                return wxDragLink;
                     90:                        }
                     91: 
                     92:                        bool OnDropFiles (wxCoord x, wxCoord y, const wxArrayString &filenames)
                     93:                        {
                     94:                                foreach (const wxString &f, filenames)
                     95:                                        Panel->AddKeyfile (make_shared <Keyfile> (wstring (f)));
                     96: 
                     97:                                return true;
                     98:                        }
                     99: 
                    100:                protected:
                    101:                        VolumePasswordPanel *Panel;
                    102:                };
                    103: 
                    104:                if (enableKeyfiles)
                    105:                {
                    106:                        SetDropTarget (new FileDropTarget (this));
                    107: #ifdef TC_MACOSX
                    108:                        foreach (wxWindow *c, GetChildren())
                    109:                                c->SetDropTarget (new FileDropTarget (this));
                    110: #endif
                    111:                }
                    112: 
                    113:                Layout();
                    114:                Fit();
                    115:        }
                    116: 
                    117:        VolumePasswordPanel::~VolumePasswordPanel ()
                    118:        {
                    119:                WipeTextCtrl (PasswordTextCtrl);
                    120:                WipeTextCtrl (ConfirmPasswordTextCtrl);
                    121:        }
                    122: 
                    123:        void VolumePasswordPanel::AddKeyfile (shared_ptr <Keyfile> keyfile)
                    124:        {
                    125:                if (!Keyfiles)
                    126:                        Keyfiles.reset (new KeyfileList);
                    127: 
                    128:                Keyfiles->push_back (keyfile);
                    129:                UseKeyfilesCheckBox->SetValue (true);
                    130:        }
                    131: 
                    132:        void VolumePasswordPanel::DisplayPassword (bool display, wxTextCtrl **textCtrl, int row)
                    133:        {
                    134:                FreezeScope freeze (this);
                    135: 
                    136:                wxTextCtrl *newTextCtrl = new wxTextCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, display ? 0 : wxTE_PASSWORD);
                    137:                newTextCtrl->SetMaxLength (VolumePassword::MaxSize); 
                    138:                newTextCtrl->SetValue ((*textCtrl)->GetValue());
                    139:                newTextCtrl->SetMinSize ((*textCtrl)->GetSize());
                    140: 
                    141:                GridBagSizer->Detach ((*textCtrl));
                    142:                GridBagSizer->Add (newTextCtrl, wxGBPosition (row, 1), wxGBSpan (1, 2), wxEXPAND|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 5);
                    143:                (*textCtrl)->Show (false);
                    144:                WipeTextCtrl (*textCtrl);
                    145: 
                    146:                Fit();
                    147:                Layout();
                    148:                newTextCtrl->SetMinSize ((*textCtrl)->GetMinSize());
                    149: 
                    150:                newTextCtrl->Connect (wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (VolumePasswordPanel::OnTextChanged), nullptr, this);
                    151:                *textCtrl = newTextCtrl;
                    152:        }
                    153: 
                    154:        shared_ptr <VolumePassword> VolumePasswordPanel::GetPassword () const
                    155:        {
                    156:                return GetPassword (PasswordTextCtrl);
                    157:        }
                    158: 
                    159:        shared_ptr <VolumePassword> VolumePasswordPanel::GetPassword (wxTextCtrl *textCtrl) const
                    160:        {
                    161:                shared_ptr <VolumePassword> password;
                    162:                wchar_t passwordBuf[VolumePassword::MaxSize + 1];
                    163:                finally_do_arg (BufferPtr, BufferPtr (reinterpret_cast <byte *> (passwordBuf), sizeof (passwordBuf)), { finally_arg.Erase(); });
                    164: 
                    165: #ifdef TC_WINDOWS
                    166:                int len = GetWindowText (static_cast <HWND> (textCtrl->GetHandle()), passwordBuf, VolumePassword::MaxSize + 1);
                    167:                password.reset (new VolumePassword (passwordBuf, len));
                    168: #else
                    169:                const wxString &passwordStr = textCtrl->GetValue();
                    170:                for (size_t i = 0; i < passwordStr.size() && i < VolumePassword::MaxSize; ++i)
                    171:                {
                    172:                        passwordBuf[i] = (wchar_t) passwordStr[i];
                    173:                        const_cast <wchar_t *> (passwordStr.c_str())[i] = L'X';
                    174:                }
                    175:                password.reset (new VolumePassword (passwordBuf, passwordStr.size()));
                    176: #endif
                    177:                return password;
                    178:        }
                    179: 
                    180:        shared_ptr <Pkcs5Kdf> VolumePasswordPanel::GetPkcs5Kdf () const
                    181:        {
                    182:                try
                    183:                {
                    184:                        return Pkcs5Kdf::GetAlgorithm (wstring (Pkcs5PrfChoice->GetStringSelection()));
                    185:                }
                    186:                catch (ParameterIncorrect&)
                    187:                {
                    188:                        return shared_ptr <Pkcs5Kdf> ();
                    189:                }
                    190:        }
                    191: 
                    192:        void VolumePasswordPanel::OnAddKeyfileDirMenuItemSelected (wxCommandEvent& event)
                    193:        {
                    194:                DirectoryPath dir = Gui->SelectDirectory (this, LangString["SELECT_KEYFILE_PATH"]);
                    195: 
                    196:                if (!dir.IsEmpty())
                    197:                {
                    198:                        Keyfiles->push_back (make_shared <Keyfile> (dir));
                    199: 
                    200:                        UseKeyfilesCheckBox->SetValue (!Keyfiles->empty());
                    201:                        OnUpdate();
                    202:                }
                    203:        }
                    204: 
                    205:        void VolumePasswordPanel::OnAddKeyfilesMenuItemSelected (wxCommandEvent& event)
                    206:        {
                    207:                FilePathList files = Gui->SelectFiles (this, LangString["SELECT_KEYFILES"], false, true);
                    208: 
                    209:                if (!files.empty())
                    210:                {
                    211:                        foreach_ref (const FilePath &f, files)
                    212:                                Keyfiles->push_back (make_shared <Keyfile> (f));
                    213: 
                    214:                        UseKeyfilesCheckBox->SetValue (!Keyfiles->empty());
                    215:                        OnUpdate();
                    216:                }
                    217:        }
                    218: 
                    219:        void VolumePasswordPanel::OnDisplayPasswordCheckBoxClick (wxCommandEvent& event)
                    220:        {
                    221:                DisplayPassword (event.IsChecked(), &PasswordTextCtrl, 1);
                    222:                
                    223:                if (ConfirmPasswordTextCtrl->IsShown())
                    224:                        DisplayPassword (event.IsChecked(), &ConfirmPasswordTextCtrl, 2);
                    225: 
                    226:                OnUpdate();
                    227:        }
                    228: 
                    229:        void VolumePasswordPanel::OnConfigureKeyfilesMenuItemSelected (wxCommandEvent& event)
                    230:        {
                    231:                KeyfilesDialog dialog (GetParent(), Keyfiles);
                    232: 
                    233:                if (dialog.ShowModal() == wxID_OK)
                    234:                {
                    235:                        Keyfiles = dialog.GetKeyfiles();
                    236: 
                    237:                        UseKeyfilesCheckBox->SetValue (!Keyfiles->empty());
                    238:                        OnUpdate();
                    239:                }
                    240:        }
                    241: 
                    242:        void VolumePasswordPanel::OnKeyfilesButtonClick (wxCommandEvent& event)
                    243:        {
                    244:                wxMenu popup;
                    245:                Gui->AppendToMenu (popup, _("&Configure..."), this, wxCommandEventHandler (VolumePasswordPanel::OnConfigureKeyfilesMenuItemSelected));
                    246: 
                    247:                popup.AppendSeparator();
                    248:                Gui->AppendToMenu (popup, _("Add &Files..."), this, wxCommandEventHandler (VolumePasswordPanel::OnAddKeyfilesMenuItemSelected));
                    249:                Gui->AppendToMenu (popup, _("Add &Directory..."), this, wxCommandEventHandler (VolumePasswordPanel::OnAddKeyfileDirMenuItemSelected));
                    250: 
                    251:                PopupMenu (&popup, KeyfilesButton->GetPosition().x + 2, KeyfilesButton->GetPosition().y + 2);
                    252:        }
                    253: 
                    254:        bool VolumePasswordPanel::PasswordsMatch () const
                    255:        {
                    256:                assert (ConfirmPasswordStaticText->IsShown());
                    257:                return *GetPassword (PasswordTextCtrl) == *GetPassword (ConfirmPasswordTextCtrl);
                    258:        }
                    259: 
                    260:        void VolumePasswordPanel::WipeTextCtrl (wxTextCtrl *textCtrl)
                    261:        {
                    262:                textCtrl->SetValue (wxString (L'X', textCtrl->GetLineLength(0)));
                    263:                textCtrl->SetValue (L"");
                    264:        }
                    265: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.