void load_user() { ifstream f; int tmp, i; f.open("user.txt"); if (!f) { User new_user; new_user.id = 0; new_user.username = "******"; char *passwd = "admin"; new_user.password = MD5Encode(passwd); user.clear(); user.push_back(new_user); username_id = 0; save_user(); } else { f >> tmp; for (i = 0; i < tmp; i++) { User new_user; f >> new_user.id >> new_user.username >> new_user.password; user.push_back(new_user); } } f.close(); }
static int get_pw_uid(TALLOC_CTX *mem_ctx, struct proxy_id_ctx *ctx, struct sysdb_ctx *sysdb, struct sss_domain_info *dom, uid_t uid) { TALLOC_CTX *tmpctx; struct passwd *pwd; enum nss_status status; char *buffer; size_t buflen; bool del_user = false; int ret; DEBUG(SSSDBG_TRACE_FUNC, ("Searching user by uid (%d)\n", uid)); tmpctx = talloc_new(NULL); if (!tmpctx) { return ENOMEM; } pwd = talloc_zero(tmpctx, struct passwd); if (!pwd) { ret = ENOMEM; goto done; } buflen = DEFAULT_BUFSIZE; buffer = talloc_size(tmpctx, buflen); if (!buffer) { ret = ENOMEM; goto done; } status = ctx->ops.getpwuid_r(uid, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, ("getpwuid failed [%d]: %s\n", ret, strerror(ret))); goto done; } if (del_user) { ret = delete_user(sysdb, dom, NULL, uid); goto done; } ret = save_user(sysdb, dom, !dom->case_sensitive, pwd, pwd->pw_name, NULL, dom->user_timeout); done: talloc_zfree(tmpctx); if (ret) { DEBUG(SSSDBG_CRIT_FAILURE, ("proxy -> getpwuid_r failed for '%d' <%d>: %s\n", uid, ret, strerror(ret))); } return ret; }
void do_reboot(USER_DATA *usr, char *argument) { DESC_DATA *d, *d_next; FILE *fp; char p_buf[100]; char c_buf[100]; extern int port; extern int control; if (!(fp = fopen(COPYOVER_FILE, "w"))) { send_to_user("ERROR: Could not open to save copyover.data\n\r", usr); bbs_bug("Do_copyover: Could not open to save %s", COPYOVER_FILE); return; } system_info("Rebooting, please reamin seated"); for (d = desc_list; d; d = d_next) { USER_DATA *usr = d->user; d_next = d->next; if (!USR(d) || d->login > CON_LOGIN) { write_to_desc(d->descr, "\n\r\007Sorry, we are rebooting. " "Come back in a few minutes.\n\r", 0); close_socket(d); } else if (EDIT_MODE(USR(d)) != EDITOR_NONE) { write_to_desc(d->descr, "\n\r\007Sorry, we are rebooting. " "Come back in a few minutes.\n\r", 0); close_socket(d); } else { fprintf(fp, "%d %s %s %s %s\n", d->descr, usr->pBoard->short_name, usr->name, d->ident, d->host); save_user(usr); } } fprintf(fp, "-1\n"); fclose(fp); fclose(fpReserve); sprintf(p_buf, "%d", port); sprintf(c_buf, "%d", control); execl(EXE_FILE, "bbs", p_buf, "copyover", c_buf, (char *) NULL); perror("Do_copyover: execl"); send_to_user("ERROR: Copyover failed!\n\r", usr); fpReserve = fopen(NULL_FILE, "r"); }
int history (int argc, char **argv) { int i, c; const char *fname = NULL; List *flist; if (argc == -1) usage (history_usg); since_rev = xstrdup (""); since_tag = xstrdup (""); backto = xstrdup (""); rec_types = xstrdup (""); getoptreset (); while ((c = getopt (argc, argv, "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:")) != -1) { switch (c) { case 'T': /* Tag list */ report_count++; tag_report++; break; case 'a': /* For all usernames */ all_users++; break; case 'c': report_count++; modified = 1; break; case 'e': report_count++; extract_all++; free (rec_types); rec_types = xstrdup (ALL_HISTORY_REC_TYPES); break; case 'l': /* Find Last file record */ last_entry = 1; break; case 'o': report_count++; v_checkout = 1; break; case 'w': /* Match Working Dir (CurDir) fields */ working = 1; break; case 'X': /* Undocumented debugging flag */ #ifdef DEBUG fname = optarg; #endif break; case 'D': /* Since specified date */ if (*since_rev || *since_tag || *backto) { error (0, 0, "date overriding rev/tag/backto"); *since_rev = *since_tag = *backto = '\0'; } since_date = Make_Date (optarg); break; case 'b': /* Since specified file/Repos */ if (since_date || *since_rev || *since_tag) { error (0, 0, "backto overriding date/rev/tag"); *since_rev = *since_tag = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (backto); backto = xstrdup (optarg); break; case 'f': /* For specified file */ save_file (NULL, optarg, NULL); break; case 'm': /* Full module report */ if (!module_report++) report_count++; /* fall through */ case 'n': /* Look for specified module */ save_module (optarg); break; case 'p': /* For specified directory */ save_file (optarg, NULL, NULL); break; case 'r': /* Since specified Tag/Rev */ if (since_date || *since_tag || *backto) { error (0, 0, "rev overriding date/tag/backto"); *since_tag = *backto = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (since_rev); since_rev = xstrdup (optarg); break; case 't': /* Since specified Tag/Rev */ if (since_date || *since_rev || *backto) { error (0, 0, "tag overriding date/marker/file/repos"); *since_rev = *backto = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (since_tag); since_tag = xstrdup (optarg); break; case 'u': /* For specified username */ save_user (optarg); break; case 'x': report_count++; extract++; { char *cp; for (cp = optarg; *cp; cp++) if (!strchr (ALL_HISTORY_REC_TYPES, *cp)) error (1, 0, "%c is not a valid report type", *cp); } free (rec_types); rec_types = xstrdup (optarg); break; case 'z': tz_local = (optarg[0] == 'l' || optarg[0] == 'L') && (optarg[1] == 't' || optarg[1] == 'T') && !optarg[2]; if (tz_local) tz_name = optarg; else { /* * Convert a known time with the given timezone to time_t. * Use the epoch + 23 hours, so timezones east of GMT work. */ struct timespec t; char *buf = Xasprintf ("1/1/1970 23:00 %s", optarg); if (get_date (&t, buf, NULL)) { /* * Convert to seconds east of GMT, removing the * 23-hour offset mentioned above. */ tz_seconds_east_of_GMT = (time_t)23 * 60 * 60 - t.tv_sec; tz_name = optarg; } else error (0, 0, "%s is not a known time zone", optarg); free (buf); } break; case '?': default: usage (history_usg); break; } } argc -= optind; argv += optind; for (i = 0; i < argc; i++) save_file (NULL, argv[i], NULL); /* ================ Now analyze the arguments a bit */ if (!report_count) v_checkout++; else if (report_count > 1) error (1, 0, "Only one report type allowed from: \"-Tcomxe\"."); #ifdef CLIENT_SUPPORT if (current_parsed_root->isremote) { struct file_list_str *f1; char **mod; /* We're the client side. Fire up the remote server. */ start_server (); ign_setup (); if (tag_report) send_arg ("-T"); if (all_users) send_arg ("-a"); if (modified) send_arg ("-c"); if (last_entry) send_arg ("-l"); if (v_checkout) send_arg ("-o"); if (working) send_arg ("-w"); if (fname) option_with_arg ("-X", fname); if (since_date) client_senddate (since_date); if (backto[0] != '\0') option_with_arg ("-b", backto); for (f1 = file_list; f1 < &file_list[file_count]; ++f1) { if (f1->l_file[0] == '*') option_with_arg ("-p", f1->l_file + 1); else option_with_arg ("-f", f1->l_file); } if (module_report) send_arg ("-m"); for (mod = mod_list; mod < &mod_list[mod_count]; ++mod) option_with_arg ("-n", *mod); if (*since_rev) option_with_arg ("-r", since_rev); if (*since_tag) option_with_arg ("-t", since_tag); for (mod = user_list; mod < &user_list[user_count]; ++mod) option_with_arg ("-u", *mod); if (extract_all) send_arg ("-e"); if (extract) option_with_arg ("-x", rec_types); option_with_arg ("-z", tz_name); send_to_server ("history\012", 0); return get_responses_and_close (); } #endif if (all_users) save_user (""); if (mod_list) expand_modules (); if (tag_report) { if (!strchr (rec_types, 'T')) { rec_types = xrealloc (rec_types, strlen (rec_types) + 5); (void) strcat (rec_types, "T"); } } else if (extract || extract_all) { if (user_list) user_sort++; } else if (modified) { free (rec_types); rec_types = xstrdup ("MAR"); /* * If the user has not specified a date oriented flag ("Since"), sort * by Repository/file before date. Default is "just" date. */ if (last_entry || (!since_date && !*since_rev && !*since_tag && !*backto)) { repos_sort++; file_sort++; /* * If we are not looking for last_modified and the user specified * one or more users to look at, sort by user before filename. */ if (!last_entry && user_list) user_sort++; } } else if (module_report) { free (rec_types); rec_types = xstrdup (last_entry ? "OMAR" : ALL_HISTORY_REC_TYPES); module_sort++; repos_sort++; file_sort++; working = 0; /* User's workdir doesn't count here */ } else /* Must be "checkout" or default */ { free (rec_types); rec_types = xstrdup ("OF"); /* See comments in "modified" above */ if (!last_entry && user_list) user_sort++; if (last_entry || (!since_date && !*since_rev && !*since_tag && !*backto)) file_sort++; } /* If no users were specified, use self (-a saves a universal ("") user) */ if (!user_list) save_user (getcaller ()); /* If we're looking back to a Tag value, must consider "Tag" records */ if (*since_tag && !strchr (rec_types, 'T')) { rec_types = xrealloc (rec_types, strlen (rec_types) + 5); (void) strcat (rec_types, "T"); } if (fname) { Node *p; flist = getlist (); p = getnode (); p->type = FILES; p->key = Xasprintf ("%s/%s/%s", current_parsed_root->directory, CVSROOTADM, fname); addnode (flist, p); } else { char *pat; if (config->HistorySearchPath) pat = config->HistorySearchPath; else pat = Xasprintf ("%s/%s/%s", current_parsed_root->directory, CVSROOTADM, CVSROOTADM_HISTORY); flist = find_files (NULL, pat); if (pat != config->HistorySearchPath) free (pat); } read_hrecs (flist); if (hrec_count > 0) qsort (hrec_head, hrec_count, sizeof (struct hrec), sort_order); report_hrecs (); if (since_date != NULL) free (since_date); free (since_rev); free (since_tag); free (backto); free (rec_types); return 0; }
static int get_pw_name(struct proxy_id_ctx *ctx, struct sss_domain_info *dom, const char *name) { TALLOC_CTX *tmpctx; struct passwd *pwd; enum nss_status status; char *buffer; size_t buflen; int ret; uid_t uid; bool del_user; struct ldb_result *cached_pwd = NULL; const char *real_name = NULL; DEBUG(SSSDBG_TRACE_FUNC, "Searching user by name (%s)\n", name); tmpctx = talloc_new(NULL); if (!tmpctx) { return ENOMEM; } pwd = talloc_zero(tmpctx, struct passwd); if (!pwd) { ret = ENOMEM; goto done; } buflen = DEFAULT_BUFSIZE; buffer = talloc_size(tmpctx, buflen); if (!buffer) { ret = ENOMEM; goto done; } /* FIXME: should we move this call outside the transaction to keep the * transaction as short as possible ? */ status = ctx->ops.getpwnam_r(name, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "getpwnam failed [%d]: %s\n", ret, strerror(ret)); goto done; } if (del_user) { ret = delete_user(dom, name, 0); goto done; } uid = pwd->pw_uid; /* Canonicalize the username in case it was actually an alias */ if (ctx->fast_alias == true) { ret = sysdb_getpwuid(tmpctx, dom, uid, &cached_pwd); if (ret != EOK) { /* Non-fatal, attempt to canonicalize online */ DEBUG(SSSDBG_TRACE_FUNC, "Request to cache failed [%d]: %s\n", ret, strerror(ret)); } if (ret == EOK && cached_pwd->count == 1) { real_name = ldb_msg_find_attr_as_string(cached_pwd->msgs[0], SYSDB_NAME, NULL); if (!real_name) { DEBUG(SSSDBG_MINOR_FAILURE, "Cached user has no name?\n"); } } } if (real_name == NULL) { memset(buffer, 0, buflen); status = ctx->ops.getpwuid_r(uid, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "getpwuid failed [%d]: %s\n", ret, strerror(ret)); goto done; } real_name = pwd->pw_name; } if (del_user) { ret = delete_user(dom, name, uid); goto done; } /* Both lookups went fine, we can save the user now */ ret = save_user(dom, !dom->case_sensitive, pwd, real_name, name, dom->user_timeout); done: talloc_zfree(tmpctx); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "proxy -> getpwnam_r failed for '%s' <%d>: %s\n", name, ret, strerror(ret)); } return ret; }
static int enum_users(TALLOC_CTX *mem_ctx, struct proxy_id_ctx *ctx, struct sysdb_ctx *sysdb, struct sss_domain_info *dom) { TALLOC_CTX *tmpctx; bool in_transaction = false; struct passwd *pwd; enum nss_status status; size_t buflen; char *buffer; char *newbuf; int ret; errno_t sret; bool again; DEBUG(SSSDBG_TRACE_LIBS, "Enumerating users\n"); tmpctx = talloc_new(mem_ctx); if (!tmpctx) { return ENOMEM; } pwd = talloc_zero(tmpctx, struct passwd); if (!pwd) { ret = ENOMEM; goto done; } buflen = DEFAULT_BUFSIZE; buffer = talloc_size(tmpctx, buflen); if (!buffer) { ret = ENOMEM; goto done; } ret = sysdb_transaction_start(sysdb); if (ret) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n"); goto done; } in_transaction = true; status = ctx->ops.setpwent(); if (status != NSS_STATUS_SUCCESS) { ret = EIO; goto done; } do { again = false; /* always zero out the pwd structure */ memset(pwd, 0, sizeof(struct passwd)); /* get entry */ status = ctx->ops.getpwent_r(pwd, buffer, buflen, &ret); switch (status) { case NSS_STATUS_TRYAGAIN: /* buffer too small ? */ if (buflen < MAX_BUF_SIZE) { buflen *= 2; } if (buflen > MAX_BUF_SIZE) { buflen = MAX_BUF_SIZE; } newbuf = talloc_realloc_size(tmpctx, buffer, buflen); if (!newbuf) { ret = ENOMEM; goto done; } buffer = newbuf; again = true; break; case NSS_STATUS_NOTFOUND: /* we are done here */ DEBUG(SSSDBG_TRACE_LIBS, "Enumeration completed.\n"); ret = sysdb_transaction_commit(sysdb); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n"); goto done; } in_transaction = false; break; case NSS_STATUS_SUCCESS: DEBUG(SSSDBG_TRACE_LIBS, "User found (%s, %"SPRIuid", %"SPRIgid")\n", pwd->pw_name, pwd->pw_uid, pwd->pw_gid); /* uid=0 or gid=0 are invalid values */ /* also check that the id is in the valid range for this domain */ if (OUT_OF_ID_RANGE(pwd->pw_uid, dom->id_min, dom->id_max) || OUT_OF_ID_RANGE(pwd->pw_gid, dom->id_min, dom->id_max)) { DEBUG(SSSDBG_OP_FAILURE, "User [%s] filtered out! (id out" " of range)\n", pwd->pw_name); again = true; break; } ret = save_user(dom, !dom->case_sensitive, pwd, pwd->pw_name, NULL, dom->user_timeout); if (ret) { /* Do not fail completely on errors. * Just report the failure to save and go on */ DEBUG(SSSDBG_OP_FAILURE, "Failed to store user %s." " Ignoring.\n", pwd->pw_name); } again = true; break; case NSS_STATUS_UNAVAIL: /* "remote" backend unavailable. Enter offline mode */ ret = ENXIO; break; default: ret = EIO; DEBUG(SSSDBG_OP_FAILURE, "proxy -> getpwent_r failed (%d)[%s]" "\n", ret, strerror(ret)); break; } } while (again); done: talloc_zfree(tmpctx); if (in_transaction) { sret = sysdb_transaction_cancel(sysdb); if (sret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to cancel transaction\n"); } } ctx->ops.endpwent(); return ret; }
static int get_initgr(TALLOC_CTX *mem_ctx, struct proxy_id_ctx *ctx, struct sysdb_ctx *sysdb, struct sss_domain_info *dom, const char *name) { TALLOC_CTX *tmpctx; bool in_transaction = false; struct passwd *pwd; enum nss_status status; char *buffer; size_t buflen; int ret; errno_t sret; bool del_user; uid_t uid; struct ldb_result *cached_pwd = NULL; const char *real_name = NULL; tmpctx = talloc_new(mem_ctx); if (!tmpctx) { return ENOMEM; } pwd = talloc_zero(tmpctx, struct passwd); if (!pwd) { ret = ENOMEM; goto fail; } buflen = DEFAULT_BUFSIZE; buffer = talloc_size(tmpctx, buflen); if (!buffer) { ret = ENOMEM; goto fail; } ret = sysdb_transaction_start(sysdb); if (ret) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n"); goto fail; } in_transaction = true; /* FIXME: should we move this call outside the transaction to keep the * transaction as short as possible ? */ status = ctx->ops.getpwnam_r(name, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "getpwnam failed [%d]: %s\n", ret, strerror(ret)); goto fail; } if (del_user) { ret = delete_user(dom, name, 0); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "Could not delete user\n"); goto fail; } goto done; } uid = pwd->pw_uid; memset(buffer, 0, buflen); /* Canonicalize the username in case it was actually an alias */ if (ctx->fast_alias == true) { ret = sysdb_getpwuid(tmpctx, dom, uid, &cached_pwd); if (ret != EOK) { /* Non-fatal, attempt to canonicalize online */ DEBUG(SSSDBG_TRACE_FUNC, "Request to cache failed [%d]: %s\n", ret, strerror(ret)); } if (ret == EOK && cached_pwd->count == 1) { real_name = ldb_msg_find_attr_as_string(cached_pwd->msgs[0], SYSDB_NAME, NULL); if (!real_name) { DEBUG(SSSDBG_MINOR_FAILURE, "Cached user has no name?\n"); } } } if (real_name == NULL) { memset(buffer, 0, buflen); status = ctx->ops.getpwuid_r(uid, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "getpwuid failed [%d]: %s\n", ret, strerror(ret)); goto done; } real_name = pwd->pw_name; } if (del_user) { ret = delete_user(dom, name, uid); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "Could not delete user\n"); goto fail; } goto done; } ret = save_user(dom, !dom->case_sensitive, pwd, real_name, name, dom->user_timeout); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "Could not save user\n"); goto fail; } ret = get_initgr_groups_process(tmpctx, ctx, sysdb, dom, pwd); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "Could not process initgroups\n"); goto fail; } done: ret = sysdb_transaction_commit(sysdb); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "Failed to commit transaction\n"); goto fail; } in_transaction = false; fail: talloc_zfree(tmpctx); if (in_transaction) { sret = sysdb_transaction_cancel(sysdb); if (sret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to cancel transaction\n"); } } return ret; }
static int get_pw_uid(struct proxy_id_ctx *ctx, struct sss_domain_info *dom, uid_t uid) { TALLOC_CTX *tmpctx; struct passwd *pwd; enum nss_status status; char *buffer; size_t buflen; bool del_user = false; int ret; char *name; DEBUG(SSSDBG_TRACE_FUNC, "Searching user by uid (%"SPRIuid")\n", uid); tmpctx = talloc_new(NULL); if (!tmpctx) { return ENOMEM; } pwd = talloc_zero(tmpctx, struct passwd); if (!pwd) { ret = ENOMEM; goto done; } buflen = DEFAULT_BUFSIZE; buffer = talloc_size(tmpctx, buflen); if (!buffer) { ret = ENOMEM; goto done; } status = ctx->ops.getpwuid_r(uid, pwd, buffer, buflen, &ret); ret = handle_getpw_result(status, pwd, dom, &del_user); if (ret) { DEBUG(SSSDBG_OP_FAILURE, "getpwuid failed [%d]: %s\n", ret, strerror(ret)); goto done; } if (del_user) { ret = delete_user(dom, NULL, uid); goto done; } name = sss_create_internal_fqname(tmpctx, pwd->pw_name, dom->name); if (name == NULL) { DEBUG(SSSDBG_OP_FAILURE, "failed to qualify name '%s'\n", pwd->pw_name); goto done; } ret = save_user(dom, pwd, name, NULL); done: talloc_zfree(tmpctx); if (ret) { DEBUG(SSSDBG_CRIT_FAILURE, "proxy -> getpwuid_r failed for '%"SPRIuid"' <%d>: %s\n", uid, ret, strerror(ret)); } return ret; }
void copyover_recover(void) { DESC_DATA *d; FILE *fp; char name[100]; char host[STRING]; char board[100]; char user[100]; int desc; bool fOld; log_string("Copyover: Copyover recovery initiated."); if (!(fp = fopen(COPYOVER_FILE, "r"))) { bbs_bug("Copyover_recover: Could not open to read %s", COPYOVER_FILE); exit(1); } unlink(COPYOVER_FILE); for (;;) { fscanf(fp, "%d %s %s %s %s\n", &desc, board, name, user, host); if (desc == -1) break; if (!write_to_desc(desc, "", 0)) { close(desc); continue; } d = new_desc(); d->descr = desc; if (d->host) free_string(d->host); d->host = str_dup(host); if (d->ident) free_string(d->ident); d->ident = str_dup(user); d->next = desc_list; desc_list = d; d->login = CON_REBOOT_RECOVER; fOld = load_user(d, name); if (!fOld) { write_to_desc( desc, "\n\rSomehow, your user was lost in the reboot, sorry.\n\r", 0); close_socket(d); } else { if (!d->user->pBoard) d->user->pBoard = board_lookup("lobby", FALSE); d->user->next = user_list; user_list = d->user; d->login = CON_LOGIN; USR(d)->logon = current_time; USR(d)->pBoard = board_lookup(board, FALSE); save_user(USR(d)); } } system_info("Reboot recover complete"); log_string("Copyover: Done."); fclose(fp); return; }
void add_user(string command) { stringstream command_stream(command); string subcommand, username, password, c_password; command_stream >> subcommand; command_stream >> username; int i = 0; if (username_id != 0) { cout << "You don't have permission to create a user" << endl; return; } if (user.size() == 8) { cout << "User full" << endl; return; } while (i < 3) { cout << "password:"******"retype password:"******"Sorry, passwords do not match." << endl; i++; } else break; } if (i == 3) { cout << "Have exhausted maximum number of retries for service." << endl; return; } User new_user; new_user.id = user.size(); new_user.username = username; char *passwd = new char[255]; for (i = 0; i <= password.length(); i++) passwd[i] = password[i]; passwd[i] = '\0'; new_user.password = MD5Encode(passwd); user.push_back(new_user); cout << "user " << username << " add successfully" << endl; save_user(); }
void change_password(string command) { stringstream command_stream(command); string subcommand, username, password, c_password; command_stream >> subcommand; command_stream >> username; int j = 0; int num; for (num = 0; num < user.size(); num++) { if (user[num].username == username) break; } if (num == user.size()) { cout << "Username no fount" << endl; return; } if (username_id != 0 && username_id != num) { cout << "You can't change other's password" << endl; return; } int i = 0; while (i < 3) { cout << "password:"******"retype password:"******"Sorry, passwords do not match." << endl; i++; } else break; } if (i == 3) { cout << "Have exhausted maximum number of retries for service." << endl; return; } char *passwd = new char[255]; for (i = 0; i <= password.length(); i++) passwd[i] = password[i]; passwd[i] = '\0'; user[num].password = MD5Encode(passwd); save_user(); cout << "password changed successfully" << endl; }
void delete_user(string command) { if (username_id != 0) { cout << "You don't have permission to delete user" << endl; return; } stringstream command_stream(command); string subcommand, username, password; command_stream >> subcommand; command_stream >> username; int j = 0; if (username == "admin") { cout << "You can't delete admin user" << endl; return; } int num; for (num = 0; num < user.size(); num++) { if (user[num].username == username) break; } if (num == user.size()) { cout << "Username no fount" << endl; return; } while (j < 3) { cout << "Please enter admin password to confirm:"; char t; while ((t = _getch()) != '\r') { if (t == '\b') { password = password.substr(0, password.length() - 1); } else password += t; } cout << endl; char *passwd = new char[255]; int i; for (i = 0; i <= password.length(); i++) passwd[i] = password[i]; passwd[i] = '\0'; if (user[username_id].password == MD5Encode(passwd)) break; cout << "Password error. "; j++; } if (j == 3) { cout << "Have exhausted maximum number of retries for service." << endl; return; } vector<User>::iterator it; it = user.begin() + num; user.erase(it); save_user(); cout << "User " << username << " delete successfully" << endl; }
void register_x (int fd) { char buf[BUFFER]; char *id, *type, *username, *password, *stored_password, *resource, *digest; id = xmlget(client[fd].buffer, "iq..id"); type = xmlget(client[fd].buffer, "iq..type"); username = xmlget(client[fd].buffer, "iq.query.username.."); password = xmlget(client[fd].buffer, "iq.query.password.."); resource = xmlget(client[fd].buffer, "iq.query.resource.."); digest = xmlget(client[fd].buffer, "iq.query.digest.."); printf("username >%s< password >%s< digest >%s< resource >%s< \n", username, password, digest, resource); /* if the user already exists, error, unathorized */ /* else create user, save user, return error code */ /* load user data */ client[fd].data=load_user(username); if (!strcmp(client[fd].data,"")) { /* user doesn't exist */ /* setup the userdata */ /* save user */ save_user(username, client[fd].data); /* send back a success message */ sprintf(buf,"<iq id='%s' type='result'/>", id); write(fd, buf, strlen(buf)); } else { /* user exists */ /* send back an error */ sprintf(buf,"<iq id='%d' type='error'><query xmlns='jabber:iq:auth'><username>%s</username><resource>%s</resource><digest/><error code='401'>Unauthorized</error></iq>\n", id, username, resource); write(fd, buf, strlen(buf)); } /* free everything, don't store any data until we get a good authentication */ free (client[fd].data); free (id); free (type); free (password); free (username); free (digest); /* <<< <iq id='2' type='set'><query xmlns='jabber:iq:register'><username>jabber</username><resource>Gabber</resource><password>1234</password></query></iq> >>> <iq id='2' type='error'><query xmlns='jabber:iq:register'><username>jabber</username><resource>Gabber</resource><digest sid='3A62E006'>f4d6efcadbf398e1bf78f0fec9d07feac09c3e0b</digest></query><error code='401'>Unauthorized</error></iq> >>> <iq id='2' type='result'/> */ }