CVS commit by ossi:
make config parsing more robust against bogus input and report errors
more clearly.
M +38 -28 drv_imap.c 1.17
--- isync/src/drv_imap.c #1.16:1.17
@@ -255,9 +255,7 @@ init_ssl_ctx( imap_store_t *ctx )
fprintf( stderr, "Error, CertificateFile not defined\n" );
return -1;
- } else if (access( srvc->cert_file, R_OK ))
- warn( "*** Warning: can't read CertificateFile, so can't verify
server certificates\n" );
- else if (!SSL_CTX_load_verify_locations( imap->SSLContext,
srvc->cert_file, NULL )) {
- fprintf( stderr, "Error, SSL_CTX_load_verify_locations: %s\n",
- ERR_error_string( ERR_get_error(), 0 ) );
+ } else if (!SSL_CTX_load_verify_locations( imap->SSLContext,
srvc->cert_file, NULL )) {
+ fprintf( stderr, "Error while loading certificate file '%s':
%s\n",
+ srvc->cert_file, ERR_error_string( ERR_get_error(), 0
) );
return -1;
}
@@ -1644,4 +1642,5 @@ imap_parse_store( conffile_t *cfg, store
imap_store_conf_t *store;
imap_server_conf_t *server, *srv, sserver;
+ int acc_opt = 0;
if (!strcasecmp( "IMAPAccount", cfg->cmd )) {
@@ -1656,4 +1655,5 @@ imap_parse_store( conffile_t *cfg, store
store->gen.name = nfstrdup( cfg->val );
store->use_namespace = 1;
+ *storep = &store->gen;
memset( &sserver, 0, sizeof(sserver) );
server = &sserver;
@@ -1670,15 +1670,5 @@ imap_parse_store( conffile_t *cfg, store
while (getcline( cfg ) && cfg->cmd) {
- if (!strcasecmp( "Account", cfg->cmd )) {
- for (srv = servers; srv; srv = srv->next)
- if (srv->name && !strcmp( srv->name, cfg->val ))
- goto gotsrv;
- fprintf( stderr, "%s:%d: unknown IMAP account '%s'\n",
- cfg->file, cfg->line, cfg->val );
- *err = 1;
- continue;
- gotsrv:
- store->server = srv;
- } else if (!strcasecmp( "Host", cfg->cmd )) {
+ if (!strcasecmp( "Host", cfg->cmd )) {
#if HAVE_LIBSSL
if (!memcmp( "imaps:", cfg->val, 6 )) {
@@ -1708,7 +1698,12 @@ imap_parse_store( conffile_t *cfg, store
server->port = parse_int( cfg );
#if HAVE_LIBSSL
- else if (!strcasecmp( "CertificateFile", cfg->cmd ))
+ else if (!strcasecmp( "CertificateFile", cfg->cmd )) {
server->cert_file = expand_strdup( cfg->val );
- else if (!strcasecmp( "RequireSSL", cfg->cmd ))
+ if (access( server->cert_file, R_OK )) {
+ fprintf( stderr, "%s:%d: CertificateFile '%s':
%s\n",
+ cfg->file, cfg->line,
server->cert_file, strerror( errno ) );
+ *err = 1;
+ }
+ } else if (!strcasecmp( "RequireSSL", cfg->cmd ))
server->require_ssl = parse_bool( cfg );
else if (!strcasecmp( "UseSSLv2", cfg->cmd ))
@@ -1724,5 +1719,15 @@ imap_parse_store( conffile_t *cfg, store
server->tunnel = nfstrdup( cfg->val );
else if (store) {
- if (!strcasecmp( "UseNamespace", cfg->cmd ))
+ if (!strcasecmp( "Account", cfg->cmd )) {
+ for (srv = servers; srv; srv = srv->next)
+ if (srv->name && !strcmp( srv->name,
cfg->val ))
+ goto gotsrv;
+ fprintf( stderr, "%s:%d: unknown IMAP account
'%s'\n",
+ cfg->file, cfg->line, cfg->val );
+ *err = 1;
+ continue;
+ gotsrv:
+ store->server = srv;
+ } else if (!strcasecmp( "UseNamespace", cfg->cmd ))
store->use_namespace = parse_bool( cfg );
else if (!strcasecmp( "Path", cfg->cmd ))
@@ -1730,26 +1735,31 @@ imap_parse_store( conffile_t *cfg, store
else
parse_generic_store( &store->gen, cfg, err );
+ continue;
} else {
- fprintf( stderr, "%s:%d: unknown keyword '%s'\n",
+ fprintf( stderr, "%s:%d: unknown/misplaced keyword
'%s'\n",
cfg->file, cfg->line, cfg->cmd );
*err = 1;
+ continue;
}
+ acc_opt = 1;
}
if (!store || !store->server) {
if (!server->tunnel && !server->host) {
if (store)
- fprintf( stderr, "IMAP store '%s' has
incomplete connection details\n", store->gen.name );
+ fprintf( stderr, "IMAP store '%s' has
incomplete/missing connection details\n", store->gen.name );
else
- fprintf( stderr, "IMAP account '%s' has
incomplete connection details\n", server->name );
+ fprintf( stderr, "IMAP account '%s' has
incomplete/missing connection details\n", server->name );
*err = 1;
- /* leaking server/store */
- *storep = 0;
return 1;
}
}
- *storep = &store->gen;
- if (store && !store->server) {
+ if (store) {
+ if (!store->server) {
store->server = nfmalloc( sizeof(sserver) );
memcpy( store->server, &sserver, sizeof(sserver) );
+ } else if (acc_opt) {
+ fprintf( stderr, "IMAP store '%s' has both Account and
account-specific options\n", store->gen.name );
+ *err = 1;
+ }
}
return 1;
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel