mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-05 21:42:47 -05:00
Revamp of the local X11 connection code. We now parse X display
strings more rigorously, and then we look up the local X authority data in .Xauthority _ourself_ rather than delegating to an external xauth program. This is (negligibly) more efficient on Unix, assuming I haven't got it wrong in some subtle way, but its major benefit is that we can now support X authority lookups on Windows as well provided the user points us at an appropriate X authority file in the standard format. A new Windows-specific config option has been added for this purpose. [originally from svn r8305]
This commit is contained in:
88
ssh.h
88
ssh.h
@ -2,6 +2,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "puttymem.h"
|
||||
#include "tree234.h"
|
||||
#include "network.h"
|
||||
#include "int64.h"
|
||||
#include "misc.h"
|
||||
@ -327,28 +328,85 @@ extern void pfd_unthrottle(Socket s);
|
||||
extern void pfd_override_throttle(Socket s, int enable);
|
||||
|
||||
/* Exports from x11fwd.c */
|
||||
extern const char *x11_init(Socket *, char *, void *, void *, const char *,
|
||||
int, const Config *);
|
||||
enum {
|
||||
X11_TRANS_IPV4 = 0, X11_TRANS_IPV6 = 6, X11_TRANS_UNIX = 256
|
||||
};
|
||||
struct X11Display {
|
||||
/* Broken-down components of the display name itself */
|
||||
int unixdomain;
|
||||
char *hostname;
|
||||
int displaynum;
|
||||
int screennum;
|
||||
/* OSX sometimes replaces all the above with a full Unix-socket pathname */
|
||||
char *unixsocketpath;
|
||||
|
||||
/* PuTTY networking SockAddr to connect to the display, and associated
|
||||
* gubbins */
|
||||
SockAddr addr;
|
||||
int port;
|
||||
char *realhost;
|
||||
|
||||
/* Auth details we invented for the virtual display on the SSH server. */
|
||||
int remoteauthproto;
|
||||
unsigned char *remoteauthdata;
|
||||
int remoteauthdatalen;
|
||||
char *remoteauthprotoname;
|
||||
char *remoteauthdatastring;
|
||||
|
||||
/* Our local auth details for talking to the real X display. */
|
||||
int localauthproto;
|
||||
unsigned char *localauthdata;
|
||||
int localauthdatalen;
|
||||
|
||||
/*
|
||||
* Used inside x11fwd.c to remember recently seen
|
||||
* XDM-AUTHORIZATION-1 strings, to avoid replay attacks.
|
||||
*/
|
||||
tree234 *xdmseen;
|
||||
};
|
||||
/*
|
||||
* x11_setup_display() parses the display variable and fills in an
|
||||
* X11Display structure. Some remote auth details are invented;
|
||||
* the supplied authtype parameter configures the preferred
|
||||
* authorisation protocol to use at the remote end. The local auth
|
||||
* details are looked up by calling platform_get_x11_auth.
|
||||
*/
|
||||
extern struct X11Display *x11_setup_display(char *display, int authtype,
|
||||
const Config *);
|
||||
void x11_free_display(struct X11Display *disp);
|
||||
extern const char *x11_init(Socket *, struct X11Display *, void *,
|
||||
const char *, int, const Config *);
|
||||
extern void x11_close(Socket);
|
||||
extern int x11_send(Socket, char *, int);
|
||||
extern void *x11_invent_auth(char *, int, char *, int, int);
|
||||
extern void x11_free_auth(void *);
|
||||
extern void x11_unthrottle(Socket s);
|
||||
extern void x11_override_throttle(Socket s, int enable);
|
||||
extern int x11_get_screen_number(char *display);
|
||||
void x11_get_real_auth(void *authv, char *display);
|
||||
char *x11_display(const char *display);
|
||||
|
||||
/* Platform-dependent X11 functions */
|
||||
extern void platform_get_x11_auth(char *display, int *proto,
|
||||
unsigned char *data, int *datalen);
|
||||
extern const char platform_x11_best_transport[];
|
||||
/* best X11 hostname for this platform if none specified */
|
||||
SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
|
||||
char **canonicalname);
|
||||
/* make up a SockAddr naming the address for displaynum */
|
||||
extern void platform_get_x11_auth(struct X11Display *display,
|
||||
const Config *);
|
||||
/* examine a mostly-filled-in X11Display and fill in localauth* */
|
||||
extern const int platform_uses_x11_unix_by_default;
|
||||
/* choose default X transport in the absence of a specified one */
|
||||
SockAddr platform_get_x11_unix_address(const char *path, int displaynum);
|
||||
/* make up a SockAddr naming the address for displaynum */
|
||||
char *platform_get_x_display(void);
|
||||
/* allocated local X display string, if any */
|
||||
/* allocated local X display string, if any */
|
||||
/* Callbacks in x11.c usable _by_ platform X11 functions */
|
||||
/*
|
||||
* This function does the job of platform_get_x11_auth, provided
|
||||
* it is told where to find a normally formatted .Xauthority file:
|
||||
* it opens that file, parses it to find an auth record which
|
||||
* matches the display details in "display", and fills in the
|
||||
* localauth fields.
|
||||
*
|
||||
* It is expected that most implementations of
|
||||
* platform_get_x11_auth() will work by finding their system's
|
||||
* .Xauthority file, adjusting the display details if necessary
|
||||
* for local oddities like Unix-domain socket transport, and
|
||||
* calling this function to do the rest of the work.
|
||||
*/
|
||||
void x11_get_auth_from_authfile(struct X11Display *display,
|
||||
const char *authfilename);
|
||||
|
||||
Bignum copybn(Bignum b);
|
||||
Bignum bn_power_2(int n);
|
||||
|
Reference in New Issue
Block a user