claws-mail uses encrypt() for password obfuscation in the saved config
file (.claws-mail/accountrc), which was removed from libc.
I attempted switching to blowfish-ebc, along similar lines to their
existing FreeBSD code for des-ebc, and had it working for some passwords,
but it needs 8-byte blocks and I didn't manage to change things enough
to handle padding (the encrypted password is returned in the same
buffer as the original password so it's fiddly). Actually I believe
the FreeBSD des-ebc code is also supposed to use 8-byte blocks
but apparently it works anyway...?
So an alternative diff below. It isn't particularly nice but does
unbreak the port... Does anyone have a better idea?
Index: Makefile
===================================================================
RCS file: /cvs/ports/mail/claws-mail/Makefile,v
retrieving revision 1.73
diff -u -p -r1.73 Makefile
--- Makefile 25 Oct 2014 14:53:04 -0000 1.73
+++ Makefile 17 Dec 2014 13:53:36 -0000
@@ -13,6 +13,7 @@ COMMENT-gdata= gdata plugin
V= 3.9.3
REVISION= 1
REVISION-htmlviewer= 2
+REVISION-main= 2
DISTNAME= claws-mail-${V}
PKGNAME-main= ${DISTNAME}
PKGNAME-bogofilter= claws-mail-bogofilter-${V}
Index: patches/patch-configure_ac
===================================================================
RCS file: /cvs/ports/mail/claws-mail/patches/patch-configure_ac,v
retrieving revision 1.9
diff -u -p -r1.9 patch-configure_ac
--- patches/patch-configure_ac 21 Apr 2014 17:40:19 -0000 1.9
+++ patches/patch-configure_ac 17 Dec 2014 13:53:36 -0000
@@ -1,6 +1,6 @@
$OpenBSD: patch-configure_ac,v 1.9 2014/04/21 17:40:19 sthen Exp $
--- configure.ac.orig Sat Dec 14 10:14:50 2013
-+++ configure.ac Mon Apr 21 18:40:04 2014
++++ configure.ac Wed Dec 17 12:00:37 2014
@@ -152,7 +152,7 @@ AM_CONDITIONAL(CYGWIN, test x"$env_cygwin" = x"yes")
if test "$GCC" = "yes"
@@ -10,7 +10,16 @@ $OpenBSD: patch-configure_ac,v 1.9 2014/
#CFLAGS="-g -Wall -Wno-unused-function"
fi
-@@ -737,6 +737,7 @@ if test x"$enable_new_addrbook" = xno; then
+@@ -494,6 +494,8 @@ dnl password encryption
+ OLDLIBS=$LIBS
+ LIBS=
+ case $host_os in
++ *openbsd*)
++ ;;
+ *dragonfly*)
+ AC_SEARCH_LIBS(encrypt, cipher, [],
AC_MSG_ERROR(['encrypt'-function not found.]))
+ ;;
+@@ -737,6 +739,7 @@ if test x"$enable_new_addrbook" = xno; then
AC_CHECK_LIB(resolv, res_query, LDAP_LIBS="$LDAP_LIBS -lresolv")
AC_CHECK_LIB(socket, bind, LDAP_LIBS="$LDAP_LIBS -lsocket")
AC_CHECK_LIB(nsl, gethostbyaddr, LDAP_LIBS="$LDAP_LIBS -lnsl")
@@ -18,7 +27,7 @@ $OpenBSD: patch-configure_ac,v 1.9 2014/
AC_CHECK_LIB(lber, ber_get_tag, LDAP_LIBS="$LDAP_LIBS -llber",,
$LDAP_LIBS)
-@@ -809,7 +810,7 @@ if test x"$enable_new_addrbook" = xno; then
+@@ -809,7 +812,7 @@ if test x"$enable_new_addrbook" = xno; then
AC_DEFINE(USE_JPILOT, 1, Define if
you want JPilot support in addressbook.) ])
fi
Index: patches/patch-src_common_passcrypt_c
===================================================================
RCS file: patches/patch-src_common_passcrypt_c
diff -N patches/patch-src_common_passcrypt_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_common_passcrypt_c 17 Dec 2014 13:53:36 -0000
@@ -0,0 +1,26 @@
+$OpenBSD$
+
+encrypt(), as used for password obfuscation, was removed from libc.
+Switch to storing unencrypted instead.
+
+--- src/common/passcrypt.c.orig Sat Dec 14 10:15:06 2013
++++ src/common/passcrypt.c Wed Dec 17 13:04:03 2014
+@@ -57,7 +57,19 @@ void passcrypt_decrypt(gchar *password, guint len)
+ unsigned char crypt_cfb_iv[64];
+ int crypt_cfb_blocksize = 8; /* 8 for DES */
+
+-#if defined (__FreeBSD__)
++#if defined (__OpenBSD__)
++static void
++crypt_cfb_buf(const char key[8], unsigned char *buf, unsigned len,
++ unsigned chunksize, int decrypt)
++{
++ /*
++ * XXX do nothing, just store it unencrypted
++ */
++ ;
++}
++#elif defined (__FreeBSD__)
+ static void
+ crypt_cfb_buf(const char key[8], unsigned char *buf, unsigned len,
+ unsigned chunksize, int decrypt)
... for completeness, here's the semi-working blf code.
#include <blf.h>
static void
crypt_cfb_buf(const char key[8], unsigned char *buf, unsigned len,
unsigned chunksize, int decrypt)
{
blf_ctx state;
blf_key(&state, PASSCRYPT_KEY, 8);
if (decrypt)
blf_ecb_decrypt(&state, buf, len);
else
blf_ecb_encrypt(&state, buf, len);
}