blob: c3aa2f3646395c81f76280f1cdb33667a396e217 [file] [log] [blame] [edit]
/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <FL/Fl.H>
#include <FL/fl_ask.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Input.H>
#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>
#include <rfb/Exception.h>
#include "i18n.h"
#include "fltk_layout.h"
#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) {
ret_val = (fl_intptr_t)val;
widget->window()->hide();
}
UserDialog::UserDialog()
{
}
UserDialog::~UserDialog()
{
}
void UserDialog::getUserPasswd(bool secure, char** user, char** password)
{
CharArray passwordFileStr(passwordFile.getData());
assert(password);
if (!user && passwordFileStr.buf[0]) {
ObfuscatedPasswd obfPwd(256);
FILE* fp;
fp = fopen(passwordFileStr.buf, "rb");
if (!fp)
throw rfb::Exception(_("Opening password file failed"));
obfPwd.length = fread(obfPwd.buf, 1, obfPwd.length, fp);
fclose(fp);
PlainPasswd passwd(obfPwd);
*password = passwd.takeBuf();
return;
}
Fl_Window *win;
Fl_Box *banner;
Fl_Input *username;
Fl_Secret_Input *passwd;
Fl_Box *icon;
Fl_Button *button;
int y;
win = new Fl_Window(410, 145, _("VNC authentication"));
win->callback(button_cb,(void *)0);
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, y, 50, 50, "?");
icon->box(FL_UP_BOX);
icon->labelfont(FL_TIMES_BOLD);
icon->labelsize(34);
icon->color(FL_WHITE);
icon->labelcolor(FL_BLUE);
y += 5;
if (user) {
(new Fl_Box(70, y, win->w()-70-10, 20, _("Username:")))
->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
y += 20 + 5;
username = new Fl_Input(70, y, win->w()-70-10, 25);
y += 25 + 5;
} else {
/*
* Compiler is not bright enough to understand that
* username won't be used further down...
*/
username = NULL;
}
(new Fl_Box(70, y, win->w()-70-10, 20, _("Password:")))
->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
y += 20 + 5;
passwd = new Fl_Secret_Input(70, y, win->w()-70-10, 25);
y += 25 + 5;
y += 5;
button = new Fl_Return_Button(310, y, 90, 25, fl_ok);
button->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
button->callback(button_cb, (void*)0);
button = new Fl_Button(210, y, 90, 25, fl_cancel);
button->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
button->callback(button_cb, (void*)1);
button->shortcut(FL_Escape);
y += 25 + 10;
win->end();
win->size(win->w(), y);
win->set_modal();
ret_val = -1;
win->show();
while (win->shown()) Fl::wait();
if (ret_val == 0) {
if (user)
*user = strDup(username->value());
*password = strDup(passwd->value());
}
delete win;
if (ret_val != 0)
throw rfb::Exception(_("Authentication cancelled"));
}
bool UserDialog::showMsgBox(int flags, const char* title, const char* text)
{
char buffer[1024];
if (fltk_escape(text, buffer, sizeof(buffer)) >= sizeof(buffer))
return 0;
// FLTK doesn't give us a flexible choice of the icon, so we ignore those
// bits for now.
fl_message_title(title);
switch (flags & 0xf) {
case M_OKCANCEL:
return fl_choice("%s", NULL, fl_ok, fl_cancel, buffer) == 1;
case M_YESNO:
return fl_choice("%s", NULL, fl_yes, fl_no, buffer) == 1;
case M_OK:
default:
if (((flags & 0xf0) == M_ICONERROR) ||
((flags & 0xf0) == M_ICONWARNING))
fl_alert("%s", buffer);
else
fl_message("%s", buffer);
return true;
}
return false;
}