Пример #1
0
void deluser(int user_number) {
  User user;
  session()->users()->ReadUser(&user, user_number);

  if (!user.IsUserDeleted()) {
    rsm(user_number, &user, false);
    DeleteSmallRecord(user.GetName());
    user.SetInactFlag(User::userDeleted);
    user.SetNumMailWaiting(0);
    session()->users()->WriteUser(&user, user_number);
    unique_ptr<File> pFileEmail(OpenEmailFile(true));
    if (pFileEmail->IsOpen()) {
      long lEmailFileLen = pFileEmail->GetLength() / sizeof(mailrec);
      for (int nMailRecord = 0; nMailRecord < lEmailFileLen; nMailRecord++) {
        mailrec m;

        pFileEmail->Seek(nMailRecord * sizeof(mailrec), File::seekBegin);
        pFileEmail->Read(&m, sizeof(mailrec));
        if ((m.tosys == 0 && m.touser == user_number) ||
            (m.fromsys == 0 && m.fromuser == user_number)) {
          delmail(pFileEmail.get(), nMailRecord);
        }
      }
      pFileEmail->Close();
    }
    File voteFile(session()->config()->datadir(), VOTING_DAT);
    voteFile.Open(File::modeReadWrite | File::modeBinary);
    long nNumVoteRecords = static_cast<int>(voteFile.GetLength() / sizeof(votingrec)) - 1;
    for (long lCurVoteRecord = 0; lCurVoteRecord < 20; lCurVoteRecord++) {
      if (user.GetVote(lCurVoteRecord)) {
        if (lCurVoteRecord <= nNumVoteRecords) {
          votingrec v;
          voting_response vr;

          voteFile.Seek(static_cast<long>(lCurVoteRecord * sizeof(votingrec)), File::seekBegin);
          voteFile.Read(&v, sizeof(votingrec));
          vr = v.responses[ user.GetVote(lCurVoteRecord) - 1 ];
          vr.numresponses--;
          v.responses[ user.GetVote(lCurVoteRecord) - 1 ] = vr;
          voteFile.Seek(static_cast<long>(lCurVoteRecord * sizeof(votingrec)), File::seekBegin);
          voteFile.Write(&v, sizeof(votingrec));
        }
        user.SetVote(lCurVoteRecord, 0);
      }
    }
    voteFile.Close();
    session()->users()->WriteUser(&user, user_number);
    delete_phone_number(user_number, user.GetVoicePhoneNumber());   // dupphone addition
    delete_phone_number(user_number, user.GetDataPhoneNumber());    // dupphone addition
  }
}
Пример #2
0
/**
 * Online User Editor.
 *
 * @param usern User Number to edit
 * @param other UEDIT_NONE, UEDIT_FULLINFO, UEDIT_CLEARSCREEN
 */
