Develop and Download Open Source Software

Browse Subversion Repository

Contents of /WebModuleUnit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations) (download) (as text)
Thu Sep 24 05:40:03 2015 UTC (8 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 19253 byte(s)
投稿エラーの文字化けがなおりました

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

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