static void FreeNsswitchConfContents(NsswitchConf *conf) { size_t i; for(i = 0; i < conf->lines.size; i++) { FreeNsswitchEntryContents(((NsswitchEntry *)conf->lines.data) + i); } CT_SAFE_FREE_STRING(conf->filename); CTArrayFree(&conf->lines); }
static void FreeSshConfContents(struct SshConf *conf) { int i; for(i = 0; i < conf->lineCount; i++) { FreeSshLineContents(&conf->lines[i]); } CTArrayFree(&conf->private_data); UpdatePublicLines(conf); CT_SAFE_FREE_STRING(conf->filename); }
static void FreeNsswitchEntryContents(NsswitchEntry *entry) { size_t i; for(i = 0; i < entry->modules.size; i++) { CTFreeParseTokenContents(GetEntryModule(entry, i)); } CTArrayFree(&entry->modules); CT_SAFE_FREE_STRING(entry->leadingWhiteSpace); CT_SAFE_FREE_STRING(entry->comment); CTFreeParseTokenContents(&entry->name); }
static DWORD WriteNsswitchConfiguration(const char *rootPrefix, NsswitchConf *conf) { DWORD ceError = ERROR_SUCCESS; DynamicArray printedLine; int i; char *tempName = NULL; char *finalName = NULL; char *prefixedPath = NULL; FILE *file = NULL; memset(&printedLine, 0, sizeof(printedLine)); GCE(ceError = CTAllocateStringPrintf(&prefixedPath, "%s%s", rootPrefix, conf->filename)); GCE(ceError = CTGetFileTempPath( prefixedPath, &finalName, &tempName)); DJ_LOG_INFO("Writing nsswitch configuration for %s", finalName); ceError = CTOpenFile(tempName, "w", &file); if(ceError) { DJ_LOG_ERROR("Unable to open '%s' for writing", tempName); GCE(ceError); } for(i = 0; i < conf->lines.size; i++) { GCE(ceError = GetPrintedLine(&printedLine, conf, i)); GCE(ceError = CTFilePrintf(file, "%s\n", printedLine.data)); } GCE(ceError = CTCloseFile(file)); file = NULL; GCE(ceError = CTSafeReplaceFile( finalName, tempName)); DJ_LOG_INFO("File moved into place"); cleanup: if(file != NULL) CTCloseFile(file); CTArrayFree(&printedLine); CT_SAFE_FREE_STRING(tempName); CT_SAFE_FREE_STRING(finalName); CT_SAFE_FREE_STRING(prefixedPath); return ceError; }
void CTStringBufferDestroy(StringBuffer* buffer) { CTArrayFree(buffer); }
/* Copy a ssh configuration line and add it below the old line. */ static DWORD SetOption(struct SshConf *conf, const char *name, const char *value) { DWORD ceError = ERROR_SUCCESS; int line = -1; DynamicArray printedLine; struct SshLine lineObj; int found = 0; memset(&lineObj, 0, sizeof(struct SshLine)); memset(&printedLine, 0, sizeof(printedLine)); for(line = 0; line < conf->lineCount; line++) { line = FindOption(conf, line, name); if(line == -1) break; found++; if(!strcmp(conf->lines[line].value.value, value)) continue; //Insert a commented out version of the line BAIL_ON_CENTERIS_ERROR(ceError = GetPrintedLine(&printedLine, conf, line)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.leadingWhiteSpace)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.name.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.name.trailingSeparator)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.value.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTAllocateStringPrintf( &lineObj.value.trailingSeparator, "#Overwritten by lwidentity: %s", printedLine.data)); BAIL_ON_CENTERIS_ERROR(ceError = CTArrayInsert(&conf->private_data, line, sizeof(struct SshLine), &lineObj, 1)); memset(&lineObj, 0, sizeof(lineObj)); UpdatePublicLines(conf); conf->modified = 1; line++; //Change the option value of the line CT_SAFE_FREE_STRING(conf->lines[line].value.value); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(value, &conf->lines[line].value.value)); } /*If the option wasn't already in the file, search for comments that mention the option, and insert the line after the comment*/ for(line = 0; !found && line < conf->lineCount; line++) { if(strstr(conf->lines[line].value.trailingSeparator, name) == NULL) continue; BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.leadingWhiteSpace)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(name, &lineObj.name.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(" ", &lineObj.name.trailingSeparator)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(value, &lineObj.value.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.value.trailingSeparator)); BAIL_ON_CENTERIS_ERROR(ceError = CTArrayInsert(&conf->private_data, line + 1, sizeof(struct SshLine), &lineObj, 1)); memset(&lineObj, 0, sizeof(lineObj)); conf->modified = 1; found++; } /*If the option wasn't even in a comment, just add the option at the end of the file */ if(!found) { BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.leadingWhiteSpace)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(name, &lineObj.name.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(" ", &lineObj.name.trailingSeparator)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup(value, &lineObj.value.value)); BAIL_ON_CENTERIS_ERROR(ceError = CTStrdup("", &lineObj.value.trailingSeparator)); BAIL_ON_CENTERIS_ERROR(ceError = CTArrayAppend(&conf->private_data, sizeof(struct SshLine), &lineObj, 1)); memset(&lineObj, 0, sizeof(lineObj)); conf->modified = 1; } error: UpdatePublicLines(conf); FreeSshLineContents(&lineObj); CTArrayFree(&printedLine); return ceError; }
void DoLeaveNew(int argc, char **argv, int columns, LWException **exc) { JoinProcessOptions options; BOOLEAN advanced = FALSE; BOOLEAN preview = FALSE; DynamicArray enableModules, disableModules, ignoreModules; DynamicArray detailModules; size_t i; PSTR moduleDetails = NULL; PSTR wrapped = NULL; int passwordIndex = -1; DJZeroJoinProcessOptions(&options); memset(&enableModules, 0, sizeof(enableModules)); memset(&disableModules, 0, sizeof(disableModules)); memset(&ignoreModules, 0, sizeof(ignoreModules)); memset(&detailModules, 0, sizeof(detailModules)); while(argc > 0 && CTStrStartsWith(argv[0], "--")) { if(!strcmp(argv[0], "--advanced")) advanced = TRUE; else if(!strcmp(argv[0], "--preview")) preview = TRUE; else if(argc < 2) { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } else if(!strcmp(argv[0], "--enable")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&enableModules, sizeof(PCSTR *), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--disable")) { if(!strcmp(argv[1], "ssh")){ options.ignoreSsh = TRUE; } else { options.ignoreSsh = FALSE; LW_CLEANUP_CTERR(exc, CTArrayAppend(&disableModules, sizeof(PCSTR *), &argv[1], 1)); } argv++; argc--; } else if(!strcmp(argv[0], "--ignore")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&ignoreModules, sizeof(PCSTR *), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--details")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&detailModules, sizeof(PCSTR *), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--multiple")) { options.enableMultipleJoins = TRUE; LW_CLEANUP_CTERR(exc, CTStrdup(argv[1], &options.domainName)); argv++; argc--; } else { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } argv++; argc--; } if(argc == 2) { LW_CLEANUP_CTERR(exc, CTStrdup(argv[1], &options.password)); passwordIndex = 1; } else if(argc > 2) { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } options.joiningDomain = FALSE; DJ_LOG_INFO("Domainjoin invoked with %d arg(s) to the leave command:", argc); for(i = 0; i < argc; i++) { DJ_LOG_INFO(" [%s]", i == passwordIndex ? "<password>" : argv[i]); } if(argc > 0) { LW_CLEANUP_CTERR(exc, CTStrdup(argv[0], &options.username)); } options.warningCallback = PrintWarning; options.showTraces = advanced; LW_CLEANUP_CTERR(exc, DJGetComputerName(&options.computerName)); LW_TRY(exc, DJInitModuleStates(&options, &LW_EXC)); for(i = 0; i < enableModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &enableModules, i, sizeof(PCSTR)); if(CTArrayFindString(&disableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and enabled", module); goto cleanup; } if(CTArrayFindString(&ignoreModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being ignored and enabled", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, EnableModule, &LW_EXC)); } for(i = 0; i < disableModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &disableModules, i, sizeof(PCSTR)); if(CTArrayFindString(&enableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and enabled", module); goto cleanup; } if(CTArrayFindString(&ignoreModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and ignored", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, DisableModule, &LW_EXC)); } for(i = 0; i < ignoreModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &ignoreModules, i, sizeof(PCSTR)); if(CTArrayFindString(&enableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being ignored and enabled", module); goto cleanup; } if(CTArrayFindString(&disableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being ignored and disabled", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, IgnoreModule, &LW_EXC)); } for(i = 0; i < detailModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &detailModules, i, sizeof(PCSTR)); ModuleState *state = DJGetModuleStateByName(&options, module); if(state == NULL) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Unable to find module.", "Please check the spelling of '%s'. This module cannot be found", module); goto cleanup; } PrintModuleState(state); } if(detailModules.size > 0) { PrintStateKey(); } for(i = 0; i < detailModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &detailModules, i, sizeof(PCSTR)); ModuleState *state = DJGetModuleStateByName(&options, module); CT_SAFE_FREE_STRING(moduleDetails); CT_SAFE_FREE_STRING(wrapped); LW_TRY(exc, moduleDetails = state->module->GetChangeDescription(&options, &LW_EXC)); LW_CLEANUP_CTERR(exc, CTWordWrap(moduleDetails, &wrapped, 4, columns)); fprintf(stdout, "\nDetails for '%s':\n%s\n", state->module->longName, wrapped); } if(detailModules.size > 0) goto cleanup; LW_TRY(exc, PrintJoinHeader(&options, &LW_EXC)); if(preview) { PrintModuleStates(advanced, &options); if(!advanced) LW_TRY(exc, DJCheckRequiredEnabled(&options, &LW_EXC)); goto cleanup; } LW_TRY(exc, DJCheckRequiredEnabled(&options, &LW_EXC)); if (options.username != NULL && IsNullOrEmptyString(options.password)) { CT_SAFE_FREE_STRING(options.password); LW_CLEANUP_CTERR(exc, FillMissingPassword(options.username, &options.password)); } LW_TRY(exc, DJRunJoinProcess(&options, &LW_EXC)); fprintf(stdout, "SUCCESS\n"); cleanup: DJFreeJoinProcessOptions(&options); CTArrayFree(&enableModules); CTArrayFree(&disableModules); CTArrayFree(&ignoreModules); CTArrayFree(&detailModules); CT_SAFE_FREE_STRING(moduleDetails); CT_SAFE_FREE_STRING(wrapped); }
void DoJoin(int argc, char **argv, int columns, LWException **exc) { JoinProcessOptions options; BOOLEAN advanced = FALSE; BOOLEAN preview = FALSE; DynamicArray enableModules, disableModules, ignoreModules; DynamicArray detailModules; size_t i; int passwordIndex = -1; PSTR moduleDetails = NULL; PSTR wrapped = NULL; DJZeroJoinProcessOptions(&options); memset(&enableModules, 0, sizeof(enableModules)); memset(&disableModules, 0, sizeof(disableModules)); memset(&ignoreModules, 0, sizeof(ignoreModules)); memset(&detailModules, 0, sizeof(detailModules)); while(argc > 0 && CTStrStartsWith(argv[0], "--")) { if(!strcmp(argv[0], "--advanced")) advanced = TRUE; else if(!strcmp(argv[0], "--preview")) preview = TRUE; else if(!strcmp(argv[0], "--ignore-firewall-ntp")) { printf("Warning: --ignore-firewall-ntp is deprecated. This behavior is now default.\n"); } else if(!strcmp(argv[0], "--ignore-pam")) options.ignorePam = TRUE; else if(!strcmp(argv[0], "--notimesync")) options.disableTimeSync = TRUE; else if(!strcmp(argv[0], "--multiple")) options.enableMultipleJoins = TRUE; else if(!strcmp(argv[0], "--nohosts")) { PCSTR module = "hostname"; LW_CLEANUP_CTERR(exc, CTArrayAppend(&disableModules, sizeof(PCSTR), &module, 1)); } else if(argc < 2) { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } else if(!strcmp(argv[0], "--enable")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&enableModules, sizeof(PCSTR), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--disable")) { if(!strcmp(argv[1], "ssh")){ options.ignoreSsh = TRUE; } else { options.ignoreSsh = FALSE; LW_CLEANUP_CTERR(exc, CTArrayAppend(&disableModules, sizeof(PCSTR), &argv[1], 1)); } argv++; argc--; } else if(!strcmp(argv[0], "--ignore")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&ignoreModules, sizeof(PCSTR), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--details")) { LW_CLEANUP_CTERR(exc, CTArrayAppend(&detailModules, sizeof(PCSTR), &argv[1], 1)); argv++; argc--; } else if(!strcmp(argv[0], "--ou")) { DJ_LOG_INFO("Domainjoin invoked with option --ou %s", argv[1]); CT_SAFE_FREE_STRING(options.ouName); LW_CLEANUP_CTERR(exc, CTStrdup(argv[1], &options.ouName)); argv++; argc--; } else if(!strcmp(argv[0], "--uac-flags")) { DJ_LOG_INFO("Domainjoin invoked with option --uac-flags %s", argv[1]); CT_SAFE_FREE_STRING(options.ouName); options.uacFlags = strtoul(argv[1], NULL, 0); argv++; argc--; } else if(!strcmp(argv[0], "--assumeDefaultDomain")) { DJ_LOG_INFO("Domainjoin invoked with option --assumeDefaultDomain"); options.setAssumeDefaultDomain = TRUE; if (!strcasecmp(argv[1], "yes") || !strcasecmp(argv[1], "true") || !strcasecmp(argv[1], "on")) { options.assumeDefaultDomain = TRUE; } else if (!strcasecmp(argv[1], "no") || !strcasecmp(argv[1], "false") || !strcasecmp(argv[1], "off")) { options.assumeDefaultDomain = FALSE; } else { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } argv++; argc--; } else if(!strcmp(argv[0], "--userDomainPrefix")) { DJ_LOG_INFO("Domainjoin invoked with option --userDomainPrefix %s", argv[1]); options.setAssumeDefaultDomain = TRUE; options.assumeDefaultDomain = TRUE; CT_SAFE_FREE_STRING(options.userDomainPrefix); LW_CLEANUP_CTERR(exc, CTStrdup(argv[1], &options.userDomainPrefix)); CTStrToUpper(options.userDomainPrefix); argv++; argc--; } else { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } argv++; argc--; } if(argc == 3) { LW_CLEANUP_CTERR(exc, CTStrdup(argv[2], &options.password)); passwordIndex = 2; } // The join username is not required in preview or details mode. else if(argc == 1 && (preview || detailModules.size != 0) ) ; else if(argc != 2) { LW_RAISE(exc, LW_ERROR_SHOW_USAGE); goto cleanup; } options.joiningDomain = TRUE; DJ_LOG_INFO("Domainjoin invoked with %d arg(s) to the join command:", argc); for(i = 0; i < argc; i++) { DJ_LOG_INFO(" [%s]", i == passwordIndex ? "<password>" : argv[i]); } LW_CLEANUP_CTERR(exc, CTStrdup( argv[0], &options.domainName)); if(argc > 1) { LW_CLEANUP_CTERR(exc, CTStrdup(argv[1], &options.username)); } options.warningCallback = PrintWarning; options.showTraces = advanced; LW_CLEANUP_CTERR(exc, DJGetComputerName(&options.computerName)); LW_TRY(exc, DJInitModuleStates(&options, &LW_EXC)); for(i = 0; i < enableModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &enableModules, i, sizeof(PCSTR)); if(CTArrayFindString(&disableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and enabled", module); goto cleanup; } if(CTArrayFindString(&ignoreModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being ignored and enabled", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, EnableModule, &LW_EXC)); } for(i = 0; i < disableModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &disableModules, i, sizeof(PCSTR)); if(CTArrayFindString(&enableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and enabled", module); goto cleanup; } if(CTArrayFindString(&ignoreModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being ignored and enabled", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, DisableModule, &LW_EXC)); } for(i = 0; i < ignoreModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &ignoreModules, i, sizeof(PCSTR)); if(CTArrayFindString(&enableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being enabled and ignored", module); goto cleanup; } if(CTArrayFindString(&disableModules, module) != -1) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Module already specified", "The module '%s' is listed as being disabled and ignored", module); goto cleanup; } LW_TRY(exc, DJSetModuleDisposition(&options, module, IgnoreModule, &LW_EXC)); } for(i = 0; i < detailModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &detailModules, i, sizeof(PCSTR)); ModuleState *state = DJGetModuleStateByName(&options, module); if(state == NULL) { LW_RAISE_EX(exc, ERROR_INVALID_PARAMETER, "Unable to find module.", "Please check the spelling of '%s'. This module cannot be found", module); goto cleanup; } PrintModuleState(state); } if(detailModules.size > 0) { PrintStateKey(); } for(i = 0; i < detailModules.size; i++) { PCSTR module = *(PCSTR *)CTArrayGetItem( &detailModules, i, sizeof(PCSTR)); ModuleState *state = DJGetModuleStateByName(&options, module); CT_SAFE_FREE_STRING(moduleDetails); CT_SAFE_FREE_STRING(wrapped); LW_TRY(exc, moduleDetails = state->module->GetChangeDescription(&options, &LW_EXC)); LW_CLEANUP_CTERR(exc, CTWordWrap(moduleDetails, &wrapped, 4, columns)); fprintf(stdout, "\nDetails for '%s':\n%s\n", state->module->longName, wrapped); } if(detailModules.size > 0) goto cleanup; LW_TRY(exc, PrintJoinHeader(&options, &LW_EXC)); if(preview) { PrintModuleStates(advanced, &options); if(!advanced) LW_TRY(exc, DJCheckRequiredEnabled(&options, &LW_EXC)); goto cleanup; } LW_TRY(exc, DJCheckRequiredEnabled(&options, &LW_EXC)); if (IsNullOrEmptyString(options.password)) { CT_SAFE_FREE_STRING(options.password); LW_CLEANUP_CTERR(exc, FillMissingPassword(options.username, &options.password)); } LW_TRY(exc, DJRunJoinProcess(&options, &LW_EXC)); fprintf(stdout, "SUCCESS\n"); cleanup: DJFreeJoinProcessOptions(&options); CTArrayFree(&enableModules); CTArrayFree(&disableModules); CTArrayFree(&ignoreModules); CTArrayFree(&detailModules); CT_SAFE_FREE_STRING(moduleDetails); CT_SAFE_FREE_STRING(wrapped); }