[comp.windows.news] Some fixes to the Interactive connection server

scp@SFI.SANTAFE.EDU ("Stephen C. Pope") (02/24/89)

	After finding a few problems with Bret's Interactive Connection
Server, I thought I'd make the fixes available.  One bug was
was the server not recognizing connections from the local host
on machines which return an unqualified host name from localhostname,
but a fully qualified hostname from getsocketpeername.  The
fix is copied directly from the original server in init.ps.

	The Times-Roman font scaled up to 20 looked a little
funny to me (no flames please, to each his own...), so the
fonts were altered, and the canvas made a little longer so
it doesn't chop off any but the longest host names.  Also,
"reg" was changed to "always". Finally, since failing to respond
locks up the server to other connection requests, the connection
request will time out, returning a "no", after 30 seconds.

	As the original init.ps loads user.ps before starting
up the server, the following code can be placed entirely
within user.ps, and the server rebooted (exit and restart)
without having to shut down the old server.  I've not checked
to see if "/new start_new_server" is compatible with these mods.

Stephen C. Pope
Santa Fe Institute
scp@santafe.edu

% This is the code to define the new connection server into
% the systemdict.
%
%    New variables added into system dict:
%        /SecurityCanvas        --- dict containing all the information about the
%                                  popup window.
%        /SecurityPopup        --- The routine which popus up the window and waits
%                                  for a responce.
%        /LastConnectingHost    --- The name of the last host to have connected
%                                  into the server.
%        
/define_new_server {
    systemdict 
    begin
        gsave
            /SecurityCans 7 dict dup 
            begin
                /Times-Bold findfont 16 scalefont setfont
                /root framebuffer 230 75 createcanvas def
                /ptr /ptr_m root setstandardcursor
                root
                begin
                    /Transparent false def
                    /EventsConsumed /AllEvents def
                    /Retained true def
                end
                root setcanvas
                1 1 1 rgbcolor fillcanvas 0 0 0 rgbcolor strokecanvas
                /no root 66 37 createcanvas dup 
                begin
                    /Transparent false def
                    /EventsConsumed /AllEvents def
                    /Mapped true def
                    /Retained true def
                end 
                def
                no setcanvas
                0 0 0 rgbcolor dup setcolor strokecanvas
                20 14 moveto (NO) show

                /yes root 66 35 createcanvas dup 
                begin
                    /Transparent false def
                    /EventsConsumed /AllEvents def
                    /Mapped true def
                    /Retained true def
                end 
                def
                yes setcanvas 65 0 movecanvas
                0 0 0 rgbcolor dup setcolor strokecanvas
                18 12 moveto (YES) show

                /always root 96 35 createcanvas dup 
                begin
                    /Transparent false def
                    /EventsConsumed /AllEvents def
                    /Mapped true def
                    /Retained true def
                end 
                def
                always setcanvas 132 0 movecanvas
                0 0 0 rgbcolor dup setcolor strokecanvas
                13 12 moveto (ALWAYS) show

                /SecBoldFont /Times-Bold findfont 14 scalefont def
                /SecFont /Times-Roman findfont 12 scalefont def

                /SecurityAddInterests {
                    createevent dup 
                    begin
                        /Name LeftMouseButton def
                        /Action UpTransition def
                        /Canvas yes def
                    end 
                    expressinterest
                    createevent dup 
                    begin
                        /Name ascii_keymap def
                        /Action DownTransition def
                        /Canvas yes def
                    end 
                    expressinterest
                    createevent dup 
                    begin
                        /Name /AddFocusClient def
                        /Action [ currentprocess yes] def
                    end 
                    sendevent

                    createevent dup 
                    begin
                        /Name LeftMouseButton def
                        /Action UpTransition def
                        /Canvas no def
                    end 
                    expressinterest

                    createevent dup 
                    begin
                        /Name LeftMouseButton def
                        /Action UpTransition def
                        /Canvas always def
                    end 
                    expressinterest

                    createevent dup
                    begin
                        /Name /SecurityLift def
                    end
                    expressinterest

		    createevent dup
		    begin
			/Name /Timeout def
			/Canvas no def
		    end
		    expressinterest
		    
                } def
            end 
            def
        grestore

        /SecurityPopup { % (host hame) => true/false(should we allow connection)
            SecurityCans 
            begin
                gsave
                    currentcursorlocation 18 sub exch 99 sub exch
                    root setcanvas
                    movecanvas
                    1 1 1 rgbcolor fillcanvas
                    0 0 0 rgbcolor dup setcolor
                    strokecanvas
                    10 46 moveto
                    SecBoldFont setfont
                    (Connecting Host:  ) show
                    SecFont setfont
                    dup show
                    root /Mapped true put
                    createevent dup 
                    begin
                        /Name /SecurityLift def
                        /TimeStamp currenttime .03 add def
                    end 
                    sendevent
		    createevent dup
		    begin
			/Name /Timeout def
			/TimeStamp currenttime .5 add def
			/Canvas no def
		    end
		    sendevent
                    {
                        root canvastotop
                        awaitevent /Canvas get
                        [
                            yes {
                                pop true exit
                            }
                            no {
                                pop false exit
                            }
                            always {
                                % always canvas
                                systemdict /RemoteHostRegistry get
                                exch cvn 1 put
                                % systemdict /NetSecurityWanted false put
                                true
                                exit
                            }
                            /Default {
                                createevent dup 
                                begin
                                    /Name /SecurityLift def
                                    /TimeStamp currenttime .03 add def
                                end 
                                sendevent
                            }
                        ] case
                    } loop
                    root /Mapped false put
                grestore
            end
        } def
        /NetSecurityWanted true def

        /server {
            { 
                {
                    currentdict systemdict eq {
                        exit
                    } {
                        end
                    } ifelse
                } loop

                clear

                newprocessgroup

                SecurityCans 
                begin
                    SecurityAddInterests
                end

                { 
                    NeWS_socket (r) file 
                } stopped
                { 
                    clear (%socketl2000) (r) file 
                } if
                dup getsocketlocaladdress (NEWSSERVER) exch putenv
                (TERM) (PostScript) putenv
                { 
                    dup mark exch acceptconnection
                    dup getsocketpeername /LastConnectingHost exch def
                    RemoteHostRegistry LastConnectingHost known
		    LastConnectingHost localhostname anchorsearch
		    {
			pop (.) anchorsearch
			{
			    pop pop RemoteHostRegistry localhostname known
			} {
			    pop false
			} ifelse
		    } {
			pop false
		    } ifelse or
                    NetSecurityWanted not or {
                        true
                    } {
                        LastConnectingHost SecurityPopup
                    } ifelse
                    {
                        LastConnectingHost { 
                            200 dict 
                            begin 
                                initmatrix newprocessgroup
                                /OriginatingHost exch def
                                exch pop exch pop cvx exec
                                currentprocess killprocessgroup
                        } fork
                    } {
                        closefile
                    } ifelse
                    cleartomark
                } loop
            } fork pop 
        } def
    end
} def
%
% End of new server code...
%

define_new_server