/trunk/debian/control |
---|
0,0 → 1,48 |
Source: prayer |
Section: mail |
Priority: optional |
Maintainer: Magnus Holmgren <magnus@kibibyte.se> |
Build-Depends: cdbs (>= 0.4.27-1), debhelper (>= 5), quilt, libc-client-dev, zlib1g-dev, libssl-dev (>= 0.9.6), libdb4.3-dev | libdb-dev, libldap2-dev |
Standards-Version: 3.7.2 |
Package: prayer |
Architecture: any |
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser |
Suggests: prayer-accountd, imap-server, aspell | ispell |
Description: Standalone IMAP-based webmail server |
Prayer is yet another Webmail interface. |
. |
It is unusual in that it is a complete, standalone, HTTP server and proxy |
rather a Apache/mod_php plugin. Prayer maintains persistent connections to |
the IMAP server and is written entirely in C. Consequently it is much |
faster than most open source Webmail interfaces and puts very little load |
on either the machines running the Web server or the backend IMAP servers |
(even if traditional Unix format mailfolders are in use). |
. |
Prayer has very few external dependencies as user preferences are stored on |
the IMAP server rather than in a SQL database. It does however implement a |
full range of features and user preference settings. |
Package: prayer-accountd |
Architecture: any |
Depends: ${shlibs:Depends}, ${misc:Depends} |
Suggests: prayer |
Recommends: exim4 |
Description: account management daemon for Prayer |
Prayer is yet another Webmail interface. |
. |
It is unusual in that it is a complete, standalone, HTTP server and proxy |
rather a Apache/mod_php plugin. Prayer maintains persistent connections to |
the IMAP server and is written entirely in C. Consequently it is much |
faster than most open source Webmail interfaces and puts very little load |
on either the machines running the Web server or the backend IMAP servers |
(even if traditional Unix format mailfolders are in use). |
. |
This package contains a daemon that can do the following for users: |
. |
* Change passwords |
* Change their full name |
* Manage mail filtering (requires Exim) and forwarding |
* Manage vacation messages and logs |
. |
NOTE: This package is currently not very useful. |
/trunk/debian/compat |
---|
0,0 → 1,0 |
5 |
/trunk/debian/prayer.postinst |
---|
0,0 → 1,46 |
#!/bin/sh |
# postinst script for prayer |
# |
# see: dh_installdeb(1) |
set -e |
# summary of how this script can be called: |
# * <postinst> `configure' <most-recently-configured-version> |
# * <old-postinst> `abort-upgrade' <new version> |
# * <conflictor's-postinst> `abort-remove' `in-favour' <package> |
# <new-version> |
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour' |
# <failed-install-package> <version> `removing' |
# <conflicting-package> <version> |
# for details, see http://www.debian.org/doc/debian-policy/ or |
# the debian-policy package |
# |
case "$1" in |
configure) |
adduser --quiet --system --ingroup nogroup --no-create-home \ |
--disabled-password --disabled-login prayer |
chown prayer:root /var/run/prayer |
chown prayer:adm /var/log/prayer |
chmod 2750 /var/run/prayer /var/log/prayer |
;; |
abort-upgrade|abort-remove|abort-deconfigure) |
;; |
*) |
echo "postinst called with unknown argument \`$1'" >&2 |
exit 1 |
;; |
esac |
# dh_installdeb will replace this with shell code automatically |
# generated by other debhelper scripts. |
#DEBHELPER# |
exit 0 |
/trunk/debian/prayer.default |
---|
0,0 → 1,11 |
# Defaults for prayer initscript |
# sourced by /etc/init.d/prayer |
# installed at /etc/default/prayer by the maintainer scripts |
# This is a POSIX shell fragment |
# Change to one to enable prayer after editing /etc/prayer/prayer.cf |
ENABLED=0 |
# Options. You probably won't need any. |
DAEMON_OPTS="" |
/trunk/debian/prayer.postrm |
---|
0,0 → 1,43 |
#!/bin/sh |
# postrm script for prayer |
# |
# see: dh_installdeb(1) |
set -e |
# summary of how this script can be called: |
# * <postrm> `remove' |
# * <postrm> `purge' |
# * <old-postrm> `upgrade' <new-version> |
# * <new-postrm> `failed-upgrade' <old-version> |
# * <new-postrm> `abort-install' |
# * <new-postrm> `abort-install' <old-version> |
# * <new-postrm> `abort-upgrade' <old-version> |
# * <disappearer's-postrm> `disappear' <r>overwrit>r> <new-version> |
# for details, see http://www.debian.org/doc/debian-policy/ or |
# the debian-policy package |
case "$1" in |
purge) |
deluser --system --quiet prayer || true |
rm -rf /var/log/prayer |
find /var/run/prayer/ \( -type s -o -name ssl_scache \) -exec rm {} + |
;; |
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) |
;; |
*) |
echo "postrm called with unknown argument \`$1'" >&2 |
exit 1 |
esac |
# dh_installdeb will replace this with shell code automatically |
# generated by other debhelper scripts. |
#DEBHELPER# |
exit 0 |
/trunk/debian/prayer-accountd.docs |
---|
0,0 → 1,8 |
docs/ACCOUNTD |
docs/DESIGN |
docs/DONE-OLD |
docs/FEATURES |
docs/NOTICE |
docs/README |
docs/SECURITY |
docs/TODO |
/trunk/debian/patches/hasnochildren_means_noinferiors.patch |
---|
0,0 → 1,12 |
--- prayer-1.0.18.orig/prayer/dirlist.c |
+++ prayer-1.0.18/prayer/dirlist.c |
@@ -172,7 +172,8 @@ |
dl->next = NIL; |
dl->name = pool_strdup(callback.pool, name); |
- dl->isdir = (attributes & LATT_NOINFERIORS) ? NIL : T; |
+ dl->isdir = (attributes & (LATT_NOINFERIORS | LATT_HASNOCHILDREN)) ? |
+ NIL : T; |
/* Insertion sort algorithm */ |
/trunk/debian/patches/ipv6.patch |
---|
0,0 → 1,508 |
--- prayer-1.0.18.orig/prayer/config.c |
+++ prayer-1.0.18/prayer/config.c |
@@ -1650,7 +1650,7 @@ |
if (!config_parse_rest(&option)) |
error = T; |
- else if ((s = (strchr(option, ':')))) { |
+ else if ((s = (strrchr(option, ':')))) { |
*s++ = '\0'; |
if (!config_parse_number(&port, s)) |
error = T; |
--- prayer-1.0.18.orig/prayer/ipaddr.c |
+++ prayer-1.0.18/prayer/ipaddr.c |
@@ -32,11 +32,7 @@ |
BOOL ipaddr_copy(struct ipaddr * dst, struct ipaddr * src) |
{ |
- dst->version = src->version; |
- dst->addr[0] = src->addr[0]; |
- dst->addr[1] = src->addr[1]; |
- dst->addr[2] = src->addr[2]; |
- dst->addr[3] = src->addr[3]; |
+ memcpy(dst, src, sizeof(struct ipaddr)); |
return (T); |
} |
@@ -55,19 +51,7 @@ |
if (addr1->version != addr2->version) |
return (NIL); |
- if (addr1->addr[0] != addr2->addr[0]) |
- return (NIL); |
- |
- if (addr1->addr[1] != addr2->addr[1]) |
- return (NIL); |
- |
- if (addr1->addr[2] != addr2->addr[2]) |
- return (NIL); |
- |
- if (addr1->addr[3] != addr2->addr[3]) |
- return (NIL); |
- |
- return (T); |
+ return (memcmp(&addr1->addr, &addr2->addr, addr1->version == 6 ? 16 : 4) == 0); |
} |
/* ====================================================================== */ |
@@ -81,8 +65,7 @@ |
{ |
static char buf[64]; |
- sprintf(buf, "%d.%d.%d.%d", |
- addr->addr[0], addr->addr[1], addr->addr[2], addr->addr[3]); |
+ os_inet_ntop(addr->addr, addr->version, buf, 64); |
return (buf); |
} |
@@ -96,7 +79,7 @@ |
{ |
char *result; |
- if ((result = os_gethostbyaddr(addr->addr))) |
+ if ((result = os_gethostbyaddr(addr->addr, addr->version))) |
return (result); |
return (ipaddr_text(addr)); |
@@ -116,39 +99,10 @@ |
BOOL ipaddr_parse(struct ipaddr * addr, char *text) |
{ |
- char *next; |
- |
if (text == NIL) |
return (NIL); |
- /* IPv4 only for the moment */ |
- addr->version = 4; |
- |
- /* Parse first number */ |
- if (!(next = strchr(text, '.'))) |
- return (NIL); |
- addr->addr[0] = atoi(text); |
- text = next + 1; |
- |
- /* Parse second number */ |
- if (!(next = strchr(text, '.'))) |
- return (NIL); |
- addr->addr[1] = atoi(text); |
- text = next + 1; |
- |
- /* Parse third number */ |
- if (!(next = strchr(text, '.'))) |
- return (NIL); |
- addr->addr[2] = atoi(text); |
- text = next + 1; |
- |
- /* Parse forth number */ |
- if ((next = strchr(text, '.'))) |
- return (NIL); |
- addr->addr[3] = atoi(text); |
- |
- /* Looks good */ |
- return (T); |
+ return (os_inet_pton(text, addr)); |
} |
/* ====================================================================== */ |
@@ -157,56 +111,63 @@ |
* |
* Compare IP address to text list of form: |
* ipaddr: |
- * text: Text string of form "131.111.0.0/16 : 192.168.0.0/24". |
+ * text: Text string of form "131.111.0.0/16 : 192.168.0.0/24 : 2001:12cd:1::/48". |
+ * (There has to be a space on either side of the colon for it to |
+ * separate two networks) |
* |
* Returns: T if addr matches list. |
************************************************************************/ |
BOOL ipaddr_compare_list(struct ipaddr * ipaddr, char *text) |
{ |
- char *next, *s, *alloc; |
+ char *next = NULL, *s, *alloc; |
+ int i; |
unsigned long bits, mask; |
struct ipaddr parsed; |
alloc = text = pool_strdup(NIL, text); |
while (text && *text) { |
- if ((next = strchr(text, ':'))) |
- *next++ = '\0'; |
+ s = text; |
+ while ((s = strchr(s, ':'))) { |
+ if (*(s - 1) == ' ' || *(s + 1) == ' ') { |
+ *(next = s) = '\0'; |
+ next++; |
+ } |
+ s++; |
+ } |
text = string_trim_whitespace(text); |
if ((s = strchr(text, '/'))) { |
*s++ = '\0'; |
bits = atoi(s); |
- } else |
- bits = 32; |
- |
- if (bits > 32) |
- bits = 32; |
- |
- /* Create mask with appropriate number of bits set */ |
- mask = 0; |
- while (bits > 0) { |
- mask >>= 1; |
- mask |= 0x80000000; |
- bits--; |
} |
+ else |
+ bits = 128; /* Doesn't matter if it's too big */ |
if (ipaddr_parse(&parsed, text)) { |
- unsigned long a1; |
- unsigned long a2; |
- |
- a1 = ((ipaddr->addr[0] << 24) + (ipaddr->addr[1] << 16) + |
- (ipaddr->addr[2] << 8) + (ipaddr->addr[3])); |
- |
- a2 = ((parsed.addr[0] << 24) + (parsed.addr[1] << 16) + |
- (parsed.addr[2] << 8) + (parsed.addr[3])); |
- |
- if ((a1 & mask) == (a2 & mask)) { |
- free(alloc); |
- return (T); |
- } |
+ if (parsed.version != ipaddr->version) { |
+ text = next; continue; |
+ } |
+ |
+ for (i = 0; i < (parsed.version == 6 ? 4 : 1); i++) { |
+ if (bits == 0) mask = 0; |
+ else if (bits < 32) { |
+ mask = (-1) << (32 - bits); |
+ bits = 0; |
+ } |
+ else { |
+ mask = -1; |
+ bits -= 32; |
+ } |
+ |
+ if ((parsed.addr[i] & mask) != (ipaddr->addr[i] & mask)) { |
+ text = next; continue; |
+ } |
+ } |
+ free(alloc); |
+ return (T); |
} |
text = next; |
} |
@@ -225,11 +187,11 @@ |
void ipaddr_send_iostream(struct ipaddr *addr, struct iostream *stream) |
{ |
+ int i; |
ioputc(addr->version, stream); |
- ioputc(addr->addr[0], stream); |
- ioputc(addr->addr[1], stream); |
- ioputc(addr->addr[2], stream); |
- ioputc(addr->addr[3], stream); |
+ for (i = 0; i < (addr->version == 6 ? 16 : 4); i++) { |
+ ioputc(((char *)addr->addr)[i], stream); |
+ } |
} |
/* ====================================================================== */ |
@@ -246,13 +208,13 @@ |
if ((c = iogetc(stream)) != EOF) { |
addr->version = (unsigned char) c; |
- for (i = 0; i < 4; i++) { |
+ for (i = 0; i < (addr->version == 6 ? 16 : 4); i++) { |
if ((c = iogetc(stream)) == EOF) { |
rc = NIL; |
break; |
} |
- addr->addr[i] = (unsigned char) c; |
+ ((char *)addr->addr)[i] = (unsigned char) c; |
} |
} |
@@ -279,9 +241,14 @@ |
ipaddr_set(struct ipaddr *ipaddr, unsigned long version, |
unsigned char *addr) |
{ |
- if (version != 4) |
- log_fatal("ipaddr_set(): IPv4 only supported at the moment!"); |
+ if (version != 4 && version != 6) |
+ log_fatal("ipaddr_set(): IPv4 and IPv6 only supported!"); |
+ |
+ ipaddr->version = version; |
+ memcpy(ipaddr->addr, addr, version == 6 ? 16 : 4); |
+ if (ipaddr->addr[0] == 0 && ipaddr->addr[1] == 0 && ipaddr->addr[2] == 0xffff) { |
+ ipaddr->addr[0] = ipaddr->addr[3]; |
+ ipaddr->version = 4; |
+ } |
- ipaddr->version = 4; |
- memcpy(ipaddr->addr, addr, 4); |
} |
--- prayer-1.0.18.orig/prayer/ipaddr.h |
+++ prayer-1.0.18/prayer/ipaddr.h |
@@ -8,7 +8,7 @@ |
struct ipaddr { |
unsigned long version; |
- unsigned char addr[4]; |
+ unsigned long addr[4]; |
}; |
struct ipaddr *ipaddr_create(struct pool *pool); |
--- prayer-1.0.18.orig/prayer/os.h |
+++ prayer-1.0.18/prayer/os.h |
@@ -24,7 +24,11 @@ |
int os_socket_nonblocking(int sockfd); |
-char *os_gethostbyaddr(void *addr); |
+char *os_gethostbyaddr(void *addr, unsigned int version); |
+ |
+int os_inet_ntop(void *addr, unsigned long version, char *buf, unsigned long buflen); |
+ |
+int os_inet_pton(char *str, struct ipaddr *addr); |
void os_child_reaper(); |
--- prayer-1.0.18.orig/prayer/os_linux.c |
+++ prayer-1.0.18/prayer/os_linux.c |
@@ -13,14 +13,11 @@ |
#include <sys/un.h> |
#include <sys/resource.h> |
#include <netinet/in.h> |
-#include <netinet/tcp.h> |
#include <arpa/inet.h> |
#include <signal.h> |
#include <netdb.h> |
#include <sys/file.h> |
-#include <openssl/rand.h> |
- |
/* ====================================================================== */ |
BOOL os_socketpair(int *sockfd) |
@@ -63,33 +60,28 @@ |
int os_connect_inet_socket(char *host, unsigned long port) |
{ |
- struct hostent *hostent; |
- struct sockaddr_in serv_addr; |
+ struct addrinfo *first_ai, *ai; |
+ char port_str[12]; |
int sockfd; |
- /* Open the socket */ |
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) |
- return (-1); |
- |
- /* Set up the socket */ |
- bzero((char *) &serv_addr, sizeof(serv_addr)); |
- serv_addr.sin_family = AF_INET; |
- serv_addr.sin_port = htons(port); |
- |
- if ((hostent = gethostbyname(host)) == NIL) { |
- close(sockfd); |
- return (-1); |
- } |
- bcopy(hostent->h_addr, (char *) &serv_addr.sin_addr, |
- hostent->h_length); |
- |
- if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) |
- < 0) { |
- close(sockfd); |
- return (-1); |
- } |
- |
- return (sockfd); |
+ sprintf(port_str, "%lu", port); |
+ if (getaddrinfo(host, port_str, NULL, &first_ai)) { |
+ return (-1); |
+ } |
+ for (ai = first_ai; ai->ai_next; ai = ai->ai_next) { |
+ /* Open the socket */ |
+ if ((sockfd = socket(ai->ai_family, SOCK_STREAM, 0)) < 0) { |
+ break; |
+ } |
+ if (connect(sockfd, (struct sockaddr *) ai->ai_addr, ai->ai_addrlen) < 0) { |
+ close(sockfd); |
+ break; |
+ } |
+ freeaddrinfo(first_ai); |
+ return (sockfd); |
+ } |
+ freeaddrinfo(first_ai); |
+ return (-1); |
} |
/* ====================================================================== */ |
@@ -150,9 +141,39 @@ |
int os_bind_inet_socket(unsigned long port, char *interface) |
{ |
int i, sockfd; |
- struct sockaddr_in serv_addr; |
+ struct sockaddr_storage serv_addr; |
+ struct addrinfo *ai; |
+ |
+ bzero((char *) &serv_addr, sizeof(serv_addr)); |
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { |
+ if (interface) { |
+ if (getaddrinfo(interface, NULL, NULL, &ai)) { |
+ log_panic |
+ ("[os_bind_inet_socket()] Failed to lookup hostname: %s", |
+ interface); |
+ return -1; |
+ } |
+#if 0 /* Use the first interface address; don't panic if both IPv6 |
+ and IPv4 addresses are returned. */ |
+ if (hostent->h_addr_list[1]) { |
+ log_panic |
+ ("[os_bind_inet_socket()] Ambiguous interface name: %s", |
+ interface); |
+ return (-1); |
+ } |
+#endif |
+ memcpy(&serv_addr, ai->ai_addr, ai->ai_addrlen); |
+ freeaddrinfo(ai); |
+ } |
+ else { |
+ serv_addr.ss_family = AF_INET6; |
+ ((struct sockaddr_in6*)&serv_addr)->sin6_addr = in6addr_any; |
+ } |
+ /* This isn't formally correct, but *in fact*, sin6_port is at the |
+ same place as sin_port, so it works. */ |
+ ((struct sockaddr_in6*)&serv_addr)->sin6_port = htons(port); |
+ |
+ if ((sockfd = socket(serv_addr.ss_family, SOCK_STREAM, 0)) < 0) { |
log_panic("[os_bind_inet_socket()] socket() failed, %s", |
strerror(errno)); |
return (-1); |
@@ -168,41 +189,6 @@ |
return (-1); |
} |
- bzero((char *) &serv_addr, sizeof(serv_addr)); |
- serv_addr.sin_family = AF_INET; |
- serv_addr.sin_port = htons(port); |
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); |
- |
- /* Calculate serv_addr for specific interface to bind to */ |
- if (interface) { |
- struct hostent *hostent; |
- struct in_addr *s; |
- |
- if (!(hostent = gethostbyname(interface))) { |
- log_panic |
- ("[os_bind_inet_socket()] Failed to lookup hostname: %s", |
- interface); |
- |
- return (-1); |
- } |
- |
- if (hostent->h_addr_list[1]) { |
- log_panic |
- ("[os_bind_inet_socket()] Ambiguous interface name: %s", |
- interface); |
- return (-1); |
- } |
- |
- if (!(s = ((struct in_addr *)hostent->h_addr_list[0]))) { |
- log_panic("[os_bind_inet_socket()] Invalid interface name: %s", |
- interface); |
- return (-1); |
- } |
- |
- /* s has four bytes in network byte order */ |
- memcpy(&serv_addr.sin_addr.s_addr, s, sizeof(struct in_addr)); |
- } |
- |
/* bind() as Internet domain socket */ |
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < |
0) { |
@@ -255,8 +242,8 @@ |
int os_accept_inet(int sockfd, struct ipaddr *ipaddr) |
{ |
- struct sockaddr_in addr; |
- socklen_t len = (socklen_t) sizeof(struct sockaddr_in); |
+ struct sockaddr_storage addr; |
+ socklen_t len = (socklen_t) sizeof(addr); |
int newsockfd; |
do { |
@@ -271,8 +258,12 @@ |
return (-1); |
} |
- if (ipaddr) |
- ipaddr_set(ipaddr, 4, (unsigned char *) &addr.sin_addr); |
+ if (ipaddr) { |
+ if (addr.ss_family == AF_INET6) |
+ ipaddr_set(ipaddr, 6, (unsigned char *)&((struct sockaddr_in6*)&addr)->sin6_addr); |
+ else |
+ ipaddr_set(ipaddr, 4, (unsigned char *)&((struct sockaddr_in*)&addr)->sin_addr); |
+ } |
/* Set close on exec so subprocesses can't interfere */ |
if (fcntl(newsockfd, F_SETFD, FD_CLOEXEC) < 0) { |
@@ -322,9 +313,14 @@ |
/* Convert IPv4 address into text form */ |
-char *os_gethostbyaddr(void *opaque) |
+char *os_gethostbyaddr(void *opaque, unsigned int version) |
{ |
- struct hostent *hostent = gethostbyaddr(opaque, 4, AF_INET); |
+ struct hostent *hostent; |
+ |
+ if (version == 6) |
+ hostent = gethostbyaddr(opaque, 16, AF_INET6); |
+ else |
+ hostent = gethostbyaddr(opaque, 4, AF_INET); |
if (hostent && hostent->h_name && hostent->h_name[0]) |
return (hostent->h_name); |
@@ -332,6 +328,32 @@ |
return (NIL); |
} |
+int os_inet_ntop(void *addr, unsigned long version, char *buf, unsigned long buflen) { |
+ if (version == 6) { |
+ if (inet_ntop(AF_INET6, addr, buf, buflen)) |
+ return (T); |
+ } |
+ else { |
+ if (inet_ntop(AF_INET, addr, buf, buflen)) |
+ return (T); |
+ } |
+ return (NIL); |
+} |
+ |
+int os_inet_pton(char *str, struct ipaddr *addr) { |
+ unsigned char buf[16]; |
+ |
+ if (inet_pton(AF_INET6, str, buf)) { |
+ ipaddr_set(addr, 6, buf); |
+ return (T); |
+ } |
+ else if (inet_pton(AF_INET, str, buf)) { |
+ ipaddr_set(addr, 4, buf); |
+ return (T); |
+ } |
+ return (NIL); |
+} |
+ |
/* ====================================================================== */ |
/* Trivial SIG_CLD handler to prevent zombies from hanging around */ |
/trunk/debian/patches/includes.patch |
---|
0,0 → 1,26 |
Index: prayer-1.0.18/prayer/prayer_session.h |
=================================================================== |
--- prayer-1.0.18.orig/prayer/prayer_session.h 2007-03-10 18:50:09.676882377 +0100 |
+++ prayer-1.0.18/prayer/prayer_session.h 2007-03-10 18:50:11.007049496 +0100 |
@@ -27,7 +27,7 @@ |
extern int errno; /* just in case */ |
-#include "c-client.h" |
+#include <c-client.h> |
#define PRAYER_FULL_HDRS |
#include "prayer_shared.h" |
Index: prayer-1.0.18/prayer/cdb.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cdb.c 2007-03-10 18:51:20.845827434 +0100 |
+++ prayer-1.0.18/prayer/cdb.c 2007-03-10 18:51:25.766446163 +0100 |
@@ -63,7 +63,7 @@ |
#include <unistd.h> |
#include <sys/stat.h> |
-#include "mail.h" |
+#include "common.h" |
#include "cdb.h" |
#define CDB_HASH_SPLIT 256 /* num pieces the hash table is split into */ |
/trunk/debian/patches/session_unix_bugs.patch |
---|
0,0 → 1,20 |
--- prayer-1.0.18.orig/prayer/session_unix.c |
+++ prayer-1.0.18/prayer/session_unix.c |
@@ -56,7 +56,7 @@ |
} |
if (config->fix_client_ipaddr |
- && ipaddr_compare(session->ipaddr, &remote)) { |
+ && !ipaddr_compare(session->ipaddr, &remote)) { |
struct buffer *b = request->write_buffer; |
html_common_start(config, b, "Security Alert"); |
@@ -69,7 +69,7 @@ |
response_send(request); |
log_misc |
("HTTP Request from invalid IP address %s to running session %s", |
- &remote, session->url_prefix_asession); |
+ ipaddr_text(&remote), session->url_prefix_asession); |
return; |
} |
/trunk/debian/patches/utf8.patch |
---|
0,0 → 1,1507 |
This patch adds support for UTF-8 and modified UTF-7. Functions are in |
the new utf8.c. The patch adds calls to utf8_to_imaputf7() or |
utf8_from_imaputf7() wherever a folder name is handled in the code. In |
addition, it changes prayer to use UTF-8 in all HTML output as well as |
in composition of messages. |
Index: prayer-1.0.18/prayer/Makefile |
=================================================================== |
--- prayer-1.0.18.orig/prayer/Makefile 2007-03-10 19:39:29.563948453 +0100 |
+++ prayer-1.0.18/prayer/Makefile 2007-03-10 19:39:30.294042473 +0100 |
@@ -127,7 +127,7 @@ SESSION_SUPPORT_OBJS = \ |
abook.o lookup.o role.o dictionary.o \ |
options.o rfc1522.o banner.o favourite.o wrap.o portlist.o \ |
account.o account_msshell.o account_sieve.o account_support.o \ |
- sieve.o filter.o checksum.o |
+ sieve.o filter.o checksum.o utf8.o |
ifeq ($(strip $(SESSION_NEEDS_DB)), true) |
SESSION_SUPPORT_OBJS += mydb_db3.o |
Index: prayer-1.0.18/prayer/cmd_change.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_change.c 2007-03-10 19:38:53.659325192 +0100 |
+++ prayer-1.0.18/prayer/cmd_change.c 2007-03-10 19:39:30.344048912 +0100 |
@@ -16,7 +16,7 @@ void cmd_change(struct session *session) |
if (request->method == POST) { |
request_decode_post(request); |
- if (!(name = assoc_lookup(request->form, "folder"))) { |
+ if (!(name = utf8_to_imaputf7(request->pool, assoc_lookup(request->form, "folder")))) { |
session_redirect(session, request, "error"); |
return; |
} |
@@ -30,7 +30,8 @@ void cmd_change(struct session *session) |
} |
if (!session_streams_change(session, name)) { |
- session_message(session, "Unable to switch to folder: %s", name); |
+ session_message(session, "Unable to switch to folder: %s", |
+ utf8_from_imaputf7(request->pool, name)); |
session_redirect(session, request, "restart"); |
return; |
} |
@@ -47,7 +48,7 @@ void cmd_change(struct session *session) |
} |
session_message(session, "Switched to mailbox: %s", |
- session->foldername); |
+ utf8_from_imaputf7(request->pool, session->foldername)); |
session_log(session, "[cmd_change] Switched to mailbox: %s", |
session->foldername); |
Index: prayer-1.0.18/prayer/cmd_compose.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_compose.c 2007-03-10 19:38:53.719332917 +0100 |
+++ prayer-1.0.18/prayer/cmd_compose.c 2007-03-10 19:39:30.384054064 +0100 |
@@ -244,7 +244,7 @@ static BOOL cmd_compose_generate_postpon |
strlen(string), string, NIL); |
string = |
- string_prune(request->pool, string, config->list_addr_maxlen); |
+ utf8_prune(request->pool, string, config->list_addr_maxlen); |
bputs(b, "<td>" CRLF); |
html_quote_string(b, string); |
@@ -267,7 +267,7 @@ static BOOL cmd_compose_generate_postpon |
rfc1522_decode(pool_alloc(request->pool, strlen(string)), |
strlen(string), string, NIL); |
- string = string_prune(request->pool, string, |
+ string = utf8_prune(request->pool, string, |
config->list_subject_maxlen); |
} else |
string = "(No subject)"; |
Index: prayer-1.0.18/prayer/cmd_copy.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_copy.c 2007-03-10 19:38:53.769339356 +0100 |
+++ prayer-1.0.18/prayer/cmd_copy.c 2007-03-10 19:39:30.404056640 +0100 |
@@ -95,7 +95,7 @@ generate_directory_line(struct session * |
html_session_bprintf(session, b, |
"<td><a href=\"", "\">" CRLF, "copy?cwd=%s", |
name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td>" CRLF); |
bputs(b, "</tr>" CRLF); |
@@ -127,7 +127,7 @@ generate_favourite_folder_line(struct se |
html_session_bprintf(session, b, |
"<td><a href=\"", "\">" CRLF, "copy_msg/%s", |
name); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bprintf(b, "</a></td>" CRLF); |
bputs(b, "</tr>" CRLF); |
@@ -159,7 +159,7 @@ generate_folder_line(struct session *ses |
html_session_bprintf(session, b, |
"<td><a href=\"", "\">" CRLF, "copy_msg/%s", |
name); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bprintf(b, "</a></td>" CRLF); |
bprintf(b, "</tr>" CRLF); |
@@ -209,8 +209,8 @@ html_folderlist(struct session *session, |
bputs(b, "<tr>"); |
bputs(b, "<td>"); |
bputs(b, "<table><tr><td>" CRLF); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
bputs(b, "</td></tr></table>" CRLF); |
bputs(b, "<td align=\"right\"><table><tr><td>" CRLF); |
Index: prayer-1.0.18/prayer/cmd_copy_msg.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_copy_msg.c 2007-03-10 19:38:53.829347082 +0100 |
+++ prayer-1.0.18/prayer/cmd_copy_msg.c 2007-03-10 19:39:30.484066944 +0100 |
@@ -125,12 +125,13 @@ void cmd_copy_msg(struct session *sessio |
/* Keep current message */ |
if (count > 1) { |
session_message(session, "Copied %lu messages to %s", count, |
- mailbox); |
+ utf8_from_imaputf7(request->pool, mailbox)); |
session_log(session, |
"[cmd_copy_msg] Copied %lu messages to %s", count, |
mailbox); |
} else if (count == 1) { |
- session_message(session, "Copied 1 message to %s", mailbox); |
+ session_message(session, "Copied 1 message to %s", |
+ utf8_from_imaputf7(request->pool, mailbox)); |
session_log(session, "[cmd_copy_msg] Copied 1 message to %s", |
mailbox); |
} else { |
@@ -152,9 +153,8 @@ void cmd_copy_msg(struct session *sessio |
next = msgmap_value(zm, zm_offset + 1); |
else { |
/* No next message */ |
- session_message(session, |
- "Copied message %lu to \"%s\", no more messages", |
- msgno, mailbox); |
+ session_message(session, "Copied message %lu to \"%s\", no more messages", |
+ msgno, utf8_from_imaputf7(request->pool, mailbox)); |
session_log(session, "[cmd_copy_msg] Copied message %lu to %s", |
msgno, mailbox); |
session->current = msgno; |
@@ -162,9 +162,8 @@ void cmd_copy_msg(struct session *sessio |
return; |
} |
- session_message(session, |
- "Copied message %lu to \"%s\", displaying %lu out of %lu", |
- msgno, mailbox, next, zm->nmsgs); |
+ session_message(session, "Copied message %lu to \"%s\", displaying %lu out of %lu", |
+ msgno, utf8_from_imaputf7(request->pool, mailbox), next, zm->nmsgs); |
session_log(session, "[cmd_copy_msg] Copied message %lu to %s", |
msgno, mailbox); |
Index: prayer-1.0.18/prayer/cmd_create.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_create.c 2007-03-10 19:38:53.919358672 +0100 |
+++ prayer-1.0.18/prayer/cmd_create.c 2007-03-10 19:39:30.554075959 +0100 |
@@ -21,7 +21,8 @@ void cmd_create(struct session *session) |
request_decode_get(request); |
- if ((mailbox = assoc_lookup(request->form, "name")) == NIL) { |
+ if ((mailbox = utf8_to_imaputf7(request->pool, |
+ assoc_lookup(request->form, "name"))) == NIL) { |
session_redirect(session, request, "error"); |
return; |
} |
@@ -58,12 +59,13 @@ void cmd_create(struct session *session) |
if (ml_have_error()) { |
session_message(session, |
"Failed to create directory: %s - %s", |
- path, ml_errmsg()); |
+ utf8_from_imaputf7(request->pool, path), ml_errmsg()); |
session_log(session, |
"[cmd_create] Failed to create directory: %s", |
path); |
} else { |
- session_message(session, "Created directory: %s", path); |
+ session_message(session, "Created directory: %s", |
+ utf8_from_imaputf7(request->pool, path)); |
session_log(session, |
"[cmd_create] Created directory: %s", path); |
dircache_add(session->dircache, path, T); |
@@ -72,12 +74,13 @@ void cmd_create(struct session *session) |
if (ml_have_error()) { |
session_message(session, |
"Failed to create mailbox: %s - %s", |
- path, ml_errmsg()); |
+ utf8_from_imaputf7(request->pool, path), ml_errmsg()); |
session_log(session, |
"[cmd_create] Failed to create mailbox: %s", |
path); |
} else { |
- session_message(session, "Created mailbox: %s", path); |
+ session_message(session, "Created mailbox: %s", |
+ utf8_from_imaputf7(request->pool, path)); |
session_log(session, "[cmd_create] Created mailbox: %s", |
path); |
dircache_add(session->dircache, path, NIL); |
Index: prayer-1.0.18/prayer/cmd_dir_check.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_dir_check.c 2007-03-10 19:38:53.979366397 +0100 |
+++ prayer-1.0.18/prayer/cmd_dir_check.c 2007-03-10 19:39:30.584079823 +0100 |
@@ -43,7 +43,7 @@ void cmd_dir_check(struct session *sessi |
session_message(session, |
"Refreshed directory cache for directory \"%s\" at %s", |
- session->cwd, current_time()); |
+ utf8_from_imaputf7(request->pool, session->cwd), current_time()); |
dircache_invalidate(session, session->cwd); |
if (request->argc >= 2) |
Index: prayer-1.0.18/prayer/cmd_display.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_display.c 2007-03-10 19:38:54.049375411 +0100 |
+++ prayer-1.0.18/prayer/cmd_display.c 2007-03-10 19:39:30.644087551 +0100 |
@@ -567,9 +567,11 @@ show_textpart(struct session *session, M |
struct request *request = session->request; |
struct buffer *b = request->write_buffer; |
char *init_msg, *decode_msg; |
+ char *charset = "ISO-8859-1"; |
unsigned long len; |
BODY *body = NIL; |
BOOL show_html = NIL; |
+ PARAMETER *parameter; |
if (!(body = ml_body(session, stream, msgno, section))) |
return(NIL); |
@@ -580,6 +582,13 @@ show_textpart(struct session *session, M |
return(NIL); |
} |
+ for (parameter = body->parameter; parameter; parameter = parameter->next) { |
+ if (strcasecmp(parameter->attribute, "charset") == 0) { |
+ charset = parameter->value; |
+ break; |
+ } |
+ } |
+ |
if (!(init_msg = ml_fetchbody(session, stream, msgno, section, &len))) |
return(NIL); |
@@ -637,10 +646,10 @@ show_textpart(struct session *session, M |
if (show_html) { |
if (decode_msg == init_msg) |
decode_msg = strdup(init_msg); |
- html_secure(session, b, decode_msg); |
+ html_secure(session, b, utf8_from_string(request->pool, charset, decode_msg, len)); |
} else { |
bprintf(b, "<pre>" CRLF); |
- wrap_line_html(session, b, decode_msg, 80); |
+ wrap_line_html(session, b, utf8_from_string(request->pool, charset, decode_msg, len), 80); |
bprintf(b, "</pre>" CRLF); |
} |
Index: prayer-1.0.18/prayer/cmd_favourites.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_favourites.c 2007-03-10 19:38:54.109383138 +0100 |
+++ prayer-1.0.18/prayer/cmd_favourites.c 2007-03-10 19:39:30.664090126 +0100 |
@@ -104,7 +104,7 @@ generate_directory_line(struct session * |
html_session_bprintf(session, b, "<a href=\"", "\">" CRLF, |
"favourites?cwd=%s", name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td>" CRLF); |
bputs(b, "<td> </td>" CRLF); |
bputs(b, "<td> </td>" CRLF); |
@@ -134,7 +134,7 @@ generate_favourite_folder_line(struct se |
bputs(b, "</td>" CRLF); |
bputs(b, "<td nowrap>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</td>" CRLF); |
html_textlink_mailbox_table(session, b, "unsubscribe", name, |
@@ -170,7 +170,7 @@ generate_folder_line(struct session *ses |
bputs(b, "</td>" CRLF); |
bprintf(b, "<td nowrap>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bprintf(b, "</td>" CRLF); |
html_textlink_mailbox_table(session, b, "subscribe", name, |
@@ -208,8 +208,8 @@ html_folderlist(struct session *session, |
bputs(b, "<tr>"); |
bputs(b, "<td>"); |
bputs(b, "<table><tr><td>" CRLF); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
bputs(b, "</td></tr></table>" CRLF); |
bputs(b, "</td>" CRLF); |
Index: prayer-1.0.18/prayer/cmd_filter_select.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_filter_select.c 2007-03-10 19:38:54.159389577 +0100 |
+++ prayer-1.0.18/prayer/cmd_filter_select.c 2007-03-10 19:39:30.694093991 +0100 |
@@ -68,7 +68,7 @@ generate_directory_line(struct session * |
html_session_bprintf(session, b, "<td><a href=\"", "\">" CRLF, |
"filter_select?cwd=%s", name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td>" CRLF); |
bputs(b, "</tr>" CRLF); |
@@ -93,7 +93,7 @@ generate_favourite_folder_line(struct se |
bputs(b, "</td>" CRLF); |
bputs(b, "<td>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</td>" CRLF); |
html_textlink_mailbox_table(session, b, "filter_mbox/copy", name, |
@@ -124,7 +124,7 @@ generate_folder_line(struct session *ses |
bputs(b, "</td>" CRLF); |
bputs(b, "<td>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</td>" CRLF); |
html_textlink_mailbox_table(session, b, "filter_mbox/copy", name, |
@@ -159,8 +159,8 @@ html_folderlist(struct session *session, |
/* Change directory form, including back button */ |
html_form_start(session, b, "GET", "filter_select"); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "sub_apply", "Apply"); |
html_form_submit(b, "sub_cancel", "Cancel"); |
html_form_end(b); |
Index: prayer-1.0.18/prayer/cmd_folders.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_folders.c 2007-03-10 19:38:54.249401166 +0100 |
+++ prayer-1.0.18/prayer/cmd_folders.c 2007-03-10 19:39:30.734099143 +0100 |
@@ -95,7 +95,7 @@ generate_directory_line(struct session * |
html_session_bprintf(session, b, "<td><a href=\"", "\">" CRLF, |
"folders?cwd=%s", name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td>" CRLF); |
html_textlink_mailbox_table(session, b, "rename", name, "Rename"); |
@@ -127,7 +127,7 @@ generate_folder_line(struct session *ses |
html_session_bprintf(session, b, "<td nowrap><a href=\"", "\">" CRLF, |
"change/%s", name); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bprintf(b, "</a></td>" CRLF); |
if (strcmp(name, "INBOX") != 0) { |
@@ -165,8 +165,8 @@ html_folderlist(struct session *session, |
else |
bputs(b, "<tr>"); |
bputs(b, "<td><table><tr><td>" CRLF); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
bputs(b, "</td></tr></table></td>" CRLF); |
bputs(b, "<td align=\"right\"><table><tr>" CRLF); |
@@ -267,7 +267,7 @@ void cmd_folders(struct session *session |
request_decode_get(request); |
h = request->form; |
- if ((s = assoc_lookup(h, "cwd"))) { |
+ if ((s = utf8_to_imaputf7(request->pool, assoc_lookup(h, "cwd")))) { |
string_canon_decode(s); |
if (string_filename_valid(s)) |
@@ -277,7 +277,7 @@ void cmd_folders(struct session *session |
"Path contained illegal characters"); |
} |
- if ((s = assoc_lookup(h, "filter")) |
+ if ((s = utf8_to_imaputf7(request->pool, assoc_lookup(h, "filter"))) |
&& (strcmp(s, session->dir_filter) != 0)) |
string_strdup(&session->dir_filter, s); |
} |
Index: prayer-1.0.18/prayer/cmd_forward1.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_forward1.c 2007-03-10 19:38:54.309408891 +0100 |
+++ prayer-1.0.18/prayer/cmd_forward1.c 2007-03-10 19:39:30.744100430 +0100 |
@@ -157,6 +157,8 @@ add_text(struct session *session, |
char *init_msg, *decode_msg, *type; |
BODY *body = NIL; |
char *section = "1"; |
+ PARAMETER *parameter; |
+ char *charset = "ISO-8859-1"; |
if (!(text = ml_fetch_header(session, stream, msgno, |
NIL, hdrslist, &len, 0))) |
@@ -204,6 +206,13 @@ add_text(struct session *session, |
} else |
section = "1"; |
+ for (parameter = body->parameter; parameter; parameter = parameter->next) { |
+ if (strcasecmp(parameter->attribute, "charset") == 0) { |
+ charset = parameter->value; |
+ break; |
+ } |
+ } |
+ |
if (!(init_msg = ml_fetchbody(session, stream, msgno, section, &len))) |
return (NIL); |
Index: prayer-1.0.18/prayer/cmd_list.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_list.c 2007-03-10 19:38:54.379417906 +0100 |
+++ prayer-1.0.18/prayer/cmd_list.c 2007-03-10 19:39:30.794106870 +0100 |
@@ -143,7 +143,7 @@ cmd_list_toolbar_hdr(struct session *ses |
bputs(b, "</tr></table></td>" CRLF); |
bputs(b, "<td width=\"33%\" align=\"center\"><strong>\""); |
- html_quote_string(b, session->foldername); |
+ html_quote_string(b, utf8_from_imaputf7(session->request->pool, session->foldername)); |
bputs(b, "\" with "); |
bprintf(b, "%lu%s %s" CRLF, count, marked, messages); |
bputs(b, "</strong></td>" CRLF); |
@@ -378,7 +378,7 @@ cmd_list_msg(struct session *session, |
(char *) rfc1522_decode(pool_alloc(request->pool, strlen(string)), |
strlen(string), string, NIL); |
- string = string_prune(request->pool, string, config->list_addr_maxlen); |
+ string = utf8_prune(request->pool, string, config->list_addr_maxlen); |
if (use_to) |
string = pool_strcat(request->pool, "To: ", string); |
@@ -400,7 +400,7 @@ cmd_list_msg(struct session *session, |
rfc1522_decode(pool_alloc(request->pool, strlen(string)), |
strlen(string), string, NIL); |
- string = string_prune(request->pool, string, |
+ string = utf8_prune(request->pool, string, |
config->list_subject_maxlen); |
} else |
string = "(No subject)"; |
Index: prayer-1.0.18/prayer/cmd_preferred.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_preferred.c 2007-03-10 19:38:54.429424344 +0100 |
+++ prayer-1.0.18/prayer/cmd_preferred.c 2007-03-10 19:39:30.824110733 +0100 |
@@ -22,7 +22,8 @@ void cmd_preferred(struct session *sessi |
if (string_filename_valid(name)) { |
favourite_preferred(fl, name); |
options->save = T; |
- session_message(session, "Making %s preferred folder", name); |
+ session_message(session, "Making %s preferred folder", |
+ utf8_from_imaputf7(request->pool, name)); |
} else |
session_message(session, |
"String contained illegal characters"); |
Index: prayer-1.0.18/prayer/cmd_rename.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_rename.c 2007-03-10 19:38:54.499433358 +0100 |
+++ prayer-1.0.18/prayer/cmd_rename.c 2007-03-10 19:39:30.844113310 +0100 |
@@ -63,7 +63,7 @@ generate_directory_line(struct session * |
bprintf(b, "</a></td>" CRLF); |
html_session_bprintf(session, b, "<td><a href=\"", "\">" CRLF, |
"rename?cwd=%s", name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td></tr>" CRLF); |
} |
@@ -84,7 +84,7 @@ generate_folder_line(struct session *ses |
html_icon(session, b, "dir.gif", "[mailbox]"); |
bputs(b, "</a></td>" CRLF); |
bputs(b, "<td><a>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</a></td></tr>" CRLF); |
} |
@@ -107,7 +107,7 @@ rename_html_folderlist(struct session *s |
if (session->rename_foldername) |
bprintf(b, |
"<h2 align=\"center\">Rename folder %s to ...</h2>" CRLF, |
- session->rename_foldername); |
+ utf8_from_imaputf7(pool, session->rename_foldername)); |
/* Change directory form, including back button */ |
html_form_start(session, b, "GET", "rename"); |
@@ -118,8 +118,8 @@ rename_html_folderlist(struct session *s |
else |
bputs(b, "<tr>"); |
bputs(b, "<td>" CRLF); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
bputs(b, "</td></tr></table>" CRLF); |
html_form_end(b); |
Index: prayer-1.0.18/prayer/cmd_rename_item.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_rename_item.c 2007-03-10 19:38:54.569442372 +0100 |
+++ prayer-1.0.18/prayer/cmd_rename_item.c 2007-03-10 19:39:30.864115885 +0100 |
@@ -29,7 +29,7 @@ void cmd_rename_item(struct session *ses |
} |
if (!(session->rename_foldername && |
- (newname = assoc_lookup(request->form, "name")))) { |
+ (newname = utf8_to_imaputf7(pool, assoc_lookup(request->form, "name"))))) { |
session_redirect(session, request, "folders"); |
return; |
} |
@@ -70,11 +70,13 @@ void cmd_rename_item(struct session *ses |
if (ml_have_error()) { |
session_message(session, |
"Failed to rename mailbox: %s - %s", |
- session->rename_foldername, ml_errmsg()); |
+ utf8_from_imaputf7(pool, session->rename_foldername), |
+ ml_errmsg()); |
} else { |
session_message(session, |
"Renamed mailbox %s to be %s", |
- session->rename_foldername, newname); |
+ utf8_from_imaputf7(pool, session->rename_foldername), |
+ newname); |
dircache_rename(session->dircache, session->rename_foldername, |
newname); |
} |
Index: prayer-1.0.18/prayer/cmd_reply2.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_reply2.c 2007-03-10 19:38:54.619448812 +0100 |
+++ prayer-1.0.18/prayer/cmd_reply2.c 2007-03-10 19:39:30.894119749 +0100 |
@@ -51,6 +51,8 @@ add_text(struct session *session, struct |
char *init_msg, *decode_msg, *type; |
unsigned long len; |
char *text, *s; |
+ PARAMETER *parameter; |
+ char *charset = "ISO-8859-1"; |
if ((body = ml_body(session, stream, msgno, "1")) == NIL) |
return(NIL); |
@@ -91,6 +93,13 @@ add_text(struct session *session, struct |
return(T); |
} |
+ for (parameter = body->parameter; parameter; parameter = parameter->next) { |
+ if (strcasecmp(parameter->attribute, "charset") == 0) { |
+ charset = parameter->value; |
+ break; |
+ } |
+ } |
+ |
/* Got a valid text section to display */ |
if (!(init_msg=ml_fetchbody(session, stream, msgno, section, &len))) |
return(NIL); |
@@ -133,11 +142,11 @@ add_text(struct session *session, struct |
struct buffer *b = buffer_create(pool, 8192); |
if (decode_msg == init_msg) |
decode_msg = strdup(init_msg); |
- html_secure_strip_all(b, decode_msg); |
+ html_secure_strip_all(b, utf8_from_string(pool, charset, decode_msg, len)); |
text = buffer_fetch(b, 0, buffer_size(b), NIL); |
} else |
- text = decode_msg; |
+ text = utf8_from_string(pool, charset, decode_msg, len); |
bputs(b, ">"); |
for (s = text; *s;) { |
Index: prayer-1.0.18/prayer/cmd_rm.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_rm.c 2007-03-10 19:38:54.669455249 +0100 |
+++ prayer-1.0.18/prayer/cmd_rm.c 2007-03-10 19:39:30.914122325 +0100 |
@@ -32,16 +32,20 @@ void cmd_rm(struct session *session) |
bprintf(b, |
"<h2 align=\"center\">Confirm directory deletion: \"%s\"</h2>" |
CRLF, |
- string_canon_decode(pool_strdup |
- (request->pool, request->argv[2]))); |
+ utf8_from_imaputf7(request->pool, |
+ string_canon_decode(pool_strdup |
+ (request->pool, |
+ request->argv[2])))); |
} else { |
html_start(session, b, "Confirm Mail folder deletion"); |
bprintf(b, |
"<h2 align=\"center\">Confirm folder deletion: \"%s\"</h2>" |
CRLF, |
- string_canon_decode(pool_strdup |
- (request->pool, request->argv[2]))); |
+ utf8_from_imaputf7(request->pool, |
+ string_canon_decode(pool_strdup |
+ (request->pool, |
+ request->argv[2])))); |
} |
cmd = pool_printf(request->pool, "rm1/%s/%s", |
Index: prayer-1.0.18/prayer/cmd_rm1.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_rm1.c 2007-03-10 19:38:54.719461687 +0100 |
+++ prayer-1.0.18/prayer/cmd_rm1.c 2007-03-10 19:39:30.944126189 +0100 |
@@ -55,7 +55,7 @@ void cmd_rm1(struct session *session) |
session_message(session, "%s", ml_errmsg()); /* Includes name */ |
} else { |
session_message(session, "Deleted directory: \"%s\"", mailbox); |
- dircache_delete(session->dircache, mailbox); |
+ dircache_delete(session->dircache, utf8_from_imaputf7(request->pool, mailbox)); |
} |
} else { |
ml_delete(session, stream, |
@@ -67,7 +67,8 @@ void cmd_rm1(struct session *session) |
} else if (ml_have_error()) { |
session_message(session, "%s", ml_errmsg()); /* Includes name */ |
} else { |
- session_message(session, "Deleted mailbox: \"%s\"", mailbox); |
+ session_message(session, "Deleted mailbox: \"%s\"", |
+ utf8_from_imaputf7(request->pool, mailbox)); |
dircache_delete(session->dircache, mailbox); |
if (favourite_delete(fl, mailbox)) |
options->save = T; |
Index: prayer-1.0.18/prayer/cmd_subscribe.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_subscribe.c 2007-03-10 19:38:54.769468126 +0100 |
+++ prayer-1.0.18/prayer/cmd_subscribe.c 2007-03-10 19:39:30.954127477 +0100 |
@@ -23,7 +23,7 @@ void cmd_subscribe(struct session *sessi |
if (favourite_add(fl, name)) { |
options->save = T; |
session_message(session, "Added %s to favourites list", |
- name); |
+ utf8_from_imaputf7(request->pool, name)); |
} else |
session_message(session, "Already on favourites list", |
name); |
Index: prayer-1.0.18/prayer/cmd_transfer.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_transfer.c 2007-03-10 19:38:54.829475852 +0100 |
+++ prayer-1.0.18/prayer/cmd_transfer.c 2007-03-10 19:39:30.994132629 +0100 |
@@ -93,7 +93,7 @@ generate_directory_line(struct session * |
html_session_bprintf(session, b, |
"<td><a href=\"", "\">" CRLF, "transfer?cwd=%s", |
name); |
- html_quote_string(b, dir); |
+ html_quote_string(b, utf8_from_imaputf7(pool, dir)); |
bprintf(b, "</a></td>" CRLF); |
bputs(b, "<td> </td>" CRLF); |
@@ -125,7 +125,7 @@ generate_favourite_folder_line(struct se |
bputs(b, "</a></td>" CRLF); |
bputs(b, "<td><a>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</a></td>" CRLF); |
bprintf(b, "<td><a href=\"%s/NOSEQ/transfer/%s/%s\">" CRLF, |
@@ -159,7 +159,7 @@ generate_folder_line(struct session *ses |
bputs(b, "</a></td>" CRLF); |
bputs(b, "<td>" CRLF); |
- html_quote_string(b, folder); |
+ html_quote_string(b, utf8_from_imaputf7(pool, folder)); |
bputs(b, "</td>" CRLF); |
bprintf(b, "<td><a href=\"%s/NOSEQ/transfer/%s/%s\">" CRLF, |
@@ -197,8 +197,8 @@ html_folderlist(struct session *session, |
else |
bputs(b, "<tr>"); |
bputs(b, "<td><table><tr><td>" CRLF); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
bputs(b, "</td></tr></table></td>" CRLF); |
bputs(b, "<td align=\"right\"><table><tr><td>" CRLF); |
@@ -332,7 +332,8 @@ static BOOL download(struct session *ses |
OP_READONLY); |
if (!session->xfer_stream) { |
- session_message(session, "Failed to open mail folder: %s", name); |
+ session_message(session, "Failed to open mail folder: %s", |
+ utf8_from_imaputf7(request->pool, name)); |
session_log(session, |
"[cmd_transfer] Failed to open mail folder: %s", name); |
return (NIL); |
@@ -343,7 +344,7 @@ static BOOL download(struct session *ses |
/* Fetch overview for all messages in folder */ |
if (!ml_fetch_overview(session, tstream, "1:*", NIL)) { |
session_message(session, "Failed to fetch folder overview: %s", |
- name); |
+ utf8_from_imaputf7(request->pool, name)); |
session_log(session, |
"[cmd_transfer]] Failed to fetch overview: %s", name); |
return (NIL); |
Index: prayer-1.0.18/prayer/cmd_unsubscribe.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_unsubscribe.c 2007-03-10 19:38:54.919487442 +0100 |
+++ prayer-1.0.18/prayer/cmd_unsubscribe.c 2007-03-10 19:39:31.014135204 +0100 |
@@ -23,10 +23,11 @@ void cmd_unsubscribe(struct session *ses |
if (favourite_delete(fl, name)) { |
options->save = T; |
session_message(session, "Removed %s from favourites list", |
- name); |
+ utf8_from_imaputf7(request->pool, name)); |
} else |
session_message(session, |
- "Folder %s not on favourites list", name); |
+ "Folder %s not on favourites list", |
+ utf8_from_imaputf7(request->pool, name)); |
} else |
session_message(session, |
"String contained illegal characters"); |
Index: prayer-1.0.18/prayer/cmd_upload_select.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/cmd_upload_select.c 2007-03-10 19:38:54.969493881 +0100 |
+++ prayer-1.0.18/prayer/cmd_upload_select.c 2007-03-10 19:39:31.034137781 +0100 |
@@ -122,8 +122,8 @@ html_folderlist(struct session *session, |
/* Change directory form, including back button */ |
html_form_start(session, b, "GET", "upload_select"); |
- html_form_field(b, "Directory", "cwd", session->cwd, 32); |
- html_form_field(b, "Filter", "filter", session->dir_filter, 12); |
+ html_form_field(b, "Directory", "cwd", utf8_from_imaputf7(pool, session->cwd), 32); |
+ html_form_field(b, "Filter", "filter", utf8_from_imaputf7(pool, session->dir_filter), 12); |
html_form_submit(b, "submit", "Apply"); |
html_form_end(b); |
Index: prayer-1.0.18/prayer/draft.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/draft.c 2007-03-10 19:38:55.019500318 +0100 |
+++ prayer-1.0.18/prayer/draft.c 2007-03-10 19:39:31.074142931 +0100 |
@@ -477,7 +477,7 @@ void draft_update_body(struct draft *d, |
} else |
d->body = pool_strdup(d->pool, d->body); |
- draft_transliterate_1252((unsigned char *)d->body); |
+ /*draft_transliterate_1252((unsigned char *)d->body);*/ |
} |
/* draft_update() ******************************************************** |
@@ -535,7 +535,7 @@ void draft_update(struct draft *d, struc |
else |
d->body = pool_maybe_strdup(d->pool, d->body); |
- draft_transliterate_1252((unsigned char *)d->body); |
+ /*draft_transliterate_1252((unsigned char *)d->body);*/ |
d->in_reply_to = pool_maybe_strdup(d->pool, d->in_reply_to); |
d->references = pool_maybe_strdup(d->pool, d->references); |
@@ -1164,7 +1164,7 @@ static void draft_make_multipart(struct |
bprintf(b, CRLF "--%s" CRLF, cookie); |
bputs(b, |
- "Content-Type: text/plain; format=flowed; charset=ISO-8859-1" |
+ "Content-Type: text/plain; format=flowed; charset=UTF-8" |
CRLF); |
if (need_qprint) |
bputs(b, "Content-Transfer-Encoding: QUOTED-PRINTABLE" CRLF); |
@@ -1323,7 +1323,7 @@ static void draft_make_single_part(struc |
need_qprint = T; |
bputs(b, |
- "Content-Type: text/plain; format=flowed; charset=ISO-8859-1" |
+ "Content-Type: text/plain; format=flowed; charset=UTF-8" |
CRLF); |
if (need_qprint) |
bputs(b, "Content-Transfer-Encoding: quoted-printable" CRLF); |
@@ -1418,7 +1418,7 @@ char *draft_make_msg(struct draft *draft |
/* Encode using temporary buffer if required */ |
s = (char *) rfc1522_encode(tmp, len, |
- (unsigned char *) s, "ISO-8859-1"); |
+ (unsigned char *) s, "UTF-8"); |
bprintf(mb, "Subject: %s" CRLF, s); |
free(tmp); |
} |
Index: prayer-1.0.18/prayer/html.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/html.c 2007-03-10 19:38:55.069506757 +0100 |
+++ prayer-1.0.18/prayer/html.c 2007-03-10 19:39:31.134150660 +0100 |
@@ -35,7 +35,7 @@ void html_start(struct session *session, |
bprintf(b, "<title>Webmail service: %s</title>" CRLF, title); |
bputs(b, "<meta name=\"robots\" content=\"none\">" CRLF); |
bputs(b, ("<meta http-equiv=\"Content-Type\" " |
- "content=\"text/html; charset=ISO-8859-1\">" CRLF)); |
+ "content=\"text/html; charset=UTF-8\">" CRLF)); |
bputs(b, "</head>" CRLF); |
bputs(b, "<body"); |
@@ -502,7 +502,7 @@ void |
html_form_start(struct session *s, struct buffer *b, char *method, |
char *cmd) |
{ |
- bprintf(b, "<form method=\"%s\" accept-charset=\"ISO-8859-1\"", |
+ bprintf(b, "<form method=\"%s\" accept-charset=\"UTF-8\"", |
method); |
html_session_bputs(s, b, " action=\"", "\">" CRLF, cmd); |
} |
@@ -854,7 +854,7 @@ html_banner_toolbar_favourites(struct se |
string_canon_encode(request->pool, li->name)); |
} |
- html_quote_string(b, li->name); |
+ html_quote_string(b, utf8_from_imaputf7(request->pool, li->name)); |
bputs(b, "</option>" CRLF); |
} |
bputs(b, "</select>" CRLF); |
@@ -926,14 +926,14 @@ html_banner_toolbar_folders(struct sessi |
if (prefix) { |
bprintf(b, "<option value=\"%s%s\">", |
prefix, string_canon_encode(request->pool, dl->name)); |
- html_quote_string(b, session->cwd); |
+ html_quote_string(b, utf8_from_imaputf7(request->pool, session->cwd)); |
html_quote_string(b, "/"); |
- html_quote_string(b, dl->name); |
+ html_quote_string(b, utf8_from_imaputf7(request->pool, dl->name)); |
bputs(b, "</option>" CRLF); |
} else if (strcasecmp(dl->name, "INBOX") != 0) { |
bprintf(b, "<option value=\"%s\">", |
string_canon_encode(request->pool, dl->name)); |
- html_quote_string(b, dl->name); |
+ html_quote_string(b, utf8_from_imaputf7(request->pool, dl->name)); |
bputs(b, "</option>" CRLF); |
} |
} |
@@ -1077,7 +1077,8 @@ html_banner_toolbar(struct session *sess |
void html_quote_char(struct buffer *b, unsigned char c) |
{ |
if (c > 127) { |
- bprintf(b, "&#%lu;", (unsigned long) c); |
+ /*bprintf(b, "&#%lu;", (unsigned long) c);*/ |
+ bputc(b, c); |
} else |
switch (c) { |
case '"': |
Index: prayer-1.0.18/prayer/prayer_session.h |
=================================================================== |
--- prayer-1.0.18.orig/prayer/prayer_session.h 2007-03-10 19:39:29.243907238 +0100 |
+++ prayer-1.0.18/prayer/prayer_session.h 2007-03-10 19:39:31.844242104 +0100 |
@@ -74,3 +74,4 @@ extern int errno; /* just |
#include "checksum.h" |
#include "wrap.h" |
#include "portlist.h" |
+#include "utf8.h" |
Index: prayer-1.0.18/prayer/response.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/response.c 2007-03-10 19:38:55.169519634 +0100 |
+++ prayer-1.0.18/prayer/response.c 2007-03-10 19:39:31.904249831 +0100 |
@@ -405,7 +405,7 @@ void response_error(struct request *requ |
bputs(b, "Expires: "); |
response_date_string(b, time(NIL)); |
bputs(b, "" CRLF); |
- bprintf(b, "Content-Type: text/html; charset=iso-8859-1" CRLF); |
+ bprintf(b, "Content-Type: text/html; charset=UTF-8" CRLF); |
bprintf(b, "Content-Length: %lu" CRLF, |
buffer_size(request->write_buffer)); |
response_header_end(request); |
@@ -437,7 +437,7 @@ void response_html(struct request *reque |
/* Generate simple header block for HTML */ |
response_header_start(request, status); |
- bputs(b, "Content-Type: text/html; charset=iso-8859-1" CRLF); |
+ bputs(b, "Content-Type: text/html; charset=UTF-8" CRLF); |
#ifdef STELLA_HACK |
bputs(b, "Expires: "); |
Index: prayer-1.0.18/prayer/rfc1522.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/rfc1522.c 2007-03-10 19:38:55.249529936 +0100 |
+++ prayer-1.0.18/prayer/rfc1522.c 2007-03-10 19:39:31.934253696 +0100 |
@@ -162,6 +162,7 @@ char **charset; |
unsigned char *rv = NULL, *p; |
char *start = s, *sw, *cset, *enc, *txt, *ew, **q, *lang; |
unsigned long l; |
+ unsigned char *src; |
int i; |
*d = '\0'; /* init destination */ |
@@ -171,15 +172,16 @@ char **charset; |
while (s && (sw = strstr(s, RFC1522_INIT))) { |
/* validate the rest of the encoded-word */ |
if (rfc1522_valid(sw, &cset, &enc, &txt, &ew)) { |
- if (!rv) |
+ if (!rv) |
rv = d; /* remember start of dest */ |
/* copy everything between s and sw to destination */ |
for (i = 0; &s[i] < sw; i++) |
if (!isspace((unsigned char) s[i])) { /* if some non-whitespace */ |
- while (s < sw && d - rv < len - 1) |
- *d++ = (unsigned char) *s++; |
- |
+ /* Assume that any 8 bit characters are Latin-1 */ |
+ utf8_print(VAR_CHAR_SET, NULL, |
+ &d, len - (d - rv) - 1, |
+ (unsigned char**)&s, sw - s); |
break; |
} |
@@ -188,23 +190,12 @@ char **charset; |
if ((lang = strchr(cset, '*'))) |
*lang++ = '\0'; |
- |
- /* Insert text explaining charset if we don't know what it is */ |
- if ((strcasecmp((char *) cset, VAR_CHAR_SET)) |
- && strcasecmp((char *) cset, "US-ASCII")) { |
- if (charset) { |
- if (!*charset) /* only write first charset */ |
- *charset = cpystr(cset); |
- } else { |
- if (d - rv < len - 1) |
- *d++ = '['; |
- |
- sstrncpy((char **) &d, cset, len - 1 - (d - rv)); |
- if (d - rv < len - 1) |
- *d++ = ']'; |
- if (d - rv < len - 1) |
- *d++ = SPACE; |
- } |
+ if (!*cset) { |
+ cset = UNKNOWN_CHARSET; |
+ } |
+ if (charset) { |
+ if (!*charset) /* only write first charset */ |
+ *charset = cpystr(cset); |
} |
/* based on encoding, write the encoded text to output buffer */ |
@@ -228,15 +219,14 @@ char **charset; |
} else |
q = NULL; |
- if ((p = |
+ if ((src = p = |
rfc822_qprint((unsigned char *) txt, strlen(txt), |
&l))) { |
- strncpy((char *) d, (char *) p, len - 1 - (d - rv)); |
- d[len - 1 - (d - rv)] = '\0'; |
+ utf8_print(cset, VAR_CHAR_SET, |
+ &d, len - 1 - (d - rv), |
+ &src, l); |
+ *d = '\0'; |
fs_give((void **) &p); /* free encoded buf */ |
- d += l; /* advance dest ptr to EOL */ |
- if (d - rv > len - 1) |
- d = rv + len - 1; |
} else { |
if (q) |
fs_give((void **) &q); |
@@ -255,22 +245,26 @@ char **charset; |
case 'B': /* 'B' encoding */ |
case 'b': |
- if ((p = |
+ if ((src = p = |
rfc822_base64((unsigned char *) txt, strlen(txt), |
&l))) { |
- strncpy((char *) d, (char *) p, len - 1 - (d - rv)); |
- d[len - 1 - (d - rv)] = '\0'; |
+ utf8_print(cset, VAR_CHAR_SET, |
+ &d, len - 1 - (d - rv), |
+ &src, l); |
+ *d = '\0'; |
fs_give((void **) &p); /* free encoded buf */ |
- d += l; /* advance dest ptr to EOL */ |
- if (d - rv > len - 1) |
- d = rv + len - 1; |
} else |
goto bogus; |
break; |
+ bogus: |
default: |
- sstrncpy((char **) &d, txt, len - 1 - (d - rv)); |
+ src = txt; |
+ utf8_print(VAR_CHAR_SET, NULL, |
+ &d, len - 1 - (d - rv), |
+ (unsigned char **)&src, ew - txt); |
+ *d = '\0'; |
break; |
} |
@@ -283,6 +277,7 @@ char **charset; |
if (lang) |
lang[-1] = '*'; |
+ |
} else { |
/* |
@@ -291,28 +286,38 @@ char **charset; |
/* if already copying to destn, copy it */ |
if (rv) { |
- strncpy((char *) d, s, |
- (int) min((l = (sw - s) + RFC1522_INIT_L), |
- len - 1 - (d - rv))); |
- d += l; /* advance d, tie off text */ |
- if (d - rv > len - 1) |
- d = rv + len - 1; |
+ utf8_print(VAR_CHAR_SET, NULL, |
+ &d, len - 1 - (d - rv), |
+ (unsigned char**)&s, sw - s); |
*d = '\0'; |
- s += l; /* advance s beyond intro */ |
} else |
s += ((sw - s) + RFC1522_INIT_L); |
} |
} |
- if (rv && *s) /* copy remaining text */ |
- strncat((char *) rv, s, len - 1 - strlen((char *) rv)); |
+ if (rv && *s) { /* copy remaining text */ |
+ utf8_print(VAR_CHAR_SET, NULL, |
+ &d, len - 1 - (d - rv), |
+ (unsigned char**)&s, strlen(s)); |
+ *d = '\0'; |
+ } |
/* BUG: MUST do code page mapping under DOS after decoding */ |
- return (rv ? rv : (unsigned char *) start); |
+ if (rv) return rv; |
+ |
+ for (s = start; *s; s++) { |
+ if (*s & 0x80) { |
+ rv = d; |
+ utf8_print(VAR_CHAR_SET, NULL, |
+ &d, len - 1, |
+ (unsigned char**)&start, strlen(s)); |
+ *d = '\0'; |
+ return rv; |
- bogus: |
- return ((unsigned char *) start); |
+ } |
+ } |
+ return (unsigned char *) start; |
} |
@@ -364,7 +369,7 @@ int c; |
int rfc1522_valenc(c) |
int c; |
{ |
- return (!(c == '?' || c == SPACE) && isprint((unsigned char) c)); |
+ return (!(c == '?' /*|| c == SPACE*/) && isprint((unsigned char) c)); |
} |
@@ -386,7 +391,7 @@ char **endp; |
&e) |
&& rfc1522_token(++e, rfc1522_valtok, RFC1522_DLIM, &t) |
&& rfc1522_token(++t, rfc1522_valenc, RFC1522_TERM, &p) |
- && p - s <= RFC1522_MAXW; |
+ /* && p - s <= RFC1522_MAXW */; |
if (charset) |
*charset = c; |
Index: prayer-1.0.18/prayer/utf8.c |
=================================================================== |
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
+++ prayer-1.0.18/prayer/utf8.c 2007-03-10 19:39:31.974258848 +0100 |
@@ -0,0 +1,418 @@ |
+/* Copyright (c) Magnus Holmgren <magnus@kibibyte.se>, |
+ * <holmgren@lysator.liu.se> |
+ * |
+ * This file 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. |
+ */ |
+ |
+#include "prayer_session.h" |
+#include <iconv.h> |
+ |
+#define JNK 0177 |
+#define UNI_REPLACEMENT_CHAR 0x0000FFFD |
+#define UNI_REPLACEMENT_CHAR_UTF8 "\xEF\xBF\xBD" |
+#define ICONV_CHUNK_SIZE 1024 |
+ |
+/* utf8_from_imaputf7() *********************************************** |
+ * |
+ * Convert a string encoded as modified UTF-7 to UTF-8. |
+ * pool: Target pool for storage |
+ * t: The string to convert |
+ * |
+ * Returns: A new, UTF-8-encoded string |
+ * |
+ * Note: This function tries hard to return something useful in case |
+ * the input string is invalid in some way, rather than bail out |
+ * and return NULL. |
+ **********************************************************************/ |
+ |
+char *utf8_from_imaputf7(struct pool *pool, char *t) |
+{ |
+ struct buffer *b = buffer_create(pool, 64); |
+ BOOL base64mode = NIL; |
+ int i, j; |
+ unsigned char buf[4]; |
+ unsigned char *s; |
+ unsigned long scalar; /* Unicode scalar value */ |
+ unsigned char c; |
+ |
+ static char decode_base64[256] = { |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,076,077,JNK,JNK,JNK, |
+ 064,065,066,067,070,071,072,073,074,075,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,000,001,002,003,004,005,006,007,010,011,012,013,014,015,016, |
+ 017,020,021,022,023,024,025,026,027,030,031,JNK,JNK,JNK,JNK,JNK, |
+ JNK,032,033,034,035,036,037,040,041,042,043,044,045,046,047,050, |
+ 051,052,053,054,055,056,057,060,061,062,063,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK, |
+ JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK,JNK |
+ }; |
+ |
+ if (!t) return NULL; |
+ |
+ for (s = (unsigned char*)t; *s; s++) { |
+ if (base64mode) { |
+ if (*s == '-') { |
+ if (j != 0 || c != 0) /* Some junk left */ { |
+ bputs(b, UNI_REPLACEMENT_CHAR_UTF8); |
+ } |
+ base64mode = NIL; |
+ continue; |
+ } |
+ |
+ if (decode_base64[*s] == JNK) { |
+ break; /* Bail out */ |
+ } |
+ |
+ switch (i++) { |
+ case 0: |
+ /* Top 6 bits of the first octet */ |
+ c = decode_base64[*s] << 2; break; |
+ case 1: |
+ /* Top 2 bits are bottom 2 bits of the first octet */ |
+ buf[j++] = c | (decode_base64[*s] >> 4); |
+ /* and bottom 4 bits are top 4 bits of the second */ |
+ c = decode_base64[*s] << 4; break; |
+ case 2: |
+ /* Top 4 bits are bottom 4 bits of the second octet */ |
+ buf[j++] = c | (decode_base64[*s] >> 2); |
+ /* and bottom 2 bits are top 2 bits of the third */ |
+ c = decode_base64[*s] << 6; break; |
+ case 3: |
+ /* Bottom 6 bits of the third octet */ |
+ buf[j++] = c | decode_base64[*s]; |
+ i = 0; |
+ } |
+ |
+ /* Check if we have a complete UTF-16 character */ |
+ if (j == 4) { /* We should now have a surrogate pair */ |
+ scalar = ((buf[0] & 3) << 18) + (buf[1] << 10) |
+ + ((buf[2] & 3) << 8) + buf[3] + 0x10000; |
+ } |
+ else if (j == 2) { |
+ if (buf[0] < 0xD8 || buf[0] > 0xDF) { |
+ scalar = (buf[0] << 8) + buf[1]; |
+ } |
+ else if (buf[0] > 0xDB) { |
+ /* Error - invalid surrogate */ |
+ scalar = UNI_REPLACEMENT_CHAR; |
+ } |
+ else { |
+ /* High surrogate found - need low surrogate */ |
+ continue; |
+ } |
+ } |
+ else continue; /* Odd number of bytes */ |
+ |
+ if (scalar >= 0x110000) scalar = UNI_REPLACEMENT_CHAR; |
+ |
+ if (scalar < 0x80) { |
+ bputc(b, (unsigned char)scalar); |
+ j = 0; |
+ continue; |
+ } else if (scalar < 0x800) { |
+ bputc(b, 0xC0 | (scalar >> 6)); |
+ } else if (scalar < 0x10000) { |
+ bputc(b, 0xE0 | (scalar >> 12)); |
+ } else { |
+ bputc(b, 0xF0 | (scalar >> 18)); |
+ } |
+ |
+ if (scalar >= 0x10000) |
+ bputc(b, 0x80 | ((scalar >> 12) & 0x3F)); |
+ if (scalar >= 0x800) |
+ bputc(b, 0x80 | ((scalar >> 6) & 0x3F)); |
+ bputc(b, 0x80 | (scalar & 0x3F)); |
+ j = 0; |
+ |
+ } |
+ else /* !base64mode */ { |
+ if (*s == '&') { |
+ if (*(s+1) == '-') { |
+ bputc(b, '&'); |
+ s++; |
+ } |
+ else { |
+ base64mode = T; |
+ i = 0; j = 0; c = 0; |
+ } |
+ } |
+ else { |
+ bputc(b, *s); |
+ } |
+ } |
+ } |
+ return buffer_fetch(b, 0, buffer_size(b), NIL); |
+} |
+ |
+ |
+/* utf8_to_imaputf7() ************************************************* |
+ * |
+ * Convert a string encoded as UTF-8 to modified UTF-7. |
+ * pool: Target pool for storage |
+ * t: The string to convert |
+ * |
+ * Returns: A new string encoded as modified UTF-7 |
+ * |
+ * Note: This function tries hard to return something useful in case |
+ * the input string is invalid in some way, rather than bail out |
+ * and return NULL. |
+ **********************************************************************/ |
+ |
+char *utf8_to_imaputf7(struct pool *pool, char *t) |
+{ |
+ unsigned char *s; |
+ struct buffer *b = buffer_create(pool, 64); |
+ BOOL base64mode = NIL; |
+ unsigned long scalar; |
+ unsigned int L, i, j; |
+ unsigned char buf[4]; |
+ unsigned char c = 0; |
+ |
+ static char encode_base64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; |
+ if (!t) return NULL; |
+ |
+ for (s = (unsigned char *)t; *s; s++) { |
+ if (*s < 0x7f && *s >= 0x20) { |
+ if (base64mode) { |
+ switch (i) { |
+ case 1: |
+ /* Remaining bottom 2 bits of the last octet */ |
+ bputc(b, encode_base64[c << 4]); break; |
+ case 2: |
+ /* Remaining bottom 4 bits of the last octet */ |
+ bputc(b, encode_base64[c << 2]); |
+ } |
+ bputc(b, '-'); |
+ base64mode = NIL; |
+ } |
+ bputc(b, *s); |
+ if (*s == '&') { |
+ bputc(b, '-'); |
+ } |
+ } |
+ else { |
+ if (*s < 0x80) { |
+ L = 0; scalar = *s; |
+ } else if ((*s & 0xE0) == 0xC0) { |
+ L = 1; scalar = (*s & 0x1F); |
+ } else if ((*s & 0xF0) == 0xE0) { |
+ L = 2; scalar = (*s & 0x0F); |
+ } else if ((*s & 0xF8) == 0xF0) { |
+ L = 3; scalar = (*s & 0x07); |
+ } else if ((*s & 0xFC) == 0xF8) { |
+ L = 4; scalar = (*s & 0x03); |
+ } else if ((*s & 0xFE) == 0xFC) { |
+ L = 5; scalar = (*s & 0x01); |
+ } else { |
+ L = 0; scalar = UNI_REPLACEMENT_CHAR; |
+ } |
+ |
+ for (j = 0; j < L; j++) { |
+ s++; |
+ if ((*s & 0xC0) == 0x80) { |
+ scalar <<= 6; |
+ scalar |= (*s & 0x3F); |
+ } |
+ else { |
+ s--; |
+ scalar = UNI_REPLACEMENT_CHAR; |
+ } |
+ } |
+ |
+ if (!base64mode) { |
+ bputc(b, '&'); |
+ base64mode = T; |
+ i = 0; |
+ } |
+ if (scalar <= 0xFFFF) { |
+ buf[1] = scalar & 0xFF; |
+ scalar >>= 8; |
+ buf[0] = scalar & 0xFF; |
+ L = 2; |
+ } |
+ else { |
+ scalar -= 0x100000UL; |
+ buf[3] = scalar & 0xFF; |
+ scalar >>= 8; |
+ buf[2] = 0xDC | (scalar & 0x03); |
+ scalar >>= 2; |
+ buf[3] = scalar & 0xFF; |
+ scalar >>= 8; |
+ buf[1] = 0xD8 | (scalar & 0x03); |
+ L = 4; |
+ } |
+ |
+ for (j = 0; j < L; j++) { |
+ switch (i++) { |
+ case 0: |
+ /* Top 6 bits of the first octet */ |
+ bputc(b, encode_base64[(buf[j] >> 2) & 0x3F]); |
+ c = (buf[j] & 0x03); break; |
+ case 1: |
+ /* Bottom 2 bits of the first octet, and top 4 bits of the second */ |
+ bputc(b, encode_base64[(c << 4) | |
+ ((buf[j] >> 4) & 0x0F)]); |
+ c = (buf[j] & 0x0F); break; |
+ case 2: |
+ /* Bottom 4 bits of the second octet and top 2 bits of the third */ |
+ bputc(b, encode_base64[(c << 2) | |
+ ((buf[j] >> 6) & 0x03)]); |
+ /* Bottom 6 bits of the third octet */ |
+ bputc(b, encode_base64[buf[j] & 0x3F]); |
+ i = 0; |
+ } |
+ } |
+ |
+ } |
+ } |
+ if (base64mode) { |
+ switch (i) { |
+ case 1: |
+ /* Remaining bottom 2 bits of the last octet */ |
+ bputc(b, encode_base64[c << 4]); break; |
+ case 2: |
+ /* Remaining bottom 4 bits of the last octet */ |
+ bputc(b, encode_base64[c << 2]); |
+ } |
+ bputc(b, '-'); |
+ base64mode = NIL; |
+ } |
+ return buffer_fetch(b, 0, buffer_size(b), NIL); |
+} |
+ |
+ |
+/* utf8_from_string() ************************************************ |
+ * |
+ * Convert a string with given character encoding to UTF-8 |
+ * |
+ * pool: Pool to allocate memory from |
+ * charset: Charset of input string |
+ * t: String to convert |
+ * len: Length of string |
+ ***********************************************************************/ |
+ |
+char *utf8_from_string(struct pool *pool, char *charset, char *t, unsigned long len) |
+{ |
+ struct buffer *b; |
+ char chunk[ICONV_CHUNK_SIZE]; |
+ char *outbuf; |
+ size_t outbytesleft; |
+ size_t result; |
+ int i; |
+ iconv_t cd = iconv_open("UTF-8", charset); |
+ b = buffer_create(pool, 1024); |
+ |
+ if (cd == (iconv_t)(-1)) { |
+ buffer_printf(b, "(Conversion from %s failed)", charset); |
+ } |
+ else while (len) { |
+ outbuf = chunk; |
+ outbytesleft = ICONV_CHUNK_SIZE; |
+ result = iconv(cd, &t, (size_t*)&len, &outbuf, &outbytesleft); |
+ for (i = 0; i < ICONV_CHUNK_SIZE - outbytesleft; i++) { |
+ bputc(b, chunk[i]); |
+ } |
+ if (result == (size_t)(-1)) switch (errno) { |
+ case E2BIG: |
+ break; |
+ case EILSEQ: |
+ case EINVAL: |
+ /* Try skipping a byte */ |
+ t++; |
+ len--; |
+ bputs(b, UNI_REPLACEMENT_CHAR_UTF8); |
+ break; |
+ default: |
+ iconv_close(cd); |
+ return NULL; |
+ } |
+ } |
+ |
+ iconv_close(cd); |
+ return buffer_fetch(b, 0, buffer_size(b), NIL); |
+} |
+ |
+BOOL utf8_print(char *charset, char *fallback_charset, |
+ unsigned char **dst, unsigned long dst_size, |
+ unsigned char **src, unsigned long src_size) |
+{ |
+ |
+ iconv_t cd = iconv_open("UTF-8", charset); |
+ if (cd == (iconv_t)(-1) && fallback_charset) |
+ cd = iconv_open("UTF-8", fallback_charset); |
+ |
+ while (iconv(cd, (char**)src, (size_t*)&src_size, |
+ (char**)dst, (size_t*)&dst_size) == (size_t)(-1)) { |
+ switch (errno) { |
+ case EILSEQ: |
+ case EINVAL: |
+ /* Try skipping a byte */ |
+ (*src)++; |
+ src_size--; |
+ if (dst_size >= sizeof(UNI_REPLACEMENT_CHAR_UTF8)) { |
+ strcpy((char*)*dst, UNI_REPLACEMENT_CHAR_UTF8); |
+ } |
+ if (errno == EILSEQ) break; |
+ case E2BIG: |
+ default: |
+ iconv_close(cd); |
+ return NIL; |
+ } |
+ } |
+ iconv_close(cd); |
+ return T; |
+} |
+ |
+/* utf8_prune() ******************************************************** |
+ * |
+ * Like string_prune, but counts UTF-8 multibyte sequences as units. |
+ * pool: Target pool |
+ * s: UTF-8 string to prune |
+ * maxlen: Maximum length of string before pruning applies. |
+ * |
+ * Returns: Pruned string, maximum maxlen characters (not bytes), not |
+ * counting the terminating null. |
+ ***********************************************************************/ |
+ |
+char *utf8_prune(struct pool *pool, char *s, unsigned long maxlen) |
+{ |
+ char *result; |
+ unsigned long cutoff; |
+ unsigned long L; |
+ unsigned long i = 0; |
+ |
+ if (maxlen < (strlen("...") + 1)) |
+ return (s); |
+ |
+ for (L = 0; L < maxlen; L++) { |
+ if (s[i] == '\0') return s; |
+ if (L == maxlen - strlen("...")) cutoff = i; |
+ |
+ if (s[i] & 0x80) |
+ while (s[i] & 0x80) i++; |
+ else |
+ i++; |
+ } |
+ |
+ result = pool_alloc(pool, cutoff + 4); |
+ memcpy(result, s, cutoff); |
+ strcpy(result + cutoff, "..."); |
+ |
+ return (result); |
+ |
+} |
Index: prayer-1.0.18/prayer/utf8.h |
=================================================================== |
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
+++ prayer-1.0.18/prayer/utf8.h 2007-03-10 19:39:32.004262711 +0100 |
@@ -0,0 +1,7 @@ |
+char *utf8_from_imaputf7(struct pool *pool, char *t); |
+char *utf8_to_imaputf7(struct pool *pool, char *t); |
+char *utf8_from_string(struct pool *pool, char *charset, char *t, unsigned long len); |
+BOOL utf8_print(char *charset, char *fallback_charset, |
+ unsigned char **dst, unsigned long dst_size, |
+ unsigned char **src, unsigned long src_size); |
+char *utf8_prune(struct pool *pool, char *s, unsigned long maxlen); |
/trunk/debian/patches/sighandling.patch |
---|
0,0 → 1,75 |
Index: prayer-1.0.18/prayer/os.h |
=================================================================== |
--- prayer-1.0.18.orig/prayer/os.h 2007-03-10 19:56:40.357114747 +0100 |
+++ prayer-1.0.18/prayer/os.h 2007-03-10 19:57:56.266959171 +0100 |
@@ -44,6 +44,8 @@ BOOL os_signal_alarm_clear(void); |
BOOL os_signal_init(); |
+BOOL os_signal_hup_term_init(void (*hup_fn) (), void (*term_fn) ()); |
+ |
BOOL os_lock_exclusive(int fd); |
BOOL os_lock_shared(int fd); |
Index: prayer-1.0.18/prayer/session_server.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/session_server.c 2007-03-10 19:56:40.647152355 +0100 |
+++ prayer-1.0.18/prayer/session_server.c 2007-03-10 19:57:56.326966954 +0100 |
@@ -355,6 +355,7 @@ BOOL session_server(struct config *confi |
fd_set readfds; |
pid_t child; |
unsigned long timeout = 0L; |
+ BOOL sighup_seen = NIL; |
if (config->direct_enable) { |
ssl_portlist |
@@ -420,6 +421,18 @@ BOOL session_server(struct config *confi |
} else { |
rc = select(maxfd + 1, &readfds, NIL, NIL, NIL); |
} |
+ if (sighup_seen) { |
+ log_misc("SIGHUP received - reexec daemon"); |
+ close(sockfd); |
+ if (config->direct_enable) { |
+ /* Find some way to pass this information along |
+ to the new invocation somehow later. */ |
+ portlist_close_all(ssl_portlist); |
+ portlist_close_all(plain_portlist); |
+ } |
+ log_misc_free(); |
+ return (T); |
+ } |
} |
while ((rc < 0) && (errno == EINTR)); |
Index: prayer-1.0.18/prayer/log.c |
=================================================================== |
--- prayer-1.0.18.orig/prayer/log.c 2007-03-10 19:58:03.667919109 +0100 |
+++ prayer-1.0.18/prayer/log.c 2007-03-10 19:58:11.688959503 +0100 |
@@ -502,6 +502,13 @@ BOOL log_misc_init(struct config *config |
return (log_open(log_misc_ptr, log_name)); |
} |
+void log_misc_free() |
+{ |
+ if ((log_misc_ptr == NIL) || (log_misc_ptr->fd < 0)) |
+ return; |
+ log_free(log_misc_ptr); |
+} |
+ |
/* log_misc_ping() ******************************************************* |
* |
* Reopen misc log file if required |
Index: prayer-1.0.18/prayer/log.h |
=================================================================== |
--- prayer-1.0.18.orig/prayer/log.h 2007-03-10 19:58:04.067970999 +0100 |
+++ prayer-1.0.18/prayer/log.h 2007-03-10 19:58:11.648954314 +0100 |
@@ -45,6 +45,8 @@ void log_record_peer_pid(struct log *log |
BOOL |
log_misc_init(struct config *config, char *progname, char *misc_log_name); |
+void log_misc_free(); |
+ |
BOOL log_misc_ping(); |
void log_misc(char *fmt, ...); |
/trunk/debian/patches/makefile_install_config.patch |
---|
0,0 → 1,260 |
--- prayer-1.0.18.orig/files/etc/prayer-accountd.cf |
+++ prayer-1.0.18/files/etc/prayer-accountd.cf |
@@ -8,6 +8,8 @@ |
# Default accountd.cf file suitable for RedHat Linux only. |
# See distribution for some sample files for FreeBSD and Solaris |
+accountd_port = 145 |
+ |
msforward_name = ".MSforward" |
forward_name = ".forward" |
aliases_name = "vacation.aliases" |
--- prayer-1.0.18.orig/files/Makefile |
+++ prayer-1.0.18/files/Makefile |
@@ -53,41 +53,44 @@ |
install-cert: |
if [ -f certs/prayer.pem ]; then \ |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) \ |
- -m $(PRIVATE_FILE) certs/prayer.pem ${BROOT}${PREFIX}/certs; \ |
+ -m $(PRIVATE_FILE) certs/prayer.pem ${DESTDIR}${PREFIX}/certs; \ |
fi |
install-config: etc/prayer.cf |
$(INSTALL) -D -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_FILE) \ |
- etc/prayer.cf ${BROOT}${PRAYER_CONFIG_FILE} |
+ etc/prayer.cf ${DESTDIR}${PRAYER_CONFIG_FILE} |
install-aconfig: |
$(INSTALL) -D -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_FILE) \ |
- etc/prayer-accountd.cf ${BROOT}${ACCOUNTD_CONFIG_FILE} |
+ etc/prayer-accountd.cf ${DESTDIR}${ACCOUNTD_CONFIG_FILE} |
install-motd: |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_FILE) \ |
- etc/motd.html ${BROOT}${PREFIX}/etc |
+ etc/motd.html ${DESTDIR}/etc/prayer |
install-welcome: |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_FILE) \ |
- etc/welcome.html ${BROOT}${PREFIX}/etc |
+ etc/welcome.html ${DESTDIR}/etc/prayer |
install: |
- PREFIX=$(BROOT)$(PREFIX) VAR_PREFIX=$(BROOT)$(VAR_PREFIX) \ |
+ ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PUBLIC_DIR} ${DESTDIR}${PREFIX} |
+ ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PUBLIC_DIR} ${DESTDIR}/etc/prayer |
+ |
+ PREFIX=$(DESTDIR)$(PREFIX) VAR_PREFIX=$(DESTDIR)$(VAR_PREFIX) \ |
RO_USER=$(RO_USER) RO_GROUP=$(RO_GROUP) \ |
RW_USER=$(RW_USER) RW_GROUP=$(RW_GROUP) \ |
PUBLIC_DIR=$(PUBLIC_DIR) PRIVATE_DIR=$(PRIVATE_DIR) \ |
PUBLIC_FILE=$(PUBLIC_FILE) PRIVATE_FILE=$(PRIVATE_FILE) \ |
PUBLIC_EXEC=$(PUBLIC_FILE) PRIVATE_EXEC=$(PRIVATE_EXEC) \ |
- BIN_DIR=$(BIN_DIR) INSTALL=$(INSTALL) \ |
+ BIN_DIR=$(DESTDIR)$(BIN_DIR) INSTALL=$(INSTALL) \ |
./install.sh |
- if [ ! -f $(BROOT)$(PREFIX)/certs/prayer.pem ]; then $(MAKE) install-cert; fi |
- if [ ! -f $(BROOT)$(PRAYER_CONFIG_FILE) ]; then $(MAKE) install-config; fi |
- if [ ! -f $(BROOT)$(ACCOUNTD_CONFIG_FILE) ]; then $(MAKE) install-aconfig; fi |
- if [ ! -f $(BROOT)$(PREFIX)/etc/motd.html ]; then $(MAKE) install-motd; fi |
- if [ ! -f $(BROOT)$(PREFIX)/etc/welcome.html ]; then $(MAKE) install-welcome; fi |
+# if [ ! -f $(DESTDIR)$(PREFIX)/certs/prayer.pem ]; then $(MAKE) install-cert; fi |
+ if [ ! -f $(DESTDIR)$(PRAYER_CONFIG_FILE) ]; then $(MAKE) install-config; fi |
+ if [ ! -f $(DESTDIR)$(ACCOUNTD_CONFIG_FILE) ]; then $(MAKE) install-aconfig; fi |
+ if [ ! -f $(DESTDIR)/etc/prayer/motd.html ]; then $(MAKE) install-motd; fi |
+ if [ ! -f $(DESTDIR)/etc/prayer/welcome.html ]; then $(MAKE) install-welcome; fi |
redhat-install-init.d: |
install -D -o root -g root -m 755 \ |
- ./init.d/prayer $(BROOT)/etc/rc.d/init.d/prayer |
+ ./init.d/prayer $(DESTDIR)/etc/rc.d/init.d/prayer |
#chkconfig prayer --level 2345 on |
--- prayer-1.0.18.orig/files/install.sh |
+++ prayer-1.0.18/files/install.sh |
@@ -4,77 +4,6 @@ |
PATH=/bin:/sbin/:/usr/bin:/usr/sbin |
-error=0 |
- |
-if [ "x$PREFIX" = "x" ]; then |
- echo 'PREFIX not defined' |
- error=1 |
-fi |
- |
-if [ "x$VAR_PREFIX" = "x" ]; then |
- echo 'VAR_PREFIX not defined' |
- error=1 |
-fi |
- |
-if [ "x$RO_USER" = "x" ]; then |
- echo 'RO_USER not defined' |
- error=1 |
-fi |
- |
-if [ "x$RO_GROUP" = "x" ]; then |
- echo 'RO_GROUP not defined' |
- error=1 |
-fi |
- |
-if [ "x$RW_USER" = "x" ]; then |
- echo 'RW_USER not defined' |
- error=1 |
-fi |
- |
-if [ "x$RW_GROUP" = "x" ]; then |
- echo 'RW_GROUP not defined' |
- error=1 |
-fi |
- |
-if [ "x$PUBLIC_DIR" = "x" ]; then |
- echo 'PUBLIC_DIR not defined' |
- error=1 |
-fi |
- |
-if [ "x$PRIVATE_DIR" = "x" ]; then |
- echo 'PRIVATE_DIR not defined' |
- error=1 |
-fi |
- |
-if [ "x$BIN_DIR" = "x" ]; then |
- echo 'BIN_DIR not defined' |
- error=1 |
-fi |
- |
-if [ $error != 0 ]; then |
- exit 1 |
-fi |
- |
-if [ ! -d ${VAR_PREFIX} -a `whoami` = "root" ]; then |
- ${INSTALL} -d -o ${RW_USER} -g ${RW_GROUP} -m ${PRIVATE_DIR} ${VAR_PREFIX} |
-fi |
- |
-if [ ! -d ${PREFIX} ]; then |
- ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PUBLIC_DIR} ${PREFIX} |
-fi |
- |
-if [ ! -d ${PREFIX}/etc ]; then |
- ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PUBLIC_DIR} ${PREFIX}/etc |
-fi |
- |
-if [ ! -d ${PREFIX}/certs ]; then |
- ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PRIVATE_DIR} ${PREFIX}/certs |
-fi |
- |
-if [ ! -d ${BIN_DIR} ]; then |
- ${INSTALL} -d -o ${RO_USER} -g ${RO_GROUP} -m ${PRIVATE_DIR} ${BIN_DIR} |
-fi |
- |
for i in help icons |
do |
if [ -d "${PREFIX}/${i}" ]; then |
--- prayer-1.0.18.orig/files/etc/prayer.cf.SRC |
+++ prayer-1.0.18/files/etc/prayer.cf.SRC |
@@ -20,7 +20,7 @@ |
# User ID to run as if we start off as root |
prayer_user = "prayer" |
# Group ID to run as if we start off as root |
-prayer_group = "prayer" |
+prayer_group = "nogroup" |
# Run prayer as background process. |
# TRUE => will return as soon as valid configuration is found. |
@@ -423,14 +423,14 @@ |
# Various directories used by the running system |
# Logs stored in $log_dir |
-log_dir = "$var_prefix/logs" |
+log_dir = "/var/log/prayer" |
# $lock_dir used for interlocking between prayer processes |
-lock_dir = "$var_prefix/locks" |
+lock_dir = "/var/lock" |
# $socket_dir is location for unix domain sockets which connect frontend |
# to backend in proxy mode of operation. |
-socket_dir = "$var_prefix/sockets" |
+socket_dir = "/var/run/prayer" |
# Split socket directory into 64 subdirs keyed on first letter of sessionID |
# Code provides compatibility in both directions: can switch back and forward |
@@ -441,14 +441,14 @@ |
init_socket_name = init |
# $ssl_session_dir is location for SSL session cache |
-ssl_session_dir = "$var_prefix/ssl_scache" |
+ssl_session_dir = "/var/run/prayer/ssl_scache" |
# Location for temporary files e.g; attachments and folders in transist |
# during upload and download operation. Core files also end up here |
-tmp_dir = "$var_prefix/tmp" |
+tmp_dir = "/tmp" |
# Location for PID files for prayer and prayer-session master processes. |
-pid_dir = "$var_prefix/pid" |
+pid_dir = "/var/run/prayer" |
# Interface to Hermes finger database |
#lookup_rpasswd = "/data/finger/rpasswd.cdb" |
@@ -587,7 +587,7 @@ |
suppress_dotfiles = TRUE |
# Mail directory in users account |
-maildir = "mail" |
+maildir = "" |
# Temporary hack to remove "mail/" from favourites list (and anywhere |
# else where we find the strings embedded into .prayer files). |
@@ -601,7 +601,7 @@ |
# default_domain = "<valid mail domain>" |
# Language for ispell. |
-ispell_language = "british" |
+ispell_language = "american" |
# Size of small and large compose windows |
small_cols = 80 |
--- prayer-1.0.18.orig/prayer/Makefile |
+++ prayer-1.0.18/prayer/Makefile |
@@ -102,8 +102,9 @@ |
SESSION_LIBS += $(KERB_LIBS) |
endif |
-CFLAGS = $(BASECFLAGS) $(COMMON_SSL_INCLUDE) $(CCLIENT_INCLUDE) |
-LDFLAGS = $(BASELDFLAGS) |
+CFLAGS = $(BASECFLAGS) |
+override CFLAGS += $(COMMON_SSL_INCLUDE) $(CCLIENT_INCLUDE) |
+LDFLAGS = $(BASELDFLAGS) -Wl,--as-needed |
SHARED_OBJS = \ |
pool.o list.o assoc.o memblock.o buffer.o string.o config.o user_agent.o \ |
@@ -175,21 +176,21 @@ |
install: all |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_DIR) -d \ |
- $(BROOT)$(BIN_DIR) |
+ $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer $(BROOT)$(BIN_DIR) |
+ prayer $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-chroot $(BROOT)$(BIN_DIR) |
+ prayer-chroot $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-session $(BROOT)$(BIN_DIR) |
+ prayer-session $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-ssl-prune $(BROOT)$(BIN_DIR) |
+ prayer-ssl-prune $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-sem-prune $(BROOT)$(BIN_DIR) |
+ prayer-sem-prune $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-db-prune $(BROOT)$(BIN_DIR) |
+ prayer-db-prune $(DESTDIR)$(BIN_DIR) |
$(INSTALL) -o $(RO_USER) -g $(RO_GROUP) -m $(PUBLIC_EXEC) \ |
- prayer-cyclog $(BROOT)$(BIN_DIR) |
+ prayer-cyclog $(DESTDIR)$(BIN_DIR) |
prayer: $(PRAYER_OBJS) prayer_main.o |
$(CC) $(LDFLAGS) -o prayer $(PRAYER_OBJS) prayer_main.o $(PRAYER_LIBS) |
/trunk/debian/patches/session_server_bugs.patch |
---|
0,0 → 1,12 |
--- prayer-1.0.18.orig/prayer/session_server.c |
+++ prayer-1.0.18/prayer/session_server.c |
@@ -375,7 +375,8 @@ |
if (!os_signal_child_init(os_child_reaper)) |
return (NIL); |
- name = pool_strcat(NIL, config->socket_dir, "/init"); |
+ name = pool_printf(NIL, "%s/%s", |
+ config->socket_dir, config->init_socket_name); |
if ((sockfd = os_bind_unix_socket(name)) < 0) |
return (NIL); |
/trunk/debian/patches/pidfiles_extension.patch |
---|
0,0 → 1,22 |
--- prayer-1.0.18.orig/prayer/prayer_main.c |
+++ prayer-1.0.18/prayer/prayer_main.c |
@@ -111,7 +111,7 @@ |
static BOOL prayer_main_write_pid(struct config *config) |
{ |
- char *name = pool_printf(NIL, "%s/prayer", config->pid_dir); |
+ char *name = pool_printf(NIL, "%s/prayer.pid", config->pid_dir); |
FILE *file; |
if ((file = fopen(name, "w")) == NIL) |
--- prayer-1.0.18.orig/prayer/session_main.c |
+++ prayer-1.0.18/prayer/session_main.c |
@@ -32,7 +32,7 @@ |
static BOOL session_main_write_pid(struct config *config) |
{ |
- char *name = pool_printf(NIL, "%s/prayer-session", config->pid_dir); |
+ char *name = pool_printf(NIL, "%s/prayer-session.pid", config->pid_dir); |
FILE *file; |
if ((file = fopen(name, "w")) == NIL) |
/trunk/debian/patches/series |
---|
0,0 → 1,8 |
includes.patch |
makefile_install_config.patch |
session_unix_bugs.patch |
session_server_bugs.patch |
hasnochildren_means_noinferiors.patch |
pidfiles_extension.patch |
ipv6.patch |
utf8.patch |
/trunk/debian/changelog |
---|
0,0 → 1,5 |
prayer (1.0.18-1) experimental; urgency=low |
* Initial release (Closes: #392823) |
-- Magnus Holmgren <magnus@kibibyte.se> Sat, 10 Mar 2007 14:24:21 +0100 |
/trunk/debian/prayer-session.8.dbk |
---|
0,0 → 1,158 |
<?xml version='1.0' encoding='ISO-8859-1'?> |
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" |
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [ |
<!-- |
Process this file with an XSLT processor: `xsltproc \ |
-''-nonet /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ |
manpages/docbook.xslb manpage.dbk'. A manual page |
<package>.<section> will be generated. You may view the |
manual page with: nroff -man <package>.<section> | less'. A |
typical entry in a Makefile or Makefile.am is: |
DB2MAN=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ |
manpages/docbook.xsl |
XP=xsltproc -''-nonet |
manpage.1: manpage.dbk |
$(XP) $(DB2MAN) $< |
The xsltproc binary is found in the xsltproc package. The |
XSL files are in docbook-xsl. Please remember that if you |
create the nroff version in one of the debian/rules file |
targets (such as build), you will need to include xsltproc |
and docbook-xsl in your Build-Depends control field. |
--> |
<!-- Fill in your name for FIRSTNAME and SURNAME. --> |
<!ENTITY dhfirstname "<firstname>Magnus</firstname>"> |
<!ENTITY dhsurname "<surname>Holmgren</surname>"> |
<!-- Please adjust the date whenever revising the manpage. --> |
<!ENTITY dhdate "<date>oktober 24, 2006</date>"> |
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are |
allowed: see man(7), man(1). --> |
<!ENTITY dhsection "<manvolnum>8</manvolnum>"> |
<!ENTITY dhemail "<email>magnus@kibibyte.se</email>"> |
<!ENTITY dhusername "Magnus Holmgren"> |
<!ENTITY dhucpackage "<refentrytitle>PRAYER</refentrytitle>"> |
<!ENTITY dhpackage "prayer-session"> |
<!ENTITY debian "<productname>Debian</productname>"> |
<!ENTITY gnu "<acronym>GNU</acronym>"> |
<!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> |
]> |
<refentry> |
<refentryinfo> |
<address> |
&dhemail; |
</address> |
<author> |
&dhfirstname; |
&dhsurname; |
</author> |
<copyright> |
<year>2006</year> |
<holder>&dhusername;</holder> |
</copyright> |
&dhdate; |
</refentryinfo> |
<refmeta> |
&dhucpackage; |
&dhsection; |
</refmeta> |
<refnamediv> |
<refname>&dhpackage;</refname> |
<refpurpose>a fast stand-alone webmail server</refpurpose> |
</refnamediv> |
<refsynopsisdiv> |
<cmdsynopsis> |
<command>&dhpackage;</command> |
<arg><option><replaceable>OPTION</replaceable></option></arg>...</cmdsynopsis> |
</refsynopsisdiv> |
<refsect1> |
<title>DESCRIPTION</title> |
<para>This manual page documents briefly the |
<command>&dhpackage;</command> command.</para> |
<para>This manual page was written for the &debian; distribution |
because the original program does not have a manual page.</para> |
<para><command>&dhpackage;</command> is a program that...</para> |
</refsect1> |
<refsect1> |
<title>OPTIONS</title> |
<variablelist> |
<varlistentry> |
<term> |
<option>--config-file <replaceable>filename</replaceable></option> |
</term> |
<listitem> |
<para>Define prayer config file (Overrides compilation default and PRAYER_CONFIG_FILE environment variable).</para> |
</listitem> |
</varlistentry> |
<varlistentry> |
<term> |
<option>--config-option <replaceable>option</replaceable>=<replaceable>value</replaceable></option> |
</term> |
<listitem> |
<para>Override single configuration option.</para> |
</listitem> |
</varlistentry> |
<varlistentry> |
<term> |
<option>--foreground</option> |
</term> |
<listitem> |
<para>Run single threaded server in foreground.</para> |
</listitem> |
</varlistentry> |
<varlistentry> |
<term> |
<option>--debug</option> |
</term> |
<listitem> |
<para>Enable debugging.</para> |
</listitem> |
</varlistentry> |
<varlistentry> |
<term> |
<option>--help</option> |
</term> |
<listitem> |
<para>Show option summary.</para> |
</listitem> |
</varlistentry> |
</variablelist> |
</refsect1> |
<refsect1> |
<title>SEE ALSO</title> |
<para>prayer(8), prayer.cf(5).</para> |
</refsect1> |
<refsect1> |
<title>AUTHOR</title> |
<para>This manual page was written by &dhusername; &dhemail; for |
the &debian; system (but may be used by others). Permission is |
granted to copy, distribute and/or modify this document under |
the terms of the &gnu; General Public License, Version 2 any |
later version published by the Free Software Foundation. |
</para> |
<para> |
On Debian systems, the complete text of the GNU General Public |
License can be found in /usr/share/common-licenses/GPL. |
</para> |
</refsect1> |
</refentry> |
/trunk/debian/prayer.docs |
---|
0,0 → 1,11 |
docs/CMD_LINE |
docs/DESIGN |
docs/DONE-OLD |
docs/FEATURES |
docs/ICONLIST |
docs/LOGS |
docs/NOTICE |
docs/README |
docs/SECURITY |
docs/TODO |
docs/URL_OPTIONS |
/trunk/debian/rules |
---|
0,0 → 1,24 |
#!/usr/bin/make -f |
# Sample debian/rules that uses cdbs. Originaly written by Robert Millan. |
# This file is public domain. |
DEB_AUTO_CLEANUP_RCS := yes |
# Add here any variable or target overrides you need |
makebuilddir/prayer:: |
cp debian/Config . |
include /usr/share/cdbs/1/class/makefile.mk |
include /usr/share/cdbs/1/rules/debhelper.mk |
include /usr/share/cdbs/1/rules/patchsys-quilt.mk |
#DEB_MAKE_INVOKE = $(DEB_MAKE_ENVVARS) make |
DEB_MAKE_INSTALL_TARGET = install DESTDIR=$(CURDIR)/debian/tmp |
DEB_INSTALL_CHANGELOGS_ALL = docs/DONE |
DEB_INSTALL_DOCS_ALL = -XCVS |
DEB_DH_INSTALL_ARGS = -XCVS |
DEB_DH_INSTALL_SOURCEDIR = debian/tmp |
clean:: |
rm -f Config |
Property changes: |
Added: svn:executable |
## -0,0 +1 ## |
+* |
\ No newline at end of property |
Index: trunk/debian/prayer-accountd.dirs |
=================================================================== |
--- trunk/debian/prayer-accountd.dirs (nonexistent) |
+++ trunk/debian/prayer-accountd.dirs (revision 3) |
@@ -0,0 +1 @@ |
+/var/run/prayer |
Index: trunk/debian/prayer.logrotate |
=================================================================== |
--- trunk/debian/prayer.logrotate (nonexistent) |
+++ trunk/debian/prayer.logrotate (revision 3) |
@@ -0,0 +1,8 @@ |
+/var/log/prayer/prayer /var/log/prayer/prayer_session /var/log/prayer/access_log /var/log/prayer/session_log { |
+ rotate 28 |
+ daily |
+ compress |
+ delaycompress |
+ missingok |
+ notifempty |
+} |
Index: trunk/debian/prayer.dirs |
=================================================================== |
--- trunk/debian/prayer.dirs (nonexistent) |
+++ trunk/debian/prayer.dirs (revision 3) |
@@ -0,0 +1,2 @@ |
+var/run/prayer |
+var/log/prayer |
Index: trunk/debian/prayer-accountd.init |
=================================================================== |
--- trunk/debian/prayer-accountd.init (nonexistent) |
+++ trunk/debian/prayer-accountd.init (revision 3) |
@@ -0,0 +1,71 @@ |
+#!/bin/sh |
+# |
+### BEGIN INIT INFO |
+# Provides: prayer-accountd |
+# Required-Start: |
+# Required-Stop: |
+# Should-Start: $local_fs |
+# Should-Stop: $local_fs |
+# Default-Start: 2 3 4 5 |
+# Default-Stop: 0 1 6 |
+# Short-Description: Prayer account helper daemon |
+# Description: Lets users change passwords, manage filters and other things not supported by IMAP itself |
+### END INIT INFO |
+ |
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin |
+DAEMON=/usr/sbin/prayer-accountd |
+PIDFILE=/var/run/prayer/accountd.pid |
+DESC="Prayer account helper server" |
+ |
+test -x $DAEMON || exit 0 |
+ |
+egrep -iq "^[[:space:]]*accountd_port[[:space:]]*=[[:space:]]*[[:digit:]]+[[:space:]]*$" /etc/prayer/accountd.cf || exit 0 |
+ |
+. /lib/lsb/init-functions |
+ |
+# Include prayer defaults if available |
+if [ -f /etc/default/prayer-accountd ] ; then |
+ . /etc/default/prayer-accountd |
+fi |
+ |
+set +e |
+ |
+start() { |
+ log_daemon_msg "Starting $DESC" "accountd" |
+ start-stop-daemon --start --background --make-pidfile --pidfile $PIDFILE \ |
+ --exec $DAEMON -- $DAEMON_OPTS |
+ log_end_msg $? |
+} |
+ |
+stop() { |
+ log_daemon_msg "Stopping $DESC" |
+ if [ -f "$PIDFILE" ]; then |
+ start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE |
+ log_progress_msg "accountd" |
+ fi |
+ rm -f "$PIDFILE" |
+ log_end_msg 0 |
+} |
+ |
+case "$1" in |
+ start) |
+ start |
+ ;; |
+ |
+ stop) |
+ stop |
+ ;; |
+ |
+ restart|force-reload) |
+ stop |
+ start |
+ ;; |
+ *) |
+ N=/etc/init.d/prayer-accountd |
+ # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 |
+ log_failure_msg "Usage: $N {start|stop|restart|force-reload}" >&2 |
+ exit 1 |
+ ;; |
+esac |
+ |
+exit 0 |
Index: trunk/debian/prayer.init |
=================================================================== |
--- trunk/debian/prayer.init (nonexistent) |
+++ trunk/debian/prayer.init (revision 3) |
@@ -0,0 +1,89 @@ |
+#!/bin/sh |
+# |
+### BEGIN INIT INFO |
+# Provides: prayer |
+# Required-Start: |
+# Required-Stop: |
+# Should-Start: $local_fs |
+# Should-Stop: $local_fs |
+# Default-Start: 2 3 4 5 |
+# Default-Stop: 0 1 6 |
+# Short-Description: Prayer init script |
+# Description: Init script for prayer services |
+### END INIT INFO |
+ |
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin |
+FRONTEND_DAEMON=/usr/sbin/prayer |
+SESSION_DAEMON=/usr/sbin/prayer-session |
+FRONTEND_PIDFILE=/var/run/prayer/prayer.pid |
+SESSION_PIDFILE=/var/run/prayer/prayer-session.pid |
+DESC="webmail server" |
+ |
+test -x $DAEMON || exit 0 |
+ |
+. /lib/lsb/init-functions |
+ |
+ENABLED=0 |
+ |
+# Include prayer defaults if available |
+if [ -f /etc/default/prayer ] ; then |
+ . /etc/default/prayer |
+fi |
+ |
+set +e |
+ |
+start() { |
+ if [ "$ENABLED" = "0" ]; then |
+ echo "Prayer is disabled. Please set ENABLED=1 in /etc/default/prayer" |
+ echo "after adapting /etc/prayer/prayer.cf to your needs." |
+ exit 0 |
+ fi |
+ |
+ log_daemon_msg "Starting $DESC" "prayer" |
+ start-stop-daemon --start --pidfile $FRONTEND_PIDFILE \ |
+ --exec $FRONTEND_DAEMON -- $DAEMON_OPTS |
+ log_end_msg $? |
+} |
+ |
+stop() { |
+ log_daemon_msg "Stopping $DESC" |
+ if [ -f "$SESSION_PIDFILE" ]; then |
+ start-stop-daemon --stop --quiet --oknodo --pidfile $SESSION_PIDFILE |
+ log_progress_msg "prayer-session" |
+ fi |
+ if [ -f "$FRONTEND_PIDFILE" ]; then |
+ start-stop-daemon --stop --quiet --oknodo --pidfile $FRONTEND_PIDFILE |
+ start-stop-daemon --stop --quiet --oknodo --exec $FRONTEND_DAEMON |
+ log_progress_msg "prayer" |
+ fi |
+ rm -f "$FRONTEND_PIDFILE" "$SESSION_PIDFILE" |
+ log_end_msg 0 |
+} |
+ |
+case "$1" in |
+ start) |
+ start |
+ ;; |
+ |
+ stop) |
+ stop |
+ ;; |
+ |
+ restart|force-reload) |
+ # |
+ # If the "reload" option is implemented, move the "force-reload" |
+ # option to the "reload" entry above. If not, "force-reload" is |
+ # just the same as "restart". |
+ # |
+ stop |
+ start |
+ ;; |
+ *) |
+ N=/etc/init.d/prayer |
+ # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 |
+ log_failure_msg "Usage: $N {start|stop|restart|force-reload}" >&2 |
+ exit 1 |
+ ;; |
+esac |
+ |
+exit 0 |
Index: trunk/debian/prayer-accountd.install |
=================================================================== |
--- trunk/debian/prayer-accountd.install (nonexistent) |
+++ trunk/debian/prayer-accountd.install (revision 3) |
@@ -0,0 +1,2 @@ |
+usr/sbin/prayer-accountd |
+etc/prayer/accountd.cf |
Index: trunk/debian/Config |
=================================================================== |
--- trunk/debian/Config (nonexistent) |
+++ trunk/debian/Config (revision 3) |
@@ -0,0 +1,160 @@ |
+# $Cambridge: hermes/src/prayer/defaults/Config,v 1.5 2006/04/05 12:35:35 fanf2 Exp $ |
+# |
+# Prayer - a Webmail Interface |
+# |
+# Copyright (c) University of Cambridge 2000 - 2002 |
+# See the file NOTICE for conditions of use and distribution. |
+# |
+# Conventional Configure file. |
+ |
+SSL_ENABLE = true # SSL requires OpenSSL |
+SESSION_CACHE_ENABLE = true # SSL session cache Requires Berkeley DB 3 or 4 |
+GZIP_ENABLE = true # Enable on the fly compression of pages |
+LDAP_ENABLE = true # Add LDAP interface |
+FENCE_ENABLE = false # Use Electric Fence to catch malloc problems |
+DIRECT_ENABLE = false # Experimental. Leave this switched off... |
+MUTEX_SEMAPHORE = true # Use SYSV mutexes rather than file locking |
+ |
+# Following depend on the way that you have configured c-client |
+CCLIENT_SSL_ENABLE = false # C-client was built with SSL support |
+CCLIENT_PAM_ENABLE = false # C-client was built with PAM support |
+CCLIENT_KERB_ENABLE = false # C-client was built with Kerberos support |
+ |
+# Probably don't need the following |
+ACCOUNTD_ENABLE = true # Only of use in Cambridge at the moment. |
+ACCOUNTD_SSL_ENABLE = true # Enable SSL support in account management daemon |
+ACCOUNTD_PAM_ENABLE = true # Enable PAM support in account management daemon |
+ACCOUNTD_USE_BSD_PTY = true # Use Berkeley PTYs rather than Sys V PTYs |
+ |
+############################################################################ |
+# Location of compiler |
+CC = gcc |
+# Location of make program (GNU make required) |
+MAKE = make |
+# Location of install program (GNU install or compatible required) |
+INSTALL = install |
+ |
+# Base Compiler options for GCC. |
+#BASECFLAGS = -Wall -g |
+#BASELDFLAGS = -g |
+BASECFLAGS = -Wall -g -O2 |
+BASELDFLAGS = -g -O2 |
+BASE_LIBS = -lcrypt |
+ |
+# Base Compiler options for Sun SUNWspro compiler |
+#CC = /opt/SUNWspro/bin/cc |
+#BASECFLAGS = -fast |
+#BASELDFLAGS = -s |
+#BASE_LIBS = -lcrypt -lxnet |
+ |
+############################################################################ |
+# Location of various include files and libraries. |
+############################################################################ |
+ |
+# Location of c-client library. |
+# |
+# Following works if we have a vanilla c-client installation at same level |
+# as the prayer installation. Relies on a symbolic link ./prayer/c-client |
+# which points to ../../imap/c-client. This just reduces the amount of |
+# noise output on each line when building the package. |
+# |
+CCLIENT_DIR=/usr/include/c-client |
+CCLIENT_INCLUDE=-I$(CCLIENT_DIR) |
+CCLIENT_LIBS=-lc-client |
+ |
+# |
+# Following works with the mail/cclient port from FreeBSD |
+# |
+#CCLIENT_INCLUDE = -I/usr/local/include/c-client |
+#CCLIENT_LIBS = -L/usr/local/lib -lc-client4 |
+# |
+# Complication: |
+# The FreeBSD port uses PAM and optionally SSL if built WITH_SSL=yes. |
+# |
+#CCLIENT_SSL_ENABLE = true |
+#CCLIENT_KERB_ENABLE = true |
+ |
+############################################################################ |
+ |
+# Electric fence (required if FENCE_ENABLE set) |
+FENCE_INCLUDE= |
+FENCE_LIBS=-lmcheck |
+ |
+# Zlib (required if GZIP_ENABLE set) |
+Z_INCLUDE = |
+Z_LIBS = -lz |
+ |
+# LDAP (required if LDAP_ENABLE set) |
+LDAP_INCLUDE = |
+LDAP_LIBS = -lldap |
+ |
+# Pam (required if CCLIENT_PAM_ENABLE set) |
+PAM_INCLUDE = |
+PAM_LIBS = -lpam |
+ |
+# Kerberos (required if CCLIENT_KERB_ENABLE set) |
+KERB_INCLUDE = |
+KERB_LIBS = -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err |
+ |
+# SSL definitions (required if SSL_ENABLE or CCLIENT_SSL_ENABLE set) |
+# |
+# Following suitable for Linux and FreeBSD which have SSL preinstalled |
+# (Header files from OpenSSL 0.9.7 want to include various Kerboros stuff) |
+# |
+SSL_INCLUDE= |
+SSL_LIBS=-lssl -lcrypto |
+OPENSSL=openssl |
+ |
+# Following definitions suitable for our Sun systems. |
+#SSL_BASE=/opt/local/ssl/current |
+#SSL_INCLUDE=-I ${SSL_BASE}/include |
+#SSL_LIBS=-L ${SSL_BASE}/lib -lssl -lcrypto |
+#OPENSSL=${SSL_BASE}/bin/openssl |
+ |
+# DB definitions (required if SESSION_CACHE_ENABLE set) |
+# |
+# Following suitable for Redhat Linux which has DB 3 preinstalled |
+DB_INCLUDE= |
+DB_LIBS=-ldb |
+ |
+# Following suitable for FreeBSD with DB 4 package installed |
+#DB_INCLUDE=-I/usr/local/include/db4 |
+#DB_LIBS=-L/usr/local/lib -ldb4 |
+ |
+############################################################################ |
+ |
+# Install location of prayer configuration and support files. The initial |
+# config file runs prayer processes as user "prayer" and group "prayer". |
+# If you are using SSL, the certificate file must be readable by RW_USER or |
+# RW_GROUP. It is important that nothing else can read the certificate file. |
+ |
+# Build root (used by Redhat RPM system) |
+BROOT=$(CURDIR)/../debian/tmp |
+ |
+# Directory, User and group for read-write files: log files, sockets etc |
+VAR_PREFIX = /var/lib/prayer |
+RW_USER = root |
+RW_GROUP = root |
+ |
+# Root Directory, User and group for read-only configuration files. |
+# Default configuration and permissions does not allow prayer user to |
+# update prayer configuration file. |
+ |
+PREFIX = /usr/share/prayer |
+RO_USER = root |
+RO_GROUP = root |
+ |
+# Access permissions for general objects (wrt above users and groups) |
+PUBLIC_EXEC = 0755 |
+PUBLIC_DIR = 0755 |
+PUBLIC_FILE = 0644 |
+ |
+# Access permissions for private objects (wrt above users and groups) |
+PRIVATE_EXEC = 0750 |
+PRIVATE_DIR = 0750 |
+PRIVATE_FILE = 0640 |
+ |
+# Location of configuration files and binaries |
+PRAYER_CONFIG_FILE = /etc/prayer/prayer.cf |
+BIN_DIR = /usr/sbin |
+ACCOUNTD_CONFIG_FILE = /etc/prayer/accountd.cf |
Index: trunk/debian/watch |
=================================================================== |
--- trunk/debian/watch (nonexistent) |
+++ trunk/debian/watch (revision 3) |
@@ -0,0 +1,9 @@ |
+# Example watch control file for uscan |
+# Rename this file to "watch" and then you can run the "uscan" command |
+# to check for upstream updates and more. |
+# See uscan(1) for format |
+ |
+# Compulsory line, this is a version 3 file |
+version=3 |
+ |
+ftp://ftp.csx.cam.ac.uk/pub/software/email/prayer/prayer-(.*)\.tar\.gz debian uupdate |
Index: trunk/debian/prayer.8.dbk |
=================================================================== |
--- trunk/debian/prayer.8.dbk (nonexistent) |
+++ trunk/debian/prayer.8.dbk (revision 3) |
@@ -0,0 +1,178 @@ |
+<?xml version='1.0' encoding='ISO-8859-1'?> |
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" |
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [ |
+ |
+<!-- |
+ |
+Process this file with an XSLT processor: `xsltproc \ |
+-''-nonet /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ |
+manpages/docbook.xslb manpage.dbk'. A manual page |
+<package>.<section> will be generated. You may view the |
+manual page with: nroff -man <package>.<section> | less'. A |
+typical entry in a Makefile or Makefile.am is: |
+ |
+DB2MAN=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ |
+manpages/docbook.xsl |
+XP=xsltproc -''-nonet |
+ |
+manpage.1: manpage.dbk |
+ $(XP) $(DB2MAN) $< |
+ |
+The xsltproc binary is found in the xsltproc package. The |
+XSL files are in docbook-xsl. Please remember that if you |
+create the nroff version in one of the debian/rules file |
+targets (such as build), you will need to include xsltproc |
+and docbook-xsl in your Build-Depends control field. |
+ |
+--> |
+ |
+ <!-- Fill in your name for FIRSTNAME and SURNAME. --> |
+ <!ENTITY dhfirstname "<firstname>Magnus</firstname>"> |
+ <!ENTITY dhsurname "<surname>Holmgren</surname>"> |
+ <!-- Please adjust the date whenever revising the manpage. --> |
+ <!ENTITY dhdate "<date>oktober 24, 2006</date>"> |
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are |
+ allowed: see man(7), man(1). --> |
+ <!ENTITY dhsection "<manvolnum>8</manvolnum>"> |
+ <!ENTITY dhemail "<email>magnus@kibibyte.se</email>"> |
+ <!ENTITY dhusername "Magnus Holmgren"> |
+ <!ENTITY dhucpackage "<refentrytitle>PRAYER</refentrytitle>"> |
+ <!ENTITY dhpackage "prayer"> |
+ |
+ <!ENTITY debian "<productname>Debian</productname>"> |
+ <!ENTITY gnu "<acronym>GNU</acronym>"> |
+ <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> |
+]> |
+ |
+<refentry> |
+ <refentryinfo> |
+ <address> |
+ &dhemail; |
+ </address> |
+ <author> |
+ &dhfirstname; |
+ &dhsurname; |
+ </author> |
+ <copyright> |
+ <year>2006</year> |
+ <holder>&dhusername;</holder> |
+ </copyright> |
+ &dhdate; |
+ </refentryinfo> |
+ <refmeta> |
+ &dhucpackage; |
+ |
+ &dhsection; |
+ </refmeta> |
+ <refnamediv> |
+ <refname>&dhpackage;</refname> |
+ |
+ <refpurpose>a fast stand-alone webmail server</refpurpose> |
+ </refnamediv> |
+ <refsynopsisdiv> |
+ <cmdsynopsis> |
+ <command>&dhpackage;</command> |
+ |
+ <arg><option><replaceable>OPTION</replaceable></option></arg>... -- <arg><option><replaceable>PRAYER-SESSION-OPTION</replaceable></option></arg> ... |
+ </cmdsynopsis> |
+ </refsynopsisdiv> |
+ <refsect1> |
+ <title>DESCRIPTION</title> |
+ |
+ <para>This manual page documents briefly the |
+ <command>&dhpackage;</command> and <command>bar</command> |
+ commands.</para> |
+ |
+ <para>This manual page was written for the &debian; distribution |
+ because the original program does not have a manual page. |
+ Instead, it has documentation in the &gnu; |
+ <application>Info</application> format; see below.</para> |
+ |
+ <para><command>&dhpackage;</command> is a program that...</para> |
+ |
+ </refsect1> |
+ <refsect1> |
+ <title>OPTIONS</title> |
+ |
+ <variablelist> |
+ <varlistentry> |
+ <term> |
+ <option>--config-file <replaceable>filename</replaceable></option> |
+ </term> |
+ <listitem> |
+ <para>Define prayer config file (Overrides compilation default and PRAYER_CONFIG_FILE environment variable).</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--config-option <replaceable>option</replaceable>=<replaceable>value</replaceable></option> |
+ </term> |
+ <listitem> |
+ <para>Override single configuration option.</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--foreground</option> |
+ </term> |
+ <listitem> |
+ <para>Run single threaded server in foreground.</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--disable-prefork</option> |
+ </term> |
+ <listitem> |
+ <para>Run as simple fork()/exec() daemon.</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--disable-session</option> |
+ </term> |
+ <listitem> |
+ <para>Don't start up prayer-session server.</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--</option> |
+ </term> |
+ <listitem> |
+ <para>End of prayer options: remaining options will be passed to prayer-session server process.</para> |
+ </listitem> |
+ </varlistentry> |
+ <varlistentry> |
+ <term> |
+ <option>--help</option> |
+ </term> |
+ <listitem> |
+ <para>Show option summary.</para> |
+ </listitem> |
+ </varlistentry> |
+ </variablelist> |
+ </refsect1> |
+ <refsect1> |
+ <title>SEE ALSO</title> |
+ |
+ <para>prayer-session(8), prayer.cf(5).</para> |
+ |
+ </refsect1> |
+ <refsect1> |
+ <title>AUTHOR</title> |
+ |
+ <para>This manual page was written by &dhusername; &dhemail; for |
+ the &debian; system (but may be used by others). Permission is |
+ granted to copy, distribute and/or modify this document under |
+ the terms of the &gnu; General Public License, Version 2 any |
+ later version published by the Free Software Foundation. |
+ </para> |
+ <para> |
+ On Debian systems, the complete text of the GNU General Public |
+ License can be found in /usr/share/common-licenses/GPL. |
+ </para> |
+ |
+ </refsect1> |
+</refentry> |
+ |
Index: trunk/debian/prayer.install |
=================================================================== |
--- trunk/debian/prayer.install (nonexistent) |
+++ trunk/debian/prayer.install (revision 3) |
@@ -0,0 +1,10 @@ |
+usr/sbin/prayer |
+usr/sbin/prayer-session |
+usr/sbin/prayer-chroot |
+usr/sbin/prayer-db-prune |
+usr/sbin/prayer-sem-prune |
+usr/sbin/prayer-ssl-prune |
+usr/share/prayer |
+etc/prayer/prayer.cf |
+etc/prayer/motd.html |
+etc/prayer/welcome.html |
Index: trunk/debian/copyright |
=================================================================== |
--- trunk/debian/copyright (nonexistent) |
+++ trunk/debian/copyright (revision 3) |
@@ -0,0 +1,83 @@ |
+This package was debianized by Magnus Holmgren <magnus@kibibyte.se> on |
+Tue, 24 Oct 2006 21:08:34 +0200. |
+ |
+It was downloaded from http://www-uxsup.csx.cam.ac.uk/~dpc22/prayer/ |
+ |
+Upstream author/maintainer: David Carter <dpc22@cam.ac.uk> et al. |
+ |
+The Debian packaging is (C) 2006, Magnus Holmgren <magnus@kibibyte.se> |
+and is licensed under the GPL. |
+ |
+The original licence is as follows (from the file NOTICE in the upstream |
+distribution); the GPL should be in /usr/share/common-licenses/GPL on a debian |
+system. |
+ |
+ |
+The Prayer Webmail Interface |
+---------------------------- |
+ |
+Copyright (c) 2002 University of Cambridge |
+ |
+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. |
+ |
+In addition, for the avoidance of any doubt, permission is granted to |
+link this program with OpenSSL or any other library package. |
+ |
+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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, |
+USA |
+ |
+INCORPORATED CODE |
+----------------- |
+ |
+Code implementing the SSL session cache has been adapted from code used by |
+the Cyrus IMAP server, which is distributed under the following copyright: |
+ |
+/* Copyright (c) 2000 Carnegie Mellon University. All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions |
+ * are met: |
+ * |
+ * 1. Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * |
+ * 2. Redistributions in binary form must reproduce the above copyright |
+ * notice, this list of conditions and the following disclaimer in |
+ * the documentation and/or other materials provided with the |
+ * distribution. |
+ * |
+ * 3. The name "Carnegie Mellon University" must not be used to |
+ * endorse or promote products derived from this software without |
+ * prior written permission. For permission or any other legal |
+ * details, please contact |
+ * Office of Technology Transfer |
+ * Carnegie Mellon University |
+ * 5000 Forbes Avenue |
+ * Pittsburgh, PA 15213-3890 |
+ * (412) 268-4387, fax: (412) 268-7395 |
+ * tech-transfer@andrew.cmu.edu |
+ * |
+ * 4. Redistributions of any form whatsoever must retain the following |
+ * acknowledgment: |
+ * "This product includes software developed by Computing Services |
+ * at Carnegie Mellon University (http://www.cmu.edu/computing/)." |
+ * |
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO |
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY |
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE |
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN |
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING |
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
+ */ |
+ |
Index: trunk/debian/README.Debian |
=================================================================== |
--- trunk/debian/README.Debian (nonexistent) |
+++ trunk/debian/README.Debian (revision 3) |
@@ -0,0 +1,51 @@ |
+prayer for Debian |
+----------------- |
+ |
+The Debian version of Prayer is built with SSL support with session |
+cache using libdb4.3, gzip Content-Transfer-Encoding, LDAP, and System |
+V mutex support. Some bigger and some smaller changes have been made: |
+ |
+ * As the upstream web page explains, "Prayer was designed to work |
+ with the Washington IMAP server, which has the most problems |
+ associated with transient IMAP connections. Consequently, the user |
+ interface distinguishes between mailboxes and directories: this will |
+ not work well with servers which provide dual use mail folders." |
+ A simple patch from Jonathan McDowell at least makes leaf folders |
+ be treated as folders. |
+ |
+ * This packaging adds IPv6 support. However, prayer-session uses |
+ libc-client to connect to the IMAP server, and IPv6 support can only |
+ be achieved there by building with the version of libc-client |
+ currently in experimental. |
+ |
+ * This packaging adds international character support, including |
+ encoding and decoding of modified-UTF-7-encoded folder |
+ names. However, the folder filter still works on the UTF-7 level, |
+ meaning, for example, that a "-" will match any folder with an |
+ encoded character in it, since "-" is the shift-out character that |
+ ends every base64-encoded sequence in UTF-7. |
+ |
+ Where it was hardwired to ISO-8859-1 it has been re-wired to UTF-8, |
+ but I may have missed some spots and ISO-8859-1 is still the hardcoded |
+ fallback character set. |
+ |
+ * The decoding of RFC2047 encoded words has been relaxed, accommodating |
+ to some common encoding errors: spaces are accepted in the encoded |
+ text, as are overlong encoded words. |
+ |
+ |
+Quirks: |
+ |
+ * If your IMAP server supports STARTTLS, then Prayer (actually the |
+ libc-client IMAP client library) will use it automatically and it |
+ can't be turned off. Make sure that the server name you specify for |
+ imapd_server in prayer.cf matches the Common Name in the SSL |
+ certificate; otherwise libc-client will refuse to accept it. |
+ |
+ * If your IMAP server is Dovecot, then you must change |
+ prefs_folder_name to something not containing a dot. Unfortunately |
+ this means that the preference folder will be fully visible. |
+ |
+ -- Magnus Holmgren <magnus@kibibyte.se>, Wed, 15 Nov 2006 14:51:00 +0100 |
+ |
+Tag: interface::web, made-of::lang:c, made-of::data:html mail::imap, mail::user-agent, protocol::imap, protocol::ssl, protocol::http, role::sw:server, use::viewing, works-with::mail, web::application |
Index: trunk/debian |
=================================================================== |
--- trunk/debian (nonexistent) |
+++ trunk/debian (revision 3) |
/trunk/debian |
---|
Property changes: |
Added: mergeWithUpstream |
## -0,0 +1 ## |
+1 |
\ No newline at end of property |