Annotation of truecrypt/main/forms/volumecreationwizard.cpp, revision 1.1

1.1     ! root        1: 
        !             2: #include "System.h"
        !             3: #include "Core/RandomNumberGenerator.h"
        !             4: #include "Main/Application.h"
        !             5: #include "Main/GraphicUserInterface.h"
        !             6: #include "Main/Resources.h"
        !             7: #include "VolumeCreationWizard.h"
        !             8: #include "EncryptionOptionsWizardPage.h"
        !             9: #include "InfoWizardPage.h"
        !            10: #include "ProgressWizardPage.h"
        !            11: #include "SingleChoiceWizardPage.h"
        !            12: #include "VolumeCreationIntroWizardPage.h"
        !            13: #include "VolumeCreationProgressWizardPage.h"
        !            14: #include "VolumeFormatOptionsWizardPage.h"
        !            15: #include "VolumeLocationWizardPage.h"
        !            16: #include "VolumePasswordWizardPage.h"
        !            17: #include "VolumeSizeWizardPage.h"
        !            18: 
        !            19: namespace TrueCrypt
        !            20: {
        !            21:        VolumeCreationWizard::VolumeCreationWizard (wxWindow* parent)
        !            22:                : WizardFrame (parent),
        !            23:                DeviceWarningConfirmed (false),
        !            24:                DisplayKeyInfo (true),
        !            25:                QuickFormatEnabled (false),
        !            26:                SelectedFilesystemClusterSize (0),
        !            27:                SelectedFilesystemType (VolumeCreationOptions::FilesystemType::FAT),
        !            28:                SelectedVolumeType (VolumeType::Normal),
        !            29:                VolumeSize (0)
        !            30:        {
        !            31:                RandomNumberGenerator::Start();
        !            32: 
        !            33:                SetTitle (LangString["VOLUME_CREATION_WIZARD"]);
        !            34:                SetImage (Resources::GetVolumeCreationWizardBitmap (Gui->GetCharHeight (this) * 21));
        !            35:                SetMaxStaticTextWidth (55);
        !            36: 
        !            37:                SetStep (Step::VolumeType);
        !            38: 
        !            39:                class Timer : public wxTimer
        !            40:                {
        !            41:                public:
        !            42:                        Timer (VolumeCreationWizard *wizard) : Wizard (wizard) { }
        !            43: 
        !            44:                        void Notify()
        !            45:                        {
        !            46:                                Wizard->OnRandomPoolUpdateTimer();
        !            47:                        }
        !            48: 
        !            49:                        VolumeCreationWizard *Wizard;
        !            50:                }; 
        !            51: 
        !            52:                RandomPoolUpdateTimer.reset (dynamic_cast <wxTimer *> (new Timer (this)));
        !            53:                RandomPoolUpdateTimer->Start (200);
        !            54:        }
        !            55: 
        !            56:        VolumeCreationWizard::~VolumeCreationWizard ()
        !            57:        {
        !            58:                RandomNumberGenerator::Stop();
        !            59:        }
        !            60: 
        !            61:        WizardPage *VolumeCreationWizard::GetPage (WizardStep step)
        !            62:        {
        !            63:                switch (step)
        !            64:                {
        !            65:                case Step::VolumeType:
        !            66:                        {
        !            67:                                ClearHistory();
        !            68: 
        !            69:                                VolumeCreationIntroWizardPage *page = new VolumeCreationIntroWizardPage (GetPageParent());
        !            70:                                page->SetMinSize (wxSize (Gui->GetCharWidth (this) * 58, Gui->GetCharHeight (this) * 18 + 5));
        !            71: 
        !            72:                                page->SetPageTitle (LangString["VOLUME_CREATION_WIZARD"]);
        !            73:                                page->SetPageText (LangString["VOLUME_CREATION_INTRO"]);
        !            74: 
        !            75:                                page->SetSelection (SelectedVolumeType);
        !            76:                                return page;
        !            77:                        }
        !            78: 
        !            79:                case Step::VolumeLocation:
        !            80:                        {
        !            81:                                VolumeLocationWizardPage *page = new VolumeLocationWizardPage (GetPageParent());
        !            82:                                page->SetPageTitle (LangString["VOLUME_LOCATION"]);
        !            83:                                page->SetPageText (LangString["VOLUME_LOCATION_WIZARD_PAGE_INFO"]);
        !            84: 
        !            85:                                page->SetVolumePath (SelectedVolumePath);
        !            86:                                return page;
        !            87:                        }
        !            88: 
        !            89:                case Step::VolumeSize:
        !            90:                        {
        !            91:                                VolumeSizeWizardPage *page = new VolumeSizeWizardPage (GetPageParent(), SelectedVolumePath);
        !            92:                                page->SetPageTitle (LangString["SIZE_TITLE"]);
        !            93:                                page->SetPageText (LangString["VOLUME_SIZE_HELP"]);
        !            94:                                page->SetVolumeSize (VolumeSize);
        !            95:                                return page;
        !            96:                        }
        !            97: 
        !            98:                case Step::EncryptionOptions:
        !            99:                        {
        !           100:                                EncryptionOptionsWizardPage *page = new EncryptionOptionsWizardPage (GetPageParent());
        !           101:                                page->SetPageTitle (LangString["CIPHER_TITLE"]);
        !           102:                                page->SetEncryptionAlgorithm (SelectedEncryptionAlgorithm);
        !           103:                                page->SetHash (SelectedHash);
        !           104:                                return page;
        !           105:                        }
        !           106: 
        !           107:                case Step::VolumePassword:
        !           108:                        {
        !           109:                                VolumePasswordWizardPage *page = new VolumePasswordWizardPage (GetPageParent(), Password, Keyfiles);
        !           110:                                page->SetPageTitle (LangString["PASSWORD_TITLE"]);
        !           111:                                page->SetPageText (LangString["PASSWORD_HELP"]);
        !           112:                                return page;
        !           113:                        }
        !           114: 
        !           115:                case Step::FormatOptions:
        !           116:                        {
        !           117:                                VolumeFormatOptionsWizardPage *page = new VolumeFormatOptionsWizardPage (GetPageParent(), SelectedVolumePath);
        !           118:                                page->SetPageTitle (_("Format Options"));
        !           119:                                page->SetFilesystemType (SelectedFilesystemType);
        !           120:                                page->SetQuickFormat (QuickFormatEnabled);
        !           121:                                return page;
        !           122:                        }
        !           123:                        
        !           124:                case Step::CreationProgress:
        !           125:                        {
        !           126:                                VolumeCreationProgressWizardPage *page = new VolumeCreationProgressWizardPage (GetPageParent(), DisplayKeyInfo);
        !           127:                                page->SetPageTitle (LangString["FORMAT_TITLE"]);
        !           128:                                page->SetPageText (LangString["FORMAT_HELP"]);
        !           129:                                page->AbortEvent.Connect (EventConnector <VolumeCreationWizard> (this, &VolumeCreationWizard::OnAbortButtonClick));
        !           130:                                page->SetNextButtonText (LangString["FORMAT"]);
        !           131:                                return page;
        !           132:                        }
        !           133: 
        !           134:                case Step::VolumeCreatedInfo:
        !           135:                        {
        !           136:                                InfoWizardPage *page = new InfoWizardPage (GetPageParent());
        !           137:                                page->SetPageTitle (LangString["FORMAT_FINISHED_TITLE"]);
        !           138:                                page->SetPageText (LangString["FORMAT_FINISHED_HELP"]);
        !           139:                                
        !           140:                                SetCancelButtonText (_("Exit"));
        !           141:                                return page;
        !           142:                        }
        !           143: 
        !           144:                default:
        !           145:                        throw ParameterIncorrect (SRC_POS);
        !           146:                }
        !           147:        }
        !           148: 
        !           149:        void VolumeCreationWizard::OnAbortButtonClick (EventArgs &args)
        !           150:        {
        !           151:                AbortRequested = true;
        !           152:        }
        !           153: 
        !           154:        void VolumeCreationWizard::OnMouseMotion (wxMouseEvent& event)
        !           155:        {
        !           156:                event.Skip();
        !           157:                if (!IsWorkInProgress() && RandomNumberGenerator::IsRunning())
        !           158:                {
        !           159:                        RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&event), sizeof (event)));
        !           160:                        
        !           161:                        long coord = event.GetX();
        !           162:                        RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&coord), sizeof (coord)));
        !           163:                        coord = event.GetY();
        !           164:                        RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&coord), sizeof (coord)));
        !           165:                }
        !           166:        }
        !           167:        
        !           168:        void VolumeCreationWizard::OnProgressTimer ()
        !           169:        {
        !           170:                if (!IsWorkInProgress())
        !           171:                        return;
        !           172: 
        !           173:                if (AbortRequested && !AbortConfirmationPending)
        !           174:                {
        !           175:                        AbortConfirmationPending = true;
        !           176:                        if (Gui->AskYesNo (LangString ["FORMAT_ABORT"], true))
        !           177:                        {
        !           178:                                if (IsWorkInProgress() && Creator.get() != nullptr)
        !           179:                                {
        !           180:                                        CreationAborted = true;
        !           181:                                        Creator->Abort();
        !           182:                                }
        !           183:                        }
        !           184:                        AbortRequested = false;
        !           185:                        AbortConfirmationPending = false;
        !           186:                }
        !           187: 
        !           188:                VolumeCreator::ProgressInfo progress = Creator->GetProgressInfo();
        !           189:                
        !           190:                VolumeCreationProgressWizardPage *page = dynamic_cast <VolumeCreationProgressWizardPage *> (GetCurrentPage());
        !           191:                page->SetProgressValue (progress.SizeDone);
        !           192: 
        !           193:                if (!progress.CreationInProgress && !AbortConfirmationPending)
        !           194:                {
        !           195:                        SetWorkInProgress (false);
        !           196:                        OnVolumeCreatorFinished ();
        !           197:                }
        !           198:        }
        !           199:        
        !           200:        void VolumeCreationWizard::OnRandomPoolUpdateTimer ()
        !           201:        {       
        !           202:                if (!IsWorkInProgress())
        !           203:                {
        !           204:                        wxLongLong time = wxGetLocalTimeMillis();
        !           205:                        RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&time), sizeof (time)));
        !           206:                }
        !           207:        }
        !           208: 
        !           209:        void VolumeCreationWizard::OnVolumeCreatorFinished ()
        !           210:        {
        !           211:                VolumeCreationProgressWizardPage *page = dynamic_cast <VolumeCreationProgressWizardPage *> (GetCurrentPage());
        !           212: 
        !           213:                ProgressTimer.reset();
        !           214:                page->SetProgressState (false);
        !           215: 
        !           216:                Gui->EndInteractiveBusyState (this);
        !           217:                SetWorkInProgress (false);
        !           218:                UpdateControls();
        !           219: 
        !           220:                try
        !           221:                {
        !           222:                        if (!CreationAborted)
        !           223:                        {
        !           224:                                Creator->CheckResult();
        !           225:                                Gui->ShowInfo ("FORMAT_FINISHED_INFO");
        !           226:                                SetStep (Step::VolumeCreatedInfo);
        !           227:                                return;
        !           228:                        }
        !           229:                }
        !           230:                catch (Exception &e)
        !           231:                {
        !           232:                        Gui->ShowError (e);
        !           233:                }
        !           234: 
        !           235:                page->SetProgressValue (0);
        !           236:                if (SelectedVolumeType == VolumeType::Normal && !SelectedVolumePath.IsDevice())
        !           237:                {
        !           238:                        try
        !           239:                        {
        !           240:                                FilePath (wstring (SelectedVolumePath)).Delete();
        !           241:                        }
        !           242:                        catch (Exception &e) {Gui->ShowError(e); }
        !           243:                }
        !           244:        }
        !           245: 
        !           246:        WizardFrame::WizardStep VolumeCreationWizard::ProcessPageChangeRequest (bool forward)
        !           247:        {
        !           248:                switch (GetCurrentStep())
        !           249:                {
        !           250:                case Step::VolumeType:
        !           251:                        {
        !           252:                                VolumeCreationIntroWizardPage *page = dynamic_cast <VolumeCreationIntroWizardPage *> (GetCurrentPage());
        !           253:                                SelectedVolumeType = page->GetSelection();
        !           254:                                
        !           255:                                if (forward && SelectedVolumeType != VolumeType::Normal)
        !           256:                                {
        !           257:                                        Gui->ShowInfo ("FEATURE_CURRENTLY_UNSUPPORTED_ON_PLATFORM");
        !           258:                                        return Step::VolumeType;
        !           259:                                }
        !           260: 
        !           261:                                return Step::VolumeLocation;
        !           262:                        }
        !           263: 
        !           264:                case Step::VolumeLocation:
        !           265:                        {
        !           266:                                VolumeLocationWizardPage *page = dynamic_cast <VolumeLocationWizardPage *> (GetCurrentPage());
        !           267:                                SelectedVolumePath = page->GetVolumePath();
        !           268:                                VolumeSize = 0;
        !           269: 
        !           270:                                if (forward)
        !           271:                                {
        !           272:                                        if (Core->IsVolumeMounted (SelectedVolumePath))
        !           273:                                        {
        !           274:                                                Gui->ShowInfo ("DISMOUNT_FIRST");
        !           275:                                                return GetCurrentStep();
        !           276:                                        }
        !           277: 
        !           278:                                        if (SelectedVolumePath.IsDevice())
        !           279:                                        {
        !           280:                                                if (!DeviceWarningConfirmed && !Gui->AskYesNo (LangString["FORMAT_DEVICE_FOR_ADVANCED_ONLY"]))
        !           281:                                                        return GetCurrentStep();
        !           282: 
        !           283:                                                DeviceWarningConfirmed = true;
        !           284: 
        !           285:                                                try
        !           286:                                                {
        !           287:                                                        VolumeSize = Core->GetDeviceSize (SelectedVolumePath);
        !           288:                                                }
        !           289:                                                catch (UserAbort&)
        !           290:                                                {
        !           291:                                                        return Step::VolumeLocation;
        !           292:                                                }
        !           293:                                                catch (exception &e)
        !           294:                                                {
        !           295:                                                        Gui->ShowError (e);
        !           296:                                                        Gui->ShowError ("CANNOT_CALC_SPACE");
        !           297:                                                        return GetCurrentStep();
        !           298:                                                }
        !           299:                                        }
        !           300:                                }
        !           301: 
        !           302:                                if (SelectedVolumePath.IsDevice())
        !           303:                                        return Step::EncryptionOptions;
        !           304:                                else
        !           305:                                        return Step::VolumeSize;
        !           306:                        }
        !           307:                        
        !           308:                case Step::VolumeSize:
        !           309:                        {
        !           310:                                VolumeSizeWizardPage *page = dynamic_cast <VolumeSizeWizardPage *> (GetCurrentPage());
        !           311: 
        !           312:                                try
        !           313:                                {
        !           314:                                        VolumeSize = page->GetVolumeSize();
        !           315:                                }
        !           316:                                catch (Exception &e)
        !           317:                                {
        !           318:                                        if (forward)
        !           319:                                        {
        !           320:                                                Gui->ShowError (e);
        !           321:                                                return GetCurrentStep();
        !           322:                                        }
        !           323:                                }
        !           324: 
        !           325:                                return Step::EncryptionOptions;
        !           326:                        }
        !           327: 
        !           328:                case Step::EncryptionOptions:
        !           329:                        {
        !           330:                                EncryptionOptionsWizardPage *page = dynamic_cast <EncryptionOptionsWizardPage *> (GetCurrentPage());
        !           331:                                SelectedEncryptionAlgorithm = page->GetEncryptionAlgorithm ();
        !           332:                                SelectedHash = page->GetHash ();
        !           333: 
        !           334:                                if (forward)
        !           335:                                        RandomNumberGenerator::SetHash (SelectedHash);
        !           336: 
        !           337:                                return Step::VolumePassword;
        !           338:                        }
        !           339: 
        !           340:                case Step::VolumePassword:
        !           341:                        {
        !           342:                                VolumePasswordWizardPage *page = dynamic_cast <VolumePasswordWizardPage *> (GetCurrentPage());
        !           343:                                Password = page->GetPassword();
        !           344:                                Keyfiles = page->GetKeyfiles();
        !           345: 
        !           346:                                if (forward && Password && !Password->IsEmpty())
        !           347:                                {
        !           348:                                        try
        !           349:                                        {
        !           350:                                                Password->CheckPortability();
        !           351:                                        }
        !           352:                                        catch (UnportablePassword &e)
        !           353:                                        {
        !           354:                                                Gui->ShowError (e);
        !           355:                                                return GetCurrentStep();
        !           356:                                        }
        !           357: 
        !           358:                                        if (Password->Size() < VolumePassword::WarningSizeThreshold
        !           359:                                                && !Gui->AskYesNo (LangString["PASSWORD_LENGTH_WARNING"], false, true))
        !           360:                                        {
        !           361:                                                return GetCurrentStep();
        !           362:                                        }
        !           363:                                }
        !           364: 
        !           365:                                return Step::FormatOptions;
        !           366:                        }
        !           367: 
        !           368:                case Step::FormatOptions:
        !           369:                        {
        !           370:                                VolumeFormatOptionsWizardPage *page = dynamic_cast <VolumeFormatOptionsWizardPage *> (GetCurrentPage());
        !           371:                                SelectedFilesystemType = page->GetFilesystemType();
        !           372:                                QuickFormatEnabled = page->IsQuickFormatEnabled();
        !           373: 
        !           374:                                return Step::CreationProgress;
        !           375:                        }
        !           376: 
        !           377:                        
        !           378:                case Step::CreationProgress:
        !           379:                        {
        !           380:                                VolumeCreationProgressWizardPage *page = dynamic_cast <VolumeCreationProgressWizardPage *> (GetCurrentPage());
        !           381: 
        !           382:                                DisplayKeyInfo = page->IsKeyInfoDisplayed();
        !           383: 
        !           384:                                if (forward)
        !           385:                                {
        !           386:                                        if (SelectedVolumePath.IsDevice())
        !           387:                                        {
        !           388:                                                wxString confirmMsg = LangString["OVERWRITEPROMPT_DEVICE"];
        !           389:                                                confirmMsg.Replace (L"%hs", L"%s");
        !           390: 
        !           391:                                                if (!Gui->AskYesNo (wxString::Format (confirmMsg, wxString (_("DEVICE")).c_str(), wstring (SelectedVolumePath).c_str(), L""), false, true))
        !           392:                                                        return GetCurrentStep();
        !           393:                                        }
        !           394:                                        else if (FilesystemPath (wstring (SelectedVolumePath)).IsFile())
        !           395:                                        {
        !           396:                                                wxString confirmMsg = LangString["OVERWRITEPROMPT"];
        !           397:                                                confirmMsg.Replace (L"%hs", L"%s");
        !           398: 
        !           399:                                                if (!Gui->AskYesNo (wxString::Format (confirmMsg, wstring (SelectedVolumePath).c_str(), false, true)))
        !           400:                                                        return GetCurrentStep();
        !           401:                                        }
        !           402: 
        !           403:                                        AbortRequested = false;
        !           404:                                        AbortConfirmationPending = false;
        !           405:                                        CreationAborted = false;
        !           406:                                        SetWorkInProgress (true);
        !           407:                                        UpdateControls();
        !           408: 
        !           409:                                        Gui->BeginInteractiveBusyState (this);
        !           410: 
        !           411:                                        try
        !           412:                                        {
        !           413:                                                make_shared_auto (VolumeCreationOptions, options);
        !           414: 
        !           415:                                                options->Filesystem = SelectedFilesystemType;
        !           416:                                                options->FilesystemClusterSize = SelectedFilesystemClusterSize;
        !           417: 
        !           418:                                                options->EA = SelectedEncryptionAlgorithm;
        !           419:                                                options->Password = Password;
        !           420:                                                options->Path = SelectedVolumePath;
        !           421:                                                options->Quick = QuickFormatEnabled;
        !           422:                                                options->Size = VolumeSize;
        !           423:                                                options->Type = SelectedVolumeType;
        !           424:                                                options->VolumeHeaderKdf = Pkcs5Kdf::GetAlgorithm (*SelectedHash);
        !           425: 
        !           426:                                                Creator.reset (new VolumeCreator);
        !           427:                                                Creator->CreateVolume (options);
        !           428: 
        !           429:                                                page->SetKeyInfo (Creator->GetKeyInfo());
        !           430: 
        !           431:                                                class Timer : public wxTimer
        !           432:                                                {
        !           433:                                                public:
        !           434:                                                        Timer (VolumeCreationWizard *wizard) : Wizard (wizard) { }
        !           435: 
        !           436:                                                        void Notify()
        !           437:                                                        {
        !           438:                                                                Wizard->OnProgressTimer();
        !           439:                                                        }
        !           440: 
        !           441:                                                        VolumeCreationWizard *Wizard;
        !           442:                                                }; 
        !           443: 
        !           444:                                                page->SetProgressRange (options->Size);
        !           445:                                                page->SetProgressState (true);
        !           446:                                                ProgressTimer.reset (dynamic_cast <wxTimer *> (new Timer (this)));
        !           447:                                                ProgressTimer->Start (50);
        !           448:                                        }
        !           449:                                        catch (Exception &e)
        !           450:                                        {
        !           451:                                                CreationAborted = true;
        !           452:                                                OnVolumeCreatorFinished();
        !           453:                                                Gui->ShowError (e);
        !           454:                                        }
        !           455:                                }
        !           456: 
        !           457:                                return GetCurrentStep();
        !           458:                        }
        !           459: 
        !           460:                case Step::VolumeCreatedInfo:
        !           461:                        Creator.reset();
        !           462:                        SetCancelButtonText (L"");
        !           463:                        return Step::VolumeType;
        !           464: 
        !           465:                default:
        !           466:                        throw ParameterIncorrect (SRC_POS);
        !           467:                }
        !           468:        }
        !           469: 
        !           470:        void VolumeCreationWizard::UpdateControls ()
        !           471:        {
        !           472:                VolumeCreationProgressWizardPage *page = dynamic_cast <VolumeCreationProgressWizardPage *> (GetCurrentPage());
        !           473:                if (page)
        !           474:                {
        !           475:                        page->EnableAbort (IsWorkInProgress());
        !           476:                }
        !           477:        }
        !           478: }

unix.superglobalmegacorp.com

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