Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (show annotations) (download) (as text)
Mon Sep 19 00:45:34 2016 UTC (7 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 19582 byte(s)
Error occurred while calculating annotation data.
かなりの間HTMLの書き方について間違えていました。
エンコードもしたのですが
まだIISで動かしたときはクッキーがうまく削除できないのと#articleに移動させられません。
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, System.NetEncoding;
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 := 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 := 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 := '/';
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(FDTable2.FieldByName('home').AsAnsiString + '/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(FDTable2.FieldByName('home').AsAnsiString + '/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(FDTable2.FieldByName('home').AsAnsiString + '/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(FDTable2.FieldByName('home').AsAnsiString + '/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(FDTable2.FieldByName('home').AsAnsiString + '/admin');
355 end;
356
357 procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
358 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
359 var
360 s: TResourceStream;
361 t: TURLEncoding;
362 begin
363 if FDTable2.FieldByName('mente').AsBoolean = True then
364 begin
365 s := TResourceStream.Create(HInstance, 'mente', RT_RCDATA);
366 try
367 uri := '/mente';
368 Response.ContentType := 'text/html; charset=utf-8;';
369 Response.Content := PageProducer1.ContentFromStream(s);
370 finally
371 s.Free;
372 end;
373 Exit;
374 end;
375 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
376 s := TResourceStream.Create(HInstance, 'index', RT_RCDATA);
377 t := TURLEncoding.Create;
378 try
379 user := t.Decode(Request.CookieFields.Values['UID']);
380 uri := '/index';
381 Response.ContentType := 'text/html; charset=utf-8;';
382 Response.Content := PageProducer1.ContentFromStream(s);
383 finally
384 s.Free;
385 end;
386 end;
387
388 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
389 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
390 var
391 s: TResourceStream;
392 begin
393 s := TResourceStream.Create(HInstance, 'login', RT_RCDATA);
394 try
395 uri := '/login';
396 Response.ContentType := 'text/html; charset=utf-8;';
397 Response.Content := PageProducer1.ContentFromStream(s);
398 finally
399 s.Free;
400 end;
401 end;
402
403 procedure TWebModule1.WebModule1registAction(Sender: TObject;
404 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
405 var
406 na, sub, com, pass: string;
407 no, line: integer;
408 i: integer;
409 s: TResourceStream;
410 begin
411 with Request.ContentFields do
412 begin
413 na := Values['name'];
414 sub := Values['title'];
415 com := Values['comment'];
416 pass := Values['password'];
417 end;
418 er := '';
419 line := 0;
420 if na = '' then
421 na := '�N������';
422 if sub = '' then
423 sub := '�^�C�g������';
424 if com = '' then
425 er := '�{��������������.'#$D#$A
426 else
427 line := regist(com);
428 for i := 0 to words.count - 1 do
429 if ContainsText(AnsiString(com), AnsiString(words[i])) = True then
430 begin
431 er := er + '���~����������������.';
432 break;
433 end;
434 if FDTable1.RecordCount = 0 then
435 no := 1
436 else
437 begin
438 FDTable1.Last;
439 no := FDTable1.FieldByName('no').AsInteger + 1;
440 if SecondsBetween(Now, StrToDateTime(FDTable1.FieldByName('date').AsString))
441 < time then
442 er := '����������������.';
443 end;
444 if er <> '' then
445 begin
446 Response.ContentType := 'text/html; charset=utf-8;';
447 s := TResourceStream.Create(HInstance, 'regist', RT_RCDATA);
448 try
449 Response.Content := PageProducer1.ContentFromStream(s);
450 finally
451 s.Free;
452 end;
453 Exit;
454 end;
455 FDTable1.AppendRecord([na, no, DateTimeToStr(Now), sub, com, pass, line]);
456 with Response.Cookies.Add do
457 begin
458 path := '/';
459 Name := 'UID';
460 Value := AnsiString(na);
461 Expires := Now + 1;
462 end;
463 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString +
464 '/index#article');
465 end;
466
467 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
468 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
469 var
470 s: TStringList;
471 t1, t2, t3: string;
472 i, j: integer;
473 m: TResourceStream;
474 begin
475 t1 := Request.ContentFields.Values['filter'];
476 t3 := '';
477 s := TStringList.Create;
478 try
479 s.DelimitedText := Request.ContentFields.Values['word1'];
480 for i := 0 to s.count - 1 do
481 begin
482 t2 := Trim(s[i]);
483 if t2 = '' then
484 continue;
485 if t3 <> '' then
486 t3 := t3 + ' and ';
487 t3 := t3 + t1 + ' LIKE ''%' + t2 + '%''';
488 end;
489 finally
490 s.Free;
491 end;
492 if t3 = '' then
493 begin
494 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
495 try
496 Response.ContentType := 'text/html; charset=utf-8;';
497 Response.Content := PageProducer1.ContentFromStream(m);
498 finally
499 m.Free;
500 end;
501 Exit;
502 end;
503 FDTable1.Filter := t3;
504 FDTable1.Filtered := True;
505 m := TResourceStream.Create(HInstance, 'search', RT_RCDATA);
506 try
507 j := 0;
508 for i := 1 to FDTable1.RecordCount - 1 do
509 begin
510 inc(j, FDTable1.FieldByName('line').AsInteger);
511 FDTable1.Next;
512 end;
513 PageProducer1.HTMLDoc.LoadFromStream(m);
514 Response.ContentType := 'text/html; charset=utf-8;';
515 if (t3 <> '') and (j > FDTable3.FieldByName('line').AsInteger) then
516 begin
517 t1 := PageProducer1.Content;
518 i := Pos('<#main>', t1);
519 Delete(t1, i, Length('<#main>'));
520 Response.Content := t1 + Format('�\���s����%d�s��������������.',
521 [FDTable3.FieldByName('line').AsInteger]);
522 end
523 else
524 Response.Content := PageProducer1.ContentFromString
525 (PageProducer1.Content);
526 finally
527 FDTable1.Filtered := false;
528 m.Free;
529 end;
530 end;
531
532 procedure TWebModule1.WebModule1setupAction(Sender: TObject;
533 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
534 var
535 i: integer;
536 s: string;
537 begin
538 FDTable2.Edit;
539 for i := 0 to Request.ContentFields.count - 1 do
540 begin
541 s := Request.ContentFields.Names[i];
542 if s <> 'home' then
543 FDTable2.FieldByName(s).AsString :=
544 Request.ContentFields.ValueFromIndex[i]
545 else
546 FDTable2.FieldByName(s).AsString := Request.ContentFields.Values[s];
547 end;
548 FDTable2.Post;
549 Handled := false;
550 end;
551
552 procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
553 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
554 var
555 s: string;
556 i: integer;
557 begin
558 i := StrToIntDef(Request.ContentFields.Values['number'], 0);
559 if (i > 0) and (FDTable1.Locate('no', i, []) = True) then
560 begin
561 s := FDTable1.FieldByName('pass').AsString;
562 if (s <> '') and (s = Request.ContentFields.Values['password']) then
563 FDTable1.Delete;
564 end;
565 Handled := false;
566 end;
567
568 procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
569 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
570 var
571 m: TResourceStream;
572 begin
573 if FDTable1.Exists = false then
574 FDTable1.CreateTable(false, [tpTable]);
575 if FDTable2.Exists = false then
576 begin
577 FDTable2.CreateTable(false, [tpTable]);
578 FDTable2.Active := True;
579 {
580 if (Request.ServerPort = 80) or (Request.ServerPort = 443) then
581 s := 'http://' + String(Request.Host)
582 else
583 s := 'http://' + String(Request.Host) + ':' +
584 IntToStr(Request.ServerPort);
585 }
586 FDTable2.AppendRecord([Request.ScriptName, 'pbbs clone',
587 '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
588 'admin', '����,����,����', false]);
589 m := TResourceStream.Create(HInstance, 'setup', RT_RCDATA);
590 try
591 uri := '/setup';
592 Response.ContentType := 'text/html; charset=utf-8;';
593 Response.Content := PageProducer1.ContentFromStream(m);
594 finally
595 m.Free;
596 end;
597 Handled := True;
598 end
599 else
600 FDTable2.Active := True;
601 if FDTable3.Exists = false then
602 begin
603 FDTable3.CreateTable(false, [tpTable]);
604 FDTable3.Active := True;
605 FDTable3.AppendRecord([5, 20, 500]);
606 end
607 else
608 FDTable3.Active := True;
609 words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
610 FDTable1.Active := True;
611 {
612 t:='';
613 ssl:=TStringList.Create;
614 try
615 ssl.Add('/login');
616 ssl.Add('/admin');
617 if (ssl.IndexOf(Request.PathInfo) > -1)and(StartsText('https',FDTable2.FieldByName('home').AsString) = false) then
618 begin
619 s:=FDTable2.FieldByName('home').AsAnsiString;
620 Delete(s,Length(s),1);
621 t:='https'+Copy(s,5,Length(s))+Request.PathInfo;
622 end;
623 finally
624 ssl.Free;
625 end;
626 if t <> '' then
627 begin
628 Response.SendRedirect(t);
629 Exit;
630 end;
631 }
632 end;
633
634 procedure TWebModule1.WebModuleCreate(Sender: TObject);
635 begin
636 FDConnection1.Open('Database=data.sdb;LockingMode=Normal;DriverID=SQLite');
637 time := 1;
638 words := TStringList.Create;
639 end;
640
641 procedure TWebModule1.WebModuleDestroy(Sender: TObject);
642 begin
643 words.Free;
644 end;
645
646 end.
647

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