Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                   ;;
3
;;    SMTP server for MenuetOS                       ;;
4
;;                                                   ;;
5
;;    License: GPL / See file COPYING for details    ;;
6
;;    Copyright 2002 (c) Ville Turjanmaa             ;;
7
;;                                                   ;;
8
;;    Compile with FASM for Menuet                   ;;
9
;;                                                   ;;
10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
include 'lang.inc'
12
version equ '0.1'
13
 
14
use32
15
 
16
                org     0x0
17
 
18
                db      'MENUET01'              ; 8 byte id
19
                dd      0x01                    ; required os
20
                dd      START                   ; program start
21
                dd      I_END                   ; program image size
22
                dd      0x200000                ; required amount of memory
23
                dd      0xffff0
24
                dd      0,0
25
 
26
save_file:
27
 
28
   pusha
29
 
30
   cmp  [file_start],0x100000+10
31
   jbe  nosub
32
   sub  [file_start],8
33
  nosub:
34
 
35
   mov  edi,[file_start]
36
 
37
   mov  eax,[file_start]
38
   sub  eax,0x100000
39
   mov  [files+8],eax
40
 
41
   mov  eax,58
42
   mov  ebx,files
43
   int  0x40
44
 
45
   popa
46
 
47
   ret
48
 
49
 
50
START:                          ; start of execution
51
 
52
    mov  [file_start],0x100000
53
 
54
    mov  eax,58
55
    mov  ebx,filel
56
    int  0x40
57
 
58
    cmp  eax,0
59
    jne  notfound
60
    add  [file_start],ebx
61
  notfound:
62
 
63
 
64
    mov  edi,I_END
65
    mov  ecx,60*120
66
    mov  eax,32
67
    cld
68
    rep  stosb
69
 
70
    mov  eax,[rxs]
71
    imul eax,11
72
    mov  [pos],eax
73
 
74
    mov  ebp,0
75
    mov  edx,I_END
76
    call draw_window            ; at first, draw the window
77
 
78
still:
79
 
80
    inc  [cursor_on_off]
81
 
82
    mov  eax,5
83
    mov  ebx,1
84
    int  0x40
85
 
86
    mov  eax,11                 ; wait here for event
87
    int  0x40
88
 
89
    cmp  eax,1                  ; redraw
90
    je   redraw
91
    cmp  eax,2                  ; key
92
    je   key
93
    cmp  eax,3                  ; button
94
    je   button
95
 
96
    cmp  [I_END+120*60],byte 1
97
    jne  no_main_update
98
    mov  [I_END+120*60],byte 0
99
    mov  edx,I_END
100
    call draw_channel_text
101
  no_main_update:
102
 
103
    cmp  [server_active],0
104
    je   noread
105
    cmp  [status],4
106
    jne  noread
107
    call read_incoming_data
108
    inc  [close_connection]
109
    cmp  [close_connection],15*100
110
    jbe  noread
111
 
112
    call yq
113
 
114
  noread:
115
 
116
    call print_status
117
 
118
    cmp  [status],4
119
    je   check_header
120
 
121
    jmp  still
122
 
123
 
124
check_header:
125
 
126
    cmp [header_sent],1
127
    je  still
128
 
129
    mov  eax,53
130
    mov  ebx,7
131
    mov  ecx,[socket]
132
    mov  edx,6
133
    mov  esi,r220
134
    int  0x40
135
    mov  [header_sent],1
136
 
137
    jmp  still
138
 
139
 
140
 
141
redraw:                         ; redraw
142
 
143
    call draw_window
144
    jmp  still
145
 
146
 
147
button:                         ; button
148
 
149
    mov  eax,17                 ; get id
150
    int  0x40
151
 
152
    cmp  ah,1                   ; close program
153
    jne  noclose
154
    mov  eax,-1
155
    int  0x40
156
  noclose:
157
 
158
    call socket_commands
159
 
160
    jmp  still
161
 
162
 
163
old_status dd 0x0
164
 
165
print_status:
166
 
167
    pusha
168
 
169
    mov  eax,53
170
    mov  ebx,6
171
    mov  ecx,[socket]
172
    int  0x40
173
 
174
    mov  [status],eax
175
 
176
    cmp  eax,[old_status]
177
    je   no_print
178
 
