This commit is contained in:
mysticbbs 2013-05-06 13:19:01 -04:00
parent dfdac69030
commit 0eb4d5760f
18 changed files with 390 additions and 126 deletions

View File

@ -582,7 +582,9 @@ Begin
FillChar (Config.NetAddress, SizeOf(Config.NetAddress), #0);
FillChar (Config.NetDesc, SizeOf(Config.NetDesc), #0);
FillChar (Config.NetDomain, SizeOf(Config.NetDomain), #0);
FillChar (Config.NetUplink, SizeOf(Config.NetUplink), 0);
FillChar (Config.NetPrimary, SizeOf(Config.NetPrimary), 0);
Config.NetPrimary[2] := True;
For A := 1 to 20 Do Begin
Config.NetAddress[A].Zone := NetAddress[A].Zone;
@ -635,15 +637,15 @@ Begin
Config.inetFTPDupes := inetFTPDupes;
Config.inetFTPPortMin := inetFTPPortMin;
Config.inetFTPPortMax := inetFTPPortMax;
Config.inetFTPAnon := inetFTPAnon;
Config.inetFTPPassive := False;
Config.inetFTPTimeout := inetFTPTimeout;
{ new in 1.10 a11 }
Config.TemplatePath := SysPath + 'template' + PathChar;
Config.MenuPath := SysPath + 'menus' + PathChar;
Config.TextPath := SysPath + 'text' + PathChar;
Config.WebPath := SysPath + 'http' + PathChar;
Config.OutBoundPath := SysPath + 'echomail' + PathChar + 'out' + PathChar + 'fidonet' + PathChar;
Config.InBoundPath := SysPath + 'echomail' + PathChar + 'in' + PathChar;
Config.PWChange := 0;
Config.LoginAttempts := 3;

View File

@ -675,6 +675,8 @@ Var
Begin
Result := '';
If Not DirExists(Theme.MenuPath) Then Exit;
Box := TAnsiMenuBox.Create;
List := TAnsiMenuList.Create;

View File

@ -111,47 +111,48 @@ Begin
Box.Shadow := False;
Box.Header := ' Index ' + strI2S(MBase.Index) + ' ';
Box.Open (3, 5, 77, 22);
Box.Open (3, 4, 77, 22);
VerticalLine (17, 6, 21);
VerticalLine (66, 6, 21);
VerticalLine (17, 5, 20);
VerticalLine (66, 5, 21);
Form.AddStr ('N', ' Name' , 11, 6, 19, 6, 6, 30, 40, @MBase.Name, Topic + 'Message base description');
Form.AddStr ('W', ' Newsgroup' , 6, 7, 19, 7, 11, 30, 60, @MBase.NewsName, Topic + 'Newsgroup name');
Form.AddStr ('Q', ' QWK Name' , 7, 8, 19, 8, 10, 13, 13, @MBase.QwkName, Topic + 'Qwk Short name');
Form.AddStr ('8', ' Echo Tag' , 7, 9, 19, 9, 10, 30, 40, @MBase.EchoTag, Topic + 'FTN EchoTag');
Form.AddStr ('F', ' File Name' , 6, 10, 19, 10, 11, 30, 40, @MBase.FileName, Topic + 'Message base storage file name');
Form.AddPath ('P', ' Path' , 11, 11, 19, 11, 6, 30, 80, @MBase.Path, Topic + 'Message base storage path');
Form.AddStr ('L', ' List ACS' , 7, 12, 19, 12, 10, 30, 30, @MBase.ListACS, Topic + 'Access required to see in base list');
Form.AddStr ('R', ' Read ACS' , 7, 13, 19, 13, 10, 30, 30, @MBase.ReadACS, Topic + 'Access required to read messages');
Form.AddStr ('C', ' Post ACS' , 7, 14, 19, 14, 10, 30, 30, @MBase.PostACS, Topic + 'Access required to post messages');
Form.AddStr ('Y', ' Sysop ACS' , 6, 15, 19, 15, 11, 30, 30, @MBase.SysopACS, Topic + 'Access required for Sysop access');
Form.AddNone ('D', ' Net Address' , 4, 16, 19, 16, 13, Topic + 'Net/EchoMail Address');
Form.AddNone ('7', ' Export To' , 6, 17, 19, 17, 11, Topic + 'Export messages to these nodes');
Form.AddStr ('I', ' Origin' , 9, 18, 19, 18, 8, 30, 50, @MBase.Origin, Topic + 'Message base origin line');
Form.AddStr ('S', ' Sponsor' , 8, 19, 19, 19, 9, 30, 30, @MBase.Sponsor, Topic + 'User name of base''s sponser');
Form.AddStr ('T', ' R Template' , 5, 20, 19, 20, 12, 20, 20, @MBase.RTemplate, Topic + 'Template for full screen reader');
Form.AddStr ('M', ' L Template' , 5, 21, 19, 21, 12, 20, 20, @MBase.ITemplate, Topic + 'Template for lightbar message list');
Form.AddStr ('N', ' Name' , 11, 5, 19, 5, 6, 30, 40, @MBase.Name, Topic + 'Message base description');
Form.AddStr ('W', ' Newsgroup' , 6, 6, 19, 6, 11, 30, 60, @MBase.NewsName, Topic + 'Newsgroup name');
Form.AddStr ('Q', ' QWK Name' , 7, 7, 19, 7, 10, 13, 13, @MBase.QwkName, Topic + 'Qwk Short name');
Form.AddStr ('8', ' Echo Tag' , 7, 8, 19, 8, 10, 30, 40, @MBase.EchoTag, Topic + 'FTN EchoTag');
Form.AddStr ('F', ' File Name' , 6, 9, 19, 9, 11, 30, 40, @MBase.FileName, Topic + 'Message base storage file name');
Form.AddPath ('P', ' Path' , 11, 10, 19, 10, 6, 30, 80, @MBase.Path, Topic + 'Message base storage path');
Form.AddStr ('L', ' List ACS' , 7, 11, 19, 11, 10, 30, 30, @MBase.ListACS, Topic + 'Access required to see in base list');
Form.AddStr ('R', ' Read ACS' , 7, 12, 19, 12, 10, 30, 30, @MBase.ReadACS, Topic + 'Access required to read messages');
Form.AddStr ('C', ' Post ACS' , 7, 13, 19, 13, 10, 30, 30, @MBase.PostACS, Topic + 'Access required to post messages');
Form.AddStr ('Y', ' Sysop ACS' , 6, 14, 19, 14, 11, 30, 30, @MBase.SysopACS, Topic + 'Access required for Sysop access');
Form.AddNone ('D', ' Net Address' , 4, 15, 19, 15, 13, Topic + 'Net/EchoMail Address');
Form.AddNone ('7', ' Export To' , 6, 16, 19, 16, 11, Topic + 'Export messages to these nodes');
Form.AddStr ('I', ' Origin' , 9, 17, 19, 17, 8, 30, 50, @MBase.Origin, Topic + 'Message base origin line');
Form.AddStr ('S', ' Sponsor' , 8, 18, 19, 18, 9, 30, 30, @MBase.Sponsor, Topic + 'User name of base''s sponser');
Form.AddStr ('T', ' R Template' , 5, 19, 19, 19, 12, 20, 20, @MBase.RTemplate, Topic + 'Template for full screen reader');
Form.AddStr ('M', ' L Template' , 5, 20, 19, 20, 12, 20, 20, @MBase.ITemplate, Topic + 'Template for lightbar message list');
Form.AddAttr ('Q', ' Quote Color' , 53, 6, 68, 6, 13, @MBase.ColQuote, Topic + 'Color for quoted text');
Form.AddAttr ('X', ' Text Color' , 54, 7, 68, 7, 12, @MBase.ColText, Topic + 'Color for message text');
Form.AddAttr ('E', ' Tear Color' , 54, 8, 68, 8, 12, @MBase.ColTear, Topic + 'Color for tear line');
Form.AddAttr ('G', ' Origin Color', 52, 9, 68, 9, 14, @MBase.ColOrigin, Topic + 'Color for origin line');
Form.AddAttr ('K', ' Kludge Color', 52, 10, 68, 10, 14, @MBase.ColKludge, Topic + 'Color for kludge line');
Form.AddWord ('M', ' Max Msgs' , 56, 11, 68, 11, 10, 5, 0, 65535, @MBase.MaxMsgs, Topic + 'Maximum number of message in base');
Form.AddWord ('1', ' Max Msg Age' , 53, 12, 68, 12, 13, 5, 0, 65535, @MBase.MaxAge, Topic + 'Maximum age (days) to keep messages');
Form.AddTog ('2', ' New Scan' , 56, 13, 68, 13, 10, 6, 0, 2, 'No Yes Forced', @MBase.DefNScan, Topic + 'Newscan default for users');
Form.AddTog ('3', ' QWK Scan' , 56, 14, 68, 14, 10, 6, 0, 2, 'No Yes Forced', @MBase.DefQScan, Topic + 'QWKscan default for users');
Form.AddBits ('4', ' Real Names' , 54, 15, 68, 15, 12, MBRealNames, @MBase.Flags, Topic + 'Use real names in this base?');
Form.AddBits ('5', ' Autosigs' , 56, 16, 68, 16, 10, MBAutoSigs, @MBase.Flags, Topic + 'Allow auto signatures in this base?');
Form.AddBits ('6', ' Kill Kludge' , 53, 17, 68, 17, 13, MBKillKludge, @MBase.Flags, Topic + 'Filter out kludge lines');
Form.AddBits ('V', ' Private' , 57, 18, 68, 18, 9, MBPrivate, @MBase.Flags, Topic + 'Is this a private base?');
Form.AddTog ('A', ' Base Type' , 55, 19, 68, 19, 11, 9, 0, 3, 'Local EchoMail Newsgroup Netmail', @MBase.NetType, Topic + 'Message base type');
Form.AddTog ('B', ' Base Format' , 53, 20, 68, 20, 13, 6, 0, 1, 'JAM Squish', @MBase.BaseType, Topic + 'Message base storage format');
Form.AddStr ('H', ' Header' , 58, 21, 68, 21, 8, 9, 20, @MBase.Header, Topic + 'Display file name of msg header');
Form.AddAttr ('Q', ' Quote Color' , 53, 5, 68, 5, 13, @MBase.ColQuote, Topic + 'Color for quoted text');
Form.AddAttr ('X', ' Text Color' , 54, 6, 68, 6, 12, @MBase.ColText, Topic + 'Color for message text');
Form.AddAttr ('E', ' Tear Color' , 54, 7, 68, 7, 12, @MBase.ColTear, Topic + 'Color for tear line');
Form.AddAttr ('G', ' Origin Color', 52, 8, 68, 8, 14, @MBase.ColOrigin, Topic + 'Color for origin line');
Form.AddAttr ('K', ' Kludge Color', 52, 9, 68, 9, 14, @MBase.ColKludge, Topic + 'Color for kludge line');
Form.AddWord ('M', ' Max Msgs' , 56, 10, 68, 10, 10, 5, 0, 65535, @MBase.MaxMsgs, Topic + 'Maximum number of message in base');
Form.AddWord ('1', ' Max Msg Age' , 53, 11, 68, 11, 13, 5, 0, 65535, @MBase.MaxAge, Topic + 'Maximum age (days) to keep messages');
Form.AddTog ('2', ' New Scan' , 56, 12, 68, 12, 10, 6, 0, 2, 'No Yes Forced', @MBase.DefNScan, Topic + 'Newscan default for users');
Form.AddTog ('3', ' QWK Scan' , 56, 13, 68, 13, 10, 6, 0, 2, 'No Yes Forced', @MBase.DefQScan, Topic + 'QWKscan default for users');
Form.AddTog ('A', ' Base Type' , 55, 14, 68, 14, 11, 9, 0, 3, 'Local EchoMail Newsgroup Netmail', @MBase.NetType, Topic + 'Message base type');
Form.AddTog ('B', ' Base Format' , 53, 15, 68, 15, 13, 6, 0, 1, 'JAM Squish', @MBase.BaseType, Topic + 'Message base storage format');
Form.AddStr ('H', ' Header' , 58, 16, 68, 16, 8, 9, 20, @MBase.Header, Topic + 'Display file name of msg header');
Form.AddBits ('4', ' Real Names' , 54, 17, 68, 17, 12, MBRealNames, @MBase.Flags, Topic + 'Use real names in this base?');
Form.AddBits ('5', ' Autosigs' , 56, 18, 68, 18, 10, MBAutoSigs, @MBase.Flags, Topic + 'Allow auto signatures in this base?');
Form.AddBits ('6', ' Kill Kludge' , 53, 19, 68, 19, 13, MBKillKludge, @MBase.Flags, Topic + 'Filter out kludge lines');
Form.AddBits ('V', ' Private' , 57, 20, 68, 20, 9, MBPrivate, @MBase.Flags, Topic + 'Is a private only base?');
Form.AddBits ('9', ' Pvt Reply' , 55, 21, 68, 21, 11, MBPrivReply, @MBase.Flags, Topic + 'Allow private posts in public?');
Repeat
WriteXY (19, 16, 113, strPadR(strAddr2Str(Config.NetAddress[MBase.NetAddr]), 19, ' '));
WriteXY (19, 15, 113, strPadR(strAddr2Str(Config.NetAddress[MBase.NetAddr]), 19, ' '));
Links := FileByteSize(MBase.Path + MBase.FileName + '.lnk');
@ -160,7 +161,7 @@ Begin
Else
Links := 0;
WriteXY (19, 17, 113, strI2S(Links) + ' node(s)');
WriteXY (19, 16, 113, strI2S(Links) + ' node(s)');
Case Form.Execute of
'D' : MBase.NetAddr := Configuration_EchoMailAddress(False);

View File

@ -316,7 +316,7 @@ Begin
Form.AddByte ('D', ' Dupe IP Limit', 32, 13, 49, 13, 15, 3, 2, 255, @Config.inetFTPDupes, Topic + 'Max connections with same IP');
Form.AddWord ('I', ' Data Port Min', 32, 14, 49, 14, 15, 5, 0, 65535, @Config.inetFTPPortMin, Topic + 'Passive port range (minimum)');
Form.AddWord ('A', ' Data Port Max', 32, 15, 49, 15, 15, 5, 0, 65535, @Config.inetFTPPortMax, Topic + 'Passive port range (maximum)');
Form.AddBol ('Y', ' Allow Anonymous', 30, 16, 49, 16, 17, 3, @Config.inetFTPAnon, Topic + 'Allow anonymous users');
Form.AddBol ('Y', ' Allow Passive', 32, 16, 49, 16, 15, 3, @Config.inetFTPPassive, Topic + 'Allow passive data transfers');
Form.Execute;
Form.Free;

View File

@ -187,6 +187,8 @@ End;
Function ShellDOS (ExecPath: String; Command: String) : LongInt;
Begin
Session.SystemLog('DEBUG: In ShellOS for: (' + ExecPath + ') ' + Command);
Session.io.BufFlush;
{$IFDEF WINDOWS}
@ -210,7 +212,11 @@ Begin
Screen.SetRawMode(False);
{$ENDIF}
If ExecPath <> '' Then DirChange(ExecPath);
If ExecPath <> '' Then Begin
Session.SystemLog('DEBUG: ShellOS changing DIR to: ' + ExecPath);
DirChange(ExecPath);
End;
{$IFDEF UNIX}
Result := Shell (Command);
@ -218,8 +224,13 @@ Begin
{$IFDEF WINDOWS}
If Command <> '' Then Command := '/C' + Command;
Session.SystemLog('DEBUG: ShellOS EXEC' + GetEnv('COMSPEC') + ' ' + Command);
Exec (GetEnv('COMSPEC'), Command);
Result := DosExitCode;
Session.SystemLog('DEBUG: ShellOS returned: ' + strI2S(Result));
{$ENDIF}
{$IFDEF UNIX}

View File

@ -43,8 +43,9 @@ Type
Forced : Boolean;
Done : Boolean;
Subject : String;
Template : String;
Constructor Create (Var O: Pointer);
Constructor Create (Var O: Pointer; TemplateFile: String);
Destructor Destroy; Override;
Function IsAnsiLine (Line: LongInt) : Boolean;
@ -90,7 +91,7 @@ Uses
bbs_Common,
bbs_Ansi_MenuBox;
Constructor TEditorANSI.Create (Var O: Pointer);
Constructor TEditorANSI.Create (Var O: Pointer; TemplateFile: String);
Begin
Inherited Create;
@ -116,6 +117,7 @@ Begin
LastLine := 1;
CutPasted := False;
CutTextPos := 0;
Template := TemplateFile;
FillChar (CutText, SizeOf(CutText), 0);
End;
@ -392,10 +394,12 @@ Begin
Session.io.PromptInfo[2] := Subject;
Session.io.OutFile ('ansiedit', True, 0);
Session.io.OutFile (Template, True, 0);
WinX1 := 1;
WinX2 := 79;
// WinX1 := Session.io.ScreenInfo[1].X;
// WinX2 := Session.io.ScreenInfo[2].X;
WinY1 := Session.io.ScreenInfo[1].Y;
WinY2 := Session.io.ScreenInfo[2].Y;

View File

@ -143,7 +143,7 @@ Begin
Res := Pos(UpCase(LineBuf[0]), 'RSZ') > 0;
//Session.SystemLog('DEBUG: DSZ Status character: ' + LineBuf[0]);
// Session.SystemLog('DEBUG: DSZ Status character: ' + LineBuf[0]);
While WordPos < 11 Do Begin
If LineBuf[Count] = #32 Then Begin
@ -185,12 +185,12 @@ Begin
Exit;
End;
//Session.SystemLog('DEBUG: DSZ Searching for: ' + FName);
// Session.SystemLog('DEBUG: DSZ Searching for: ' + FName);
While Not Eof(LogFile) Do Begin
DszGetFile(LogFile, FileName, Status);
//Session.SystemLog('DEBUG: DSZ GetFile returned: ' + FileName + ' (success ' + strI2S(Ord(Status)) + ')');
// Session.SystemLog('DEBUG: DSZ GetFile returned: ' + FileName + ' (success ' + strI2S(Ord(Status)) + ')');
If strUpper(FileName) = strUpper(FName) Then Begin
Result := Status;
@ -303,6 +303,8 @@ Var
If Command = '@ZMODEM8' Then
Protocol := New(ZmodemProtocolPTR, Init(Client, True))
Else Begin
// Session.SystemLog('DEBUG: No internal protocol found');
{$IFDEF UNIX}
Client.Free;
{$ENDIF}
@ -572,6 +574,8 @@ Begin
Else
Command := Protocol.RecvCmd;
// Session.SystemLog('DEBUG: Exec Protocol: ' + Command);
If Command[1] = '@' Then
ExecInternal
Else
@ -764,10 +768,16 @@ Function TFileBase.SendFile (Data: String) : Boolean;
Begin
Result := False;
// Session.SystemLog('DEBUG: In SendFile checking if exists: ' + Data);
If Not FileExist(Data) Then Exit;
// Session.SystemLog('DEBUG: Calling SelectProtocol w/ use default');
If SelectProtocol(True, False) = 'Q' Then Exit;
// Session.SystemLog('DEBUG: Calling ExecuteProtocol');
ExecuteProtocol(2, Data);
Session.io.OutRawLn ('');
@ -1344,8 +1354,12 @@ Function TFileBase.SelectProtocol (UseDefault, Batch: Boolean) : Char;
Begin
Result := False;
// Session.SystemLog('DEBUG: In LoadByByDefault.');
If Key = 'Q' Then Exit;
FileMode := 66;
Reset (ProtocolFile);
While Not Eof(ProtocolFile) Do Begin
@ -1358,6 +1372,8 @@ Function TFileBase.SelectProtocol (UseDefault, Batch: Boolean) : Char;
End;
Close(ProtocolFile);
// Session.SystemLog('DEBUG: LoadKeyByDefault result=' + Session.io.OutYN(Result));
End;
Var
@ -1369,6 +1385,8 @@ Begin
SavedP2 := Session.io.PromptInfo[2];
Result := Session.User.ThisUser.Protocol;
//Session.SystemLog('DEBUG: In SelectProtocol');
If Not LoadByKey(Result) Then Begin
Keys := 'Q';
@ -1418,6 +1436,8 @@ Var
A : Byte;
Temp2 : String[60];
Begin
// Session.SystemLog('DEBUG: In ExecuteArchive');
If Temp = '' Then
Case GetArchiveType(FName) of
'A' : Temp := 'ARJ';
@ -1431,6 +1451,10 @@ Begin
'?' : Temp := strUpper(JustFileExt(FName));
End;
// Session.SystemLog('DEBUG: ExecArc found type ' + Temp);
FileMode := 66;
Reset (ArcFile);
Repeat
@ -1441,6 +1465,8 @@ Begin
Read (ArcFile, Arc);
// Session.SystemLog('DEBUG: ExecArc read one');
If (Not Arc.Active) or ((Arc.OSType <> OSType) and (Arc.OSType <> 3)) Then
Continue;
@ -1449,6 +1475,8 @@ Begin
Close (ArcFile);
// Session.SystemLog('DEBUG: ExecArc found config for ' + Arc.Ext);
Case Mode of
1 : Temp2 := Arc.Pack;
2 : Temp2 := Arc.Unpack;
@ -1472,6 +1500,8 @@ Begin
Inc(A);
End;
Session.SystemLog('DEBUG: ExecArc build exec for: ' + Temp);
ShellDOS ('', Temp);
End;

View File

@ -58,7 +58,7 @@ Var
Editor : TEditorANSI;
Count : LongInt;
Begin
Editor := TEditorANSI.Create(Pointer(Session));
Editor := TEditorANSI.Create(Pointer(Session), Template);
For Count := 1 to Lines Do
Editor.SetLineText (Count, Session.Msgs.MsgText[Count]);

View File

@ -991,6 +991,7 @@ Begin
If (Color < 8) and (CurFG > 7) Then Prefix := '0;';
If (Color > 7) and (CurFG < 8) Then Prefix := '1;';
If Color > 7 Then Dec(Color, 8);
Case Color of
@ -1035,6 +1036,7 @@ Begin
End;
End;
(*
Function TBBSIO.Attr2Ansi (Attr: Byte) : String;
Begin
Result := '';
@ -1043,6 +1045,67 @@ Begin
Result := Pipe2Ansi(Attr AND $F) + Pipe2Ansi(((Attr SHR 4) AND 7) + 16);
End;
*)
Function TBBSIO.Attr2Ansi (Attr: Byte) : String;
Const
AnsiTable : String[8] = '04261537';
Var
OldFG : LongInt;
OldBG : LongInt;
FG : LongInt;
BG : LongInt;
Procedure AddSep (Ch: Char);
Begin
If Length(Result) > 0 Then
Result := Result + ';';
Result := Result + Ch;
End;
Begin
Result := '';
If (Attr = Screen.TextAttr) or (Graphics = 0) Then Exit;
FG := Attr and $F;
BG := Attr shr 4;
OldFG := Screen.TextAttr and $F;
OldBG := Screen.TextAttr shr 4;
If (OldFG <> 7) or (FG = 7) or ((OldFG > 7) and (FG < 8)) or ((OldBG > 7) and (BG < 8)) Then Begin
Result := '0';
OldFG := 7;
OldBG := 0;
End;
If (FG > 7) and (OldFG < 8) Then Begin
AddSep('1');
OldFG := OldFG or 8;
End;
// If (BG and 8) <> (OldBG and 8) Then Begin
// AddSep('5');
// OldBG := OldBG or 8;
// End;
If (FG <> OldFG) Then Begin
AddSep('3');
Result := Result + AnsiTable[(FG and 7) + 1];
End;
If (BG <> OldBG) Then Begin
AddSep('4');
Result := Result + AnsiTable[(BG and 7) + 1];
End;
Result := #27 + '[' + Result + 'm';
End;
Procedure TBBSIO.AnsiColor (A : Byte);
Begin
@ -1819,6 +1882,16 @@ Var
pWrite (Ch);
End;
Procedure Clear;
Begin
Str := '';
StrPos := 1;
Junk := 1;
CurPos := 1;
ReDraw;
End;
Begin
If UseInLimit Then Begin
Field := InLimit;
@ -1945,6 +2018,12 @@ Begin
Case Ch of
#02 : ReDraw;
#08 : If StrPos > 1 Then Begin
If (Default <> '') And (Str = Default) Then Begin
Clear;
Continue;
End;
Dec (StrPos);
Delete (Str, StrPos, 1);
@ -1963,15 +2042,12 @@ Begin
End;
End;
#13 : Break;
^Y : Begin
Str := '';
StrPos := 1;
Junk := 1;
CurPos := 1;
ReDraw;
End;
^Y : Clear;
#32..
#254: If Length(Str) < Max Then
#254: Begin
If (Default <> '') And (Str = Default) Then Clear;
If Length(Str) < Max Then
Case Mode of
1 : AddChar (Ch);
2 : AddChar (UpCase(Ch));
@ -2014,6 +2090,7 @@ Begin
9 : AddChar(Ch);
End;
End;
End;
Until False;
If Mode <> 6 Then Begin

View File

@ -574,6 +574,13 @@ Begin
If ReDraw Then Break;
End;
If Session.io.IsArrow Then Begin
If Pos(Ch, ExtKeys) > 0 Then Begin
Translate;
Break;
End;
End Else
Case Ch of
#08 : If Length(Temp) > 0 Then Begin
Dec (Temp[0]);

View File

@ -466,6 +466,12 @@ Begin
Continue;
End;
If TempMsg^.IsPriv And Not Session.User.IsThisUser(TempMsg^.GetTo) Then Begin
TempMsg^.SeekNext;
Continue;
End;
If NoRead And Session.User.IsThisUser(TempMsg^.GetTo) And TempMsg^.IsRcvd Then Begin
TempMsg^.SeekNext;
@ -634,7 +640,7 @@ Begin
End;
If MBase.NetType > 0 Then Begin
Msg^.DoStringLn (#13 + '--- ' + mysSoftwareID + ' BBS v' + mysVersion + ' (' + OSID + ')');
Msg^.DoStringLn (#13 + '--- ' + mysSoftwareID + ' v' + mysVersion + ' (' + OSID + ')');
Msg^.DoStringLn (' * Origin: ' + ResolveOrigin(MBase) + ' (' + strAddr2Str(Msg^.GetOrigAddr) + ')');
End;
End;
@ -1172,6 +1178,7 @@ Var
Lines : SmallInt;
Total : LongInt;
ReplyBase : RecMessageBase;
IsPrivate : Boolean;
Begin
ReplyBase := MBase;
@ -1227,6 +1234,11 @@ Begin
Set_Node_Action (Session.GetPrompt(349));
IsPrivate := ReplyBase.Flags AND MBPrivate <> 0;
If (ReplyBase.Flags AND MBPrivate = 0) AND (ReplyBase.Flags AND MBPrivReply <> 0) Then
IsPrivate := Session.io.GetYN(Session.GetPrompt(514), False);
Repeat
If ListMode = 0 Then
Session.io.OutFull (Session.GetPrompt(407))
@ -1237,7 +1249,7 @@ Begin
If ToWho = '' Then Exit;
If Not Email Then Break;
If Not (Email or IsPrivate) Then Break;
If Not Session.User.FindUser(ToWho, False) Then Begin
Session.io.PromptInfo[1] := ToWho;
@ -1328,7 +1340,7 @@ Begin
AssignMessageData(MsgNew, ReplyBase);
Case ReplyBase.NetType of
2 : MsgNew^.SetTo('All');
2 : MsgNew^.SetTo('All'); //Lang++
3 : Begin
MsgNew^.SetDest (Addr);
MsgNew^.SetOrig (GetMatchedAddress(Config.NetAddress[ReplyBase.NetAddr], Addr));
@ -1343,6 +1355,7 @@ Begin
MsgNew^.SetSubj (Subj);
MsgNew^.SetRefer (MsgBase^.GetMsgNum);
MsgNew^.SetPriv (IsPrivate);
AppendMessageText (MsgNew, Lines, ReplyID);
@ -1408,15 +1421,17 @@ Begin
Repeat
Session.io.PromptInfo[1] := MsgBase^.GetTo;
Session.io.PromptInfo[2] := MsgBase^.GetSubj;
Session.io.PromptInfo[3] := Session.io.OutYN(MsgBase^.IsSent);
If MBase.NetType = 3 Then Begin
MsgBase^.GetDest(DestAddr);
Session.io.PromptInfo[1] := Session.io.PromptInfo[1] + ' (' + strAddr2Str(DestAddr) + ')';
End;
Session.io.OutFull (Session.GetPrompt(296));
Case Session.io.OneKey('ABQ!', True) of
Case Session.io.OneKey('ABCQ!', True) of
'A' : Begin
Session.io.OutFull (Session.GetPrompt(297));
@ -1443,6 +1458,7 @@ Begin
MsgBase^.SetSubj(Session.io.GetInput(50, 50, 11, MsgBase^.GetSubj));
End;
'C' : MsgBase^.SetSent(NOT MsgBase^.IsSent);
'!' : Begin
Temp1 := MsgBase^.GetSubj;
@ -1712,7 +1728,10 @@ Var
MsgBase^.MsgStartUp;
Case ScanMode of
0 : Res := True;
0 : If MsgBase^.IsPriv Then
Res := Session.User.IsThisUser(MsgBase^.GetTo) or Session.User.IsThisUser(MsgBase^.GetFrom)
Else
Res := True;
1 : Res := Session.User.IsThisUser(MsgBase^.GetTo);
2 : Res := Session.User.IsThisUser(MsgBase^.GetTo) or Session.User.IsThisUser(MsgBase^.GetFrom);
3 : Begin
@ -2900,6 +2919,7 @@ Var
Forced : Boolean;
Old : RecMessageBase;
SaveGroup : Boolean;
IsPrivate : Boolean;
Begin
Old := MBase;
SaveGroup := Session.User.IgnoreGroup;
@ -2936,6 +2956,10 @@ Begin
MsgSubj := '';
MsgAddr := '';
Forced := False;
IsPrivate := MBase.Flags AND MBPrivate <> 0;
If (MBase.Flags AND MBPrivate = 0) AND (MBase.Flags AND MBPrivReply <> 0) Then
IsPrivate := Session.io.GetYN(Session.GetPrompt(513), False);
For A := 1 to strWordCount(Data, ' ') Do Begin
TempStr := strWordGet(A, Data, ' ');
@ -2973,7 +2997,7 @@ Begin
If Not strStr2Addr(MsgAddr, DestAddr) Then MsgTo := '';
End;
End Else
If MBase.Flags and MBPrivate <> 0 Then Begin
If IsPrivate Then Begin
If MsgTo = '' Then Begin
Session.io.OutFull (Session.GetPrompt(450));
@ -3044,6 +3068,7 @@ Begin
MsgBase^.SetTo (MsgTo);
MsgBase^.SetSubj (MsgSubj);
MsgBase^.SetPriv (IsPrivate);
If MBase.NetType = 3 Then Begin
MsgBase^.SetDest (DestAddr);
@ -3747,7 +3772,7 @@ Begin
Msg^.DoStringLn(MsgText[Count]);
If mArea.NetType > 0 Then Begin
Msg^.DoStringLn (#13 + '--- ' + mysSoftwareID + ' BBS v' + mysVersion + ' (' + OSID + ')');
Msg^.DoStringLn (#13 + '--- ' + mysSoftwareID + ' v' + mysVersion + ' (' + OSID + ')');
Msg^.DoStringLn (' * Origin: ' + ResolveOrigin(mArea) + ' (' + strAddr2Str(Msg^.GetOrigAddr) + ')');
End;
@ -4245,7 +4270,7 @@ Begin
FileMode := 66;
Old := MBase;
Temp := strPadR('Produced By ' + mysSoftwareID + ' BBS v' + mysVersion + '. ' + CopyID, 128, ' ');
Temp := strPadR('Produced By ' + mysSoftwareID + ' v' + mysVersion + '. ' + CopyID, 128, ' ');
Assign (DataFile, Session.TempPath + 'messages.dat');
ReWrite (DataFile, 1);
@ -4303,11 +4328,23 @@ Begin
If FileExist(Config.QwkNews) Then FileCopy(Config.qwkNews, Session.TempPath + JustFile(Config.qwkNews));
If FileExist(Config.QwkGoodbye) Then FileCopy(Config.qwkGoodbye, Session.TempPath + JustFile(Config.qwkGoodbye));
// Session.SystemLog('DEBUG: Archiving QWK packet');
If Session.LocalMode Then Begin
Session.FileBase.ExecuteArchive (Config.QWKPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1);
Session.io.OutFullLn (Session.GetPrompt(235));
End Else Begin
// Session.SystemLog('DEBUG: Arc QWK: Nonlocal mode');
Session.FileBase.ExecuteArchive (Session.TempPath + Temp, Session.User.ThisUser.Archive, Session.TempPath + '*', 1);
// If FileExist(Session.TempPath + Temp) Then
// Session.SystemLog('DEBUG: QWK successfully archived')
// Else
// Session.SystemLog('DEBUG: Could not find QWK archived packet');
// Session.SystemLog('DEBUG: QWK calling SendFile on "' + Temp + '"');
Session.FileBase.SendFile (Session.TempPath + Temp);
End;

View File

@ -1201,7 +1201,7 @@ Begin
Halt(0);
End;
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' BBS v' + mysVersion + ' for ' + OSID + ' Node |ND');
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' v' + mysVersion + ' for ' + OSID + ' Node |ND');
Session.io.OutFullLn (CopyID);
If Config.DefTermMode = 0 Then

View File

@ -566,7 +566,7 @@
294 |CR|12Delete this BBS from the list? |11
295 |CR|12You did not add this BBS entry.
; editing message display
296 |CL|14Message Editor|CR|CR|03A. To : |&1|CRB. Subj : |&2|CR|CR|09Command: (!) Edit text, (Q)uit: |XX
296 |16|CL|09|17 ° |15Message Editing |$X79 |16|CR|CR|09(|11A|09) |03To: |11|&1|CR|09(|11B|09) |03Subject: |11|&2|CR|09(|11C|09) |03Sent: |11|&3|CR|CR|09Edit option (|11!|09) Edit text, (|11Q|09)uit? |11
; editing message to
297 |CR|09To: |XX
; editing message net address
@ -1014,3 +1014,7 @@
511 |CR|09Select message base for reply [|10?|09/|10List|09]: |11
; Message "replying to X base" prompt &1=base name
512 |CR|03Posting reply message to base |11|&1|03.
; Message post: "post msg as private" in pub/priv type base
513 |CR|12Post this as a private message? |11
; Message reply: "post msg as private" in pub/priv type base
514 |CR|12Post this as a private message? |11

View File

@ -1107,7 +1107,7 @@ Begin
TextAttr := 7;
WriteLn;
WriteLn ('MBBSUTIL: ', mysSoftwareID, ' BBS Utilities Version ', mysVersion, ' (', OSID, ')');
WriteLn ('MBBSUTIL: ', mysSoftwareID, ' Utilities Version ', mysVersion, ' (', OSID, ')');
WriteLn ('Copyright (C) ', mysCopyYear, ' By James Coyle. All Rights Reserved.');
WriteLn;

View File

@ -1,7 +1,8 @@
{$I M_OPS.PAS}
Unit MIS_Client_FTP;
{$I M_OPS.PAS}
{.$DEFINE FTPDEBUG}
// does not send file/directory datestamps
// does not support uploading (need to make bbs functions generic for this
// and for mbbsutil -fupload command)
@ -102,6 +103,22 @@ Const
re_DLLimit = '550 Download limit would be exceeded';
re_DLRatio = '550 Download/upload ratio would be exceeded';
{$IFDEF FTPDEBUG}
Procedure LOG (Str: String);
Var
T : Text;
Begin
Assign (T, 'ftpdebug.txt');
{$I-} Append(T); {$I+}
If IoResult <> 0 Then ReWrite(T);
WriteLn(T, Str);
Close(T);
End;
{$ENDIF}
Function CreateFTP (Owner: TServerManager; Config: RecConfig; ND: TNodeData; CliSock: TIOSocket) : TServerClient;
Begin
Result := TFTPServer.Create(Owner, CliSock);
@ -261,6 +278,9 @@ Begin
If IsPassive Then Begin
WaitSock := TIOSocket.Create;
WaitSock.FTelnetServer := False;
WaitSock.FTelnetClient := False;
WaitSock.WaitInit(DataPort);
DataSocket := WaitSock.WaitConnection;
@ -419,18 +439,34 @@ Var
WaitSock : TIOSocket;
Begin
If LoggedIn Then Begin
If Not bbsConfig.inetFTPPassive Then Begin
Client.WriteLine(re_BadCommand);
Exit;
End;
DataPort := Random(bbsConfig.inetFTPPortMax - bbsConfig.inetFTPPortMin) + bbsConfig.inetFTPPortMin;
{$IFDEF FTPDEBUG} LOG('PASV on host ' + Client.HostIP + ' port ' + strI2S(DataPort)); {$ENDIF}
Client.WriteLine(re_PassiveOK + '(' + strReplace(Client.HostIP, '.', ',') + ',' + strI2S(WordRec(DataPort).Hi) + ',' + strI2S(WordRec(DataPort).Lo) + ').');
IsPassive := True;
WaitSock := TIOSocket.Create;
WaitSock.FTelnetServer := False;
WaitSock.FTelnetClient := False;
{$IFDEF FTPDEBUG} LOG('PASV Init'); {$ENDIF}
WaitSock.WaitInit(DataPort);
{$IFDEF FTPDEBUG} LOG('PASV Wait'); {$ENDIF}
DataSocket := WaitSock.WaitConnection;
{$IFDEF FTPDEBUG} LOG('PASV WaitDone'); {$ENDIF}
If Not Assigned(DataSocket) Then Begin
WaitSock.Free;
Client.WriteLine(re_NoData);
@ -536,12 +572,20 @@ Var
DirFile : TBufFile;
Dir : RecFileList;
Begin
{$IFDEF FTPDEBUG} LOG('LIST Calling FindDirectory'); {$ENDIF}
If LoggedIn Then Begin
TempPos := FindDirectory(TempBase);
{$IFDEF FTPDEBUG} LOG('Back From FindDirectory. Result ' + strI2S(TempPos)); {$ENDIF}
If TempPos = -1 Then Begin
{$IFDEF FTPDEBUG} LOG('Opening data session'); {$ENDIF}
OpenDataSession;
{$IFDEF FTPDEBUG} LOG('Back from data session'); {$ENDIF}
FBaseFile := TBufFile.Create(FileBufSize);
If FBaseFile.Open(bbsConfig.DataPath + 'fbases.dat', fmOpen, fmRWDN, SizeOf(RecFileBase)) Then Begin
@ -754,6 +798,8 @@ Begin
cmdREIN;
Repeat
{$IFDEF FTPDEBUG} LOG('Execute loop'); {$ENDIF}
If Client.WaitForData(bbsConfig.inetFTPTimeout * 1000) = 0 Then Break;
If Terminated Then Exit;
@ -767,6 +813,8 @@ Begin
Else
Data := '';
{$IFDEF FTPDEBUG} LOG('Cmd: ' + Cmd + ' Data: ' + Data); {$ENDIF}
If Cmd = 'CDUP' Then cmdCDUP Else
If Cmd = 'CWD' Then cmdCWD Else
If Cmd = 'EPRT' Then cmdEPRT Else

View File

@ -21,7 +21,7 @@
// protocol: active, no 4gig limitation, can batch, etc
Const
mysSoftwareID = 'Mystic'; // no idea
mysSoftwareID = 'Mystic BBS';
mysCopyYear = '1997-2013'; // its been a long time!
mysVersion = '1.10 A33'; // current version
mysDataChanged = '1.10 A11'; // version of last records change
@ -36,7 +36,7 @@ Const
{$IFDEF LINUX}
PathChar = '/';
LineTerm = #10;
OSID = 'Linux';
{$IFDEF CPUARM} OSID = 'Raspberry Pi'; {$ELSE} OSID = 'Linux'; {$ENDIF}
OSType = 1;
{$ENDIF}
@ -59,7 +59,7 @@ Const
mysMaxMenuCmds = 25; // Max menu commands per item
mysMaxMenuInput = 12;
mysMaxMenuStack = 8;
mysMaxThemeText = 512;
mysMaxThemeText = 514;
fn_SemFileEcho = 'echomail.now';
fn_SemFileNews = 'newsmail.now';
@ -306,7 +306,7 @@ Type
inetFTPDupes : Byte;
inetFTPPortMin : Word;
inetFTPPortMax : Word;
inetFTPAnon : Boolean;
inetFTPPassive : Boolean;
inetFTPTimeout : Word;
inetNNTPUse : Boolean;
inetNNTPPort : Word;
@ -475,7 +475,7 @@ Const
MBAutosigs = $00000004; // 3
MBNoAttach = $00000008; // 4
MBPrivate = $00000010; // 5
MBCrossPost = $00000020; // 6
MBPrivReply = $00000020; // 6
Type
RecMessageBase = Record // MBASES.DAT

View File

@ -26,6 +26,10 @@ BUGS AND POSSIBLE ISSUES
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
=========================================
- Fix up new FS editor to use passed template and editor contraints.
- Test with file description editor.
- ACS to allow "selecable reply base"
- Strip pipe colors/ANSI from message option?
- AREAS.BBS import?
- PGUP/DOWN moves bases in message base editor?
- AreaFix

View File

@ -3272,3 +3272,40 @@
+ Message base editor now has a Move command. You must first Copy a message
base, and then move to where you want to move it to and then /M to move it.
+ FTP server now has the option to allow passive data transfers or not, and
this has replaced the "Allow Anonymous" which does not exist at this time.
Please review your configuration. If you or users have issues with passive
turn it off. The default should set it to off now.
+ When editing a posted message, Mystic now allows the option to set the
echomail "sent" flag. Prompt #296 has been updated for this new option. A
new default follows:
; editing message display
296 |16|CL|09|17 ° |15Message Editing |$X79 |16|CR|CR|09(|11A|09) |03To: |11|&1|CR|09(|11B|09) |03Subject: |11|&2|CR|09(|11C|09) |03Sent: |11|&3|CR|CR|09Edit option (|11!|09) Edit text, (|11Q|09)uit? |11
+ When Mystic gives an input prompt with a default text value, pressing a
backspace will now automatically erase the default. Likewise, typing any
key will erase the default.
+ Added a new flag into message bases called Pvt Reply. If this is set to
true then Mystic will allow private replies/posts to a message based
marked as public. This basically creates a "public/private" type base.
Two new prompts are added for this:
; Message post: "post msg as private" in pub/priv type base
513 |CR|12Post this as a private message? |11
; Message reply: "post msg as private" in pub/priv type base
514 |CR|12Post this as a private message? |11
! When using extended hotkeys in a standard menu (ie UP,DOWN,PGUP,DOWN,etc)
Mystic was bleeding input during some events, and also allowing input
and redrawing the menu when invalid input was entered. This is now fixed.
+ Further optimized the on-the-fly ANSI optimization generated by Mystic. I
think its probably not possible to make it more efficient now.
<ALPHA 33 RELEASED>