diff options
Diffstat (limited to 'debian/pinentry-tqt/pinentry-tqt-1.2.1/tqt/main.cpp')
-rw-r--r-- | debian/pinentry-tqt/pinentry-tqt-1.2.1/tqt/main.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/debian/pinentry-tqt/pinentry-tqt-1.2.1/tqt/main.cpp b/debian/pinentry-tqt/pinentry-tqt-1.2.1/tqt/main.cpp new file mode 100644 index 00000000..af12b9bd --- /dev/null +++ b/debian/pinentry-tqt/pinentry-tqt-1.2.1/tqt/main.cpp @@ -0,0 +1,241 @@ +/* main.cpp - Secure KDE dialog for PIN entry. + * Copyright (C) 2002 Klarälvdalens Datakonsult AB + * Copyright (C) 2003 g10 Code GmbH + * Written by Steffen Hansen <steffen@klaralvdalens-datakonsult.se>. + * Modified by Marcus Brinkmann <marcus@g10code.de>. + * + * This program 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 program 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 program; if not, see <https://www.gnu.org/licenses/>. + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <errno.h> + +#include <ntqapplication.h> +#include <ntqwidget.h> +#include <ntqmessagebox.h> +#include "secqstring.h" + +#include "pinentrydialog.h" + +#include "pinentry.h" + +#ifdef FALLBACK_CURSES +#include <pinentry-curses.h> +#endif + +static TQString escape_accel( const TQString & s ) { + + TQString result; + result.reserve( 2 * s.length()); + + bool afterUnderscore = false; + + for ( unsigned int i = 0, end = s.length() ; i != end ; ++i ) { + const TQChar ch = s[i]; + if ( ch == TQChar ( '_' ) ) + { + if ( afterUnderscore ) // escaped _ + { + result += TQChar ( '_' ); + afterUnderscore = false; + } + else // accel + { + afterUnderscore = true; + } + } + else + { + if ( afterUnderscore || // accel + ch == TQChar ( '&' ) ) // escape & from being interpreted by TQt + result += TQChar ( '&' ); + result += ch; + afterUnderscore = false; + } + } + + if ( afterUnderscore ) + // trailing single underscore: shouldn't happen, but deal with it robustly: + result += TQChar ( '_' ); + + return result; +} + + +/* Hack for creating a TQWidget with a "foreign" window ID */ +class ForeignWidget : public TQWidget +{ +public: + ForeignWidget( WId wid ) : TQWidget( 0 ) + { + TQWidget::destroy(); + create( wid, false, false ); + } + + ~ForeignWidget() + { + destroy( false, false ); + } +}; + +static int +qt_cmd_handler (pinentry_t pe) +{ + TQWidget *parent = 0; + + int want_pass = !!pe->pin; + + if (want_pass) + { + /* FIXME: Add parent window ID to pinentry and GTK. */ + if (pe->parent_wid) + parent = new ForeignWidget (pe->parent_wid); + + PinEntryDialog pinentry (parent, NULL, true, !!pe->quality_bar); + + pinentry.setPinentryInfo (pe); + pinentry.setPrompt (TQString::fromUtf8 (pe->prompt)); + pinentry.setDescription (TQString::fromUtf8 (pe->description)); + /* If we reuse the same dialog window. */ +#if 0 + pinentry.setText (SecTQString::null); +#endif + + if (pe->ok) + pinentry.setOkText (escape_accel (TQString::fromUtf8 (pe->ok))); + else if (pe->default_ok) + pinentry.setOkText (escape_accel (TQString::fromUtf8 (pe->default_ok))); + + if (pe->cancel) + pinentry.setCancelText (escape_accel (TQString::fromUtf8 (pe->cancel))); + else if (pe->default_cancel) + pinentry.setCancelText + (escape_accel (TQString::fromUtf8 (pe->default_cancel))); + + if (pe->error) + pinentry.setError (TQString::fromUtf8 (pe->error)); + if (pe->quality_bar) + pinentry.setQualityBar (TQString::fromUtf8 (pe->quality_bar)); + if (pe->quality_bar_tt) + pinentry.setQualityBarTT (TQString::fromUtf8 (pe->quality_bar_tt)); + + bool ret = pinentry.exec (); + if (!ret) + return -1; + + char *pin = (char *) pinentry.text().utf8(); + if (!pin) + return -1; + + int len = strlen (pin); + if (len >= 0) + { + pinentry_setbufferlen (pe, len + 1); + if (pe->pin) + { + strcpy (pe->pin, pin); + ::secmem_free (pin); + return len; + } + } + ::secmem_free (pin); + return -1; + } + else + { + TQString desc = TQString::fromUtf8 (pe->description? pe->description : ""); + TQString ok = escape_accel + (TQString::fromUtf8 (pe->ok ? pe->ok : + pe->default_ok ? pe->default_ok : "_OK")); + TQString can = escape_accel + (TQString::fromUtf8 (pe->cancel ? pe->cancel : + pe->default_cancel? pe->default_cancel: "_Cancel")); + bool ret; + + ret = TQMessageBox::information (parent, "", desc, ok, can ); + + return !ret; + } +} + +pinentry_cmd_handler_t pinentry_cmd_handler = qt_cmd_handler; + +int +main (int argc, char *argv[]) +{ + pinentry_init ("pinentry-tqt"); + +#ifdef FALLBACK_CURSES + if (!pinentry_have_display (argc, argv)) + pinentry_cmd_handler = curses_cmd_handler; + else +#endif + { + /* TQt does only understand -display but not --display; thus we + are fixing that here. The code is pretty simply and may get + confused if an argument is called "--display". */ + char **new_argv, *p; + size_t n; + int i, done; + + for (n=0,i=0; i < argc; i++) + n += strlen (argv[i])+1; + n++; + new_argv = (char**)calloc (argc+1, sizeof *new_argv); + if (new_argv) + *new_argv = (char*)malloc (n); + if (!new_argv || !*new_argv) + { + fprintf (stderr, "pinentry-tqt: can't fixup argument list: %s\n", + strerror (errno)); + exit (EXIT_FAILURE); + + } + for (done=0,p=*new_argv,i=0; i < argc; i++) + if (!done && !strcmp (argv[i], "--display")) + { + new_argv[i] = (char*)"-display"; + done = 1; + } + else + { + new_argv[i] = strcpy (p, argv[i]); + p += strlen (argv[i]) + 1; + } + + /* We use a modal dialog window, so we don't need the application + window anymore. */ + i = argc; + new TQApplication (i, new_argv); + } + + + /* Consumes all arguments. */ + pinentry_parse_opts (argc, argv); +// if (pinentry_parse_opts (argc, argv)) +// { +// printf ("pinentry-tqt (pinentry) " VERSION "\n"); +// exit (EXIT_SUCCESS); +// } + + if (pinentry_loop ()) + return 1; + + return 0; +} |