Process a Dissemino webapp config XML document. This function is called once the XML document has been loaded, and the root node is found to be a <webappCfg> tag. Arguments: None

Return TypeFunction nameArguments
hzEcodehdsApp::ReadWebapp(hzXmlNode*,)

Declared in file: hzDissemino.h
Defined in file : hdsConfig.cpp

Function Logic:

0:START 1:unknown 2:items 3:Return E_CONFIG 4:items 5:unknown 6:unknown 7:m_Appname 8:ai.NameEQ(sslPvtKey) 9:m_SSL_PvtKey 10:ai.NameEQ(sslCert) 11:m_SSL_Cert 12:ai.NameEQ(sslCertCA) 13:m_SSL_CertCA 14:ai.NameEQ(domain) 15:m_Domain 16:ai.NameEQ(subdom) 17:subdom 18:ai.NameEQ(basedir) 19:basedir 20:ai.NameEQ(docroot) 21:m_Docroot 22:ai.NameEQ(configs) 23:m_Configdir 24:ai.NameEQ(datadir) 25:m_Datadir 26:ai.NameEQ(logroot) 27:m_Logroot 28:ai.NameEQ(cookieName) 29:cookieBase 30:ai.NameEQ(masterpath) 31:m_MasterPath 32:ai.NameEQ(masteruser) 33:m_MasterUser 34:ai.NameEQ(masterpass) 35:m_MasterPass 36:ai.NameEQ(smtpAddr) 37:m_SmtpAddr 38:ai.NameEQ(smtpUser) 39:m_SmtpUser 40:ai.NameEQ(smtpPass) 41:m_SmtpPass 42:ai.NameEQ(usernameFld) 43:m_UsernameFld 44:ai.NameEQ(userpassFld) 45:m_UserpassFld 46:ai.NameEQ(loghits) 47:m_AllHits 48:ai.NameEQ(language) 49:m_DefaultLang 50:ai.NameEQ(login) 51:items 52:ai.NameEQ(robot) 53:items 54:ai.NameEQ(siteGuide) 55:items 56:ai.NameEQ(siteIndex) 57:items 58:ai.NameEQ(portSTD) 59:items 60:ai.NameEQ(portSSL) 61:items 62:rc items 63:unknown 64:items 65:unknown 66:basedir 67:items basedir m_Docroot basedir m_Datadir basedir m_Logroot basedir m_Configdir 68:unknown 69:items 70:m_CookieName 71:unknown 72:unknown 73:rc items 74:unknown 75:rc items 76:unknown 77:rc items 78:unknown 79:rc items 80:unknown 81:rc items 82:unknown 83:rc items 84:unknown 85:rc items 86:unknown 87:rc items 88:unknown 89:Return rc 90:unknown 91:m_Configdir 92:unknown 93:pClass items items items items items rc 94:unknown 95:m_DefaultLang m_pDfltLang m_pDfltLang items 96:unknown 97:rc 98:unknown 99:items 100:Return E_NOINIT 101:unknown 102:rc 103:unknown 104:items 105:Return E_NOINIT 106:rc 107:unknown 108:Return hzerr(rc,Resource Initialization Failed) 109:m_Docroot 110:m_Images 111:unknown 112:unknown 113:rc 114:pN->NameEQ(rgxtype) 115:rc 116:pN->NameEQ(enum) 117:rc 118:pN->NameEQ(user) 119:rc 120:pN->NameEQ(class) 121:rc 122:pN->NameEQ(repos) 123:rc 124:pN->NameEQ(login) 125:rc 126:pN->NameEQ(logout) 127:rc 128:pN->NameEQ(xpage) 129:rc 130:pN->NameEQ(xstyle) 131:rc 132:pN->NameEQ(xinclude) 133:rc 134:pN->NameEQ(xscript) 135:rc 136:pN->NameEQ(xtreeDcl) 137:rc 138:pN->NameEQ(xfixfile) 139:rc 140:pN->NameEQ(xfixdir) 141:rc 142:pN->NameEQ(xmiscdir) 143:rc 144:pN->NameEQ(siteLanguages) 145:rc 146:pN->NameEQ(navigation) 147:rc 148:pN->NameEQ(xformHdl) 149:rc 150:pN->NameEQ(xformDef) 151:rc 152:pN->NameEQ(includeCfg) 153:items 154:unknown 155:unknown 156:p 157:ai.NameEQ(fname) 158:p 159:rc items 160:rc 161:pN->NameEQ(passive) 162:items 163:unknown 164:unknown 165:p 166:ai.NameEQ(htype) 167:p 168:rc items 169:unknown 170:rc items 171:unknown 172:rc items 173:unknown 174:items 175:pN->NameEQ(recaptcha) 176:unknown 177:unknown 178:m_KeyPublic 179:ai.NameEQ(private) 180:m_KeyPrivate 181:rc items 182:items 183:rc items items items 184:unknown 185:items 186:Return rc 187:unknown 188:m_DefaultLang 189:rc 190:unknown 191:items 192:Return E_WRITEFAIL 193:rc 194:unknown 195:items 196:Return E_WRITEFAIL 197:unknown 198:items rc 199:items 200:items 201:Return rc

Function body:

hzEcode hdsApp::ReadWebapp (hzXmlNode* pRoot)
{
   //  Category: Dissemino Application Configuration
   //  
   //  Process a Dissemino webapp config XML document. This function is called once the XML document has been loaded, and the root node is found to be a <webappCfg> tag.
   //  
   //  Arguments: None
   //  
   //  Returns: E_ARGUMENT If no XML node is supplied
   //     E_CONFIG If there are errors in the XML config
   //     E_OK  If the project config was read in
   _hzfunc("hdsApp::ReadWebapp") ;
   hzDocXml            X ;             //  The config document
   hzChain             Z ;             //  For robot.txt etc
   hzAttrset           ai ;            //  XML node attribute iterator
   hzXmlNode*          pN ;            //  Current node
   hdbClass*           pClass ;        //  Resource class
   hzPair              p ;             //  Misc name/value pair
   hzString            S ;             //  Intermeadiate string
   hzString            appname ;       //  Application name
   hzString            cookieBase ;    //  Cookie base name
   hzString            basedir ;       //  Base dir
   hzDomain            domain ;        //  Domain name
   hzDomain            subdom ;        //  Domain name
                                       //  uint32_t   n ;    // Resource counter
   hzEcode             rc = E_OK ;     //  Return code
   //  No base dir or project file?
   if (!pRoot->NameEQ("webappCfg"))
       { m_pLog->Log("Expected root tag of <webappCfg>. Tag <%s> disallowed\n", pRoot->txtName()) ; return E_CONFIG ; }
   m_pLog->Log("Obtained project's XML root %s\n", pRoot->txtName()) ;
   //  Get webapp params
   for (ai = pRoot ; ai.Valid() ; ai.Advance())
   {
       if      (ai.NameEQ("name"))         m_Appname       = ai.Value() ;
       else if (ai.NameEQ("sslPvtKey"))    m_SSL_PvtKey    = ai.Value() ;
       else if (ai.NameEQ("sslCert"))      m_SSL_Cert      = ai.Value() ;
       else if (ai.NameEQ("sslCertCA"))    m_SSL_CertCA    = ai.Value() ;
       else if (ai.NameEQ("domain"))       m_Domain        = ai.Value() ;
       else if (ai.NameEQ("subdom"))       subdom          = ai.Value() ;
       else if (ai.NameEQ("basedir"))      basedir         = ai.Value() ;
       else if (ai.NameEQ("docroot"))      m_Docroot       = ai.Value() ;
       else if (ai.NameEQ("configs"))      m_Configdir     = ai.Value() ;
       else if (ai.NameEQ("datadir"))      m_Datadir       = ai.Value() ;
       else if (ai.NameEQ("logroot"))      m_Logroot       = ai.Value() ;
       else if (ai.NameEQ("cookieName"))   cookieBase      = ai.Value() ;
       else if (ai.NameEQ("masterpath"))   m_MasterPath    = ai.Value() ;
       else if (ai.NameEQ("masteruser"))   m_MasterUser    = ai.Value() ;
       else if (ai.NameEQ("masterpass"))   m_MasterPass    = ai.Value() ;
       else if (ai.NameEQ("smtpAddr"))     m_SmtpAddr      = ai.Value() ;
       else if (ai.NameEQ("smtpUser"))     m_SmtpUser      = ai.Value() ;
       else if (ai.NameEQ("smtpPass"))     m_SmtpPass      = ai.Value() ;
       else if (ai.NameEQ("usernameFld"))  m_UsernameFld   = ai.Value() ;
       else if (ai.NameEQ("userpassFld"))  m_UserpassFld   = ai.Value() ;
       //  else if (ai.NameEQ("blacklist")) m_Blacklist  = ai.Value() ;
       else if (ai.NameEQ("loghits"))      m_AllHits       = ai.Value() ;
       else if (ai.NameEQ("language"))     m_DefaultLang   = ai.Value() ;
       else if (ai.NameEQ("login"))        m_OpFlags |= ai.ValEQ("true") ? DS_APP_SUBSCRIBERS : 0;
       else if (ai.NameEQ("robot"))        m_OpFlags |= ai.ValEQ("true") ? DS_APP_ROBOT : 0;
       else if (ai.NameEQ("siteGuide"))    m_OpFlags |= ai.ValEQ("true") ? DS_APP_GUIDE : 0;
       else if (ai.NameEQ("siteIndex"))    m_OpFlags |= ai.ValEQ("true") ? DS_APP_SITEINDEX : 0;
       else if (ai.NameEQ("portSTD"))      m_nPortSTD = ai.Value() ? atoi(ai.Value()) : 0;
       else if (ai.NameEQ("portSSL"))      m_nPortSSL = ai.Value() ? atoi(ai.Value()) : 0;
       else
       {
           rc = E_CONFIG ;
           m_pLog->Log("File %s Line %d <webappCfg> tag: Invalid param (%s=%s)\n", pRoot->Fname(), pRoot->Line(), ai.Name(), ai.Value()) ;
       }
   }
   if (basedir)
   {
       m_pLog->Log("Have basedir of %s\n", *basedir) ;
       if (basedir[basedir.Length()-1]!= CHAR_FWSLASH)
           basedir += "/" ;
       m_pLog->Log("Have basedir of %s\n", *basedir) ;
       m_Docroot = basedir + "docroot" ;
       m_Datadir = basedir + "data" ;
       m_Logroot = basedir + "logs" ;
       m_Configdir = basedir + "config" ;
   }
   if (cookieBase)
       SetCookieName(cookieBase) ;
   else
       m_CookieName = "_hz_dissemino_" ;
   if (rc == E_OK)
   {
       if (!m_Appname)     { rc = E_NOINIT ; m_pLog->Log("No Project/Application name\n") ; }
       if (!m_Domain)      { rc = E_NOINIT ; m_pLog->Log("No Project Domain\n") ; }
       if (!m_Docroot)     { rc = E_NOINIT ; m_pLog->Log("No document root directory\n") ; }
       if (!m_Datadir)     { rc = E_NOINIT ; m_pLog->Log("No data repos directory\n") ; }
       if (!m_Logroot)     { rc = E_NOINIT ; m_pLog->Log("No logs root directory\n") ; }
       if (!m_MasterUser)  { rc = E_NOINIT ; m_pLog->Log("No admin usename\n") ; }
       if (!m_MasterPass)  { rc = E_NOINIT ; m_pLog->Log("No admin password\n") ; }
       if (!m_DefaultLang) { rc = E_NOINIT ; m_pLog->Log("No default language\n") ; }
       //  if (!m_nPortSTD) { rc = E_NOINIT ; m_pLog->Log("No port specified\n") ; }
   }
   if (rc != E_OK)
       return rc ;
   if (!m_Configdir)
       m_Configdir = m_Docroot ;
   //  Hit recorder?
   if (m_AllHits)
   {
       //  Set up the hits repository
       pClass = new hdbClass(m_ADP, HDB_CLASS_DESIG_SYS) ;
       pClass->InitStart(m_AllHits) ;
       pClass->InitMember("tdstamp",   datatype_XDATE,     HDB_MBR_POP_SINGLE_COMPULSORY) ;
       pClass->InitMember("ipaddr",    datatype_IPADDR,    HDB_MBR_POP_SINGLE_COMPULSORY) ;
       pClass->InitMember("url",       datatype_STRING,    HDB_MBR_POP_SINGLE_COMPULSORY) ;
       pClass->InitDone() ;
       rc = m_ADP.RegisterDataClass(pClass) ;
   }
   //  If no default language, set to en-US
   if (!m_pDfltLang)
   {
       m_DefaultLang = "en-US" ;
       m_pDfltLang = new hdsLang() ;
       m_pDfltLang->m_Code = m_DefaultLang ;
       m_Languages.Insert(m_pDfltLang->m_Code, m_pDfltLang) ;
   }
   //  Set up the subscriber class and repository
   if (m_OpFlags & DS_APP_SUBSCRIBERS)
   {
       rc = m_ADP.InitSubscribers(m_Datadir) ;
       if (rc != E_OK)
           { m_pLog->Log("The subscriber cache is not found in the ADP\n") ; return E_NOINIT ; }
   }
   //  Set up the siteindex
   if (m_OpFlags & DS_APP_SITEINDEX)
   {
       rc = m_ADP.InitSiteIndex(m_Datadir) ;
       if (rc != E_OK)
           { m_pLog->Log("The subscriber cache is not found in the ADP\n") ; return E_NOINIT ; }
   }
   //  Set up the app resources database
   rc = InitResources() ;
   if (rc != E_OK)
       return hzerr(rc, "Resource Initialization Failed") ;
   m_Images = m_Docroot + "/img" ;
   //  Read in XML
   for (pN = pRoot->GetFirstChild() ; rc == E_OK && pN ; pN = pN->Sibling())
   {
       if      (pN->NameEQ("fldspec"))         rc = _readFldspec(pN) ;
       else if (pN->NameEQ("rgxtype"))         rc = _readRgxType(pN) ;
       else if (pN->NameEQ("enum"))            rc = _readDataEnum(pN) ;
       else if (pN->NameEQ("user"))            rc = _readUser(pN) ;
       else if (pN->NameEQ("class"))           rc = _readClass(pN) ;
       else if (pN->NameEQ("repos"))           rc = _readRepos(pN) ;
       else if (pN->NameEQ("login"))           rc = _readStdLogin(pN) ;
       else if (pN->NameEQ("logout"))          rc = _readLogout(pN) ;
       else if (pN->NameEQ("xpage"))           rc = _readPage(pN) ;
       else if (pN->NameEQ("xstyle"))          rc = _readCSS(pN) ;
       else if (pN->NameEQ("xinclude"))        rc = _readInclude(pN, 0,0);
       else if (pN->NameEQ("xscript"))         rc = _readScript(pN) ;
       else if (pN->NameEQ("xtreeDcl"))        rc = _readXtreeDcl(pN, 0);
       else if (pN->NameEQ("xfixfile"))        rc = _readFixFile(pN) ;
       else if (pN->NameEQ("xfixdir"))         rc = _readFixDir(pN) ;
       else if (pN->NameEQ("xmiscdir"))        rc = _readMiscDir(pN) ;
       else if (pN->NameEQ("siteLanguages"))   rc = _readSiteLangs(pN) ;
       else if (pN->NameEQ("navigation"))      rc = _readNav(pN) ;
       else if (pN->NameEQ("xformHdl"))        rc = _readFormHdl(pN) ;
       else if (pN->NameEQ("xformDef"))        rc = _readFormDef(pN) ;
       else if (pN->NameEQ("includeCfg"))
       {
           //  Get directory and filename for included file
           p.Clear() ;
           for (ai = pN ; ai.Valid() ; ai.Advance())
           {
               if      (ai.NameEQ("dir"))      p.name = ai.Value() ;
               else if (ai.NameEQ("fname"))    p.value = ai.Value() ;
               else
               {
                   rc = E_CONFIG ;
                   m_pLog->Log("File %s Line %d Reading <include> tag: Invalid param (%s=%s)\n", pN->Fname(), pN->Line(), ai.Name(), ai.Value()) ;
               }
           }
           rc = _loadInclFile(p.name, p.value) ;
       }
       else if (pN->NameEQ("passive"))
       {
           p.Clear() ;
           for (ai = pN ; ai.Valid() ; ai.Advance())
           {
               if      (ai.NameEQ("files"))    p.name = ai.Value() ;
               else if (ai.NameEQ("htype"))    p.value = ai.Value() ;
               else
               {
                   rc = E_CONFIG ;
                   m_pLog->Log("File %s Line %d Reading <passive> tag: Invalid param (%s=%s)\n", pN->Fname(), pN->Line(), ai.Name(), ai.Value()) ;
               }
           }
           if (!p.name)    { rc = E_CONFIG ; m_pLog->Log("File %s Line %d <passive> No files specified\n", pN->Fname(), pN->Line()) ; }
           if (!p.value)   { rc = E_CONFIG ; m_pLog->Log("File %s Line %d <passive> No HTML type specified\n", pN->Fname(), pN->Line()) ; }
           if (rc == E_OK)
               m_Passives.Add(p) ;
       }
       else if (pN->NameEQ("recaptcha"))
       {
           for (ai = pN ; ai.Valid() ; ai.Advance())
           {
               if      (ai.NameEQ("public"))   m_KeyPublic = ai.Value() ;
               else if (ai.NameEQ("private"))  m_KeyPrivate = ai.Value() ;
               else
               {
                   rc = E_CONFIG ;
                   m_pLog->Log("File %s Line %d Reading <recaptcha> tag: Invalid param (%s=%s)\n", pN->Fname(), pN->Line(), ai.Name(), ai.Value()) ;
               }
           }
           m_pLog->Log("File %s Line %d Set Google Recaptcha keys to public %s private %s\n", pN->Fname(), pN->Line(), *m_KeyPublic, *m_KeyPrivate) ;
       }
       else
       {
           rc = E_CONFIG ;
           m_pLog->Log("File %s Line %d tag <%s> unexpected. Only the following are allowed\n", pN->Fname(), pN->Line(), pN->txtName()) ;
           m_pLog->Out("\tfldspec|rgxtype|enum|user|class|repos|login|logout|xpage|xstyle|xinclude|xscript|xtreeDcl|xfixfile|xfixdir|xmiscdir OR\n") ;
           m_pLog->Out("\tsiteLanguages|navigation|initstate|xformHdl|xformDef|includeCfg|passive|recaptcha\n") ;
       }
   }
   if (rc != E_OK)
   {
       m_pLog->Log("Aborted in config. Err=%s\n", Err2Txt(rc)) ;
       //  m_pLog->Log(m_cfgErr) ;
       return rc ;
   }
   /*
   **  ** Set up the subscriber class and repository
   **      */
   //  If no default language, set to en-US
   if (!m_DefaultLang)
       m_DefaultLang = "en-US" ;
   //  Assert the document root
   rc = AssertDir(m_Docroot, 0777);
   if (rc != E_OK)
       { m_pLog->Log("Cannot assert document root %s\n", *m_Docroot) ; return E_WRITEFAIL ; }
   //  Assert the data directory
   rc = AssertDir(m_Datadir, 0777);
   if (rc != E_OK)
       { m_pLog->Log("Cannot assert data directory %s\n", *m_Datadir) ; return E_WRITEFAIL ; }
   if (chdir(*m_Docroot) < 0)
   {
       m_pLog->Log("Cannot CD to docroot [%s]\n", *m_Docroot) ;
       rc = E_NOINIT ;
   }
   else
       m_pLog->Log("Now operating in docroot [%s]\n", *m_Docroot) ;
   //  if (rc == E_OK)
   //   ImportStrings() ;
   m_pLog->Log("Status=%s\n", Err2Txt(rc)) ;
   return rc ;
}