179
    mov  [old_status],eax
180
 
181
    push eax
182
 
183
    mov  eax,13
184
    mov  ebx,360*65536+30
185
    mov  ecx,151*65536+10
186
    mov  edx,0xffffff
187
    int  0x40
188
 
189
    pop  ecx
190
    mov  eax,47
191
    mov  ebx,3*65536
192
    mov  edx,360*65536+151
193
    mov  esi,0x000000
194
 
195
    cmp  [server_active],0
196
    je   no_print
197
 
198
    int  0x40
199
 
200
  no_print:
201
 
202
    popa
203
 
204
    ret
205
 
206
 
207
socket_commands:
208
 
209
    cmp  ah,22       ; open socket
210
    jnz  tst3
211
    mov  eax,3
212
    int  0x40
213
 
214
    mov  [server_active],1
215
 
216
    mov  eax,53
217
    mov  ebx,5
218
    mov  ecx,25     ; local port # - http
219
    mov  edx,0      ; no remote port specified
220
    mov  esi,0      ; no remote ip specified
221
    mov  edi,0      ; PASSIVE open
222
    int  0x40
223
    mov  [socket], eax
224
 
225
    ret
226
  tst3:
227
 
228
 
229
    cmp  ah,24     ; close socket
230
    jnz  no_24
231
    mov  eax,53
232
    mov  ebx,8
233
    mov  ecx,[socket]
234
    int  0x40
235
    mov  [header_sent],0
236
    mov  [mail_rp],0
237
    mov  [server_active],0
238
 
239
    ret
240
  no_24:
241
 
242
 
243
    ret
244
 
245
 
246
 
247
key:
248
 
249
    mov  eax,2
250
    int  0x40
251
 
252
    jmp  still
253
 
254
 
255
 
256
read_incoming_data:
257
 
258
    pusha
259
 
260
  read_new_byte:
261
 
262
    call read_incoming_byte
263
    cmp  ecx,-1
264
    je   no_data_in_buffer
265
 
266
    mov  eax,[file_start]
267
    mov  [eax],bl
268
    inc  [file_start]
269
 
270
    cmp  bl,10
271
    jne  no_start_command
272
    mov  [cmd],1
273
  no_start_command:
274
 
275
    cmp  bl,13
276
    jne  no_end_command
277
    mov  eax,[cmd]
278
    mov  [eax+command-2],byte 0
279
    call analyze_command
280
    mov  edi,command
281
    mov  ecx,250
282
    mov  eax,0
283
    cld
284
    rep  stosb
285
    mov  [cmd],0
286
  no_end_command:
287
 
288
    mov  eax,[cmd]
289
    cmp  eax,250
290
    jge  still
291
 
292
    mov  [eax+command-2],bl
293
    inc  [cmd]
294
 
295
    jmp  read_new_byte
296
 
297
  no_data_in_buffer:
298
 
299
    popa
300
 
301
    ret
302
 
303
 
304
 
305
 
306
 
307
analyze_command:
308
 
309
    pusha
310
 
311
    mov  [text_start],I_END
312
    mov  ecx,[rxs]
313
    imul ecx,11
314
    mov  [pos],ecx
315
 
316
    mov  bl,13
317
    call print_character
318
    mov  bl,10
319
    call print_character
320
 
321
    cmp  [cmd],2
322
    jbe  nott
323
    mov  ecx,[cmd]
324
    sub  ecx,2
325
    mov  esi,command+0
326
  newcmdc:
327
    mov  bl,[esi]
328
    call print_character
329
    inc  esi
330
    loop newcmdc
331
 
332
   nott:
333
 
334
    mov   edx,I_END
335
    call  draw_channel_text
336
 
337
  cmd_len_ok:
338
 
339
    cmp  [command],dword 'data'
340
    je   datacom
341
    cmp  [command],dword 'DATA'
342
    je   datacom
343
    cmp  [command],dword 'Data'
344
    je   datacom
345
    jmp  nodatacom
346
  datacom:
347
    inc  [mail_rp]
348
    mov  eax,53
349
    mov  ebx,7
350
    mov  ecx,[socket]
351
    mov  edx,6
352
    mov  esi,r354
353
    int  0x40
354
    mov  [cmd],0
355
    popa
356
    ret
357
 
358
  nodatacom:
