Unit bbs_cfg_SecLevel;

{$I M_OPS.PAS}

Interface

Function Configuration_SecurityEditor (Edit: Boolean) : LongInt;

Implementation

Uses
  m_Strings,
  m_FileIO,
  bbs_Common,
  bbs_Ansi_MenuBox,
  bbs_Ansi_MenuForm,
  bbs_Cfg_Common;

Procedure EditLevel (Var Sec: RecSecurity);
Var
  Box   : TAnsiMenuBox;
  Form  : TAnsiMenuForm;
  Topic : String;
Begin
  Topic := '|03(|09Security|03) |01-|09> |15';

  Box  := TAnsiMenuBox.Create;
  Form := TAnsiMenuForm.Create;

  Box.Open (12, 5, 68, 21);

  VerticalLine (35, 6, 20);

  Form.AddStr  ('D', ' Description '        , 22,  6, 37,  6, 13, 30, 30, @Sec.Desc, Topic + 'Description of security level');
  Form.AddWord ('T', ' Time Per Day '       , 21,  7, 37,  7, 14,  4,  0, 1440, @Sec.Time, Topic + 'Minutes per day');
  Form.AddWord ('C', ' Calls Per Day '      , 20,  8, 37,  8, 15,  5,  0, 65000, @Sec.MaxCalls, Topic + 'Maximum calls allowed per day');
  Form.AddWord ('P', ' Post/Call Ratio '    , 18,  9, 37,  9, 17,  5,  0, 65000, @Sec.PCRatio, Topic + 'Must post X messages per 100 calls');
  Form.AddWord ('E', ' Download Per Day '   , 17, 10, 37, 10, 18,  5,  0, 65000, @Sec.MaxDLs, Topic + 'Maximum downloads allowed per day');
  Form.AddLong ('K', ' Download KB Per Day ', 14, 11, 37, 11, 21,  7,  0, 9999999, @Sec.MaxDLk, Topic + 'Maximum downloaded kilobytes per day');
  Form.AddByte ('U', ' UL/DL Ratio '        , 22, 12, 37, 12, 13,  3,  0, 255, @Sec.DLRatio, Topic + 'Must upload 1 file for every X downloaded');
  Form.AddWord ('B', ' UL/DL KB Ratio '     , 19, 13, 37, 13, 16,  5,  0, 65000, @Sec.DLKRatio, Topic + 'Must upload 1KB for every X downloaded');
  Form.AddWord ('M', ' Max Time in Bank '   , 17, 14, 37, 14, 18,  5,  0, 65000, @Sec.MaxTB, Topic + 'Maximum minutes allowed in time bank');
  Form.AddStr  ('S', ' Start Menu '         , 23, 15, 37, 15, 12, 20, 20, @Sec.StartMenu, Topic + 'Menu name to load first when user logs in');
  Form.AddWord ('X', ' Expires '            , 26, 16, 37, 16,  9,  4,  0, 9999, @Sec.Expires, Topic + 'Number of days before level expires');
  Form.AddByte ('O', ' Expires To '         , 23, 17, 37, 17, 12,  3,  0, 255, @Sec.ExpiresTo, Topic + 'Security level to expire to');
  Form.AddFlag ('1', ' Access Flags 1 '     , 19, 18, 37, 18, 16, @Sec.AF1, Topic + 'Access flags: Set 1');
  Form.AddFlag ('2', ' Access Flags 2 '     , 19, 19, 37, 19, 16, @Sec.AF2, Topic + 'Access flags: Set 2');
  Form.AddBol  ('H', ' Hard Flag Upgrade '  , 16, 20, 37, 20, 19, 3, @Sec.Hard, Topic + 'Hard access flag upgrade?');

  Form.Execute;

  Box.Close;

  Box.Free;
  Form.Free;
End;

Function Configuration_SecurityEditor (Edit: Boolean) : LongInt;
Var
  List     : TAnsiMenuList;
  Box      : TAnsiMenuBox;
  HideMode : Boolean;
  SecFile  : File;
  Sec      : RecSecurity;

  Procedure MakeList;
  Var
    Count : LongInt;
  Begin
    List.Clear;

    ioReset(SecFile, SizeOf(RecSecurity), fmReadWrite + fmDenyNone);

    For Count := 1 to 255 Do Begin
      ioRead (SecFile, Sec);

      If Not HideMode Then
        List.Add(strPadR(strI2S(Count), 5, ' ') + Sec.Desc, 0)
      Else
        If Sec.Desc <> '' Then
          List.Add(strPadR(strI2S(Count), 5, ' ') + Sec.Desc, 0);
    End;
  End;

Var
  Count : Byte;
Begin
  HideMode := True;

  Assign (SecFile, Config.DataPath + 'security.dat');

  If Not ioReset(SecFile, SizeOf(RecSecurity), fmReadWrite + fmDenyNone) Then Begin
    ReWrite (SecFile, SizeOf(RecSecurity));
    For Count := 1 to 255 Do ioWrite (SecFile, Sec);
  End;

  Box  := TAnsiMenuBox.Create;
  List := TAnsiMenuList.Create;

  Box.Header    := ' Security Levels ';
  List.LoChars  := #13#27#47;
  List.NoWindow := True;

  Box.Open (21, 5, 59, 21);

  WriteXY (23,  7, 112, 'Lvl  Description');
  WriteXY (22,  8, 112, strRep('�', 37));
  WriteXY (22, 19, 112, strRep('�', 37));
  WriteXY (29, 20, 112, cfgCommandList);

  Repeat
    MakeList;

    If HideMode and (List.ListMax = 0) Then Begin
      HideMode := False;
      MakeList;
    End;

    List.Open (21, 8, 59, 19);
    List.Close;

    Case List.ExitCode of
      '/' : Case GetCommandOption(11, 'H-Toggle Hide|') of
              'H' : HideMode := Not HideMode;
            End;
      #13 : Begin
              Count := strS2I(Copy(List.List[List.Picked]^.Name, 1, 3));

              If Edit Then Begin
                ioSeek (SecFile, Count - 1);
                ioRead (SecFile, Sec);

                EditLevel(Sec);

                ioSeek  (SecFile, Count - 1);
                ioWrite (SecFile, Sec);
              End Else Begin
                Result := Count;
                Break;
              End;
            End;
      #27 : Begin
              Result := -1;
              Break;
            End;
    End;
  Until False;

  Close (SecFile);

  Box.Close;
  Box.Free;
  List.Free;
End;

End.