merged sniperbeamer's patches

fixed bug #1828965


git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@149 b624d157-de02-0410-bad0-e51aec6abb33
master
tarek_saidi 17 years ago
parent 5a210a8e30
commit 01ac6b3544
  1. 8
      INSTALL
  2. 87
      changelog
  3. 40
      keepass.pro
  4. 14
      share/applications/keepassx.desktop
  5. 501
      share/pixmaps/keepassx.xpm
  6. 35
      src/Application_X11.cpp
  7. 34
      src/Application_X11.h
  8. 8
      src/Database.cpp
  9. 28
      src/Kdb3Database.cpp
  10. 3
      src/Kdb3Database.h
  11. 64
      src/KpxConfig.cpp
  12. 34
      src/KpxConfig.h
  13. 2
      src/crypto/sha256.h
  14. 5
      src/crypto/twofish.cpp
  15. 33
      src/dialogs/AboutDlg.cpp
  16. 2
      src/dialogs/AddBookmarkDlg.cpp
  17. 84
      src/dialogs/AutoTypeDlg.cpp
  18. 44
      src/dialogs/AutoTypeDlg.h
  19. 35
      src/dialogs/CustomizeDetailViewDlg.cpp
  20. 12
      src/dialogs/CustomizeDetailViewDlg.h
  21. 4
      src/dialogs/DatabaseSettingsDlg.cpp
  22. 2
      src/dialogs/DatabaseSettingsDlg.h
  23. 33
      src/dialogs/EditEntryDlg.cpp
  24. 6
      src/dialogs/EditEntryDlg.h
  25. 10
      src/dialogs/EditGroupDlg.cpp
  26. 2
      src/dialogs/EditGroupDlg.h
  27. 4
      src/dialogs/ExpiredEntriesDlg.cpp
  28. 2
      src/dialogs/ExpiredEntriesDlg.h
  29. 2
      src/dialogs/ManageBookmarksDlg.cpp
  30. 28
      src/dialogs/PasswordDlg.cpp
  31. 5
      src/dialogs/PasswordDlg.h
  32. 6
      src/dialogs/PasswordGenDlg.cpp
  33. 4
      src/dialogs/SearchDlg.cpp
  34. 16
      src/dialogs/SelectIconDlg.cpp
  35. 3
      src/dialogs/SelectIconDlg.h
  36. 141
      src/dialogs/SettingsDlg.cpp
  37. 21
      src/dialogs/SettingsDlg.h
  38. 2
      src/dialogs/SimplePasswordDlg.cpp
  39. 4
      src/dialogs/TrashCanDlg.cpp
  40. 2
      src/dialogs/TrashCanDlg.h
  41. 2
      src/export/Export.cpp
  42. 2
      src/export/Export.h
  43. 8
      src/export/Export_KeePassX_Xml.h
  44. 6
      src/export/Export_Txt.h
  45. 20
      src/forms/AboutDlg.ui
  46. 81
      src/forms/AutoTypeDlg.ui
  47. 114
      src/forms/CustomizeDetailViewDlg.ui
  48. 236
      src/forms/DatabaseSettingsDlg.ui
  49. 83
      src/forms/EditGroupDlg.ui
  50. 122
      src/forms/MainWindow.ui
  51. 63
      src/forms/PasswordDlg.ui
  52. 115
      src/forms/SearchDlg.ui
  53. 160
      src/forms/SelectIconDlg.ui
  54. 526
      src/forms/SettingsDlg.ui
  55. 2
      src/import/Import.h
  56. 2
      src/import/Import_GnuKeyRing.h
  57. 4
      src/import/Import_KWalletXml.h
  58. 2
      src/import/Import_KeePassX_Xml.cpp
  59. 4
      src/import/Import_KeePassX_Xml.h
  60. 12
      src/import/Import_PwManager.cpp
  61. 4
      src/import/Import_PwManager.h
  62. 50
      src/lib/AutoType.h
  63. 1286
      src/lib/AutoType_X11.cpp
  64. 26
      src/lib/EntryView.cpp
  65. 3
      src/lib/EntryView.h
  66. 1
      src/lib/FileDialogs.h
  67. 22
      src/lib/GroupView.cpp
  68. 2
      src/lib/GroupView.h
  69. 899
      src/lib/HelperX11.cpp
  70. 57
      src/lib/HelperX11.h
  71. 4
      src/lib/SecString.h
  72. 118
      src/lib/ShortcutWidget.cpp
  73. 49
      src/lib/ShortcutWidget.h
  74. 75
      src/lib/bookmarks.cpp
  75. 4
      src/lib/bookmarks.h
  76. 4
      src/lib/random.cpp
  77. 275
      src/main.cpp
  78. 11
      src/main.h
  79. 420
      src/mainwindow.cpp
  80. 29
      src/mainwindow.h
  81. 62
      src/src.pro
  82. 1245
      src/translations/keepass-cs_CS.ts
  83. 1261
      src/translations/keepass-de_DE.ts
  84. 1236
      src/translations/keepass-es_ES.ts
  85. 1279
      src/translations/keepass-fr_FR.ts
  86. 1223
      src/translations/keepass-ru_RU.ts
  87. 1604
      src/translations/keepass-xx_XX.ts

@ -0,0 +1,8 @@
Installation instructions for *nix:
-----------------------------------
1. qmake-qt4 / qmake
You have to use qmake of Qt >= 4.2.0, depending on your distro it is called qmake or qmake-qt4.
By default KeePassX is installed to /usr, you can change that by adding PREFIX=[PATH] to the qmake command.
You can also add RELEASE=1 to build KeePassX optimized.
2. make
3. make install

