Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (show annotations) (download) (as text)
Sat Sep 17 01:05:29 2016 UTC (7 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 19439 byte(s)
設定画面に問題がありました。それからポートは設定変更の必要はありませんでした。
ソースコードに掲載されているのはスタンドアローンアプリケーションのみでした。
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 ReplaceText := 'http://' + FDTable2.FieldByName('home').AsString;
176 if (TagString = 'title') or (TagString = 'title2') then
177 ReplaceText := FDTable2.FieldByName(TagString).AsString;
178 if TagString = 'username' then
179 ReplaceText := user;
180 if TagString = 'main' then
181 begin
182 if FDTable1.RecordCount = 0 then
183 begin
184 if uri = 'index' then
185 ReplaceText := '<hr>�������e������������.<hr>';
186 end
187 else
188 begin
189 count := FDTable3.FieldByName('count').AsInteger;
190 if uri = 'admin' then
191 s := adminDS
192 else
193 s := DataSetPageProducer2;
194 if position < -1 then
195 position := -1;
196 if (position + 1) * count > FDTable1.RecordCount then
197 position := (FDTable1.RecordCount - 1) div count;
198 if position = -1 then
199 begin
200 if FDTable1.RecordCount < count then
201 j := FDTable1.RecordCount mod count
202 else
203 j := count;
204 end
205 else if FDTable1.RecordCount < (position + 1) * count then
206 j := FDTable1.RecordCount - position * count
207 else
208 j := count;
209 if position = -1 then
210 FDTable1.Last
211 else
212 FDTable1.RecNo := (position + 1) * count;
213 for i := 1 to j do
214 begin
215 ReplaceText := ReplaceText + s.Content;
216 FDTable1.Prior;
217 end;
218 ReplaceText := ReplaceText + '<hr>';
219 end;
220 end;
221 if TagString = 'footer' then
222 if TagParams.Values['refer'] = 'true' then
223 ReplaceText := foo
224 else
225 begin
226 foo := footer(uri);
227 ReplaceText := foo;
228 end;
229 if TagString = 'text' then
230 if FDTable1.Filtered = false then
231 ReplaceText := '����������'
232 else
233 ReplaceText := '�Y������ ' + IntToStr(FDTable1.RecordCount) + ' ��' +
234 '<br><#main>';
235 if TagString = 'pass' then
236 ReplaceText := FDTable2.FieldByName('pass').AsString;
237 if TagString = 'content' then
238 ReplaceText := er;
239 if (TagString = 'mente') and (FDTable2.FieldByName('mente').AsBoolean = True)
240 then
241 ReplaceText := 'checked="checked"';
242 end;
243
244 function TWebModule1.regist(var com: string): integer;
245 var
246 i: integer;
247 begin
248 result := 1;
249 i := 1;
250 while True do
251 begin
252 i := Pos(#$D#$A, com, i);
253 if i = 0 then
254 break;
255 Delete(com, i, Length(#$D#$A));
256 Insert('<br>', com, i);
257 inc(i, 4);
258 inc(result);
259 end;
260 end;
261
262 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
263 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
264 var
265 t: string;
266 x: Boolean;
267 procedure something;
268 var
269 s: TResourceStream;
270 begin
271 x := false;
272 s := TResourceStream.Create(HInstance, 'admin', RT_RCDATA);
273 try
274 uri := 'admin';
275 Response.ContentType := 'text/html; charset=utf-8;';
276 Response.Content := PageProducer1.ContentFromStream(s)
277 finally
278 s.Free;
279 end;
280 end;
281 procedure addcookie(day: integer; pass: string);
282 begin
283 with Response.Cookies.Add do
284 begin
285 path := AnsiString('/admin');
286 Expires := Now + day;
287 Name := 'psw';
288 Value := AnsiString(pass);
289 end;
290 end;
291
292 begin
293 if Request.Query = 'del' then
294 begin
295 addcookie(-3, '');
296 Response.SendRedirect('/index');
297 Exit;
298 end;
299 x := True;
300 t := Request.ContentFields.Values['password'];
301 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
302 if t <> '' then
303 begin
304 addcookie(14, t);
305 if t = FDTable2.FieldByName('pass').AsString then
306 something;
307 end
308 else if Request.CookieFields.Values['psw'] = FDTable2.FieldByName('pass').AsString
309 then
310 something;
311 if x = True then
312 Response.SendRedirect('/login');
313 end;
314
315 procedure TWebModule1.WebModule1admindelAction(Sender: TObject;
316 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
317 var
318 i: integer;
319 begin
320 for i := 0 to Request.ContentFields.count - 1 do
321 if FDTable1.Locate('no', Request.ContentFields.ValueFromIndex[i], []) = True
322 then
323 FDTable1.Delete;
324 Response.SendRedirect('/admin');
325 end;
326
327 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
328 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
329 var
330 s: string;
331 x: Boolean;
332 begin
333 s := Request.ContentFields.Values['pass'];
334 if FDTable2.FieldByName('pass').AsString <> s then
335 begin
336 FDTable2.Edit;
337 FDTable2.FieldByName('pass').AsString := s;
338 FDTable2.Post;
339 with Response.Cookies.Add do
340 begin
341 path := AnsiString('/admin');
342 Expires := Now + 14;
343 Name := 'psw';
344 Value := AnsiString(s);
345 end;
346 end;
347 x := Request.ContentFields.Values['mente'] = 'on';
348 if FDTable2.FieldByName('mente').AsBoolean <> x then
349 begin
350 FDTable2.Edit;
351 FDTable2.FieldByName('mente').AsBoolean := x;
352 FDTable2.Post;
353 end;
354 Response.SendRedirect('/admin');
355 end;
356
357 procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
358 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
359 var
360 s: TResourceStream;
361 begin
362 if FDTable2.FieldByName('mente').AsBoolean = True then
363 begin
364 s := TResourceStream.Create(HInstance, 'mente', RT_RCDATA);
365 try
366 uri := 'mente';
367 Response.ContentType := 'text/html; charset=utf-8;';
368 Response.Content := PageProducer1.ContentFromStream(s);
369 finally
370 s.Free;
371 end;
372 Exit;
373 end;
374 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
375 user := Request.CookieFields.Values['UID'];
376 s := TResourceStream.Create(HInstance, 'index', RT_RCDATA);
377 try
378 uri := 'index';
379 Response.ContentType := 'text/html; charset=utf-8;';
380 Response.Content := PageProducer1.ContentFromStream(s);
381 finally
382 s.Free;
383 end;
384 end;
385
386 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
387 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
388 var
389 s: TResourceStream;
390 begin
391 s := TResourceStream.Create(HInstance, 'login', RT_RCDATA);
392 try
393 uri := 'login';
394 Response.ContentType := 'text/html; charset=utf-8;';
395 Response.Content := PageProducer1.ContentFromStream(s);
396 finally
397 s.Free;
398 end;
399 end;
400
401 procedure TWebModule1.WebModule1registAction(Sender: TObject;
402 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
403 var
404 na, sub, com, pass: string;
405 no, line: integer;
406 i: integer;
407 s: TResourceStream;
408 begin
409 with Request.ContentFields do
410 begin
411 na := Values['name'];
412 sub := Values['title'];
413 com := Values['comment'];
414 pass := Values['password'];
415 end;
416 er := '';
417 line := 0;
418 if na = '' then
419 na := '�N������';
420 if sub = '' then
421 sub := '�^�C�g������';
422 if com = '' then
423 er := '�{��������������.'#$D#$A
424 else
425 line := regist(com);
426 for i := 0 to words.count - 1 do
427 if ContainsText(AnsiString(com), AnsiString(words[i])) = True then
428 begin
429 er := er + '���~����������������.';
430 break;
431 end;
432 if FDTable1.RecordCount = 0 then
433 no := 1
434 else
435 begin
436 FDTable1.Last;
437 no := FDTable1.FieldByName('no').AsInteger + 1;
438 if SecondsBetween(Now, StrToDateTime(FDTable1.FieldByName('date').AsString))
439 < time then
440 er := '����������������.';
441 end;
442 if er <> '' then
443 begin
444 Response.ContentType := 'text/html; charset=utf-8;';
445 s := TResourceStream.Create(HInstance, 'regist', RT_RCDATA);
446 try
447 Response.Content := PageProducer1.ContentFromStream(s);
448 finally
449 s.Free;
450 end;
451 Exit;
452 end;
453 FDTable1.AppendRecord([na, no, DateTimeToStr(Now), sub, com, pass, line]);
454 with Response.Cookies.Add do
455 begin
456 path := FDTable2.FieldByName('home').AsAnsiString;
457 Name := 'UID';
458 Value := AnsiString(na);
459 Expires := Now + 1;
460 end;
461 Response.SendRedirect('/index#article');
462 end;
463
464 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
465 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
466 var
467 s: TStringList;
468 t1, t2, t3: string;
469 i, j: integer;
470 m: TResourceStream;
471 begin
472 t1 := Request.ContentFields.Values['filter'];
473 t3 := '';
474 s := TStringList.Create;
475 try
476 s.DelimitedText := Request.ContentFields.Values['word1'];
477 for i := 0 to s.count - 1 do
478 begin
479 t2 := Trim(s[i]);
480 if t2 = '' then
481 continue;
482 if t3 <> '' then
483 t3 := t3 + ' and ';
484 t3 := t3 + t1 + ' LIKE ''%' + t2 + '%''';
485 end;
486 finally
487 s.Free;
488 end;
489 if t3 = '' then
490 begin
491 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
492 try
493 Response.ContentType := 'text/html; charset=utf-8;';
494 Response.Content := PageProducer1.ContentFromStream(m);
495 finally
496 m.Free;
497 end;
498 Exit;
499 end;
500 FDTable1.Filter := t3;
501 FDTable1.Filtered := True;
502 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
503 try
504 j := 0;
505 for i := 1 to FDTable1.RecordCount - 1 do
506 begin
507 inc(j, FDTable1.FieldByName('line').AsInteger);
508 FDTable1.Next;
509 end;
510 PageProducer1.HTMLDoc.LoadFromStream(m);
511 Response.ContentType := 'text/html; charset=utf-8;';
512 if (t3 <> '') and (j > FDTable3.FieldByName('line').AsInteger) then
513 begin
514 t1 := PageProducer1.Content;
515 i := Pos('<#main>', t1);
516 Delete(t1, i, Length('<#main>'));
517 Response.Content := t1 + Format('�\���s����%d�s��������������.',
518 [FDTable3.FieldByName('line').AsInteger]);
519 end
520 else
521 Response.Content := PageProducer1.ContentFromString
522 (PageProducer1.Content);
523 finally
524 FDTable1.Filtered := false;
525 m.Free;
526 end;
527 end;
528
529 procedure TWebModule1.WebModule1setupAction(Sender: TObject;
530 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
531 var
532 i: integer;
533 s: string;
534 begin
535 FDTable2.Edit;
536 for i := 0 to Request.ContentFields.count - 1 do
537 begin
538 s := Request.ContentFields.Names[i];
539 if s <> 'home' then
540 FDTable2.FieldByName(s).AsString :=
541 Request.ContentFields.ValueFromIndex[i]
542 else
543 FDTable2.FieldByName(s).AsString := Request.ContentFields.Values[s];
544 end;
545 FDTable2.Post;
546 Handled := false;
547 end;
548
549 procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
550 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
551 var
552 s: string;
553 i: integer;
554 begin
555 i := StrToIntDef(Request.ContentFields.Values['number'], 0);
556 if (i > 0) and (FDTable1.Locate('no', i, []) = True) then
557 begin
558 s := FDTable1.FieldByName('pass').AsString;
559 if (s <> '') and (s = Request.ContentFields.Values['password']) then
560 FDTable1.Delete;
561 end;
562 Handled := false;
563 end;
564
565 procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
566 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
567 var
568 s: AnsiString;
569 m: TResourceStream;
570 begin
571 if FDTable1.Exists = false then
572 FDTable1.CreateTable(false, [tpTable]);
573 if FDTable2.Exists = false then
574 begin
575 FDTable2.CreateTable(false, [tpTable]);
576 FDTable2.Active := True;
577 {
578 if (Request.ServerPort = 80) or (Request.ServerPort = 443) then
579 s := 'http://' + String(Request.Host)
580 else
581 s := 'http://' + String(Request.Host) + ':' +
582 IntToStr(Request.ServerPort);
583 }
584 if Request.ScriptName <> '' then
585 s := Request.Host + Request.ScriptName + '/'
586 else
587 s := Request.Host + '/';
588 FDTable2.AppendRecord([s, 'pbbs clone',
589 '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
590 'admin', '����,����,����', false]);
591 m := TResourceStream.Create(HInstance, 'setup', RT_RCDATA);
592 try
593 uri := 'setup';
594 Response.ContentType := 'text/html; charset=utf-8;';
595 Response.Content := PageProducer1.ContentFromStream(m);
596 finally
597 m.Free;
598 end;
599 Handled := True;
600 end
601 else
602 FDTable2.Active := True;
603 if FDTable3.Exists = false then
604 begin
605 FDTable3.CreateTable(false, [tpTable]);
606 FDTable3.Active := True;
607 FDTable3.AppendRecord([5, 20, 500]);
608 end
609 else
610 FDTable3.Active := True;
611 words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
612 FDTable1.Active := True;
613 {
614 t:='';
615 ssl:=TStringList.Create;
616 try
617 ssl.Add('/login');
618 ssl.Add('/admin');
619 if (ssl.IndexOf(Request.PathInfo) > -1)and(StartsText('https',FDTable2.FieldByName('home').AsString) = false) then
620 begin
621 s:=FDTable2.FieldByName('home').AsAnsiString;
622 Delete(s,Length(s),1);
623 t:='https'+Copy(s,5,Length(s))+Request.PathInfo;
624 end;
625 finally
626 ssl.Free;
627 end;
628 if t <> '' then
629 begin
630 Response.SendRedirect(t);
631 Exit;
632 end;
633 }
634 end;
635
636 procedure TWebModule1.WebModuleCreate(Sender: TObject);
637 begin
638 FDConnection1.Open('Database=data.sdb;LockingMode=Normal;DriverID=SQLite');
639 time := 1;
640 words := TStringList.Create;
641 end;
642
643 procedure TWebModule1.WebModuleDestroy(Sender: TObject);
644 begin
645 words.Free;
646 end;
647
648 end.
649

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