Procházet zdrojové kódy

Display security state when asking for password

Indicate to the user how secure the transport channel is so they
can avoid entering their password for untrusted sites.
tags/v1.8.90
Pierre Ossman před 6 roky
rodič
revize
daf3d88aa1

+ 2
- 0
common/rfb/CConnection.h Zobrazit soubor

@@ -134,6 +134,8 @@ namespace rfb {
// Identities, to determine the unique(ish) name of the server.
const char* getServerName() const { return serverName.buf; }

bool isSecure() const { return csecurity ? csecurity->isSecure() : false; }

enum stateEnum {
RFBSTATE_UNINITIALISED,
RFBSTATE_PROTOCOL_VERSION,

+ 1
- 0
common/rfb/CSecurity.h Zobrazit soubor

@@ -49,6 +49,7 @@ namespace rfb {
virtual void destroy() { delete this; }
virtual int getType() const = 0;
virtual const char* description() const = 0;
virtual bool isSecure() const { return false; }

/*
* Use variable directly instead of dumb get/set methods.

+ 1
- 1
common/rfb/CSecurityPlain.cxx Zobrazit soubor

@@ -33,7 +33,7 @@ bool CSecurityPlain::processMsg(CConnection* cc)
CharArray username;
CharArray password;

(CSecurity::upg)->getUserPasswd(&username.buf, &password.buf);
(CSecurity::upg)->getUserPasswd(cc->isSecure(), &username.buf, &password.buf);

// Return the response to the server
os->writeU32(strlen(username.buf));

+ 9
- 0
common/rfb/CSecurityStack.cxx Zobrazit soubor

@@ -63,3 +63,12 @@ bool CSecurityStack::processMsg(CConnection* cc)

return res;
}

bool CSecurityStack::isSecure() const
{
if (state0 && state0->isSecure())
return true;
if (state == 1 && state1 && state1->isSecure())
return true;
return false;
}

+ 1
- 0
common/rfb/CSecurityStack.h Zobrazit soubor

@@ -32,6 +32,7 @@ namespace rfb {
virtual bool processMsg(CConnection* cc);
virtual int getType() const {return type;};
virtual const char* description() const {return name;}
virtual bool isSecure() const;
protected:
int state;
CSecurity* state0;

+ 1
- 0
common/rfb/CSecurityTLS.h Zobrazit soubor

@@ -48,6 +48,7 @@ namespace rfb {
virtual int getType() const { return anon ? secTypeTLSNone : secTypeX509None; }
virtual const char* description() const
{ return anon ? "TLS Encryption without VncAuth" : "X509 Encryption without VncAuth"; }
virtual bool isSecure() const { return !anon; }
static void setDefaults();

static StringParameter X509CA;

+ 6
- 0
common/rfb/CSecurityVeNCrypt.cxx Zobrazit soubor

@@ -191,3 +191,9 @@ bool CSecurityVeNCrypt::processMsg(CConnection* cc)
return csecurity->processMsg(cc);
}

bool CSecurityVeNCrypt::isSecure() const
{
if (csecurity && csecurity->isSecure())
return true;
return false;
}

+ 1
- 0
common/rfb/CSecurityVeNCrypt.h Zobrazit soubor

@@ -39,6 +39,7 @@ namespace rfb {
virtual bool processMsg(CConnection* cc);// { return true; }
int getType() const {return chosenType;}
virtual const char* description() const { return secTypeName(chosenType); }
virtual bool isSecure() const;

protected:
CSecurity *csecurity;

+ 1
- 1
common/rfb/CSecurityVncAuth.cxx Zobrazit soubor

@@ -49,7 +49,7 @@ bool CSecurityVncAuth::processMsg(CConnection* cc)
rdr::U8 challenge[vncAuthChallengeSize];
is->readBytes(challenge, vncAuthChallengeSize);
PlainPasswd passwd;
(CSecurity::upg)->getUserPasswd(0, &passwd.buf);
(CSecurity::upg)->getUserPasswd(cc->isSecure(), 0, &passwd.buf);

// Calculate the correct response
rdr::U8 key[8];

+ 1
- 1
common/rfb/UserPasswdGetter.h Zobrazit soubor

@@ -24,7 +24,7 @@ namespace rfb {
// dialog, getpass(), etc. The user buffer pointer can be null, in which
// case no user name will be retrieved. The caller MUST delete [] the
// result(s).
virtual void getUserPasswd(char** user, char** password)=0;
virtual void getUserPasswd(bool secure, char** user, char** password)=0;
};
}
#endif

+ 107
- 0
media/insecure.svg Zobrazit soubor

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg8"
inkscape:version="0.92+devel unknown"
sodipodi:docname="insecure.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="4.5653262"
inkscape:cy="11.192284"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1136"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-292.76665)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.26458333, 0.79374999"
id="rect878"
width="4.2333331"
height="4.2333331"
x="0"
y="292.76666" />
<rect
style="fill:#ff0000;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.26458333, 0.79375"
id="rect926"
width="4.2333331"
height="4.2333331"
x="-5.5511151e-17"
y="292.76666" />
<rect
style="fill:#000000;fill-opacity:1;stroke-width:0.10103943;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.20207887, 0.60623662"
id="rect12-3"
width="3.175"
height="1.8520833"
x="0.52916664"
y="294.61874"
ry="0.26457277" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.26458333, 0.79374999"
d="m 2.1166667,293.29579 a 1.0583332,1.0583332 0 0 0 -1.0583334,1.05833 v 0.79375 h 0.3601848 a 1.0583332,1.0583332 0 0 0 0.6981486,0.26458 1.0583332,1.0583332 0 0 0 0.6981486,-0.26458 H 3.175 v -0.79375 a 1.0583332,1.0583332 0 0 0 -1.0583333,-1.05833 z m 0,0.52916 a 0.52916664,0.52916664 0 0 1 0.5291666,0.52917 v 0.79375 H 1.5875 v -0.79375 a 0.52916664,0.52916664 0 0 1 0.5291667,-0.52917 z"
id="path913" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30752403;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.61504807, 1.84514421"
id="rect871"
width="4.4979167"
height="0.52916664"
x="-209.4492"
y="209.48177"
transform="rotate(-45)" />
<rect
transform="rotate(-45)"
y="210.0107"
x="-209.26234"
height="0.52916664"
width="4.6772137"
id="rect875"
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.30752403;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.61504807, 1.84514421"
ry="0" />
</g>
</svg>

+ 71
- 0
media/insecure.xpm Zobrazit soubor

@@ -0,0 +1,71 @@
/* XPM */
static char *insecure[] = {
/* columns rows colors chars-per-pixel */
"15 15 50 1 ",
" c black",
". c #020000",
"X c #050000",
"o c #080000",
"O c #0A0000",
"+ c #0C0000",
"@ c #0D0000",
"# c #0F0000",
"$ c #100000",
"% c #110000",
"& c #120000",
"* c #140000",
"= c #290000",
"- c #330000",
"; c #370000",
": c #430000",
"> c #560000",
", c #620000",
"< c #660000",
"1 c #6C0000",
"2 c #7D0000",
"3 c #800000",
"4 c #810000",
"5 c #840000",
"6 c #870000",
"7 c #950000",
"8 c #A20000",
"9 c #AB0000",
"0 c #B30000",
"q c #B40000",
"w c #C00000",
"e c #C40000",
"r c #CD0000",
"t c #DC0000",
"y c #DD0000",
"u c #DF0000",
"i c #E40000",
"p c #E50000",
"a c #E60000",
"s c #EA0000",
"d c #EB0000",
"f c #ED0000",
"g c #F00000",
"h c #F40000",
"j c #F90000",
"k c #FA0000",
"l c #FB0000",
"z c #FC0000",
"x c #FD0000",
"c c red",
/* pixels */
"ccccccccccccccc",
"ccccccjpkcr:fcc",
"ccccz6+ @1$ rcc",
"cccc2 O-o wccc",
"cccdX%tr# 4cccc",
"ccce >r& 7czccc",
"ccq< =O 8cg60cc",
"cs. 3cg; ac",
"cu 3cg; uc",
"cu 3cg; uc",
"c0 3cg; uc",
"r$ 3cg; uc",
", 5cg; *hc",
"l9lxiyyyyyyyhcc",
"ccccccccccccccc"
};

+ 83
- 0
media/secure.svg Zobrazit soubor

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg8"
inkscape:version="0.92+devel unknown"
sodipodi:docname="secure.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="19.34416"
inkscape:cy="11.532874"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1136"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-292.76665)">
<rect
style="fill:#00ff00;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.26458333, 0.79374999000000002"
id="rect926"
width="4.2333331"
height="4.2333331"
x="0"
y="292.76666" />
<rect
style="fill:#000000;fill-opacity:1;stroke-width:0.10103943;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.20207887, 0.60623661"
id="rect12"
width="3.175"
height="1.8520833"
x="0.52916664"
y="294.61874"
ry="0.26457277" />
<path
style="fill:#000000;stroke-width:0.49999997;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.99999999, 2.99999996"
d="M 8 2 A 3.9999996 3.9999996 0 0 0 4 6 L 4 9 L 5.3613281 9 A 3.9999996 3.9999996 0 0 0 8 10 A 3.9999996 3.9999996 0 0 0 10.638672 9 L 12 9 L 12 6 A 3.9999996 3.9999996 0 0 0 8 2 z M 8 4 A 1.9999999 1.9999999 0 0 1 10 6 L 10 9 L 6 9 L 6 6 A 1.9999999 1.9999999 0 0 1 8 4 z "
transform="matrix(0.26458333,0,0,0.26458333,0,292.76665)"
id="path913" />
</g>
</svg>

+ 56
- 0
media/secure.xpm Zobrazit soubor

@@ -0,0 +1,56 @@
/* XPM */
static char *secure[] = {
/* columns rows colors chars-per-pixel */
"15 15 35 1 ",
" c black",
". c #000200",
"X c #000500",
"o c #000A00",
"O c #000C00",
"+ c #000D00",
"@ c #001000",
"# c #001100",
"$ c #001400",
"% c #003300",
"& c #005500",
"* c #005600",
"= c #006600",
"- c #007D00",
"; c #007E00",
": c #008700",
"> c #008800",
", c #00B300",
"< c #00B400",
"1 c #00C400",
"2 c #00DB00",
"3 c #00DC00",
"4 c #00DD00",
"5 c #00DF00",
"6 c #00E500",
"7 c #00E600",
"8 c #00EA00",
"9 c #00EB00",
"0 c #00ED00",
"q c #00F000",
"w c #00F400",
"e c #00F900",
"r c #00FA00",
"t c #00FC00",
"y c green",
/* pixels */
"yyyyyyyyyyyyyyy",
"yyyyyye6ryyyyyy",
"yyyyt:O +>tyyyy",
"yyyy- o%o ;yyyy",
"yyy9X#3y2@X0yyy",
"yyy1 *yyy& 1yyy",
"yy<= %>>>% =,yy",
"y8. 7y",
"y5 5y",
"y5 5y",
"y5 5y",
"y5 5y",
"yw# $wy",
"yyq444444444wyy",
"yyyyyyyyyyyyyyy"
};

+ 28
- 3
vncviewer/UserDialog.cxx Zobrazit soubor

@@ -32,6 +32,7 @@
#include <FL/Fl_Secret_Input.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Return_Button.H>
#include <FL/Fl_Pixmap.H>

#include <rfb/util.h>
#include <rfb/Password.h>
@@ -42,8 +43,18 @@
#include "parameters.h"
#include "UserDialog.h"

/* xpm:s predate const, so they have invalid definitions */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwrite-strings"
#include "../media/secure.xpm"
#include "../media/insecure.xpm"
#pragma GCC diagnostic pop

using namespace rfb;

static Fl_Pixmap secure_icon(secure);
static Fl_Pixmap insecure_icon(insecure);

static int ret_val = 0;

static void button_cb(Fl_Widget *widget, void *val) {
@@ -59,7 +70,7 @@ UserDialog::~UserDialog()
{
}

void UserDialog::getUserPasswd(char** user, char** password)
void UserDialog::getUserPasswd(bool secure, char** user, char** password)
{
CharArray passwordFileStr(passwordFile.getData());

@@ -83,6 +94,7 @@ void UserDialog::getUserPasswd(char** user, char** password)
}

Fl_Window *win;
Fl_Box *banner;
Fl_Input *username;
Fl_Secret_Input *passwd;
Fl_Box *icon;
@@ -93,9 +105,22 @@ void UserDialog::getUserPasswd(char** user, char** password)
win = new Fl_Window(410, 145, _("VNC authentication"));
win->callback(button_cb,(void *)0);

y = 10;
banner = new Fl_Box(0, 0, win->w(), 20);
banner->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE|FL_ALIGN_IMAGE_NEXT_TO_TEXT);
banner->box(FL_FLAT_BOX);
if (secure) {
banner->label(_("This connection is secure"));
banner->color(FL_GREEN);
banner->image(secure_icon);
} else {
banner->label(_("This connection is not secure"));
banner->color(FL_RED);
banner->image(insecure_icon);
}

y = 20 + 10;

icon = new Fl_Box(10, 10, 50, 50, "?");
icon = new Fl_Box(10, y, 50, 50, "?");
icon->box(FL_UP_BOX);
icon->labelfont(FL_TIMES_BOLD);
icon->labelsize(34);

+ 1
- 1
vncviewer/UserDialog.h Zobrazit soubor

@@ -31,7 +31,7 @@ public:

// UserPasswdGetter callbacks

void getUserPasswd(char** user, char** password);
void getUserPasswd(bool secure, char** user, char** password);

// UserMsgBox callbacks


Načítá se…
Zrušit
Uložit