Annotation of truecrypt/main/forms/volumepasswordpanel.cpp, revision 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.