static void UpdateUserStatsForLogin() { strcpy(g_szLastLoginDate, date()); if (IsEquals(g_szLastLoginDate, session()->user()->GetLastOn())) { session()->user()->SetTimesOnToday(session()->user()->GetTimesOnToday() + 1); } else { session()->user()->SetTimesOnToday(1); session()->user()->SetTimeOnToday(0.0); session()->user()->SetExtraTime(0.0); session()->user()->SetNumPostsToday(0); session()->user()->SetNumEmailSentToday(0); session()->user()->SetNumFeedbackSentToday(0); } session()->user()->SetNumLogons(session()->user()->GetNumLogons() + 1); session()->set_current_user_sub_num(0); session()->SetNumMessagesReadThisLogon(0); if (session()->udir[0].subnum == 0 && session()->udir[1].subnum > 0) { session()->set_current_user_dir_num(1); } else { session()->set_current_user_dir_num(0); } if (session()->GetEffectiveSl() != 255 && !guest_user) { WStatus* pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementCallerNumber(); pStatus->IncrementNumCallsToday(); session()->status_manager()->CommitTransaction(pStatus); } }
void make_pre_qwk(int msgnum, struct qwk_junk *qwk_info) { postrec* p = get_post(msgnum); if ((p->status & (status_unvalidated | status_delete)) && !lcs()) { return; } int nn = session()->net_num(); if (p->status & status_post_new_net) { set_net_num(p->network.network_msg.net_number); } put_in_qwk(p, (session()->current_sub().filename), msgnum, qwk_info); if (nn != session()->net_num()) { set_net_num(nn); } session()->user()->SetNumMessagesRead(session()->user()->GetNumMessagesRead() + 1); session()->SetNumMessagesReadThisLogon(session()->GetNumMessagesReadThisLogon() + 1); if (p->qscan > qsc_p[session()->GetCurrentReadMessageArea()]) { // Update qscan pointer right here qsc_p[session()->GetCurrentReadMessageArea()] = p->qscan; // And here } WStatus* pStatus1 = session()->status_manager()->GetStatus(); uint32_t lQScanPtr = pStatus1->GetQScanPointer(); delete pStatus1; if (p->qscan >= lQScanPtr) { WStatus* pStatus = session()->status_manager()->BeginTransaction(); pStatus->SetQScanPointer(p->qscan + 1); session()->status_manager()->CommitTransaction(pStatus); } }
static std::string CreateLastOnLogLine(const WStatus& status) { string log_line; if (a()->HasConfigFlag(OP_FLAGS_SHOW_CITY_ST) && (syscfg.sysconfig & sysconfig_extended_info)) { const string username_num = a()->names()->UserName(a()->usernum); log_line = StringPrintf( "|#1%-6ld %-25.25s %-5.5s %-5.5s %-15.15s %-2.2s %-3.3s %-8.8s %2d\r\n", status.GetCallerNumber(), username_num.c_str(), times(), fulldate(), a()->user()->GetCity(), a()->user()->GetState(), a()->user()->GetCountry(), a()->GetCurrentSpeed().c_str(), a()->user()->GetTimesOnToday()); } else { const string username_num = a()->names()->UserName(a()->usernum); log_line = StringPrintf( "|#1%-6ld %-25.25s %-10.10s %-5.5s %-5.5s %-20.20s %2d\r\n", status.GetCallerNumber(), username_num.c_str(), a()->cur_lang_name.c_str(), times(), fulldate(), a()->GetCurrentSpeed().c_str(), a()->user()->GetTimesOnToday()); } return log_line; }
static void save_gat(File *pMessageFile) { long lSectionPos = static_cast<long>(gat_section) * GATSECLEN; pMessageFile->Seek(lSectionPos, File::seekBegin); pMessageFile->Write(gat, GAT_SECTION_SIZE); WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementFileChangedFlag(WStatus::fileChangePosts); session()->status_manager()->CommitTransaction(pStatus); }
// Inserts a record into NAMES.LST void InsertSmallRecord(int user_number, const char *name) { WStatus *pStatus = session()->status_manager()->BeginTransaction(); session()->names()->Add(name, user_number); session()->names()->Save(); pStatus->IncrementNumUsers(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeNames); session()->status_manager()->CommitTransaction(pStatus); }
// Deletes a record from NAMES.LST (DeleteSmallRec) void DeleteSmallRecord(const char *name) { WStatus *pStatus = session()->status_manager()->BeginTransaction(); int found_user = session()->names()->FindUser(name); if (found_user < 1) { session()->status_manager()->AbortTransaction(pStatus); sysoplog(false) << "#*#*#*#*#*#*#*# '" << name << "' NOT ABLE TO BE DELETED"; sysoplog(false) << "#*#*#*#*#*#*#*# Run //RESETF to fix it."; return; } session()->names()->Remove(found_user); pStatus->DecrementNumUsers(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeNames); session()->names()->Save(); session()->status_manager()->CommitTransaction(pStatus); }
void reset_files() { WUser user; WStatus* pStatus = GetApplication()->GetStatusManager()->BeginTransaction(); pStatus->SetNumUsers(0); GetSession()->bout.NewLine(); int nNumUsers = GetApplication()->GetUserManager()->GetNumberOfUserRecords(); WFile userFile(syscfg.datadir, USER_LST); if (userFile.Open(WFile::modeBinary | WFile::modeReadWrite)) { for (int i = 1; i <= nNumUsers; i++) { long pos = static_cast<long>(syscfg.userreclen) * static_cast<long>(i); userFile.Seek(pos, WFile::seekBegin); userFile.Read(&user.data, syscfg.userreclen); if (!user.IsUserDeleted()) { user.FixUp(); if (isr1(i, nNumUsers, user.GetName())) { pStatus->IncrementNumUsers(); } } else { memset(&user.data, 0, syscfg.userreclen); user.SetInactFlag(0); user.SetInactFlag(inact_deleted); } userFile.Seek(pos, WFile::seekBegin); userFile.Write(&user.data, syscfg.userreclen); if ((i % 10) == 0) { userFile.Close(); GetSession()->bout << i << "\r "; userFile.Open(WFile::modeBinary | WFile::modeReadWrite); } } userFile.Close(); } GetSession()->bout << "\r\n\r\n"; WFile namesFile(syscfg.datadir, NAMES_LST); if (!namesFile.Open(WFile::modeReadWrite | WFile::modeBinary | WFile::modeTruncate)) { std::cout << namesFile.GetFullPathName() << " NOT FOUND" << std::endl; GetApplication()->AbortBBS(true); } namesFile.Write(smallist, sizeof(smalrec) * pStatus->GetNumUsers()); namesFile.Close(); GetApplication()->GetStatusManager()->CommitTransaction(pStatus); }
void uploaded(char *file_name, long lCharsPerSecond) { uploadsrec u; for (auto it = begin(session()->batch); it != end(session()->batch); it++) { const auto& b = *it; if (IsEquals(file_name, b.filename) && !b.sending) { dliscan1(b.dir); int nRecNum = recno(b.filename); if (nRecNum > 0) { File downFile(g_szDownloadFileName); downFile.Open(File::modeBinary | File::modeCreateFile | File::modeReadWrite); do { FileAreaSetRecord(downFile, nRecNum); downFile.Read(&u, sizeof(uploadsrec)); if (u.numbytes != 0) { nRecNum = nrecno(b.filename, nRecNum); } } while (nRecNum != -1 && u.numbytes != 0); downFile.Close(); if (nRecNum != -1 && u.numbytes == 0) { char szSourceFileName[MAX_PATH], szDestFileName[MAX_PATH]; sprintf(szSourceFileName, "%s%s", syscfgovr.batchdir, file_name); sprintf(szDestFileName, "%s%s", session()->directories[b.dir].path, file_name); if (!IsEquals(szSourceFileName, szDestFileName) && File::Exists(szSourceFileName)) { bool found = false; if (szSourceFileName[1] != ':' && szDestFileName[1] != ':') { found = true; } if (szSourceFileName[1] == ':' && szDestFileName[1] == ':' && szSourceFileName[0] == szDestFileName[0]) { found = true; } if (found) { File::Rename(szSourceFileName, szDestFileName); File::Remove(szSourceFileName); } else { copyfile(szSourceFileName, szDestFileName, false); File::Remove(szSourceFileName); } } File file(szDestFileName); if (file.Open(File::modeBinary | File::modeReadOnly)) { if (!syscfg.upload_cmd.empty()) { file.Close(); if (!check_ul_event(b.dir, &u)) { didnt_upload(b); } else { file.Open(File::modeBinary | File::modeReadOnly); } } if (file.IsOpen()) { u.numbytes = file.GetLength(); file.Close(); get_file_idz(&u, b.dir); session()->user()->SetFilesUploaded(session()->user()->GetFilesUploaded() + 1); modify_database(u.filename, true); session()->user()->SetUploadK(session()->user()->GetUploadK() + static_cast<int>(bytes_to_k(u.numbytes))); WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementNumUploadsToday(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeUpload); session()->status_manager()->CommitTransaction(pStatus); File fileDn(g_szDownloadFileName); fileDn.Open(File::modeBinary | File::modeCreateFile | File::modeReadWrite); FileAreaSetRecord(fileDn, nRecNum); fileDn.Write(&u, sizeof(uploadsrec)); fileDn.Close(); sysoplogf("+ \"%s\" uploaded on %s (%ld cps)", u.filename, session()->directories[b.dir].name, lCharsPerSecond); bout << "Uploaded '" << u.filename << "' to " << session()->directories[b.dir].name << " (" << lCharsPerSecond << " cps)" << wwiv::endl; } } it = delbatch(it); return; } } it = delbatch(it); if (try_to_ul(file_name)) { sysoplogf("!!! Couldn't find file \"%s\" in directory.", file_name); bout << "Deleting - couldn't find data for file " << file_name << wwiv::endl; } return; } } if (try_to_ul(file_name)) { sysoplogf("!!! Couldn't find \"%s\" in UL batch queue.", file_name); bout << "Deleting - don't know what to do with file " << file_name << wwiv::endl; File::Remove(syscfgovr.batchdir, file_name); } }
void multimail(int *pnUserNumber, int numu) { mailrec m, m1; char s[255], s2[81]; User user; memset(&m, 0, sizeof(mailrec)); if (freek1(syscfg.msgsdir) < 10) { bout.nl(); bout << "Sorry, not enough disk space left.\r\n\n"; return; } bout.nl(); MessageEditorData data; data.need_title = true; if (getslrec(session()->GetEffectiveSl()).ability & ability_email_anony) { data.anonymous_flag = anony_enable_anony; } bout << "|#5Show all recipients in mail? "; bool show_all = yesno(); int j = 0; string s1 = StringPrintf("\003""6CC: \003""1"); m.msg.storage_type = EMAIL_STORAGE; strcpy(irt, "Multi-Mail"); irt_name[0] = 0; File::Remove(QUOTES_TXT); data.aux = "email"; data.fsed_flags = INMSG_NOFSED; data.to_name = "Multi-Mail"; data.msged_flags = MSGED_FLAG_NONE; if (!inmsg(data)) { return; } savefile(data.text, &m.msg, data.aux); strcpy(m.title, data.title.c_str()); bout << "Mail sent to:\r\n"; sysoplog("Multi-Mail to:"); lineadd(&m.msg, "\003""7----", "email"); for (int cv = 0; cv < numu; cv++) { if (pnUserNumber[cv] < 0) { continue; } session()->users()->ReadUser(&user, pnUserNumber[cv]); if ((user.GetSl() == 255 && (user.GetNumMailWaiting() > static_cast<unsigned int>(syscfg.maxwaiting * 5))) || ((user.GetSl() != 255) && (user.GetNumMailWaiting() > syscfg.maxwaiting)) || user.GetNumMailWaiting() > 200) { bout << session()->names()->UserName(pnUserNumber[cv]) << " mailbox full, not sent."; pnUserNumber[cv] = -1; continue; } if (user.IsUserDeleted()) { bout << "User deleted, not sent.\r\n"; pnUserNumber[cv] = -1; continue; } strcpy(s, " "); user.SetNumMailWaiting(user.GetNumMailWaiting() + 1); session()->users()->WriteUser(&user, pnUserNumber[cv]); if (pnUserNumber[cv] == 1) { ++fwaiting; } const string pnunn = session()->names()->UserName(pnUserNumber[cv]); strcat(s, pnunn.c_str()); WStatus* pStatus = session()->status_manager()->BeginTransaction(); if (pnUserNumber[cv] == 1) { pStatus->IncrementNumFeedbackSentToday(); session()->user()->SetNumFeedbackSentToday(session()->user()->GetNumFeedbackSentToday() + 1); session()->user()->SetNumFeedbackSent(session()->user()->GetNumFeedbackSent() + 1); ++fsenttoday; } else { pStatus->IncrementNumEmailSentToday(); session()->user()->SetNumEmailSent(session()->user()->GetNumEmailSent() + 1); session()->user()->SetNumEmailSentToday(session()->user()->GetNumEmailSentToday() + 1); } session()->status_manager()->CommitTransaction(pStatus); sysoplog(s); bout << s; bout.nl(); if (show_all) { const string pnunn2 = session()->names()->UserName(pnUserNumber[cv]); sprintf(s2, "%-22.22s ", pnunn2.c_str()); s1.assign(s2); j++; if (j >= 3) { lineadd(&m.msg, s1, "email"); j = 0; s1 = "\003""1 "; } } } if (show_all) { if (j) { lineadd(&m.msg, s1, "email"); } } s1 = StringPrintf("\003""2Mail Sent to %d Addresses!", numu); lineadd(&m.msg, "\003""7----", "email"); lineadd(&m.msg, s1, "email"); m.anony = static_cast<unsigned char>(data.anonymous_flag); m.fromsys = 0; m.fromuser = static_cast<uint16_t>(session()->usernum); m.tosys = 0; m.touser = 0; m.status = status_multimail; m.daten = static_cast<uint32_t>(time(nullptr)); unique_ptr<File> pFileEmail(OpenEmailFile(true)); int len = pFileEmail->GetLength() / sizeof(mailrec); int i = 0; if (len != 0) { i = len - 1; pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin); pFileEmail->Read(&m1, sizeof(mailrec)); while ((i > 0) && (m1.tosys == 0) && (m1.touser == 0)) { --i; pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin); int i1 = pFileEmail->Read(&m1, sizeof(mailrec)); if (i1 == -1) { bout << "|#6DIDN'T READ WRITE!\r\n"; } } if ((m1.tosys) || (m1.touser)) { ++i; } } pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin); for (int cv = 0; cv < numu; cv++) { if (pnUserNumber[cv] > 0) { m.touser = static_cast<uint16_t>(pnUserNumber[cv]); pFileEmail->Write(&m, sizeof(mailrec)); } } pFileEmail->Close(); }
void beginday(bool displayStatus) { if ((GetSession()->GetBeginDayNodeNumber() > 0) && (GetApplication()->GetInstanceNumber() != GetSession()->GetBeginDayNodeNumber())) { // If BEGINDAYNODENUMBER is > 0 or defined in WWIV.INI only handle beginday events on that node number GetApplication()->GetStatusManager()->RefreshStatusCache(); return; } WStatus *pStatus = GetApplication()->GetStatusManager()->BeginTransaction(); pStatus->ValidateAndFixDates(); if (wwiv::strings::IsEquals(date(), pStatus->GetLastDate())) { GetApplication()->GetStatusManager()->CommitTransaction(pStatus); return; } GetSession()->bout << "|#7* |#1Running Daily Maintenance...\r\n"; if (displayStatus) { GetSession()->bout << " |#7* |#1Updating system activity...\r\n"; } zlogrec z; strcpy(z.date, pStatus->GetLastDate()); z.active = pStatus->GetMinutesActiveToday(); z.calls = pStatus->GetNumCallsToday(); z.posts = pStatus->GetNumLocalPosts(); z.email = pStatus->GetNumEmailSentToday(); z.fback = pStatus->GetNumFeedbackSentToday(); z.up = pStatus->GetNumUploadsToday(); pStatus->NewDay(); if (displayStatus) { GetSession()->bout << " |#7* |#1Cleaning up log files...\r\n"; } WFile::Remove(syscfg.gfilesdir, pStatus->GetLogFileName(1)); WFile::Remove(syscfg.gfilesdir, USER_LOG); if (displayStatus) { GetSession()->bout << " |#7* |#1Updating ZLOG information...\r\n"; } WFile fileZLog(syscfg.datadir, ZLOG_DAT); zlogrec z1; if (!fileZLog.Open(WFile::modeReadWrite | WFile::modeBinary)) { fileZLog.Open(WFile::modeReadWrite | WFile::modeBinary | WFile::modeCreateFile, WFile::shareDenyNone, WFile::permReadWrite); z1.date[0] = '\0'; z1.active = 0; z1.calls = 0; z1.posts = 0; z1.email = 0; z1.fback = 0; z1.up = 0; for (int i = 0; i < 97; i++) { fileZLog.Write(&z1, sizeof(zlogrec)); } } else { for (int i = 96; i >= 1; i--) { fileZLog.Seek((i - 1) * sizeof(zlogrec), WFile::seekBegin); fileZLog.Read(&z1, sizeof(zlogrec)); fileZLog.Seek(i * sizeof(zlogrec), WFile::seekBegin); fileZLog.Write(&z1, sizeof(zlogrec)); } } fileZLog.Seek(0L, WFile::seekBegin); fileZLog.Write(&z, sizeof(zlogrec)); fileZLog.Close(); if (displayStatus) { GetSession()->bout << " |#7* |#1Updating STATUS.DAT...\r\n"; } int nus = syscfg.maxusers - pStatus->GetNumUsers(); GetApplication()->GetStatusManager()->CommitTransaction(pStatus); if (displayStatus) { GetSession()->bout << " |#7* |#1Checking system directories and user space...\r\n"; } double fk = freek1(syscfg.datadir); if (fk < 512.0) { ssm(1, 0, "Only %dk free in data directory.", static_cast<int>(fk)); } if (!syscfg.closedsystem && nus < 15) { ssm(1, 0, "Only %d new user slots left.", nus); } if (syscfg.beginday_c && *syscfg.beginday_c) { const std::string commandLine = stuff_in(syscfg.beginday_c, create_chain_file(), "", "", "", ""); ExecuteExternalProgram(commandLine, GetApplication()->GetSpawnOptions(SPWANOPT_BEGINDAY)); } if (displayStatus) { GetSession()->bout << " |#7* |#1Purging inactive users (if enabled)...\r\n"; } auto_purge(); if (displayStatus) { GetSession()->bout << " |#7* |#1Updating user ages...\r\n"; } set_user_age(); if (displayStatus) { GetSession()->bout << "|#7* |#1Done!\r\n"; } sysoplog("", false); sysoplog("* Ran Daily Maintenance...", false); sysoplog("", false); }
void normalupload(int dn) { uploadsrec u, u1; memset(&u, 0, sizeof(uploadsrec)); memset(&u1, 0, sizeof(uploadsrec)); int ok = 1; dliscan1(dn); directoryrec d = session()->directories[dn]; if (session()->numf >= d.maxfiles) { bout.nl(3); bout << "This directory is currently full.\r\n\n"; return; } if ((d.mask & mask_no_uploads) && (!dcs())) { bout.nl(2); bout << "Uploads are not allowed to this directory.\r\n\n"; return; } bout << "|#9Filename: "; char szInputFileName[MAX_PATH]; input(szInputFileName, 12); if (!okfn(szInputFileName)) { szInputFileName[0] = '\0'; } else { if (!is_uploadable(szInputFileName)) { if (so()) { bout.nl(); bout << "|#5In filename database - add anyway? "; if (!yesno()) { szInputFileName[0] = '\0'; } } else { szInputFileName[0] = '\0'; bout.nl(); bout << "|#6File either already here or unwanted.\r\n"; } } } align(szInputFileName); if (strchr(szInputFileName, '?')) { return; } if (d.mask & mask_archive) { ok = 0; string supportedExtensions; for (int k = 0; k < MAX_ARCS; k++) { if (session()->arcs[k].extension[0] && session()->arcs[k].extension[0] != ' ') { if (!supportedExtensions.empty()) { supportedExtensions += ", "; } supportedExtensions += session()->arcs[k].extension; if (wwiv::strings::IsEquals(szInputFileName + 9, session()->arcs[k].extension)) { ok = 1; } } } if (!ok) { bout.nl(); bout << "Sorry, all uploads to this dir must be archived. Supported types are:\r\n" << supportedExtensions << "\r\n\n"; return; } } strcpy(u.filename, szInputFileName); u.ownerusr = static_cast<uint16_t>(session()->usernum); u.ownersys = 0; u.numdloads = 0; u.unused_filetype = 0; u.mask = 0; const string unn = session()->names()->UserName(session()->usernum); strcpy(u.upby, unn.c_str()); strcpy(u.date, date()); bout.nl(); ok = 1; bool xfer = true; if (check_batch_queue(u.filename)) { ok = 0; bout.nl(); bout << "That file is already in the batch queue.\r\n\n"; } else { if (!wwiv::strings::IsEquals(szInputFileName, " . ")) { bout << "|#5Upload '" << szInputFileName << "' to " << d.name << "? "; } else { ok = 0; } } char szUnalignedFile[MAX_PATH]; strcpy(szUnalignedFile, szInputFileName); unalign(szUnalignedFile); char szReceiveFileName[MAX_PATH]; sprintf(szReceiveFileName, "%s%s", d.path, szUnalignedFile); if (ok && yesno()) { if (File::Exists(d.path, szUnalignedFile)) { if (dcs()) { xfer = false; bout.nl(2); bout << "File already exists.\r\n|#5Add to database anyway? "; if (!yesno()) { ok = 0; } } else { bout.nl(2); bout << "That file is already here.\r\n\n"; ok = 0; } } else if (!incom) { bout.nl(); bout << "File isn't already there.\r\nCan't upload locally.\r\n\n"; ok = 0; } if ((d.mask & mask_PD) && ok) { bout.nl(); bout << "|#5Is this program PD/Shareware? "; if (!yesno()) { bout.nl(); bout << "This directory is for Public Domain/\r\nShareware programs ONLY. Please do not\r\n"; bout << "upload other programs. If you have\r\ntrouble with this policy, please contact\r\n"; bout << "the sysop.\r\n\n"; const string message = StringPrintf("Wanted to upload \"%s\"", u.filename); sysoplog() << "*** ASS-PTS: " << 5 << ", Reason: [" << message << "]"; session()->user()->IncrementAssPoints(5); ok = 0; } else { u.mask = mask_PD; } } if (ok && !session()->HasConfigFlag(OP_FLAGS_FAST_SEARCH)) { bout.nl(); bout << "Checking for same file in other session()->directories...\r\n\n"; int nLastLineLength = 0; for (size_t i = 0; i < session()->directories.size() && session()->udir[i].subnum != -1; i++) { string buffer = "Scanning "; buffer += session()->directories[session()->udir[i].subnum].name; int nBufferLen = buffer.length(); for (int i3 = nBufferLen; i3 < nLastLineLength; i3++) { buffer += " "; } nLastLineLength = nBufferLen; bout << buffer << "\r"; dliscan1(session()->udir[i].subnum); int i1 = recno(u.filename); if (i1 >= 0) { bout.nl(); bout << "Same file found on " << session()->directories[session()->udir[i].subnum].name << wwiv::endl; if (dcs()) { bout.nl(); bout << "|#5Upload anyway? "; if (!yesno()) { ok = 0; break; } bout.nl(); } else { ok = 0; break; } } } bout << string(nLastLineLength, SPACE) << "\r"; if (ok) { dliscan1(dn); } bout.nl(); } if (ok) { bout.nl(); bout << "Please enter a one line description.\r\n:"; inputl(u.description, 58); bout.nl(); string ext_desc; modify_extended_description(&ext_desc, session()->directories[dn].name); if (!ext_desc.empty()) { add_extended_description(u.filename, ext_desc); u.mask |= mask_extended; } bout.nl(); if (xfer) { write_inst(INST_LOC_UPLOAD, session()->current_user_dir().subnum, INST_FLAGS_ONLINE); auto ti = timer(); receive_file(szReceiveFileName, &ok, u.filename, dn); ti = timer() - ti; if (ti < 0) { ti += SECONDS_PER_DAY; } session()->user()->SetExtraTime(session()->user()->GetExtraTime() + static_cast<float>(ti)); } if (ok) { File file(szReceiveFileName); if (ok == 1) { if (!file.Open(File::modeBinary | File::modeReadOnly)) { ok = 0; bout.nl(2); bout << "OS error - File not found.\r\n\n"; if (u.mask & mask_extended) { delete_extended_description(u.filename); } } if (ok && !syscfg.upload_cmd.empty()) { file.Close(); bout << "Please wait...\r\n"; if (!check_ul_event(dn, &u)) { if (u.mask & mask_extended) { delete_extended_description(u.filename); } ok = 0; } else { file.Open(File::modeBinary | File::modeReadOnly); } } } if (ok) { if (ok == 1) { u.numbytes = file.GetLength(); file.Close(); session()->user()->SetFilesUploaded(session()->user()->GetFilesUploaded() + 1); modify_database(u.filename, true); session()->user()->SetUploadK(session()->user()->GetUploadK() + bytes_to_k(u.numbytes)); get_file_idz(&u, dn); } else { u.numbytes = 0; } time_t lCurrentTime; time(&lCurrentTime); u.daten = static_cast<uint32_t>(lCurrentTime); File fileDownload(session()->download_filename_); fileDownload.Open(File::modeBinary | File::modeCreateFile | File::modeReadWrite); for (int j = session()->numf; j >= 1; j--) { FileAreaSetRecord(fileDownload, j); fileDownload.Read(&u1, sizeof(uploadsrec)); FileAreaSetRecord(fileDownload, j + 1); fileDownload.Write(&u1, sizeof(uploadsrec)); } FileAreaSetRecord(fileDownload, 1); fileDownload.Write(&u, sizeof(uploadsrec)); ++session()->numf; FileAreaSetRecord(fileDownload, 0); fileDownload.Read(&u1, sizeof(uploadsrec)); u1.numbytes = session()->numf; u1.daten = static_cast<uint32_t>(lCurrentTime); FileAreaSetRecord(fileDownload, 0); fileDownload.Write(&u1, sizeof(uploadsrec)); fileDownload.Close(); if (ok == 1) { WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementNumUploadsToday(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeUpload); session()->status_manager()->CommitTransaction(pStatus); sysoplog() << StringPrintf("+ \"%s\" uploaded on %s", u.filename, session()->directories[dn].name); bout.nl(2); bout.bprintf("File uploaded.\r\n\nYour ratio is now: %-6.3f\r\n", ratio()); bout.nl(2); if (session()->IsUserOnline()) { session()->UpdateTopScreen(); } } } } else { bout.nl(2); bout << "File transmission aborted.\r\n\n"; if (u.mask & mask_extended) { delete_extended_description(u.filename); } } } } }
/** * Writes the auto message */ void write_automessage() { std::vector<std::string> lines; std::string rollOver; GetSession()->bout << "\r\n|#9Enter auto-message. Max 5 lines. Colors allowed:|#0\r\n\n"; for (int i = 0; i < 5; i++) { GetSession()->bout << "|#7" << i + 1 << ":|#0"; std::string line; inli(line, rollOver, 70); StringTrimEnd(line); lines.push_back(line); } GetSession()->bout.NewLine(); bool bAnonStatus = false; if (getslrec(GetSession()->GetEffectiveSl()).ability & ability_post_anony) { GetSession()->bout << "|#9Anonymous? "; bAnonStatus = yesno(); } GetSession()->bout << "|#9Is this OK? "; if (yesno()) { WStatus *pStatus = GetApplication()->GetStatusManager()->BeginTransaction(); pStatus->SetAutoMessageAnonymous(bAnonStatus); pStatus->SetAutoMessageAuthorUserNumber(GetSession()->usernum); GetApplication()->GetStatusManager()->CommitTransaction(pStatus); WTextFile file(syscfg.gfilesdir, AUTO_MSG, "wt"); std::string authorName = GetSession()->GetCurrentUser()->GetUserNameAndNumber(GetSession()->usernum); file.WriteFormatted("%s\r\n", authorName.c_str()); sysoplog("Changed Auto-message"); #if defined(_MSC_VER) && (_MSC_VER < 1800) for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) { std::string line = (*iter); StringTrimEnd(line); #else for (const auto& line : lines) { #endif file.Write(line); file.Write("\r\n"); sysoplog(line, true); } GetSession()->bout << "\r\n|#5Auto-message saved.\r\n\n"; file.Close(); } } char ShowAMsgMenuAndGetInput(const std::string& autoMessageLockFileName) { bool bCanWrite = false; if (!GetSession()->GetCurrentUser()->IsRestrictionAutomessage() && !WFile::Exists(autoMessageLockFileName)) { bCanWrite = (getslrec(GetSession()->GetEffectiveSl()).posts) ? true : false; } char cmdKey = 0; if (cs()) { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply, (|#2W|#9)rite, (|#2L|#9)ock, (|#2D|#9)el, (|#2U|#9)nlock : "; cmdKey = onek("QRWALDU", true); } else if (bCanWrite) { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply, (|#2W|#9)rite : "; cmdKey = onek("QRWA", true); } else { GetSession()->bout << "|#9(|#2Q|#9)uit, (|#2R|#9)ead, (|#2A|#9)uto-reply : "; cmdKey = onek("QRA", true); } return cmdKey; }
/** * Main Automessage menu. Displays the auto message then queries for input. */ void do_automessage() { std::stringstream lockFileStream; lockFileStream << syscfg.gfilesdir << LOCKAUTO_MSG; std::string automessageLockFile = lockFileStream.str(); std::stringstream autoMessageStream; autoMessageStream << syscfg.gfilesdir << AUTO_MSG; std::string autoMessageFile = autoMessageStream.str(); // initally show the auto message read_automessage(); bool done = false; do { GetSession()->bout.NewLine(); char cmdKey = ShowAMsgMenuAndGetInput(automessageLockFile); switch (cmdKey) { case 'Q': done = true; break; case 'R': read_automessage(); break; case 'W': write_automessage(); break; case 'A': { grab_quotes(NULL, NULL); WStatus *pStatus = GetApplication()->GetStatusManager()->GetStatus(); if (pStatus->GetAutoMessageAuthorUserNumber() > 0) { strcpy(irt, "Re: AutoMessage"); email(pStatus->GetAutoMessageAuthorUserNumber(), 0, false, pStatus->IsAutoMessageAnonymous() ? anony_sender : 0); } delete pStatus; } break; case 'D': GetSession()->bout << "\r\n|#3Delete Auto-message, Are you sure? "; if (yesno()) { WFile::Remove(autoMessageFile); } GetSession()->bout.NewLine(2); break; case 'L': if (WFile::Exists(automessageLockFile)) { GetSession()->bout << "\r\n|#3Message is already locked.\r\n\n"; } else { GetSession()->bout << "|#9Do you want to lock the Auto-message? "; if (yesno()) { ///////////////////////////////////////////////////////// // This makes a file in your GFILES dir 1 bytes long, // to tell the board if it is locked or not. It consists // of a space. // WTextFile lockFile(automessageLockFile, "w+t"); lockFile.WriteChar(' '); lockFile.Close(); } } break; case 'U': if (!WFile::Exists(automessageLockFile)) { GetSession()->bout << "Message not locked.\r\n"; } else { GetSession()->bout << "|#5Unlock message? "; if (yesno()) { WFile::Remove(automessageLockFile); } } break; } } while (!done && !hangup); }
static int try_to_ul_wh(const string& orig_file_name) { directoryrec d = {}; int i1, i2, i4, key, ok = 0, dn = 0; uploadsrec u, u1; string file_name = orig_file_name; StringRemoveWhitespace(&file_name); if (!okfn(file_name)) { t2u_error(file_name, "Bad filename"); // bad filename return 1; } bout.cls(); bout.nl(3); bool done = false; if (session()->user()->IsRestrictionValidate() || session()->user()->IsRestrictionUpload() || (syscfg.sysconfig & sysconfig_all_sysop)) { dn = (syscfg.newuploads < session()->directories.size()) ? syscfg.newuploads : 0; } else { char temp[10]; // The hangup check is below so uploads get uploaded even on hangup done = false; while (!done) { if (hangup) { if (syscfg.newuploads < session()->directories.size()) { dn = syscfg.newuploads; } else { dn = 0; } done = true; } else { // The sleep_for used to be a wait_sec_or_hit( 1 ) sleep_for(milliseconds(500)); bout << "\r\nUpload " << file_name << " to which dir? <CR>=0 ?=List \r\n"; input(temp, 5, true); StringTrim(temp); if (temp[0] == '?') { dirlist(1); } else if (!temp[0]) { dn = 0; done = true; } else { int x = atoi(temp); if (session()->udir[x].subnum >= 0) { dliscan1(session()->udir[x].subnum); d = session()->directories[dn]; if ((d.mask & mask_no_uploads) && (!dcs())) { bout << "Can't upload there...\r\n"; pausescr(); } else { dn = session()->udir[x].subnum; done = true; } } } } } } dliscan1(dn); d = session()->directories[dn]; if (session()->numf >= d.maxfiles) { t2u_error(file_name, "This directory is currently full."); return 1; } if ((d.mask & mask_no_uploads) && (!dcs())) { t2u_error(file_name, "Uploads are not allowed to this directory."); return 1; } if (!is_uploadable(file_name.c_str())) { if (so()) { bout.nl(); bout << "|#5In filename database - add anyway? "; if (!yesno()) { t2u_error(file_name, "|#6File either already here or unwanted."); return 1; } } else { t2u_error(file_name, "|#6File either already here or unwanted."); return 1; } } string s = file_name; align(&s); if (contains(s, '?')) { t2u_error(file_name, "Contains wildcards"); return 1; } if (d.mask & mask_archive) { ok = 0; string s1; for (size_t i = 0; i < MAX_ARCS; i++) { if (session()->arcs[i].extension[0] && session()->arcs[i].extension[0] != ' ') { if (!s1.empty()) s1 += ", "; s1 += session()->arcs[i].extension; if (wwiv::strings::IsEquals(s.c_str() + 9, session()->arcs[i].extension)) { ok = 1; } } } if (!ok) { bout.nl(); bout << "Sorry, all uploads to this directory must be archived. Supported types are:\r\n"; bout << s1; bout.nl(2); t2u_error(file_name, "Unsupported archive"); return 1; } } strcpy(u.filename, s.c_str()); u.ownerusr = static_cast<uint16_t>(session()->usernum); u.ownersys = 0; u.numdloads = 0; u.unused_filetype = 0; u.mask = 0; const string unn = session()->names()->UserName(session()->usernum); strncpy(u.upby, unn.c_str(), sizeof(u.upby)); u.upby[36] = '\0'; strcpy(u.date, date()); if (File::Exists(StrCat(d.path, s))) { if (dcs()) { bout.nl(2); bout << "File already exists.\r\n|#5Add to database anyway? "; if (yesno() == 0) { t2u_error(file_name, "That file is already here."); return 1; } } else { t2u_error(file_name, "That file is already here."); return 1; } } if (ok && (!session()->HasConfigFlag(OP_FLAGS_FAST_SEARCH))) { bout.nl(); bout << "Checking for same file in other session()->directories...\r\n\n"; i2 = 0; for (size_t i = 0; (i < session()->directories.size()) && (session()->udir[i].subnum != -1); i++) { string s1 = StrCat("Scanning ", session()->directories[session()->udir[i].subnum].name); i4 = s1.size(); //s1 += string(i3 - i2, ' '); i2 = i4; bout << s1; bout.bputch('\r'); dliscan1(session()->udir[i].subnum); i1 = recno(u.filename); if (i1 >= 0) { bout.nl(); bout << "Same file found on " << session()->directories[session()->udir[i].subnum].name << wwiv::endl; if (dcs()) { bout.nl(); bout << "|#5Upload anyway? "; if (!yesno()) { t2u_error(file_name, "That file is already here."); return 1; } bout.nl(); } else { t2u_error(file_name, "That file is already here."); return 1; } } } bout << string(i2, ' ') << "\r"; dliscan1(dn); bout.nl(); } const string src = StrCat(session()->batch_directory(), file_name); const string dest = StrCat(d.path, file_name); if (File::Exists(dest)) { File::Remove(dest); } // s1 and s2 should remain set,they are used below movefile(src, dest, true); strcpy(u.description, "NO DESCRIPTION GIVEN"); bool file_id_avail = get_file_idz(&u, dn); done = false; while (!done && !hangup && !file_id_avail) { bool abort = false; bout.cls(); bout.nl(); bout << "|#1Upload going to |#7" << d.name << "\r\n\n"; bout << " |#1Filename |01: |#7" << file_name << wwiv::endl; bout << "|#2A|#7] |#1Description |01: |#7" << u.description << wwiv::endl; bout << "|#2B|#7] |#1Modify extended description\r\n\n"; print_extended(u.filename, &abort, 10, 0); bout << "|#2<|#7CR|#2> |#1to continue, |#7Q|#1 to abort upload: "; key = onek("\rQABC", true); switch (key) { case 'Q': bout << "Are you sure, file will be lost? "; if (yesno()) { t2u_error(file_name, "Changed mind"); // move file back to batch dir movefile(dest, src, true); return 1; } break; case 'A': bout.nl(); bout << "Please enter a one line description.\r\n:"; inputl(u.description, 58); break; case 'B': { bout.nl(); string ss = read_extended_description(u.filename); bout << "|#5Modify extended description? "; if (yesno()) { bout.nl(); if (!ss.empty()) { bout << "|#5Delete it? "; if (yesno()) { delete_extended_description(u.filename); u.mask &= ~mask_extended; } else { u.mask |= mask_extended; modify_extended_description(&ss, session()->directories[session()->current_user_dir().subnum].name); if (!ss.empty()) { delete_extended_description(u.filename); add_extended_description(u.filename, ss); } } } else { modify_extended_description(&ss, session()->directories[session()->current_user_dir().subnum].name); if (!ss.empty()) { add_extended_description(u.filename, ss); u.mask |= mask_extended; } else { u.mask &= ~mask_extended; } } } else if (!ss.empty()) { u.mask |= mask_extended; } else { u.mask &= ~mask_extended; } } break; case '\r': bout.nl(); done = true; } } bout.nl(3); File file(d.path, s); if (!file.Open(File::modeBinary | File::modeReadOnly)) { // dos error, file not found if (u.mask & mask_extended) { delete_extended_description(u.filename); } t2u_error(file_name, "DOS error - File not found."); return 1; } if (!syscfg.upload_cmd.empty()) { file.Close(); bout << "Please wait...\r\n"; if (!check_ul_event(dn, &u)) { if (u.mask & mask_extended) { delete_extended_description(u.filename); } t2u_error(file_name, "Failed upload event"); return 1; } else { file.Open(File::modeBinary | File::modeReadOnly); } } long lFileLength = file.GetLength(); u.numbytes = lFileLength; file.Close(); session()->user()->SetFilesUploaded(session()->user()->GetFilesUploaded() + 1); time_t tCurrentDate = time(nullptr); u.daten = static_cast<uint32_t>(tCurrentDate); File fileDownload(session()->download_filename_); fileDownload.Open(File::modeBinary | File::modeCreateFile | File::modeReadWrite); for (int i = session()->numf; i >= 1; i--) { FileAreaSetRecord(fileDownload, i); fileDownload.Read(&u1, sizeof(uploadsrec)); FileAreaSetRecord(fileDownload, i + 1); fileDownload.Write(&u1, sizeof(uploadsrec)); } FileAreaSetRecord(fileDownload, 1); fileDownload.Write(&u, sizeof(uploadsrec)); ++session()->numf; FileAreaSetRecord(fileDownload, 0); fileDownload.Read(&u1, sizeof(uploadsrec)); u1.numbytes = session()->numf; u1.daten = static_cast<uint32_t>(tCurrentDate); FileAreaSetRecord(fileDownload, 0); fileDownload.Write(&u1, sizeof(uploadsrec)); fileDownload.Close(); modify_database(u.filename, true); session()->user()->SetUploadK(session()->user()->GetUploadK() + bytes_to_k(u.numbytes)); WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementNumUploadsToday(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeUpload); session()->status_manager()->CommitTransaction(pStatus); sysoplog() << StringPrintf("+ \"%s\" uploaded on %s", u.filename, session()->directories[dn].name); return 0; // This means success }
void logoff() { mailrec m; if (incom) { play_sdf(LOGOFF_NOEXT, false); } if (session()->usernum > 0) { if ((incom || sysop1()) && session()->user()->GetSl() < 255) { broadcast(StringPrintf("%s Just logged off!", session()->user()->GetName())); } } setiia(90); session()->remoteIO()->disconnect(); hangup = true; if (session()->usernum < 1) { return; } string text = " Logged Off At "; text += times(); if (session()->GetEffectiveSl() != 255 || incom) { sysoplog(false) << ""; sysoplog(false) << stripcolors(text); } session()->user()->SetLastBaudRate(modem_speed); // put this back here where it belongs... (not sure why it te session()->user()->SetLastOn(g_szLastLoginDate); session()->user()->SetNumIllegalLogons(0); if ((timer() - timeon) < -30) { timeon -= SECONDS_PER_DAY; } auto dTimeOnNow = timer() - timeon; session()->user()->SetTimeOn(session()->user()->GetTimeOn() + static_cast<float>(dTimeOnNow)); session()->user()->SetTimeOnToday(session()->user()->GetTimeOnToday() + static_cast<float>(dTimeOnNow - extratimecall)); { WStatus* pStatus = session()->status_manager()->BeginTransaction(); int nActiveToday = pStatus->GetMinutesActiveToday(); pStatus->SetMinutesActiveToday(nActiveToday + static_cast<uint16_t>(dTimeOnNow / MINUTES_PER_HOUR)); session()->status_manager()->CommitTransaction(pStatus); } if (g_flags & g_flag_scanned_files) { session()->user()->SetNewScanDateNumber(session()->user()->GetLastOnDateNumber()); } time_t lTime = time(nullptr); session()->user()->SetLastOnDateNumber(lTime); sysoplog(false) << "Read: " << session()->GetNumMessagesReadThisLogon() << " Time on: " << (timer() - timeon) / MINUTES_PER_HOUR; { unique_ptr<File> pFileEmail(OpenEmailFile(true)); if (pFileEmail->IsOpen()) { session()->user()->SetNumMailWaiting(0); int t = static_cast<int>(pFileEmail->GetLength() / sizeof(mailrec)); int r = 0; int w = 0; while (r < t) { pFileEmail->Seek(static_cast<long>(sizeof(mailrec)) * static_cast<long>(r), File::seekBegin); pFileEmail->Read(&m, sizeof(mailrec)); if (m.tosys != 0 || m.touser != 0) { if (m.tosys == 0 && m.touser == session()->usernum) { if (session()->user()->GetNumMailWaiting() != 255) { session()->user()->SetNumMailWaiting(session()->user()->GetNumMailWaiting() + 1); } } if (r != w) { pFileEmail->Seek(static_cast<long>(sizeof(mailrec)) * static_cast<long>(w), File::seekBegin); pFileEmail->Write(&m, sizeof(mailrec)); } ++w; } ++r; } if (r != w) { m.tosys = 0; m.touser = 0; for (int w1 = w; w1 < r; w1++) { pFileEmail->Seek(static_cast<long>(sizeof(mailrec)) * static_cast<long>(w1), File::seekBegin); pFileEmail->Write(&m, sizeof(mailrec)); } } pFileEmail->SetLength(static_cast<long>(sizeof(mailrec)) * static_cast<long>(w)); WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeEmail); session()->status_manager()->CommitTransaction(pStatus); pFileEmail->Close(); } } if (smwcheck) { File smwFile(session()->config()->datadir(), SMW_DAT); if (smwFile.Open(File::modeReadWrite | File::modeBinary | File::modeCreateFile)) { int t = static_cast<int>(smwFile.GetLength() / sizeof(shortmsgrec)); int r = 0; int w = 0; while (r < t) { shortmsgrec sm; smwFile.Seek(r * sizeof(shortmsgrec), File::seekBegin); smwFile.Read(&sm, sizeof(shortmsgrec)); if (sm.tosys != 0 || sm.touser != 0) { if (sm.tosys == 0 && sm.touser == session()->usernum) { session()->user()->SetStatusFlag(User::SMW); } if (r != w) { smwFile.Seek(w * sizeof(shortmsgrec), File::seekBegin); smwFile.Write(&sm, sizeof(shortmsgrec)); } ++w; } ++r; } smwFile.SetLength(w * sizeof(shortmsgrec)); smwFile.Close(); } } session()->WriteCurrentUser(); write_qscn(session()->usernum, qsc, false); remove_from_temp("*.*", session()->temp_directory(), false); remove_from_temp("*.*", session()->batch_directory(), false); if (!session()->batch().entry.empty() && (session()->batch().entry.size() != session()->batch().numbatchdl())) { for (const auto& b : session()->batch().entry) { if (!b.sending) { didnt_upload(b); } } } session()->batch().clear(); }
bool fill_sec(int sn) { int nf = 0, i, i1, n1; char s[81], s1[81]; WFindFile fnd; bool bFound = false; gfilerec *g = read_sec(sn, &n1); string gfilesdir = session()->config()->gfilesdir(); sprintf(s1, "%s%s%c*.*", gfilesdir.c_str(), session()->gfilesec[sn].filename, File::pathSeparatorChar); bFound = fnd.open(s1, 0); bool ok = true; int chd = 0; while ((bFound) && (!hangup) && (nf < session()->gfilesec[sn].maxfiles) && (ok)) { if (fnd.GetFileName()[0] == '.') { bFound = fnd.next(); continue; } strcpy(s, fnd.GetFileName()); align(s); i = 1; for (i1 = 0; i1 < nf; i1++) { if (compare(fnd.GetFileName(), g[i1].filename)) { i = 0; } } if (i) { bout << "|#2" << s << " : "; inputl(s1, 60); if (s1[0]) { chd = 1; i = 0; while (wwiv::strings::StringCompare(s1, g[i].description) > 0 && i < nf) { ++i; } for (i1 = nf; i1 > i; i1--) { g[i1] = g[i1 - 1]; } ++nf; gfilerec g1; strcpy(g1.filename, fnd.GetFileName()); strcpy(g1.description, s1); g1.daten = static_cast<long>(time(nullptr)); g[i] = g1; } else { ok = false; } } bFound = fnd.next(); } if (!ok) { bout << "|#6Aborted.\r\n"; } if (nf >= session()->gfilesec[sn].maxfiles) { bout << "Section full.\r\n"; } if (chd) { string file_name = StrCat(syscfg.datadir, session()->gfilesec[sn].filename, ".gfl"); File gflFile(file_name); gflFile.Open(File::modeReadWrite | File::modeBinary | File::modeCreateFile | File::modeTruncate); gflFile.Write(g, nf * sizeof(gfilerec)); gflFile.Close(); WStatus *pStatus = session()->status_manager()->BeginTransaction(); pStatus->SetGFileDate(date()); session()->status_manager()->CommitTransaction(pStatus); } free(g); return !ok; }
void post() { if (!iscan(session()->GetCurrentMessageArea())) { bout << "\r\n|#6A file required is in use by another instance. Try again later.\r\n"; return; } if (session()->GetCurrentReadMessageArea() < 0) { bout << "\r\nNo subs available.\r\n\n"; return; } if (freek1(syscfg.msgsdir) < 10) { bout << "\r\nSorry, not enough disk space left.\r\n\n"; return; } if (session()->user()->IsRestrictionPost() || session()->user()->GetNumPostsToday() >= getslrec(session()->GetEffectiveSl()).posts) { bout << "\r\nToo many messages posted today.\r\n\n"; return; } if (session()->GetEffectiveSl() < session()->current_sub().postsl) { bout << "\r\nYou can't post here.\r\n\n"; return; } MessageEditorData data; messagerec m; m.storage_type = static_cast<unsigned char>(session()->current_sub().storage_type); data.anonymous_flag = session()->subboards[ session()->GetCurrentReadMessageArea() ].anony & 0x0f; if (data.anonymous_flag == 0 && getslrec(session()->GetEffectiveSl()).ability & ability_post_anony) { data.anonymous_flag = anony_enable_anony; } if (data.anonymous_flag == anony_enable_anony && session()->user()->IsRestrictionAnonymous()) { data.anonymous_flag = 0; } if (!session()->xsubs[ session()->GetCurrentReadMessageArea() ].nets.empty()) { data.anonymous_flag &= (anony_real_name); if (session()->user()->IsRestrictionNet()) { bout << "\r\nYou can't post on networked sub-boards.\r\n\n"; return; } if (net_sysnum) { bout << "\r\nThis post will go out on "; for (size_t i = 0; i < session()->xsubs[ session()->GetCurrentReadMessageArea() ].nets.size(); i++) { if (i) { bout << ", "; } bout << session()->net_networks[session()->current_xsub().nets[i].net_num].name; } bout << ".\r\n\n"; } } time_t lStartTime = time(nullptr); write_inst(INST_LOC_POST, session()->GetCurrentReadMessageArea(), INST_FLAGS_NONE); data.fsed_flags = INMSG_FSED; data.msged_flags = (session()->current_sub().anony & anony_no_tag) ? MSGED_FLAG_NO_TAGLINE : MSGED_FLAG_NONE; data.aux = session()->current_sub().filename; data.to_name = session()->current_sub().name; data.need_title = true; if (!inmsg(data)) { m.stored_as = 0xffffffff; return; } savefile(data.text, &m, data.aux); postrec p{}; memset(&p, 0, sizeof(postrec)); strcpy(p.title, data.title.c_str()); p.anony = static_cast<unsigned char>(data.anonymous_flag); p.msg = m; p.ownersys = 0; p.owneruser = static_cast<uint16_t>(session()->usernum); WStatus* pStatus = session()->status_manager()->BeginTransaction(); p.qscan = pStatus->IncrementQScanPointer(); session()->status_manager()->CommitTransaction(pStatus); p.daten = static_cast<uint32_t>(time(nullptr)); p.status = 0; if (session()->user()->IsRestrictionValidate()) { p.status |= status_unvalidated; } open_sub(true); if ((!session()->current_xsub().nets.empty()) && (session()->current_sub().anony & anony_val_net) && (!lcs() || irt[0])) { p.status |= status_pending_net; int dm = 1; for (int i = session()->GetNumMessagesInCurrentMessageArea(); (i >= 1) && (i > (session()->GetNumMessagesInCurrentMessageArea() - 28)); i--) { if (get_post(i)->status & status_pending_net) { dm = 0; break; } } if (dm) { ssm(1, 0, "Unvalidated net posts on %s.", session()->current_sub().name); } } if (session()->GetNumMessagesInCurrentMessageArea() >= session()->current_sub().maxmsgs) { int i = 1; int dm = 0; while (i <= session()->GetNumMessagesInCurrentMessageArea()) { postrec* pp = get_post(i); if (!pp) { break; } else if (((pp->status & status_no_delete) == 0) || (pp->msg.storage_type != session()->current_sub().storage_type)) { dm = i; break; } ++i; } if (dm == 0) { dm = 1; } delete_message(dm); } add_post(&p); session()->user()->SetNumMessagesPosted(session()->user()->GetNumMessagesPosted() + 1); session()->user()->SetNumPostsToday(session()->user()->GetNumPostsToday() + 1); pStatus = session()->status_manager()->BeginTransaction(); pStatus->IncrementNumMessagesPostedToday(); pStatus->IncrementNumLocalPosts(); if (session()->HasConfigFlag(OP_FLAGS_POSTTIME_COMPENSATE)) { time_t lEndTime = time(nullptr); if (lStartTime > lEndTime) { lEndTime += HOURS_PER_DAY * SECONDS_PER_DAY; } lStartTime = static_cast<long>(lEndTime - lStartTime); if ((lStartTime / MINUTES_PER_HOUR_FLOAT) > getslrec(session()->GetEffectiveSl()).time_per_logon) { lStartTime = static_cast<long>(static_cast<float>(getslrec(session()->GetEffectiveSl()).time_per_logon * MINUTES_PER_HOUR_FLOAT)); } session()->user()->SetExtraTime(session()->user()->GetExtraTime() + static_cast<float> (lStartTime)); } session()->status_manager()->CommitTransaction(pStatus); close_sub(); session()->UpdateTopScreen(); sysoplogf("+ \"%s\" posted on %s", p.title, session()->current_sub().name); bout << "Posted on " << session()->current_sub().name << wwiv::endl; if (!session()->current_xsub().nets.empty()) { session()->user()->SetNumNetPosts(session()->user()->GetNumNetPosts() + 1); if (!(p.status & status_pending_net)) { send_net_post(&p, session()->current_sub().filename, session()->GetCurrentReadMessageArea()); } } }
void uploaded(char *pszFileName, long lCharsPerSecond) { uploadsrec u; for (int i1 = 0; i1 < GetSession()->numbatch; i1++) { if (wwiv::strings::IsEquals(pszFileName, batch[i1].filename) && !batch[i1].sending) { dliscan1(batch[i1].dir); int nRecNum = recno(batch[i1].filename); if (nRecNum > 0) { WFile downFile(g_szDownloadFileName); downFile.Open(WFile::modeBinary | WFile::modeCreateFile | WFile::modeReadWrite, WFile::shareUnknown, WFile::permReadWrite); do { FileAreaSetRecord(downFile, nRecNum); downFile.Read(&u, sizeof(uploadsrec)); if (u.numbytes != 0) { nRecNum = nrecno(batch[i1].filename, nRecNum); } } while (nRecNum != -1 && u.numbytes != 0); downFile.Close(); if (nRecNum != -1 && u.numbytes == 0) { char szSourceFileName[MAX_PATH], szDestFileName[MAX_PATH]; sprintf(szSourceFileName, "%s%s", syscfgovr.batchdir, pszFileName); sprintf(szDestFileName, "%s%s", directories[batch[i1].dir].path, pszFileName); if (!wwiv::strings::IsEquals(szSourceFileName, szDestFileName) && WFile::Exists(szSourceFileName)) { bool found = false; if (szSourceFileName[1] != ':' && szDestFileName[1] != ':') { found = true; } if (szSourceFileName[1] == ':' && szDestFileName[1] == ':' && szSourceFileName[0] == szDestFileName[0]) { found = true; } if (found) { WFile::Rename(szSourceFileName, szDestFileName); WFile::Remove(szSourceFileName); } else { copyfile(szSourceFileName, szDestFileName, false); WFile::Remove(szSourceFileName); } } WFile file(szDestFileName); if (file.Open(WFile::modeBinary | WFile::modeReadOnly)) { if (syscfg.upload_c[0]) { file.Close(); if (!check_ul_event(batch[i1].dir, &u)) { didnt_upload(i1); } else { file.Open(WFile::modeBinary | WFile::modeReadOnly); } } if (file.IsOpen()) { u.numbytes = file.GetLength(); file.Close(); get_file_idz(&u, batch[i1].dir); GetSession()->GetCurrentUser()->SetFilesUploaded(GetSession()->GetCurrentUser()->GetFilesUploaded() + 1); modify_database(u.filename, true); GetSession()->GetCurrentUser()->SetUploadK(GetSession()->GetCurrentUser()->GetUploadK() + static_cast<int>(bytes_to_k(u.numbytes))); WStatus *pStatus = GetApplication()->GetStatusManager()->BeginTransaction(); pStatus->IncrementNumUploadsToday(); pStatus->IncrementFileChangedFlag(WStatus::fileChangeUpload); GetApplication()->GetStatusManager()->CommitTransaction(pStatus); WFile fileDn(g_szDownloadFileName); fileDn.Open(WFile::modeBinary | WFile::modeCreateFile | WFile::modeReadWrite, WFile::shareUnknown, WFile::permReadWrite); FileAreaSetRecord(fileDn, nRecNum); fileDn.Write(&u, sizeof(uploadsrec)); fileDn.Close(); sysoplogf("+ \"%s\" uploaded on %s (%ld cps)", u.filename, directories[batch[i1].dir].name, lCharsPerSecond); GetSession()->bout << "Uploaded '" << u.filename << "' to " << directories[batch[i1].dir].name << " (" << lCharsPerSecond << " cps)" << wwiv::endl; } } delbatch(i1); return; } } delbatch(i1); if (try_to_ul(pszFileName)) { sysoplogf("!!! Couldn't find file \"%s\" in directory.", pszFileName); GetSession()->bout << "Deleting - couldn't find data for file " << pszFileName << wwiv::endl; } return; } } if (try_to_ul(pszFileName)) { sysoplogf("!!! Couldn't find \"%s\" in UL batch queue.", pszFileName); GetSession()->bout << "Deleting - don't know what to do with file " << pszFileName << wwiv::endl; WFile::Remove(syscfgovr.batchdir, pszFileName); } }