diff --git a/exec/imapservice.js b/exec/imapservice.js index 86fb10dafadfa68a1f33289bb28ed668e727c9fd..29a7b1011e0aaa6ecf57a584e2d71961eb877c74 100644 --- a/exec/imapservice.js +++ b/exec/imapservice.js @@ -8,6 +8,8 @@ * $Id$ */ +const RFC822HEADER = 0xb0; // from smbdefs.h + load("sbbsdefs.js"); load("822header.js"); load("mime.js"); @@ -23,7 +25,13 @@ const Selected=2; var state=UnAuthenticated; var base; var index={offsets:[],idx:{}}; - +var line; +var readonly=true; +var orig_ptrs={}; +var msg_ptrs={}; +var curr_status={exists:0,recent:0,unseen:0,uidnext:0,uidvalidity:0}; +var saved_config={mail:{scan_ptr:0}}; +var scan_ptr; /**********************/ /* Encoding functions */ @@ -210,17 +218,11 @@ function send_fetch_response(msgnum, fmat, uid) var mime; var part; var extension; + var tmp2; /* * Most of these functions just diddle variables in this function */ - function get_mime() { - if(mime==undefined) { - get_rfc822(); - mime=parse_message(rfc822.header+rfc822.text); - } - } - function get_header() { if(hdr == undefined) { hdr=base.get_msg_header(msgnum); @@ -242,6 +244,13 @@ function send_fetch_response(msgnum, fmat, uid) get_rfc822_text(); } + function get_mime() { + if(mime==undefined) { + get_rfc822(); + mime=parse_message(rfc822.header+rfc822.text); + } + } + function get_rfc822_size() { get_rfc822(); rfc822.size=rfc822.header.length+rfc822.text.length; @@ -304,6 +313,118 @@ function send_fetch_response(msgnum, fmat, uid) resp += " FETCH ("; fmat=fmat.sort(sort_format); + function get_mime_part(fmat) { + var m=fmat.match(/^BODY((?:\.PEEK)?)\[([^[\]]*)(?:\]\<([0-9]+)\.([0-9]+)\>)?/i); + var specifiers; + var i; + var tmp; + var part_name=''; + + function encode_binary_part(start, len, str) + { + if(start==undefined || start=='') + start=0; + else + start=parseInt(start,10); + if(len==undefined || len=='') + len=str.length; + else + len=parseInt(len,10); + return(encode_binary(str.substr(start,len))); + } + + part=mime; + if(m==null) + return(undefined); + if(m[1].toUpperCase()!='.PEEK') + set_seen_flag(); + part_name='BODY['+m[2]+']'; + specifiers=m[2].split('.'); + for(i=0; i<specifiers.length; i++) { + tmp=parseInt(specifiers[i], 10); + if(tmp > 0) { + if(part.mime != undefined && part.mime.parts != undefined && part.mime.parts[tmp-1]!=undefined) { + part=part.mime.parts[tmp-1]; + } + } + else + break; + } + if(m[3]!=undefined && m[3]!='') + part_name += '<'+m[3]+'>'; + switch(specifiers[i]) { + case 'HEADER': + if(specifiers[i+1]!=undefined) { + objtype='BODY['+specifiers.join('.'); + return undefined; + } + else + return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+"\r\n")+' '); + case 'MIME': + return(part_name+" "+encode_binary_part(m[3],m[4],part.headers[':mime:'].join('')+"\r\n")+' '); + case '': + if(specifiers.length==1) + return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+'\r\n'+part.text)+' '); + // Fall-through + case undefined: + case 'TEXT': + return(part_name+' '+encode_binary_part(m[3],m[4],part.text)+' '); + } + } + + function add_part(mime) { + var i; + var ret='('; + + if(mime.mime.parts != undefined) { + for(i in mime.mime.parts) + ret += add_part(mime.mime.parts[i]); + } + else + ret += encode_string(mime.mime.parsed['content-type'].vals[0])+" "; + + ret += encode_string(mime.mime.parsed['content-type'].vals[1])+" "; + if(mime.mime.parsed['content-type'].attrs==undefined) + ret += 'NIL '; + else { + ret += '('; + for(i in mime.mime.parsed['content-type'].attrs) { + ret += encode_string(i)+" "; + ret += encode_string(mime.mime.parsed['content-type'].attrs[i])+" "; + } + ret=ret.replace(/ $/, ") "); + } + if(mime.mime.parsed['content-id']==undefined) + ret += 'NIL '; + else + ret += encode_string(mime.mime.parsed['content-id'].vals[0])+' '; + if(mime.mime.parsed['content-description']==undefined) + ret += 'NIL '; + else + ret += encode_string(mime.mime.parsed['content-description'].vals[0])+' '; + + if(mime.mime.parsed['content-type'].vals[0]!='multipart') { + if(mime.mime.parsed['content-transfer-encoding']==undefined) + ret += 'NIL '; + else + ret += encode_string(mime.mime.parsed['content-transfer-encoding'].vals[0])+' '; + + ret += encode_token(mime.text.length.toString())+' '; + } + + if(mime.mime.parsed['content-type'].vals[0]=='text' || mime.mime.parsed['content-type'].vals[0]=='message') { + i=mime.text.split(/\x0d\x0a/); + ret=ret+encode_token(i.length.toString())+' '; + } + + if(extension) { + // TODO Add extension data... + } + + ret=ret.replace(/ $/, ') '); + return ret; + } + for(i in fmat) { /* * This bit is for when a paremeter includes a list. @@ -343,65 +464,6 @@ function send_fetch_response(msgnum, fmat, uid) * Handle the MIME stuff */ if(fmat[i].toUpperCase().substr(0,4)=='BODY') { - function get_mime_part(fmat) { - var m=fmat.match(/^BODY((?:\.PEEK)?)\[([^[\]]*)(?:\]\<([0-9]+)\.([0-9]+)\>)?/i); - var specifiers; - var i; - var tmp; - var part_name=''; - - function encode_binary_part(start, len, str) - { - if(start==undefined || start=='') - start=0; - else - start=parseInt(start,10); - if(len==undefined || len=='') - len=str.length; - else - len=parseInt(len,10); - return(encode_binary(str.substr(start,len))); - } - - part=mime; - if(m==null) - return(undefined); - if(m[1].toUpperCase()!='.PEEK') - set_seen_flag(); - part_name='BODY['+m[2]+']'; - specifiers=m[2].split('.'); - for(i=0; i<specifiers.length; i++) { - tmp=parseInt(specifiers[i], 10); - if(tmp > 0) { - if(part.mime != undefined && part.mime.parts != undefined && part.mime.parts[tmp-1]!=undefined) { - part=part.mime.parts[tmp-1]; - } - } - else - break; - } - if(m[3]!=undefined && m[3]!='') - part_name += '<'+m[3]+'>'; - switch(specifiers[i]) { - case 'HEADER': - if(specifiers[i+1]!=undefined) { - objtype='BODY['+specifiers.join('.'); - return undefined; - } - else - return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+"\r\n")+' '); - case 'MIME': - return(part_name+" "+encode_binary_part(m[3],m[4],part.headers[':mime:'].join('')+"\r\n")+' '); - case '': - if(specifiers.length==1) - return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+'\r\n'+part.text)+' '); - // Fall-through - case undefined: - case 'TEXT': - return(part_name+' '+encode_binary_part(m[3],m[4],part.text)+' '); - } - } - get_mime(); if((tmp=get_mime_part(fmat[i].toUpperCase()))==undefined) { @@ -410,59 +472,6 @@ function send_fetch_response(msgnum, fmat, uid) case 'BODY': extension=false; case 'BODYSTRUCTURE': - function add_part(mime) { - var i; - var ret='('; - - if(mime.mime.parts != undefined) { - for(i in mime.mime.parts) - ret += add_part(mime.mime.parts[i]); - } - else - ret += encode_string(mime.mime.parsed['content-type'].vals[0])+" "; - - ret += encode_string(mime.mime.parsed['content-type'].vals[1])+" "; - if(mime.mime.parsed['content-type'].attrs==undefined) - ret += 'NIL '; - else { - ret += '('; - for(i in mime.mime.parsed['content-type'].attrs) { - ret += encode_string(i)+" "; - ret += encode_string(mime.mime.parsed['content-type'].attrs[i])+" "; - } - ret=ret.replace(/ $/, ") "); - } - if(mime.mime.parsed['content-id']==undefined) - ret += 'NIL '; - else - ret += encode_string(mime.mime.parsed['content-id'].vals[0])+' '; - if(mime.mime.parsed['content-description']==undefined) - ret += 'NIL '; - else - ret += encode_string(mime.mime.parsed['content-description'].vals[0])+' '; - - if(mime.mime.parsed['content-type'].vals[0]!='multipart') { - if(mime.mime.parsed['content-transfer-encoding']==undefined) - ret += 'NIL '; - else - ret += encode_string(mime.mime.parsed['content-transfer-encoding'].vals[0])+' '; - - ret += encode_token(mime.text.length.toString())+' '; - } - - if(mime.mime.parsed['content-type'].vals[0]=='text' || mime.mime.parsed['content-type'].vals[0]=='message') { - i=mime.text.split(/\x0d\x0a/); - ret=ret+encode_token(i.length.toString())+' '; - } - - if(extension) { - // TODO Add extension data... - } - - ret=ret.replace(/ $/, ') '); - return ret; - } - resp += 'BODYSTRUCTURE '+add_part(mime); break; } @@ -732,7 +741,7 @@ function parse_command(line) } // Command handling functions -any_state_command_handlers = { +var any_state_command_handlers = { CAPABILITY:{ arguments:0, handler:function (args) { @@ -790,7 +799,7 @@ any_state_command_handlers = { } }; -unauthenticated_command_handlers = { +var unauthenticated_command_handlers = { STARTTLS:{ arguments:0, handler:function(args) { @@ -1322,7 +1331,7 @@ function display_list(cmd, groups) } } -authenticated_command_handlers = { +var authenticated_command_handlers = { SELECT:{ arguments:1, handler:function(args){ @@ -1850,7 +1859,7 @@ function do_search(args, uid) untagged("SEARCH "+result.join(" ")); } -selected_command_handlers = { +var selected_command_handlers = { CHECK:{ arguments:0, handler:function(args) { @@ -2040,15 +2049,6 @@ function read_cfg(sub) } } -var line; -var readonly=true; -var orig_ptrs={}; -var msg_ptrs={}; -var curr_status={exists:0,recent:0,unseen:0,uidnext:0,uidvalidity:0}; -var saved_config={mail:{scan_ptr:0}}; -var scan_ptr; -const RFC822HEADER = 0xb0; // from smbdefs.h - js.on_exit("exit_func()"); client.socket.send("* OK Give 'er\r\n"); while(1) {