MonetDB: Dec2023 - Make msettings accessible from outside
Changeset: b378f4ac6fdd for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b378f4ac6fdd Modified Files: clients/Tests/exports.stable.out clients/mapilib/CMakeLists.txt clients/mapilib/mapi.c clients/mapilib/mapi_intern.h clients/mapilib/msettings.h Branch: Dec2023 Log Message: Make msettings accessible from outside diffs (195 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -653,6 +653,7 @@ int64_t mapi_get_querytime(MapiHdl hdl) int mapi_get_querytype(MapiHdl hdl) __attribute__((__nonnull__(1))); int64_t mapi_get_row_count(MapiHdl hdl) __attribute__((__nonnull__(1))); int mapi_get_scale(MapiHdl hdl, int fnr) __attribute__((__nonnull__(1))); +msettings *mapi_get_settings(Mapi mid) __attribute__((__nonnull__(1))); int64_t mapi_get_sqloptimizertime(MapiHdl hdl) __attribute__((__nonnull__(1))); char *mapi_get_table(MapiHdl hdl, int fnr) __attribute__((__nonnull__(1))); int mapi_get_tableid(MapiHdl hdl) __attribute__((__nonnull__(1))); @@ -700,6 +701,7 @@ MapiMsg mapi_set_time_zone(Mapi mid, int MapiMsg mapi_set_timeout(Mapi mid, unsigned int timeout, bool (*callback)(void *), void *callback_data) __attribute__((__nonnull__(1))); void mapi_setfilecallback(Mapi mid, char *(*getfunc)(void *priv, const char *filename, bool binary, uint64_t offset, size_t *size), char *(*putfunc)(void *priv, const char *filename, const void *data, size_t size), void *priv) __attribute__((__nonnull__(1))); void mapi_setfilecallback2(Mapi mid, char *(*getfunc)(void *priv, const char *filename, bool binary, uint64_t offset, size_t *size), char *(*putfunc)(void *priv, const char *filename, bool binary, const void *data, size_t size), void *priv) __attribute__((__nonnull__(1))); +Mapi mapi_settings(msettings *settings) __attribute__((__nonnull__(1))); int mapi_split_line(MapiHdl hdl) __attribute__((__nonnull__(1))); MapiMsg mapi_store_field(MapiHdl hdl, int fnr, int outtype, void *outparam) __attribute__((__nonnull__(1))); MapiMsg mapi_timeout(Mapi mid, unsigned int time) __attribute__((__nonnull__(1))); diff --git a/clients/mapilib/CMakeLists.txt b/clients/mapilib/CMakeLists.txt --- a/clients/mapilib/CMakeLists.txt +++ b/clients/mapilib/CMakeLists.txt @@ -32,7 +32,8 @@ target_sources(mapi $/mapi_querytype.h> $/msettings.h> $/mapi.h> - $/mapi_querytype.h>) + $/mapi_querytype.h> + $/msettings.h>) target_include_directories(mapi PUBLIC @@ -58,7 +59,7 @@ set_target_properties(mapi PROPERTIES VERSION ${MAPI_VERSION} SOVERSION ${MAPI_VERSION_MAJOR} - PUBLIC_HEADER "mapi.h;mapi_querytype.h") + PUBLIC_HEADER "mapi.h;mapi_querytype.h;msettings.h") if (NOT WIN32) configure_file(monetdb-mapi.pc.in diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -1772,17 +1772,18 @@ const struct MapiStruct MapiStructDefaul /* Allocate a new connection handle. */ Mapi -mapi_new(void) +mapi_new(msettings *settings) { Mapi mid; - msettings *settings; static ATOMIC_TYPE index = ATOMIC_VAR_INIT(0); mid = malloc(sizeof(*mid)); - settings = msettings_create(); - if (mid == NULL || settings == NULL) { + if (mid == NULL) + return NULL; + if (settings == NULL) + settings = msettings_create(); + if (settings == NULL) { free(mid); - msettings_destroy(settings); return NULL; } @@ -1889,7 +1890,7 @@ mapi_mapiuri(const char *url, const char return NULL; } - mid = mapi_new(); + mid = mapi_new(NULL); if (mid == NULL) return NULL; @@ -1948,7 +1949,7 @@ mapi_mapi(const char *host, int port, co return NULL; } - mid = mapi_new(); + mid = mapi_new(NULL); if (mid == NULL) return NULL; msettings *settings = mid->settings; @@ -1987,6 +1988,19 @@ mapi_mapi(const char *host, int port, co return mid; } +Mapi +mapi_settings(msettings *settings) +{ + assert(settings); + Mapi mid = mapi_new(settings); + if (mid == NULL) + return mid; + + set_uri(mid); + return mid; +} + + /* Close a connection and free all memory associated with the connection handle. */ MapiMsg @@ -4665,6 +4679,12 @@ mapi_get_active(Mapi mid) return mid->active; } +msettings* +mapi_get_settings(Mapi mid) +{ + return mid->settings; +} + MapiMsg mapi_wrap_streams(Mapi mid, stream *rstream, stream *wstream) diff --git a/clients/mapilib/mapi_intern.h b/clients/mapilib/mapi_intern.h --- a/clients/mapilib/mapi_intern.h +++ b/clients/mapilib/mapi_intern.h @@ -315,7 +315,8 @@ MapiMsg mapi_Xcommand(Mapi mid, const ch extern const struct MapiStruct MapiStru
MonetDB: Dec2023 - Package msettings.h in binary distributions.
Changeset: ec4e81302361 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ec4e81302361 Modified Files: MonetDB.spec NT/mksqlwxs.py debian/libmonetdb-client-dev.install Branch: Dec2023 Log Message: Package msettings.h in binary distributions. diffs (31 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -329,6 +329,7 @@ This package contains the files needed t %dir %{_includedir}/monetdb %{_libdir}/libmapi.so %{_includedir}/monetdb/mapi*.h +%{_includedir}/monetdb/msettings.h %{_libdir}/pkgconfig/monetdb-mapi.pc %package client-odbc diff --git a/NT/mksqlwxs.py b/NT/mksqlwxs.py --- a/NT/mksqlwxs.py +++ b/NT/mksqlwxs.py @@ -188,6 +188,8 @@ def main(): sorted([r'include\monetdb\{}'.format(x) for x in filter(lambda x: (x.startswith('gdk') or x.startswith('monet') or x.startswith('mal') or x.startswith('sql') or x.startswith('rel') or x.startswith('store') or x.startswith('exception') or x.startswith('opt_backend')) and x.endswith('.h'), os.listdir(os.path.join(sys.argv[3], 'include', 'monetdb')))] + [r'include\monetdb\copybinary.h', r'include\monetdb\mapi.h', + r'include\monetdb\mapi_querytype.h', + r'include\monetdb\msettings.h', r'include\monetdb\matomic.h', r'include\monetdb\mel.h', r'include\monetdb\mstring.h', diff --git a/debian/libmonetdb-client-dev.install b/debian/libmonetdb-client-dev.install --- a/debian/libmonetdb-client-dev.install +++ b/debian/libmonetdb-client-dev.install @@ -1,3 +1,4 @@ debian/tmp/usr/lib/x86_64-linux-gnu/libmapi.so usr/lib/x86_64-linux-gnu debian/tmp/usr/include/monetdb/mapi*.h usr/include/monetdb +debian/tmp/usr/include/monetdb/msettings.h usr/include/monetdb debian/tmp/usr/lib/x86_64-linux-gnu/pkgconfig/monetdb-mapi.pc usr/lib/x86_64-linux-gnu/pkgconfig ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: Dec2023 - Test host name verification when cert= is given
Changeset: 203120deebc7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/203120deebc7 Modified Files: clients/mapilib/Tests/tlssecurity.py Branch: Dec2023 Log Message: Test host name verification when cert= is given diffs (31 lines): diff --git a/clients/mapilib/Tests/tlssecurity.py b/clients/mapilib/Tests/tlssecurity.py --- a/clients/mapilib/Tests/tlssecurity.py +++ b/clients/mapilib/Tests/tlssecurity.py @@ -62,10 +62,10 @@ server = tlstester.TLSTester( server_thread = threading.Thread(target=server.serve_forever, daemon=True) server_thread.start() -def attempt(experiment: str, portname: str, expected_error_regex: str, tls=True, **params): +def attempt(experiment: str, portname: str, expected_error_regex: str, tls=True, host='localhost', **params): port = server.get_port(portname) scheme = 'monetdbs' if tls else 'monetdb' -url = f"{scheme}://localhost:{port}/demo" +url = f"{scheme}://{host}:{port}/demo" if params: # should be percent-escaped url += '?' + '&'.join(f"{k}={v}" for k, v in params.items()) @@ -129,6 +129,14 @@ attempt('refuse_no_cert', 'server1', "") attempt('refuse_wrong_cert', 'server1', 'verify failed', cert=certpath('ca2.crt')) +# refuse_wrong_host +# +# Connect to port 'server1' over TLS, but using an alternative host name. +# For example, `localhost.localdomain` instead of `localhost`. +# The client should refuse to let the connection proceed. + +attempt('refuse_wrong_host', 'server1', 'verify failed', host='localhost.localdomain', cert=certpath('ca1.crt')) + # refuse_tlsv12 # # Connect to port 'tls12' over TLS, verifying the connection using ca1.crt. The ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: Dec2023 - Properly test system certificates
Changeset: 27b6861a2493 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/27b6861a2493 Modified Files: clients/mapilib/Tests/systemcertificates.py Branch: Dec2023 Log Message: Properly test system certificates Depends on environment variables TLSTEST_URL and TLSTEST_ALTURL diffs (166 lines): diff --git a/clients/mapilib/Tests/systemcertificates.py b/clients/mapilib/Tests/systemcertificates.py --- a/clients/mapilib/Tests/systemcertificates.py +++ b/clients/mapilib/Tests/systemcertificates.py @@ -7,39 +7,134 @@ # Copyright 1997 - July 2008 CWI, August 2008 - 2023 MonetDB B.V. -import subprocess -import sys - # Test that certificates from the system trust store are used when no explicit # certificate is given. # -# # If all goes well, this will give a protocol error (MAPI != HTTP), -# not a TLS error +# This test tries to connect to an existing TLS+MAPI server that has a publicly +# trusted certificate. This needs to be configured externally through +# the environment variables TLSTEST_URL and TLSTEST_ALTURL. +# +# These must point to the same server so they receive the same certificate. +# However, the host name in TLSTEST_URL must match the certificate while the +# hostname in TLSTEST_ALT doesn't match. + + +import logging +import os +import shlex +import socket +import subprocess +import ssl +import sys +import urllib +from urllib.parse import urlparse + +level = logging.WARNING +# if sys.platform == 'win32': +# level=logging.DEBUG +if '-v' in sys.argv: +level = logging.DEBUG +# level = logging.DEBUG +logging.basicConfig(level=level) + +logger = logging.root -# Ideally we'd use www.monetdb.org but, but at the time of writing www.monetdb.org -# only returns an error after a 20 second time out. -# -# python.org on the other hand uses a CDN which kicks us out instantly. -HOST = 'python.org' +# +# Look for the URL configuration variables, exit if not present + +def getvar(name): +value = os.environ.get(name) +if value: +logger.debug(f"Environment variable {name}={value}") +return value +else: +logger.debug(f"Environment variable {name} is not set, exiting early") +exit(0) + +url = getvar('TLSTEST_URL') +alturl = getvar('TLSTEST_ALTURL') + + +# +# Before trying with mclient, connect directly to see if the server is +# up and behaves the way we need for this test + +def try_connect(url, check_hostname, expected_error): +logger.info(f"Attempting to connect to {url}, check_hostname={check_hostname}") +parsed = urlparse(url) +assert parsed.scheme == 'monetdbs', f'Expected scheme monetdbs, not {parsed.scheme}' + +host = parsed.hostname +port = parsed.port or 5 +logger.debug(f"Connecting to host {host!r} port {port!r}") + +with socket.create_connection((host, port)) as sock: +logger.debug(f"Connection established") -# Run mclient -cmd = ['mclient', '-L-', '-d', f"monetdbs://{HOST}:443/demo"] -proc = subprocess.run(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE) -if proc.returncode != 2: -msg = str(proc.stderr, 'utf-8') -print(f"mclient is supposed to exit with status 2, not {proc.returncode}.\n--- stderr ---\n{msg}\n---end stderr ---", file=sys.stderr) -exit(1) +logger.debug(f"Verifying TLS") +ctx = ssl.create_default_context() +ctx.check_hostname = check_hostname +try: +ssl_connection = ctx.wrap_socket(sock, server_hostname=host) +# if we get here it succeeded +if expected_error: +raise Exception(f"Verification succeeded unexpectedly") +else: +logger.debug(f"Verification succeeded as expected") +logger.debug("Closing") +ssl_connection.close() +except ssl.SSLError as e: +if expected_error and expected_error in str(e): +logger.debug(f"Verification failed as expected: {e}") +elif expected_error: +logger.error(f"Verification failed but the error did not match {expected_error!r}: {e}") +else: +logger.error(f"Verification failed unexpectedly: {e}") +raise e + + +# both urls should be reachable and present a TLS certificate +try_connect(url, check_hostname=False, expected_error=None) +try_connect(alturl, check_hostname=False, expected_error=None) + +# url should have the expected hostname so this should succeed +try_connect(url, check_hostname=True, expected_error=None) + +# alturl should have a hostname that makes the verification fail +try_connect(alturl, check_hostname=True, expected_error='Hostname mismatch') + -# After the TLS handshake succeeds we expect the server to send something like -# 'HTTP/1.1 400 Bad Request' because we're sending \x00\x00 instead of an HTTP -# request. libmapi will interpre
MonetDB: Dec2023 - Import latest changes to url tests
Changeset: 502b3451ec49 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/502b3451ec49 Modified Files: clients/mapilib/Tests/tests.md Branch: Dec2023 Log Message: Import latest changes to url tests diffs (truncated from 330 to 300 lines): diff --git a/clients/mapilib/Tests/tests.md b/clients/mapilib/Tests/tests.md --- a/clients/mapilib/Tests/tests.md +++ b/clients/mapilib/Tests/tests.md @@ -45,8 +45,8 @@ TODO before 1.0 does the above explanati ```test ACCEPT monetdb:///demo +EXPECT database=demo EXPECT connect_scan=true -EXPECT database=demo ``` ```test @@ -115,6 +115,7 @@ EXPECT database=demo ```test ACCEPT monetdb://[2001:0db8:85a3:::8a2e:0370:7334]:12345/demo +EXPECT host=2001:0db8:85a3:::8a2e:0370:7334 EXPECT connect_scan=false EXPECT connect_unix= EXPECT connect_tcp=2001:0db8:85a3:::8a2e:0370:7334 @@ -176,14 +177,14 @@ EXPECT database=demo ``` ```test -ACCEPT monetdbs://mdb.example.com/demo?certhash={sha256}fb:67:20:aa:00:9f:33:4c +ACCEPT monetdbs://mdb.example.com/demo?certhash=sha256:fb:67:20:aa:00:9f:33:4c EXPECT connect_scan=false EXPECT connect_unix= EXPECT connect_tcp=mdb.example.com EXPECT connect_port=5 EXPECT tls=on EXPECT connect_tls_verify=hash -EXPECT certhash={sha256}fb:67:20:aa:00:9f:33:4c +EXPECT certhash=sha256:fb:67:20:aa:00:9f:33:4c EXPECT connect_certhash_digits=fb6720aa009f334c EXPECT database=demo ``` @@ -199,6 +200,17 @@ EXPECT user=dbuser EXPECT password= ``` +```test +ACCEPT monetdb://localhost/demo?sock=/var/monetdb/_sock&user=dbuser +EXPECT connect_scan=false +EXPECT connect_unix=/var/monetdb/_sock +EXPECT connect_tcp= +EXPECT tls=off +EXPECT database=demo +EXPECT user=dbuser +EXPECT password= +``` + ## Parameter tests @@ -269,6 +281,9 @@ Not supported on Windows, but they shoul EXPECT sock= ACCEPT monetdb:///?sock=/tmp/sock EXPECT sock=/tmp/sock +ACCEPT monetdb:///?sock=C:/TEMP/sock +EXPECT sock=C:/TEMP/sock +NOT jdbc ACCEPT monetdb:///?sock=C:\TEMP\sock EXPECT sock=C:\TEMP\sock ``` @@ -288,6 +303,9 @@ EXPECT connect_unix=/tmp/nonstandard/.s. EXPECT cert= ACCEPT monetdbs:///?cert=/tmp/cert.pem EXPECT cert=/tmp/cert.pem +ACCEPT monetdbs:///?cert=C:/TEMP/cert.pem +EXPECT cert=C:/TEMP/cert.pem +NOT jdbc ACCEPT monetdbs:///?cert=C:\TEMP\cert.pem EXPECT cert=C:\TEMP\cert.pem ``` @@ -296,35 +314,31 @@ EXPECT cert=C:\TEMP\cert.pem ```test EXPECT certhash= -ACCEPT monetdbs:///?certhash={sha256}001122ff -ACCEPT monetdbs:///?certhash={sha256}00:11:22:ff -ACCEPT monetdbs:///?certhash={sha256}aa::ff: -ACCEPT monetdbs:///?certhash={sha256}e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +ACCEPT monetdbs:///?certhash=sha256:001122ff +ACCEPT monetdbs:///?certhash=sha256:00:11:22:ff +ACCEPT monetdbs:///?certhash=sha256:aa::ff: +ACCEPT monetdbs:///?certhash=sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ``` This string of hexdigits is longer than the length of a SHA-256 digest. It still parses, it will just never match. ```test -ACCEPT monetdbs:///?certhash={sha256}e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8550 -ACCEPT monetdbs:///?certhash={sha256}e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85501 +ACCEPT monetdbs:///?certhash=sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8550 +ACCEPT monetdbs:///?certhash=sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85501 ``` ```test REJECT monetdbs:///?certhash=001122ff -REJECT monetdbs:///?certhash={Sha256}001122ff -REJECT monetdbs:///?certhash=sha256:001122ff -REJECT monetdbs:///?certhash={sha256}001122gg -REJECT monetdbs:///?certhash={sha256}}001122 -REJECT monetdbs:///?certhash={{sha256}001122 -REJECT monetdbs:///?certhash={{sha256} -REJECT monetdbs:///?certhash={sha -REJECT monetdbs:///?certhash={sha1}aabbcc -REJECT monetdbs:///?certhash={sha1} -REJECT monetdbs:///?certhash={sha1}X -REJECT monetdbs:///?certhash={sha99}aabbcc -REJECT monetdbs:///?certhash={sha99} -REJECT monetdbs:///?certhash={sha99}X +REJECT monetdbs:///?certhash=Sha256:001122ff +REJECT monetdbs:///?certhash=sha256:001122gg +REJECT monetdbs:///?certhash=sha +REJECT monetdbs:///?certhash=sha1:aabbcc +REJECT monetdbs:///?certhash=sha1: +REJECT monetdbs:///?certhash=sha1:X +REJECT monetdbs:///?certhash=sha99:aabbcc +REJECT monetdbs:///?certhash=sha99: +REJECT monetdbs:///?certhash=sha99:X ``` ### clientkey, clientcert @@ -334,6 +348,9 @@ EXPECT clientkey= EXPECT clientcert= ACCEPT monetdbs:///?clientkey=/tmp/clientkey.pem EXPECT clientkey=/tmp/clientkey.pem +ACCEPT monetdbs:///?clientkey=C:/TEMP/clientkey.pem +EXPECT clientkey=C:/TEMP/clientkey.pem +NOT jdbc ACCEPT monetdbs:///?clientkey=C:\TEMP\clientkey.pem EXPECT clientkey=C:\TEMP\clientkey.pem ``` @@ -368,6 +385,9 @@ SET clientkey=dummy EXPECT clientcert= ACCEPT monetdbs:///?clientcert=/tmp
MonetDB: Dec2023 - The certhash parameter changed from {sha256}d...
Changeset: f829ae760bb6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f829ae760bb6 Modified Files: clients/mapilib/Tests/tlssecurity.py clients/mapilib/Tests/tlstester.py clients/mapilib/msettings.c Branch: Dec2023 Log Message: The certhash parameter changed from {sha256}digits to sha256:digits diffs (68 lines): diff --git a/clients/mapilib/Tests/tlssecurity.py b/clients/mapilib/Tests/tlssecurity.py --- a/clients/mapilib/Tests/tlssecurity.py +++ b/clients/mapilib/Tests/tlssecurity.py @@ -196,7 +196,7 @@ attempt('connect_server_name', 'sni', No # of the server certificate in DER form. Have a succesful MAPI exchange. server1hash = sha256(certs.get_file('server1.der')).hexdigest() -attempt('connect_right_hash', 'server1', None, certhash='{sha256}' + server1hash[:6]) +attempt('connect_right_hash', 'server1', None, certhash='sha256:' + server1hash[:6]) # connect_wrong_hash # @@ -208,7 +208,7 @@ first_digit = server1hash[0] other_digit = f"{8 ^ int(first_digit, 16):x}" wronghash = other_digit + server1hash[1:] -attempt('connect_wrong_hash', 'server1', "does not match certhash", certhash='{sha256}' + wronghash[:6]) +attempt('connect_wrong_hash', 'server1', "does not match certhash", certhash='sha256:' + wronghash[:6]) # connect_ca_hash @@ -217,7 +217,7 @@ attempt('connect_wrong_hash', 'server1', # of the CA1 certificate in DER form. This should fail. ca1hash = sha256(certs.get_file('ca1.der')).hexdigest() -attempt('connect_ca_hash', 'server1', "does not match certhash", certhash='{sha256}' + ca1hash[:6]) +attempt('connect_ca_hash', 'server1', "does not match certhash", certhash='sha256:' + ca1hash[:6]) diff --git a/clients/mapilib/Tests/tlstester.py b/clients/mapilib/Tests/tlstester.py --- a/clients/mapilib/Tests/tlstester.py +++ b/clients/mapilib/Tests/tlstester.py @@ -555,7 +555,7 @@ class MapiHandler(socketserver.BaseReque cert = self.tlstester.certs.get_file(f"{self.redirect}.der") algo = 'sha256' digest = hashlib.new(algo, cert).hexdigest() -fingerprint = "{" + algo + "}" + digest +fingerprint = algo + ":" + digest msg = f"^monetdbs://{host}:{port}?certhash={fingerprint}\n" self.send_message(bytes(msg, 'ascii')) log.debug( diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c --- a/clients/mapilib/msettings.c +++ b/clients/mapilib/msettings.c @@ -557,10 +557,10 @@ validate_certhash(msettings *mp) if (*certhash == '\0') return NULL; - if (strncmp(certhash, "{sha256}", 8) == 0) { - certhash += 8; + if (strncmp(certhash, "sha256:", 7) == 0) { + certhash += 7; } else { - return "expected certhash to start with '{sha256}'"; + return "expected certhash to start with 'sha256:'"; } size_t i = 0; @@ -631,7 +631,7 @@ msettings_validate(msettings *mp, char * return false; } - // 5. If **certhash** is not empty, it must be of the form `{sha256}hexdigits` + // 5. If **certhash** is not empty, it must be of the form `sha256:hexdigits` //where hexdigits is a non-empty sequence of 0-9, a-f, A-F and colons. const char *certhash_msg = validate_certhash(mp); if (certhash_msg) { ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: Dec2023 - Reject user@host syntax
Changeset: f3c9e7aa85ba for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f3c9e7aa85ba Modified Files: clients/mapilib/parseurl.c Branch: Dec2023 Log Message: Reject user@host syntax diffs (12 lines): diff --git a/clients/mapilib/parseurl.c b/clients/mapilib/parseurl.c --- a/clients/mapilib/parseurl.c +++ b/clients/mapilib/parseurl.c @@ -405,6 +405,8 @@ parse_classic_tcp(msettings *mp, scanner // parse the host char *host = find(sc, ":?/"); + if (strchr(host, '@') != NULL) + return complain(sc, "host@user syntax is not allowed"); if (!store(mp, sc, MP_HOST, host)) return false; ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: no_type_bat - merged with default
Changeset: 8a457c94e289 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8a457c94e289 Modified Files: MonetDB.spec clients/Tests/MAL-signatures-hge.test clients/Tests/MAL-signatures.test clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_bbp.c monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_profiler.c monetdb5/modules/kernel/algebra.c monetdb5/modules/mal/mal_io.c sql/backends/monet5/sql.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_result.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_upgrades.c sql/server/rel_select.c sql/server/sql_partition.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_table.c Branch: no_type_bat Log Message: merged with default diffs (truncated from 5442 to 300 lines): diff --git a/ChangeLog.Dec2023 b/ChangeLog.Dec2023 --- a/ChangeLog.Dec2023 +++ b/ChangeLog.Dec2023 @@ -1,6 +1,10 @@ # ChangeLog file for devel # This file is updated with Maddlog +* Fri Dec 1 2023 Sjoerd Mullender +- All binary packages are now signed with a new key with key fingerprint + DBCE 5625 94D7 1959 7B54 CE85 3F1A D47F 5521 A603. + * Mon Oct 30 2023 Sjoerd Mullender - The ranges of merge partitions are now pushed down into the low level GDK operations, giving them a handle to sometimes execute more diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -96,7 +96,11 @@ Source: https://www.monetdb.org/download # that doesn't exist and we need systemd, so instead we just require # the macro file that contains the definitions. # We need checkpolicy and selinux-policy-devel for the SELinux policy. -BuildRequires: /usr/lib/rpm/macros.d/macros.systemd +%if 0%{?rhel} != 7 +BuildRequires: systemd-rpm-macros +%else +BuildRequires: systemd +%endif BuildRequires: checkpolicy BuildRequires: selinux-policy-devel BuildRequires: hardlink @@ -220,6 +224,8 @@ accelerators. It also has an SQL front This package contains a shared library (libstream) which is needed by various other components. +%ldconfig_scriptlets stream + %files stream %license COPYING %defattr(-,root,root) @@ -250,9 +256,35 @@ library. %{_includedir}/monetdb/stream_socket.h %{_libdir}/pkgconfig/monetdb-stream.pc +%package client-lib +Summary: MonetDB - Monet Database Management System Client Programs +Group: Applications/Databases +%if (0%{?fedora} >= 22) +Recommends: %{name}-SQL-server5%{?_isa} = %{version}-%{release} +Recommends: MonetDB5-server%{?_isa} = %{version}-%{release} +%endif + +%description client-lib +MonetDB is a database management system that is developed from a +main-memory perspective with use of a fully decomposed storage model, +automatic index management, extensibility of data types and search +accelerators. It also has an SQL front end. + +This package contains libmapi.so, the main client library used by both +mclient, msqldump and by the ODBC driver. If you want to use MonetDB, +you will very likely need this package. + +%ldconfig_scriptlets client-lib + +%files client-lib +%license COPYING +%defattr(-,root,root) +%{_libdir}/libmapi.so.* + %package client Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases +Requires: %{name}-client-lib%{?_isa} = %{version}-%{release} %if (0%{?fedora} >= 22) Recommends: %{name}-SQL-server5%{?_isa} = %{version}-%{release} Recommends: MonetDB5-server%{?_isa} = %{version}-%{release} @@ -274,14 +306,13 @@ MonetDB, you will very likely need this %defattr(-,root,root) %{_bindir}/mclient %{_bindir}/msqldump -%{_libdir}/libmapi.so.* -%doc %{_mandir}/man1/mclient.1.gz -%doc %{_mandir}/man1/msqldump.1.gz +%{_mandir}/man1/mclient.1* +%{_mandir}/man1/msqldump.1* %package client-devel Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases -Requires: %{name}-client%{?_isa} = %{version}-%{release} +Requires: %{name}-client-lib%{?_isa} = %{version}-%{release} Requires: %{name}-stream-devel%{?_isa} = %{version}-%{release} %description client-devel @@ -303,7 +334,7 @@ This package contains the files needed t %package client-odbc Summary: MonetDB ODBC driver Group: Applications/Databases -Requires: %{name}-client%{?_isa} = %{version}-%{release} +Requires: %{name}-client-lib%{?_isa} = %{version}-%{release} Requires(post): %{_bindir}/odbcinst Requires(postun): %{_bindir}/odbcinst @@ -477,11 +508,40 @@ format. %{_libdir}/monetdb5/lib_fits.so %endif +%package -n MonetDB5-libs +Summary: MonetDB - Monet Database Main Libraries +Group: Applications/Databases + +%description -n MonetDB5-libs +MonetDB is a database management system that is developed from a +main-memory perspective with use of a fully decomposed storage model, +automatic index management, extensibility of data types and search +accelerators. It also
monetdb-java: default - Use intrinsics rather than manual flow c...
Changeset: 1344603ee8af for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/1344603ee8af Modified Files: src/main/java/org/monetdb/jdbc/MonetBlob.java src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/jdbc/MonetStatement.java src/main/java/org/monetdb/mcl/parser/TupleLineParser.java Branch: default Log Message: Use intrinsics rather than manual flow control diffs (68 lines): diff --git a/src/main/java/org/monetdb/jdbc/MonetBlob.java b/src/main/java/org/monetdb/jdbc/MonetBlob.java --- a/src/main/java/org/monetdb/jdbc/MonetBlob.java +++ b/src/main/java/org/monetdb/jdbc/MonetBlob.java @@ -299,8 +299,8 @@ public final class MonetBlob implements try { offset--; /* transactions? what are you talking about? */ - for (int i = (int)pos; i < len; i++) - buf[i] = bytes[offset + i]; +if (len - (int) pos >= 0) +System.arraycopy(bytes, offset + (int) pos, buf, (int) pos, len - (int) pos); } catch (IndexOutOfBoundsException e) { throw new SQLException(e.getMessage(), "M0M10"); } diff --git a/src/main/java/org/monetdb/jdbc/MonetConnection.java b/src/main/java/org/monetdb/jdbc/MonetConnection.java --- a/src/main/java/org/monetdb/jdbc/MonetConnection.java +++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java @@ -24,13 +24,8 @@ import java.sql.SQLNonTransientConnectio import java.sql.SQLWarning; import java.sql.Savepoint; import java.sql.Statement; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Properties; -import java.util.WeakHashMap; import java.util.concurrent.Executor; import org.monetdb.mcl.io.BufferedMCLReader; @@ -2902,8 +2897,7 @@ public class MonetConnection @Override public void close() { // feed all rows to the garbage collector - for (int i = 0; i < data.length; i++) - data[i] = null; +Arrays.fill(data, null); } /** diff --git a/src/main/java/org/monetdb/jdbc/MonetStatement.java b/src/main/java/org/monetdb/jdbc/MonetStatement.java --- a/src/main/java/org/monetdb/jdbc/MonetStatement.java +++ b/src/main/java/org/monetdb/jdbc/MonetStatement.java @@ -1571,9 +1571,7 @@ final class MonetVirtualResultSet extend if (row < 1 || row > tupleCount) return false; - for (int i = 0; i < results[row - 1].length; i++) { - tlp.values[i] = results[row - 1][i]; - } +System.arraycopy(results[row - 1], 0, tlp.values, 0, results[row - 1].length); return true; } diff --git a/src/main/java/org/monetdb/mcl/parser/TupleLineParser.java b/src/main/java/org/monetdb/mcl/parser/TupleLineParser.java --- a/src/main/java/org/monetdb/mcl/parser/TupleLineParser.java +++ b/src/main/java/org/monetdb/mcl/parser/TupleLineParser.java @@ -112,7 +112,7 @@ public final class TupleLineParser exten if (fieldHasEscape) { if (uesc == null) { // first time use, create it with enough capacity, minimum 1024 - uesc = new StringBuilder(fieldlen > 1024 ? fieldlen : 1024); + uesc = new StringBuilder(Math.max(fieldlen, 1024)); } else { // reuse the StringBuilder by cleaning it uesc.setLength(0); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
monetdb-java: default - Call reader.read multiple times if neces...
Changeset: 17b8a0a84e62 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/17b8a0a84e62 Modified Files: src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java Branch: default Log Message: Call reader.read multiple times if necessary diffs (18 lines): diff --git a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java --- a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java +++ b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java @@ -944,7 +944,13 @@ public class MonetPreparedStatement // simply serialise the Reader data into a large buffer final CharBuffer buf = CharBuffer.allocate((int)length); // have to down cast try { - reader.read(buf); + long foo = 0; + while (foo < length) { + int n = reader.read(buf); + if (n < 0) + throw new SQLException("Stream ended unexpectedly at position " + foo + " out of " + length); + foo += n; + } // We have to rewind the buffer, because otherwise toString() returns "". buf.rewind(); setString(parameterIndex, buf.toString()); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
monetdb-java: default - InputStream.read must return the byte UN...
Changeset: 9188263368cc for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/9188263368cc Modified Files: src/main/java/org/monetdb/mcl/net/MapiSocket.java Branch: default Log Message: InputStream.read must return the byte UNSIGNED! diffs (21 lines): diff --git a/src/main/java/org/monetdb/mcl/net/MapiSocket.java b/src/main/java/org/monetdb/mcl/net/MapiSocket.java --- a/src/main/java/org/monetdb/mcl/net/MapiSocket.java +++ b/src/main/java/org/monetdb/mcl/net/MapiSocket.java @@ -1073,7 +1073,7 @@ public final class MapiSocket { if (debug) log("RX ", new String(block, readPos, 1, StandardCharsets.UTF_8), true); - return (int)block[readPos++]; + return block[readPos++] & 0xFF; } @Override @@ -1459,7 +1459,7 @@ public final class MapiSocket { final byte[] buf = { 0 }; final int nread = read(buf, 0, 1); if (nread == 1) - return buf[0]; + return buf[0] & 0xFF; else return -1; } ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
monetdb-java: default - Fix arithmetic overflow
Changeset: 93b256bf29a7 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/93b256bf29a7 Modified Files: src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java src/main/java/org/monetdb/jdbc/MonetStatement.java Branch: default Log Message: Fix arithmetic overflow diffs (42 lines): diff --git a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java --- a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java +++ b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java @@ -1317,7 +1317,7 @@ public final class MonetDatabaseMetaData */ @Override public int getMaxBinaryLiteralLength() { - return 2*1024*1024*1024 - 2;// MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() + return 0x7ffe; // MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() } /** @@ -1327,7 +1327,7 @@ public final class MonetDatabaseMetaData */ @Override public int getMaxCharLiteralLength() { - return 2*1024*1024*1024 - 2;// MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() + return 0x7ffe; // MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() } /** @@ -1492,7 +1492,7 @@ public final class MonetDatabaseMetaData */ @Override public int getMaxStatementLength() { - return 2*1024*1024*1024 - 2;// MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() + return 0x7ffe; // MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() } /** diff --git a/src/main/java/org/monetdb/jdbc/MonetStatement.java b/src/main/java/org/monetdb/jdbc/MonetStatement.java --- a/src/main/java/org/monetdb/jdbc/MonetStatement.java +++ b/src/main/java/org/monetdb/jdbc/MonetStatement.java @@ -689,7 +689,7 @@ public class MonetStatement */ @Override public int getMaxFieldSize() { - return 2*1024*1024*1024 - 2;// MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() + return 0x7ffe; // MonetDB supports null terminated strings of max 2GB, see function: int UTF8_strlen() } /** ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
monetdb-java: default - Fix the computed CHAR_OCTET_LENGTH value...
Changeset: 4117aa40a6b9 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/4117aa40a6b9 Modified Files: src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java tests/JDBC_API_Tester.java Branch: default Log Message: Fix the computed CHAR_OCTET_LENGTH value of resultsets returned by getColumns(), getFunctionColumns() and getProcedureColumns(). It now also returns a bigint instead of int to prevent computation overflow. diffs (127 lines): diff --git a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java --- a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java +++ b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java @@ -1815,7 +1815,7 @@ public final class MonetDatabaseMetaData "cast(null as char(1)) AS \"COLUMN_DEF\", " + "cast(0 as int) AS \"SQL_DATA_TYPE\", " + "cast(0 as int) AS \"SQL_DATETIME_SUB\", " + - "cast(CASE WHEN a.\"type\" IN ('char','varchar','clob') THEN a.\"type_digits\" ELSE NULL END as int) AS \"CHAR_OCTET_LENGTH\", " + + "cast(CASE WHEN a.\"type\" IN ('varchar','clob','char','json','url','xml') THEN 4 * a.\"type_digits\" WHEN a.\"type\" = 'blob' THEN a.\"type_digits\" ELSE NULL END as bigint) AS \"CHAR_OCTET_LENGTH\", " + // in MonetDB procedures have no return value by design. The arguments in sys.args are numbered from 0 so we must add 1 to comply with the API specification. "cast(a.\"number\" + 1 as int) AS \"ORDINAL_POSITION\", " + "cast('' as varchar(3)) AS \"IS_NULLABLE\", " + @@ -2131,7 +2131,7 @@ public final class MonetDatabaseMetaData "c.\"default\" AS \"COLUMN_DEF\", " + "cast(0 as int) AS \"SQL_DATA_TYPE\", " + "cast(0 as int) AS \"SQL_DATETIME_SUB\", " + - "cast(CASE WHEN c.\"type\" IN ('char','varchar','clob') THEN c.\"type_digits\" ELSE NULL END as int) AS \"CHAR_OCTET_LENGTH\", " + + "cast(CASE WHEN c.\"type\" IN ('varchar','clob','char','json','url','xml') THEN 4 * c.\"type_digits\" ELSE NULL END as bigint) AS \"CHAR_OCTET_LENGTH\", " + "cast(c.\"number\" + 1 as int) AS \"ORDINAL_POSITION\", " + "cast(CASE c.\"null\" WHEN true THEN 'YES' WHEN false THEN 'NO' ELSE '' END AS varchar(3)) AS \"IS_NULLABLE\", " + "cast(null AS char(1)) AS \"SCOPE_CATALOG\", " + @@ -3034,7 +3034,9 @@ public final class MonetDatabaseMetaData " WHEN 'sec_interval' THEN 'interval second'" + " ELSE \"sqlname\" END AS \"TYPE_NAME\", " + "cast(").append(MonetDriver.getSQLTypeMap("\"sqlname\"")).append(" AS int) AS \"DATA_TYPE\", " + - "\"digits\" AS \"PRECISION\", " + // note that when radix is 2 the precision shows the number of bits + "cast(CASE WHEN \"sqlname\" IN ('time','timetz','timestamp','timestamptz') THEN \"digits\" -1" + + " WHEN \"sqlname\" IN ('sec_interval','day_interval') THEN 3" + + " WHEN \"sqlname\" = 'month_interval' THEN 0 ELSE \"digits\" END AS int) AS \"PRECISION\", " + // note that when radix is 2 the precision shows the number of bits "cast(CASE WHEN \"sqlname\" IN ('char','varchar','sec_interval','day_interval','month_interval') THEN " + " WHEN \"sqlname\" IN ('clob','inet','json','url','uuid','date','time','timetz','timestamp','timestamptz','blob','sqlblob','xml') THEN \"sqlname\"||' '''" + " ELSE NULL END AS varchar(16)) AS \"LITERAL_PREFIX\", " + @@ -3043,7 +3045,7 @@ public final class MonetDatabaseMetaData " ELSE NULL END AS varchar(2)) AS \"LITERAL_SUFFIX\", " + "CASE WHEN \"sqlname\" IN ('char','varchar') THEN 'max length'" + " WHEN \"sqlname\" = 'decimal' THEN 'precision, scale'" + - " WHEN \"sqlname\" IN ('time','timetz','timestamp','timestamptz','sec_interval') THEN 'precision'" + + " WHEN \"sqlname\" IN ('time','timetz','timestamp','timestamptz') THEN 'precision'" + " ELSE NULL END AS \"CREATE_PARAMS\", " + "cast(CASE WHEN \"systemname\" = 'oid' THEN " + DatabaseMetaData.typeNoNulls + " ELSE " + DatabaseMetaData.typeNullable + " END AS smallint) AS \"NULLABLE\", " + @@ -3057,7 +3059,8 @@ public final class MonetDatabaseMetaData "CASE WHEN \"sqlname\" IN ('sec_interval','day_interval','month_interval') THEN \"s
monetdb-java: default - correct indentation
Changeset: 726a1d7b168c for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/726a1d7b168c Modified Files: src/main/java/org/monetdb/jdbc/MonetBlob.java src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/jdbc/MonetStatement.java Branch: default Log Message: correct indentation diffs (38 lines): diff --git a/src/main/java/org/monetdb/jdbc/MonetBlob.java b/src/main/java/org/monetdb/jdbc/MonetBlob.java --- a/src/main/java/org/monetdb/jdbc/MonetBlob.java +++ b/src/main/java/org/monetdb/jdbc/MonetBlob.java @@ -299,8 +299,8 @@ public final class MonetBlob implements try { offset--; /* transactions? what are you talking about? */ -if (len - (int) pos >= 0) -System.arraycopy(bytes, offset + (int) pos, buf, (int) pos, len - (int) pos); + if (len - (int) pos >= 0) + System.arraycopy(bytes, offset + (int) pos, buf, (int) pos, len - (int) pos); } catch (IndexOutOfBoundsException e) { throw new SQLException(e.getMessage(), "M0M10"); } diff --git a/src/main/java/org/monetdb/jdbc/MonetConnection.java b/src/main/java/org/monetdb/jdbc/MonetConnection.java --- a/src/main/java/org/monetdb/jdbc/MonetConnection.java +++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java @@ -2897,7 +2897,7 @@ public class MonetConnection @Override public void close() { // feed all rows to the garbage collector -Arrays.fill(data, null); + Arrays.fill(data, null); } /** diff --git a/src/main/java/org/monetdb/jdbc/MonetStatement.java b/src/main/java/org/monetdb/jdbc/MonetStatement.java --- a/src/main/java/org/monetdb/jdbc/MonetStatement.java +++ b/src/main/java/org/monetdb/jdbc/MonetStatement.java @@ -1571,7 +1571,7 @@ final class MonetVirtualResultSet extend if (row < 1 || row > tupleCount) return false; -System.arraycopy(results[row - 1], 0, tlp.values, 0, results[row - 1].length); + System.arraycopy(results[row - 1], 0, tlp.values, 0, results[row - 1].length); return true; } ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org