359
 
360
    cmp  [mail_rp],0
361
    jne  nomrp0
362
    mov  eax,53
363
    mov  ebx,7
364
    mov  ecx,[socket]
365
    mov  edx,6
366
    mov  esi,r250
367
    int  0x40
368
    mov  [cmd],0
369
    popa
370
    ret
371
  nomrp0:
372
 
373
 
374
 
375
    cmp  [command],dword 'QUIT'
376
    je   yesquit
377
    cmp  [command],dword 'Quit'
378
    je   yesquit
379
    cmp  [command],dword 'quit'
380
    je   yesquit
381
    jmp  noquit
382
  yq:
383
     pusha
384
 
385
  yesquit:
386
 
387
    mov  [close_connection],0
388
 
389
    mov  eax,53
390
    mov  ebx,7
391
    mov  ecx,[socket]
392
    mov  edx,6
393
    mov  esi,r221
394
    int  0x40
395
    mov  [cmd],0
396
 
397
    mov  eax,5
398
    mov  ebx,5
399
    int  0x40
400
 
401
    mov  eax,53
402
    mov  ebx,8
403
    mov  ecx,[socket]
404
    int  0x40
405
 
406
    mov  eax,5
407
    mov  ebx,5
408
    int  0x40
409
 
410
    mov  eax,53
411
    mov  ebx,8
412
    mov  ecx,[socket]
413
    int  0x40
414
 
415
    mov  [header_sent],0
416
    mov  [mail_rp],0
417
 
418
    call save_file
419
 
420
    mov  eax,5
421
    mov  ebx,20
422
    int  0x40
423
 
424
    mov  eax,53
425
    mov  ebx,5
426
    mov  ecx,25     ; local port # - http
427
    mov  edx,0      ; no remote port specified
428
    mov  esi,0      ; no remote ip specified
429
    mov  edi,0      ; PASSIVE open
430
    int  0x40
431
    mov  [socket], eax
432
 
433
    popa
434
    ret
435
  noquit:
436
 
437
 
438
 
439
    cmp  [command],byte '.'
440
    jne  nodot
441
    mov  eax,53
442
    mov  ebx,7
443
    mov  ecx,[socket]
444
    mov  edx,6
445
    mov  esi,r250
446
    int  0x40
447
    mov  [cmd],0
448
    popa
449
    ret
450
  nodot:
451
 
452
    popa
453
    ret
454
 
455
 
456
r250  db  '250 ',13,10
457
r221  db  '221 ',13,10
458
r220  db  '220 ',13,10
459
r354  db  '354 ',13,10
460
 
461
 
462
 
463
draw_data:
464
 
465
    pusha
466
 
467
    add  eax,[text_start]
468
    mov  [eax],bl
469
 
470
    popa
471
    ret
472
 
473
 
474
 
475
 
476
print_text:
477
 
478
    pusha
479
 
480
    mov  ecx,command-2
481
    add  ecx,[cmd]
482
 
483
  ptr2:
484
    mov  bl,[eax]
485
    cmp  bl,dl
486
    je   ptr_ret
487
    cmp  bl,0
488
    je   ptr_ret
489
    call print_character
490
    inc  eax
491
    cmp  eax,ecx
492
    jbe  ptr2
493
 
494
  ptr_ret:
495
 
496
    mov  eax,[text_start]
497
    mov  [eax+120*60],byte 1
498
 
499
    popa
500
    ret
501
 
502
 
503
 
504
print_character:
505
 
506
    pusha
507
 
508
    cmp  bl,13     ; line beginning
509
    jne  nobol
510
    mov  ecx,[pos]
511
    add  ecx,1
512
  boll1:
513
    sub  ecx,1
514
    mov  eax,ecx
515
    xor  edx,edx
516
    mov  ebx,[rxs]
517
    div  ebx
518
    cmp  edx,0
519
    jne  boll1
520
    mov  [pos],ecx
521
    jmp  newdata
522
  nobol:
523
 
524
    cmp  bl,10     ; line down
525
    jne  nolf
526
   addx1:
527
    add  [pos],dword 1
528
    mov  eax,[pos]
529
    xor  edx,edx
530
    mov  ecx,[rxs]
531
    div  ecx
532
    cmp  edx,0
533
    jnz  addx1
