Beispiel #1
0
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);
  }
}
Beispiel #2
0
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);
  }
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
// 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);
}
Beispiel #6
0
// 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);
}
Beispiel #7
0
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();
}
Beispiel #10
0
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);

}
Beispiel #11
0
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);
        }
      }
    }
  }
}
Beispiel #12
0
/**
 * 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;
}
Beispiel #13
0
/**
 * 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);
}
Beispiel #14
0
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
}
Beispiel #15
0
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();
}
Beispiel #16
0
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());
    }
  }
}
Beispiel #18
0
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);
  }
}