@ -1,16 +1,83 @@
---------------
0.2.3
0.2.2.6
---------------
-fixed to long Auto-Type delay
-fixed wrong text color in the password repeation box when using new Qt versions (Bug #???)
-fixed problem with the assignment of group icons (custom icons metastream format rev 3)
-more stable drag&drop implementation which also works under MacOSX
-new more robust and flexible database back-end api
-replaced old AES implementation by the latest version of Brian Gladman's implementation.
-now using strong random number generator 'yarrow' instead of the standard library functions.
-final program icon
-bookmarks and the Detail View are saved in the config file
-fixed bug that caused unlock not to work when 'Remember last opened file' is disabled or the the search is used
-loading default Detail View didn't work
---------------
0.2.2.5
---------------
-fixed critical bug that caused the database to be only opened/saved with the keyfile when keyfile and password were selected
-fixed crash that could occur when locking a database that has unsaved changes
-don't hide window to tray if a modal window is opened
-auto-Type window is always on top and columns are automatically resized
---------------
0.2.2.4
---------------
-window is now minimized to tray even if the unlock dialog is shown
-fixed problem when restoring window using the tray icon
-support custom commands and placeholders in entry urls
-improved custom browser selection in the settings dialog
-all dialogs use the native button order
-window title indicates if there are unsaved changes
-improved many translation strings
---------------
0.2.2.3
---------------
-fixed a crash when the database is locked and KeePassX is restored
-fixed KeePassX is not always properly minimized after auto-type
-fixed global auto-type not working on non-ascii window titles
-added a setting to optionally use entry titles to match window for global auto-type
-added support for the delay command in auto-type
-expired entries are not used for global auto-type
-comparison of window titles is now always case-insensitive
-fixed cmd option -help didn't work
-output help on unrecognized argument
-fixed typo in desktop file
---------------
0.2.2.2
---------------
-added support for multiple Auto-Type-Window definitions
fully compatible to KeePass (http://keepass.info/help/base/autotype.html#autoglobal)
-added settings and command line options to start minimized and/or locked
-fixed window not always hidden when using 'Minimize to tray instead of taskbar'
-added pixmap and desktop file
-fixed a bunch of compiler warnings
---------------
0.2.2.1
---------------
Changes by Felix Geyer:
-added Global Auto-Type feature
-added database locking feature
-saves the sort column and order of the entry view
-added options 'Minimize to tray instead of taskbar', 'Lock workspace when minimizing the main window' and 'Global Auto-Type Shortcut'
-fixed Auto-Type while still holding modifier keys (ctrl, shift, ...) and caps lock
-fixed Auto-Type puts space at the beginning when using custom Auto-Type format
-fixed auto-typing of some non-Latin1 chars
-fixed crash when trying to auto-type invalid chars
-left click on the tray icon brings the main window to front when it's not the active window, otherwise hides it
-fixed a bunch of compiler warnings
-disabled all not yet working features
Official changes:
-system tray icon
-fine tuning options for auto-type
-fully customizable HTML based detail view
-secure random number generator based on Yarrow including an optional entropy collector
-new dialog to view expiered entries
-calendar widget to edit expiration dates in a more confortable way
-restructured password generator
-much better appearance under MacOS X
-final program icon
-misc. visual improvements
-new more robust and flexible database back-end api
-replaced old AES implementation by the latest version of Brian Gladman's implementation.
-(maybe incomplete)
---------------
0.2.2
@ -30,6 +97,7 @@
-alpha blending for banner icons
-new standard banner icon
-MacOS packages: all Qt libraries are now included in the application bundle (extra installation is not longer necessary)
---------------
0.2.1
---------------
@ -43,6 +111,7 @@
for entries which don't expire
-entry view now gets updated after changing the column setup
-added menu entry to change the size of the toolbar icons
---------------
0.2.0
---------------

@ -1,28 +1,28 @@
message("See 'Install.txt' for configuration options.")
message("*** Build Configuration:")
message("See 'INSTALL' for configuration options.")
#message("*** Build Configuration:")
TEMPLATE = subdirs
isEmpty(PREFIX){
PREFIX = /usr
}
isEmpty(KDEDIR){
KDEDIR = /usr
}
#isEmpty(KDEDIR){
# KDEDIR = /usr
#}
SUBDIRS += src
contains(INT_PLUGINS,kde) {
SUBDIRS +=src/plugins/kde
message("Build KDE Plugin: yes")
}
!contains(INT_PLUGINS,kde) {
message("Build KDE Plugin: no")
}
contains(INT_PLUGINS,gtk) {
SUBDIRS +=src/plugins/gnome
message("Build Gnome Plugin: yes")
}
!contains(INT_PLUGINS,gtk) {
message("Build Gnome Plugin: no")
}
#contains(INT_PLUGINS,kde) {
# SUBDIRS +=src/plugins/kde
# message("Build KDE Plugin: yes")
#}
#!contains(INT_PLUGINS,kde) {
# message("Build KDE Plugin: no")
#}
#contains(INT_PLUGINS,gtk) {
# SUBDIRS +=src/plugins/gnome
# message("Build Gnome Plugin: yes")
#}
#!contains(INT_PLUGINS,gtk) {
# message("Build Gnome Plugin: no")
#}
message("Install Prefix:" $$PREFIX)
message("KDE Prefix:" $$KDEDIR)
#message("KDE Prefix:" $$KDEDIR)
message("*** Makefile successfully generated.")
message("*** Start make now.")

@ -0,0 +1,14 @@
[Desktop Entry]
Encoding=UTF-8
Name=KeePassX
GenericName=Cross Platform Password Manager
GenericName[fr]=Gestionnaire de mot de passe
GenericName[de]=Passwortverwaltung
Exec=keepassx
Icon=keepassx.xpm
Comment=Cross Platform Password Manager
Comment[fr]=Gestionnaire de mot de passe
Comment[de]=Passwortverwaltung
Terminal=false
Type=Application
Categories=Qt;Utility;

@ -0,0 +1,501 @@
/* XPM */
static char * keepassx2_xpm[] = {
"32 32 466 2",
" c None",
". c #000000",
"+ c #181B16",
"@ c #0B0C0A",
"# c #6E7967",
"$ c #9BA596",
"% c #CBCFCA",
"& c #FAFAFA",
"* c #9CA696",
"= c #707D68",
"- c #0D110B",
"; c #343A30",
"> c #BCC3B8",
", c #FFFFFF",
"' c #FEFEFE",
") c #CED1CC",
"! c #ADB6A8",
"~ c #E6E7E5",
"{ c #BDC4B9",
"] c #3A4435",
"^ c #010101",
"/ c #4D5549",
"( c #EDEEED",
"_ c #FBFBFB",
": c #92A588",
"< c #66914E",
"[ c #65A142",
"} c #6EB048",
"| c #639B44",
"1 c #70975B",
"2 c #B7C0B1",
"3 c #55614D",
"4 c #030303",
"5 c #788375",
"6 c #839080",
"7 c #869283",
"8 c #899586",
"9 c #748270",
"0 c #060905",
"a c #141713",
"b c #D1D6CF",
"c c #EAECEA",
"d c #71935E",
"e c #63A93B",
"f c #64AB3C",
"g c #64AA3B",
"h c #63AA3A",
"i c #5F9F3A",
"j c #8A9E7F",
"k c #D1D7CF",
"l c #191F15",
"m c #E5E5E5",
"n c #909D8C",
"o c #111310",
"p c #8A9385",
"q c #88A07A",
"r c #6AAE44",
"s c #6BAE44",
"t c #64A93D",
"u c #628A4B",
"v c #637957",
"w c #5A903C",
"x c #67A543",
"y c #AFB8A9",
"z c #8F9B88",
"A c #E2E2E2",
"B c #AEB5AC",
"C c #BABFB8",
"D c #F9F9F9",
"E c #8E9A8A",
"F c #050805",
"G c #131513",
"H c #F2F2F2",
"I c #C2C9BE",
"J c #64A042",
"K c #6AAE43",
"L c #718367",
"M c #FCFCFC",
"N c #9D9D9D",
"O c #365424",
"P c #678F4F",
"Q c #F5F5F5",
"R c #1B2317",
"S c #DEDEDE",
"T c #B8BDB7",
"U c #2E7922",
"V c #337D24",
"W c #63825D",
"X c #869382",
"Y c #080A08",
"Z c #3E443A",
"` c #8CA281",
" . c #5FA539",
".. c #62A83B",
"+. c #5DA135",
"@. c #BFC1BE",
"#. c #30302F",
"$. c #63A240",
"%. c #BCC2B8",
"&. c #4A5742",
"*. c #D9DAD9",
"=. c #BBC0BB",
"-. c #3A7E31",
";. c #408735",
">. c #428935",
",. c #6D8866",
"'. c #869282",
"). c #0E0F0E",
"!. c #6B7667",
"~. c #7B9A6D",
"{. c #65A845",
"]. c #68AB46",
"^. c #6CAE47",
"/. c #65A440",
"(. c #A0A0A0",
"_. c #EAEAEA",
":. c #242424",
"<. c #76A45B",
"[. c #A3B29A",
"}. c #73816B",
"|. c #D2D3D2",
"1. c #FDFDFD",
"2. c #70886E",
"3. c #317A27",
"4. c #357F29",
"5. c #378029",
"6. c #6C8667",
"7. c #7C8A79",
"8. c #020301",
"9. c #7E8A79",
"0. c #689058",
"a. c #569E34",
"b. c #59A135",
"c. c #5CA437",
"d. c #5FA737",
"e. c #60A836",
"f. c #3F4F37",
"g. c #A6A6A6",
"h. c #C4C4C4",
"i. c #515151",
"j. c #0D1309",
"k. c #64AA3C",
"l. c #93AA87",
"m. c #819078",
"n. c #546153",
"o. c #6E876B",
"p. c #367E2D",
"q. c #3A832F",
"r. c #3C8430",
"s. c #728A6D",
"t. c #7C8879",
"u. c #0F0F0F",
"v. c #758071",
"w. c #809C75",
"x. c #5DA140",
"y. c #60A441",
"z. c #64A743",
"A. c #67AA45",
"B. c #6BAD47",
"C. c #5F963F",
"D. c #2E4223",
"E. c #181818",
"F. c #273420",
"G. c #6F9E55",
"H. c #AAB7A3",
"I. c #697861",
"J. c #020202",
"K. c #687468",
"L. c #6B8668",
"M. c #377F2F",
"N. c #3B8331",
"O. c #3C8230",
"P. c #758D71",
"Q. c #838E80",
"R. c #DADCD9",
"S. c #8FA289",
"T. c #559B3A",
"U. c #599E3B",
"V. c #5BA13C",
"W. c #5FA43D",
"X. c #61A73E",
"Y. c #64A93F",
"Z. c #67AC40",
"`. c #67A743",
" + c #67AC3F",
".+ c #CFD2CD",
"++ c #3C4936",
"@+ c #717E71",
"#+ c #638060",
"$+ c #2E7A26",
"%+ c #317D26",
"&+ c #337C27",
"*+ c #788D73",
"=+ c #DBDEDB",
"-+ c #558246",
";+ c #4E9734",
">+ c #529936",
",+ c #559C37",
"'+ c #59A039",
")+ c #5CA23B",
"!+ c #61A63D",
"~+ c #64A83F",
"{+ c #66AC40",
"]+ c #68AD40",
"^+ c #799669",
"/+ c #D8DBD7",
"(+ c #0F150B",
"_+ c #879287",
":+ c #F8F8F8",
"<+ c #658262",
"[+ c #3B8233",
"}+ c #3E8534",
"|+ c #3E8333",
"1+ c #7E927A",
"2+ c #EDEEEC",
"3+ c #5E8355",
"4+ c #51953C",
"5+ c #54983E",
"6+ c #579B3E",
"7+ c #5A9E3F",
"8+ c #5DA141",
"9+ c #60A442",
"0+ c #64A744",
"a+ c #66A945",
"b+ c #6AAC46",
"c+ c #67984B",
"d+ c #D9DCD8",
"e+ c #6E7C66",
"f+ c #050505",
"g+ c #090A09",
"h+ c #939E92",
"i+ c #F6F6F6",
"j+ c #5A7C57",
"k+ c #2C7823",
"l+ c #2E7A24",
"m+ c #317924",
"n+ c #7D9179",
"o+ c #5F7F58",
"p+ c #3B8628",
"q+ c #3E892A",
"r+ c #428C2B",
"s+ c #41892A",
"t+ c #468430",
"u+ c #4B952F",
"v+ c #4E9831",
"w+ c #529B32",
"x+ c #559E33",
"y+ c #59A235",
"z+ c #648F4E",
"A+ c #C3C9BF",
"B+ c #AEB7A8",
"C+ c #040603",
"D+ c #040404",
"E+ c #0A0C0A",
"F+ c #A3ADA3",
"G+ c #F3F3F3",
"H+ c #5D7E5A",
"I+ c #398132",
"J+ c #3E8434",
"K+ c #3D8132",
"L+ c #438935",
"M+ c #478C38",
"N+ c #498F39",
"O+ c #4C9039",
"P+ c #7C9275",
"Q+ c #CDD1CB",
"R+ c #7D9874",
"S+ c #658B56",
"T+ c #5E8A4C",
"U+ c #78986A",
"V+ c #92A589",
"W+ c #EEEEED",
"X+ c #BFC7BB",
"Y+ c #323D2D",
"Z+ c #080808",
"`+ c #181C18",
" @ c #B3BAB3",
".@ c #EFF0EF",
"+@ c #567B54",
"@@ c #327C2B",
"#@ c #347E2B",
"$@ c #38812D",
"%@ c #3B852E",
"&@ c #3E872E",
"*@ c #6C8965",
"=@ c #82907B",
"-@ c #141A13",
";@ c #0A0A0A",
">@ c #171817",
",@ c #ACB4AC",
"'@ c #638262",
")@ c #2A7624",
"!@ c #2E7927",
"~@ c #327C28",
"{@ c #5E8158",
"]@ c #848F81",
"^@ c #6E7E6B",
"/@ c #919F8D",
"(@ c #ABB4A8",
"_@ c #8E9C88",
":@ c #63725D",
"<@ c #313C2B",
"[@ c #0B0B0B",
"}@ c #121512",
"|@ c #ADB4AD",
"1@ c #698469",
"2@ c #2F772D",
"3@ c #337A30",
"4@ c #357D31",
"5@ c #3C8334",
"6@ c #547E4D",
"7@ c #DCDFDC",
"8@ c #EEEFEE",
"9@ c #525F4E",
"0@ c #101311",
"a@ c #A8B1A8",
"b@ c #658165",
"c@ c #1A681B",
"d@ c #1B691C",
"e@ c #1D6C1C",
"f@ c #216F1D",
"g@ c #24721F",
"h@ c #277520",
"i@ c #2B7822",
"j@ c #497843",
"k@ c #DADDD9",
"l@ c #E6E8E5",
"m@ c #3F4C3D",
"n@ c #151815",
"o@ c #AAB2AA",
"p@ c #6F876F",
"q@ c #2A722B",
"r@ c #2C752D",
"s@ c #316B32",
"t@ c #799179",
"u@ c #829882",
"v@ c #8B9F8A",
"w@ c #4F794D",
"x@ c #388032",
"y@ c #527E4C",
"z@ c #DEE0DD",
"A@ c #424D40",
"B@ c #0E110E",
"C@ c #A7B0A7",
"D@ c #708870",
"E@ c #236C24",
"F@ c #246F25",
"G@ c #236F24",
"H@ c #306431",
"I@ c #DDE0DD",
"J@ c #447341",
"K@ c #2E7827",
"L@ c #307A27",
"M@ c #4A7844",
"N@ c #D7DAD6",
"O@ c #D4D9D3",
"P@ c #2C3629",
"Q@ c #121412",
"R@ c #A6B0A6",
"S@ c #728972",
"T@ c #206A21",
"U@ c #226E23",
"V@ c #677667",
"W@ c #98A298",
"X@ c #D5DAD5",
"Y@ c #427340",
"Z@ c #317B2C",
"`@ c #357E2D",
" # c #4D7A47",
".# c #D6D9D5",
"+# c #CBD1CA",
"@# c #31382D",
"## c #131313",
"$# c #919B91",
"%# c #798D79",
"&# c #2A702B",
"*# c #286C29",
"=# c #29652A",
"-# c #365A36",
";# c #6B7A6B",
"># c #151715",
",# c #A6AEA6",
"'# c #CCD1CC",
")# c #41733F",
"!# c #357D2F",
"~# c #378030",
"{# c #4D7A46",
"]# c #D3D8D3",
"^# c #C1C7C0",
"/# c #20281F",
"(# c #B5BAB5",
"_# c #788E79",
":# c #186419",
"<# c #19681A",
"[# c #3E6E3E",
"}# c #C1C5C1",
"|# c #697A69",
"1# c #111511",
"2# c #ADB6AE",
"3# c #C1C9C1",
"4# c #346C31",
"5# c #287422",
"6# c #2C7825",
"7# c #457640",
"8# c #D1D6D0",
"9# c #AFB6AD",
"0# c #020502",
"a# c #B7BCB7",
"b# c #296C2A",
"c# c #447345",
"d# c #D7DAD7",
"e# c #D6D8D6",
"f# c #C3C7C3",
"g# c #C3C6C3",
"h# c #5F6F5F",
"i# c #161C16",
"j# c #BBC2BB",
"k# c #BAC2BA",
"l# c #3C733A",
"m# c #367E31",
"n# c #398133",
"o# c #4F744B",
"p# c #E2E3E2",
"q# c #0C110A",
"r# c #B6BBB6",
"s# c #216B22",
"t# c #396C3A",
"u# c #CDD2CD",
"v# c #B4BDB5",
"w# c #171E17",
"x# c #1F251F",
"y# c #C3C9C3",
"z# c #AEB8AE",
"A# c #2E6B2B",
"B# c #267321",
"C# c #396A34",
"D# c #DCDDDB",
"E# c #020701",
"F# c #EFEFEF",
"G# c #B1B8B1",
"H# c #D9DBD9",
"I# c #C9CFC9",
"J# c #1D271D",
"K# c #090909",
"L# c #222A23",
"M# c #CDD1CD",
"N# c #C0C7C0",
"O# c #A3B0A3",
"P# c #D7D9D7",
"Q# c #080B07",
"R# c #B1B6B1",
"S# c #F7F7F7",
"T# c #D7DAD8",
"U# c #364336",
"V# c #2F382F",
"W# c #D6DAD7",
"X# c #D0D4D0",
"Y# c #030603",
"Z# c #0C120C",
"`# c #0D150E",
" $ c #090F09",
".$ c #262F26",
"+$ c #485648",
"@$ c #475647",
"#$ c #475646",
"$$ c #404E3F",
" . . . + . . . ",
" @ # $ % & % * = - . ",
" . ; > , ' ) ! ~ , , { ] ^ ",
". . . . . . . / ( _ : < [ } | 1 2 , ( 3 . ",
"4 5 6 7 8 9 0 a b c d e f g g g h i j , k l . ",
"4 m , , , , n o ^ p , q r r s s t u v w x y , z 4 ",
". A ( B C D , E F G H I J s r r K L M , N O P Q H R . ",
". S T U V W _ , X Y Z , ` ...f f +.@., , ' #.$.%., &.. ",
". *.=.-.;.>.,.M , '.). . !., ~.{.].^.} /.(., , _.:.<.[., }.. ",
". |.1.2.3.4.5.6.1., 7.8.. 9., 0.a.b.c.d.e.f.g.h.i.j.k.l., m.. ",
". n.M M o.p.q.r.s.' , t.u.v., w.x.y.z.A.B.C.D.E.F.G.} H., I.. ",
" J.K., _ L.M.N.O.P.' , Q.R., S.T.U.V.W.X.Y.Z.`. + +i .+, ++. ",
" . @+, & #+$+%+&+*+, , , =+-+;+>+,+'+)+!+~+{+]+]+^+, /+(+. ",
" . ^ _+, :+<+[+}+|+1+, 2+3+4+5+6+7+8+9+0+a+b+^.c+d+, e+f+ ",
" . g+h+, i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+, B+C+D+ ",
" . E+F+, G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+, X+Y+Z+ ",
" . `+ @, .@+@@@#@$@%@&@*@1., , , , , , :+=@-@;@. ",
" >@,@, _ '@)@!@~@4.{@:+, ]@^@/@(@_@:@<@^ [@ ",
" }@|@, M 1@2@3@4@I+5@6@7@, 8@9@. . ^ f+4 . ",
" 0@a@, 1.b@c@d@e@f@g@h@i@j@k@, l@m@f+ ",
" n@o@, ' p@q@r@s@t@u@v@w@x@[+y@d+, z@A@;@ ",
" B@C@, , D@E@F@G@H@, , , I@J@K@L@M@N@, O@P@. ",
" Q@R@, , S@T@U@U@G@H@, V@W@, X@Y@Z@`@ #.#, +#@### ",
". $#, , %#&#r@r@*#=#-#, ;#>#,#, '#)#!#~#{#]#, ^#/#. ",
". (#, _#:#<#<#[#}#_.1., |#. 1#2#, 3#4#5#6#7#8#, 9#0# ",
". a#}#b#r@r@c#d#, e#f#g#h#. . i#j#, k#l#m#n#o#, p#q#. ",
". r#a#s#U@t#u#, v#w#. . . . . x#y#, z#A#B#C#, D#E#. ",
". r#F#G#G#H#, I#J#K#. . . . . L#M#, N#O#R@, P#Q#. ",
". R#S#S#S#S#T#U#;@ . V#W#, , , , X#Y#. ",
". Z#`#`#`#`# $D+. . .$+$@$@$#$$$. . ",
". . . . . . . . . . . . . . . ",
" "};

@ -0,0 +1,35 @@
/***************************************************************************
* Copyright (C) 2005-2008 by Felix Geyer *
* *
* 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; version 2 of the License. *
* *
* 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, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "Application_X11.h"
#include "lib/AutoType.h"
#include "lib/HelperX11.h"
KeepassApplication::KeepassApplication(int& argc, char** argv) : QApplication(argc, argv){
}
bool KeepassApplication::x11EventFilter(XEvent* event){
static const unsigned int remove_invalid = ControlMask|ShiftMask|Mod1Mask|Mod5Mask|Mod4Mask;
if (event->type==KeyPress && AutoType::shortcut.key!=0u && event->xkey.keycode==XKeysymToKeycode(event->xkey.display,HelperX11::getKeysym(AutoType::shortcut.key)) && (event->xkey.state&remove_invalid)==HelperX11::getShortcutModifierMask(AutoType::shortcut) && QApplication::focusWidget()==NULL ){
AutoType::performGlobal();
return true;
}
else
return QApplication::x11EventFilter(event);
}

@ -0,0 +1,34 @@
/***************************************************************************
* Copyright (C) 2005-2008 by Felix Geyer *
* *
* 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; version 2 of the License. *
* *
* 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, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef APPLICATION_X11_H
#define APPLICATION_X11_H
#include <QApplication>
class KeepassApplication : public QApplication
{
Q_OBJECT
public:
KeepassApplication(int& argc, char** argv);
bool x11EventFilter(XEvent* event);
};
#endif // APPLICATION_X11_H

@ -20,6 +20,7 @@
#include "Database.h"
#include "lib/random.h"
#include <QCoreApplication>
KpxUuid::KpxUuid(){
Data.fill(0,16);
@ -76,12 +77,12 @@ bool KpxUuid::operator!=(const KpxUuid& other)const{
QString KpxDateTime::toString(Qt::DateFormat format) const{
if(*this==Date_Never)return QObject::tr("Never");
if(*this==Date_Never)return QCoreApplication::translate("Database","Never");
else return QDateTime::toString(format);
}
QString KpxDateTime::dateToString(Qt::DateFormat format) const{
if(*this==Date_Never)return QObject::tr("Never");
if(*this==Date_Never)return QCoreApplication::translate("Database","Never");
else return date().toString(format);
}
@ -107,7 +108,8 @@ bool KpxDateTime::operator<(const QDateTime& other){
if(*this==Date_Never && other==Date_Never)return false;
if(*this==Date_Never)return false;
if(other==Date_Never)return true;
return false;
}

@ -20,10 +20,9 @@
#include "global.h"
#include <iostream>
#include <time.h>
#include <qfile.h>
#include <qstringlist.h>
#include <qobject.h>
#include <qdatetime.h>
#include <QFile>
#include <QStringList>
#include <QDateTime>
#include <QSysInfo>
#include <QBuffer>
#include <QDir>
@ -135,11 +134,13 @@ bool Kdb3Database::isMetaStream(StdEntry& p){
bool Kdb3Database::parseCustomIconsMetaStreamV1(const QByteArray& dta){
Q_UNUSED(dta)
qDebug("Removed old CuIcMeSt v1");
return true;
}
bool Kdb3Database::parseCustomIconsMetaStreamV2(const QByteArray& dta){
Q_UNUSED(dta)
qDebug("Removed old CuIcMeSt v2");
return true;
}
@ -297,7 +298,7 @@ switch(FieldType)
entry->Expire=dateFromPackedStruct5(pData);
break;
case 0x000D:
entry->BinaryDesc=(char*)pData;
entry->BinaryDesc=QString::fromUtf8((char*)pData);
break;
case 0x000E:
if(FieldSize != 0)
@ -525,13 +526,13 @@ RootGroup.Handle=NULL;
memcpyFromLEnd16(&FieldType, pField);
pField += 2; pos += 2;
if(pos >= total_size) {
error=tr("Unexpected error: Offset is out of range. [G1]");
error=tr("Unexpected error: Offset is out of range.").append(" [G1]");
return false; }
memcpyFromLEnd32(&FieldSize, pField);
pField += 4; pos += 4;
if(pos >= (total_size + FieldSize)){
error=tr("Unexpected error: Offset is out of range. [G2]");
error=tr("Unexpected error: Offset is out of range.").append(" [G2]");
return false;}
bRet = readGroupField(&group,Levels, FieldType, FieldSize, (quint8 *)pField);
@ -542,7 +543,7 @@ RootGroup.Handle=NULL;
pField += FieldSize;
pos += FieldSize;
if(pos >= total_size) {
error=tr("Unexpected error: Offset is out of range. [G1]");
error=tr("Unexpected error: Offset is out of range.").append(" [G1]");
return false;}
}
@ -555,13 +556,13 @@ StdEntry entry;
memcpyFromLEnd16(&FieldType, pField);
pField += 2; pos += 2;
if(pos >= total_size){
error=tr("Unexpected error: Offset is out of range. [E1]");
error=tr("Unexpected error: Offset is out of range.").append(" [E1]");
return false;}
memcpyFromLEnd32(&FieldSize, pField);
pField += 4; pos += 4;
if(pos >= (total_size + FieldSize)) {
error=tr("Unexpected error: Offset is out of range. [E2]");
error=tr("Unexpected error: Offset is out of range.").append(" [E2]");
return false; }
bRet = readEntryField(&entry,FieldType,FieldSize,(quint8*)pField);
@ -574,7 +575,7 @@ StdEntry entry;
pField += FieldSize;
pos += FieldSize;
if(pos >= total_size) {
error=tr("Unexpected error: Offset is out of range. [E3]");
error=tr("Unexpected error: Offset is out of range.").append(" [E3]");
return false; }
}
@ -1200,7 +1201,8 @@ bool Kdb3Database::save(){
NumGroups = Groups.size();
NumEntries = Entries.size()+UnknownMetaStreams.size()+MetaStreams.size();
qSort(Entries.begin(),Entries.end(),StdEntryLessThan);
QList<StdEntry> saveEntries = Entries;
qSort(saveEntries.begin(),saveEntries.end(),StdEntryLessThan);
randomize(FinalRandomSeed,16);
randomize(TransfRandomSeed,32);
@ -1209,7 +1211,7 @@ bool Kdb3Database::save(){
unsigned int pos=DB_HEADER_SIZE; // Skip the header, it will be written later
serializeGroups(Groups,buffer,pos);
serializeEntries(Entries,buffer,pos);
serializeEntries(saveEntries,buffer,pos);
serializeEntries(UnknownMetaStreams,buffer,pos);
serializeEntries(MetaStreams,buffer,pos);
SHA256::hashBuffer(buffer+DB_HEADER_SIZE,ContentsHash,pos-DB_HEADER_SIZE);

@ -30,8 +30,7 @@
#define PWM_FLAG_TWOFISH 8
#define PWM_STD_KEYENCROUNDS 6000
#include <qcolor.h>
#include <qobject.h>
#include <QColor>
#include <QDateTime>
#include <QDate>
#include <QTime>

@ -22,10 +22,12 @@
***************************************************************************/
#include "KpxConfig.h"
#include <Qt>
#include <QApplication>
#include <QSettings>
#include <QDir>
KpxConfig::KpxConfig(const QString& filePath) : settings(filePath,QSettings::IniFormat){
configFile=filePath;
if (settings.contains("Options/GroupTreeRestore") && !settings.contains("Options/GroupTreeState")){
switch (settings.value("Options/GroupTreeRestore",1).toInt()){
case 0:
@ -45,6 +47,34 @@ KpxConfig::KpxConfig(const QString& filePath) : settings(filePath,QSettings::Ini
setUrlCmd(QString());
}
#ifdef GLOBAL_AUTOTYPE
Shortcut KpxConfig::globalShortcut(){
Shortcut s;
s.key = settings.value("Options/GlobalShortcutKey",0).toUInt();
QBitArray mods = settings.value("Options/GlobalShortcutMods",QBitArray(5)).toBitArray();
if (mods.size()!=5)
mods = QBitArray(5);
s.ctrl = mods.testBit(0);
s.shift = mods.testBit(1);
s.alt = mods.testBit(2);
s.altgr = mods.testBit(3);
s.win = mods.testBit(4);
return s;
}
void KpxConfig::setGlobalShortcut(const Shortcut& s){
settings.setValue("Options/GlobalShortcutKey", s.key);
QBitArray mods(5);
mods.setBit(0, s.ctrl);
mods.setBit(1, s.shift);
mods.setBit(2, s.alt);
mods.setBit(3, s.altgr);
mods.setBit(4, s.win);
settings.setValue("Options/GlobalShortcutMods", mods);
}
#endif
unsigned KpxConfig::fileDlgHistorySize(){
settings.beginGroup("FileDlgHistory");
unsigned res=static_cast<unsigned>(settings.childKeys().size());
@ -183,3 +213,35 @@ QString KpxConfig::keyTypeToString(tKeyType keyType){
}
return res;
}
QString KpxConfig::detailViewTemplate(){
if (settings.contains("UI/DetailsView")){
return QString::fromUtf8( qUncompress(settings.value("UI/DetailsView").toByteArray()) );
}
else{
return defaultDetailViewTemplate();
}
}
QString KpxConfig::defaultDetailViewTemplate(){
QFile templ(":/default-detailview.html");
templ.open(QIODevice::ReadOnly);
QString value=QString::fromUtf8(templ.readAll());
templ.close();
value.replace("Group",QCoreApplication::translate("DetailViewTemplate","Group"));
value.replace("Title",QCoreApplication::translate("DetailViewTemplate","Title"));
value.replace("Username",QCoreApplication::translate("DetailViewTemplate","Username"));
value.replace("Password",QCoreApplication::translate("DetailViewTemplate","Password"));
value.replace("URL",QCoreApplication::translate("DetailViewTemplate","URL"));
value.replace("Creation",QCoreApplication::translate("DetailViewTemplate","Creation"));
value.replace("Last Access",QCoreApplication::translate("DetailViewTemplate","Last Access"));
value.replace("Last Modification",QCoreApplication::translate("DetailViewTemplate","Last Modification"));
value.replace("Expiration",QCoreApplication::translate("DetailViewTemplate","Expiration"));
value.replace("Comment",QCoreApplication::translate("DetailViewTemplate","Comment"));
return value;
}
void KpxConfig::setDetailViewTemplate(const QString& value){
settings.setValue("UI/DetailsView", qCompress(value.toUtf8(),9) );
}

@ -24,6 +24,7 @@
#define _KPXCONFIG_H_
#include "main.h"
#include "AutoType.h"
#include <QBitArray>
#include <QByteArray>
#include <QColor>
@ -43,6 +44,8 @@
class KpxConfig{
public:
friend class KpxBookmarks;
enum IntegrPluginType{NoIntegr,KDE,Gnome};
enum GrpTreeState{DoNothing,RestoreLast,ExpandAll};
@ -56,6 +59,8 @@ public:
QBitArray columns(){return stringToBitArray(settings.value("UI/Columns","11111000000").toString(),11);}
QList<int> columnOrder(){return stringToIntArray(settings.value("UI/ColumnOrder","100,100,100,100,100,100,100,100,100,100,100").toString(),11);}
QList<int> columnSizes(){return stringToIntArray(settings.value("UI/ColumnSizes","15,10,10,10,10,10,10,10,10,10,10").toString(),11);}
int columnSort(){return settings.value("UI/ColumnSort",0).toInt();}
Qt::SortOrder columnSortOrder(){return static_cast<Qt::SortOrder>(settings.value("UI/ColumnSortOrder",Qt::AscendingOrder).toInt());}
QStringList fileDlgHistory(unsigned index){return settings.value(QString("FileDlgHistory/ENTRY%1").arg(index)).toStringList();}
GrpTreeState groupTreeState(){return stringToGrpTreeState(settings.value("Options/GroupTreeState").toString());}
bool hidePasswords(){return settings.value("UI/HidePasswords",true).toBool();}
@ -68,6 +73,9 @@ public:
tKeyType lastKeyType(){return stringToKeyType(settings.value("Options/LastKeyType").toString());}
QRect mainWindowGeometry(const QRect& defaultValue){return settings.value("UI/MainWindowGeometry",defaultValue).toRect();}
bool minimizeToTray(){return settings.value("Options/MinimizeToTray",false).toBool();}
bool minimizeTray(){return settings.value("Options/MinimizeTray",false).toBool();}
bool startMinimized(){return settings.value("Options/StartMinimized",false).toBool();}
bool startLocked(){return settings.value("Options/StartLocked",false).toBool();}
QString mountDir(){return settings.value("Options/MountDir",DEFAULT_MOUNT_DIR).toString();}
bool openLastFile(){return settings.value("Options/OpenLastFile",true).toBool();}
QString pwGenCharList(){return settings.value("Options/PwGenCharList").toString();}
@ -80,15 +88,23 @@ public:
bool showEntryDetails(){return settings.value("UI/ShowEntryDetails",true).toBool();}
bool showPasswords(){return settings.value("Options/ShowPasswords",false).toBool();}
bool showPasswordsPasswordDlg(){return settings.value("Options/ShowPasswordsPasswordDlg",false).toBool();}
bool lockOnMinimize(){return settings.value("Options/LockOnMinimize",false).toBool();}
bool showStatusbar(){return settings.value("UI/ShowStatusbar",true).toBool();}
bool showSysTrayIcon(){return settings.value("Options/ShowSysTrayIcon",false).toBool();}
bool showToolbar(){return settings.value("UI/ShowToolbar",true).toBool();}
int toolbarIconSize(){return settings.value("UI/ToolbarIconSize",16).toInt();}
QString urlCmd(){return settings.value("Options/UrlCmd").toString();}
bool urlCmdDef(){return settings.value("Options/UrlCmdDef",true).toBool();}
QByteArray vSplitterPos(){return settings.value("UI/VSplitterPos").toByteArray();}
bool askBeforeDelete(){return settings.value("Options/AskBeforeDelete",true).toBool();}
#ifdef AUTOTYPE
int autoTypePreGap(){return settings.value("Options/AutoTypePreGap",500).toInt();}
int autoTypeKeyStrokeDelay(){return settings.value("Options/AutoTypeKeyStrokeDelay",0).toInt();}
#endif
#ifdef GLOBAL_AUTOTYPE
Shortcut globalShortcut();
bool entryTitlesMatch(){return settings.value("Options/EntryTitlesMatch",true).toBool();}
#endif
bool featureBookmarks(){return settings.value("Features/Bookmarks",true).toBool();}
void setAlternatingRowColors(bool value){settings.setValue("Options/AlternatingRowColors",value);}
@ -99,6 +115,8 @@ public:
void setColumns(const QBitArray& value){settings.setValue("UI/Columns",bitArrayToString(value));}
void setColumnOrder(const QList<int>& value){settings.setValue("UI/ColumnOrder",intArrayToString(value));}
void setColumnSizes(const QList<int>& value){settings.setValue("UI/ColumnSizes",intArrayToString(value));}
void setColumnSort(int value){settings.setValue("UI/ColumnSort",value);}
void setColumnSortOrder(int value){settings.setValue("UI/ColumnSortOrder",value);}
void setFileDlgHistory(unsigned index,const QStringList& value){settings.setValue(QString("FileDlgHistory/ENTRY%1").arg(index), value);}
void setGroupTreeState(GrpTreeState value){settings.setValue("Options/GroupTreeState",grpTreeStateToString(value));}
void setHidePasswords(bool value){settings.setValue("UI/HidePasswords",value);}
@ -111,6 +129,9 @@ public:
void setLastKeyType(tKeyType value){settings.setValue("Options/LastKeyType",keyTypeToString(value));}
void setMainWindowGeometry(const QRect& value){settings.setValue("UI/MainWindowGeometry",value);}
void setMinimizeToTray(bool value){settings.setValue("Options/MinimizeToTray",value);}
void setMinimizeTray(bool value){settings.setValue("Options/MinimizeTray",value);}
void setStartMinimized(bool value){settings.setValue("Options/StartMinimized",value);}
void setStartLocked(bool value){settings.setValue("Options/StartLocked",value);}
void setMountDir(const QString& value){settings.setValue("Options/MountDir",value);}
void setOpenLastFile(bool value){settings.setValue("Options/OpenLastFile",value);}
void setPwGenCharList(const QString& value){settings.setValue("Options/PwGenCharList",value);}
@ -123,22 +144,35 @@ public:
void setShowEntryDetails(bool value){settings.setValue("UI/ShowEntryDetails",value);}
void setShowPasswords(bool value){settings.setValue("Options/ShowPasswords",value);}
void setShowPasswordsPasswordDlg(bool value){settings.setValue("Options/ShowPasswordsPasswordDlg",value);}
void setLockOnMinimize(bool value){settings.setValue("Options/LockOnMinimize",value);}
void setShowStatusbar(bool value){settings.setValue("UI/ShowStatusbar",value);}
void setShowSysTrayIcon(bool value){settings.setValue("Options/ShowSysTrayIcon",value);}
void setShowToolbar(bool value){settings.setValue("UI/ShowToolbar",value);}
void setToolbarIconSize(int value){settings.setValue("UI/ToolbarIconSize",value);}
void setUrlCmd(const QString& value){settings.setValue("Options/UrlCmd",value);}
void setUrlCmdDef(bool value){settings.setValue("Options/UrlCmdDef",value);}
void setVSplitterPos(const QByteArray& value){settings.setValue("UI/VSplitterPos",value);}
void setAskBeforeDelete(bool value){settings.setValue("Options/AskBeforeDelete",value);}
#ifdef AUTOTYPE
void setAutoTypePreGap(int value){settings.setValue("Options/AutoTypePreGap",value);}
void setAutoTypeKeyStrokeDelay(int value){settings.setValue("Options/AutoTypeKeyStrokeDelay",value);}
#endif
#ifdef GLOBAL_AUTOTYPE
void setGlobalShortcut(const Shortcut& s);
void setEntryTitlesMatch(bool value){settings.setValue("Options/EntryTitlesMatch",value);}
#endif
void setFeatureBookmarks(bool value){settings.setValue("Features/Bookmarks",value);}
unsigned fileDlgHistorySize();
void clearFileDlgHistory(){settings.remove("FileDlgHistory");};
QString detailViewTemplate();
QString defaultDetailViewTemplate();
void setDetailViewTemplate(const QString& value);
private:
QSettings settings;
QString configFile;
QColor stringToColor(const QString& str);
QBitArray stringToBitArray(const QString& str, unsigned count);

@ -22,7 +22,7 @@
#ifndef _SHA256_H
#define _SHA256_H
#include <qglobal.h>
#include <QGlobalStatic>
typedef struct
{

@ -171,7 +171,8 @@
* Standard include files will probably be ok.
*/
#include <qstring.h> /* for memset(), memcpy(), and memcmp() */
#include <QString> /* for memset(), memcpy(), and memcmp() */
#include <cstdlib>
#include "twofish.h"
@ -476,7 +477,7 @@
void Twofish_fatal(char* msg){
qCritical("Twofish: Fatal Error");
qCritical("Twofish: Fatal Error: %s",msg);
exit(1);
}

@ -17,7 +17,7 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <qmessagebox.h>
#include <QMessageBox>
#include <QPainter>
#include "AboutDlg.h"
@ -26,41 +26,42 @@
AboutDialog::AboutDialog(QWidget* parent):QDialog(parent)
{
setupUi(this);
createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("%1 %2").arg(APP_DISPLAY_NAME, APP_VERSION),width());
createBanner(&BannerPixmap,getPixmap("keepassx_large"),QString("%1 %2").arg(APP_DISPLAY_NAME, APP_VERSION),width());
loadLicFromFile();
labelAppName->setText(tr(APP_DISPLAY_NAME));
labelAppFunc->setText(tr(" - %1").arg(APP_LONG_FUNC));
labelAppName->setText(APP_DISPLAY_NAME);
labelAppFunc->setText(QString(" - ").append(APP_LONG_FUNC));
QString AboutTr=tr("<b>Current Translation: None</b><br><br>","Please replace 'None' with the language of your translation");
if(TrActive){
AboutTr+=tr("<b>Author:</b> %1<br>").arg(tr("$TRANSLATION_AUTHOR"));
QString mail=tr("$TRANSLATION_AUTHOR_EMAIL","Here you can enter your email or homepage if you want.");
if(mail!=QString()){
if(!mail.isEmpty()){
AboutTr+=mail+"<br>";
}
AboutTr+="<br>";
}
Edit_Translation->setHtml(AboutTr+tr("\
Information on how to translate KeePassX can be found under:\n\
http://keepassx.sourceforge.net/"));
Edit_Translation->setHtml(AboutTr+tr("Information on how to translate KeePassX can be found under:")
+"<br>http://keepassx.sourceforge.net/");
QString str;
str+="<b>"+tr("Team")+"</b><br>";
str+="<div style='margin-left:10px;'>";
str+="<u>"+tr("Tarek Saidi")+"</u><br>"+tr("Developer, Project Admin")+"<br>"+tr("tarek_saidi@users.sf.net")+"<br>";
str+="<u>Tarek Saidi</u><br>"+tr("Developer, Project Admin")+"<br>tarek_saidi@users.sf.net<br>";
str+="<br>";
str+="<u>"+tr("Eugen Gorschenin")+"</u><br>"+tr("Web Designer")+"<br>"+tr("geugen@users.sf.de")+"<br>";
str+="<u>Eugen Gorschenin</u><br>"+tr("Web Designer")+"<br>geugen@users.sf.de<br>";
str+="<br>";
str+="<u>"+tr("Juan J Gonz&aacute;lez C&aacute;rdenas [Jota Jota]")+"</u><br>"+tr("Developer")+"<br>"+tr("myxelf@users.sf.net")+"<br>";
str+="<u>Juan J Gonz&aacute;lez C&aacute;rdenas [Jota Jota]</u><br>"+tr("Developer")+"<br>myxelf@users.sf.net<br>";
str+="</div><br><div style='margin-left:0px;'>";
str+="<b>"+tr("Thanks To")+"</b><br>";
str+="</div><div style='margin-left:10px;'>";
str+="<u>"+tr("Matthias Miller")+"</u><br>"+tr("Patches for better MacOS X support")+"<br>"+tr("www.outofhanwell.com")+"<br></div>";
str+="<u>Matthias Miller</u><br>"+tr("Patches for better MacOS X support")+"<br>www.outofhanwell.com<br></div>";
str+="<br>";
str+="<u>"+tr("James Nicholls")+"</u><br>"+tr("Main Application Icon")/*+"<br>"+tr("mailto:???")*/+"<br></div>";
str+="<u>James Nicholls</u><br>"+tr("Main Application Icon")/*+"<br>"+tr("mailto:???")*/+"<br></div>";