Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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