Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations) (download) (as text)
Wed Sep 23 09:26:54 2015 UTC (8 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 17763 byte(s)
危険なクッキー送信を訂正

デバッグ環境をひとまず無視(xamppで開発しています)

ログアウトさせる機能実装(オートログアウトはやめました)

※注意
 リソースにhtmlファイルを含めたので.res, .dresファイルをcgiファイルと同じフォルダにおいてください。

 sqliteファイル(.sdb)にパーミッションを設定しないと不正アクセスされます。
1 yamat0jp 1 unit WebModuleUnit1;
2    
3     interface
4    
5     uses System.SysUtils, System.Classes, Web.HTTPApp, FireDAC.Stan.Intf,
6     FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
7     FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
8     FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys,
9     FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, Data.DB,
10     FireDAC.Comp.Client, FireDAC.Comp.DataSet, Web.HTTPProd, Web.DSProd,
11     AnsiStrings, System.DateUtils, System.Types;
12    
13     type
14     TWebModule1 = class(TWebModule)
15     FDTable1: TFDTable;
16     FDConnection1: TFDConnection;
17     FDTable2: TFDTable;
18     FDTable2home: TWideMemoField;
19     FDTable2title: TWideMemoField;
20     FDTable2title2: TWideMemoField;
21     FDTable2pass: TWideMemoField;
22     PageProducer1: TPageProducer;
23     DataSetPageProducer2: TDataSetPageProducer;
24     FDTable1name: TWideMemoField;
25     FDTable1no: TIntegerField;
26     FDTable1date: TWideMemoField;
27     FDTable1sub: TWideMemoField;
28     FDTable1com: TWideMemoField;
29     FDTable1pass: TWideMemoField;
30     adminDS: TDataSetPageProducer;
31     FDTable2ngwords: TWideMemoField;
32     FDTable3: TFDTable;
33     FDTable3link: TIntegerField;
34     FDTable3count: TIntegerField;
35     FDTable1line: TIntegerField;
36     FDTable3line: TIntegerField;
37     procedure WebModule1DefaultHandlerAction(Sender: TObject;
38     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
39     procedure PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
40     const TagString: string; TagParams: TStrings; var ReplaceText: string);
41     procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
42     Response: TWebResponse; var Handled: Boolean);
43     procedure DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
44     const TagString: string; TagParams: TStrings; var ReplaceText: string);
45     procedure WebModule1userdelAction(Sender: TObject; Request: TWebRequest;
46     Response: TWebResponse; var Handled: Boolean);
47     procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
48     Response: TWebResponse; var Handled: Boolean);
49     procedure WebModule1admindelAction(Sender: TObject; Request: TWebRequest;
50     Response: TWebResponse; var Handled: Boolean);
51     procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
52     Response: TWebResponse; var Handled: Boolean);
53     procedure WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest;
54     Response: TWebResponse; var Handled: Boolean);
55     procedure WebModule1setupAction(Sender: TObject; Request: TWebRequest;
56     Response: TWebResponse; var Handled: Boolean);
57     procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
58     Response: TWebResponse; var Handled: Boolean);
59     procedure WebModuleCreate(Sender: TObject);
60     procedure WebModuleDestroy(Sender: TObject);
61     private
62     { private ���� }
63     public
64     { public ���� }
65     user: string;
66     time: Int64;
67     words: TStringList;
68     position: integer;
69     uri: string;
70     foo: string;
71     function footer(const path: string): string;
72     function regist(var com: string): integer;
73     end;
74    
75     var
76     WebModuleClass: TComponentClass = TWebModule1;
77    
78     implementation
79    
80     { %CLASSGROUP 'Vcl.Controls.TControl' }
81    
82     {$R *.dfm}
83    
84     procedure TWebModule1.DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
85     const TagString: string; TagParams: TStrings; var ReplaceText: string);
86     begin
87     ReplaceText := FDTable1.FieldByName(TagString).AsString;
88     end;
89    
90     function TWebModule1.footer(const path: string): string;
91     var
92     s1, s2, t1, t2: string;
93     home: string;
94     i, k, count: integer;
95     function linkcontent: string;
96     var
97     j, link: integer;
98     begin
99     result := '';
100     link := FDTable3.FieldByName('link').AsInteger;
101     if position > link div 2 then
102     begin
103     if (FDTable1.RecordCount - 1) div count < position + link div 2 then
104     i := FDTable1.RecordCount div count - link - position
105     else
106     i := -(link div 2)
107     end
108     else if position = -1 then
109     i := -position + FDTable1.RecordCount div count - link
110     else
111     i := -position;
112     for j := 0 to link do
113     begin
114     if FDTable1.RecordCount <= (position + i + j) * count then
115     break;
116     if position + i + j < 0 then
117     continue;
118     if i + j = 0 then
119     result := result + ' ' + IntToStr(position + 1) + ' '
120     else
121     result := result + Format(' <a href="' + home + path +
122     '?pos=%d">%d</a> ', [position + i + j, position + 1 + i + j]);
123     end;
124     end;
125    
126     begin
127     count := FDTable3.FieldByName('count').AsInteger;
128     if path = 'admin' then
129     home := String(ReplaceText(FDTable2.FieldByName('home').AsAnsiString,
130     'http', 'https'))
131     else
132     home := FDTable2.FieldByName('home').AsString;
133     if position <= -1 then
134     begin
135     s1 := '���V%d�����L�����\��<br><center>Pages : [<b>';
136     s2 := '<<' + linkcontent + '>>] ���V</b><br></center>';
137     result := Format(s1, [count]) + s2;
138     end
139     else
140     begin
141     if position = 0 then
142     t1 := '?pos=0'
143     else
144     t1 := '?pos=' + IntToStr(position - 1);
145     i := (FDTable1.RecordCount - 1) div count;
146     if position > i then
147     position := i;
148     if position = i then
149     begin
150     t2 := '?pos=' + IntToStr(position);
151     k := FDTable1.RecordCount;
152     end
153     else
154     begin
155     t2 := '?pos=' + IntToStr(position + 1);
156     k := (position + 1) * count;
157     end;
158     s1 := '%d ���� %d ������ %d �������\��<br><center>Page : [<b>';
159     s2 := '<a href="' + home + path + t1 + '"><<</a>' + linkcontent +
160     '<a href="' + home + path + t2 + '">>></a>] <a href="' + home + path +
161     '">���V</a></b></center>';
162     result := Format(s1, [FDTable1.RecordCount, position * count + 1, k]) + s2;
163     end;
164     end;
165    
166     procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
167     const TagString: string; TagParams: TStrings; var ReplaceText: string);
168     var
169     i, j, count: integer;
170     s: TDataSetPageProducer;
171     begin
172     if TagString = 'home' then
173     begin
174     if (uri = 'admin')or(uri = 'login') then
175     ReplaceText := String(AnsiReplaceText(FDTable2.FieldByName('home')
176     .AsAnsiString, 'http', 'https'))
177     else
178     ReplaceText := FDTable2.FieldByName('home').AsString;
179     end;
180     if (TagString = 'title') or (TagString = 'title2') then
181     ReplaceText := FDTable2.FieldByName(TagString).AsString;
182     if TagString = 'username' then
183     ReplaceText := user;
184     if TagString = 'main' then
185     begin
186     if FDTable1.RecordCount = 0 then
187     begin
188     if uri = 'index' then
189     ReplaceText := '�������e������������.';
190     end
191     else
192     begin
193     count := FDTable3.FieldByName('count').AsInteger;
194     if uri = 'admin' then
195     s := adminDS
196     else
197     s := DataSetPageProducer2;
198     if position < -1 then
199     position := -1;
200     if (position + 1) * count > FDTable1.RecordCount then
201     position := (FDTable1.RecordCount - 1) div count;
202     if position = -1 then
203     begin
204     if FDTable1.RecordCount < count then
205     j := FDTable1.RecordCount mod count
206     else
207     j := count;
208     end
209     else if FDTable1.RecordCount < (position + 1) * count then
210     j := FDTable1.RecordCount - position * count
211     else
212     j := count;
213     if position = -1 then
214     FDTable1.Last
215     else
216     FDTable1.RecNo := (position + 1) * count;
217     for i := 1 to j do
218     begin
219     ReplaceText := ReplaceText + s.Content;
220     FDTable1.Prior;
221     end;
222     end;
223     end;
224     if TagString = 'footer' then
225     if TagParams.Values['refer'] = 'true' then
226     ReplaceText := foo
227     else
228     begin
229     foo := footer(uri);
230     ReplaceText := foo;
231     end;
232     if TagString = 'text' then
233     if FDTable1.Filtered = false then
234     ReplaceText := '����������'
235     else
236     ReplaceText := '�Y������ ' + IntToStr(FDTable1.RecordCount) + ' ��' +
237     '<br><#main>';
238     end;
239    
240     function TWebModule1.regist(var com: string): integer;
241     var
242     i: integer;
243     begin
244     result := 1;
245     i := 1;
246     while True do
247     begin
248     i := Pos(#$D#$A, com, i);
249     if i = 0 then
250     break;
251     Delete(com, i, Length(#$D#$A));
252     Insert('<br>', com, i);
253     inc(i, 4);
254     inc(result);
255     end;
256     end;
257    
258     procedure TWebModule1.WebModule1adminAction(Sender: TObject;
259     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
260     var
261     s: string;
262     x: Boolean;
263     procedure something;
264     var
265     s: TResourceStream;
266     begin
267     x := false;
268     s := TResourceStream.Create(HInstance,'admin',RT_RCDATA);
269     try
270     uri:='admin';
271     PageProducer1.HTMLDoc.LoadFromStream(s);
272     Response.ContentType := 'text/html; charset=utf-8;';
273     Response.Content := PageProducer1.Content;
274     finally
275     s.Free;
276     end;
277     end;
278     procedure AddCookie(day: integer);
279     begin
280     with Response.Cookies.Add do
281     begin
282     Path := ReplaceText(FDTable2.FieldByName('home').AsAnsiString + 'admin','http','https');
283     Expires := Now + day;
284     Name := 'psw';
285     Value := AnsiString(s);
286     Secure := True;
287     end;
288     end;
289    
290     begin
291     if Request.Query = 'del' then
292     begin
293     AddCookie(-3);
294     Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString);
295     Exit;
296     end;
297     x := True;
298     s := Request.ContentFields.Values['password'];
299     position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
300     if s <> '' then
301     begin
302     AddCookie(1);
303     if s = FDTable2.FieldByName('pass').AsString then
304     something;
305     end
306     else if Request.CookieFields.Values['psw'] = FDTable2.FieldByName('pass').AsString
307     then
308     something;
309     if x = True then
310     Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString + 'login');
311     end;
312    
313     procedure TWebModule1.WebModule1admindelAction(Sender: TObject;
314     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
315     var
316     i: integer;
317     begin
318     for i := 0 to Request.ContentFields.count - 1 do
319     if FDTable1.Locate('no', Request.ContentFields.ValueFromIndex[i], []) = True
320     then
321     FDTable1.Delete;
322     Response.SendRedirect(ReplaceText(FDTable2.FieldByName('home').AsAnsiString +
323     'admin', 'http', 'https'));
324     end;
325    
326     procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
327     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
328     var
329     s: TResourceStream;
330     begin
331     position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
332     user := Request.CookieFields.Values['UID'];
333     s:=TResourceStream.Create(HInstance,'index',RT_RCDATA);
334     try
335     uri:='index';
336     PageProducer1.HTMLDoc.LoadFromStream(s);
337     Response.ContentType := 'text/html; charset=utf-8;';
338     Response.Content := PageProducer1.Content;
339     finally
340     s.Free;
341     end;
342     end;
343    
344     procedure TWebModule1.WebModule1loginAction(Sender: TObject;
345     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
346     var
347     s: TResourceStream;
348     begin
349     s:=TResourceStream.Create(HInstance,'login',RT_RCDATA);
350     try
351     uri:='login';
352     PageProducer1.HTMLDoc.LoadFromStream(s);
353     Response.ContentType := 'text/html; charset=utf-8;';
354     Response.Content := PageProducer1.Content;
355     finally
356     s.Free;
357     end;
358     end;
359    
360     procedure TWebModule1.WebModule1registAction(Sender: TObject;
361     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
362     var
363     na, sub, com, pass: string;
364     no, line: integer;
365     i: integer;
366     begin
367     with Request.ContentFields do
368     begin
369     na := Values['name'];
370     sub := Values['title'];
371     com := Values['comment'];
372     pass := Values['password'];
373     end;
374     line:=0;
375     if na = '' then
376     na := '�N������';
377     if sub = '' then
378     sub := '�^�C�g������';
379     if com = '' then
380     Response.Content := '�{��������������.'#$D#$A
381     else
382     line := regist(com);
383     for i := 0 to words.count - 1 do
384     if ContainsText(AnsiString(com), AnsiString(words[i])) = True then
385     begin
386     Response.Content := Response.Content + '���~����������������.';
387     break;
388     end;
389     if FDTable1.RecordCount = 0 then
390     no := 1
391     else
392     begin
393     FDTable1.Last;
394     no := FDTable1.FieldByName('no').AsInteger + 1;
395     if SecondsBetween(Now, StrToDateTime(FDTable1.FieldByName('date').AsString))
396     < time then
397     Response.Content := '����������������.';
398     end;
399     if Response.Content <> '' then
400     begin
401     Response.ContentType := 'text/plain;';
402     Exit;
403     end;
404     FDTable1.AppendRecord([na, no, DateTimeToStr(Now), sub, com, pass, line]);
405     with Response.Cookies.Add do
406     begin
407     path := FDTable2.FieldByName('home').AsAnsiString;
408     Name := 'UID';
409     Value := AnsiString(na);
410     Expires := Now + 1;
411     end;
412     Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString);
413     end;
414    
415     procedure TWebModule1.WebModule1searchAction(Sender: TObject;
416     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
417     var
418     s: TStringList;
419     t1, t2, t3: string;
420     i, j: integer;
421     m: TResourceStream;
422     begin
423     t1 := Request.ContentFields.Values['filter'];
424     t3 := '';
425     s := TStringList.Create;
426     try
427     s.DelimitedText := Request.ContentFields.Values['word1'];
428     for i := 0 to s.count - 1 do
429     begin
430     t2 := Trim(s[i]);
431     if t2 = '' then
432     continue;
433     if t3 <> '' then
434     t3 := t3 + ' and ';
435     t3 := t3 + t1 + ' LIKE ''%' + t2 + '%''';
436     end;
437     finally
438     s.Free;
439     end;
440     if t3 = '' then
441     begin
442     m:=TResourceStream.Create(HInstance,'search',RT_RCDATA);
443     try
444     PageProducer1.HTMLDoc.LoadFromStream(m);
445     Response.ContentType := 'text/html; charset=utf-8;';
446     Response.Content := PageProducer1.Content;
447     finally
448     m.Free;
449     end;
450     Exit;
451     end;
452     FDTable1.Filter := t3;
453     FDTable1.Filtered := True;
454     m:=TResourceStream.Create(HInstance,'search',RT_RCDATA);
455     try
456     j := 0;
457     for i := 1 to FDTable1.RecordCount - 1 do
458     begin
459     inc(j, FDTable1.FieldByName('line').AsInteger);
460     FDTable1.Next;
461     end;
462     PageProducer1.HTMLDoc.LoadFromStream(m);
463     Response.ContentType := 'text/html; charset=utf-8;';
464     if (t3 <> '') and (j > FDTable3.FieldByName('line').AsInteger) then
465     begin
466     t1 := PageProducer1.Content;
467     i := Pos('<#main>', t1);
468     Delete(t1, i, Length('<#main>'));
469     Response.Content := t1 + Format('�\���s����%d�s��������������.',
470     [FDTable3.FieldByName('line').AsInteger]);
471     end
472     else
473     Response.Content := PageProducer1.ContentFromString
474     (PageProducer1.Content);
475     finally
476     FDTable1.Filtered := false;
477     m.Free;
478     end;
479     end;
480    
481     procedure TWebModule1.WebModule1setupAction(Sender: TObject;
482     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
483     var
484     i: integer;
485     s: string;
486     begin
487     for i := 0 to Request.ContentFields.count - 1 do
488     begin
489     s := Request.ContentFields.Names[i];
490     if s <> 'home' then
491     FDTable2.FieldByName(s).AsString :=
492     Request.ContentFields.ValueFromIndex[i];
493     end;
494     Handled := false;
495     end;
496    
497     procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
498     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
499     var
500     s: string;
501     i: integer;
502     begin
503     i := StrToIntDef(Request.ContentFields.Values['number'], 0);
504     if (i > 0) and (FDTable1.Locate('no', i, []) = True) then
505     begin
506     s := FDTable1.FieldByName('pass').AsString;
507     if (s <> '') and (s = Request.ContentFields.Values['password']) then
508     FDTable1.Delete;
509     end;
510     Handled := false;
511     end;
512    
513     procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
514     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
515     var
516     s: string;
517     m: TResourceStream;
518     begin
519     if FDTable1.Exists = false then
520     FDTable1.CreateTable(false, [tpTable]);
521     if FDTable2.Exists = false then
522     begin
523     FDTable2.CreateTable(false, [tpTable]);
524     FDTable2.Active := True;
525     {
526     if (Request.ServerPort = 80) or (Request.ServerPort = 443) then
527     s := 'http://' + String(Request.Host)
528     else
529     s := 'http://' + String(Request.Host) + ':' +
530     IntToStr(Request.ServerPort);
531     }
532     s:='http://'+String(Request.Host);
533     if Request.ScriptName <> '' then
534     s := s + String(Request.ScriptName) + '/'
535     else
536     s := s + '/';
537     FDTable2.AppendRecord([s, 'pbbs clone',
538     '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
539     'admin', '����,����,����']);
540     m:=TResourceStream.Create(HInstance,'setup',RT_RCDATA);
541     try
542     uri:='setup';
543     PageProducer1.HTMLDoc.LoadFromStream(m);
544     Response.ContentType := 'text/html; charset=utf-8;';
545     Response.Content := PageProducer1.Content;
546     finally
547     m.Free;
548     end;
549     Handled := True;
550     end
551     else
552     FDTable2.Active := True;
553     if FDTable3.Exists = false then
554     begin
555     FDTable3.CreateTable(false, [tpTable]);
556     FDTable3.Active := True;
557     FDTable3.AppendRecord([5, 20, 500]);
558     end
559     else
560     FDTable3.Active := True;
561     words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
562     FDTable1.Active := True;
563     if FileExists('maintenance.htm') = True then
564     begin
565     PageProducer1.HTMLFile := 'maintenance.htm';
566     Response.ContentType := 'text/html; charset=utf-8;';
567     Response.Content := PageProducer1.Content;
568     Handled := True;
569     end;
570     end;
571    
572     procedure TWebModule1.WebModuleCreate(Sender: TObject);
573     begin
574     time := 1;
575     words := TStringList.Create;
576     end;
577    
578     procedure TWebModule1.WebModuleDestroy(Sender: TObject);
579     begin
580     words.Free;
581     end;
582    
583     end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26