534
    mov  eax,[pos]
535
    jmp  cm1
536
  nolf:
537
  no_lf_ret:
538
 
539
 
540
    cmp  bl,15    ; character
541
    jbe  newdata
542
 
543
    mov  eax,[irc_data]
544
    shl  eax,8
545
    mov  al,bl
546
    mov  [irc_data],eax
547
 
548
    mov  eax,[pos]
549
    call draw_data
550
 
551
    mov  eax,[pos]
552
    add  eax,1
553
  cm1:
554
    mov  ebx,[scroll+4]
555
    imul ebx,[rxs]
556
    cmp  eax,ebx
557
    jb   noeaxz
558
 
559
    mov  esi,[text_start]
560
    add  esi,[rxs]
561
 
562
    mov  edi,[text_start]
563
    mov  ecx,ebx
564
    cld
565
    rep  movsb
566
 
567
    mov  esi,[text_start]
568
    mov  ecx,[rxs]
569
    imul ecx,61
570
    add  esi,ecx
571
 
572
    mov  edi,[text_start]
573
    mov  ecx,[rxs]
574
    imul ecx,60
575
    add  edi,ecx
576
    mov  ecx,ebx
577
    cld
578
    rep  movsb
579
 
580
    mov  eax,ebx
581
    sub  eax,[rxs]
582
  noeaxz:
583
    mov  [pos],eax
584
 
585
  newdata:
586
 
587
    mov  eax,[text_start]
588
    mov  [eax+120*60],byte 1
589
 
590
    popa
591
    ret
592
 
593
 
594
 
595
read_incoming_byte:
596
 
597
    mov  eax, 53
598
    mov  ebx, 2
599
    mov  ecx, [socket]
600
    int  0x40
601
 
602
    mov  ecx,-1
603
 
604
    cmp  eax,0
605
    je   no_more_data
606
 
607
    mov  eax, 53
608
    mov  ebx, 3
609
    mov  ecx, [socket]
610
    int  0x40
611
 
612
    mov  ecx,0
613
 
614
  no_more_data:
615
 
616
    ret
617
 
618
 
619
 
620
draw_window:
621
 
622
    pusha
623
 
624
    mov  eax,12
625
    mov  ebx,1
626
    int  0x40
627
 
628
    mov  [old_status],300
629
 
630
    mov  eax,0                     ; draw window
631
    mov  ebx,5*65536+400
632
    mov  ecx,5*65536+200
633
    mov  edx,[wcolor]
634
    add  edx,0x03ffffff
635
    mov  esi,0x80555599
636
    mov  edi,0x00ffffff
637
    int  0x40
638
 
639
    mov  eax,4                     ; label
640
    mov  ebx,9*65536+8
641
    mov  ecx,0x10ffffff
642
    mov  edx,labelt
643
    mov  esi,labellen-labelt
644
    int  0x40
645
 
646
    mov  eax,8                     ; button: open socket
647
    mov  ebx,23*65536+22
648
    mov  ecx,169*65536+10
649
    mov  edx,22
650
    mov  esi,0x55aa55
651
    int  0x40
652
 
653
    mov  eax,8                     ; button: close socket
654
    mov  ebx,265*65536+22
655
    mov  ecx,169*65536+10
656
    mov  edx,24
657
    mov  esi,0xaa5555
658
    int  0x40
659
 
660
    mov  eax,38                    ; line
661
    mov  ebx,5*65536+395
662
    mov  ecx,108*65536+108
663
    mov  edx,0x000000
664
    int  0x40
665
 
666
    mov  ebx,5*65536+123          ; info text
667
    mov  ecx,0x000000
668
    mov  edx,text
669
    mov  esi,70
670
  newline:
671
    mov  eax,4
672
    int  0x40
673
    add  ebx,12
674
    add  edx,70
675
    cmp  [edx],byte 'x'
676
    jne  newline
677
 
678
    mov  edx,I_END                ; text from server
679
    call draw_channel_text
680
 
681
    mov  eax,12
682
    mov  ebx,2
683
    int  0x40
684
 
685
    popa
686
 
687
    ret
688
 
689
 
690
 
691
 
692
 
693
draw_channel_text:
694
 
695
    pusha
696
 
697
    mov   eax,4
698
    mov   ebx,10*65536+26
