Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (show annotations) (download) (as text)
Thu Sep 24 08:53:41 2015 UTC (8 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 20167 byte(s)
Error occurred while calculating annotation data.
Readme.txtを更新しておきました

記事を読みやすくするために変更を少し加えました

これから先FireMonkey用にAnsiStringを関数で使用しない書き方にすればMacサーバーで動かせるかもしれません
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;
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 procedure AddCookie(day: integer; const pass: string);
79 end;
80
81 var
82 WebModuleClass: TComponentClass = TWebModule1;
83
84 implementation
85
86 { %CLASSGROUP 'Vcl.Controls.TControl' }
87
88 {$R *.dfm}
89
90 procedure TWebModule1.AddCookie(day: integer; const pass: string);
91 begin
92 with Response.Cookies.Add do
93 begin
94 path := ReplaceText(FDTable2.FieldByName('home').AsAnsiString + 'admin',
95 'http', 'https');
96 Expires := Now + day;
97 Name := 'psw';
98 Value := AnsiString(pass);
99 Secure := True;
100 end;
101 end;
102
103 procedure TWebModule1.DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
104 const TagString: string; TagParams: TStrings; var ReplaceText: string);
105 begin
106 ReplaceText := FDTable1.FieldByName(TagString).AsString;
107 end;
108
109 function TWebModule1.footer(const path: string): string;
110 var
111 s1, s2, t1, t2: string;
112 home: string;
113 i, k, count: integer;
114 function linkcontent: string;
115 var
116 j, link: integer;
117 begin
118 result := '';
119 link := FDTable3.FieldByName('link').AsInteger;
120 if position > link div 2 then
121 begin
122 if (FDTable1.RecordCount - 1) div count < position + link div 2 then
123 i := FDTable1.RecordCount div count - link - position
124 else
125 i := -(link div 2)
126 end
127 else if position = -1 then
128 i := -position + FDTable1.RecordCount div count - link
129 else
130 i := -position;
131 for j := 0 to link do
132 begin
133 if FDTable1.RecordCount <= (position + i + j) * count then
134 break;
135 if position + i + j < 0 then
136 continue;
137 if i + j = 0 then
138 result := result + ' ' + IntToStr(position + 1) + ' '
139 else
140 result := result + Format(' <a href="' + home + path +
141 '?pos=%d#article">%d</a> ', [position + i + j, position + 1 + i + j]);
142 end;
143 end;
144
145 begin
146 count := FDTable3.FieldByName('count').AsInteger;
147 if path = 'admin' then
148 home := String(ReplaceText(FDTable2.FieldByName('home').AsAnsiString,
149 'http', 'https'))
150 else
151 home := FDTable2.FieldByName('home').AsString;
152 if position <= -1 then
153 begin
154 s1 := '���V%d�����L�����\��<br><center>Pages : [<b>';
155 s2 := '<<' + linkcontent + '>>] ���V</b><br></center>';
156 result := Format(s1, [count]) + s2;
157 end
158 else
159 begin
160 if position = 0 then
161 t1 := '?pos=0'
162 else
163 t1 := '?pos=' + IntToStr(position - 1);
164 i := (FDTable1.RecordCount - 1) div count;
165 if position > i then
166 position := i;
167 if position = i then
168 begin
169 t2 := '?pos=' + position.ToString+'#article';
170 k := FDTable1.RecordCount;
171 end
172 else
173 begin
174 t2 := '?pos=' + IntToStr(position + 1)+'#article';
175 k := (position + 1) * count;
176 end;
177 s1 := '%d ���� %d ������ %d �������\��<br><center>Page : [<b>';
178 s2 := '<a href="' + home + path + t1 + '#article"><<</a>' + linkcontent +
179 '<a href="' + home + path + t2 + '">>></a>] <a href="' + home + path +
180 '#article">���V</a></b></center>';
181 result := Format(s1, [FDTable1.RecordCount, position * count + 1, k]) + s2;
182 end;
183 end;
184
185 procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
186 const TagString: string; TagParams: TStrings; var ReplaceText: string);
187 var
188 i, j, count: integer;
189 s: TDataSetPageProducer;
190 begin
191 if TagString = 'home' then
192 begin
193 if (uri = 'admin') or (uri = 'login') or (TagParams.Values['ssl'] = 'true')
194 then
195 ReplaceText := String(AnsiReplaceText(FDTable2.FieldByName('home')
196 .AsAnsiString, 'http', 'https'))
197 else
198 ReplaceText := FDTable2.FieldByName('home').AsString;
199 end;
200 if (TagString = 'title') or (TagString = 'title2') then
201 ReplaceText := FDTable2.FieldByName(TagString).AsString;
202 if TagString = 'username' then
203 ReplaceText := user;
204 if TagString = 'main' then
205 begin
206 if FDTable1.RecordCount = 0 then
207 begin
208 if uri = 'index' then
209 ReplaceText := '<hr>�������e������������.<hr>';
210 end
211 else
212 begin
213 count := FDTable3.FieldByName('count').AsInteger;
214 if uri = 'admin' then
215 s := adminDS
216 else
217 s := DataSetPageProducer2;
218 if position < -1 then
219 position := -1;
220 if (position + 1) * count > FDTable1.RecordCount then
221 position := (FDTable1.RecordCount - 1) div count;
222 if position = -1 then
223 begin
224 if FDTable1.RecordCount < count then
225 j := FDTable1.RecordCount mod count
226 else
227 j := count;
228 end
229 else if FDTable1.RecordCount < (position + 1) * count then
230 j := FDTable1.RecordCount - position * count
231 else
232 j := count;
233 if position = -1 then
234 FDTable1.Last
235 else
236 FDTable1.RecNo := (position + 1) * count;
237 for i := 1 to j do
238 begin
239 ReplaceText := ReplaceText + s.Content;
240 FDTable1.Prior;
241 end;
242 ReplaceText:=ReplaceText + '<hr>';
243 end;
244 end;
245 if TagString = 'footer' then
246 if TagParams.Values['refer'] = 'true' then
247 ReplaceText := foo
248 else
249 begin
250 foo := footer(uri);
251 ReplaceText := foo;
252 end;
253 if TagString = 'text' then
254 if FDTable1.Filtered = false then
255 ReplaceText := '����������'
256 else
257 ReplaceText := '�Y������ ' + IntToStr(FDTable1.RecordCount) + ' ��' +
258 '<br><#main>';
259 if TagString = 'pass' then
260 ReplaceText := FDTable2.FieldByName('pass').AsString;
261 if TagString = 'content' then
262 ReplaceText := er;
263 if (TagString = 'mente') and (FDTable2.FieldByName('mente').AsBoolean = true)
264 then
265 ReplaceText := 'checked="checked"';
266 end;
267
268 function TWebModule1.regist(var com: string): integer;
269 var
270 i: integer;
271 begin
272 result := 1;
273 i := 1;
274 while True do
275 begin
276 i := Pos(#$D#$A, com, i);
277 if i = 0 then
278 break;
279 Delete(com, i, Length(#$D#$A));
280 Insert('<br>', com, i);
281 inc(i, 4);
282 inc(result);
283 end;
284 end;
285
286 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
287 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
288 var
289 t: string;
290 x: Boolean;
291 procedure something;
292 var
293 s: TResourceStream;
294 begin
295 x := false;
296 s := TResourceStream.Create(HInstance, 'admin', RT_RCDATA);
297 try
298 uri := 'admin';
299 Response.ContentType := 'text/html; charset=utf-8;';
300 Response.Content := PageProducer1.ContentFromStream(s)
301 finally
302 s.Free;
303 end;
304 end;
305
306 begin
307 if Request.Query = 'del' then
308 begin
309 AddCookie(-3, '');
310 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString);
311 Exit;
312 end;
313 x := True;
314 t := Request.ContentFields.Values['password'];
315 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
316 if t <> '' then
317 begin
318 AddCookie(14, t);
319 if t = FDTable2.FieldByName('pass').AsString then
320 something;
321 end
322 else if Request.CookieFields.Values['psw'] = FDTable2.FieldByName('pass').AsString
323 then
324 something;
325 if x = True then
326 Response.SendRedirect(ReplaceText(FDTable2.FieldByName('home').AsAnsiString,
327 'http', 'https') + 'login');
328 end;
329
330 procedure TWebModule1.WebModule1admindelAction(Sender: TObject;
331 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
332 var
333 i: integer;
334 begin
335 for i := 0 to Request.ContentFields.count - 1 do
336 if FDTable1.Locate('no', Request.ContentFields.ValueFromIndex[i], []) = True
337 then
338 FDTable1.Delete;
339 Response.SendRedirect(ReplaceText(FDTable2.FieldByName('home').AsAnsiString +
340 'admin', 'http', 'https'));
341 end;
342
343 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
344 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
345 var
346 s: string;
347 x: Boolean;
348 begin
349 s := Request.ContentFields.Values['pass'];
350 if FDTable2.FieldByName('pass').AsString <> s then
351 begin
352 FDTable2.Edit;
353 FDTable2.FieldByName('pass').AsString := s;
354 FDTable2.Post;
355 AddCookie(14, s);
356 end;
357 x := Request.ContentFields.Values['mente'] = 'on';
358 if FDTable2.FieldByName('mente').AsBoolean <> x then
359 begin
360 FDTable2.Edit;
361 FDTable2.FieldByName('mente').AsBoolean := x;
362 FDTable2.Post;
363 end;
364 Response.SendRedirect(ReplaceText(FDTable2.FieldByName('home').AsAnsiString +
365 'admin', 'http', 'https'));
366 end;
367
368 procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
369 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
370 var
371 s: TResourceStream;
372 begin
373 if FDTable2.FieldByName('mente').AsBoolean = True then
374 begin
375 s := TResourceStream.Create(HInstance, 'mente', RT_RCDATA);
376 try
377 uri := 'mente';
378 Response.ContentType := 'text/html; charset=utf-8;';
379 Response.Content := PageProducer1.ContentFromStream(s);
380 finally
381 s.Free;
382 end;
383 Exit;
384 end;
385 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
386 user := Request.CookieFields.Values['UID'];
387 s := TResourceStream.Create(HInstance, 'index', RT_RCDATA);
388 try
389 uri := 'index';
390 Response.ContentType := 'text/html; charset=utf-8;';
391 Response.Content := PageProducer1.ContentFromStream(s);
392 finally
393 s.Free;
394 end;
395 end;
396
397 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
398 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
399 var
400 s: TResourceStream;
401 begin
402 s := TResourceStream.Create(HInstance, 'login', RT_RCDATA);
403 try
404 uri := 'login';
405 Response.ContentType := 'text/html; charset=utf-8;';
406 Response.Content := PageProducer1.ContentFromStream(s);
407 finally
408 s.Free;
409 end;
410 end;
411
412 procedure TWebModule1.WebModule1registAction(Sender: TObject;
413 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
414 var
415 na, sub, com, pass: string;
416 no, line: integer;
417 i: integer;
418 s: TResourceStream;
419 begin
420 with Request.ContentFields do
421 begin
422 na := Values['name'];
423 sub := Values['title'];
424 com := Values['comment'];
425 pass := Values['password'];
426 end;
427 er := '';
428 line := 0;
429 if na = '' then
430 na := '�N������';
431 if sub = '' then
432 sub := '�^�C�g������';
433 if com = '' then
434 er := '�{��������������.'#$D#$A
435 else
436 line := regist(com);
437 for i := 0 to words.count - 1 do
438 if ContainsText(AnsiString(com), AnsiString(words[i])) = True then
439 begin
440 er := er + '���~����������������.';
441 break;
442 end;
443 if FDTable1.RecordCount = 0 then
444 no := 1
445 else
446 begin
447 FDTable1.Last;
448 no := FDTable1.FieldByName('no').AsInteger + 1;
449 if SecondsBetween(Now, StrToDateTime(FDTable1.FieldByName('date').AsString))
450 < time then
451 er := '����������������.';
452 end;
453 if er <> '' then
454 begin
455 Response.ContentType := 'text/html; charset=utf-8;';
456 s := TResourceStream.Create(HInstance, 'regist', RT_RCDATA);
457 try
458 Response.Content := PageProducer1.ContentFromStream(s);
459 finally
460 s.Free;
461 end;
462 Exit;
463 end;
464 FDTable1.AppendRecord([na, no, DateTimeToStr(Now), sub, com, pass, line]);
465 with Response.Cookies.Add do
466 begin
467 path := FDTable2.FieldByName('home').AsAnsiString;
468 Name := 'UID';
469 Value := AnsiString(na);
470 Expires := Now + 1;
471 end;
472 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString+'index#article');
473 end;
474
475 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
476 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
477 var
478 s: TStringList;
479 t1, t2, t3: string;
480 i, j: integer;
481 m: TResourceStream;
482 begin
483 t1 := Request.ContentFields.Values['filter'];
484 t3 := '';
485 s := TStringList.Create;
486 try
487 s.DelimitedText := Request.ContentFields.Values['word1'];
488 for i := 0 to s.count - 1 do
489 begin
490 t2 := Trim(s[i]);
491 if t2 = '' then
492 continue;
493 if t3 <> '' then
494 t3 := t3 + ' and ';
495 t3 := t3 + t1 + ' LIKE ''%' + t2 + '%''';
496 end;
497 finally
498 s.Free;
499 end;
500 if t3 = '' then
501 begin
502 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
503 try
504 Response.ContentType := 'text/html; charset=utf-8;';
505 Response.Content := PageProducer1.ContentFromStream(m);
506 finally
507 m.Free;
508 end;
509 Exit;
510 end;
511 FDTable1.Filter := t3;
512 FDTable1.Filtered := True;
513 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
514 try
515 j := 0;
516 for i := 1 to FDTable1.RecordCount - 1 do
517 begin
518 inc(j, FDTable1.FieldByName('line').AsInteger);
519 FDTable1.Next;
520 end;
521 PageProducer1.HTMLDoc.LoadFromStream(m);
522 Response.ContentType := 'text/html; charset=utf-8;';
523 if (t3 <> '') and (j > FDTable3.FieldByName('line').AsInteger) then
524 begin
525 t1 := PageProducer1.Content;
526 i := Pos('<#main>', t1);
527 Delete(t1, i, Length('<#main>'));
528 Response.Content := t1 + Format('�\���s����%d�s��������������.',
529 [FDTable3.FieldByName('line').AsInteger]);
530 end
531 else
532 Response.Content := PageProducer1.ContentFromString
533 (PageProducer1.Content);
534 finally
535 FDTable1.Filtered := false;
536 m.Free;
537 end;
538 end;
539
540 procedure TWebModule1.WebModule1setupAction(Sender: TObject;
541 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
542 var
543 i: integer;
544 s: string;
545 begin
546 for i := 0 to Request.ContentFields.count - 1 do
547 begin
548 s := Request.ContentFields.Names[i];
549 if s <> 'home' then
550 FDTable2.FieldByName(s).AsString :=
551 Request.ContentFields.ValueFromIndex[i];
552 end;
553 Handled := false;
554 end;
555
556 procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
557 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
558 var
559 s: string;
560 i: integer;
561 begin
562 i := StrToIntDef(Request.ContentFields.Values['number'], 0);
563 if (i > 0) and (FDTable1.Locate('no', i, []) = True) then
564 begin
565 s := FDTable1.FieldByName('pass').AsString;
566 if (s <> '') and (s = Request.ContentFields.Values['password']) then
567 FDTable1.Delete;
568 end;
569 Handled := false;
570 end;
571
572 procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
573 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
574 var
575 s: string;
576 m: TResourceStream;
577 begin
578 if FDTable1.Exists = false then
579 FDTable1.CreateTable(false, [tpTable]);
580 if FDTable2.Exists = false then
581 begin
582 FDTable2.CreateTable(false, [tpTable]);
583 FDTable2.Active := True;
584 {
585 if (Request.ServerPort = 80) or (Request.ServerPort = 443) then
586 s := 'http://' + String(Request.Host)
587 else
588 s := 'http://' + String(Request.Host) + ':' +
589 IntToStr(Request.ServerPort);
590 }
591 s := 'http://' + String(Request.Host);
592 if Request.ScriptName <> '' then
593 s := s + String(Request.ScriptName) + '/'
594 else
595 s := s + '/';
596 FDTable2.AppendRecord([s, 'pbbs clone',
597 '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
598 'admin', '����,����,����', false]);
599 m := TResourceStream.Create(HInstance, 'setup', RT_RCDATA);
600 try
601 uri := 'setup';
602 PageProducer1.HTMLDoc.LoadFromStream(m);
603 Response.ContentType := 'text/html; charset=utf-8;';
604 Response.Content := PageProducer1.Content;
605 finally
606 m.Free;
607 end;
608 Handled := True;
609 end
610 else
611 FDTable2.Active := True;
612 if FDTable3.Exists = false then
613 begin
614 FDTable3.CreateTable(false, [tpTable]);
615 FDTable3.Active := True;
616 FDTable3.AppendRecord([5, 20, 500]);
617 end
618 else
619 FDTable3.Active := True;
620 words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
621 FDTable1.Active := True;
622 if FileExists('maintenance.htm') = True then
623 begin
624 PageProducer1.HTMLFile := 'maintenance.htm';
625 Response.ContentType := 'text/html; charset=utf-8;';
626 Response.Content := PageProducer1.Content;
627 Handled := True;
628 end;
629 {
630 t:='';
631 ssl:=TStringList.Create;
632 try
633 ssl.Add('/login');
634 ssl.Add('/admin');
635 if (ssl.IndexOf(Request.PathInfo) > -1)and(StartsText('https',FDTable2.FieldByName('home').AsString) = false) then
636 begin
637 s:=FDTable2.FieldByName('home').AsAnsiString;
638 Delete(s,Length(s),1);
639 t:='https'+Copy(s,5,Length(s))+Request.PathInfo;
640 end;
641 finally
642 ssl.Free;
643 end;
644 if t <> '' then
645 begin
646 Response.SendRedirect(t);
647 Exit;
648 end;
649 }
650 end;
651
652 procedure TWebModule1.WebModuleCreate(Sender: TObject);
653 begin
654 time := 1;
655 words := TStringList.Create;
656 end;
657
658 procedure TWebModule1.WebModuleDestroy(Sender: TObject);
659 begin
660 words.Free;
661 end;
662
663 end.
664

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