X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/84aacf34eae6543be9f0280b2015385f91e5c2c6..b54c578e17e9bcbd74aa30ea75e25e955b9a6205:/SecurityTool/macOS/db_commands.cpp diff --git a/SecurityTool/macOS/db_commands.cpp b/SecurityTool/macOS/db_commands.cpp new file mode 100644 index 00000000..381501f9 --- /dev/null +++ b/SecurityTool/macOS/db_commands.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2003-2005,2012,2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + * + * db_commands.cpp -- commands to directly manipulate Db's using the DL API. + */ + +#include "db_commands.h" + +#include "readline_cssm.h" +#include "security_tool.h" + +#include +#include +#include +#include + +using namespace CssmClient; + +static int +do_db_create(const CSSM_GUID guid, const char *dbname, Boolean do_openparams, Boolean do_autocommit, Boolean do_mode, mode_t mode, Boolean do_version_0_params) +{ + int result = 0; + + try + { + CSSM_APPLEDL_OPEN_PARAMETERS openParameters = { sizeof(CSSM_APPLEDL_OPEN_PARAMETERS), + (do_version_0_params ? 0 : CSSM_APPLEDL_OPEN_PARAMETERS_VERSION) }; + Cssm cssm; + Module module(guid, cssm); + DL dl(module); + Db db(dl, dbname); + + if (do_openparams) + { + openParameters.autoCommit = do_autocommit; + if (!do_version_0_params && do_mode) + { + openParameters.mask |= kCSSM_APPLEDL_MASK_MODE; + openParameters.mode = mode; + } + + db->openParameters(&openParameters); + } + + db->create(); + } + catch (const CommonError &e) + { + OSStatus status = e.osStatus(); + sec_error("CSSM_DbCreate %s: %s", dbname, sec_errstr(status)); + } + catch (...) + { + result = 1; + } + + return result; +} + +static int +parse_guid(const char *name, CSSM_GUID *guid) +{ + size_t len = strlen(name); + + if (!strncmp("dl", name, len)) + *guid = gGuidAppleFileDL; + else if (!strncmp("cspdl", name, len)) + *guid = gGuidAppleCSPDL; + else + { + sec_error("Invalid guid: %s", name); + return SHOW_USAGE_MESSAGE; + } + + return 0; +} + + +static int +parse_mode(const char *name, mode_t *pmode) +{ + int result = 0; + mode_t mode = 0; + const char *p; + + if (!name || !pmode || *name != '0') + { + result = 2; + goto loser; + } + + for (p = name + 1; *p; ++p) + { + if (*p < '0' || *p > '7') + { + result = 2; + goto loser; + } + + mode = (mode << 3) + *p - '0'; + } + + *pmode = mode; + return 0; + +loser: + sec_error("Invalid mode: %s", name); + return result; +} + +int +db_create(int argc, char * const *argv) +{ + int free_dbname = 0; + char *dbname = NULL; + int ch, result = 0; + bool do_autocommit = true, do_mode = false; + bool do_openparams = false, do_version_0_params = false; + mode_t mode = 0666; + CSSM_GUID guid = gGuidAppleFileDL; + + while ((ch = getopt(argc, argv, "0ahg:m:o")) != -1) + { + switch (ch) + { + case '0': + do_version_0_params = true; + do_openparams = true; + break; + case 'a': + do_autocommit = false; + do_openparams = true; + break; + case 'g': + result = parse_guid(optarg, &guid); + if (result) + goto loser; + break; + case 'm': + result = parse_mode(optarg, &mode); + if (result) + goto loser; + do_mode = true; + do_openparams = true; + break; + case 'o': + do_openparams = true; + break; + case '?': + default: + return SHOW_USAGE_MESSAGE; + } + } + + argc -= optind; + argv += optind; + + if (argc > 0) + dbname = *argv; + else + { + fprintf(stderr, "db to create: "); + dbname = readline(NULL, 0); + if (!dbname) + { + result = -1; + goto loser; + } + + free_dbname = 1; + if (*dbname == '\0') + goto loser; + } + + do + { + result = do_db_create(guid, dbname, do_openparams, do_autocommit, do_mode, mode, do_version_0_params); + if (result) + goto loser; + + argc--; + argv++; + dbname = *argv; + } while (argc > 0); + +loser: + if (free_dbname) + free(dbname); + + return result; +}