X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fnetconfig.c;h=e59337f2740cb4b96f0d99ce2834fa88a384b1c6;hb=83f6f54ff172d43c9ab0fab87b10280d0c99ccec;hp=239ab731d06842069149011b281cb4ed28690c92;hpb=924b8cd997f56b68e16fa1dfc1be55722596f5d8;p=citadel.git diff --git a/citadel/netconfig.c b/citadel/netconfig.c index 239ab731d..e59337f27 100644 --- a/citadel/netconfig.c +++ b/citadel/netconfig.c @@ -1,8 +1,7 @@ /* - * This module handles shared rooms, inter-Citadel mail, and outbound - * mailing list processing. + * This module handles loading, saving, and parsing of room network configurations. * - * Copyright (c) 2000-2016 by the citadel.org team + * Copyright (c) 2000-2017 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 3. @@ -27,6 +26,7 @@ # endif #endif #include +#include #include @@ -57,8 +57,9 @@ void RegisterRoomCfgType(const char* Name, long len, RoomNetCfg eCfg, CfgLinePar pCfg->Str.len = len; pCfg->IsSingleLine = uniq; pCfg->nSegments = nSegments; - if (CfgTypeHash == NULL) + if (CfgTypeHash == NULL) { CfgTypeHash = NewHash(1, NULL); + } Put(CfgTypeHash, Name, len, pCfg, NULL); } @@ -77,6 +78,7 @@ const CfgLineType *GetCfgTypeByStr(const char *Key, long len) } } + const CfgLineType *GetCfgTypeByEnum(RoomNetCfg eCfg, HashPos *It) { const char *Key; @@ -94,6 +96,7 @@ const CfgLineType *GetCfgTypeByEnum(RoomNetCfg eCfg, HashPos *It) return NULL; } + void ParseGeneric(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *OneRNCfg) { RoomNetCfgLine *nptr; @@ -120,6 +123,7 @@ void ParseGeneric(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRNCfg->NetConfigs[ThisOne->C] = nptr; } + void SerializeGeneric(const CfgLineType *ThisOne, StrBuf *OutputBuffer, OneRoomNetCfg *OneRNCfg, RoomNetCfgLine *data) { int i; @@ -135,6 +139,7 @@ void SerializeGeneric(const CfgLineType *ThisOne, StrBuf *OutputBuffer, OneRoomN StrBufAppendBufPlain(OutputBuffer, HKEY("\n"), 0); } + void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data) { int i; @@ -151,6 +156,7 @@ void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data) *data = NULL; } + RoomNetCfgLine *DuplicateOneGenericCfgLine(const RoomNetCfgLine *data) { int i; @@ -180,7 +186,6 @@ void netcfg_keyname(char *keybuf, long roomnum) } - /* * Given a room number and a textual netconfig, convert to base64 and write to the configdb */ @@ -200,14 +205,13 @@ void write_netconfig_to_configdb(long roomnum, const char *raw_netconfig) if ((enc_len > 1) && (enc[enc_len-2] == 13)) enc[enc_len-2] = 0; if ((enc_len > 0) && (enc[enc_len-1] == 10)) enc[enc_len-1] = 0; enc[enc_len] = 0; - syslog(LOG_DEBUG, "Writing key '%s' (length=%d)", keyname, enc_len); + syslog(LOG_DEBUG, "netconfig: writing key '%s' (length=%d)", keyname, enc_len); CtdlSetConfigStr(keyname, enc); free(enc); } } - /* * Given a room number, attempt to load the netconfig configdb entry for that room. * If it returns NULL, there is no netconfig. @@ -235,12 +239,13 @@ char *LoadRoomNetConfigFile(long roomnum) OneRoomNetCfg *ParseRoomNetConfigFile(char *serialized_data) { const char *Pos = NULL; - const char *CPos = NULL; const CfgLineType *pCfg = NULL; StrBuf *Line = NULL; StrBuf *InStr = NULL; StrBuf *Cfg = NULL; OneRoomNetCfg *OneRNCfg = NULL; + int num_lines = 0; + int i = 0; OneRNCfg = malloc(sizeof(OneRoomNetCfg)); memset(OneRNCfg, 0, sizeof(OneRoomNetCfg)); @@ -248,9 +253,10 @@ OneRoomNetCfg *ParseRoomNetConfigFile(char *serialized_data) Line = NewStrBuf(); InStr = NewStrBuf(); Cfg = NewStrBufPlain(serialized_data, -1); + num_lines = num_tokens(ChrPtr(Cfg), '\n'); - while (StrBufSipLine(Line, Cfg, &CPos)) { - + for (i=0; i 0) { Pos = NULL; StrBufExtract_NextToken(InStr, Line, &Pos, '|'); @@ -297,20 +303,21 @@ void SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCfg, long roomnum) { const CfgLineType *pCfg; pCfg = GetCfgTypeByEnum(eCfg, CfgIt); - if (pCfg->IsSingleLine) - { - pCfg->Serializer(pCfg, OutBuffer, OneRNCfg, NULL); - } - else + if (pCfg) { - RoomNetCfgLine *pName = OneRNCfg->NetConfigs[pCfg->C]; - while (pName != NULL) + if (pCfg->IsSingleLine) + { + pCfg->Serializer(pCfg, OutBuffer, OneRNCfg, NULL); + } + else { - pCfg->Serializer(pCfg, OutBuffer, OneRNCfg, pName); - pName = pName->next; + RoomNetCfgLine *pName = OneRNCfg->NetConfigs[pCfg->C]; + while (pName != NULL) + { + pCfg->Serializer(pCfg, OutBuffer, OneRNCfg, pName); + pName = pName->next; + } } - - } } @@ -327,7 +334,6 @@ void SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCfg, long roomnum) } - void AddRoomCfgLine(OneRoomNetCfg *OneRNCfg, struct ctdlroom *qrbuf, RoomNetCfg LineType, RoomNetCfgLine *Line) { RoomNetCfgLine **pLine; @@ -429,7 +435,11 @@ void cmd_gnet(char *argbuf) char *c = LoadRoomNetConfigFile(CC->room.QRnumber); if (c) { - cprintf("%s\n", c); + int len = strlen(c); + client_write(c, len); // Can't use cprintf() here, it has a limit of 1024 bytes + if (c[len] != '\n') { + client_write(HKEY("\n")); + } free(c); } cprintf("000\n"); @@ -476,6 +486,7 @@ void DeleteCtdlNodeConf(void *vNode) free(Node); } + CtdlNodeConf *NewNode(StrBuf *SerializedNode) { const char *Pos = NULL; @@ -576,11 +587,7 @@ int is_recipient(OneRoomNetCfg *RNCfg, const char *Name) } - -int CtdlNetconfigCheckRoomaccess( - char *errmsgbuf, - size_t n, - const char* RemoteIdentifier) +int CtdlNetconfigCheckRoomaccess(char *errmsgbuf, size_t n, const char* RemoteIdentifier) { OneRoomNetCfg *RNCfg; int found; @@ -615,7 +622,6 @@ int CtdlNetconfigCheckRoomaccess( } - /* * cmd_netp() - authenticate to the server as another Citadel node polling * for network traffic @@ -628,8 +634,6 @@ void cmd_netp(char *cmdbuf) StrBuf *NodeStr; long nodelen; int v; - long lens[2]; - const char *strs[2]; const StrBuf *secret = NULL; const StrBuf *nexthop = NULL; @@ -647,22 +651,9 @@ void cmd_netp(char *cmdbuf) "An unknown Citadel server called \"%s\" attempted to connect from %s [%s].\n", node, CCC->cs_host, CCC->cs_addr ); - syslog(LOG_WARNING, "%s", err_buf); + syslog(LOG_WARNING, "netconfig: %s", err_buf); cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED); - - strs[0] = CCC->cs_addr; - lens[0] = strlen(CCC->cs_addr); - - strs[1] = "SRV_UNKNOWN"; - lens[1] = sizeof("SRV_UNKNOWN") - 1; - - CtdlAideFPMessage( - err_buf, - "IGNet Networking.", - 2, strs, (long*) &lens, - CCC->cs_pid, 0, - time(NULL)); - + CtdlAideMessage(err_buf, "IGNet Networking"); DeleteHash(&working_ignetcfg); FreeStrBuf(&NodeStr); return; @@ -674,30 +665,17 @@ void cmd_netp(char *cmdbuf) "A Citadel server at %s [%s] failed to authenticate as network node \"%s\".\n", CCC->cs_host, CCC->cs_addr, node ); - syslog(LOG_WARNING, "%s", err_buf); + syslog(LOG_WARNING, "netconfig: %s", err_buf); cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED); - strs[0] = CCC->cs_addr; - lens[0] = strlen(CCC->cs_addr); - - strs[1] = "SRV_PW"; - lens[1] = sizeof("SRV_PW") - 1; - - CtdlAideFPMessage( - err_buf, - "IGNet Networking.", - 2, strs, - (long*) &lens, - CCC->cs_pid, 0, - time(NULL)); - + CtdlAideMessage(err_buf, "IGNet Networking"); DeleteHash(&working_ignetcfg); FreeStrBuf(&NodeStr); return; } if (CtdlNetworkTalkingTo(node, nodelen, NTT_CHECK)) { - syslog(LOG_WARNING, "Duplicate session for network node <%s>", node); + syslog(LOG_WARNING, "netconfig: duplicate session for network node <%s>", node); cprintf("%d Already talking to %s right now\n", ERROR + RESOURCE_BUSY, node); DeleteHash(&working_ignetcfg); FreeStrBuf(&NodeStr); @@ -705,7 +683,7 @@ void cmd_netp(char *cmdbuf) } nodelen = safestrncpy(CCC->net_node, node, sizeof CCC->net_node); CtdlNetworkTalkingTo(CCC->net_node, nodelen, NTT_ADD); - syslog(LOG_NOTICE, "Network node <%s> logged in from %s [%s]", + syslog(LOG_INFO, "netconfig: network node <%s> logged in from %s [%s]", CCC->net_node, CCC->cs_host, CCC->cs_addr ); cprintf("%d authenticated as network node '%s'\n", CIT_OK, CCC->net_node); @@ -726,6 +704,7 @@ void DeleteNetMap(void *vNetMap) free(TheNetMap); } + CtdlNetMap *NewNetMap(StrBuf *SerializedNetMap) { const char *Pos = NULL; @@ -747,6 +726,7 @@ CtdlNetMap *NewNetMap(StrBuf *SerializedNetMap) return NM; } + HashList* CtdlReadNetworkMap(void) { const char *LinePos; @@ -780,6 +760,7 @@ HashList* CtdlReadNetworkMap(void) return Hash; } + StrBuf *CtdlSerializeNetworkMap(HashList *Map) { void *vMap; @@ -864,7 +845,7 @@ int CtdlIsValidNode(const StrBuf **nexthop, * First try the neighbor nodes */ if (GetCount(IgnetCfg) == 0) { - syslog(LOG_INFO, "IgnetCfg is empty!"); + syslog(LOG_INFO, "netconfig: IgnetCfg is empty!"); if (nexthop != NULL) { *nexthop = NULL; } @@ -896,7 +877,7 @@ int CtdlIsValidNode(const StrBuf **nexthop, /* * If we get to this point, the supplied node name is bogus. */ - syslog(LOG_ERR, "Invalid node name <%s>", ChrPtr(node)); + syslog(LOG_ERR, "netconfig: invalid node name <%s>", ChrPtr(node)); return(-1); } @@ -917,7 +898,7 @@ void convert_legacy_netcfg_files(void) dh = opendir(ctdl_netcfg_dir); if (!dh) return; - syslog(LOG_INFO, "Legacy netconfig files exist - converting them!"); + syslog(LOG_INFO, "netconfig: legacy netconfig files exist - converting them!"); while (dit = readdir(dh), dit != NULL) { // yes, we use the non-reentrant version; we're not in threaded mode yet roomnum = atol(dit->d_name); @@ -951,7 +932,6 @@ void convert_legacy_netcfg_files(void) } - /* * Module entry point */