Subversion Repositories Kolibri OS

Rev

Rev 485 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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