X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=WebModuleUnit1.pas;h=4e1903f7222d634606c279e12d3e5aacd7cc8328;hb=36c8f26603c4e23585dfd8f9d6b4dfb921e7a072;hp=deb7043797cbbb86c4aca790f570bc10ad60c408;hpb=c7cd44911214924309cfa68761f5b4ba52bee224;p=newbbs%2Fnewbbs.git diff --git a/WebModuleUnit1.pas b/WebModuleUnit1.pas index deb7043..4e1903f 100644 --- a/WebModuleUnit1.pas +++ b/WebModuleUnit1.pas @@ -4,7 +4,13 @@ interface uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd, Web.DBWeb, System.Variants, System.NetEncoding, System.RegularExpressions, - Data.DB, Web.DBXpressWeb, System.Types; + Data.DB, Web.DBXpressWeb, System.Types, FireDAC.Stan.Intf, + FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, + FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, + FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.UI.Intf, FireDAC.Stan.Def, + FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.FB, FireDAC.Phys.FBDef, + FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, FireDAC.VCLUI.Wait, + FireDAC.Comp.UI; type TWebModule1 = class(TWebModule) @@ -17,22 +23,53 @@ type top: TPageProducer; master: TPageProducer; alert: TDataSetPageProducer; - footer: TDataSetPageProducer; mail: TPageProducer; - css1: TPageProducer; css2: TPageProducer; css3: TPageProducer; css4: TPageProducer; header: TDataSetPageProducer; - login: TDataSetPageProducer; js1: TPageProducer; js2: TPageProducer; - js3: TPageProducer; - js4: TPageProducer; adhead: TPageProducer; js5: TPageProducer; title: TPageProducer; ti: TDataSetPageProducer; + FDTable2: TFDTable; + FDTable2DBNUM: TIntegerField; + FDTable2NUMBER: TIntegerField; + FDTable2TITLE: TWideStringField; + FDTable2NAME: TWideStringField; + FDTable2COMMENT: TWideMemoField; + FDTable2RAW: TWideMemoField; + FDTable2DATE: TDateField; + FDTable2PASS: TWideStringField; + FDTable5: TFDTable; + FDTable4: TFDTable; + FDTable4ID: TIntegerField; + FDTable4DBNAME: TIntegerField; + FDTable4POSNUM: TIntegerField; + FDTable4DATE: TDateField; + FDTable4REQUEST: TWideMemoField; + DataSource1: TDataSource; + FDTable3: TFDTable; + FDTable3TITLE: TWideStringField; + FDTable3TITLE2: TWideStringField; + FDTable3INFO: TIntegerField; + FDTable3COUNT: TIntegerField; + FDTable3password: TWideStringField; + FDTable3ng: TWideStringField; + FDConnection1: TFDConnection; + FDTable1: TFDTable; + FDTable1DBNUM: TIntegerField; + FDTable1DATABASE: TWideStringField; + login: TPageProducer; + footer: TPageProducer; + FDGUIxWaitCursor1: TFDGUIxWaitCursor; + FDQuery1: TFDQuery; + FDTable3mente: TSmallintField; + FDTable5id: TIntegerField; + FDTable5name: TWideStringField; + FDTable5source: TWideMemoField; procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest; @@ -103,14 +140,24 @@ type TagParams: TStrings; var ReplaceText: string); procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); + procedure css1HTMLTag(Sender: TObject; Tag: TTag; const TagString: string; + TagParams: TStrings; var ReplaceText: string); + procedure WebModule1usrdelAction(Sender: TObject; Request: TWebRequest; + Response: TWebResponse; var Handled: Boolean); private { private éŒ¾ } ss: TStringList; tagstr: string; procedure pages(count: Integer; var page: Integer); + procedure strsCheck(var Error: string; list: TStringList); + procedure setLastArticle; + function footerLink(Data: array of const): string; + function isInfo: Boolean; + function loginCheck: Boolean; function hash(str: string): string; function mente: Boolean; function detail(ts, pid: string): string; + function scan(text: string): string; public { public éŒ¾ } end; @@ -122,7 +169,7 @@ implementation { %CLASSGROUP 'Vcl.Controls.TControl' } -uses Unit1, IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest; +uses IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest, Jpeg, Graphics; {$R *.dfm} @@ -135,11 +182,11 @@ procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag; begin if TagString = 'pr' then ReplaceText := promotion - else if (TagString = 'mente') and - (DataModule1.FDTable3.FieldByName('mente').AsBoolean = true) then - ReplaceText := 'checked' - else if TagString = 'password' then - ReplaceText := Request.CookieFields.Values['user'] + else if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if (TagString = 'mente') and (FDTable3.FieldByName('mente').AsInteger = 1) + then + ReplaceText := 'checked="checked"' else if TagString = 'database' then ReplaceText := Request.QueryFields.Values['db']; end; @@ -149,8 +196,23 @@ procedure TWebModule1.adminFormatCell(Sender: TObject; var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs, CellData: string); begin - if (CellColumn = 0) and (CellRow > 0) then - CellData := Format('', [CellRow]); + if CellRow = 0 then + begin + BgColor := 'Silver'; + Exit; + end; + if CellRow mod 2 = 0 then + BgColor := 'snow'; + case CellColumn of + 0: + CellData := Format('', [CellRow]); + 1: + CellData := '' + CellData + ''; + 2: + CellData := '

' + CellData + '

'; + 3: + CellData := '

' + CellData + '

