| 1996 | | } |
| 1997 | | else |
| 1998 | | { |
| 1999 | | char cParam1Save[101]={""}; |
| 2000 | | char cParam1Temp[101]={""}; |
| 2001 | | |
| 2002 | | sprintf(cParam1Save,"%.100s",cParam1); |
| 2003 | | //converts, eliminates illegal chars. |
| 2004 | | //helpers try to format for you...lol |
| 2005 | | FQDomainName(cParam1); |
| 2006 | | |
| 2007 | | //Ticket #323 CNAME record pointing to itself |
| 2008 | | if(!strcmp(cName,cParam1) || !strcmp(cZone,cParam1)) |
| 2009 | | { |
| 2010 | | gcMessage="<blink>Can't create a CNAME record pointing to itself</blink>"; |
| 2011 | | cParam1Style="type_fields_req"; |
| 2012 | | cNameStyle="type_fields_req"; |
| 2013 | | htmlResourceWizard(uStep); |
| 2014 | | } |
| 2015 | | if(strchr(cParam1,'.')) |
| 2016 | | { |
| 2017 | | //FQDN |
| 2018 | | //Missing trailing dot |
| 2019 | | if(cParam1[strlen(cParam1)-1]!='.') |
| 2020 | | { |
| 2021 | | sprintf(cParam1Temp,"%.100s.",cParam1); |
| 2022 | | sprintf(cParam1,"%.99s",cParam1Temp); |
| 2023 | | } |
| 2024 | | if(strcmp(cParam1,cParam1Save)) |
| 2025 | | { |
| 2026 | | sprintf(gcQuery, |
| 2027 | | "<blink>%s was changed check/fix</blink>", |
| 2028 | | cParam1Label); |
| 2029 | | gcMessage=gcQuery; |
| 2030 | | cParam1Style="type_fields_req"; |
| 2031 | | htmlResourceWizard(uStep); |
| 2032 | | } |
| 2033 | | } |
| 2034 | | else |
| 2035 | | { |
| 2036 | | //Not FQDN, but internal zone member or another zone? |
| 2037 | | |
| 2038 | | //TODO |
| 2039 | | //Advanced help not implemented yet. |
| 2040 | | //Check in this zone for A record. Should not be another CNAME. |
| 2041 | | //Check in tZone |
| 2042 | | |
| 2043 | | if(cParam1[strlen(cParam1)-1]!='.') |
| 2044 | | { |
| 2045 | | sprintf(cParam1Temp,"%.49s.%.49s.",cParam1,cZone); |
| 2046 | | sprintf(cParam1,"%.99s",cParam1Temp); |
| 2047 | | } |
| 2048 | | if(strcmp(cParam1,cParam1Save)) |
| 2049 | | { |
| 2050 | | sprintf(gcQuery, |
| 2051 | | "<blink>%s was changed check/fix</blink>", |
| 2052 | | cParam1Label); |
| 2053 | | gcMessage=gcQuery; |
| 2054 | | cParam1Style="type_fields_req"; |
| 2055 | | htmlResourceWizard(uStep); |
| 2056 | | } |
| 2057 | | } |
| 2058 | | |
| 2059 | | } |
| 2060 | | } |
| 2061 | | else if(!strcmp(cRRType,"A")) |
| 2062 | | { |
| 2063 | | |
| 2064 | | if(!strcmp(cZone+strlen(cZone)-5,".arpa")) |
| 2065 | | { |
| 2066 | | gcMessage="<blink>Can not add A records to arpa zones</blink>"; |
| 2067 | | |
| 2068 | | htmlResourceWizard(uStep); |
| 2069 | | } |
| 2070 | | sscanf(cParam1,"%u.%u.%u.%u",&a,&b,&c,&d); |
| 2071 | | if(a>254) a=0; |
| 2072 | | if(b>254) b=0; |
| 2073 | | if(c>255) c=0; |
| 2074 | | if(d>254) d=0; |
| 2075 | | |
| 2076 | | sprintf(cParam1,"%u.%u.%u.%u",a,b,c,d); |
| 2077 | | |
| 2078 | | cParam2[0]=0; |
| 2079 | | if(!a || !d) |
| 2080 | | { |
| 2081 | | sprintf(gcQuery, |
| 2082 | | "<blink>Invalid IP Number for %s</blink>", |
| 2083 | | cParam1Label); |
| 2084 | | gcMessage=gcQuery; |
| 2085 | | cParam1Style="type_fields_req"; |
| 2086 | | htmlResourceWizard(uStep); |
| 2087 | | } |
| 2088 | | if(uRRExists(cZone,cRRType,cName,cParam1)) |
| 2089 | | { |
| 2090 | | gcMessage="<blink>Resource record already exists</blink>"; |
| 2091 | | cParam1Style="type_fields_req"; |
| 2092 | | htmlResourceWizard(uStep); |
| 2093 | | } |
| 2094 | | } |
| 2095 | | else if(!strcmp(cRRType,"PTR")) |
| 2096 | | { |
| 2097 | | unsigned uPtr=0; |
| 2098 | | unsigned uPtrLen=strlen(cName); |
| 2099 | | //We only allow simple classC in-addr PTR |
| 2100 | | if(strstr(cZone,"in-addr.arpa")) |
| 2101 | | { |
| 2102 | | sscanf(cName,"%u",&uPtr); |
| 2103 | | sprintf(cName,"%u",uPtr); |
| 2104 | | |
| 2105 | | if(!uPtr) |
| 2106 | | { |
| 2107 | | sprintf(gcQuery,"<blink>Class-C in-addr.arpa zone PTR must be the last octet of rev dns IP</blink>"); |
| 2108 | | gcMessage=gcQuery; |
| 2109 | | cNameStyle="type_fields_req"; |
| 2110 | | htmlResourceWizard(uStep); |
| 2111 | | } |
| 2112 | | |
| 2113 | | if(uPtr>254) |
| 2114 | | { |
| 2115 | | sprintf(gcQuery,"<blink>PTR value out of range (1-254 allowed only)</blink>"); |
| 2116 | | gcMessage=gcQuery; |
| 2117 | | cNameStyle="type_fields_req"; |
| 2118 | | htmlResourceWizard(uStep); |
| 2119 | | } |
| 2120 | | |
| 2121 | | if(uPtrLen!=strlen(cName)) |
| 2122 | | { |
| 2123 | | sprintf(gcQuery,"<blink>PTR was changed check</blink>"); |
| 2124 | | gcMessage=gcQuery; |
| 2125 | | cNameStyle="type_fields_req"; |
| 2126 | | htmlResourceWizard(uStep); |
| 2127 | | } |
| 2128 | | |
| 2129 | | sscanf(cZone,"%u.%u.%u.in-adddr.arpa",&c,&b,&a); |
| 2130 | | if(!a) |
| 2131 | | { |
| 2132 | | sprintf(gcQuery, |
| 2133 | | "<blink>Unexpected in-addr.arpa zone name format</blink>"); |
| 2134 | | gcMessage=gcQuery; |
| 2135 | | cNameStyle="type_fields_req"; |
| 2136 | | htmlResourceWizard(uStep); |
| 2137 | | } |
| 2138 | | |
| 2139 | | if(uRRExists(cZone,cRRType,cName,cParam1)) |
| 2140 | | { |
| 2141 | | gcMessage="<blink>Resource record already exists</blink>"; |
| 2142 | | cNameStyle="type_fields_req"; |
| 2143 | | htmlResourceWizard(uStep); |
| 2144 | | } |
| 2145 | | |
| 2146 | | sprintf(cParam2,"%u.%u.%u.%u",a,b,c,uPtr); |
| 2147 | | if(!InMyBlocks(cParam2)) |
| 2148 | | { |
| 2149 | | gcMessage="<blink>IP Number not in any of your IP blocks</blink>"; |
| 2150 | | cNameStyle="type_fields_req"; |
| 2151 | | htmlResourceWizard(1); |
| 2152 | | } |
| 2153 | | cParam2[0]=0;//Was just a temp place holder |
| 2154 | | } |
| 2155 | | |
| 2156 | | //Non arpa PTR records. Should we allow? |
| 2157 | | cParam2[0]=0; |
| 2158 | | FQDomainName(cParam1); |
| 2159 | | if(!cParam1[0]) |
| 2160 | | { |
| 2161 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam1Label); |
| 2162 | | gcMessage=gcQuery; |
| 2163 | | cParam1Style="type_fields_req"; |
| 2164 | | htmlResourceWizard(uStep); |
| 2165 | | } |
| 2166 | | if(cParam1[strlen(cParam1)-1]!='.') strcat(cParam1,"."); |
| 2167 | | } |
| 2168 | | else if(!strcmp(cRRType,"MX")) |
| 2169 | | { |
| 2170 | | if(!strcmp(cZone+strlen(cZone)-5,".arpa")) |
| 2171 | | { |
| 2172 | | gcMessage="<blink>Can not add MX records to arpa zones</blink>"; |
| 2173 | | cRRTypeStyle="type_fields_req"; |
| 2174 | | htmlResourceWizard(uStep); |
| 2175 | | } |
| 2176 | | sscanf(cParam1,"%u",&a); |
| 2177 | | sprintf(cParam1,"%u",a); |
| 2178 | | if(!a || a>1000) |
| 2179 | | { |
| 2180 | | sprintf(gcQuery,"<blink>Invalid MX Priority Number for %s</blink>", |
| 2181 | | cParam1Label); |
| 2182 | | gcMessage=gcQuery; |
| 2183 | | cParam1Style="type_fields_req"; |
| 2184 | | htmlResourceWizard(uStep); |
| 2185 | | } |
| 2186 | | FQDomainName(cParam2); |
| 2187 | | if(!cParam2[0]) |
| 2188 | | { |
| 2189 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam2Label); |
| 2190 | | gcMessage=gcQuery; |
| 2191 | | cParam2Style="type_fields_req"; |
| 2192 | | htmlResourceWizard(uStep); |
| 2193 | | } |
| 2194 | | if(cParam2[strlen(cParam2)-1]!='.') strcat(cParam2,"."); |
| 2195 | | } |
| 2196 | | else if(!strcmp(cRRType,"NS")) |
| 2197 | | { |
| 2198 | | //All cases |
| 2199 | | cParam2[0]=0; |
| 2200 | | if(!cParam1[0]) |
| 2201 | | { |
| 2202 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam1Label); |
| 2203 | | gcMessage=gcQuery; |
| 2204 | | cParam1Style="type_fields_req"; |
| 2205 | | htmlResourceWizard(uStep); |
| 2206 | | } |
| 2207 | | FQDomainName(cParam1); |
| 2208 | | if(cParam1[strlen(cParam1)-1]!='.') strcat(cParam1,"."); |
| 2209 | | |
| 2210 | | if(strcmp(cZone+strlen(cZone)-5,".arpa")) |
| 2211 | | { |
| 2212 | | sprintf(cName,"%.255s.",cZone); |
| 2213 | | } |
| 2214 | | //else no other rules for arpa zone for now TODO |
| 2215 | | } |
| 2216 | | else if(!strcmp(cRRType,"HINFO")) |
| 2217 | | { |
| 2218 | | if(!cParam1[0]) |
| 2219 | | { |
| 2220 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam1Label); |
| 2221 | | gcMessage=gcQuery; |
| 2222 | | cParam1Style="type_fields_req"; |
| 2223 | | htmlResourceWizard(uStep); |
| 2224 | | } |
| 2225 | | if(cParam1[0]!='"' && cParam1[strlen(cParam1)-1]!='"') |
| 2226 | | { |
| 2227 | | sprintf(gcQuery,"\"%.4095s\"",cParam1); |
| 2228 | | sprintf(cParam1,"%.99s",gcQuery); |
| 2229 | | } |
| 2230 | | |
| 2231 | | if(!cParam2[0]) |
| 2232 | | { |
| 2233 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam2Label); |
| 2234 | | gcMessage=gcQuery; |
| 2235 | | cParam2Style="type_fields_req"; |
| 2236 | | htmlResourceWizard(uStep); |
| 2237 | | } |
| 2238 | | if(cParam2[0]!='"' && cParam1[strlen(cParam2)-1]!='"') |
| 2239 | | { |
| 2240 | | sprintf(gcQuery,"\"%.4095s\"",cParam2); |
| 2241 | | sprintf(cParam2,"%.99s",gcQuery); |
| 2242 | | } |
| 2243 | | } |
| 2244 | | else if(!strcmp(cRRType,"TXT")) |
| 2245 | | { |
| 2246 | | char *cp; |
| 2247 | | |
| 2248 | | cParam2[0]=0; |
| 2249 | | if(!cParam1[0]) |
| 2250 | | { |
| 2251 | | sprintf(gcQuery,"<blink>%s is required</blink>",cParam1Label); |
| 2252 | | gcMessage=gcQuery; |
| 2253 | | cParam1Style="type_fields_req"; |
| 2254 | | htmlResourceWizard(uStep); |
| 2255 | | } |
| 2256 | | if(cParam1[0]!='"' && cParam1[strlen(cParam1)-1]!='"') |
| 2257 | | { |
| 2258 | | sprintf(gcQuery,"\"%.4095s\"",cParam1); |
| 2259 | | sprintf(cParam1,"%.99s",gcQuery); |
| 2260 | | } |
| 2261 | | else if(cParam1[0]!='"' && cParam1[strlen(cParam1)-1]=='"') |
| 2262 | | { |
| 2263 | | sprintf(gcQuery,"\"%.4095s",cParam1); |
| 2264 | | sprintf(cParam1,"%.99s",gcQuery); |
| 2265 | | } |
| 2266 | | else if(cParam1[0]=='"' && cParam1[strlen(cParam1)-1]!='"') |
| 2267 | | { |
| 2268 | | sprintf(gcQuery,"%.4095s\"",cParam1); |
| 2269 | | sprintf(cParam1,"%.99s",gcQuery); |
| 2270 | | } |
| 2271 | | else if((cp=strchr(cParam1+1,'"'))) |
| 2272 | | { |
| 2273 | | if(cp!=cParam1+strlen(cParam1)-1) |
| 2274 | | { |
| 2275 | | sprintf(gcQuery,"<blink>Stray \" in TXT value</blink>"); |
| 2276 | | gcMessage=gcQuery; |
| 2277 | | cParam1Style="type_fields_req"; |
| 2278 | | htmlResourceWizard(uStep); |
| 2279 | | } |
| 2280 | | } |
| 2281 | | |
| 2282 | | } |
| 2283 | | else if(1) |
| 2284 | | { |
| 2285 | | gcMessage="<blink>Must select valid Resource Type (A,MX,PTR,TXT,NS,CNAME,HINFO)</blink>"; |
| 2286 | | cRRTypeStyle="type_fields_req"; |
| 2287 | | htmlResourceWizard(uStep); |
| 2288 | | } |
| 2289 | | |