VirtualBox

Changeset 42446 in vbox


Ignore:
Timestamp:
Jul 30, 2012 1:17:14 PM (12 years ago)
Author:
vboxsync
Message:

added --settingspw and --settingspwfile to VBoxHeadless and VBoxSDL

Location:
trunk/src/VBox/Frontends
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp

    r42382 r42446  
    471471             "                                         \"TCP/Address\" - interface IP the VRDE server\n"
    472472             "                                         will bind to\n"
     473             "   --settingspw                          Specify the settings password\n"
     474             "   --settingspwfile                      Specify a file containing the settings password\n"
    473475#ifdef VBOX_WITH_VIDEO_REC
    474476             "   -c, -capture, --capture               Record the VM screen output to a file\n"
     
    476478             "   -h, --height                          Frame height when recording\n"
    477479             "   -r, --bitrate                         Recording bit rate when recording\n"
    478              "   -f, --filename                        File name when recording.  The codec\n"
    479              "                                         used will be chosen based on the\n"
    480              "                                         file extension\n"
     480             "   -f, --filename                        File name when recording. The codec used\n"
     481             "                                         will be chosen based on the file extension\n"
    481482#endif
    482483             "\n");
     
    528529}
    529530#endif /* VBOX_WITH_VIDEO_REC defined */
     531
     532static RTEXITCODE readPasswordFile(const char *pszFilename, com::Utf8Str *pPasswd)
     533{
     534    size_t cbFile;
     535    char szPasswd[512];
     536    int vrc = VINF_SUCCESS;
     537    RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
     538    bool fStdIn = !strcmp(pszFilename, "stdin");
     539    PRTSTREAM pStrm;
     540    if (!fStdIn)
     541        vrc = RTStrmOpen(pszFilename, "r", &pStrm);
     542    else
     543        pStrm = g_pStdIn;
     544    if (RT_SUCCESS(vrc))
     545    {
     546        vrc = RTStrmReadEx(pStrm, szPasswd, sizeof(szPasswd)-1, &cbFile);
     547        if (RT_SUCCESS(vrc))
     548        {
     549            if (cbFile >= sizeof(szPasswd)-1)
     550            {
     551                RTPrintf("Provided password in file '%s' is too long\n", pszFilename);
     552                rcExit = RTEXITCODE_FAILURE;
     553            }
     554            else
     555            {
     556                unsigned i;
     557                for (i = 0; i < cbFile && !RT_C_IS_CNTRL(szPasswd[i]); i++)
     558                    ;
     559                szPasswd[i] = '\0';
     560                *pPasswd = szPasswd;
     561            }
     562        }
     563        else
     564        {
     565            RTPrintf("Cannot read password from file '%s': %Rrc\n", pszFilename, vrc);
     566            rcExit = RTEXITCODE_FAILURE;
     567        }
     568        if (!fStdIn)
     569            RTStrmClose(pStrm);
     570    }
     571    else
     572    {
     573        RTPrintf("Cannot open password file '%s' (%Rrc)\n", pszFilename, vrc);
     574        rcExit = RTEXITCODE_FAILURE;
     575    }
     576
     577    return rcExit;
     578}
     579
     580static RTEXITCODE settingsPasswordFile(ComPtr<IVirtualBox> virtualBox, const char *pszFilename)
     581{
     582    com::Utf8Str passwd;
     583    RTEXITCODE rcExit = readPasswordFile(pszFilename, &passwd);
     584    if (rcExit == RTEXITCODE_SUCCESS)
     585    {
     586        int rc;
     587        CHECK_ERROR(virtualBox, SetSettingsSecret(com::Bstr(passwd).raw()));
     588        if (FAILED(rc))
     589            rcExit = RTEXITCODE_FAILURE;
     590    }
     591
     592    return rcExit;
     593}
    530594
    531595#ifdef RT_OS_WINDOWS
     
    577641        OPT_CSAM,
    578642        OPT_NO_CSAM,
     643        OPT_SETTINGSPW,
     644        OPT_SETTINGSPW_FILE,
    579645        OPT_COMMENT
    580646    };
     
    610676        { "-nocsam", OPT_NO_CSAM, 0 },
    611677        { "--nocsam", OPT_NO_CSAM, 0 },
     678        { "--settingspw", OPT_SETTINGSPW, RTGETOPT_REQ_STRING },
     679        { "--settingspwfile", OPT_SETTINGSPW_FILE, RTGETOPT_REQ_STRING },
    612680#ifdef VBOX_WITH_VIDEO_REC
    613681        { "-capture", 'c', 0 },
     
    626694    // parse the command line
    627695    int ch;
     696    const char *pcszSettingsPw = NULL;
     697    const char *pcszSettingsPwFile = NULL;
    628698    RTGETOPTUNION ValueUnion;
    629699    RTGETOPTSTATE GetState;
     
    676746            case OPT_NO_CSAM:
    677747                fCSAM = false;
     748                break;
     749            case OPT_SETTINGSPW:
     750                pcszSettingsPw = ValueUnion.psz;
     751                break;
     752            case OPT_SETTINGSPW_FILE:
     753                pcszSettingsPwFile = ValueUnion.psz;
    678754                break;
    679755#ifdef VBOX_WITH_VIDEO_REC
     
    807883            RTPrintf("Failed to get session object (rc=%Rhrc)!\n", rc);
    808884            break;
     885        }
     886
     887        if (pcszSettingsPw)
     888        {
     889            CHECK_ERROR(virtualBox, SetSettingsSecret(Bstr(pcszSettingsPw).raw()));
     890            if (FAILED(rc))
     891                break;
     892        }
     893        else if (pcszSettingsPwFile)
     894        {
     895            int rcExit = settingsPasswordFile(virtualBox, pcszSettingsPwFile);
     896            if (rcExit != RTEXITCODE_SUCCESS)
     897                break;
    809898        }
    810899
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp

    r42382 r42446  
    6363#include <iprt/asm.h>
    6464#include <iprt/assert.h>
     65#include <iprt/ctype.h>
    6566#include <iprt/env.h>
    6667#include <iprt/file.h>
     
    157158static int     WaitSDLEvent(SDL_Event *event);
    158159static void    SetFullscreen(bool enable);
     160static RTEXITCODE readPasswordFile(const char *pszFilename, com::Utf8Str *pPasswd);
     161static RTEXITCODE settingsPasswordFile(ComPtr<IVirtualBox> virtualBox, const char *pszFilename);
     162
    159163#ifdef VBOX_WITH_SDL13
    160164static VBoxSDLFB * getFbFromWinId(SDL_WindowID id);
     
    617621             "  --vrdp <ports>           Listen for VRDP connections on one of specified ports (default if not specified)\n"
    618622             "  --discardstate           Discard saved state (if present) and revert to last snapshot (if present)\n"
     623             "  --settingspw             Specify the settings password\n"
     624             "  --settingspwfile         Specify a file containing the settings password\n"
    619625#ifdef VBOX_SECURELABEL
    620626             "  --securelabel            Display a secure VM label at the top of the screen\n"
     
    815821    bool fXPCOMEventThreadSignaled = false;
    816822#endif
    817     char *hdaFile   = NULL;
    818     char *cdromFile = NULL;
    819     char *fdaFile   = NULL;
     823    const char *pcszHdaFile   = NULL;
     824    const char *pcszCdromFile = NULL;
     825    const char *pcszFdaFile   = NULL;
    820826    const char *pszPortVRDP = NULL;
    821827    bool fDiscardState = false;
     828    const char *pcszSettingsPw = NULL;
     829    const char *pcszSettingsPwFile = NULL;
    822830#ifdef VBOX_SECURELABEL
    823831    BOOL fSecureLabel = false;
     
    11181126            /* resolve it. */
    11191127            if (RTPathExists(argv[curArg]))
    1120                 hdaFile = RTPathRealDup(argv[curArg]);
    1121             if (!hdaFile)
     1128                pcszHdaFile = RTPathRealDup(argv[curArg]);
     1129            if (!pcszHdaFile)
    11221130            {
    11231131                RTPrintf("Error: The path to the specified harddisk, '%s', could not be resolved.\n", argv[curArg]);
     
    11351143            /* resolve it. */
    11361144            if (RTPathExists(argv[curArg]))
    1137                 fdaFile = RTPathRealDup(argv[curArg]);
    1138             if (!fdaFile)
     1145                pcszFdaFile = RTPathRealDup(argv[curArg]);
     1146            if (!pcszFdaFile)
    11391147            {
    11401148                RTPrintf("Error: The path to the specified floppy disk, '%s', could not be resolved.\n", argv[curArg]);
     
    11521160            /* resolve it. */
    11531161            if (RTPathExists(argv[curArg]))
    1154                 cdromFile = RTPathRealDup(argv[curArg]);
    1155             if (!cdromFile)
     1162                pcszCdromFile = RTPathRealDup(argv[curArg]);
     1163            if (!pcszCdromFile)
    11561164            {
    11571165                RTPrintf("Error: The path to the specified cdrom, '%s', could not be resolved.\n", argv[curArg]);
     
    11771185        {
    11781186            fDiscardState = true;
     1187        }
     1188        else if (!strcmp(argv[curArg], "--settingspw"))
     1189        {
     1190            if (++curArg >= argc)
     1191            {
     1192                RTPrintf("Error: missing password");
     1193                return 1;
     1194            }
     1195            pcszSettingsPw = argv[curArg];
     1196        }
     1197        else if (!strcmp(argv[curArg], "--settingspwfile"))
     1198        {
     1199            if (++curArg >= argc)
     1200            {
     1201                RTPrintf("Error: missing password file\n");
     1202                return 1;
     1203            }
     1204            pcszSettingsPwFile = argv[curArg];
    11791205        }
    11801206#ifdef VBOX_SECURELABEL
     
    13751401    }
    13761402
     1403    if (pcszSettingsPw)
     1404    {
     1405        CHECK_ERROR(pVirtualBox, SetSettingsSecret(Bstr(pcszSettingsPw).raw()));
     1406        if (FAILED(rc))
     1407            goto leave;
     1408    }
     1409    else if (pcszSettingsPwFile)
     1410    {
     1411        int rcExit = settingsPasswordFile(pVirtualBox, pcszSettingsPwFile);
     1412        if (rcExit != RTEXITCODE_SUCCESS)
     1413            goto leave;
     1414    }
     1415
    13771416    /*
    13781417     * Do we have a UUID?
     
    14531492     * Are we supposed to use a different hard disk file?
    14541493     */
    1455     if (hdaFile)
     1494    if (pcszHdaFile)
    14561495    {
    14571496        ComPtr<IMedium> pMedium;
     
    14611500         * assign it. If not, register a new image and assign it to the VM.
    14621501         */
    1463         Bstr bstrHdaFile(hdaFile);
     1502        Bstr bstrHdaFile(pcszHdaFile);
    14641503        pVirtualBox->OpenMedium(bstrHdaFile.raw(), DeviceType_HardDisk,
    14651504                                AccessMode_ReadWrite, FALSE /* fForceNewUuid */,
     
    14681507        {
    14691508            /* we've not found the image */
    1470             RTPrintf("Adding hard disk '%s'...\n", hdaFile);
     1509            RTPrintf("Adding hard disk '%s'...\n", pcszHdaFile);
    14711510            pVirtualBox->OpenMedium(bstrHdaFile.raw(), DeviceType_HardDisk,
    14721511                                    AccessMode_ReadWrite, FALSE /* fForceNewUuid */,
     
    15241563     * Mount a floppy if requested.
    15251564     */
    1526     if (fdaFile)
     1565    if (pcszFdaFile)
    15271566    do
    15281567    {
     
    15301569
    15311570        /* unmount? */
    1532         if (!strcmp(fdaFile, "none"))
     1571        if (!strcmp(pcszFdaFile, "none"))
    15331572        {
    15341573            /* nothing to do, NULL object will cause unmount */
     
    15361575        else
    15371576        {
    1538             Bstr bstrFdaFile(fdaFile);
     1577            Bstr bstrFdaFile(pcszFdaFile);
    15391578
    15401579            /* Assume it's a host drive name */
     
    15541593                {
    15551594                    /* try to add to the list */
    1556                     RTPrintf("Adding floppy image '%s'...\n", fdaFile);
     1595                    RTPrintf("Adding floppy image '%s'...\n", pcszFdaFile);
    15571596                    CHECK_ERROR_BREAK(pVirtualBox,
    15581597                                      OpenMedium(bstrFdaFile.raw(),
     
    16091648     * Mount a CD-ROM if requested.
    16101649     */
    1611     if (cdromFile)
     1650    if (pcszCdromFile)
    16121651    do
    16131652    {
     
    16151654
    16161655        /* unmount? */
    1617         if (!strcmp(cdromFile, "none"))
     1656        if (!strcmp(pcszCdromFile, "none"))
    16181657        {
    16191658            /* nothing to do, NULL object will cause unmount */
     
    16211660        else
    16221661        {
    1623             Bstr bstrCdromFile(cdromFile);
     1662            Bstr bstrCdromFile(pcszCdromFile);
    16241663
    16251664            /* Assume it's a host drive name */
     
    16381677                {
    16391678                    /* try to add to the list */
    1640                     RTPrintf("Adding ISO image '%s'...\n", cdromFile);
     1679                    RTPrintf("Adding ISO image '%s'...\n", pcszCdromFile);
    16411680                    CHECK_ERROR_BREAK(pVirtualBox,
    16421681                                      OpenMedium(bstrCdromFile.raw(),
     
    29212960}
    29222961
     2962static RTEXITCODE readPasswordFile(const char *pszFilename, com::Utf8Str *pPasswd)
     2963{
     2964    size_t cbFile;
     2965    char szPasswd[512];
     2966    int vrc = VINF_SUCCESS;
     2967    RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
     2968    bool fStdIn = !strcmp(pszFilename, "stdin");
     2969    PRTSTREAM pStrm;
     2970    if (!fStdIn)
     2971        vrc = RTStrmOpen(pszFilename, "r", &pStrm);
     2972    else
     2973        pStrm = g_pStdIn;
     2974    if (RT_SUCCESS(vrc))
     2975    {
     2976        vrc = RTStrmReadEx(pStrm, szPasswd, sizeof(szPasswd)-1, &cbFile);
     2977        if (RT_SUCCESS(vrc))
     2978        {
     2979            if (cbFile >= sizeof(szPasswd)-1)
     2980            {
     2981                RTPrintf("Provided password in file '%s' is too long\n", pszFilename);
     2982                rcExit = RTEXITCODE_FAILURE;
     2983            }
     2984            else
     2985            {
     2986                unsigned i;
     2987                for (i = 0; i < cbFile && !RT_C_IS_CNTRL(szPasswd[i]); i++)
     2988                    ;
     2989                szPasswd[i] = '\0';
     2990                *pPasswd = szPasswd;
     2991            }
     2992        }
     2993        else
     2994        {
     2995            RTPrintf("Cannot read password from file '%s': %Rrc\n", pszFilename, vrc);
     2996            rcExit = RTEXITCODE_FAILURE;
     2997        }
     2998        if (!fStdIn)
     2999            RTStrmClose(pStrm);
     3000    }
     3001    else
     3002    {
     3003        RTPrintf("Cannot open password file '%s' (%Rrc)\n", pszFilename, vrc);
     3004        rcExit = RTEXITCODE_FAILURE;
     3005    }
     3006
     3007    return rcExit;
     3008}
     3009
     3010static RTEXITCODE settingsPasswordFile(ComPtr<IVirtualBox> virtualBox, const char *pszFilename)
     3011{
     3012    com::Utf8Str passwd;
     3013    RTEXITCODE rcExit = readPasswordFile(pszFilename, &passwd);
     3014    if (rcExit == RTEXITCODE_SUCCESS)
     3015    {
     3016        int rc;
     3017        CHECK_ERROR(virtualBox, SetSettingsSecret(com::Bstr(passwd).raw()));
     3018        if (FAILED(rc))
     3019            rcExit = RTEXITCODE_FAILURE;
     3020    }
     3021
     3022    return rcExit;
     3023}
    29233024
    29243025#ifndef VBOX_WITH_HARDENING
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette