Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (show annotations) (download) (as text)
Fri Sep 25 03:19:17 2015 UTC (8 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 19730 byte(s)
Error occurred while calculating annotation data.
AnsiStringについて整理したのとログアウトリンクの訂正 AnsiStringはWebBrokerで多用されているため活用するしかありませんでした

特に大きな変更はなし
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 := AnsiString('https://'+FDTable2.FieldByName('home').AsString + 'admin');
95 Expires := Now + day;
96 Name := 'psw';
97 Value := AnsiString(pass);
98 Secure := True;
99 end;
100 end;
101
102 procedure TWebModule1.DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
103 const TagString: string; TagParams: TStrings; var ReplaceText: string);
104 begin
105 ReplaceText := FDTable1.FieldByName(TagString).AsString;
106 end;
107
108 function TWebModule1.footer(const path: string): string;
109 var
110 s1, s2, t1, t2: string;
111 home: string;
112 i, k, count: integer;
113 function linkcontent: string;
114 var
115 j, link: integer;
116 begin
117 result := '';
118 link := FDTable3.FieldByName('link').AsInteger;
119 if position > link div 2 then
120 begin
121 if (FDTable1.RecordCount - 1) div count < position + link div 2 then
122 i := FDTable1.RecordCount div count - link - position
123 else
124 i := -(link div 2)
125 end
126 else if position = -1 then
127 i := -position + FDTable1.RecordCount div count - link
128 else
129 i := -position;
130 for j := 0 to link do
131 begin
132 if FDTable1.RecordCount <= (position + i + j) * count then
133 break;
134 if position + i + j < 0 then
135 continue;
136 if i + j = 0 then
137 result := result + ' ' + IntToStr(position + 1) + ' '
138 else
139 result := result + Format(' <a href="' + home + path +
140 '?pos=%d#article">%d</a> ', [position + i + j, position + 1 + i + j]);
141 end;
142 end;
143
144 begin
145 count := FDTable3.FieldByName('count').AsInteger;
146 if path = 'admin' then
147 home := 'https://'+FDTable2.FieldByName('home').AsString
148 else
149 home := 'http://'+FDTable2.FieldByName('home').AsString;
150 if position <= -1 then
151 begin
152 s1 := '���V%d�����L�����\��<br><center>Pages : [<b>';
153 s2 := '<<' + linkcontent + '>>] ���V</b><br></center>';
154 result := Format(s1, [count]) + s2;
155 end
156 else
157 begin
158 if position = 0 then
159 t1 := '?pos=0'
160 else
161 t1 := '?pos=' + IntToStr(position - 1);
162 i := (FDTable1.RecordCount - 1) div count;
163 if position > i then
164 position := i;
165 if position = i then
166 begin
167 t2 := '?pos=' + position.ToString+'#article';
168 k := FDTable1.RecordCount;
169 end
170 else
171 begin
172 t2 := '?pos=' + IntToStr(position + 1)+'#article';
173 k := (position + 1) * count;
174 end;
175 s1 := '%d ���� %d ������ %d �������\��<br><center>Page : [<b>';
176 s2 := '<a href="' + home + path + t1 + '#article"><<</a>' + linkcontent +
177 '<a href="' + home + path + t2 + '">>></a>] <a href="' + home + path +
178 '#article">���V</a></b></center>';
179 result := Format(s1, [FDTable1.RecordCount, position * count + 1, k]) + s2;
180 end;
181 end;
182
183 procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
184 const TagString: string; TagParams: TStrings; var ReplaceText: string);
185 var
186 i, j, count: integer;
187 s: TDataSetPageProducer;
188 begin
189 if TagString = 'home' then
190 begin
191 if (uri = 'admin') or (uri = 'login') or (TagParams.Values['ssl'] = 'true')
192 then
193 ReplaceText := 'https://'+FDTable2.FieldByName('home').AsString
194 else
195 ReplaceText := 'http://'+FDTable2.FieldByName('home').AsString;
196 end;
197 if (TagString = 'title') or (TagString = 'title2') then
198 ReplaceText := FDTable2.FieldByName(TagString).AsString;
199 if TagString = 'username' then
200 ReplaceText := user;
201 if TagString = 'main' then
202 begin
203 if FDTable1.RecordCount = 0 then
204 begin
205 if uri = 'index' then
206 ReplaceText := '<hr>�������e������������.<hr>';
207 end
208 else
209 begin
210 count := FDTable3.FieldByName('count').AsInteger;
211 if uri = 'admin' then
212 s := adminDS
213 else
214 s := DataSetPageProducer2;
215 if position < -1 then
216 position := -1;
217 if (position + 1) * count > FDTable1.RecordCount then
218 position := (FDTable1.RecordCount - 1) div count;
219 if position = -1 then
220 begin
221 if FDTable1.RecordCount < count then
222 j := FDTable1.RecordCount mod count
223 else
224 j := count;
225 end
226 else if FDTable1.RecordCount < (position + 1) * count then
227 j := FDTable1.RecordCount - position * count
228 else
229 j := count;
230 if position = -1 then
231 FDTable1.Last
232 else
233 FDTable1.RecNo := (position + 1) * count;
234 for i := 1 to j do
235 begin
236 ReplaceText := ReplaceText + s.Content;
237 FDTable1.Prior;
238 end;
239 ReplaceText:=ReplaceText + '<hr>';
240 end;
241 end;
242 if TagString = 'footer' then
243 if TagParams.Values['refer'] = 'true' then
244 ReplaceText := foo
245 else
246 begin
247 foo := footer(uri);
248 ReplaceText := foo;
249 end;
250 if TagString = 'text' then
251 if FDTable1.Filtered = false then
252 ReplaceText := '����������'
253 else
254 ReplaceText := '�Y������ ' + IntToStr(FDTable1.RecordCount) + ' ��' +
255 '<br><#main>';
256 if TagString = 'pass' then
257 ReplaceText := FDTable2.FieldByName('pass').AsString;
258 if TagString = 'content' then
259 ReplaceText := er;
260 if (TagString = 'mente') and (FDTable2.FieldByName('mente').AsBoolean = true)
261 then
262 ReplaceText := 'checked="checked"';
263 end;
264
265 function TWebModule1.regist(var com: string): integer;
266 var
267 i: integer;
268 begin
269 result := 1;
270 i := 1;
271 while True do
272 begin
273 i := Pos(#$D#$A, com, i);
274 if i = 0 then
275 break;
276 Delete(com, i, Length(#$D#$A));
277 Insert('<br>', com, i);
278 inc(i, 4);
279 inc(result);
280 end;
281 end;
282
283 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
284 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
285 var
286 t: string;
287 x: Boolean;
288 procedure something;
289 var
290 s: TResourceStream;
291 begin
292 x := false;
293 s := TResourceStream.Create(HInstance, 'admin', RT_RCDATA);
294 try
295 uri := 'admin';
296 Response.ContentType := 'text/html; charset=utf-8;';
297 Response.Content := PageProducer1.ContentFromStream(s)
298 finally
299 s.Free;
300 end;
301 end;
302
303 begin
304 if Request.Query = 'del' then
305 begin
306 AddCookie(-3, '');
307 Response.SendRedirect('http://'+FDTable2.FieldByName('home').AsAnsiString);
308 Exit;
309 end;
310 x := True;
311 t := Request.ContentFields.Values['password'];
312 position := StrToIntDef(Request.QueryFields.Values['pos'], -1);
313 if t <> '' then
314 begin
315 AddCookie(14, t);
316 if t = FDTable2.FieldByName('pass').AsString then
317 something;
318 end
319 else if Request.CookieFields.Values['psw'] = FDTable2.FieldByName('pass').AsString
320 then
321 something;
322 if x = True then
323 Response.SendRedirect('https://'+FDTable2.FieldByName('home').AsAnsiString + 'login');
324 end;
325
326 procedure TWebModule1.WebModule1admindelAction(Sender: TObject;
327 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
328 var
329 i: integer;
330 begin
331 for i := 0 to Request.ContentFields.count - 1 do
332 if FDTable1.Locate('no', Request.ContentFields.ValueFromIndex[i], []) = True
333 then
334 FDTable1.Delete;
335 Response.SendRedirect('https://'+FDTable2.FieldByName('home').AsAnsiString + 'admin'))
336 end;
337
338 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
339 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
340 var
341 s: string;
342 x: Boolean;
343 begin
344 s := Request.ContentFields.Values['pass'];
345 if FDTable2.FieldByName('pass').AsString <> s then
346 begin
347 FDTable2.Edit;
348 FDTable2.FieldByName('pass').AsString := s;
349 FDTable2.Post;
350 AddCookie(14, s);
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('https://'+FDTable2.FieldByName('home').AsAnsiString + '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(FDTable2.FieldByName('home').AsAnsiString+'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 for i := 0 to Request.ContentFields.count - 1 do
541 begin
542 s := Request.ContentFields.Names[i];
543 if s <> 'home' then
544 FDTable2.FieldByName(s).AsString :=
545 Request.ContentFields.ValueFromIndex[i];
546 end;
547 Handled := false;
548 end;
549
550 procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
551 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
552 var
553 s: string;
554 i: integer;
555 begin
556 i := StrToIntDef(Request.ContentFields.Values['number'], 0);
557 if (i > 0) and (FDTable1.Locate('no', i, []) = True) then
558 begin
559 s := FDTable1.FieldByName('pass').AsString;
560 if (s <> '') and (s = Request.ContentFields.Values['password']) then
561 FDTable1.Delete;
562 end;
563 Handled := false;
564 end;
565
566 procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
567 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
568 var
569 s: string;
570 m: TResourceStream;
571 begin
572 if FDTable1.Exists = false then
573 FDTable1.CreateTable(false, [tpTable]);
574 if FDTable2.Exists = false then
575 begin
576 FDTable2.CreateTable(false, [tpTable]);
577 FDTable2.Active := True;
578 {
579 if (Request.ServerPort = 80) or (Request.ServerPort = 443) then
580 s := 'http://' + String(Request.Host)
581 else
582 s := 'http://' + String(Request.Host) + ':' +
583 IntToStr(Request.ServerPort);
584 }
585 if Request.ScriptName <> '' then
586 s := String(Request.Host + Request.ScriptName) + '/'
587 else
588 s := String(Request.Host) + '/';
589 FDTable2.AppendRecord([s, 'pbbs clone',
590 '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
591 'admin', '����,����,����', false]);
592 m := TResourceStream.Create(HInstance, 'setup', RT_RCDATA);
593 try
594 uri := 'setup';
595 Response.ContentType := 'text/html; charset=utf-8;';
596 Response.Content := PageProducer1.ContentFromStream(m);
597 finally
598 m.Free;
599 end;
600 Handled := True;
601 end
602 else
603 FDTable2.Active := True;
604 if FDTable3.Exists = false then
605 begin
606 FDTable3.CreateTable(false, [tpTable]);
607 FDTable3.Active := True;
608 FDTable3.AppendRecord([5, 20, 500]);
609 end
610 else
611 FDTable3.Active := True;
612 words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
613 FDTable1.Active := True;
614 {
615 t:='';
616 ssl:=TStringList.Create;
617 try
618 ssl.Add('/login');
619 ssl.Add('/admin');
620 if (ssl.IndexOf(Request.PathInfo) > -1)and(StartsText('https',FDTable2.FieldByName('home').AsString) = false) then
621 begin
622 s:=FDTable2.FieldByName('home').AsAnsiString;
623 Delete(s,Length(s),1);
624 t:='https'+Copy(s,5,Length(s))+Request.PathInfo;
625 end;
626 finally
627 ssl.Free;
628 end;
629 if t <> '' then
630 begin
631 Response.SendRedirect(t);
632 Exit;
633 end;
634 }
635 end;
636
637 procedure TWebModule1.WebModuleCreate(Sender: TObject);
638 begin
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