to the sslmode option.
2. Take the platforms where char is unsigned into account per report from Alex Goncharov.
}
else
{
- char multi = FALSE, proc_return = 0;
+ po_ind_t multi = FALSE, proc_return = 0;
stmt->proc_return = 0;
SC_scanQueryAndCountParams(stmt->statement, SC_get_conn(stmt), NULL, pcpar, &multi, &proc_return);
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(void *)
AC_CHECK_TYPES(long long)
+AC_CHECK_TYPES(signed char)
AC_CHECK_TYPES(ssize_t)
AC_TYPE_SIZE_T
fi
# 8. Libltdl
-AC_CHECK_LIB(ltdl, lt_dloepn)
+AC_CHECK_LIB(ltdl, lt_dlopen)
AC_CONFIG_FILES([Makefile])
{
case '\0':
break;
- case 'd':
+ case SSLLBYTE_VERIFY:
opts[cnt][0] = "sslmode";
- opts[cnt++][1] = ci->sslmode;
+ if (ssl_verify_available())
+ {
+ switch (ci->sslmode[1])
+ {
+ case 'f':
+ opts[cnt++][1] = SSLMODE_VERIFY_FULL;
+ break;
+ case 'c':
+ opts[cnt++][1] = SSLMODE_VERIFY_CA;
+ break;
+ default:
+ opts[cnt++][1] = ci->sslmode;
+ }
+ }
+ else
+ {
+ char msg[128];
+
+ snprintf(msg, sizeof(msg), "sslmode=%s can't be specified for 8.3 or older version of libpq", ci->sslmode);
+ CC_set_error(self, CONN_NOT_IMPLEMENTED_ERROR, msg, __FUNCTION__);
+ return -1;
+ }
break;
default:
opts[cnt][0] = "sslmode";
opts[cnt++][1] = ci->sslmode;
- if (sslverify_needed())
- {
- opts[cnt][0] = "sslverify";
- opts[cnt++][1] = "none";
- }
}
if (ci->password[0])
{
int cnt, i;
cnt = protocol3_opts_array(self, opts, FALSE, sizeof(opts) / sizeof(opts[0]));
+ if (cnt < 0)
+ return 0;
slen = sizeof(ProtocolVersion);
for (i = 0; i < cnt; i++)
BOOL blankExist;
cnt = protocol3_opts_array(self, opts, TRUE, sizeof(opts) / sizeof(opts[0]));
+ if (cnt < 0)
+ return NULL;
slen = sizeof(ProtocolVersion);
for (i = 0, slen = 0; i < cnt; i++)
ssl_try_count = 0;
switch (self->connInfo.sslmode[0])
{
- case 'r':
+ case SSLLBYTE_REQUIRE:
+ case SSLLBYTE_VERIFY:
ssl_call[ssl_try_count++] = 'y';
break;
- case 'p':
+ case SSLLBYTE_PREFER:
ssl_call[ssl_try_count++] = 'y';
ssl_call[ssl_try_count++] = 'n';
break;
- case 'a':
+ case SSLLBYTE_ALLOW:
ssl_call[ssl_try_count++] = 'n';
ssl_call[ssl_try_count++] = 'y';
break;
#ifndef NOT_USE_LIBPQ
if (self->connInfo.username[0] == '\0')
call_libpq = TRUE;
- else if (self->connInfo.sslmode[0] != 'd')
+ else if (self->connInfo.sslmode[0] != SSLLBYTE_DISABLE)
#ifdef USE_SSPI
{
if (0 == (SchannelService & self->svcs_allowed))
if (!(conninfo = protocol3_opts_build(self)))
{
- CC_set_error(self, CONN_OPENDB_ERROR, "Couldn't allcate conninfo", func);
+ if (CC_get_errornumber(self) <= 0)
+ CC_set_error(self, CONN_OPENDB_ERROR, "Couldn't allcate conninfo", func);
goto cleanup1;
}
pqconn = CALL_PQconnectdb(conninfo, &libpqLoaded);
char conn_settings[LARGE_REGISTRY_LEN];
char protocol[SMALL_REGISTRY_LEN];
char port[SMALL_REGISTRY_LEN];
- char sslmode[SMALL_REGISTRY_LEN];
+ char sslmode[16];
char onlyread[SMALL_REGISTRY_LEN];
char fake_oid_index[SMALL_REGISTRY_LEN];
char show_oid_column[SMALL_REGISTRY_LEN];
BOOL ret, once_descr;
ConnectionClass *conn = SC_get_conn(stmt);
QResultClass *res, *dest_res = NULL;
- char plan_name[32], multi;
+ char plan_name[32];
+ po_ind_t multi;
int func_cs_count = 0;
const char *orgquery = NULL, *srvquery = NULL;
Int4 endp1, endp2;
return (ci->extra_opts = getExtraOptions(ci));
}
+static const char *
+abbrev_sslmode(const char *sslmode, char *abbrevmode)
+{
+ switch (sslmode[0])
+ {
+ case SSLLBYTE_DISABLE:
+ case SSLLBYTE_ALLOW:
+ case SSLLBYTE_PREFER:
+ case SSLLBYTE_REQUIRE:
+ abbrevmode[0] = sslmode[0];
+ abbrevmode[1] = '\0';
+ break;
+ case SSLLBYTE_VERIFY:
+ abbrevmode[0] = sslmode[0];
+ abbrevmode[2] = '\0';
+ switch (sslmode[1])
+ {
+ case 'f':
+ case 'c':
+ abbrevmode[1] = sslmode[1];
+ break;
+ default:
+ if (strnicmp(sslmode, "verify_", 7) == 0)
+ {
+ abbrevmode[1] = sslmode[7];
+ }
+ else
+ strcpy(abbrevmode, sslmode);
+ }
+ break;
+ }
+ return abbrevmode;
+}
+
void
makeConnectString(char *connect_string, const ConnInfo *ci, UWORD len)
{
flag |= BIT_LOWERCASEIDENTIFIER;
if (ci->sslmode[0])
+ {
+ char abbrevmode[sizeof(ci->sslmode)];
+
olen = snprintf(&connect_string[hlen], nlen, ";"
- ABBR_SSLMODE "=%c", ci->sslmode[0]);
+ ABBR_SSLMODE "=%s", abbrev_sslmode(ci->sslmode, abbrevmode));
+ }
hlen = strlen(connect_string);
nlen = MAX_CONNECT_STRING - hlen;
olen = snprintf(&connect_string[hlen], nlen, ";"
{
switch (value[0])
{
- case 'a':
+ case SSLLBYTE_ALLOW:
strcpy(ci->sslmode, SSLMODE_ALLOW);
break;
- case 'p':
+ case SSLLBYTE_PREFER:
strcpy(ci->sslmode, SSLMODE_PREFER);
break;
- case 'r':
+ case SSLLBYTE_REQUIRE:
strcpy(ci->sslmode, SSLMODE_REQUIRE);
break;
- case 'd':
+ case SSLLBYTE_VERIFY:
+ switch (value[1])
+ {
+ case 'f':
+ strcpy(ci->sslmode, SSLMODE_VERIFY_FULL);
+ break;
+ case 'c':
+ strcpy(ci->sslmode, SSLMODE_VERIFY_CA);
+ break;
+ default:
+ strcpy(ci->sslmode, value);
+ }
+ break;
+ case SSLLBYTE_DISABLE:
default:
strcpy(ci->sslmode, SSLMODE_DISABLE);
break;
#define SSLMODE_ALLOW "allow"
#define SSLMODE_PREFER "prefer"
#define SSLMODE_REQUIRE "require"
+#define SSLMODE_VERIFY_CA "verify-ca"
+#define SSLMODE_VERIFY_FULL "verify-full"
+#define SSLLBYTE_DISABLE 'd'
+#define SSLLBYTE_ALLOW 'a'
+#define SSLLBYTE_PREFER 'p'
+#define SSLLBYTE_REQUIRE 'r'
+#define SSLLBYTE_VERIFY 'v'
#ifdef _HANDLE_ENLIST_IN_DTC_
#define INI_XAOPT "XaOpt"
static int driver_optionsDraw(HWND, const ConnInfo *, int src, BOOL enable);
static int driver_options_update(HWND hdlg, ConnInfo *ci, const char *);
+static struct {
+ int ids;
+ const char * const modestr;
+} modetab[] = {
+ {IDS_SSLREQUEST_DISABLE, SSLMODE_DISABLE}
+ , {IDS_SSLREQUEST_ALLOW, SSLMODE_ALLOW}
+ , {IDS_SSLREQUEST_PREFER, SSLMODE_PREFER}
+ , {IDS_SSLREQUEST_REQUIRE, SSLMODE_REQUIRE}
+ , {IDS_SSLREQUEST_VERIFY_CA, SSLMODE_VERIFY_CA}
+ , {IDS_SSLREQUEST_VERIFY_FULL, SSLMODE_VERIFY_FULL}
+ };
+static int dspcount_bylevel[] = {1, 4, 6};
+
void
SetDlgStuff(HWND hdlg, const ConnInfo *ci)
{
char buff[MEDIUM_REGISTRY_LEN + 1];
BOOL libpq_exist = FALSE;
+ int i, dsplevel, selidx, dspcount;
/*
* If driver attribute NOT present, then set the datasource name and
SetDlgItemText(hdlg, IDC_PASSWORD, ci->password);
SetDlgItemText(hdlg, IDC_PORT, ci->port);
+ dsplevel = 0;
libpq_exist = SSLLIB_check();
mylog("libpq_exist=%d\n", libpq_exist);
if (libpq_exist)
{
mylog("SendMessage CTL_COLOR\n");
SendMessage(GetDlgItem(hdlg, IDC_NOTICE_USER), WM_CTLCOLOR, 0, 0);
+ if (ssl_verify_available())
+ dsplevel = 2;
+ else
+ dsplevel = 1;
}
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_DISABLE, buff, MEDIUM_REGISTRY_LEN);
- SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
- if (libpq_exist || (ci->sslmode[0] && stricmp(ci->sslmode, "disable")))
+
+ selidx = -1;
+ for (i = 0; i < sizeof(modetab) / sizeof(modetab[0]); i++)
{
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_PREFER, buff, MEDIUM_REGISTRY_LEN);
- SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_ALLOW, buff, MEDIUM_REGISTRY_LEN);
- SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_REQUIRE, buff, MEDIUM_REGISTRY_LEN);
+ if (!stricmp(ci->sslmode, modetab[i].modestr))
+ {
+ selidx = i;
+ break;
+ }
+ }
+ for (i = dsplevel; i < sizeof(dspcount_bylevel) / sizeof(int); i++)
+ {
+ if (selidx < dspcount_bylevel[i])
+ break;
+ dsplevel++;
+ }
+
+ dspcount = dspcount_bylevel[dsplevel];
+ for (i = 0; i < dspcount; i++)
+ {
+ LoadString(GetWindowInstance(hdlg), modetab[i].ids, buff, MEDIUM_REGISTRY_LEN);
SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
}
- if (!stricmp(ci->sslmode, "allow"))
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_ALLOW, buff, MEDIUM_REGISTRY_LEN);
- else if (!stricmp(ci->sslmode, "require"))
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_REQUIRE, buff, MEDIUM_REGISTRY_LEN);
- else if (!stricmp(ci->sslmode, "prefer"))
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_PREFER, buff, MEDIUM_REGISTRY_LEN);
- else
- LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_DISABLE, buff, MEDIUM_REGISTRY_LEN);
- SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_SELECTSTRING, -1, (WPARAM) ((LPSTR) buff));
+ SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_SETCURSEL, selidx, (WPARAM) 0);
}
GetDlgItemText(hdlg, IDC_PASSWORD, ci->password, sizeof(ci->password));
GetDlgItemText(hdlg, IDC_PORT, ci->port, sizeof(ci->port));
sslposition = (int)(DWORD)SendMessage(GetDlgItem(hdlg, IDC_SSLMODE), CB_GETCURSEL, 0L, 0L);
- switch (sslposition)
- {
- case 1: strncpy_null(ci->sslmode, "prefer", sizeof(ci->sslmode));
- break;
- case 2: strncpy_null(ci->sslmode, "allow", sizeof(ci->sslmode));
- break;
- case 3: strncpy_null(ci->sslmode, "require", sizeof(ci->sslmode));
- break;
- default:strncpy_null(ci->sslmode, "disable", sizeof(ci->sslmode));
- break;
- }
+ strncpy_null(ci->sslmode, modetab[sslposition].modestr, sizeof(ci->sslmode));
}
CheckDlgButton(hdlg, DS_READONLY, atoi(ci->onlyread));
/* Protocol */
- enable = (ci->sslmode[0] == 'd' || ci->username[0] == '\0');
+ enable = (ci->sslmode[0] == SSLLBYTE_DISABLE || ci->username[0] == '\0');
EnableWindow(GetDlgItem(hdlg, DS_PG62), enable);
EnableWindow(GetDlgItem(hdlg, DS_PG63), enable);
EnableWindow(GetDlgItem(hdlg, DS_PG64), enable);
}
}
- mylog(" szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, msglen, szErrorMsg);
+ mylog(" szSqlState = '%s',len=%d, szError='%s'\n", szSqlState ? (char *) szSqlState : PRINT_NULL, msglen, szErrorMsg ? (char *) szErrorMsg : PRINT_NULL);
if (once_again)
{
CC_set_errornumber(conn, status);
}
#endif /* _MSC_DELAY_LOAD_IMPORT */
-BOOL sslverify_needed(void)
+BOOL ssl_verify_available(void)
{
if (sslverify_available < 0)
{
BOOL SSLLIB_check(void);
#ifndef NOT_USE_LIBPQ
void *CALL_PQconnectdb(const char *conninfo, BOOL *);
-BOOL sslverify_needed(void);
+BOOL ssl_verify_available(void);
#endif /* NOT_USE_LIBPQ */
#ifdef _HANDLE_ENLIST_IN_DTC_
RETCODE CALL_EnlistInDtc(ConnectionClass *conn, void * pTra, int method);
*
* Comments: See "notice.txt" for copyright and license information.
*
- * $Id: psqlodbc.h,v 1.128 2009/04/06 21:32:57 hinoue Exp $
+ * $Id: psqlodbc.h,v 1.129 2009/04/24 22:30:48 hinoue Exp $
*
*/
#ifndef HAVE_SSIZE_T
typedef long ssize_t
#endif /* HAVE_SSIZE_T */
+
#if (SIZEOF_VOID_P == SIZEOF_LONG)
typedef long LONG_PTR;
typedef unsigned long ULONG_PTR;
#ifndef SQL_IS_LEN
#define SQL_IS_LEN (-1000)
#endif /* SQL_IS_LEN */
+#ifdef HAVE_SIGNED_CHAR
+typedef signed char po_ind_t;
+#else
+typedef char po_ind_t;
+#endif /* HAVE_SIGNED_CHAR */
#ifndef WIN32
#if !defined(WITH_UNIXODBC) && !defined(WITH_IODBC)
BEGIN
IDS_SSLREQUEST_PREFER "\97D\90æ"
IDS_SSLREQUEST_ALLOW "\8dl\97¶"
- IDS_SSLREQUEST_REQUIRE "\95K\97v"
+ IDS_SSLREQUEST_REQUIRE "\95K\90{"
IDS_SSLREQUEST_DISABLE "\96³\8cø"
+ IDS_SSLREQUEST_VERIFY_CA "\95K\90{:\8fØ\96¾\8f\91\94F\8fØ"
+ IDS_SSLREQUEST_VERIFY_FULL "\95K\90{:\8fØ\96¾\8f\91\8a®\91S\94F\8fØ"
END
#endif // Japanese resources
IDS_SSLREQUEST_ALLOW "allow"
IDS_SSLREQUEST_REQUIRE "require"
IDS_SSLREQUEST_DISABLE "disable"
+ IDS_SSLREQUEST_VERIFY_CA "verify-ca"
+ IDS_SSLREQUEST_VERIFY_FULL "verify-full"
END
#endif // English (U.S.) resources
#define IDS_SSLREQUEST_REQUIRE 412
#define IDS_SSLREQUEST_DISABLE 413
#define IDC_NOTICE_USER 414
+#define IDS_SSLREQUEST_VERIFY_CA 415
+#define IDS_SSLREQUEST_VERIFY_FULL 416
#define DLG_CONFIG 1001
#define IDC_PORT 1002
#define DLG_DRIVER_CHANGE 1002
if (STMT_EXECUTING == stmt->status)
{
SC_set_error(stmt, STMT_SEQUENCE_ERROR, "Statement is currently executing a transaction.", func);
- return SQL_ERROR; /* stmt may be executing a
- * transaction */
+ return SQL_ERROR; /* stmt may be executing a transaction */
}
/*
* Free any cursors and discard any result info.
void
SC_scanQueryAndCountParams(const char *query, const ConnectionClass *conn,
Int4 *next_cmd, SQLSMALLINT * pcpar,
- char *multi_st, char *proc_return)
+ po_ind_t *multi_st, po_ind_t *proc_return)
{
CSTR func = "SC_scanQueryAndCountParams";
char literal_quote = LITERAL_QUOTE, identifier_quote = IDENTIFIER_QUOTE, dollar_quote = DOLLAR_QUOTE;
char tchar, bchar, escape_in_literal = '\0';
char in_literal = FALSE, in_identifier = FALSE,
in_dollar_quote = FALSE, in_escape = FALSE,
- del_found = FALSE, multi = FALSE;
+ del_found = FALSE;
+ po_ind_t multi = FALSE;
SQLSMALLINT num_p;
encoded_str encstr;
/* || SC_is_with_hold(self) thiw would lose the performance */
))
issue_begin = FALSE;
- if (issue_begin)
+ else
{
switch (self->statement_type)
{
Int2 current_exec_param; /* The current parameter for
* SQLPutData */
PutDataInfo pdata_info;
- char parse_status;
- char proc_return;
- char put_data; /* Has SQLPutData been called ? */
- char catalog_result; /* Is this a result of catalog function ? */
- char prepare; /* is this a prepared statement ? */
- char prepared; /* is this statement already
+ po_ind_t parse_status;
+ po_ind_t proc_return;
+ po_ind_t put_data; /* Has SQLPutData been called ? */
+ po_ind_t catalog_result; /* Is this a result of catalog function ? */
+ po_ind_t prepare; /* is this a prepared statement ? */
+ po_ind_t prepared; /* is this statement already
* prepared at the server ? */
- char internal; /* Is this statement being called
+ po_ind_t internal; /* Is this statement being called
* internally ? */
- char transition_status; /* Transition status */
- char multi_statement; /* -1:unknown 0:single 1:multi */
- char rbonerr; /* rollback on error */
- char discard_output_params; /* discard output parameters on parse stage */
- char cancel_info; /* cancel information */
- char ref_CC_error; /* refer to CC_error ? */
- char lock_CC_for_rb; /* lock CC for statement rollback ? */
- char join_info; /* have joins ? */
- char parse_method; /* parse_statement is forced or ? */
- char curr_param_result; /* current param result is set ? */
+ po_ind_t transition_status; /* Transition status */
+ po_ind_t multi_statement; /* -1:unknown 0:single 1:multi */
+ po_ind_t rbonerr; /* rollback on error */
+ po_ind_t discard_output_params; /* discard output parameters on parse stage */
+ po_ind_t cancel_info; /* cancel information */
+ po_ind_t ref_CC_error; /* refer to CC_error ? */
+ po_ind_t lock_CC_for_rb; /* lock CC for statement rollback ? */
+ po_ind_t join_info; /* have joins ? */
+ po_ind_t parse_method; /* parse_statement is forced or ? */
+ po_ind_t curr_param_result; /* current param result is set ? */
pgNAME cursor_name;
char *plan_name;
void SC_setInsertedTable(StatementClass *, RETCODE);
void SC_scanQueryAndCountParams(const char *, const ConnectionClass *,
Int4 *next_cmd, SQLSMALLINT *num_params,
- char *multi, char *proc_return);
+ po_ind_t *multi, po_ind_t *proc_return);
BOOL SC_IsExecuting(const StatementClass *self);
BOOL SC_SetExecuting(StatementClass *self, BOOL on);
#define POSTGRESDRIVERVERSION "08.04.0100"
#define POSTGRES_RESOURCE_VERSION "08.04.0100\0"
#define PG_DRVFILE_VERSION 8,4,01,00
-#define PG_BUILD_VERSION "200904080001"
+#define PG_BUILD_VERSION "200904250001"
#endif