'; + end; end; procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag; @@ -159,16 +221,19 @@ var s: TStringList; i: Integer; begin - if TagString = 'article' then + if (TagString = 'plus') and (alert.Tag = 0) then + ReplaceText := '&num=<#posnum>>[ <#dbname>-<#posnum> ]' + else if TagString = 'article' then begin - with DataModule1 do + if alert.Tag = 1 then begin - FDTable1.Locate('dbnum', FDTable4.FieldByName('dbname').AsInteger); - FDTable2.Locate('number', FDTable4.FieldByName('posnum').AsInteger); + ReplaceText := '

ƒŠƒNƒGƒXƒg'; + Exit; end; s := TStringList.Create; try - s.Text := articles.Content; + s.text := articles.Content; for i := 1 to 2 do s.Delete(1); for i := s.count - 1 downto 0 do @@ -177,20 +242,27 @@ begin s.Delete(i); break; end; - ReplaceText := s.Text; + ReplaceText := s.text; finally s.Free; end; - end - else if TagString = 'request' then - ReplaceText := DataModule1.FDTable4.FieldByName('request').AsString; + end; end; procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin - if TagString = 'comment' then - ReplaceText := DataModule1.FDTable2.FieldByName('comment').AsString; + if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'comment' then + ReplaceText := FDTable2.FieldByName('comment').AsString; +end; + +procedure TWebModule1.css1HTMLTag(Sender: TObject; Tag: TTag; + const TagString: string; TagParams: TStrings; var ReplaceText: string); +begin + if TagString = 'uri' then + ReplaceText := Request.ScriptName; end; function TWebModule1.detail(ts, pid: string): string; @@ -206,25 +278,38 @@ procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); var i: Integer; + s: shortstring; + x: Boolean; begin if TagString = 'link' then begin for i := 1 to 10 do - if i = index.Tag then - ReplaceText := ReplaceText + ' ' + i.ToString + ' ' - else - ReplaceText := ReplaceText + - Format(' %d ', - [PString(Self.Tag)^, DataModule1.FDTable1.FieldByName('dbnum') - .AsInteger, i, i]); - end - else if TagString = 'recent' then - if index.Tag = -1 then - ReplaceText := TagString - else - ReplaceText := 'recent'; + begin + x := i = index.Tag; + ReplaceText := ReplaceText + footerLink([i, i, x]); + end; + x := index.Tag = -1; + s := '‚³‚¢‚²'; + ReplaceText := ReplaceText + footerLink([-1, s, x]); + end; +end; + +function TWebModule1.footerLink(Data: array of const): string; +var + s, t: string; +begin + if Data[1].VType = vtInteger then + t := Data[1].VInteger.toString + else + t := Data[1].VString^; + if Data[2].VBoolean = true then + s := ' active' + else + s := ''; + result := Format + ('

  • %s
  • ', + [s, Request.ScriptName + tagstr, FDTable1.FieldByName('dbnum').AsInteger, + Data[0].VInteger, t]); end; function TWebModule1.hash(str: string): string; @@ -244,7 +329,9 @@ procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag; var s: string; begin - if TagString = 'cookie' then + if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'cookie' then begin s := TagParams.Values['param']; ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]); @@ -266,49 +353,78 @@ procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'pr' then - ReplaceText := promotion; + ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'area' then + if help.Tag = 0 then + begin + ss := TStringList.Create; + try + ss.Add('

    ‚¨–â‚¢‡‚킹<íœˆË—Š‚Ȃlj½‚Å‚à>

    '); + ss.Add('
    '); + ss.Add('
    '); + ReplaceText := ss.text; + finally + ss.Free; + end; + end + else + ReplaceText := + '

    ‚²•ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·.'; end; procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); var i: Integer; - x: Boolean; begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName else if TagString = 'article' then begin - x := DataModule1.FDTable1.FieldByName('dbnum') - .AsInteger = DataModule1.FDTable3.FieldByName('info').AsInteger; - for i := 1 to DataModule1.FDTable3.FieldByName('count').AsInteger do + for i := 1 to FDTable3.FieldByName('count').AsInteger do begin - if DataModule1.FDTable2.Eof = true then + if FDTable2.Eof = true then break; - if x = false then + if isInfo = false then ReplaceText := ReplaceText + articles.Content else ReplaceText := articles.Content + ReplaceText; - if DataModule1.FDTable2.Eof = false then - DataModule1.FDTable2.Next; + FDTable2.Next; end; end else if TagString = 'footer' then ReplaceText := footer.Content else if TagString = 'header' then - begin - i := DataModule1.FDTable3.FieldByName('count').AsInteger; - if 10 * i <= DataModule1.FDTable2.RecordCount then - ReplaceText := '

    ‚±‚êˆÈã“Še‚Å‚«‚Ü‚¹‚ñ.

    ' + if (FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName('info') + .AsInteger) and (loginCheck = false) then + ReplaceText := '

    ŠÇ—l‚©‚炨’m‚点‚ª‚ ‚è‚Ü‚·.

    ' else - ReplaceText := header.Content; - end + begin + i := FDTable3.FieldByName('count').AsInteger; + if 10 * i <= FDTable2.RecordCount then + ReplaceText := '

    ‚±‚êˆÈã“Še‚Å‚«‚Ü‚¹‚ñ.

    ' + else + ReplaceText := header.Content; + end else if (TagString = 'css') or (TagString = 'js') then ReplaceText := detail(TagString, TagParams.Values['id']) else if TagString = 'dbnum' then - ReplaceText := DataModule1.FDTable1.FieldByName('dbnum').AsString + ReplaceText := FDTable1.FieldByName('dbnum').AsString else if TagString = 'database' then - ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString; + ReplaceText := FDTable1.FieldByName('database').AsString; +end; + +function TWebModule1.isInfo: Boolean; +begin + result := FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName + ('info').AsInteger; end; procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag; @@ -322,7 +438,7 @@ begin begin s := TStringList.Create; try - s.Text := DataModule1.FDTable2.FieldByName('raw').AsString; + s.text := FDTable2.FieldByName('raw').AsString; for i := 0 to s.count - 1 do for j := 0 to ss.count - 1 do if Pos(ss[j], s[i]) > 0 then @@ -330,60 +446,93 @@ begin s[i] := '

    ' + s[i] else s[i] := '

    ' + s[i]; - with DataModule1.FDTable2 do + with FDTable2 do begin i := FieldByName('dbnum').AsInteger; j := FieldByName('number').AsInteger; str := Request.QueryFields.Values['db']; if str = '' then - t := Format('[ %d-%d ]', - [DataModule1.FDTable1.FieldByName('dbnum').AsInteger, j, i, j]) + t := Format('[ %d-%d ]', + [Request.ScriptName, i, j, i, j]) else - t := Format('[ %d ]', [str, j, j]); + t := Format('[ %d ]', + [Request.ScriptName, str, j, j]); end; - ReplaceText := t + s.Text; + ReplaceText := t + s.text; finally s.Free; end; end; end; +function TWebModule1.loginCheck: Boolean; +begin + result := hash(Request.CookieFields.Values['user']) = FDTable3.FieldByName + ('password').AsString; +end; + procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); +var + i: Integer; begin if TagString = 'pr' then - ReplaceText := promotion; + ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'database' then + begin + i := StrToIntDef(Request.QueryFields.Values['db'], + FDTable3.FieldByName('info').AsInteger); + if FDTable1.Locate('dbnum', i) = true then + ReplaceText := FDTable1.FieldByName('database').AsString; + end; end; procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); +var + i, j: Integer; begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName else if TagString = 'request' then - with DataModule1.FDTable4 do + with FDTable4 do begin First; - ReplaceText := ''; while Eof = false do begin - ReplaceText := ReplaceText + alert.Content; + i := FieldByName('dbname').AsInteger; + j := FieldByName('posnum').AsInteger; + if FDTable2.Locate('dbnum;number', VarArrayOf([i, j])) = true then + alert.Tag := 0 + else + alert.Tag := 1; + ReplaceText := ReplaceText + alert.ContentFromString(alert.Content); Next; end; - ReplaceText := ReplaceText + '
    '; - end - else if TagString = 'db' then - ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString; + if ReplaceText <> '' then + ReplaceText := '' + ReplaceText + + '
    '; + end; end; function TWebModule1.mente: Boolean; +var + s: string; begin - if DataModule1.FDTable3.FieldByName('mente').AsBoolean = true then + if FDTable3.FieldByName('mente').AsInteger = 1 then begin + s := Request.QueryFields.Values['db']; + if s <> '' then + s := '?db=' + s; result := true; Response.Content := '


    ‚½‚¾‚¢‚܃ƒ“ƒeƒiƒ“ƒX’†‚Å‚·^_^

    ' + - '

    ŠÇ—ŽÒ—pƒƒOƒCƒ“' + Format('

    ŠÇ—ŽÒ—pƒƒOƒCƒ“', + [Request.ScriptName, s]); end else result := false; @@ -393,7 +542,7 @@ procedure TWebModule1.pages(count: Integer; var page: Integer); var max: Integer; begin - max := DataModule1.FDTable3.FieldByName('count').AsInteger; + max := FDTable3.FieldByName('count').AsInteger; if (page > -1) and (count < max * (page - 1)) then begin page := (count div max) + 1; @@ -403,12 +552,12 @@ begin case page of - 1: begin - DataModule1.FDTable2.Last; - DataModule1.FDTable2.MoveBy(1 - max); + FDTable2.Last; + FDTable2.MoveBy(1 - max); end; else - DataModule1.FDTable2.First; - DataModule1.FDTable2.MoveBy(max * (page - 1)); + FDTable2.First; + FDTable2.MoveBy(max * (page - 1)); end; end; @@ -417,6 +566,8 @@ procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag; begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName else if TagString = 'content' then ReplaceText := articles.Content else if TagString = 'query' then @@ -425,20 +576,46 @@ begin ReplaceText := Request.QueryFields.Values['num']; end; +function TWebModule1.scan(text: string): string; +var + reg: TRegEx; + coll: TMatchCollection; + i, j: Integer; + s, t, str: string; +begin + i := Request.QueryFields.Values['db'].ToInteger; + s := Request.ScriptName; + text := TNetEncoding.HTML.Encode(text); + str := TNetEncoding.HTML.Encode('>>'); + reg := TRegEx.Create(str + '(\d+)'); + coll := reg.Matches(text); + for j := coll.count - 1 downto 0 do + begin + Delete(text, coll[j].index, coll[j].Length); + t := Copy(coll[j].Value, Length(str) + 1, coll[j].Length); + result := Format + ('>>%s', + [s, i, t, s, i, t, t]); + Insert(result, text, coll[j].index); + end; + result := text; +end; + procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); var s: TStringList; + str: string; procedure sub; var i: Integer; j: Integer; label jump; begin - DataModule1.FDTable2.First; - while DataModule1.FDTable2.Eof = false do + FDTable2.First; + while FDTable2.Eof = false do begin - s.Text := DataModule1.FDTable2.FieldByName('raw').AsString; + s.text := FDTable2.FieldByName('raw').AsString; ss.DelimitedText := Request.ContentFields.Values['word1']; for j := 0 to ss.count - 1 do for i := 0 to s.count - 1 do @@ -461,13 +638,23 @@ var else if i = s.count - 1 then goto jump; jump: - DataModule1.FDTable2.Next; + FDTable2.Next; end; end; begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'select' then + begin + str := Request.QueryFields.Values['db']; + if str = '' then + ReplaceText := Request.ScriptName + '/' + else + ReplaceText := Request.ScriptName + '/index?db=' + str; + end else if (Request.MethodType = mtPost) and (TagString = 'items') then begin if Request.ContentFields.Values['type'] = 'OR' then @@ -481,11 +668,11 @@ begin ss.StrictDelimiter := false; if Request.QueryFields.Values['db'] = '' then begin - DataModule1.FDTable1.First; - while DataModule1.FDTable1.Eof = false do + FDTable1.First; + while FDTable1.Eof = false do begin sub; - DataModule1.FDTable1.Next; + FDTable1.Next; end; end else @@ -502,21 +689,53 @@ begin ReplaceText := '?' + ReplaceText; end else if TagString = 'css' then - ReplaceText := css2.Content; + ReplaceText := css2.Content + else if TagString = 'dbnum' then + ReplaceText := Request.QueryFields.Values['dbnum']; +end; + +procedure TWebModule1.setLastArticle; +begin + FDTable2.Last; +end; + +procedure TWebModule1.strsCheck(var Error: string; list: TStringList); +var + s: TStringList; + i, j: Integer; + x: Boolean; +begin + x := false; + s := TStringList.Create; + try + s.DelimitedText := FDTable3.FieldByName('ng').AsString; + for i := 0 to s.count - 1 do + for j := 0 to list.count - 1 do + if Pos(s[i], list[j]) > 0 then + begin + x := true; + break; + end; + for i := 0 to list.count - 1 do + list[i] := '

    ' + scan(list[i]); + finally + s.Free; + end; + if x = true then + Error := Error + '

    ‹ÖŽ~Œê‹å‚ªŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·.'; end; procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin - if TagString = 'count' then - begin - DataModule1.FDTable1.Locate('dbnum', - DataModule1.FDQuery1.FieldByName('dbnum').AsInteger); - ReplaceText := DataModule1.FDTable2.RecordCount.ToString; - end + if TagString = 'uri' then + ReplaceText := Request.ScriptName + else if TagString = 'count' then + ReplaceText := FDTable2.RecordCount.toString else if TagString = 'database' then - ReplaceText := DataModule1.FDTable1.Lookup('dbnum', - DataModule1.FDQuery1.FieldByName('dbnum').AsInteger, 'database'); + ReplaceText := FDTable1.FieldByName('database').AsString + else if TagString = 'date' then + ReplaceText := FDQuery1.FieldByName('max(date)').AsString; end; procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag; @@ -524,19 +743,21 @@ procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag; begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName else if TagString = 'js' then ReplaceText := detail(TagString, TagParams.Values['id']) else if TagString = 'main' then - with DataModule1.FDQuery1 do + begin + FDQuery1.Open; + while FDQuery1.Eof = false do begin - Open; - while Eof = false do - begin - ReplaceText := ReplaceText + ti.Content; - Next; - end; - Close; + FDTable1.Locate('dbnum', FDQuery1.FieldByName('dbnum').AsInteger); + ReplaceText := ReplaceText + ti.Content; + FDQuery1.Next; end; + FDQuery1.Close; + end; end; procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag; @@ -547,48 +768,69 @@ var begin if TagString = 'pr' then ReplaceText := promotion + else if TagString = 'uri' then + ReplaceText := Request.ScriptName else if TagString = 'list' then begin - i := DataModule1.FDTable3.FieldByName('info').AsInteger; + i := FDTable3.FieldByName('info').AsInteger; for k := 0 to tcnt do begin - if DataModule1.FDTable1.Eof = true then + if FDTable1.Eof = true then break; t := ''; - j := DataModule1.FDTable1.FieldByName('dbnum').AsInteger; - s := DataModule1.FDTable1.FieldByName('database').AsString; + j := FDTable1.FieldByName('dbnum').AsInteger; + s := FDTable1.FieldByName('database').AsString; if (i = j) or (s = 'master') then begin - DataModule1.FDTable1.Next; + FDTable1.Next; continue; end; - DataModule1.FDTable2.Last; - if Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1 then + FDTable2.Last; + if (Now - FDTable2.FieldByName('date').AsDateTime < 1) and + (FDTable2.RecordCount > 0) then t := 'background-color:aqua;'; - if DataModule1.FDTable2.RecordCount >= 10 * - DataModule1.FDTable3.FieldByName('count').AsInteger then + if FDTable2.RecordCount >= 10 * FDTable3.FieldByName('count').AsInteger + then t := t + 'color:red;'; if t <> '' then t := ' style=' + t; ReplaceText := ReplaceText + - Format('

    %s

    ', - [t, j, s]); - DataModule1.FDTable1.Next; + Format('

    %s

    ', + [t, Request.ScriptName, j, s]); + FDTable1.Next; end; + ReplaceText := + ''; end else if TagString = 'info' then - ReplaceText := DataModule1.FDTable1.Lookup('dbnum', - DataModule1.FDTable3.FieldByName('info').AsInteger, 'database') + ReplaceText := FDTable1.Lookup('dbnum', FDTable3.FieldByName('info') + .AsInteger, 'database') else if TagString = 'dbnum' then - ReplaceText := DataModule1.FDTable3.FieldByName('info').AsString + ReplaceText := FDTable3.FieldByName('info').AsString else if (TagString = 'css') or (TagString = 'js') then ReplaceText := detail(TagString, TagParams.Values['id']) else if TagString = 'slide' then begin - for i := 1 to (DataModule1.FDTable1.RecordCount div tcnt) + 1 do + s := ' active'; + for i := 1 to (FDTable1.RecordCount div tcnt) + 1 do + begin ReplaceText := ReplaceText + - '
    <#list>
    '; + Format(''; + s := ''; + end; + end + else if TagString = 'indicator' then + begin + s := ' class="active"'; + for i := 0 to (FDTable1.RecordCount div tcnt) do + begin + ReplaceText := ReplaceText + + Format('
  • ', [i, s]); + s := ''; + end; end; end; @@ -600,7 +842,7 @@ var match: TMatch; begin j := 0; - DataModule1.FDTable2.RecNo := admin.Tag; + FDTable1.Locate('dbnum', Request.QueryFields.Values['db']); for i := 0 to Request.ContentFields.count - 1 do begin reg := TRegEx.Create('\d+'); @@ -610,8 +852,8 @@ begin k := match.Value.ToInteger - j - 1; j := match.Value.ToInteger; for m := 1 to k do - DataModule1.FDTable2.Next; - DataModule1.FDTable2.Delete; + FDTable2.Next; + FDTable2.Delete; end; end; WebModule1adminAction(nil, Request, Response, Handled); @@ -624,32 +866,30 @@ var i: Integer; begin s := Request.CookieFields.Values['user']; - if (s = '') or (hash(s) <> DataModule1.FDTable3.FieldByName('password') - .AsString) then + if (s = '') or (loginCheck = false) then begin WebModule1loginAction(nil, Request, Response, Handled); Exit; end; - admin.MaxRows := DataModule1.FDTable3.FieldByName('count').AsInteger; + admin.MaxRows := FDTable3.FieldByName('count').AsInteger; t := Request.QueryFields.Values['db']; if t <> '' then - DataModule1.FDTable1.Locate('dbnum', t, []); + FDTable1.Locate('dbnum', t, []); s := Request.QueryFields.Values['num']; i := StrToIntDef(s, -1); - pages(DataModule1.FDTable2.RecordCount, i); + pages(FDTable2.RecordCount, i); index.Tag := i; tagstr := '/admin'; - Self.Tag := Integer(@tagstr); - admin.header.Text := adhead.Content; + admin.header.text := adhead.Content; admin.footer.Clear; admin.footer.Add (''); admin.footer.Add(footer.Content); if t <> '' then t := '?db=' + t; - admin.footer.Add('

    –ß‚é'); - admin.Tag := DataModule1.FDTable2.RecNo; + admin.footer.Add + (Format('

    –ß‚é', + [Request.ScriptName, t])); Response.ContentType := 'text/html;charset=utf-8'; Response.Content := admin.Content; end; @@ -658,14 +898,18 @@ procedure TWebModule1.WebModule1adminsetAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var s: string; + i: Integer; begin s := Request.ContentFields.Values['pass']; - with DataModule1.FDTable3 do + with FDTable3 do begin Edit; - FieldByName('mente').AsBoolean := Request.ContentFields.Values - ['mente'] = 'on'; - if s <> '' then + if Request.ContentFields.Values['mente'] = 'on' then + i := 1 + else + i := 0; + FieldByName('mente').AsInteger := i; + if (s <> '') and (s = Request.ContentFields.Values['pass2']) then begin s := hash(s); FieldByName('password').AsString := hash(s); @@ -685,27 +929,33 @@ end; procedure TWebModule1.WebModule1alertAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var - num1, num2, i, dbnum: Integer; + num1, num2, i: Integer; + s: string; begin - dbnum := DataModule1.FDTable1.FieldByName('dbnum').AsInteger; - num1 := DataModule1.FDTable1.FieldByName('dbnum').AsInteger; - num2 := Request.QueryFields.Values['num'].ToInteger; + num1 := Request.QueryFields.Values['db'].ToInteger; + num2 := StrToIntDef(Request.QueryFields.Values['num'], -1); + if num2 = -1 then + Exit; if Request.MethodType = mtGet then begin - DataModule1.FDTable2.Locate('number', num2, []); + FDTable1.Locate('dbnum', num1); + FDTable2.Locate('number', num2); Response.ContentType := 'text/html;charset=utf-8'; Response.Content := mail.Content; end else - with DataModule1.FDTable4 do + begin + with FDTable4 do begin Last; i := FieldByName('id').AsInteger + 1; - AppendRecord([i, num1, num2, Now, Request.ContentFields.Values - ['request']]); - pages(DataModule1.FDTable2.RecNo, i); - Response.SendRedirect(Format('/index?db=%d&num=%d#%d', [dbnum, i, num2])); + s := Request.ContentFields.Values['request']; + if s = '' then + s := '(No Comment)'; + AppendRecord([i, num1, num2, Now, s]); end; + WebModule1jumpAction(nil, Request, Response, Handled); + end; end; procedure TWebModule1.WebModule1deleteAction(Sender: TObject; @@ -719,7 +969,7 @@ begin Exit; num := s.ToInteger; s := hash(Request.ContentFields.Values['password']); - with DataModule1.FDTable2 do + with FDTable2 do if Locate('number;pass', VarArrayOf([num, s])) = true then begin Edit; @@ -751,19 +1001,20 @@ end; procedure TWebModule1.WebModule1helpAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var - i, j, k: Integer; + k: Integer; s: string; begin Response.ContentType := 'text/html;charset=utf-8'; if Request.MethodType = mtPost then begin - i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;; - j := DataModule1.FDTable2.FieldByName('number').AsInteger; s := Request.ContentFields.Values['help']; - DataModule1.FDTable4.Last; - k := DataModule1.FDTable4.FieldByName('ID').AsInteger + 1; - DataModule1.FDTable4.AppendRecord([k, i, j, Now, s]); - end; + FDTable4.Last; + k := FDTable4.FieldByName('id').AsInteger + 1; + FDTable4.AppendRecord([k, -1, -1, Now, s]); + help.Tag := 1; + end + else + help.Tag := 0; Response.Content := help.Content; end; @@ -771,18 +1022,25 @@ procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var s: string; - res: TResourceStream; + p: TBytes; + res: TMemoryStream; begin - with DataModule1.FDTable5 do + with FDTable5 do begin - s := Request.ContentFields.Values['name']; + s := Request.QueryFields.Values['name']; Response.ContentType := 'image/jpeg'; - if Locate('name', s) = true then - Response.ContentStream := CreateBlobStream(FieldByName('source'), bmRead) - else if s = 'sprites.png' then + if s = 'BBS_bn.jpg' then + Response.ContentStream := TResourceStream.Create(HInstance, 'JpgImage_1', + RT_RCDATA) + else if s = 'favicon64.ico' then + Response.ContentStream := TResourceStream.Create(HInstance, + 'Icon_1', RT_ICON) + else if Locate('name', s) = true then begin - Response.ContentType := 'image/png'; - res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA); + s := FieldByName('source').AsString; + p := TNetEncoding.Base64.DecodeStringToBytes(s); + res := TMemoryStream.Create; + res.WriteBuffer(p, Length(p)); Response.ContentStream := res; end else @@ -793,49 +1051,49 @@ end; procedure TWebModule1.WebModule1indexpageAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var - int: Integer; + i: Integer; s: string; begin + Response.ContentType := 'text/html; charset="utf-8"'; + if mente = true then + Exit; s := Request.QueryFields.Values['db']; if s <> '' then - DataModule1.FDTable1.Locate('dbnum', s, []); - int := StrToIntDef(Request.QueryFields.Values['num'], -1); - pages(DataModule1.FDTable2.RecordCount, int); - index.Tag := int; + FDTable1.Locate('dbnum', s, []); + i := StrToIntDef(Request.QueryFields.Values['num'], -1); + isInfo; + pages(FDTable2.RecordCount, i); + index.Tag := i; tagstr := '/index'; - Self.Tag := Integer(@tagstr); - Response.ContentType := 'text/html; charset="utf-8"'; - if mente = false then - Response.Content := index.Content; + Response.Content := index.Content; end; procedure TWebModule1.WebModule1jumpAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var DB, s: string; - page: Integer; + i: Integer; begin DB := Request.QueryFields.Values['db']; - s := Request.ContentFields.Values['num']; - if DB <> '' then - DataModule1.FDTable1.Locate('dbnum', DB.ToInteger, []); - DataModule1.FDTable2.Locate('number', s.ToInteger, []); - page := 10; - pages(DataModule1.FDTable2.RecNo, page); - Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s])); + s := Request.QueryFields.Values['num']; + if s = '' then + s := Request.ContentFields.Values['num']; + i := 10; + pages(s.ToInteger, i); + Response.SendRedirect(Format('%s/index?db=%s&num=%d#%s', [Request.ScriptName, + DB, i, s])); end; procedure TWebModule1.WebModule1linkAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var - num: Integer; s: string; begin - s := Request.QueryFields.Values['num']; - if s = '' then + s := Request.QueryFields.Values['db']; + if (s = '') or (FDTable1.Locate('dbnum', s.ToInteger) = false) then Exit; - num := s.ToInteger; - if DataModule1.FDTable2.Locate('number', num, []) = true then + s := Request.QueryFields.Values['num']; + if (s <> '') and (FDTable2.Locate('number', s.ToInteger) = true) then begin Response.ContentType := 'text/html;charset=utf-8'; Response.Content := articles.Content; @@ -847,7 +1105,7 @@ procedure TWebModule1.WebModule1loginAction(Sender: TObject; var v: Variant; i: Integer; - s: string; + s, t: string; begin if Request.MethodType = mtGet then begin @@ -856,27 +1114,31 @@ begin Exit; end; s := Request.ContentFields.Values['record']; - v := DataModule1.FDTable1.Lookup('database', s, 'dbnum'); - if VarIsNull(v) = false then + v := FDTable1.Lookup('database', s, 'dbnum'); + t := hash(Request.ContentFields.Values['password']); + if (VarIsNull(v) = false) and (hash(t) = FDTable3.FieldByName('password') + .AsString) then begin with Response.Cookies.Add do begin Name := 'user'; - Value := hash(Request.ContentFields.Values['password']); + Value := t; Expires := Now + 14; // Secure := true; end; i := v; if s = 'master' then - Response.SendRedirect('/master') + Response.SendRedirect(Request.ScriptName + '/master') else - Response.SendRedirect('/admin?db=' + i.ToString); + Response.SendRedirect(Request.ScriptName + '/admin?db=' + i.toString); end - else + else if VarIsNull(v) = false then begin - Response.ContentType := 'text/html;charset=utf-8'; - Response.Content := login.Content; - end; + t := v; + Response.SendRedirect(Request.ScriptName + '/login?db=' + t); + end + else + Response.SendRedirect(Request.ScriptName + '/login'); end; procedure TWebModule1.WebModule1logoutAction(Sender: TObject; @@ -893,14 +1155,13 @@ begin end; s := Request.QueryFields.Values['db']; i := StrToIntDef(s, -1); - x := DataModule1.FDTable1.Locate('dbnum', i); - if (x = true) and (DataModule1.FDTable1.FieldByName('database') - .AsString = 'master') then + x := FDTable1.Locate('dbnum', i); + if (x = true) and (FDTable1.FieldByName('database').AsString = 'master') then x := false; if x = false then - Response.SendRedirect('/') + Response.SendRedirect(Request.ScriptName + '/') else - Response.SendRedirect('/index?db=' + s); + Response.SendRedirect(Request.ScriptName + '/index?db=' + s); end; procedure TWebModule1.WebModule1masterAction(Sender: TObject; @@ -909,41 +1170,38 @@ var s: string; i: Integer; begin - if hash(Request.CookieFields.Values['user']) <> - DataModule1.FDTable3.FieldByName('password').AsString then + if loginCheck = false then begin - with DataModule1.FDTable1 do - if Locate('database', 'master') = false then - AppendRecord([RecordCount, 'master']); + Request.QueryFields.Values['db'] := FDTable1.Lookup('database', + 'master', 'dbnum'); WebModule1loginAction(nil, Request, Response, Handled); Exit; end; if Request.MethodType = mtPost then begin s := Request.ContentFields.Values['delete']; - if s = 'all' then - with DataModule1.FDTable4 do - while (Bof = false) or (Eof = false) do + FDTable4.First; + with FDTable4 do + if s = 'all' then + while not((Bof = true) and (Eof = true)) do Delete - else - begin - DataModule1.FDTable4.First; - while DataModule1.FDTable4.Eof = false do - begin - i := DataModule1.FDTable4.FieldByName('dbname').AsInteger; - if DataModule1.FDTable1.Locate('dbnum', i) = true then + else + while Eof = false do begin - i := DataModule1.FDTable4.FieldByName('posnum').AsInteger; - if DataModule1.FDTable2.Locate('number', i) = false then + i := FieldByName('dbname').AsInteger; + if FDTable1.Locate('dbnum', i) = true then begin - DataModule1.FDTable4.Delete; - continue; - end; + i := FieldByName('posnum').AsInteger; + if FDTable2.Locate('number', i) = false then + Delete + else + Next; + end + else + Delete; end; - DataModule1.FDTable4.Next; - end; - end; end; + FDTable4.First; Response.ContentType := 'text/html;charset=utf-8'; Response.Content := master.Content; end; @@ -952,100 +1210,82 @@ procedure TWebModule1.WebModule1registAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var number, i: Integer; - title, na, raw, pass, kotoba, error: string; + title, na, raw, pass, kotoba, Error, temp: string; comment: TStringList; - x: Boolean; - function scan(Text: string): string; - var - reg: TRegEx; - coll: TMatchCollection; - j: Integer; - s, t: string; + review: Boolean; +begin + Error := ''; + temp := Request.ContentFields.Values['preview']; + if temp = '' then begin - Text := TNetEncoding.HTML.Encode(Text); - s := TNetEncoding.HTML.Encode('>>'); - reg := TRegEx.Create(s + '(\d+)'); - coll := reg.Matches(Text); - for j := coll.count - 1 downto 0 do + kotoba := Request.ContentFields.Values['aikotoba']; + if kotoba <> '‚°‚ñ‚«' then + Error := Error + '

    ‡Œ¾—t‚ª‚¿‚ª‚¢‚Ü‚·.'; + with Request.ContentFields do begin - Delete(Text, coll[j].index, coll[j].Length); - t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length); - result := Format - ('>>%s', - [t, t, t]); - Insert(result, Text, coll[j].index); + title := Values['title']; + na := Values['name']; + raw := Values['comment']; + Values['comment'] := ''; + pass := hash(Values['password']); end; - result := Text; - end; - -begin - error := ''; - kotoba := Request.ContentFields.Values['aikotoba']; - if kotoba <> '‚°‚ñ‚«' then - error := '

    ‡Œ¾—t‚ª‚¿‚ª‚¢‚Ü‚·.'; - with DataModule1.FDTable2 do - begin - Last; - number := FieldByName('number').AsInteger + 1; - end; - with Request.ContentFields do - begin - title := Values['title']; - na := Values['name']; - raw := Values['comment']; - pass := hash(Values['password']); - end; - if title = '' then - title := 'ƒ^ƒCƒgƒ‹‚È‚µ.'; - with Response.Cookies.Add do - begin - Name := 'name'; - if na = '' then - Value := '’N‚©‚³‚ñ.' - else - Value := na; - Expires := Now + 14; - end; - if error = '' then + if title = '' then + title := 'ƒ^ƒCƒgƒ‹‚È‚µ.'; with Response.Cookies.Add do begin - Name := 'aikotoba'; - Value := kotoba; + Name := 'name'; + if na = '' then + Value := '’N‚©‚³‚ñ.' + else + Value := na; Expires := Now + 14; end; - comment := TStringList.Create; - try - comment.Text := raw; - for i := 0 to comment.count - 1 do - begin - if Pos('ng', comment[i]) > 0 then + if Error = '' then + with Response.Cookies.Add do begin - error := error + '

    ‹ÖŽ~Œê‹å‚ªŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·.'; - break; + Name := 'aikotoba'; + Value := kotoba; + Expires := Now + 14; end; - comment[i] := '

    ' + scan(comment[i]); + comment := TStringList.Create; + try + comment.text := raw; + strsCheck(Error, comment); + temp := comment.text; + finally + comment.Free; end; - x := Request.ContentFields.Values['show'] = 'true'; - if error <> '' then - error := error + '

    ' - else if x = true then - begin - error := '

    ««ƒvƒŒƒrƒ…[««

    ' + - comment.Text; - Request.ContentFields.Values['show'] := 'false'; - Request.ContentFields.Values['preview'] := error; - Request.ContentFields.Values['raw'] := raw; - end + review := false; + end + else + review := true; + Request.ContentFields.Values['raw'] := raw; + if Error <> '' then + Request.ContentFields.Values['preview'] := '

    ' + + Error + '
    ' + else if Request.ContentFields.Values['show'] = 'true' then + begin + if review = false then + Error := '

    ««ƒvƒŒƒrƒ…[««

    ' + temp + else + Error := temp; + Request.ContentFields.Values['preview'] := Error; + Request.ContentFields.Values['show'] := 'false'; + end + else + begin + i := StrToIntDef(Request.QueryFields.Values['db'], -1); + if FDTable1.Locate('dbnum', i) = false then + Response.SendRedirect(Request.ScriptName + '/') else begin - i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger; - DataModule1.FDTable2.AppendRecord([i, number, title, na, comment.Text, - raw, Now, pass]); - Response.SendRedirect('index?db=' + i.ToString + '#article'); - Exit; + setLastArticle; + number := FDTable2.FieldByName('number').AsInteger + 1; + FDTable2.AppendRecord([i, number, title, na, temp, raw, Now, pass]); + Response.SendRedirect(Request.ScriptName + '/index?db=' + i.toString + + '#article'); end; - finally - comment.Free; + Exit; end; WebModule1indexpageAction(nil, Request, Response, Handled); end; @@ -1068,51 +1308,66 @@ procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.ContentType := 'text/html;charset=utf-8'; - DataModule1.FDTable1.First; + FDTable1.First; if mente = false then Response.Content := top.ContentFromString(top.Content); end; +procedure TWebModule1.WebModule1usrdelAction(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); +var + s, t, p: string; +begin + s := Request.QueryFields.Values['db']; + t := Request.ContentFields.Values['num']; + p := Request.ContentFields.Values['password']; + if FDTable2.Locate('dbnum;number;pass', + VarArrayOf([s.ToInteger, t.ToInteger, p])) = true then + FDTable2.Delete; + WebModule1indexpageAction(nil, Request, Response, Handled); +end; + procedure TWebModule1.WebModuleCreate(Sender: TObject); var i: Integer; - a: Variant; + s: string; begin - with DataModule1 do - begin - if FDTable1.Exists = false then - FDTable1.CreateTable; - if FDTable2.Exists = false then - FDTable2.CreateTable; - if FDTable3.Exists = false then - FDTable3.CreateTable; - if FDTable4.Exists = false then - FDTable4.CreateTable; - if FDTable5.Exists = false then - FDTable5.CreateTable; - FDTable1.Open; - FDTable2.Open; - FDTable3.Open; - FDTable4.Open; - FDTable5.Open; - FDTable1.Refresh; - FDTable3.Refresh; - FDTable5.Refresh; - end; - if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then + if FDTable1.Exists = false then + FDTable1.CreateTable; + if FDTable2.Exists = false then + FDTable2.CreateTable; + if FDTable3.Exists = false then + FDTable3.CreateTable; + if FDTable4.Exists = false then + FDTable4.CreateTable; + if FDTable5.Exists = false then + FDTable5.CreateTable; + FDTable1.Open; + FDTable2.Open; + FDTable3.Open; + FDTable4.Open; + FDTable5.Open; + FDTable1.Refresh; + FDTable3.Refresh; + FDTable4.Refresh; + FDTable5.Refresh; + if (FDTable1.Bof = true) and (FDTable1.Eof = true) then begin - DataModule1.FDTable1.AppendRecord([0, 'info']); + FDTable1.AppendRecord([0, 'info']); + FDTable1.AppendRecord([1, 'master']); for i := 1 to 10 do - DataModule1.FDTable1.AppendRecord([i, 'ŒfŽ¦”Â' + i.ToString]); + FDTable1.AppendRecord([i + 1, 'ŒfŽ¦”Â' + i.toString]); end; - if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then + if (FDTable3.Bof = true) and (FDTable3.Eof = true) then begin - a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum'); - DataModule1.FDTable3.AppendRecord + i := FDTable1.Lookup('database', 'info', 'dbnum'); + s := 'ˆ¢•Û,”nŽ­,Ž€‚Ë'; + FDTable3.AppendRecord (['‚Æ‚é‚ˁ`‚Ǎ†', '

    ‚Æ‚é‚ˁ`‚Ǎ†

    ', - false, a, 30, hash(hash('admin'))]); + 0, i, 30, hash(hash('admin')), s]); end; + admin.MaxRows := FDTable3.FieldByName('count').AsInteger; end; end.