int SLNSessionCreateSession(SLNSessionRef const session, SLNSessionRef *const out) { assert(out); if(!session) return DB_EACCES; SLNSessionCacheRef const cache = session->cache; uint64_t const userID = session->userID; SLNMode const mode = session->mode; strarg_t const username = session->username; DB_env *db = NULL; DB_txn *txn = NULL; SLNSessionRef alt = NULL; byte_t key_raw[SESSION_KEY_LEN]; int rc = async_random(key_raw, sizeof(key_raw)); if(rc < 0) goto cleanup; byte_t key_enc[SHA256_DIGEST_LENGTH]; SHA256(key_raw, sizeof(key_raw), key_enc); str_t key_str[SESSION_KEY_HEX+1]; tohex(key_str, key_enc, SESSION_KEY_LEN); key_str[SESSION_KEY_HEX] = '\0'; rc = SLNSessionDBOpen(session, SLN_RDWR, &db); // TODO: Custom permission? if(rc < 0) goto cleanup; rc = db_txn_begin(db, NULL, DB_RDWR, &txn); if(rc < 0) goto cleanup; uint64_t const sessionID = db_next_id(SLNSessionByID, txn); DB_val key[1], val[1]; SLNSessionByIDKeyPack(key, txn, sessionID); SLNSessionByIDValPack(val, txn, userID, key_str); rc = db_put(txn, key, val, DB_NOOVERWRITE_FAST); if(rc < 0) goto cleanup; rc = db_txn_commit(txn); txn = NULL; SLNSessionDBClose(session, &db); if(rc < 0) goto cleanup; rc = SLNSessionCreateInternal(cache, sessionID, key_raw, key_enc, userID, mode, username, &alt); if(rc < 0) goto cleanup; *out = alt; alt = NULL; cleanup: db_txn_abort(txn); txn = NULL; SLNSessionDBClose(session, &db); SLNSessionRelease(&alt); return rc; }
static void init(void *const unused) { int rc = async_random((byte_t *)&SLNSeed, sizeof(SLNSeed)); if(rc < 0) { alogf("Random seed error\n"); return; } uv_signal_init(async_loop, sigpipe); uv_signal_start(sigpipe, ignore, SIGPIPE); uv_unref((uv_handle_t *)sigpipe); str_t *tmp = strdup(path); strarg_t const reponame = basename(tmp); // TODO rc = SLNRepoCreate(path, reponame, &repo); FREE(&tmp); if(rc < 0) { alogf("Repository could not be opened: %s\n", sln_strerror(rc)); return; } blog = BlogCreate(repo); if(!blog) { alogf("Blog server could not be initialized\n"); return; } rc = RSSServerCreate(repo, &rss); if(rc < 0) { alogf("RSS server error: %s\n", sln_strerror(rc)); return; } if(init_http() < 0 || init_https() < 0) { HTTPServerClose(server_raw); HTTPServerClose(server_tls); return; } // SLNRepoPullsStart(repo); uv_signal_init(async_loop, sigint); uv_signal_start(sigint, stop, SIGINT); uv_unref((uv_handle_t *)sigint); }