void uedit(int usern, int other) {
  char s[81];
  bool bClearScreen = true;
  User user;

  u_qsc = static_cast<uint32_t *>(BbsAllocA(syscfg.qscn_len));

  bool full = (incom) ? false : true;
  if (other & 1) {
    full = false;
  }
  if (other & 2) {
    bClearScreen = false;
  }
  int user_number = usern;
  bool bDoneWithUEdit = false;
  session()->users()->ReadUser(&user, user_number);
  int nNumUserRecords = session()->users()->GetNumberOfUserRecords();
  do {
    session()->users()->ReadUser(&user, user_number);
    read_qscn(user_number, u_qsc, false);
    bool bDoneWithUser = false;
    bool temp_full = false;
    do {
      print_data(user_number, &user, (full || temp_full) ? true : false, bClearScreen);
      bout.nl();
      bout << "|#9(|#2Q|#9=|#1Quit, |#2?|#9=|#1Help|#9) User Editor Command: ";
      char ch = 0;
      if (session()->user()->GetSl() == 255 || session()->GetWfcStatus()) {
        ch = onek("ACDEFGHILMNOPQRSTUWXYZ0123456789[]{}/,.?~%:", true);
      } else {
        ch = onek("ACDEFGHILMNOPQRSTUWYZ0123456789[]{}/,.?%", true);
      }
      switch (ch) {
      case 'A': {
        bout.nl();
        bout << "|#7Toggle which AR? ";
        char ch1 = onek("\rABCDEFGHIJKLMNOP");
        if (ch1 != RETURN) {
          ch1 -= 'A';
          if (session()->GetWfcStatus() || (session()->user()->HasArFlag(1 << ch1))) {
            user.ToggleArFlag(1 << ch1);
            session()->users()->WriteUser(&user, user_number);
          }
        }
      }
      break;
      case 'C':
        bout.nl();
        bout << "|#7New callsign? ";
        input(s, 6);
        if (s[0]) {
          user.SetCallsign(s);
          session()->users()->WriteUser(&user, user_number);
        } else {
          bout << "|#5Delete callsign? ";
          if (yesno()) {
            user.SetCallsign("");
            session()->users()->WriteUser(&user, user_number);
          }
        }
        break;
      case 'D':
        if (user_number != 1) {
          if (!user.IsUserDeleted() && session()->GetEffectiveSl() > user.GetSl()) {
            bout << "|#5Delete? ";
            if (yesno()) {
              deluser(user_number);
              session()->users()->ReadUser(&user, user_number);
            }
          }
        }
        break;
      case 'E': {
        bout.nl();
        bout << "|#7New Exemption? ";
        input(s, 3);
        int nExemption = atoi(s);
        if (nExemption >= 0 && nExemption <= 255 && s[0]) {
          user.SetExempt(nExemption);
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case 'F': {
        int network_number = getnetnum("FILEnet");
        session()->set_net_num(network_number);
        if (network_number != -1) {
          set_net_num(session()->net_num());
          bout << "Current Internet Address\r\n:" << user.GetEmailAddress() << wwiv::endl;
          bout << "New Address\r\n:";
          inputl(s, 75);
          if (s[0] != '\0') {
            if (check_inet_addr(s)) {
              user.SetEmailAddress(s);
              write_inet_addr(s, user_number);
              user.SetForwardNetNumber(session()->net_num());
            } else {
              bout.nl();
              bout << "Invalid format.\r\n";
            }
          } else {
            bout.nl();
            bout << "|#5Remove current address? ";
            if (yesno()) {
              user.SetEmailAddress("");
            }
          }
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case 'G':
        bout << "|#5Are you sure you want to re-enter the birthday? ";
        if (yesno()) {
          bout.nl();
          bout.bprintf("Current birthdate: %02d/%02d/%02d\r\n",
                                            user.GetBirthdayMonth(), user.GetBirthdayDay(), user.GetBirthdayYear());
          input_age(&user);
          session()->users()->WriteUser(&user, user_number);
        }
        break;
      case 'H':
        bout << "|#5Change this user's password? ";
        if (yesno()) {
          input_pw(&user);
          session()->users()->WriteUser(&user, user_number);
        }
        break;
      case 'I': {
        bout.nl();
        bout << "|#7Toggle which DAR? ";
        char ch1 = onek("\rABCDEFGHIJKLMNOP");
        if (ch1 != RETURN) {
          ch1 -= 'A';
          if (session()->GetWfcStatus() || (session()->user()->HasDarFlag(1 << ch1))) {
            user.ToggleDarFlag(1 << ch1);
            session()->users()->WriteUser(&user, user_number);
          }
        }
      }
      break;
      case 'L': {
        bout.nl();
        bout << "|#7New FULL real name? ";
        string realName = Input1(user.GetRealName(), 20, true, InputMode::PROPER);
        if (!realName.empty()) {
          user.SetRealName(realName.c_str());
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case 'M': {
        int nNumCompTypes = 0;
        bout.nl();
        bout << "Known computer types:\r\n\n";
        for (int nCurCompType = 0; !ctypes(nCurCompType).empty(); nCurCompType++) {
          bout << nCurCompType << ". " << ctypes(nCurCompType) << wwiv::endl;
          nNumCompTypes++;
        }
        bout.nl();
        bout << "|#7Enter new computer type: ";
        input(s, 2);
        int nComputerType = atoi(s);
        if (nComputerType >= 0 && nComputerType <= nNumCompTypes) {
          user.SetComputerType(nComputerType);
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case 'N':
        bout.nl();
        bout << "|#7New name? ";
        input(s, 30);
        if (s[0]) {
          if (finduser(s) < 1) {
            DeleteSmallRecord(user.GetName());
            user.SetName(s);
            InsertSmallRecord(user_number, user.GetName());
            session()->users()->WriteUser(&user, user_number);
          }
        }
        break;
      case 'O':
        bout.nl();
        bout << "|#7New note? ";
        inputl(s, 60);
        user.SetNote(s);
        session()->users()->WriteUser(&user, user_number);
        break;

      case 'P': {
        bool bWriteUser = false;
        bout.nl();
        bout << "|#7New phone number? ";
        string phoneNumber = Input1(user.GetVoicePhoneNumber(), 12, true, InputMode::PHONE);
        if (!phoneNumber.empty()) {
          if (phoneNumber != user.GetVoicePhoneNumber()) {
            delete_phone_number(user_number, user.GetVoicePhoneNumber());
            add_phone_number(user_number, phoneNumber.c_str());
          }
          user.SetVoicePhoneNumber(phoneNumber.c_str());
          bWriteUser = true;
        }
        bout.nl();
        bout << "|#7New DataPhone (0=none)? ";
        phoneNumber = Input1(user.GetDataPhoneNumber(), 12, true, InputMode::PHONE);
        if (!phoneNumber.empty()) {
          if (phoneNumber[0] == '0') {
            user.SetDataPhoneNumber("");
          } else {
            if (phoneNumber != user.GetDataPhoneNumber()) {
              delete_phone_number(user_number, user.GetDataPhoneNumber());
              add_phone_number(user_number, phoneNumber.c_str());
            }
            user.SetDataPhoneNumber(phoneNumber.c_str());
          }
          bWriteUser = true;
        }
        if (bWriteUser) {
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      break;
      case 'Q':
        bDoneWithUEdit = true;
        bDoneWithUser = true;
        break;
      case 'R':
        if (user.IsUserDeleted()) {
          user.ToggleInactFlag(User::userDeleted);
          InsertSmallRecord(user_number, user.GetName());
          session()->users()->WriteUser(&user, user_number);

          // begin dupphone additions

          if (user.GetVoicePhoneNumber()[0]) {
            add_phone_number(user_number, user.GetVoicePhoneNumber());
          }
          if (user.GetDataPhoneNumber()[0] &&
              !IsEquals(user.GetVoicePhoneNumber(),  user.GetDataPhoneNumber())) {
            add_phone_number(user_number, user.GetDataPhoneNumber());
          }

          // end dupphone additions

        }
        break;
      case 'S': {
        if (user.GetSl() >= session()->GetEffectiveSl()) {
          break;
        }
        bout.nl();
        bout << "|#7New SL? ";
        string sl = input(3);
        uint8_t nNewSL = StringToUnsignedChar(sl);
        if (!session()->GetWfcStatus() && nNewSL >= session()->GetEffectiveSl() && user_number != 1) {
          bout << "|#6You can not assign a Security Level to a user that is higher than your own.\r\n";
          pausescr();
        } else  if (nNewSL < 255 && sl[0]) {
          user.SetSl(nNewSL);
          session()->users()->WriteUser(&user, user_number);
          if (user_number == session()->usernum) {
            session()->SetEffectiveSl(nNewSL);
          }
        }
      }
      break;
      case 'T': {
        if (user.GetDsl() >= session()->user()->GetDsl()) {
          break;
        }
        bout.nl();
        bout << "|#7New DSL? ";
        string dsl = input(3);
        uint8_t nNewDSL = StringToUnsignedChar(dsl);
        if (!session()->GetWfcStatus() && nNewDSL >= session()->user()->GetDsl() && user_number != 1) {
          bout << "|#6You can not assign a Security Level to a user that is higher than your own.\r\n";
          pausescr();
        } else  if (nNewDSL < 255 && dsl[0]) {
          user.SetDsl(nNewDSL);
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case 'U': {
        bout.nl();
        bout << "|#7User name/number: ";
        string name = input(30);
        int nFoundUserNumber = finduser1(name.c_str());
        if (nFoundUserNumber > 0) {
          user_number = nFoundUserNumber;
          bDoneWithUser = true;
        }
      }
      break;
      case 'X': {
        string regDate, expDate;
        if (!session()->HasConfigFlag(OP_FLAGS_USER_REGISTRATION)) {
          break;
        }
        bout.nl();
        if (user.GetRegisteredDateNum() != 0) {
          regDate = daten_to_date(user.GetRegisteredDateNum());
          expDate = daten_to_date(user.GetExpiresDateNum());
          bout << "Registered on " << regDate << ", expires on " << expDate << wwiv::endl;
        } else {
          bout << "Not registered.\r\n";
        }
        string newRegDate;
        do {
          bout.nl();
          bout << "Enter registration date, <CR> for today: \r\n";
          bout << " MM/DD/YY\r\n:";
          newRegDate = input(8);
        } while (newRegDate.length() != 8 && !newRegDate.empty());

        if (newRegDate.empty()) {
          newRegDate = date();
        }

        int m = atoi(newRegDate.c_str());
        int dd = atoi(&(newRegDate[3]));
        if (newRegDate.length() == 8 && m > 0 && m <= 12 && dd > 0 && dd < 32) {
          user.SetRegisteredDateNum(date_to_daten(newRegDate.c_str()));
        } else {
          bout.nl();
        }
        string newExpDate;
        do {
          bout.nl();
          bout << "Enter expiration date, <CR> to clear registration fields: \r\n";
          bout << " MM/DD/YY\r\n:";
          newExpDate = input(8);
        } while (newExpDate.length() != 8 && !newExpDate.empty());
        if (newExpDate.length() == 8) {
          m = atoi(newExpDate.c_str());
          dd = atoi(&(newExpDate[3]));
        } else {
          user.SetRegisteredDateNum(0);
          user.SetExpiresDateNum(0);
        }
        if (newExpDate.length() == 8 && m > 0 && m <= 12 && dd > 0 && dd < 32) {
          user.SetExpiresDateNum(date_to_daten(newExpDate.c_str()));
        }
        session()->users()->WriteUser(&user, user_number);
      }
      break;
      case 'Y':
        if (u_qsc) {
          bout.nl();
          bout << "|#7(999=None) New sysop sub? ";
          string sysopSubNum = input(3);
          int nSysopSubNum = atoi(sysopSubNum.c_str());
          if (nSysopSubNum >= 0 && nSysopSubNum <= 999 && !sysopSubNum.empty()) {
            *u_qsc = nSysopSubNum;
            write_qscn(user_number, u_qsc, false);
          }
        }
        break;
      case 'Z': {
        char ch1;
        bout.nl();
        bout <<  "        " << restrict_string << wwiv::endl;
        do {
          bout << "|#7([Enter]=Quit, ?=Help) Enter Restriction to Toggle? ";
          s[0] = RETURN;
          s[1] = '?';
          strcpy(&(s[2]), restrict_string);
          ch1 = onek(s);
          if (ch1 == SPACE) {
            ch1 = RETURN;
          }
          if (ch1 == '?') {
            bout.cls();
            printfile(SRESTRCT_NOEXT);
          }
          if (ch1 != RETURN && ch1 != '?') {
            int nRestriction = -1;
            for (int i1 = 0; i1 < 16; i1++) {
              if (ch1 == s[i1 + 2]) {
                nRestriction = i1;
              }
            }
            if (nRestriction > -1) {
              user.ToggleRestrictionFlag(1 << nRestriction);
              session()->users()->WriteUser(&user, user_number);
            }
          }
        } while (!hangup && ch1 == '?');
      }
      break;
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
      case '0': {
        int nAutoValNum = 9;
        if (ch != '0') {
          nAutoValNum = ch - '1';
        }
        if ((session()->GetEffectiveSl() >= syscfg.autoval[nAutoValNum].sl) &&
            (session()->user()->GetDsl() >= syscfg.autoval[nAutoValNum].dsl) &&
            (((~session()->user()->GetAr()) & syscfg.autoval[nAutoValNum].ar) == 0) &&
            (((~session()->user()->GetDar()) & syscfg.autoval[nAutoValNum].dar) == 0)) {
          auto_val(nAutoValNum, &user);
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case ']':
        ++user_number;
        if (user_number > nNumUserRecords) {
          user_number = 1;
        }
        bDoneWithUser = true;
        break;
      case '[':
        --user_number;
        if (user_number == 0) {
          user_number = nNumUserRecords;
        }
        bDoneWithUser = true;
        break;
      case '}': {
        int tempu = user_number;
        ++user_number;
        if (user_number > nNumUserRecords) {
          user_number = 1;
        }
        while (user_number != tempu && !matchuser(user_number)) {
          ++user_number;
          if (user_number > nNumUserRecords) {
            user_number = 1;
          }
        }
        bDoneWithUser = true;
      }
      break;
      case '{': {
        int tempu = user_number;
        --user_number;
        if (user_number < 1) {
          user_number = nNumUserRecords;
        }
        while (user_number != tempu && !matchuser(user_number)) {
          --user_number;
          if (user_number < 1) {
            user_number = nNumUserRecords;
          }
        }
        bDoneWithUser = true;
      }
      break;
      case '/':
        changeopt();
        break;
      case ',':
        temp_full = (!temp_full);
        break;
      case '.':
        full = (!full);
        temp_full = full;
        break;
      case '?': {
        bout.cls();
        printfile(SUEDIT_NOEXT);
        bout.getkey();
      }
      break;
      case '~':
        user.SetAssPoints(0);
        session()->users()->WriteUser(&user, user_number);
        break;
      case '%': {
        char s1[ 255];
        bout.nl();
        bout << "|#7New Street Address? ";
        inputl(s1, 30);
        if (s1[0]) {
          user.SetStreet(s1);
          session()->users()->WriteUser(&user, user_number);
        }
        bout << "|#7New City? ";
        inputl(s1, 30);
        if (s1[0]) {
          user.SetCity(s1);
          session()->users()->WriteUser(&user, user_number);
        }
        bout << "|#7New State? ";
        input(s1, 2);
        if (s1[0]) {
          user.SetState(s1);
          session()->users()->WriteUser(&user, user_number);
        }
        bout << "|#7New Country? ";
        input(s1, 3);
        if (s1[0]) {
          user.SetCountry(s1);
          session()->users()->WriteUser(&user, user_number);
        }
        bout << "|#7New Zip? ";
        input(s1, 10);
        if (s1[0]) {
          user.SetZipcode(s1);
          session()->users()->WriteUser(&user, user_number);
        }
        bout << "|#7New DataPhone (0=none)? ";
        input(s1, 12);
        if (s1[0]) {
          user.SetDataPhoneNumber(s1);
          session()->users()->WriteUser(&user, user_number);
        }
      }
      break;
      case ':': {
        bool done2 = false;
        do {
          bout.nl();
          bout << "Zap info...\r\n";
          bout << "1. Realname\r\n";
          bout << "2. Birthday\r\n";
          bout << "3. Street address\r\n";
          bout << "4. City\r\n";
          bout << "5. State\r\n";
          bout << "6. Country\r\n";
          bout << "7. Zip Code\r\n";
          bout << "8. DataPhone\r\n";
          bout << "9. Computer\r\n";
          bout << "Q. Quit\r\n";
          bout << "Which? ";
          char ch1 = onek("Q123456789");
          switch (ch1) {
          case '1':
            user.SetRealName("");
            break;
          case '2':
            user.SetBirthdayYear(0);
            break;
          case '3':
            user.SetStreet("");
            break;
          case '4':
            user.SetCity("");
            break;
          case '5':
            user.SetState("");
            break;
          case '6':
            user.SetCountry("");
            break;
          case '7':
            user.SetZipcode("");
            break;
          case '8':
            user.SetDataPhoneNumber("");
            break;
          case '9':
            // rf-I don't know why this is 254, it was in 4.31
            // but it probably shouldn't be. Changed to 0
            user.SetComputerType(0);
            break;
          case 'Q':
            done2 = true;
            break;
          }
        } while (!done2);
        session()->users()->WriteUser(&user, user_number);
      }
      break;
      }
    } while (!bDoneWithUser && !hangup);
  } while (!bDoneWithUEdit && !hangup);

  if (u_qsc) {
    free(u_qsc);
  }

  u_qsc = nullptr;
}