41
41
#include <direct.h>
42
42
#include <time.h>
43
43
44
+ #include <Shellapi.h>
45
+ #define strncasecmp _strnicmp
46
+ #define strcasecmp _stricmp
47
+
44
48
typedef HANDLE SF_THREAD_HANDLE ;
45
49
typedef CONDITION_VARIABLE SF_CONDITION_HANDLE ;
46
50
typedef CRITICAL_SECTION SF_CRITICAL_SECTION_HANDLE ;
@@ -76,10 +80,11 @@ typedef pthread_mutex_t SF_MUTEX_HANDLE;
76
80
#define strcasecmp _stricmp
77
81
#endif
78
82
79
- #define DEFAULT_OCSP_RESPONSE_CACHE_HOST "http://ocsp.snowflakecomputing.com "
83
+ #define DEFAULT_OCSP_RESPONSE_CACHE_HOST "http://ocsp.snowflakecomputing.%s "
80
84
#define OCSP_RESPONSE_CACHE_JSON "ocsp_response_cache.json"
81
85
#define OCSP_RESPONSE_CACHE_URL "%s/%s"
82
- #define OCSP_RESPONDER_RETRY_URL "http://ocsp.snowflakecomputing.com/retry"
86
+ #define OCSP_RESPONDER_RETRY_URL "http://ocsp.snowflakecomputing.%s/retry"
87
+ #define MAX_DOMAIN_LEN 64 //max 63 characters + terminator
83
88
84
89
#define GET_STR_OCSP_LOG (X ,Y ) X->Y ? sf_curl_cJSON_CreateString(X->Y) : NULL
85
90
#define GET_BOOL_OCSP_LOG (X ,Y ) X->Y ? sf_curl_cJSON_CreateString("True") : sf_curl_cJSON_CreateString("False")
@@ -227,6 +232,28 @@ static char ocsp_cache_server_url[MAX_BUFFER_LENGTH] = "";
227
232
228
233
static char ocsp_cache_server_retry_url_pattern [MAX_BUFFER_LENGTH ];
229
234
235
+ static char default_ocsp_cache_host [sizeof (DEFAULT_OCSP_RESPONSE_CACHE_HOST ) + MAX_DOMAIN_LEN ] = "" ;
236
+
237
+ static char default_ocsp_cache_retry_url [sizeof (OCSP_RESPONDER_RETRY_URL ) + MAX_DOMAIN_LEN ] = "" ;
238
+
239
+ // functions for test purpose only
240
+ SF_PUBLIC (CURLcode ) checkTelemetryHosts (char * hostname )
241
+ {
242
+ struct connectdata conn ;
243
+ conn .host .name = hostname ;
244
+ return checkCertOCSP (& conn , NULL , NULL , NULL , 0 , 0 );
245
+ }
246
+
247
+ void get_cache_server_url (char * buf , size_t bufsize )
248
+ {
249
+ strncpy (buf , ocsp_cache_server_url , bufsize );
250
+ }
251
+
252
+ void get_cache_retry_url_pattern (char * buf , size_t bufsize )
253
+ {
254
+ strncpy (buf , ocsp_cache_server_retry_url_pattern , bufsize );
255
+ }
256
+
230
257
/* Mutex */
231
258
int _mutex_init (SF_MUTEX_HANDLE * lock ) {
232
259
#ifdef _WIN32
@@ -2244,10 +2271,24 @@ void initOCSPCacheServer(struct Curl_easy *data)
2244
2271
2245
2272
if (ocsp_cache_server_url_env == NULL )
2246
2273
{
2274
+ char * top_domain = strrchr (data -> conn -> host .name , '.' );
2275
+ if (top_domain )
2276
+ {
2277
+ top_domain ++ ;
2278
+ }
2279
+ else
2280
+ {
2281
+ // It's basically impossible not finding top domain in host.
2282
+ // Use "com" as default just in case.
2283
+ top_domain = "com" ;
2284
+ }
2285
+
2247
2286
/* default URL */
2287
+ snprintf (default_ocsp_cache_host , sizeof (default_ocsp_cache_host ),
2288
+ DEFAULT_OCSP_RESPONSE_CACHE_HOST , top_domain );
2248
2289
snprintf (ocsp_cache_server_url , sizeof (ocsp_cache_server_url ),
2249
2290
OCSP_RESPONSE_CACHE_URL ,
2250
- DEFAULT_OCSP_RESPONSE_CACHE_HOST ,
2291
+ default_ocsp_cache_host ,
2251
2292
OCSP_RESPONSE_CACHE_JSON );
2252
2293
2253
2294
if (!ACTIVATE_SSD )
@@ -2261,9 +2302,11 @@ void initOCSPCacheServer(struct Curl_easy *data)
2261
2302
* Non private link customers always go to default
2262
2303
* retry URL for OCSP retries
2263
2304
*/
2305
+ snprintf (default_ocsp_cache_retry_url , sizeof (default_ocsp_cache_retry_url ),
2306
+ OCSP_RESPONDER_RETRY_URL , top_domain );
2264
2307
strncpy (ocsp_cache_server_retry_url_pattern ,
2265
- OCSP_RESPONDER_RETRY_URL ,
2266
- sizeof ( OCSP_RESPONDER_RETRY_URL ) );
2308
+ default_ocsp_cache_retry_url ,
2309
+ strlen ( default_ocsp_cache_retry_url ) + 1 );
2267
2310
}
2268
2311
}
2269
2312
else
@@ -2360,15 +2403,22 @@ SF_PUBLIC(CURLcode) checkCertOCSP(struct connectdata *conn,
2360
2403
SF_FAILOPEN_STATUS ocsp_fail_open = ENABLED ;
2361
2404
char last_timeout_host [MAX_BUFFER_LENGTH ];
2362
2405
last_timeout_host [0 ] = '\0' ;
2363
-
2406
+ // SNOW-1526511 ignore top level domain name to be more flexible
2407
+ const char * telemetry_endpoints [] = {
2408
+ "sfctest.client-telemetry.snowflakecomputing." ,
2409
+ "sfcdev.client-telemetry.snowflakecomputing." ,
2410
+ "client-telemetry.snowflakecomputing."
2411
+ };
2412
+ const int telemetry_endpoints_num = sizeof (telemetry_endpoints ) / sizeof (char * );
2364
2413
2365
2414
// These end points are Out of band telemetry end points.
2366
2415
// Do not use OCSP/failsafe on Out of band telemetry endpoints
2367
- if ( (strcmp (conn -> host .name , "sfctest.client-telemetry.snowflakecomputing.com" ) == 0 )
2368
- || (strcmp (conn -> host .name , "sfcdev.client-telemetry.snowflakecomputing.com" ) == 0 )
2369
- || (strcmp (conn -> host .name , "client-telemetry.snowflakecomputing.com" ) == 0 )
2370
- ) {
2371
- return rs ;
2416
+ for (int i = 0 ; i < telemetry_endpoints_num ; i ++ )
2417
+ {
2418
+ if (strncasecmp (conn -> host .name , telemetry_endpoints [i ], strlen (telemetry_endpoints [i ])) == 0 )
2419
+ {
2420
+ return rs ;
2421
+ }
2372
2422
}
2373
2423
2374
2424
SF_OTD ocsp_log_data ;
0 commit comments