static gnutls_x509_privkey_t infinoted_startup_load_key(InfinotedLog* log, gboolean create_key, const gchar* key_file, GError** error) { gnutls_x509_privkey_t key; if(create_key == TRUE) { if(infinoted_util_create_dirname(key_file, error) == FALSE) return NULL; /* TODO: Open the key file beforehand */ infinoted_log_info(log, _("Generating 4096 bit RSA private key...")); key = inf_cert_util_create_private_key(GNUTLS_PK_RSA, 4096, error); if(key == NULL) return NULL; if(inf_cert_util_write_private_key(key, key_file, error) == FALSE) { gnutls_x509_privkey_deinit(key); return NULL; } } else { key = inf_cert_util_read_private_key(key_file, error); } return key; }
static const gchar* infinoted_util_get_pidfile_path_user(void) { static gchar* path = NULL; if(path) return path; path = g_strdup_printf( "%s/.infinoted/infinoted-" LIBINFINITY_API_VERSION ".pid", g_get_home_dir()); infinoted_util_create_dirname(path, NULL); return path; }
static void infinoted_directory_sync_session_save(InfinotedDirectorySync* dsync, InfinotedDirectorySyncSession* session) { InfdDirectoryIter* iter; GError* error; InfBuffer* buffer; InfTextChunk* chunk; gchar* content; gsize bytes; iter = &session->iter; error = NULL; if(session->timeout != NULL) { inf_io_remove_timeout( infd_directory_get_io(dsync->directory), session->timeout ); session->timeout = NULL; } buffer = inf_session_get_buffer( infd_session_proxy_get_session(session->proxy) ); error = NULL; if(!infinoted_util_create_dirname(session->path, &error)) { g_warning(_("Failed to create directory for path \"%s\": %s\n\n"), session->path, error->message); g_error_free(error); } else { /* TODO: Use the iterator API here, which should be less expensive */ chunk = inf_text_buffer_get_slice( INF_TEXT_BUFFER(buffer), 0, inf_text_buffer_get_length(INF_TEXT_BUFFER(buffer)) ); content = inf_text_chunk_get_text(chunk, &bytes); inf_text_chunk_free(chunk); if(!g_file_set_contents(session->path, content, bytes, &error)) { g_warning( _("Failed to write session for path \"%s\": %s\n\n" "Will retry in %u seconds."), session->path, error->message, dsync->sync_interval ); g_error_free(error); infinoted_directory_sync_session_start(session->dsync, session); } g_free(content); } }
static gnutls_x509_crt_t* infinoted_startup_load_certificate(InfinotedLog* log, gboolean create_self_signed_certificate, gnutls_x509_privkey_t key, const gchar* certificate_file, const gchar* certificate_chain_file, guint* n_certificates, GError** error) { InfCertUtilDescription desc; gnutls_x509_crt_t* result; gnutls_x509_crt_t cert; GPtrArray* certs; GPtrArray* chain_certs; gboolean res; if(create_self_signed_certificate == TRUE) { if(infinoted_util_create_dirname(certificate_file, error) == FALSE) return NULL; infinoted_log_info(log, _("Generating self-signed certificate...")); desc.validity = 365 * 24 * 3600; desc.dn_common_name = g_get_host_name(); desc.san_dnsname = g_get_host_name(); cert = inf_cert_util_create_self_signed_certificate(key, &desc, error); if(cert == NULL) return NULL; res = inf_cert_util_write_certificate(&cert, 1, certificate_file, error); if(res == FALSE) { gnutls_x509_crt_deinit(cert); return NULL; } else { result = g_malloc(sizeof(gnutls_x509_crt_t)); *result = cert; *n_certificates = 1; } } else { certs = inf_cert_util_read_certificate(certificate_file, NULL, error); if(certs == NULL) return NULL; if(certificate_chain_file != NULL) { chain_certs = inf_cert_util_read_certificate(certificate_chain_file, certs, error); if(chain_certs == NULL) { result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE); infinoted_startup_free_certificate_array(result, *n_certificates); return NULL; } } *n_certificates = certs->len; result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE); } return result; }
static InfAdoptedSessionRecord* infinoted_plugin_record_start(InfinotedPluginRecord* plugin, InfAdoptedSession* session, const gchar* title) { gchar* dirname; gchar* basename; gchar* filename; guint i; gsize pos; InfAdoptedSessionRecord* record; GError* error; basename = g_build_filename(g_get_home_dir(), ".infinoted-records", title, NULL); pos = strlen(basename) + 8; filename = g_strdup_printf("%s.record-00000.xml", basename); g_free(basename); i = 0; while(g_file_test(filename, G_FILE_TEST_EXISTS) && ++i < 100000) g_snprintf(filename + pos, 10, "%05u.xml", i); record = NULL; if(i >= 100000) { dirname = g_path_get_dirname(filename); infinoted_log_warning( infinoted_plugin_manager_get_log(plugin->manager), _("Could not create record file for session \"%s\": Could not generate " "unused record file in directory \"%s\""), title, dirname ); g_free(dirname); } else { error = NULL; if(!infinoted_util_create_dirname(filename, &error)) { dirname = g_path_get_dirname(filename); infinoted_log_warning( infinoted_plugin_manager_get_log(plugin->manager), _("Could not create directory \"%s\": %s"), filename, error->message ); g_error_free(error); g_free(dirname); } else { record = inf_adopted_session_record_new(session); inf_adopted_session_record_start_recording(record, filename, &error); if(error != NULL) { infinoted_log_warning( infinoted_plugin_manager_get_log(plugin->manager), _("Error while writing record for session \"%s\" into \"%s\": %s"), title, filename, error->message ); g_error_free(error); g_object_unref(record); record = NULL; } } } g_free(filename); return record; }