static int visit_bbs(int m) { time_t aika; char *aikas; char puskur[300]; lrp = lsp = oldlrp = oldlsp = 0; lrpdatname[0] = 0; ffilestagged = filestagged = bytestagged = fbytestagged = 0; *reason = 0; memset(&clog, 0, sizeof(struct callerslog)); memset(&user, 0, sizeof(struct userbase)); onlinestat = 0; display = 0; clearlist(olms); clearlist(flaggedfiles); carrier = 1; aika = time(0); aikas = ctime(&aika); aikas[24] = 0; snprintf(puskur, sizeof puskur, "===============================================[ %s ]===\n%d BPS connection on line #%d\n\n", aikas, bpsrate, node); writelog(puskur); changenodestatus("Logging in..."); ddprintf("[0m[2J[HDayDream BBS/UNiX %s\nProgramming by Antti Häyrynen 1996, 1997,\n DayDream Development Team 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n Bo Simonsen 2008, 2009, 2010\nCurrently maintained by Ryan Fantus\nYou are connected to node #%d at %d BPS.\n\n", versionstring, node, bpsrate); rundoorbatch("data/frontends.dat", NULL); if (!display) if (getdisplaymode(0, 0) < 1) { DDPut("Failed to load displaymode... disconnecting!\n\n"); return 0; } if (!syspw()) { DDPut(sd[disconnectingstr]); return 0; } TypeFile("banner", TYPE_MAKE | TYPE_WARN); if (m) { switch (checklogon("sysop")) { case 1: sleep(2); getin(); break; } return 1; } login_loop(); DDPut(sd[disconnectingstr]); dropcarrier(); return 1; }
void edituser(void) { char askbuf[20]; changenodestatus("Editing personal data"); TypeFile("edituser", TYPE_MAKE | TYPE_WARN); for (;;) { DDPut(sd[eupromptstr]); askbuf[0] = 0; if (!(Prompt(askbuf, 3, 0))) return; if (handle_choice(askbuf)) return; } }
static int syspw(void) { char b[80]; int i; if (*maincfg.CFG_SYSTEMPW) { TypeFile("systempassword", TYPE_MAKE); for (i = 2; i; i--) { *b = 0; DDPut(sd[syspwstr]); if (!(Prompt(b, 16, PROMPT_SECRET))) return 0; if (!strcasecmp(b, maincfg.CFG_SYSTEMPW)) return 1; } return 0; } return 1; }
void who(void) { struct DayDream_Multinode *cn; cn = nodes; changenodestatus("Viewing who's online"); TypeFile("who", TYPE_MAKE | TYPE_WARN); DDPut(sd[whheadstr]); while (cn->MULTI_NODE) { if (cn->MULTI_NODE == 253) { int j; int i = maincfg.CFG_TELNET1ST; j = maincfg.CFG_TELNETMAX; while (j) { j--; who_show(cn, i); i++; } } else if (cn->MULTI_NODE == 254) { int j; int i = maincfg.CFG_LOCAL1ST; j = maincfg.CFG_LOCALMAX; while (j) { j--; who_show(cn, i); i++; } } else if (cn->MULTI_NODE != 252) { who_show(cn, cn->MULTI_NODE); } cn++; } DDPut(sd[whtailstr]); }
int bulletins(char *params) { char bdir[200]; char menunam[240]; char bullb[500]; char tbuf[400]; char nbu[240]; int first = 0; int menfd; const char *srcstrh; changenodestatus("Viewing bulletins"); snprintf(bdir, sizeof bdir, "%s/bulletins/", conference()->conf.CONF_PATH); snprintf(menunam, sizeof menunam, "%sbulletinmenu.%s", bdir, ansi ? "gfx" : "txt"); menfd = open(menunam, O_RDONLY); if (menfd == -1) { snprintf(bdir, sizeof bdir, "bulletins/"); snprintf(menunam, sizeof menunam, "bulletins/bulletinmenu.%s", ansi ? "gfx" : "txt"); menfd = open(menunam, O_RDONLY); if (menfd == -1) { DDPut(sd[bunobullsstr]); return 0; } } close(menfd); srcstrh = params; for (;;) { int bulnum; if (strtoken(bullb, &srcstrh, sizeof bullb) > sizeof bullb) continue; if (!*bullb) { if (!first) TypeFile(menunam, TYPE_WARN); DDPut(sd[bumenustr]); *tbuf = 0; if (!(Prompt(tbuf, 60, 0))) return 0; srcstrh = tbuf; if (strtoken(bullb, &srcstrh, sizeof bullb) > sizeof bullb) return 0; if (!*bullb) return 0; } first = 1; if (*bullb == 'q' || *bullb == 'Q') return 0; if (*bullb == 'l' || *bullb == 'L' || *bullb == '?') { TypeFile(menunam, TYPE_WARN); } else if ((bulnum = atoi(bullb))) { snprintf(nbu, sizeof nbu, "%sbulletin.%d.%s", bdir, bulnum, ansi ? "gfx" : "txt"); if (TypeFile(nbu, TYPE_WARN)) { if (!(user.user_toggles & (1L << 4))) { DDPut(sd[pause2str]); HotKey(0); } } } } }
int sysopdownload(const char *params) { const char *srcstrh; char parbuf[1024]; char bigbuf[4096]; int discon = 0; struct FFlag *myf; FILE *listh; char lastfile[100]; int keepc = 1; changenodestatus("SysOp download"); TypeFile("sysopdownload", TYPE_MAKE); srcstrh = params; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; sflagfile(parbuf); } for (;;) { typedlprompt(); bigbuf[0] = 0; if (!(Prompt(bigbuf, 200, 0))) return 0; if (!bigbuf[0]) { break; } else if (!strcasecmp(bigbuf, "a")) { return 0; } else { srcstrh = bigbuf; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; sflagfile(parbuf); } } } if (!filestagged) return 0; listtags(); if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } for (;;) { DDPut(sd[dlproceedstr]); bigbuf[0] = 0; if (!(Prompt(bigbuf, 3, 0))) return 0; if (!bigbuf[0] || bigbuf[0] == 'p' || bigbuf[0] == 'P') break; else if (bigbuf[0] == 'e' || bigbuf[0] == 'E') { taged(0); } else if (bigbuf[0] == 'd' || bigbuf[0] == 'D') { discon = 1; break; } else if (bigbuf[0] == 'a' || bigbuf[0] == 'A') { return 0; } } if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } snprintf(parbuf, sizeof parbuf - 250, "%s/dszlog.%d", DDTMP, node); snprintf(&parbuf[250], sizeof parbuf - 250, "%s/ddfilelist.%d", DDTMP, node); unlink(&parbuf[250]); if (!(listh = fopen(&parbuf[250], "w"))) return 0; myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ) { char tbu[256]; snprintf(tbu, sizeof tbu, "%s%s\n", myf->f_path, myf->f_filename); fputs(tbu, listh); myf = (struct FFlag *) myf->fhead.ln_Succ; } fclose(listh); *lastfile = 0; sendfiles(&parbuf[250], lastfile, sizeof lastfile); if (*lastfile) { myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ && keepc) { struct FFlag *oldf; if (!strcasecmp(lastfile, myf->f_filename)) keepc = 0; Remove((struct Node *) myf); oldf = myf; myf = (struct FFlag *) myf->fhead.ln_Succ; free(oldf); } } recountfiles(); unlink(&parbuf[250]); if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { upload(2); } if (discon) { if (autodisconnect()) return 2; } return 1; }
int download(const char *params) { char parbuf[512]; char bigbuf[10000]; const char *srcstrh; int discon = 0; struct FFlag *myf; FILE *listh; char lastfile[100]; int keepc = 1; bgrun = 0; wasbg = 0; setprotocol(); changenodestatus("Downloading"); TypeFile("download", TYPE_MAKE | TYPE_CONF | TYPE_WARN); if (!conference()->conf.CONF_FILEAREAS) { DDPut(sd[dlnoareasstr]); return 0; } if ((protocol->PROTOCOL_TYPE == 3 || protocol->PROTOCOL_TYPE == 2) && !conference()->conf.CONF_UPLOADAREA) { DDPut(sd[dlnouploadsstr]); return 0; } if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { if (cleantemp() == -1) { DDPut(sd[tempcleanerrstr]); return 0; } if (!freespace()) return 0; maketmplist(); } srcstrh = params; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; flagfile(parbuf, 1); } for (;;) { typedlprompt(); bigbuf[0] = 0; if (!(Prompt(bigbuf, 200, 0))) return 0; if (!bigbuf[0]) { break; } else if (!strcasecmp(bigbuf, "a")) { return 0; } else { srcstrh = bigbuf; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; flagfile(parbuf, 1); } } } if (!filestagged) return 0; listtags(); if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } for (;;) { DDPut(sd[dlproceedstr]); bigbuf[0] = 0; if (!(Prompt(bigbuf, 3, 0))) return 0; if (!bigbuf[0] || bigbuf[0] == 'p' || bigbuf[0] == 'P') break; else if (bigbuf[0] == 'e' || bigbuf[0] == 'E') { taged(0); } else if (bigbuf[0] == 'd' || bigbuf[0] == 'D') { discon = 1; break; } else if (bigbuf[0] == 'a' || bigbuf[0] == 'A') { return 0; } } snprintf(parbuf, sizeof parbuf, "%s/dszlog.%d", DDTMP, node); sprintf(&parbuf[250], "%s/ddfilelist.%d", DDTMP, node); unlink(&parbuf[250]); if (!(listh = fopen(&parbuf[250], "w"))) return 0; myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ) { char tbu[256]; snprintf(tbu, sizeof tbu, "%s%s\n", myf->f_path, myf->f_filename); fputs(tbu, listh); myf = (struct FFlag *) myf->fhead.ln_Succ; } fclose(listh); *lastfile = 0; if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { if ((!(user.user_toggles & (1L << 15))) && (maincfg.CFG_FLAGS & (1L << 11))) { initbgchecker(); } } sendfiles(&parbuf[250], lastfile, sizeof lastfile); if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { upload(2); } if (*lastfile) { myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ && keepc) { struct FFlag *oldf; struct DD_DownloadLog ddl; char lbuf[100]; int logfd; snprintf(lbuf, sizeof lbuf, "%s/logfiles/downloadlog.dat", origdir); logfd = open(lbuf, O_WRONLY | O_CREAT, 0666); if (logfd != -1) { fsetperm(logfd, 0666); memset((char *) &ddl, 0, sizeof(struct DD_DownloadLog)); ddl.DL_SLOT = user.user_account_id; strlcpy(ddl.DL_FILENAME, myf->f_filename, sizeof ddl.DL_FILENAME); ddl.DL_FILESIZE = myf->f_size; ddl.DL_TIME = time(0); ddl.DL_BPSRATE = bpsrate; ddl.DL_NODE = node; ddl.DL_CONF = (unsigned char) myf->f_conf; lseek(logfd, 0, SEEK_END); safe_write(logfd, &ddl, sizeof(struct DD_DownloadLog)); close(logfd); } if (!(myf->f_flags & FLAG_FREE)) { user.user_dlbytes += myf->f_size; user.user_dlfiles++; } if (!strcasecmp(lastfile, myf->f_filename)) keepc = 0; Remove((struct Node *) myf); oldf = myf; myf = (struct FFlag *) myf->fhead.ln_Succ; free(oldf); } } recountfiles(); unlink(&parbuf[250]); if (discon) { if (autodisconnect()) return 2; } return 1; }
int pagesysop(const char *reas) { struct DayDream_PageMsg pm; struct sockaddr_un name; int sock; time_t ctim; int i; changenodestatus("Paging SysOp"); reason[0] = 0; if (reas) strlcpy(reason, reas, sizeof reason); TypeFile("pagesysop", TYPE_MAKE | TYPE_WARN); if (maincfg.CFG_FLAGS & (1L << 0)) { if (reason[0] == 0) { DDPut(sd[psreasonstr]); if (!(Prompt(reason, 75, 0))) return 0; if (reason[0] == 0) { DDPut("\n"); return 0; } } } clog.cl_flags |= CL_PAGEDSYSOP; sock = socket(AF_UNIX, SOCK_DGRAM, 0); if (sock < 0) return 0; pm.pm_cmd = 2; ctim = time(0); *pm.pm_string = 0; if (onlinestat) snprintf(pm.pm_string, sizeof pm.pm_string, "\n\n%s / %s (node %d) paged you on %s\n", user.user_realname, user.user_handle, node, ctime(&ctim)); if (reason[0]) { strlcat(pm.pm_string, "Reason: ", sizeof pm.pm_string); strlcat(pm.pm_string, reason, sizeof pm.pm_string); strlcat(pm.pm_string, "\n\n", sizeof pm.pm_string); } name.sun_family = AF_UNIX; strlcpy(name.sun_path, YELLDSOCK, sizeof name.sun_path); if (sendto(sock, &pm, sizeof(struct DayDream_PageMsg), 0, (struct sockaddr *) &name, sizeof(struct sockaddr_un)) < 0) { DDPut(sd[pspageoffstr]); close(sock); return 0; } pages--; ddprintf(sd[pspagingstr], maincfg.CFG_SYSOPNAME); pageflag = 0; for (i = 0; i < 20; i++) { unsigned char c; DDPut("."); delayt = 1; while ((c = HotKey(HOT_QUICK))) { if (c == 255) break; if (c == 3) { DDPut(sd[psabortstr]); i = 21; break; } } if (pageflag) break; pm.pm_cmd = 1; name.sun_family = AF_UNIX; strlcpy(name.sun_path, YELLDSOCK, sizeof name.sun_path); sendto(sock, &pm, sizeof(struct DayDream_PageMsg), 0, (struct sockaddr *) &name, sizeof(struct sockaddr_un)); sleep(1); } if (i == 20) DDPut(sd[psnosysopstr]); close(sock); return 0; }
/* FIXME: rethink */ int lineed(char *buffer, size_t bufsize, int mode, struct DayDream_Message *msg) { int i, j; char lbuf[300]; char *s; int row; *wrapbuf = 0; row = 1; DDPut(sd[leheadstr]); if (mode) row = quote(buffer, bufsize); for (;;) { snprintf(lbuf, sizeof lbuf, "%c", maincfg.CFG_LINEEDCHAR); while (row != 495) { ddprintf(sd[lelinestr], row); s = buffer + (row - 1) * 80; *s = 0; if (!(Prompt(s, 75, PROMPT_WRAP))) return 0; if (!*s || !strcasecmp(lbuf, s)) break; row++; } for (;;) { DDPut(sd[lepromptstr]); lbuf[0] = 0; if (!(Prompt(lbuf, 3, 0))) return 0; if (!strcasecmp(lbuf, "a")) { DDPut(sd[lesureabortstr]); i = HotKey(HOT_NOYES); if (!i || i == 1) return 0; } else if (!strcasecmp(lbuf, "c")) { TypeFile("lineedcommands", TYPE_WARN | TYPE_MAKE); } else if (!strcasecmp(lbuf, "d")) { if ((row = delete_lines(row, buffer)) == -1) return 0; } else if (!strcasecmp(lbuf, "e")) { DDPut(sd[leedlinstr]); lbuf[0] = 0; if (!(Prompt(lbuf, 3, 0))) return 0; i = atoi(lbuf); if (!(i < 1 || i > (row - 1))) { ddprintf(sd[leedpstr], i); s = buffer + (i - 1) * 80; if (!(Prompt(s, 75, 0))) return 0; } } else if (!strcasecmp(lbuf, "r")) { break; } else if (!strcasecmp(lbuf, "f")) { if (msg && *msg->MSG_ATTACH) { fileattach(); } else { DDPut(sd[noattachstr]); } } else if ((!strcasecmp(lbuf, "i")) && row < 495) { DDPut(sd[insertstr]); lbuf[0] = 0; if (!(Prompt(lbuf, 3, 0))) return 0; DDPut("\nInsert does not work yet, sorry...\n\n"); } else if (!strcasecmp(lbuf, "l")) { int lcount = user.user_screenlength; i = row - 1; j = 1; while (i) { s = buffer + (j - 1) * 80; ddprintf(sd[lellinestr], j, s); lcount--; if (lcount == 0) { int hot; DDPut(sd[morepromptstr]); hot = HotKey(0); DDPut("\r \r"); if (hot == 'N' || hot == 'n') break; if (hot == 'C' || hot == 'c') { lcount = -1; } else { lcount = user.user_screenlength; } } j++; i--; } } else if (!strcasecmp(lbuf, "s")) { return row - 1; } else if (!strcasecmp(lbuf, "q")) { if (!mode) { DDPut(sd[lereperrorstr]); } row = quote(s, strlen(s)); } } } }
int changemsgbase(int newb, int flags) { char cbuffer[500]; int basen; int i; struct DayDream_LRP lrpd; int lrpfd; struct stat st; msgbase_t *cb; if (!conference()->conf.CONF_MSGBASES) { current_msgbase = NULL; return 0; } basen = newb; if (basen > conference()->conf.CONF_MSGBASES) basen = 0; /* The MC_QUICK flag is used on non-interactive occasions. */ if (!basen && (flags & MC_QUICK)) return 0; if (!basen) { if (conference()->conf.CONF_MSGBASES == 1) { DDPut(sd[cmbonlymsgsstr]); return 0; } TypeFile("messagebases", TYPE_WARN | TYPE_CONF | TYPE_MAKE); } while (!basen) { DDPut(sd[cmbselectstr]); cbuffer[0] = 0; if (!(Prompt(cbuffer, 3, 0))) return 0; if (!strcasecmp(cbuffer, "?") || (!strcasecmp(cbuffer, "l"))) { TypeFile("messagebases", TYPE_WARN | TYPE_CONF | TYPE_MAKE); } else if (cbuffer[0] == 0) { return 0; } else basen = atoi(cbuffer); } for (i = 0; i < conference()->conf.CONF_MSGBASES; i++) { cb = conference()->msgbases[i]; if (cb->MSGBASE_NUMBER != basen) continue; current_msgbase = cb; getmsgptrs(); if (lrpdatname[0] && (oldlrp != lrp || oldlsp != lsp)) { lrpfd = open(lrpdatname, O_WRONLY | O_CREAT, 0666); if (lrpfd == -1) { DDPut(sd[cmberrlrpstr]); return 0; } fsetperm(lrpfd, 0666); fstat(lrpfd, &st); lrpd.lrp_read = lrp; lrpd.lrp_scan = lsp; lseek(lrpfd, sizeof(struct DayDream_LRP) * user.user_account_id, SEEK_SET); safe_write(lrpfd, &lrpd, sizeof(struct DayDream_LRP)); close(lrpfd); } snprintf(lrpdatname, sizeof lrpdatname, "%s/messages/base%3.3d/msgbase.lrp", conference()->conf.CONF_PATH, cb->MSGBASE_NUMBER); lrpfd = open(lrpdatname, O_RDONLY); lrp = 0; lsp = 0; oldlrp = 0; oldlsp = 0; if (lrpfd != -1) { if ((lseek(lrpfd, sizeof(struct DayDream_LRP) * user.user_account_id, SEEK_SET)) != -1) { if (read(lrpfd, &lrpd, sizeof(struct DayDream_LRP))) { oldlrp = lrp = lrpd.lrp_read; oldlsp = lsp = lrpd.lrp_scan; } } close(lrpfd); } current_msgbase = cb; getmsgptrs(); if ((flags & MC_NOSTAT) == 0) { ddprintf(sd[cmbstat1str], current_msgbase->MSGBASE_NAME, highest - lowest); ddprintf(sd[cmbstat2str], lrp, lsp); ddprintf(sd[cmbstat3str], lowest, highest); } return 1; } DDPut(sd[cmbunkbasestr]); return 0; }
int joinconf(int confn, int flags) { int newconfnum; conference_t *mc; struct iterator *iterator; char jbuffer[100]; newconfnum = confn; changenodestatus("Changing conference"); if ((flags & JC_LIST) && newconfnum == -1) TypeFile("joinconference", TYPE_WARN | TYPE_MAKE); while (newconfnum == -1) { jbuffer[0] = 0; DDPut(sd[jcpromptstr]); if (!(Prompt(jbuffer, 3, 0))) return 0; if ((!strcasecmp(jbuffer, "l")) || jbuffer[0] == '?') TypeFile("joinconference", TYPE_WARN | TYPE_MAKE); else if (jbuffer[0] == 0) return 0; else { char *endptr; newconfnum = strtol(jbuffer, &endptr, 10); if (*jbuffer && !*endptr) break; } newconfnum = -1; } iterator = conference_iterator(); while ((mc = (conference_t *) iterator_next(iterator))) { if (mc->conf.CONF_NUMBER != newconfnum) continue; if (!checkconfaccess(newconfnum, &user)) { if (!(flags & JC_SHUTUP)) { DDPut(sd[jcnoaccessstr]); } iterator_discard(iterator); return 0; } if (*mc->conf.CONF_PASSWD && !(flags & JC_SHUTUP) && !(flags & JC_QUICK)) { conference_t *oldconf = conference(); set_conference(mc); TypeFile("conferencepw", TYPE_CONF | TYPE_MAKE); set_conference(oldconf); DDPut("[36mConference password: [0m"); *jbuffer = 0; if (!(Prompt(jbuffer, 16, PROMPT_SECRET))) { iterator_discard(iterator); return 0; } if (strcasecmp(jbuffer, mc->conf.CONF_PASSWD)) { iterator_discard(iterator); return 0; } } if (!(flags & JC_NOUPDATE)) user.user_joinconference = newconfnum; set_conference(mc); if (conference()->conf.CONF_MSGBASES) current_msgbase = conference()->msgbases[0]; else current_msgbase = NULL; if (!(flags & JC_QUICK)) { TypeFile("conferencejoined", TYPE_MAKE | TYPE_CONF); } if (current_msgbase) { if (flags & JC_QUICK) { changemsgbase(current_msgbase->MSGBASE_NUMBER, MC_QUICK | MC_NOSTAT); } else { changemsgbase(current_msgbase->MSGBASE_NUMBER, MC_QUICK); } } iterator_discard(iterator); return 1; } iterator_discard(iterator); if (!(flags & JC_SHUTUP)) { DDPut(sd[jcnoconfstr]); } return 0; }
static int try_login(void) { char username[300]; int retvalue, passwdcnt; DDPut(sd[usernamestr]); username[0] = 0; Prompt(username, 25, 0); removespaces(username); if (!checkcarrier()) return -1; if (!username[0]) { DDPut(""); return -1; } if (!strcasecmp("new", username) && !(maincfg.CFG_FLAGS & (1L << 17))) { CreateNewAccount(); return -1; } if (!strcasecmp("logoff", username)) return 0; if (!strcasecmp("chat", username)) { pagesysop(0); return -1; } retvalue = checklogon(username); if (!retvalue && !(maincfg.CFG_FLAGS & (1L << 17))) { if (maincfg.CFG_FLAGS & (1L << 9)) return create_new_account() ? 0 : -1; else { DDPut(sd[unknownuserstr]); return -1; } } else { if (retvalue != 1 && !(maincfg.CFG_FLAGS & (1L << 18))) return -1; for (passwdcnt = 0; passwdcnt < 3; passwdcnt++) { username[0] = 0; if (ispw() || retvalue != 1) { DDPut(sd[passwordstr]); Prompt(username, 25, PROMPT_SECRET); } if (!checkcarrier()) return -1; if (retvalue > 0 && (!ispw() || cmppasswds(username, user.user_password))) { if (retvalue == 2) DDPut(sd[alreadyonlinestr]); else getin(); return 0; } else { if (passwdcnt != 2) DDPut(sd[tryagainstr]); clog.cl_flags |= CL_PASSWDFAIL; } } if (retvalue != 2) { TypeFile("passwordfailure", TYPE_MAKE); DDPut(sd[excessivepwfailstr]); return 0; } } return -1; }
const TypeDir *MTPDevice::dirFetchContent(std::string path) { if (!m_root_dir.isFetched()) { for (LIBMTP_devicestorage_t *s = m_device->storage; s; s = s->next) { m_root_dir.addDir(TypeDir(s_root_node, 0, s->id, std::string(s->StorageDescription))); m_root_dir.setFetched(); } } if (m_root_dir.dirCount() == 1) path = '/' + m_root_dir.dirs().begin()->name() + path; if (path == "/") return &m_root_dir; std::string member; std::istringstream ss(path); TypeDir *dir = &m_root_dir; while (std::getline(ss, member, '/')) { if (member.empty()) continue; const TypeDir *tmp = dir->dir(member); if (!tmp && !dir->isFetched()) { criticalEnter(); LIBMTP_file_t *content = LIBMTP_Get_Files_And_Folders( m_device, dir->storageid(), dir->id()); criticalLeave(); for (LIBMTP_file_t *f = content; f; f = f->next) { if (f->filetype == LIBMTP_FILETYPE_FOLDER) dir->addDir(TypeDir(f)); else dir->addFile(TypeFile(f)); } LIBMTP_Free_Files_And_Folders(&content); dir->setFetched(); tmp = dir->dir(member); } if (!tmp) return nullptr; dir = const_cast<TypeDir*>(tmp); } if (dir->isFetched()) return dir; criticalEnter(); dir->setFetched(); LIBMTP_file_t *content = LIBMTP_Get_Files_And_Folders( m_device, dir->storageid(), dir->id()); criticalLeave(); for (LIBMTP_file_t *f = content; f; f = f->next) { if (f->filetype == LIBMTP_FILETYPE_FOLDER) dir->addDir(TypeDir(f)); else dir->addFile(TypeFile(f)); } LIBMTP_Free_Files_And_Folders(&content); return dir; }
/* FIXME! buffer overflows? */ static int handle_choice(const char *askbuf) { char lesbabuf[30]; struct userbase muser = user; int leps; if (!(strcasecmp(askbuf, "1"))) { for (;;) { if (!isaccess(SECB_REALNAME, access2)) break; DDPut(sd[eu1str]); strlcpy(lesbabuf, user.user_realname, sizeof lesbabuf); if (!(Prompt(lesbabuf, 25, 0))) return 1; removespaces(lesbabuf); if (strcasecmp(lesbabuf, user.user_realname)) { leps = findusername(lesbabuf); if (leps == user.user_account_id || leps == -1) { if (lesbabuf[0]) strlcpy(user.user_realname, lesbabuf, sizeof user.user_realname); } else { DDPut(sd[newalreadystr]); continue; } } break; } } else if (!(strcasecmp(askbuf, "2"))) { for (;;) { if (!isaccess(SECB_HANDLE, access2)) break; DDPut(sd[eu2str]); strlcpy(lesbabuf, user.user_handle, sizeof lesbabuf); if (!(Prompt(lesbabuf, 25, 0))) return 1; removespaces(lesbabuf); if (strcasecmp(lesbabuf, user.user_handle)) { leps = findusername(lesbabuf); if (leps == user.user_account_id || leps == -1) { if (lesbabuf[0]) strlcpy(user.user_handle, lesbabuf, sizeof user.user_handle); } else { DDPut(sd[newalreadystr]); continue; } } break; } } else if (!(strcasecmp(askbuf, "3"))) { DDPut(sd[eu3str]); if (!(Prompt(user.user_organization, 25, 0))) return 1; } else if (!(strcasecmp(askbuf, "4"))) { DDPut(sd[eu4str]); if (!(Prompt(user.user_zipcity, 20, 0))) return 1; } else if (!(strcasecmp(askbuf, "5"))) { DDPut(sd[eu5str]); if (!(Prompt(user.user_voicephone, 20, 0))) return 1; } else if (!(strcasecmp(askbuf, "6"))) { MD_CTX context; char verifypw[32]; DDPut(sd[eu6str]); lesbabuf[0] = 0; if (!(Prompt(lesbabuf, 15, PROMPT_SECRET))) return 1; if (lesbabuf[0] == 0) return 0; *verifypw = 0; DDPut(sd[euverifypwstr]); if (!(Prompt(verifypw, 15, PROMPT_SECRET))) return 1; if (strcasecmp(lesbabuf, verifypw)) { DDPut(sd[eunomatchstr]); return 0; } strupr(lesbabuf); MDInit(&context); MDUpdate(&context, (unsigned char *) lesbabuf, strlen(lesbabuf)); MDFinal(user.user_password, &context); } else if (!strcasecmp(askbuf, "7")) { for (;;) { int fallos; DDPut(sd[eu7str]); lesbabuf[0] = 0; if (!(Prompt(lesbabuf, 3, 0))) return 1; if (lesbabuf[0] == 't' || lesbabuf[0] == 'T') { testscreenl(); continue; } fallos = atoi(lesbabuf); if (fallos < 10) { DDPut(sd[newminslstr]); continue; } user.user_screenlength = fallos; break; } } else if (!(strcasecmp(askbuf, "8"))) { struct DayDream_Protocol *tp; TypeFile("protocols", TYPE_MAKE | TYPE_WARN); DDPut(sd[eu8str]); *lesbabuf = 0; if (user.user_protocol) { *lesbabuf = user.user_protocol; lesbabuf[1] = 0; } if (!(Prompt(lesbabuf, 3, 0))) return 1; *lesbabuf = toupper(*lesbabuf); if (!*lesbabuf) return 0; tp = protocols; for (;;) { if (tp->PROTOCOL_ID == 0) return 0; if (tp->PROTOCOL_ID == *lesbabuf) { protocol = tp; user.user_protocol = *lesbabuf; return 0; } tp++; } } else if (!(strcasecmp(askbuf, "9"))) { DDPut(sd[eu9str]); if (!(Prompt(user.user_signature, 44, 0))) return 1; } else if (!(strcasecmp(askbuf, "10"))) { DDPut(sd[eu10str]); if (!(Prompt(user.user_computermodel, 20, 0))) return 1; } else if (!(strcasecmp(askbuf, "11"))) { DDPut(sd[eu11str]); snprintf(lesbabuf, sizeof lesbabuf, "%d", user.user_flines); if (!(Prompt(lesbabuf, 3, 0))) return 1; user.user_flines = atoi(lesbabuf); } else if (!(strcasecmp(askbuf, "12"))) { rundoor("doors/autosig %N", 0); return 1; } else if (!(strcasecmp(askbuf, "a"))) { DDPut(sd[euabortedstr]); user = muser; return 1; } else if (!(strcasecmp(askbuf, "v"))) { TypeFile("edituser", TYPE_MAKE | TYPE_WARN); } else if (!(strcasecmp(askbuf, "s"))) { switches(); } else if ((!(strcasecmp(askbuf, "c")) || (askbuf[0] == 0))) { DDPut(sd[eusavedstr]); saveuserbase(&user); return 1; } return 0; }