Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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