699
    mov   ecx,[scroll+4]
700
    mov   esi,[rxs]
701
  dct:
702
    pusha
703
    mov   cx,bx
704
    shl   ecx,16
705
    mov   cx,9
706
    mov   eax,13
707
    mov   ebx,10*65536
708
    mov   bx,word [rxs]
709
    imul  bx,6
710
    mov   edx,0xffffff
711
    int   0x40
712
    popa
713
    push  ecx
714
    mov   eax,4
715
    mov   ecx,0
716
    cmp   [edx],word '* '
717
    jne   no_red
718
    mov   ecx,0xff0000
719
   no_red:
720
    cmp   [edx],word '**'
721
    jne   no_light_blue
722
    cmp   [edx+2],byte '*'
723
    jne   no_light_blue
724
    mov   ecx,0x0000ff
725
  no_light_blue:
726
    cmp   [edx],byte '#'
727
    jne   no_blue
728
    mov   ecx,0x00ff00
729
  no_blue:
730
    int   0x40
731
    add   edx,[rxs]
732
    add   ebx,10
733
    pop   ecx
734
    loop  dct
735
 
736
    popa
737
    ret
738
 
739
 
740
 
741
text:
742
 
743
db '   Incoming mails are written to /rd/1/smtps.txt                      '
744
db '   The file can be fetched with TinyServer and a Html-browser.        '
745
db '   Timeout is set to 15 seconds.                                      '
746
db '                                                                      '
747
db '        Open SMTP server port 25                Close SMTP            '
748
 
749
db 'x <- END MARKER, DONT DELETE            '
750
 
751
 
752
irc_server_ip   db      192,168,1,1
753
 
754
file_start      dd      0x100000
755
 
756
files:
757
       dd  1,0,0,0x100000,0xd0000
758
       db  '/rd/1/smtps.txt',0
759
filel:
760
       dd  0,0,10000/512,0x100000,0xd0000
761
       db  '/rd/1/smtps.txt',0
762
 
763
 
764
server_active dd 0
765
 
766
status  dd  0x0
767
header_sent db 0
768
 
769
channel_temp:         times   100   db   0
770
channel_temp_length   dd      0x0
771
 
772
close_connection   dd 0x0
773
 
774
mail_rp      dd  0
775
 
776
socket  dd  0x0
777
 
778
bgc  dd  0x000000
779
     dd  0x000000
780
     dd  0x00ff00
781
     dd  0x0000ff
782
     dd  0x005500
783
     dd  0xff00ff
784
     dd  0x00ffff
785
     dd  0x770077
786
 
787
tc   dd  0xffffff
788
     dd  0xff00ff
789
     dd  0xffffff
790
     dd  0xffffff
791
     dd  0xffffff
792
     dd  0xffffff
793
     dd  0xffffff
794
     dd  0xffffff
795
 
796
cursor_on_off  dd  0x0
797
 
798
max_windows    dd  20
799
 
800
thread_stack   dd  0x9fff0
801
thread_nro     dd 1
802
thread_screen  dd I_END+120*80*1
803
 
804
action_header_blue  db  10,'*** ',0
805
action_header_red   db  10,'*** ',0
806
 
807
action_header_short db  10,'* ',0
808
 
809
posx             dd  0x0
810
incoming_pos     dd  0x0
811
incoming_string: times 128 db 0
812
 
813
pos          dd  0x0
814
 
815
text_start   dd  I_END
816
irc_data     dd  0x0
817
print        db  0x0
818
cmd          dd  0x0
819
rxs          dd  56
820
 
821
res:         db  0,0
822
command:     times  256  db 0x0
823
 
824
nick         dd  0,0,0
825
irc_command  dd  0,0
826
 
827
command_position  dd 0x0
828
counter           dd  0
829
send_to_server    db 0
830
 
831
channel_list:     times 32*20 db 32
832
send_to_channel   dd 0x0
833
 
834
send_string:         times  100  db  0x0
835
 
836
xpos        dd  0
837
attribute   dd  0
838
scroll      dd  1
839
            dd  8
840
 
841
numtext     db  '                     '
842
 
843
wcolor      dd  0x000000
844
 
845
labelt      db  'Tiny SMTP email server v ',version
846
labellen:
847
 
848
 
849
I_END: