time_t CheckIfAlreadySeen(const char *Facility, StrBuf *guid, time_t now, time_t antiexpire, eCheckType cType, long ccid, long ioid) { time_t InDBTimeStamp = 0; struct UseTable ut; struct cdbdata *cdbut; if (cType != eWrite) { SEEN_syslog(LOG_DEBUG, "Loading [%s]", ChrPtr(guid)); cdbut = cdb_fetch(CDB_USETABLE, SKEY(guid)); if ((cdbut != NULL) && (cdbut->ptr != NULL)) { memcpy(&ut, cdbut->ptr, ((cdbut->len > sizeof(struct UseTable)) ? sizeof(struct UseTable) : cdbut->len)); InDBTimeStamp = now - ut.ut_timestamp; if (InDBTimeStamp < antiexpire) { SEEN_syslog(LOG_DEBUG, "Found - Not expired %ld < %ld", InDBTimeStamp, antiexpire); cdb_free(cdbut); return InDBTimeStamp; } else { SEEN_syslog(LOG_DEBUG, "Found - Expired. %ld >= %ld", InDBTimeStamp, antiexpire); cdb_free(cdbut); } } else { if (cdbut) cdb_free(cdbut); SEENM_syslog(LOG_DEBUG, "not Found"); } if (cType == eCheckExist) return InDBTimeStamp; } memcpy(ut.ut_msgid, SKEY(guid)); ut.ut_timestamp = now; SEENM_syslog(LOG_DEBUG, "Saving new Timestamp"); /* rewrite the record anyway, to update the timestamp */ cdb_store(CDB_USETABLE, SKEY(guid), &ut, sizeof(struct UseTable) ); SEENM_syslog(LOG_DEBUG, "Done Saving"); return InDBTimeStamp; }
/* * Add an Internet e-mail address to the directory for a user */ int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) { char key[SIZ]; if (IsDirectory(internet_addr, 0) == 0) return 0; syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr); directory_key(key, internet_addr); cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 ); return 1; }
void cmd_rsen(char *argbuf) { char Token[SIZ]; long TLen; char Time[SIZ]; struct UseTable ut; struct cdbdata *cdbut; if (CtdlAccessCheck(ac_aide)) return; TLen = extract_token(Token, argbuf, 1, '|', sizeof Token); if (strncmp(argbuf, "GET", 3) == 0) { cdbut = cdb_fetch(CDB_USETABLE, Token, TLen); if (cdbut != NULL) { memcpy(&ut, cdbut->ptr, ((cdbut->len > sizeof(struct UseTable)) ? sizeof(struct UseTable) : cdbut->len)); cprintf("%d %ld\n", CIT_OK, ut.ut_timestamp); } else { cprintf("%d not found\n", ERROR + NOT_HERE); } } else if (strncmp(argbuf, "SET", 3) == 0) { memcpy(ut.ut_msgid, Token, TLen); extract_token(Time, argbuf, 2, '|', sizeof Time); ut.ut_timestamp = atol(Time); cdb_store(CDB_USETABLE, Token, TLen, &ut, sizeof(struct UseTable) ); cprintf("%d token updated\n", CIT_OK); } else if (strncmp(argbuf, "DEL", 3) == 0) { if (cdb_delete(CDB_USETABLE, Token, TLen)) cprintf("%d not found\n", ERROR + NOT_HERE); else cprintf("%d deleted.\n", CIT_OK); } else { cprintf("%d Usage: [GET|SET|DEL]|Token|timestamp\n", ERROR); } }
/* * Attach an OpenID to a Citadel account */ int attach_openid(struct ctdluser *who, StrBuf *claimed_id) { struct cdbdata *cdboi; long fetched_usernum; char *data; int data_len; char buf[2048]; if (!who) return(1); if (StrLength(claimed_id)==0) return(1); /* Check to see if this OpenID is already in the database */ cdboi = cdb_fetch(CDB_OPENID, ChrPtr(claimed_id), StrLength(claimed_id)); if (cdboi != NULL) { memcpy(&fetched_usernum, cdboi->ptr, sizeof(long)); cdb_free(cdboi); if (fetched_usernum == who->usernum) { syslog(LOG_INFO, "%s already associated; no action is taken", ChrPtr(claimed_id)); return(0); } else { syslog(LOG_INFO, "%s already belongs to another user", ChrPtr(claimed_id)); return(3); } } /* Not already in the database, so attach it now */ data_len = sizeof(long) + StrLength(claimed_id) + 1; data = malloc(data_len); memcpy(data, &who->usernum, sizeof(long)); memcpy(&data[sizeof(long)], ChrPtr(claimed_id), StrLength(claimed_id) + 1); cdb_store(CDB_OPENID, ChrPtr(claimed_id), StrLength(claimed_id), data, data_len); free(data); snprintf(buf, sizeof buf, "User <%s> (#%ld) has claimed the OpenID URL %s\n", who->fullname, who->usernum, ChrPtr(claimed_id)); CtdlAideMessage(buf, "OpenID claim"); syslog(LOG_INFO, "%s", buf); return(0); }
/* * Flush our index cache out to disk. */ void ft_flush_cache(void) { int i; time_t last_update = 0; for (i=0; i<65536; ++i) { if ((time(NULL) - last_update) >= 10) { syslog(LOG_INFO, "Flushing index cache to disk (%d%% complete)", (i * 100 / 65536) ); last_update = time(NULL); } if (ftc_msgs[i] != NULL) { cdb_store(CDB_FULLTEXT, &i, sizeof(int), ftc_msgs[i], (ftc_num_msgs[i] * sizeof(long))); ftc_num_msgs[i] = 0; free(ftc_msgs[i]); ftc_msgs[i] = NULL; } } syslog(LOG_INFO, "Flushed index cache to disk (100%% complete)"); }