mysticbbs/mystic/mis_common.pas

237 lines
6.7 KiB
ObjectPascal

// ====================================================================
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.
//
// Mystic BBS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Mystic BBS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Mystic BBS. If not, see <http://www.gnu.org/licenses/>.
//
// ====================================================================
Unit MIS_Common;
{$I M_OPS.PAS}
Interface
Uses
m_Output,
// m_Term_Ansi,
BBS_Records,
BBS_DataBase;
Var
TempPath : String;
// Term : TTermAnsi;
Function SearchForUser (UN: String; Var Rec: RecUser; Var RecPos: LongInt; Email: String) : Boolean;
Function CheckAccess (User: RecUser; IgnoreGroup: Boolean; Str: String) : Boolean;
Function GetSecurityLevel (Level: Byte; SecLevel: RecSecurity) : Boolean;
Implementation
Uses
m_FileIO,
m_DateTime,
m_Strings;
Function SearchForUser (UN: String; Var Rec: RecUser; Var RecPos: LongInt; Email: String) : Boolean;
Var
UserFile : TFileBuffer;
Begin
Result := False;
UN := strUpper(UN);
If UN = '' Then Exit;
UserFile := TFileBuffer.Create (8 * 1024);
If UserFile.OpenStream (bbsCfg.DataPath + 'users.dat', SizeOf(RecUser), fmOpen, fmRWDN) Then
While Not UserFile.EOF Do Begin
UserFile.ReadRecord (Rec);
If Rec.Flags AND UserDeleted <> 0 Then Continue;
If (UN = strUpper(Rec.RealName)) or (UN = strUpper(Rec.Handle)) or (((strUpper(Email) = strUpper(Rec.Email)) and (Email <> ''))) Then Begin
RecPos := UserFile.FilePosRecord;
Result := True;
Break;
End;
End;
UserFile.Free;
End;
Function CheckAccess (User: RecUser; IgnoreGroup: Boolean; Str: String) : Boolean;
Const
OpCmds = ['%', '^', '(', ')', '&', '!', '|'];
AcsCmds = ['A', 'D', 'E', 'F', 'G', 'H', 'M', 'N', 'O', 'S', 'T', 'U', 'W', 'Z'];
Var
Key : Char;
Data : String;
Check : Boolean;
Out : String;
First : Boolean;
Procedure CheckCommand;
Var
Res : Boolean;
Begin
Res := False;
Case Key of
'A' : Res := True;
'D' : Res := (Ord(Data[1]) - 64) in User.AF2;
'E' : Case Data[1] of
'1' : Res := True;
'0' : Res := True;
End;
'F' : Res := (Ord(Data[1]) - 64) in User.AF1;
'G' : If IgnoreGroup Then Begin
First := True;
Check := False;
Data := '';
Exit;
End Else
Res := User.LastMGroup = strS2I(Data);
'H' : Res := strS2I(Data) < strS2I(Copy(TimeDos2Str(CurDateDos, 0), 1, 2));
'M' : Res := strS2I(Data) < strS2I(Copy(TimeDos2Str(CurDateDos, 0), 4, 2));
'N' : Res := True;
'O' : Case Data[1] of
'A' : Res := True;
'I' : Res := True;
'K' : Res := True;
'P' : If (User.Calls > 0) And (User.Flags AND UserNoRatio = 0) Then Begin
//Temp1 := Round(Security.PCRatio / 100 * 100);
//Temp2 := Round(User.ThisUser.Posts / User.ThisUser.Calls * 100);
//Res := (Temp2 >= Temp1);
Res := True;
End Else
Res := True;
End;
'S' : Res := User.Security >= strS2I(Data);
'T' : Res := True;
'U' : Res := User.PermIdx = strS2I(Data);
'W' : Res := strS2I(Data) = m_DateTime.DayOfWeek(CurDateDos);
'Z' : If IgnoreGroup Then Begin
Check := False;
First := True;
Data := '';
Exit;
End Else
Res := strS2I(Data) = User.LastFGroup;
End;
If Res Then Out := Out + '^' Else Out := Out + '%';
Check := False;
First := True;
Data := '';
End;
Var
A : Byte;
Paran1 : Byte;
Paran2 : Byte;
Ch1 : Char;
Ch2 : Char;
S1 : String;
Begin
Data := '';
Out := '';
Check := False;
Str := strUpper(Str);
First := True;
For A := 1 to Length(Str) Do
If Str[A] in OpCmds Then Begin
If Check Then CheckCommand;
Out := Out + Str[A];
End Else
If (Str[A] in AcsCmds) and (First or Check) Then Begin
If Check Then CheckCommand;
Key := Str[A];
If First Then First := False;
End Else Begin
Data := Data + Str[A];
Check := True;
If A = Length(Str) Then CheckCommand;
End;
Out := '(' + Out + ')';
While Pos('&', Out) <> 0 Do Delete (Out, Pos('&', Out), 1);
While Pos('(', Out) <> 0 Do Begin
Paran2 := 1;
While ((Out[Paran2] <> ')') And (Paran2 <= Length(Out))) Do Begin
If (Out[Paran2] = '(') Then Paran1 := Paran2;
Inc (Paran2);
End;
S1 := Copy(Out, Paran1 + 1, (Paran2 - Paran1) - 1);
While Pos('!', S1) <> 0 Do Begin
A := Pos('!', S1) + 1;
If S1[A] = '^' Then S1[A] := '%' Else
If S1[A] = '%' Then S1[A] := '^';
Delete (S1, A - 1, 1);
End;
While Pos('|', S1) <> 0 Do Begin
A := Pos('|', S1) - 1;
Ch1 := S1[A];
Ch2 := S1[A + 2];
If (Ch1 in ['%', '^']) and (Ch2 in ['%', '^']) Then Begin
Delete (S1, A, 3);
If (Ch1 = '^') or (Ch2 = '^') Then
Insert ('^', S1, A)
Else
Insert ('%', S1, A)
End Else
Delete (S1, A + 1, 1);
End;
While Pos('%%', S1) <> 0 Do Delete (S1, Pos('%%', S1), 1);
While Pos('^^', S1) <> 0 Do Delete (S1, Pos('^^', S1), 1);
While Pos('%^', S1) <> 0 Do Delete (S1, Pos('%^', S1) + 1, 1);
While Pos('^%', S1) <> 0 Do Delete (S1, Pos('^%', S1), 1);
Delete (Out, Paran1, (Paran2 - Paran1) + 1);
Insert (S1, Out, Paran1);
End;
Result := Pos('%', Out) = 0;
End;
Function GetSecurityLevel (Level: Byte; SecLevel: RecSecurity) : Boolean;
Var
SecLevelFile : File of RecSecurity;
Begin
Result := False;
Assign (SecLevelFile, bbsCfg.DataPath + 'security.dat');
If Not ioReset (SecLevelFile, SizeOf(SecLevel), fmRWDN) Then Exit;
ioSeek (SecLevelFile, Level - 1);
ioRead (SecLevelFile, SecLevel);
Close (SecLevelFile);
Result := True;
End;
End.