Server.c 249 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032
  1. // SoftEther VPN Source Code
  2. // Cedar Communication Module
  3. //
  4. // SoftEther VPN Server, Client and Bridge are free software under GPLv2.
  5. //
  6. // Copyright (c) 2012-2014 Daiyuu Nobori.
  7. // Copyright (c) 2012-2014 SoftEther VPN Project, University of Tsukuba, Japan.
  8. // Copyright (c) 2012-2014 SoftEther Corporation.
  9. //
  10. // All Rights Reserved.
  11. //
  12. // http://www.softether.org/
  13. //
  14. // Author: Daiyuu Nobori
  15. // Comments: Tetsuo Sugiyama, Ph.D.
  16. //
  17. // This program is free software; you can redistribute it and/or
  18. // modify it under the terms of the GNU General Public License
  19. // version 2 as published by the Free Software Foundation.
  20. //
  21. // This program is distributed in the hope that it will be useful,
  22. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. // GNU General Public License for more details.
  25. //
  26. // You should have received a copy of the GNU General Public License version 2
  27. // along with this program; if not, write to the Free Software
  28. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  29. //
  30. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  33. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  34. // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  35. // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  36. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. //
  38. // THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
  39. // AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
  40. //
  41. //
  42. // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
  43. // UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
  44. // MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
  45. // SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
  46. // SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
  47. // CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
  48. // DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
  49. // MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
  50. // SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
  51. // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
  52. // EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
  53. // JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
  54. // AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
  55. // THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
  56. //
  57. // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS
  58. // YOU HAVE A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY
  59. // CRIMINAL LAWS OR CIVIL RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS
  60. // SOFTWARE IN OTHER COUNTRIES IS COMPLETELY AT YOUR OWN RISK. THE
  61. // SOFTETHER VPN PROJECT HAS DEVELOPED AND DISTRIBUTED THIS SOFTWARE TO
  62. // COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING CIVIL RIGHTS INCLUDING
  63. // PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER COUNTRIES' LAWS OR
  64. // CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES. WE HAVE
  65. // NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
  66. // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+
  67. // COUNTRIES AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE
  68. // WORLD, WITH DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY
  69. // COUNTRIES' LAWS, REGULATIONS AND CIVIL RIGHTS TO MAKE THE SOFTWARE
  70. // COMPLY WITH ALL COUNTRIES' LAWS BY THE PROJECT. EVEN IF YOU WILL BE
  71. // SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A PUBLIC SERVANT IN YOUR
  72. // COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE LIABLE TO
  73. // RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
  74. // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT
  75. // JUST A STATEMENT FOR WARNING AND DISCLAIMER.
  76. //
  77. //
  78. // SOURCE CODE CONTRIBUTION
  79. // ------------------------
  80. //
  81. // Your contribution to SoftEther VPN Project is much appreciated.
  82. // Please send patches to us through GitHub.
  83. // Read the SoftEther VPN Patch Acceptance Policy in advance:
  84. // http://www.softether.org/5-download/src/9.patch
  85. //
  86. //
  87. // DEAR SECURITY EXPERTS
  88. // ---------------------
  89. //
  90. // If you find a bug or a security vulnerability please kindly inform us
  91. // about the problem immediately so that we can fix the security problem
  92. // to protect a lot of users around the world as soon as possible.
  93. //
  94. // Our e-mail address for security reports is:
  95. // softether-vpn-security [at] softether.org
  96. //
  97. // Please note that the above e-mail address is not a technical support
  98. // inquiry address. If you need technical assistance, please visit
  99. // http://www.softether.org/ and ask your question on the users forum.
  100. //
  101. // Thank you for your cooperation.
  102. //
  103. //
  104. // NO MEMORY OR RESOURCE LEAKS
  105. // ---------------------------
  106. //
  107. // The memory-leaks and resource-leaks verification under the stress
  108. // test has been passed before release this source code.
  109. // Server.c
  110. // VPN Server module
  111. #include "CedarPch.h"
  112. static SERVER *server = NULL;
  113. static LOCK *server_lock = NULL;
  114. char *SERVER_CONFIG_FILE_NAME = "@vpn_server.config";
  115. char *SERVER_CONFIG_FILE_NAME_IN_CLIENT = "@vpn_gate_svc.config";
  116. char *SERVER_CONFIG_FILE_NAME_IN_CLIENT_RELAY = "@vpn_gate_relay.config";
  117. char *BRIDGE_CONFIG_FILE_NAME = "@vpn_bridge.config";
  118. char *SERVER_CONFIG_TEMPLATE_NAME = "@vpn_server_template.config";
  119. char *BRIDGE_CONFIG_TEMPLATE_NAME = "@vpn_server_template.config";
  120. static bool server_reset_setting = false;
  121. static volatile UINT global_server_flags[NUM_GLOBAL_SERVER_FLAGS] = {0};
  122. UINT vpn_global_parameters[NUM_GLOBAL_PARAMS] = {0};
  123. // Set the OpenVPN and SSTP setting
  124. void SiSetOpenVPNAndSSTPConfig(SERVER *s, OPENVPN_SSTP_CONFIG *c)
  125. {
  126. // Validate arguments
  127. if (s == NULL || c == NULL)
  128. {
  129. return;
  130. }
  131. Lock(s->OpenVpnSstpConfigLock);
  132. {
  133. // Save the settings
  134. if (s->Cedar->Bridge || s->ServerType != SERVER_TYPE_STANDALONE)
  135. {
  136. s->DisableSSTPServer = true;
  137. s->DisableOpenVPNServer = true;
  138. }
  139. else
  140. {
  141. s->DisableSSTPServer = !c->EnableSSTP;
  142. s->DisableOpenVPNServer = !c->EnableOpenVPN;
  143. }
  144. NormalizeIntListStr(s->OpenVpnServerUdpPorts, sizeof(s->OpenVpnServerUdpPorts),
  145. c->OpenVPNPortList, true, ", ");
  146. // Apply the OpenVPN configuration
  147. if (s->OpenVpnServerUdp != NULL)
  148. {
  149. if (s->DisableOpenVPNServer)
  150. {
  151. OvsApplyUdpPortList(s->OpenVpnServerUdp, "");
  152. }
  153. else
  154. {
  155. OvsApplyUdpPortList(s->OpenVpnServerUdp, s->OpenVpnServerUdpPorts);
  156. }
  157. }
  158. }
  159. Unlock(s->OpenVpnSstpConfigLock);
  160. }
  161. // Get the OpenVPN and SSTP setting
  162. void SiGetOpenVPNAndSSTPConfig(SERVER *s, OPENVPN_SSTP_CONFIG *c)
  163. {
  164. // Validate arguments
  165. if (s == NULL || c == NULL)
  166. {
  167. return;
  168. }
  169. Zero(c, sizeof(OPENVPN_SSTP_CONFIG));
  170. Lock(s->OpenVpnSstpConfigLock);
  171. {
  172. if (s->DisableOpenVPNServer == false)
  173. {
  174. c->EnableOpenVPN = true;
  175. }
  176. if (s->DisableSSTPServer == false)
  177. {
  178. c->EnableSSTP = true;
  179. }
  180. StrCpy(c->OpenVPNPortList, sizeof(c->OpenVPNPortList), s->OpenVpnServerUdpPorts);
  181. }
  182. Unlock(s->OpenVpnSstpConfigLock);
  183. }
  184. // Get whether the number of user objects that are registered in the VPN Server is too many
  185. bool SiTooManyUserObjectsInServer(SERVER *s, bool oneMore)
  186. {
  187. return false;
  188. }
  189. // Get the number of user objects that are registered in the VPN Server
  190. UINT SiGetServerNumUserObjects(SERVER *s)
  191. {
  192. CEDAR *c;
  193. UINT ret = 0;
  194. // Validate arguments
  195. if (s == NULL)
  196. {
  197. return 0;
  198. }
  199. c = s->Cedar;
  200. LockList(c->HubList);
  201. {
  202. UINT i;
  203. for (i = 0;i < LIST_NUM(c->HubList);i++)
  204. {
  205. HUB *h = LIST_DATA(c->HubList, i);
  206. if (h->HubDb != NULL)
  207. {
  208. ret += LIST_NUM(h->HubDb->UserList);
  209. }
  210. }
  211. }
  212. UnlockList(c->HubList);
  213. return ret;
  214. }
  215. typedef struct SI_DEBUG_PROC_LIST
  216. {
  217. UINT Id;
  218. char *Description;
  219. char *Args;
  220. SI_DEBUG_PROC *Proc;
  221. } SI_DEBUG_PROC_LIST;
  222. // Debugging function
  223. UINT SiDebug(SERVER *s, RPC_TEST *ret, UINT i, char *str)
  224. {
  225. SI_DEBUG_PROC_LIST proc_list[] =
  226. {
  227. {1, "Hello World", "<test string>", SiDebugProcHelloWorld},
  228. {2, "Terminate process now", "", SiDebugProcExit},
  229. {3, "Write memory dumpfile", "", SiDebugProcDump},
  230. {4, "Restore process priority", "", SiDebugProcRestorePriority},
  231. {5, "Set the process priority high", "", SiDebugProcSetHighPriority},
  232. {6, "Get the .exe filename of the process", "", SiDebugProcGetExeFileName},
  233. {7, "Crash the process", "", SiDebugProcCrash},
  234. {8, "Get IPsecMessageDisplayed Flag", "", SiDebugProcGetIPsecMessageDisplayedValue},
  235. {9, "Set IPsecMessageDisplayed Flag", "", SiDebugProcSetIPsecMessageDisplayedValue},
  236. {10, "Get VgsMessageDisplayed Flag", "", SiDebugProcGetVgsMessageDisplayedValue},
  237. {11, "Set VgsMessageDisplayed Flag", "", SiDebugProcSetVgsMessageDisplayedValue},
  238. {12, "Get the current TCP send queue length", "", SiDebugProcGetCurrentTcpSendQueueLength},
  239. {13, "Get the current GetIP thread count", "", SiDebugProcGetCurrentGetIPThreadCount},
  240. };
  241. UINT num_proc_list = sizeof(proc_list) / sizeof(proc_list[0]);
  242. UINT j;
  243. UINT ret_value = ERR_NO_ERROR;
  244. // Validate arguments
  245. if (s == NULL || ret == NULL)
  246. {
  247. return ERR_INVALID_PARAMETER;
  248. }
  249. if (i == 0)
  250. {
  251. char tmp[MAX_SIZE];
  252. Zero(ret, sizeof(RPC_TEST));
  253. StrCat(ret->StrValue, sizeof(ret->StrValue),
  254. "\n--- Debug Functions List --\n");
  255. for (j = 0;j < num_proc_list;j++)
  256. {
  257. SI_DEBUG_PROC_LIST *p = &proc_list[j];
  258. if (IsEmptyStr(p->Args) == false)
  259. {
  260. Format(tmp, sizeof(tmp),
  261. " %u: %s - Usage: %u /ARG:\"%s\"\n",
  262. p->Id, p->Description, p->Id, p->Args);
  263. }
  264. else
  265. {
  266. Format(tmp, sizeof(tmp),
  267. " %u: %s - Usage: %u\n",
  268. p->Id, p->Description, p->Id);
  269. }
  270. StrCat(ret->StrValue, sizeof(ret->StrValue), tmp);
  271. }
  272. }
  273. else
  274. {
  275. ret_value = ERR_NOT_SUPPORTED;
  276. for (j = 0;j < num_proc_list;j++)
  277. {
  278. SI_DEBUG_PROC_LIST *p = &proc_list[j];
  279. if (p->Id == i)
  280. {
  281. ret_value = p->Proc(s, str, ret->StrValue, sizeof(ret->StrValue));
  282. if (ret_value == ERR_NO_ERROR && IsEmptyStr(ret->StrValue))
  283. {
  284. StrCpy(ret->StrValue, sizeof(ret->StrValue), "Ok.");
  285. }
  286. break;
  287. }
  288. }
  289. }
  290. return ret_value;
  291. }
  292. UINT SiDebugProcHelloWorld(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  293. {
  294. // Validate arguments
  295. if (s == NULL || in_str == NULL || ret_str == NULL)
  296. {
  297. return ERR_INVALID_PARAMETER;
  298. }
  299. Format(ret_str, ret_str_size, "Hello World %s\n", in_str);
  300. return ERR_NO_ERROR;
  301. }
  302. UINT SiDebugProcExit(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  303. {
  304. // Validate arguments
  305. if (s == NULL || in_str == NULL || ret_str == NULL)
  306. {
  307. return ERR_INVALID_PARAMETER;
  308. }
  309. _exit(1);
  310. return ERR_NO_ERROR;
  311. }
  312. UINT SiDebugProcDump(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  313. {
  314. // Validate arguments
  315. if (s == NULL || in_str == NULL || ret_str == NULL)
  316. {
  317. return ERR_INVALID_PARAMETER;
  318. }
  319. #ifdef OS_WIN32
  320. MsWriteMinidump(NULL, NULL);
  321. #else // OS_WIN32
  322. return ERR_NOT_SUPPORTED;
  323. #endif // OS_WIN32
  324. return ERR_NO_ERROR;
  325. }
  326. UINT SiDebugProcRestorePriority(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  327. {
  328. // Validate arguments
  329. if (s == NULL || in_str == NULL || ret_str == NULL)
  330. {
  331. return ERR_INVALID_PARAMETER;
  332. }
  333. OSRestorePriority();
  334. return ERR_NO_ERROR;
  335. }
  336. UINT SiDebugProcSetHighPriority(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  337. {
  338. // Validate arguments
  339. if (s == NULL || in_str == NULL || ret_str == NULL)
  340. {
  341. return ERR_INVALID_PARAMETER;
  342. }
  343. OSSetHighPriority();
  344. return ERR_NO_ERROR;
  345. }
  346. UINT SiDebugProcGetExeFileName(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  347. {
  348. // Validate arguments
  349. if (s == NULL || in_str == NULL || ret_str == NULL)
  350. {
  351. return ERR_INVALID_PARAMETER;
  352. }
  353. GetExeName(ret_str, ret_str_size);
  354. return ERR_NO_ERROR;
  355. }
  356. UINT SiDebugProcCrash(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  357. {
  358. // Validate arguments
  359. if (s == NULL || in_str == NULL || ret_str == NULL)
  360. {
  361. return ERR_INVALID_PARAMETER;
  362. }
  363. CrashNow();
  364. return ERR_NO_ERROR;
  365. }
  366. UINT SiDebugProcGetIPsecMessageDisplayedValue(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  367. {
  368. // Validate arguments
  369. if (s == NULL || in_str == NULL || ret_str == NULL)
  370. {
  371. return ERR_INVALID_PARAMETER;
  372. }
  373. ToStr(ret_str, s->IPsecMessageDisplayed);
  374. return ERR_NO_ERROR;
  375. }
  376. UINT SiDebugProcSetIPsecMessageDisplayedValue(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  377. {
  378. // Validate arguments
  379. if (s == NULL || in_str == NULL || ret_str == NULL)
  380. {
  381. return ERR_INVALID_PARAMETER;
  382. }
  383. s->IPsecMessageDisplayed = ToInt(in_str);
  384. return ERR_NO_ERROR;
  385. }
  386. UINT SiDebugProcGetVgsMessageDisplayedValue(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  387. {
  388. // Validate arguments
  389. if (s == NULL || in_str == NULL || ret_str == NULL)
  390. {
  391. return ERR_INVALID_PARAMETER;
  392. }
  393. #if 0
  394. if (VgDoNotPopupMessage() == false)
  395. {
  396. ToStr(ret_str, s->VgsMessageDisplayed);
  397. }
  398. else
  399. {
  400. ToStr(ret_str, 1);
  401. }
  402. #else
  403. // Do not show the VGS message in VPN Server of the current version
  404. ToStr(ret_str, 1);
  405. #endif
  406. return ERR_NO_ERROR;
  407. }
  408. UINT SiDebugProcGetCurrentTcpSendQueueLength(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  409. {
  410. char tmp1[64], tmp2[64], tmp3[64];
  411. // Validate arguments
  412. if (s == NULL || in_str == NULL || ret_str == NULL)
  413. {
  414. return ERR_INVALID_PARAMETER;
  415. }
  416. ToStr3(tmp1, 0, CedarGetCurrentTcpQueueSize(s->Cedar));
  417. ToStr3(tmp2, 0, CedarGetQueueBudgetConsuming(s->Cedar));
  418. ToStr3(tmp3, 0, CedarGetFifoBudgetConsuming(s->Cedar));
  419. Format(ret_str, 0,
  420. "CurrentTcpQueueSize = %s\n"
  421. "QueueBudgetConsuming = %s\n"
  422. "FifoBudgetConsuming = %s\n",
  423. tmp1, tmp2, tmp3);
  424. return ERR_NO_ERROR;
  425. }
  426. UINT SiDebugProcGetCurrentGetIPThreadCount(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  427. {
  428. char tmp1[64], tmp2[64];
  429. // Validate arguments
  430. if (s == NULL || in_str == NULL || ret_str == NULL)
  431. {
  432. return ERR_INVALID_PARAMETER;
  433. }
  434. ToStr3(tmp1, 0, GetCurrentGetIpThreadNum());
  435. ToStr3(tmp2, 0, GetGetIpThreadMaxNum());
  436. Format(ret_str, 0,
  437. "Current threads = %s\n"
  438. "Quota = %s\n",
  439. tmp1, tmp2);
  440. return ERR_NO_ERROR;
  441. }
  442. UINT SiDebugProcSetVgsMessageDisplayedValue(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
  443. {
  444. // Validate arguments
  445. if (s == NULL || in_str == NULL || ret_str == NULL)
  446. {
  447. return ERR_INVALID_PARAMETER;
  448. }
  449. return ERR_NO_ERROR;
  450. }
  451. // Write the debug log
  452. void SiDebugLog(SERVER *s, char *msg)
  453. {
  454. // Validate arguments
  455. if (s == NULL || msg == NULL)
  456. {
  457. return;
  458. }
  459. if (s->DebugLog != NULL)
  460. {
  461. WriteTinyLog(s->DebugLog, msg);
  462. }
  463. }
  464. // Deadlock inspection main
  465. void SiCheckDeadLockMain(SERVER *s, UINT timeout)
  466. {
  467. CEDAR *cedar;
  468. // Validate arguments
  469. if (s == NULL)
  470. {
  471. return;
  472. }
  473. //Debug("SiCheckDeadLockMain Start.\n");
  474. cedar = s->Cedar;
  475. if (s->ServerListenerList != NULL)
  476. {
  477. CheckDeadLock(s->ServerListenerList->lock, timeout, "s->ServerListenerList->lock");
  478. }
  479. CheckDeadLock(s->lock, timeout, "s->lock");
  480. if (s->FarmMemberList != NULL)
  481. {
  482. CheckDeadLock(s->FarmMemberList->lock, timeout, "s->FarmMemberList->lock");
  483. }
  484. if (s->HubCreateHistoryList != NULL)
  485. {
  486. CheckDeadLock(s->HubCreateHistoryList->lock, timeout, "s->HubCreateHistoryList->lock");
  487. }
  488. CheckDeadLock(s->CapsCacheLock, timeout, "s->CapsCacheLock");
  489. CheckDeadLock(s->TasksFromFarmControllerLock, timeout, "s->TasksFromFarmControllerLock");
  490. if (cedar != NULL)
  491. {
  492. if (cedar->HubList != NULL)
  493. {
  494. CheckDeadLock(cedar->HubList->lock, timeout, "cedar->HubList->lock");
  495. }
  496. if (cedar->ListenerList != NULL)
  497. {
  498. UINT i;
  499. LIST *o = NewListFast(NULL);
  500. CheckDeadLock(cedar->ListenerList->lock, timeout, "cedar->ListenerList->lock");
  501. LockList(cedar->ListenerList);
  502. {
  503. for (i = 0;i < LIST_NUM(cedar->ListenerList);i++)
  504. {
  505. LISTENER *r = LIST_DATA(cedar->ListenerList, i);
  506. AddRef(r->ref);
  507. Add(o, r);
  508. }
  509. }
  510. UnlockList(cedar->ListenerList);
  511. for (i = 0;i < LIST_NUM(o);i++)
  512. {
  513. LISTENER *r = LIST_DATA(o, i);
  514. ReleaseListener(r);
  515. }
  516. ReleaseList(o);
  517. }
  518. if (cedar->ConnectionList != NULL)
  519. {
  520. CheckDeadLock(cedar->ConnectionList->lock, timeout, "cedar->ConnectionList->lock");
  521. }
  522. if (cedar->CaList != NULL)
  523. {
  524. CheckDeadLock(cedar->CaList->lock, timeout, "cedar->CaList->lock");
  525. }
  526. if (cedar->TrafficLock != NULL)
  527. {
  528. CheckDeadLock(cedar->TrafficLock, timeout, "cedar->TrafficLock");
  529. }
  530. if (cedar->TrafficDiffList != NULL)
  531. {
  532. CheckDeadLock(cedar->TrafficDiffList->lock, timeout, "cedar->TrafficDiffList->lock");
  533. }
  534. if (cedar->LocalBridgeList != NULL)
  535. {
  536. CheckDeadLock(cedar->LocalBridgeList->lock, timeout, "cedar->LocalBridgeList->lock");
  537. }
  538. if (cedar->L3SwList != NULL)
  539. {
  540. CheckDeadLock(cedar->L3SwList->lock, timeout, "cedar->L3SwList->lock");
  541. }
  542. }
  543. //Debug("SiCheckDeadLockMain Finish.\n");
  544. }
  545. // Deadlock check thread
  546. void SiDeadLockCheckThread(THREAD *t, void *param)
  547. {
  548. SERVER *s = (SERVER *)param;
  549. // Validate arguments
  550. if (s == NULL || t == NULL)
  551. {
  552. return;
  553. }
  554. while (true)
  555. {
  556. Wait(s->DeadLockWaitEvent, SERVER_DEADLOCK_CHECK_SPAN);
  557. if (s->HaltDeadLockThread)
  558. {
  559. break;
  560. }
  561. SiCheckDeadLockMain(s, SERVER_DEADLOCK_CHECK_TIMEOUT);
  562. }
  563. }
  564. // Initialize the deadlock check
  565. void SiInitDeadLockCheck(SERVER *s)
  566. {
  567. // Validate arguments
  568. if (s == NULL)
  569. {
  570. return;
  571. }
  572. if (s->DisableDeadLockCheck)
  573. {
  574. return;
  575. }
  576. s->HaltDeadLockThread = false;
  577. s->DeadLockWaitEvent = NewEvent();
  578. s->DeadLockCheckThread = NewThread(SiDeadLockCheckThread, s);
  579. }
  580. // Release the deadlock check
  581. void SiFreeDeadLockCheck(SERVER *s)
  582. {
  583. // Validate arguments
  584. if (s == NULL)
  585. {
  586. return;
  587. }
  588. if (s->DeadLockCheckThread == NULL)
  589. {
  590. return;
  591. }
  592. s->HaltDeadLockThread = true;
  593. Set(s->DeadLockWaitEvent);
  594. WaitThread(s->DeadLockCheckThread, INFINITE);
  595. ReleaseThread(s->DeadLockCheckThread);
  596. s->DeadLockCheckThread = NULL;
  597. ReleaseEvent(s->DeadLockWaitEvent);
  598. s->DeadLockWaitEvent = NULL;
  599. s->HaltDeadLockThread = false;
  600. }
  601. // Check whether the specified virtual HUB has been registered to creation history
  602. bool SiIsHubRegistedOnCreateHistory(SERVER *s, char *name)
  603. {
  604. UINT i;
  605. bool ret = false;
  606. // Validate arguments
  607. if (s == NULL || name == NULL)
  608. {
  609. return false;
  610. }
  611. SiDeleteOldHubCreateHistory(s);
  612. LockList(s->HubCreateHistoryList);
  613. {
  614. for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
  615. {
  616. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
  617. if (StrCmpi(h->HubName, name) == 0)
  618. {
  619. ret = true;
  620. break;
  621. }
  622. }
  623. }
  624. UnlockList(s->HubCreateHistoryList);
  625. return ret;
  626. }
  627. // Delete the Virtual HUB creation history
  628. void SiDelHubCreateHistory(SERVER *s, char *name)
  629. {
  630. UINT i;
  631. // Validate arguments
  632. if (s == NULL || name == NULL)
  633. {
  634. return;
  635. }
  636. LockList(s->HubCreateHistoryList);
  637. {
  638. SERVER_HUB_CREATE_HISTORY *hh = NULL;
  639. for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
  640. {
  641. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
  642. if (StrCmpi(h->HubName, name) == 0)
  643. {
  644. Delete(s->HubCreateHistoryList, h);
  645. Free(h);
  646. break;
  647. }
  648. }
  649. }
  650. UnlockList(s->HubCreateHistoryList);
  651. SiDeleteOldHubCreateHistory(s);
  652. }
  653. // Register to the Virtual HUB creation history
  654. void SiAddHubCreateHistory(SERVER *s, char *name)
  655. {
  656. UINT i;
  657. // Validate arguments
  658. if (s == NULL || name == NULL)
  659. {
  660. return;
  661. }
  662. LockList(s->HubCreateHistoryList);
  663. {
  664. SERVER_HUB_CREATE_HISTORY *hh = NULL;
  665. for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
  666. {
  667. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
  668. if (StrCmpi(h->HubName, name) == 0)
  669. {
  670. hh = h;
  671. break;
  672. }
  673. }
  674. if (hh == NULL)
  675. {
  676. hh = ZeroMalloc(sizeof(SERVER_HUB_CREATE_HISTORY));
  677. StrCpy(hh->HubName, sizeof(hh->HubName), name);
  678. Add(s->HubCreateHistoryList, hh);
  679. }
  680. hh->CreatedTime = Tick64();
  681. }
  682. UnlockList(s->HubCreateHistoryList);
  683. SiDeleteOldHubCreateHistory(s);
  684. }
  685. // Delete outdated Virtual HUB creation histories
  686. void SiDeleteOldHubCreateHistory(SERVER *s)
  687. {
  688. UINT i;
  689. LIST *o;
  690. // Validate arguments
  691. if (s == NULL)
  692. {
  693. return;
  694. }
  695. LockList(s->HubCreateHistoryList);
  696. {
  697. o = NewListFast(NULL);
  698. for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
  699. {
  700. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
  701. if ((h->CreatedTime + ((UINT64)TICKET_EXPIRES)) <= Tick64())
  702. {
  703. // Expired
  704. Add(o, h);
  705. }
  706. }
  707. for (i = 0;i < LIST_NUM(o);i++)
  708. {
  709. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(o, i);
  710. Delete(s->HubCreateHistoryList, h);
  711. Free(h);
  712. }
  713. ReleaseList(o);
  714. }
  715. UnlockList(s->HubCreateHistoryList);
  716. }
  717. // Initialize the Virtual HUB creation history
  718. void SiInitHubCreateHistory(SERVER *s)
  719. {
  720. // Validate arguments
  721. if (s == NULL)
  722. {
  723. return;
  724. }
  725. s->HubCreateHistoryList = NewList(NULL);
  726. }
  727. // Release the Virtual HUB creation history
  728. void SiFreeHubCreateHistory(SERVER *s)
  729. {
  730. UINT i;
  731. // Validate arguments
  732. if (s == NULL)
  733. {
  734. return;
  735. }
  736. for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
  737. {
  738. SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
  739. Free(h);
  740. }
  741. ReleaseList(s->HubCreateHistoryList);
  742. s->HubCreateHistoryList = NULL;
  743. }
  744. // Identify whether the server can be connected from the VPN Client that is
  745. // created by the installer creating kit of Admin Pack
  746. bool IsAdminPackSupportedServerProduct(char *name)
  747. {
  748. return true;
  749. }
  750. // Get the saving status of syslog
  751. UINT SiGetSysLogSaveStatus(SERVER *s)
  752. {
  753. SYSLOG_SETTING set;
  754. // Validate arguments
  755. if (s == NULL)
  756. {
  757. return SYSLOG_NONE;
  758. }
  759. SiGetSysLogSetting(s, &set);
  760. return set.SaveType;
  761. }
  762. // Send a syslog
  763. void SiWriteSysLog(SERVER *s, char *typestr, char *hubname, wchar_t *message)
  764. {
  765. wchar_t tmp[1024];
  766. char machinename[MAX_HOST_NAME_LEN + 1];
  767. char datetime[MAX_PATH];
  768. SYSTEMTIME st;
  769. // Validate arguments
  770. if (s == NULL || typestr == NULL || message == NULL)
  771. {
  772. return;
  773. }
  774. if (GetGlobalServerFlag(GSF_DISABLE_SYSLOG) != 0)
  775. {
  776. return;
  777. }
  778. // Host name
  779. GetMachineName(machinename, sizeof(machinename));
  780. // Date and time
  781. LocalTime(&st);
  782. GetDateTimeStrMilli(datetime, sizeof(datetime), &st);
  783. if (IsEmptyStr(hubname) == false)
  784. {
  785. UniFormat(tmp, sizeof(tmp), L"[%S/VPN/%S] (%S) <%S>: %s",
  786. machinename, hubname, datetime, typestr, message);
  787. }
  788. else
  789. {
  790. UniFormat(tmp, sizeof(tmp), L"[%S/VPN] (%S) <%S>: %s",
  791. machinename, datetime, typestr, message);
  792. }
  793. SendSysLog(s->Syslog, tmp);
  794. }
  795. // Write the syslog configuration
  796. void SiSetSysLogSetting(SERVER *s, SYSLOG_SETTING *setting)
  797. {
  798. SYSLOG_SETTING set;
  799. // Validate arguments
  800. if (s == NULL || setting == NULL)
  801. {
  802. return;
  803. }
  804. Zero(&set, sizeof(set));
  805. Copy(&set, setting, sizeof(SYSLOG_SETTING));
  806. if (IsEmptyStr(set.Hostname) || set.Port == 0)
  807. {
  808. set.SaveType = SYSLOG_NONE;
  809. }
  810. Lock(s->SyslogLock);
  811. {
  812. Copy(&s->SyslogSetting, &set, sizeof(SYSLOG_SETTING));
  813. SetSysLog(s->Syslog, set.Hostname, set.Port);
  814. }
  815. Unlock(s->SyslogLock);
  816. }
  817. // Read the syslog configuration
  818. void SiGetSysLogSetting(SERVER *s, SYSLOG_SETTING *setting)
  819. {
  820. // Validate arguments
  821. if (s == NULL || setting == NULL)
  822. {
  823. return;
  824. }
  825. //Lock(s->SyslogLock);
  826. {
  827. Copy(setting, &s->SyslogSetting, sizeof(SYSLOG_SETTING));
  828. }
  829. //Unlock(s->SyslogLock);
  830. }
  831. // Get the server product name
  832. void GetServerProductName(SERVER *s, char *name, UINT size)
  833. {
  834. char *cpu;
  835. // Validate arguments
  836. if (s == NULL || name == NULL)
  837. {
  838. return;
  839. }
  840. GetServerProductNameInternal(s, name, size);
  841. #ifdef CPU_64
  842. cpu = " (64 bit)";
  843. #else // CPU_64
  844. cpu = " (32 bit)";
  845. #endif // CPU_64
  846. StrCat(name, size, cpu);
  847. StrCat(name, size, " (Open Source)");
  848. }
  849. void GetServerProductNameInternal(SERVER *s, char *name, UINT size)
  850. {
  851. // Validate arguments
  852. if (s == NULL || name == NULL)
  853. {
  854. return;
  855. }
  856. #ifdef BETA_NUMBER
  857. if (s->Cedar->Bridge)
  858. {
  859. StrCpy(name, size, CEDAR_BRIDGE_STR);
  860. }
  861. else
  862. {
  863. StrCpy(name, size, CEDAR_BETA_SERVER);
  864. }
  865. return;
  866. #else // BETA_NUMBER
  867. if (s->Cedar->Bridge)
  868. {
  869. StrCpy(name, size, CEDAR_BRIDGE_STR);
  870. }
  871. else
  872. {
  873. StrCpy(name, size, CEDAR_SERVER_STR);
  874. }
  875. #endif // BETA_NUMBER
  876. }
  877. // Adjoin the enumerations of log files
  878. void AdjoinEnumLogFile(LIST *o, LIST *src)
  879. {
  880. UINT i;
  881. // Validate arguments
  882. if (o == NULL || src == NULL)
  883. {
  884. return;
  885. }
  886. for (i = 0;i < LIST_NUM(src);i++)
  887. {
  888. LOG_FILE *f = LIST_DATA(src, i);
  889. Insert(o, Clone(f, sizeof(LOG_FILE)));
  890. }
  891. }
  892. // Check whether the log file with the specified name is contained in the enumerated list
  893. bool CheckLogFileNameFromEnumList(LIST *o, char *name, char *server_name)
  894. {
  895. LOG_FILE t;
  896. // Validate arguments
  897. if (o == NULL || name == NULL || server_name == NULL)
  898. {
  899. return false;
  900. }
  901. Zero(&t, sizeof(t));
  902. StrCpy(t.Path, sizeof(t.Path), name);
  903. StrCpy(t.ServerName, sizeof(t.ServerName), server_name);
  904. if (Search(o, &t) == NULL)
  905. {
  906. return false;
  907. }
  908. return true;
  909. }
  910. // Release the log file enumeration
  911. void FreeEnumLogFile(LIST *o)
  912. {
  913. UINT i;
  914. // Validate arguments
  915. if (o == NULL)
  916. {
  917. return;
  918. }
  919. for (i = 0;i < LIST_NUM(o);i++)
  920. {
  921. LOG_FILE *f = LIST_DATA(o, i);
  922. Free(f);
  923. }
  924. ReleaseList(o);
  925. }
  926. // Enumerate the log files associated with the virtual HUB (All logs are listed in the case of server administrator)
  927. LIST *EnumLogFile(char *hubname)
  928. {
  929. char exe_dir[MAX_PATH];
  930. char tmp[MAX_PATH];
  931. LIST *o = NewListFast(CmpLogFile);
  932. DIRLIST *dir;
  933. if (StrLen(hubname) == 0)
  934. {
  935. hubname = NULL;
  936. }
  937. GetExeDir(exe_dir, sizeof(exe_dir));
  938. // Enumerate in the server_log
  939. if (hubname == NULL)
  940. {
  941. EnumLogFileDir(o, "server_log");
  942. }
  943. // Enumerate in the packet_log
  944. Format(tmp, sizeof(tmp), "%s/packet_log", exe_dir);
  945. dir = EnumDir(tmp);
  946. if (dir != NULL)
  947. {
  948. UINT i;
  949. for (i = 0;i < dir->NumFiles;i++)
  950. {
  951. DIRENT *e = dir->File[i];
  952. if (e->Folder)
  953. {
  954. char dir_name[MAX_PATH];
  955. if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
  956. {
  957. Format(dir_name, sizeof(dir_name), "packet_log/%s", e->FileName);
  958. EnumLogFileDir(o, dir_name);
  959. }
  960. }
  961. }
  962. FreeDir(dir);
  963. }
  964. // Enumerate in the security_log
  965. Format(tmp, sizeof(tmp), "%s/security_log", exe_dir);
  966. dir = EnumDir(tmp);
  967. if (dir != NULL)
  968. {
  969. UINT i;
  970. for (i = 0;i < dir->NumFiles;i++)
  971. {
  972. DIRENT *e = dir->File[i];
  973. if (e->Folder)
  974. {
  975. char dir_name[MAX_PATH];
  976. if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
  977. {
  978. Format(dir_name, sizeof(dir_name), "security_log/%s", e->FileName);
  979. EnumLogFileDir(o, dir_name);
  980. }
  981. }
  982. }
  983. FreeDir(dir);
  984. }
  985. return o;
  986. }
  987. // Enumerate log files in the specified directory
  988. void EnumLogFileDir(LIST *o, char *dirname)
  989. {
  990. UINT i;
  991. char exe_dir[MAX_PATH];
  992. char dir_full_path[MAX_PATH];
  993. DIRLIST *dir;
  994. // Validate arguments
  995. if (o == NULL || dirname == NULL)
  996. {
  997. return;
  998. }
  999. GetExeDir(exe_dir, sizeof(exe_dir));
  1000. Format(dir_full_path, sizeof(dir_full_path), "%s/%s", exe_dir, dirname);
  1001. dir = EnumDir(dir_full_path);
  1002. if (dir == NULL)
  1003. {
  1004. return;
  1005. }
  1006. for (i = 0;i < dir->NumFiles;i++)
  1007. {
  1008. DIRENT *e = dir->File[i];
  1009. if (e->Folder == false && e->FileSize > 0)
  1010. {
  1011. char full_path[MAX_PATH];
  1012. char file_path[MAX_PATH];
  1013. Format(file_path, sizeof(file_path), "%s/%s", dirname, e->FileName);
  1014. Format(full_path, sizeof(full_path), "%s/%s", exe_dir, file_path);
  1015. if (EndWith(file_path, ".log"))
  1016. {
  1017. LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
  1018. StrCpy(f->Path, sizeof(f->Path), file_path);
  1019. f->FileSize = (UINT)(MIN(e->FileSize, 0xffffffffUL));
  1020. f->UpdatedTime = e->UpdateDate;
  1021. GetMachineName(f->ServerName, sizeof(f->ServerName));
  1022. Insert(o, f);
  1023. }
  1024. }
  1025. }
  1026. FreeDir(dir);
  1027. }
  1028. // Log file list entry comparison
  1029. int CmpLogFile(void *p1, void *p2)
  1030. {
  1031. LOG_FILE *f1, *f2;
  1032. UINT i;
  1033. if (p1 == NULL || p2 == NULL)
  1034. {
  1035. return 0;
  1036. }
  1037. f1 = *(LOG_FILE **)p1;
  1038. f2 = *(LOG_FILE **)p2;
  1039. if (f1 == NULL || f2 == NULL)
  1040. {
  1041. return 0;
  1042. }
  1043. i = StrCmpi(f1->Path, f2->Path);
  1044. if (i != 0)
  1045. {
  1046. return i;
  1047. }
  1048. return StrCmpi(f1->ServerName, f2->ServerName);
  1049. }
  1050. // Get the Caps of the server
  1051. UINT GetServerCapsInt(SERVER *s, char *name)
  1052. {
  1053. CAPSLIST t;
  1054. UINT ret;
  1055. // Validate arguments
  1056. if (s == NULL || name == NULL)
  1057. {
  1058. return 0;
  1059. }
  1060. Zero(&t, sizeof(t));
  1061. GetServerCaps(s, &t);
  1062. ret = GetCapsInt(&t, name);
  1063. return ret;
  1064. }
  1065. bool GetServerCapsBool(SERVER *s, char *name)
  1066. {
  1067. return (GetServerCapsInt(s, name) == 0) ? false : true;
  1068. }
  1069. // Initialize the Caps cache of the server
  1070. void InitServerCapsCache(SERVER *s)
  1071. {
  1072. // Validate arguments
  1073. if (s == NULL)
  1074. {
  1075. return;
  1076. }
  1077. s->CapsCacheLock = NewLock();
  1078. s->CapsListCache = NULL;
  1079. }
  1080. // Release the Caps cache of the server
  1081. void FreeServerCapsCache(SERVER *s)
  1082. {
  1083. // Validate arguments
  1084. if (s == NULL)
  1085. {
  1086. return;
  1087. }
  1088. if (s->CapsListCache != NULL)
  1089. {
  1090. FreeCapsList(s->CapsListCache);
  1091. s->CapsListCache = NULL;
  1092. }
  1093. DeleteLock(s->CapsCacheLock);
  1094. }
  1095. // Dispose the Caps cache of the server
  1096. void DestroyServerCapsCache(SERVER *s)
  1097. {
  1098. // Validate arguments
  1099. if (s == NULL)
  1100. {
  1101. return;
  1102. }
  1103. Lock(s->CapsCacheLock);
  1104. {
  1105. if (s->CapsListCache != NULL)
  1106. {
  1107. FreeCapsList(s->CapsListCache);
  1108. s->CapsListCache = NULL;
  1109. }
  1110. }
  1111. Unlock(s->CapsCacheLock);
  1112. }
  1113. // Flush the Caps list for this server
  1114. void FlushServerCaps(SERVER *s)
  1115. {
  1116. CAPSLIST t;
  1117. // Validate arguments
  1118. if (s == NULL)
  1119. {
  1120. return;
  1121. }
  1122. DestroyServerCapsCache(s);
  1123. Zero(&t, sizeof(t));
  1124. GetServerCaps(s, &t);
  1125. }
  1126. // Get the Caps list for this server
  1127. void GetServerCaps(SERVER *s, CAPSLIST *t)
  1128. {
  1129. // Validate arguments
  1130. if (s == NULL || t == NULL)
  1131. {
  1132. return;
  1133. }
  1134. Lock(s->CapsCacheLock);
  1135. {
  1136. if (s->CapsListCache == NULL)
  1137. {
  1138. s->CapsListCache = ZeroMalloc(sizeof(CAPSLIST));
  1139. GetServerCapsMain(s, s->CapsListCache);
  1140. }
  1141. Copy(t, s->CapsListCache, sizeof(s->CapsListCache));
  1142. }
  1143. Unlock(s->CapsCacheLock);
  1144. }
  1145. // Update the global server flags
  1146. void UpdateGlobalServerFlags(SERVER *s, CAPSLIST *t)
  1147. {
  1148. bool is_restricted = false;
  1149. // Validate arguments
  1150. if (s == NULL || t == NULL)
  1151. {
  1152. return;
  1153. }
  1154. is_restricted = SiIsEnterpriseFunctionsRestrictedOnOpenSource(s->Cedar);
  1155. SetGlobalServerFlag(GSF_DISABLE_PUSH_ROUTE, is_restricted);
  1156. SetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH, is_restricted);
  1157. SetGlobalServerFlag(GSF_DISABLE_CERT_AUTH, is_restricted);
  1158. SetGlobalServerFlag(GSF_DISABLE_DEEP_LOGGING, is_restricted);
  1159. SetGlobalServerFlag(GSF_DISABLE_AC, is_restricted);
  1160. SetGlobalServerFlag(GSF_DISABLE_SYSLOG, is_restricted);
  1161. }
  1162. // Set a global server flag
  1163. void SetGlobalServerFlag(UINT index, UINT value)
  1164. {
  1165. // Validate arguments
  1166. if (index >= NUM_GLOBAL_SERVER_FLAGS)
  1167. {
  1168. return;
  1169. }
  1170. global_server_flags[index] = value;
  1171. }
  1172. // Get a global server flag
  1173. UINT GetGlobalServerFlag(UINT index)
  1174. {
  1175. // Validate arguments
  1176. if (index >= NUM_GLOBAL_SERVER_FLAGS)
  1177. {
  1178. return 0;
  1179. }
  1180. return global_server_flags[index];
  1181. }
  1182. // Main of the aquisition of Caps of the server
  1183. void GetServerCapsMain(SERVER *s, CAPSLIST *t)
  1184. {
  1185. bool is_restricted = false;
  1186. // Validate arguments
  1187. if (s == NULL || t == NULL)
  1188. {
  1189. return;
  1190. }
  1191. is_restricted = SiIsEnterpriseFunctionsRestrictedOnOpenSource(s->Cedar);
  1192. // Initialize
  1193. InitCapsList(t);
  1194. // Maximum Ethernet packet size
  1195. AddCapsInt(t, "i_max_packet_size", MAX_PACKET_SIZE);
  1196. if (s->Cedar->Bridge == false)
  1197. {
  1198. UINT max_sessions, max_clients, max_bridges, max_user_creations;
  1199. max_clients = INFINITE;
  1200. max_bridges = INFINITE;
  1201. max_sessions = SERVER_MAX_SESSIONS_FOR_CARRIER_EDITION;
  1202. max_user_creations = INFINITE;
  1203. // Maximum number of virtual HUBs
  1204. AddCapsInt(t, "i_max_hubs", SERVER_MAX_SESSIONS_FOR_CARRIER_EDITION);
  1205. // The maximum number of concurrent sessions
  1206. AddCapsInt(t, "i_max_sessions", max_sessions);
  1207. // Maximum number of creatable users
  1208. AddCapsInt(t, "i_max_user_creation", max_user_creations);
  1209. // Maximum number of clients
  1210. AddCapsInt(t, "i_max_clients", max_clients);
  1211. // Maximum number of bridges
  1212. AddCapsInt(t, "i_max_bridges", max_bridges);
  1213. if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
  1214. {
  1215. // Maximum number of registrable users / Virtual HUB
  1216. AddCapsInt(t, "i_max_users_per_hub", MAX_USERS);
  1217. // Maximum number of registrable groups / Virtual HUB
  1218. AddCapsInt(t, "i_max_groups_per_hub", MAX_GROUPS);
  1219. // Maximum number of registrable access list entries / Virtual HUB
  1220. AddCapsInt(t, "i_max_access_lists", MAX_ACCESSLISTS);
  1221. }
  1222. else
  1223. {
  1224. // Maximum number of registrable users / Virtual HUB
  1225. AddCapsInt(t, "i_max_users_per_hub", 0);
  1226. // Maximum number of registrable groups / Virtual HUB
  1227. AddCapsInt(t, "i_max_groups_per_hub", 0);
  1228. // Maximum number of registrable access list entries / Virtual HUB
  1229. AddCapsInt(t, "i_max_access_lists", 0);
  1230. }
  1231. // The policy related to multiple logins
  1232. AddCapsBool(t, "b_support_limit_multilogin", true);
  1233. // QoS / VoIP
  1234. AddCapsBool(t, "b_support_qos", true);
  1235. // syslog
  1236. AddCapsBool(t, "b_support_syslog", true);
  1237. // IPsec
  1238. // (Only works in stand-alone mode currently)
  1239. AddCapsBool(t, "b_support_ipsec", (s->ServerType == SERVER_TYPE_STANDALONE));
  1240. // SSTP
  1241. // (Only works in stand-alone mode currently)
  1242. AddCapsBool(t, "b_support_sstp", (s->ServerType == SERVER_TYPE_STANDALONE));
  1243. // OpenVPN
  1244. // (Only works in stand-alone mode currently)
  1245. AddCapsBool(t, "b_support_openvpn", (s->ServerType == SERVER_TYPE_STANDALONE));
  1246. // DDNS
  1247. AddCapsBool(t, "b_support_ddns", (s->DDnsClient != NULL));
  1248. if (s->DDnsClient != NULL)
  1249. {
  1250. // DDNS via Proxy
  1251. AddCapsBool(t, "b_support_ddns_proxy", true);
  1252. }
  1253. // VPN over ICMP, VPN over DNS
  1254. AddCapsBool(t, "b_support_special_listener", true);
  1255. }
  1256. else
  1257. {
  1258. // Maximum number of virtual HUBs
  1259. AddCapsInt(t, "i_max_hubs", 0);
  1260. // The maximum number of concurrent sessions
  1261. AddCapsInt(t, "i_max_sessions", 0);
  1262. // Maximum number of clients
  1263. AddCapsInt(t, "i_max_clients", 0);
  1264. // Maximum number of bridges
  1265. AddCapsInt(t, "i_max_bridges", 0);
  1266. // Maximum number of registrable users / Virtual HUB
  1267. AddCapsInt(t, "i_max_users_per_hub", 0);
  1268. // Maximum number of registrable groups / Virtual HUB
  1269. AddCapsInt(t, "i_max_groups_per_hub", 0);
  1270. // Maximum number of registrable access list entries / Virtual HUB
  1271. AddCapsInt(t, "i_max_access_lists", 0);
  1272. // QoS / VoIP
  1273. AddCapsBool(t, "b_support_qos", true);
  1274. // syslog
  1275. AddCapsBool(t, "b_support_syslog", true);
  1276. // IPsec
  1277. AddCapsBool(t, "b_support_ipsec", false);
  1278. // SSTP
  1279. AddCapsBool(t, "b_support_sstp", false);
  1280. // OpenVPN
  1281. AddCapsBool(t, "b_support_openvpn", false);
  1282. // DDNS
  1283. AddCapsBool(t, "b_support_ddns", false);
  1284. // VPN over ICMP, VPN over DNS
  1285. AddCapsBool(t, "b_support_special_listener", false);
  1286. }
  1287. // Changing the type of Virtual HUB in cluster is prohibited
  1288. AddCapsBool(t, "b_cluster_hub_type_fixed", true);
  1289. // Maximum MAC address table size / Virtual HUB
  1290. AddCapsInt(t, "i_max_mac_tables", MAX_MAC_TABLES);
  1291. // Maximum IP address table size / Virtual HUB
  1292. AddCapsInt(t, "i_max_ip_tables", MAX_IP_TABLES);
  1293. // SecureNAT function is available
  1294. AddCapsBool(t, "b_support_securenat", true);
  1295. // Pushing routing table function of SecureNAT Virtual DHCP Server is available
  1296. AddCapsBool(t, "b_suppport_push_route", !is_restricted);
  1297. AddCapsBool(t, "b_suppport_push_route_config", true);
  1298. if (s->ServerType != SERVER_TYPE_STANDALONE)
  1299. {
  1300. AddCapsBool(t, "b_virtual_nat_disabled", true);
  1301. }
  1302. // Maximum NAT table size / Virtual HUB
  1303. AddCapsInt(t, "i_max_secnat_tables", NAT_MAX_SESSIONS);
  1304. // Cascade connction
  1305. if (s->ServerType == SERVER_TYPE_STANDALONE)
  1306. {
  1307. AddCapsBool(t, "b_support_cascade", true);
  1308. }
  1309. else
  1310. {
  1311. AddCapsBool(t, "b_support_cascade", false);
  1312. }
  1313. if (s->Cedar->Bridge)
  1314. {
  1315. // Bridge mode
  1316. AddCapsBool(t, "b_bridge", true);
  1317. }
  1318. else if (s->ServerType == SERVER_TYPE_STANDALONE)
  1319. {
  1320. // Stand-alone mode
  1321. AddCapsBool(t, "b_standalone", true);
  1322. }
  1323. else if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  1324. {
  1325. // Cluster controller mode
  1326. AddCapsBool(t, "b_cluster_controller", true);
  1327. }
  1328. else
  1329. {
  1330. // Cluster member mode
  1331. AddCapsBool(t, "b_cluster_member", true);
  1332. }
  1333. // Virtual HUB is modifiable
  1334. AddCapsBool(t, "b_support_config_hub", s->ServerType != SERVER_TYPE_FARM_MEMBER &&
  1335. s->Cedar->Bridge == false);
  1336. // VPN client can be connected
  1337. AddCapsBool(t, "b_vpn_client_connect", s->Cedar->Bridge == false ? true : false);
  1338. // External authentication server is available
  1339. AddCapsBool(t, "b_support_radius", s->ServerType != SERVER_TYPE_FARM_MEMBER &&
  1340. s->Cedar->Bridge == false);
  1341. // Local-bridge function is available
  1342. AddCapsBool(t, "b_local_bridge", IsBridgeSupported());
  1343. if (OS_IS_WINDOWS(GetOsInfo()->OsType))
  1344. {
  1345. // Packet capture driver is not installed
  1346. AddCapsBool(t, "b_must_install_pcap", IsEthSupported() == false ? true : false);
  1347. }
  1348. else
  1349. {
  1350. // Regard that the driver is installed in the Linux version
  1351. AddCapsBool(t, "b_must_install_pcap", false);
  1352. }
  1353. if (IsBridgeSupported())
  1354. {
  1355. // Tun / tap device is available (only Linux)
  1356. AddCapsBool(t, "b_tap_supported", GetOsInfo()->OsType == OSTYPE_LINUX ? true : false);
  1357. }
  1358. // Cascade connction
  1359. if (s->ServerType == SERVER_TYPE_STANDALONE)
  1360. {
  1361. AddCapsBool(t, "b_support_cascade", true);
  1362. }
  1363. else
  1364. {
  1365. AddCapsBool(t, "b_support_cascade", false);
  1366. }
  1367. // Server authentication can be used in cascade connection
  1368. AddCapsBool(t, "b_support_cascade_cert", true);
  1369. // the log file settings is modifiable
  1370. AddCapsBool(t, "b_support_config_log", s->ServerType != SERVER_TYPE_FARM_MEMBER);
  1371. // Automatic deletion of log file is available
  1372. AddCapsBool(t, "b_support_autodelete", true);
  1373. // Config file operation is available
  1374. AddCapsBool(t, "b_support_config_rw", true);
  1375. // Attribute of each Virtual HUB can be set
  1376. AddCapsBool(t, "b_support_hub_admin_option", true);
  1377. // Client certificate can be set in a cascade connection
  1378. AddCapsBool(t, "b_support_cascade_client_cert", true);
  1379. // Virtual HUB can be hidden
  1380. AddCapsBool(t, "b_support_hide_hub", true);
  1381. // Integrated management
  1382. AddCapsBool(t, "b_support_cluster_admin", true);
  1383. // Flag of open-source version
  1384. AddCapsBool(t, "b_is_softether", true);
  1385. if (s->Cedar->Bridge == false)
  1386. {
  1387. // The virtual layer 3 switch function is available
  1388. AddCapsBool(t, "b_support_layer3", true);
  1389. AddCapsInt(t, "i_max_l3_sw", MAX_NUM_L3_SWITCH);
  1390. AddCapsInt(t, "i_max_l3_if", MAX_NUM_L3_IF);
  1391. AddCapsInt(t, "i_max_l3_table", MAX_NUM_L3_TABLE);
  1392. // Can act as a part of a cluster
  1393. AddCapsBool(t, "b_support_cluster", true);
  1394. }
  1395. else
  1396. {
  1397. AddCapsBool(t, "b_support_layer3", false);
  1398. AddCapsInt(t, "i_max_l3_sw", 0);
  1399. AddCapsInt(t, "i_max_l3_if", 0);
  1400. AddCapsInt(t, "i_max_l3_table", 0);
  1401. AddCapsBool(t, "b_support_cluster", false);
  1402. }
  1403. if (s->ServerType != SERVER_TYPE_FARM_MEMBER && s->Cedar->Bridge == false)
  1404. {
  1405. // Support for CRL
  1406. AddCapsBool(t, "b_support_crl", true);
  1407. // Supports AC
  1408. AddCapsBool(t, "b_support_ac", true);
  1409. }
  1410. // Supports downloading a log file
  1411. AddCapsBool(t, "b_support_read_log", true);
  1412. // Cascade connection can be renamed
  1413. AddCapsBool(t, "b_support_rename_cascade", true);
  1414. if (s->Cedar->Beta)
  1415. {
  1416. // Beta version
  1417. AddCapsBool(t, "b_beta_version", true);
  1418. }
  1419. // VM discrimination
  1420. AddCapsBool(t, "b_is_in_vm", s->IsInVm);
  1421. // Support for display name of the network connection for the local bridge
  1422. #ifdef OS_WIN32
  1423. if (IsBridgeSupported() && IsNt() && GetOsInfo()->OsType >= OSTYPE_WINDOWS_2000_PROFESSIONAL)
  1424. {
  1425. AddCapsBool(t, "b_support_network_connection_name", true);
  1426. }
  1427. #else // OS_WIN32
  1428. if (IsBridgeSupported() && EthIsInterfaceDescriptionSupportedUnix())
  1429. {
  1430. AddCapsBool(t, "b_support_network_connection_name", true);
  1431. }
  1432. #endif // OS_WIN32
  1433. // Support for MAC address filtering
  1434. AddCapsBool(t, "b_support_check_mac", true);
  1435. // Support for status check of the TCP connection
  1436. AddCapsBool(t, "b_support_check_tcp_state", true);
  1437. // Can specify multiple server and retry intervals in Radius authentication
  1438. AddCapsBool(t, "b_support_radius_retry_interval_and_several_servers", s->ServerType != SERVER_TYPE_FARM_MEMBER &&
  1439. s->Cedar->Bridge == false);
  1440. // Can manage the ID of the tagged VLAN in the MAC address table
  1441. AddCapsBool(t, "b_support_vlan", true);
  1442. // Support for Virtual HUB extended options
  1443. if ((s->Cedar->Bridge == false) &&
  1444. (s->ServerType == SERVER_TYPE_STANDALONE || s->ServerType == SERVER_TYPE_FARM_CONTROLLER))
  1445. {
  1446. AddCapsBool(t, "b_support_hub_ext_options", true);
  1447. }
  1448. else
  1449. {
  1450. AddCapsBool(t, "b_support_hub_ext_options", false);
  1451. }
  1452. // Support for Security Policy version 3.0
  1453. AddCapsBool(t, "b_support_policy_ver_3", true);
  1454. // Support for IPv6 access list
  1455. AddCapsBool(t, "b_support_ipv6_acl", true);
  1456. // Support for setting of delay, jitter and packet loss in the access list
  1457. AddCapsBool(t, "b_support_ex_acl", true);
  1458. // Support for URL redirection in the access list
  1459. AddCapsBool(t, "b_support_redirect_url_acl", true);
  1460. // Supports the specification by the group name in the access list
  1461. AddCapsBool(t, "b_support_acl_group", true);
  1462. // Support for IPv6 in connection source IP restriction list
  1463. AddCapsBool(t, "b_support_ipv6_ac", true);
  1464. // Support for VLAN tagged packet transmission configuration tool
  1465. AddCapsBool(t, "b_support_eth_vlan", (OS_IS_WINDOWS_NT(GetOsType()) && GET_KETA(GetOsType(), 100) >= 2));
  1466. // Support for the message display function when the VPN connect to the Virtual HUB
  1467. AddCapsBool(t, "b_support_msg", true);
  1468. // UDP acceleration feature
  1469. AddCapsBool(t, "b_support_udp_acceleration", true);
  1470. // Intel AES Acceleration function
  1471. AddCapsBool(t, "b_support_intel_aes", IsIntelAesNiSupported());
  1472. #ifdef OS_WIN32
  1473. // SeLow driver
  1474. AddCapsBool(t, "b_using_selow_driver", Win32IsUsingSeLow());
  1475. #endif // OS_WIN32
  1476. // VPN Azure function
  1477. AddCapsBool(t, "b_support_azure", SiIsAzureSupported(s));
  1478. // VPN3
  1479. AddCapsBool(t, "b_vpn3", true);
  1480. // VPN4
  1481. AddCapsBool(t, "b_vpn4", true);
  1482. UpdateGlobalServerFlags(s, t);
  1483. }
  1484. // SYSLOG_SETTING
  1485. void InRpcSysLogSetting(SYSLOG_SETTING *t, PACK *p)
  1486. {
  1487. // Validate arguments
  1488. if (t == NULL || p == NULL)
  1489. {
  1490. return;
  1491. }
  1492. Zero(t, sizeof(SYSLOG_SETTING));
  1493. t->SaveType = PackGetInt(p, "SaveType");
  1494. t->Port = PackGetInt(p, "Port");
  1495. PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
  1496. }
  1497. void OutRpcSysLogSetting(PACK *p, SYSLOG_SETTING *t)
  1498. {
  1499. // Validate arguments
  1500. if (t == NULL || p == NULL)
  1501. {
  1502. return;
  1503. }
  1504. PackAddInt(p, "SaveType", t->SaveType);
  1505. PackAddInt(p, "Port", t->Port);
  1506. PackAddStr(p, "Hostname", t->Hostname);
  1507. }
  1508. // CAPSLIST
  1509. void InitCapsList(CAPSLIST *t)
  1510. {
  1511. // Validate arguments
  1512. if (t == NULL)
  1513. {
  1514. return;
  1515. }
  1516. Zero(t, sizeof(CAPSLIST));
  1517. t->CapsList = NewListFast(NULL);
  1518. }
  1519. void InRpcCapsList(CAPSLIST *t, PACK *p)
  1520. {
  1521. UINT i;
  1522. // Validate arguments
  1523. if (t == NULL || p == NULL)
  1524. {
  1525. return;
  1526. }
  1527. Zero(t, sizeof(CAPSLIST));
  1528. t->CapsList = NewListFast(CompareCaps);
  1529. for (i = 0;i < LIST_NUM(p->elements);i++)
  1530. {
  1531. ELEMENT *e = LIST_DATA(p->elements, i);
  1532. if (StartWith(e->name, "caps_") && e->type == VALUE_INT && e->num_value == 1)
  1533. {
  1534. CAPS *c = NewCaps(e->name + 5, e->values[0]->IntValue);
  1535. Insert(t->CapsList, c);
  1536. }
  1537. }
  1538. }
  1539. void OutRpcCapsList(PACK *p, CAPSLIST *t)
  1540. {
  1541. UINT i;
  1542. // Validate arguments
  1543. if (t == NULL || p == NULL)
  1544. {
  1545. return;
  1546. }
  1547. for (i = 0;i < LIST_NUM(t->CapsList);i++)
  1548. {
  1549. char tmp[MAX_SIZE];
  1550. CAPS *c = LIST_DATA(t->CapsList, i);
  1551. Format(tmp, sizeof(tmp), "caps_%s", c->Name);
  1552. PackAddInt(p, tmp, c->Value);
  1553. }
  1554. }
  1555. void FreeRpcCapsList(CAPSLIST *t)
  1556. {
  1557. UINT i;
  1558. // Validate arguments
  1559. if (t == NULL)
  1560. {
  1561. return;
  1562. }
  1563. for (i = 0;i < LIST_NUM(t->CapsList);i++)
  1564. {
  1565. CAPS *c = LIST_DATA(t->CapsList, i);
  1566. FreeCaps(c);
  1567. }
  1568. ReleaseList(t->CapsList);
  1569. }
  1570. // Add a bool type to Caps list
  1571. void AddCapsBool(CAPSLIST *caps, char *name, bool b)
  1572. {
  1573. CAPS *c;
  1574. // Validate arguments
  1575. if (caps == NULL || name == NULL)
  1576. {
  1577. return;
  1578. }
  1579. c = NewCaps(name, b == false ? 0 : 1);
  1580. AddCaps(caps, c);
  1581. }
  1582. // Add the int type to Caps list
  1583. void AddCapsInt(CAPSLIST *caps, char *name, UINT i)
  1584. {
  1585. CAPS *c;
  1586. // Validate arguments
  1587. if (caps == NULL || name == NULL)
  1588. {
  1589. return;
  1590. }
  1591. c = NewCaps(name, i);
  1592. AddCaps(caps, c);
  1593. }
  1594. // Get the int type from the Caps list
  1595. UINT GetCapsInt(CAPSLIST *caps, char *name)
  1596. {
  1597. CAPS *c;
  1598. // Validate arguments
  1599. if (caps == NULL || name == NULL)
  1600. {
  1601. return 0;
  1602. }
  1603. c = GetCaps(caps, name);
  1604. if (c == NULL)
  1605. {
  1606. return 0;
  1607. }
  1608. return c->Value;
  1609. }
  1610. // Get bool type from the Caps list
  1611. bool GetCapsBool(CAPSLIST *caps, char *name)
  1612. {
  1613. CAPS *c;
  1614. // Validate arguments
  1615. if (caps == NULL || name == NULL)
  1616. {
  1617. return false;
  1618. }
  1619. c = GetCaps(caps, name);
  1620. if (c == NULL)
  1621. {
  1622. return false;
  1623. }
  1624. return c->Value == 0 ? false : true;
  1625. }
  1626. // Release the Caps list
  1627. void FreeCapsList(CAPSLIST *caps)
  1628. {
  1629. UINT i;
  1630. // Validate arguments
  1631. if (caps == NULL)
  1632. {
  1633. return;
  1634. }
  1635. for (i = 0;i < LIST_NUM(caps->CapsList);i++)
  1636. {
  1637. CAPS *c = LIST_DATA(caps->CapsList, i);
  1638. FreeCaps(c);
  1639. }
  1640. ReleaseList(caps->CapsList);
  1641. Free(caps);
  1642. }
  1643. // Get the Caps
  1644. CAPS *GetCaps(CAPSLIST *caps, char *name)
  1645. {
  1646. UINT i;
  1647. // Validate arguments
  1648. if (caps == NULL || name == NULL)
  1649. {
  1650. return NULL;
  1651. }
  1652. for (i = 0;i < LIST_NUM(caps->CapsList);i++)
  1653. {
  1654. CAPS *c = LIST_DATA(caps->CapsList, i);
  1655. if (StrCmpi(c->Name, name) == 0)
  1656. {
  1657. return c;
  1658. }
  1659. }
  1660. return NULL;
  1661. }
  1662. // Add to the Caps
  1663. void AddCaps(CAPSLIST *caps, CAPS *c)
  1664. {
  1665. // Validate arguments
  1666. if (caps == NULL || c == NULL)
  1667. {
  1668. return;
  1669. }
  1670. Insert(caps->CapsList, c);
  1671. }
  1672. // Comparison of Caps
  1673. int CompareCaps(void *p1, void *p2)
  1674. {
  1675. CAPS *c1, *c2;
  1676. if (p1 == NULL || p2 == NULL)
  1677. {
  1678. return 0;
  1679. }
  1680. c1 = *(CAPS **)p1;
  1681. c2 = *(CAPS **)p2;
  1682. if (c1 == NULL || c2 == NULL)
  1683. {
  1684. return 0;
  1685. }
  1686. return StrCmpi(c1->Name, c2->Name);
  1687. }
  1688. // Create a Caps list
  1689. CAPSLIST *NewCapsList()
  1690. {
  1691. CAPSLIST *caps = ZeroMalloc(sizeof(CAPSLIST));
  1692. caps->CapsList = NewListFast(CompareCaps);
  1693. return caps;
  1694. }
  1695. // Release the Caps
  1696. void FreeCaps(CAPS *c)
  1697. {
  1698. // Validate arguments
  1699. if (c == NULL)
  1700. {
  1701. return;
  1702. }
  1703. Free(c->Name);
  1704. Free(c);
  1705. }
  1706. // Create a Caps
  1707. CAPS *NewCaps(char *name, UINT value)
  1708. {
  1709. CAPS *c;
  1710. // Validate arguments
  1711. if (name == NULL)
  1712. {
  1713. return NULL;
  1714. }
  1715. c = ZeroMalloc(sizeof(CAPS));
  1716. c->Name = CopyStr(name);
  1717. c->Value = value;
  1718. return c;
  1719. }
  1720. // Calculate the score from the current number of connections and weight
  1721. UINT SiCalcPoint(SERVER *s, UINT num, UINT weight)
  1722. {
  1723. UINT server_max_sessions = SERVER_MAX_SESSIONS;
  1724. if (s == NULL)
  1725. {
  1726. return 0;
  1727. }
  1728. if (weight == 0)
  1729. {
  1730. weight = 100;
  1731. }
  1732. server_max_sessions = GetServerCapsInt(s, "i_max_sessions");
  1733. return (UINT)(((double)server_max_sessions -
  1734. MIN((double)num * 100.0 / (double)weight, (double)server_max_sessions))
  1735. * (double)FARM_BASE_POINT / (double)server_max_sessions);
  1736. }
  1737. // Get the server score
  1738. UINT SiGetPoint(SERVER *s)
  1739. {
  1740. UINT num_session;
  1741. // Validate arguments
  1742. if (s == NULL)
  1743. {
  1744. return 0;
  1745. }
  1746. num_session = Count(s->Cedar->CurrentSessions);
  1747. return SiCalcPoint(s, num_session, s->Weight);
  1748. }
  1749. // Generate the default certificate
  1750. void SiGenerateDefaultCert(X **server_x, K **server_k)
  1751. {
  1752. SiGenerateDefaultCertEx(server_x, server_k, NULL);
  1753. }
  1754. void SiGenerateDefaultCertEx(X **server_x, K **server_k, char *common_name)
  1755. {
  1756. X *x;
  1757. K *private_key, *public_key;
  1758. NAME *name;
  1759. char tmp[MAX_SIZE];
  1760. wchar_t cn[MAX_SIZE];
  1761. // Validate arguments
  1762. if (server_x == NULL || server_k == NULL)
  1763. {
  1764. return;
  1765. }
  1766. // Create a key pair
  1767. RsaGen(&private_key, &public_key, 2048);
  1768. if (IsEmptyStr(common_name))
  1769. {
  1770. // Get the host name
  1771. StrCpy(tmp, sizeof(tmp), "server.softether.vpn");
  1772. GetMachineName(tmp, sizeof(tmp));
  1773. StrToUni(cn, sizeof(cn), tmp);
  1774. }
  1775. else
  1776. {
  1777. StrToUni(cn, sizeof(cn), common_name);
  1778. }
  1779. name = NewName(cn, cn, cn,
  1780. L"US", NULL, NULL);
  1781. x = NewRootX(public_key, private_key, name, MAX(GetDaysUntil2038(), SERVER_DEFAULT_CERT_DAYS), NULL);
  1782. *server_x = x;
  1783. *server_k = private_key;
  1784. FreeName(name);
  1785. FreeK(public_key);
  1786. }
  1787. // Set the server certificate to default
  1788. void SiInitDefaultServerCert(SERVER *s)
  1789. {
  1790. X *x = NULL;
  1791. K *k = NULL;
  1792. // Validate arguments
  1793. if (s == NULL)
  1794. {
  1795. return;
  1796. }
  1797. // Generate a server certificate and private key
  1798. SiGenerateDefaultCert(&x, &k);
  1799. // Configure
  1800. SetCedarCert(s->Cedar, x, k);
  1801. FreeX(x);
  1802. FreeK(k);
  1803. }
  1804. // Set the encryption algorithm name to default
  1805. void SiInitCipherName(SERVER *s)
  1806. {
  1807. // Validate arguments
  1808. if (s == NULL)
  1809. {
  1810. return;
  1811. }
  1812. SetCedarCipherList(s->Cedar, SERVER_DEFAULT_CIPHER_NAME);
  1813. }
  1814. // Initialize the listener list
  1815. void SiInitListenerList(SERVER *s)
  1816. {
  1817. // Validate arguments
  1818. if (s == NULL)
  1819. {
  1820. return;
  1821. }
  1822. SiLockListenerList(s);
  1823. {
  1824. {
  1825. // Register the 4 ports (443, 992, 1194, 8888) as the default port
  1826. SiAddListener(s, SERVER_DEF_PORTS_1, true);
  1827. SiAddListener(s, SERVER_DEF_PORTS_2, true);
  1828. SiAddListener(s, SERVER_DEF_PORTS_3, true);
  1829. SiAddListener(s, SERVER_DEF_PORTS_4, true);
  1830. }
  1831. }
  1832. SiUnlockListenerList(s);
  1833. }
  1834. // Remove the listener
  1835. bool SiDeleteListener(SERVER *s, UINT port)
  1836. {
  1837. SERVER_LISTENER *e;
  1838. // Validate arguments
  1839. if (s == NULL || port == 0)
  1840. {
  1841. return false;
  1842. }
  1843. e = SiGetListener(s, port);
  1844. if (e == NULL)
  1845. {
  1846. return false;
  1847. }
  1848. // Stop if still alive
  1849. SiDisableListener(s, port);
  1850. if (e->Listener != NULL)
  1851. {
  1852. ReleaseListener(e->Listener);
  1853. }
  1854. Delete(s->ServerListenerList, e);
  1855. Free(e);
  1856. return true;
  1857. }
  1858. // Compare the SERVER_LISTENER
  1859. int CompareServerListener(void *p1, void *p2)
  1860. {
  1861. SERVER_LISTENER *s1, *s2;
  1862. if (p1 == NULL || p2 == NULL)
  1863. {
  1864. return 0;
  1865. }
  1866. s1 = *(SERVER_LISTENER **)p1;
  1867. s2 = *(SERVER_LISTENER **)p2;
  1868. if (s1 == NULL || s2 == NULL)
  1869. {
  1870. return 0;
  1871. }
  1872. if (s1->Port > s2->Port)
  1873. {
  1874. return 1;
  1875. }
  1876. else if (s1->Port < s2->Port)
  1877. {
  1878. return -1;
  1879. }
  1880. else
  1881. {
  1882. return 0;
  1883. }
  1884. }
  1885. // Stop the listener
  1886. bool SiDisableListener(SERVER *s, UINT port)
  1887. {
  1888. SERVER_LISTENER *e;
  1889. // Validate arguments
  1890. if (s == NULL || port == 0)
  1891. {
  1892. return false;
  1893. }
  1894. // Get the listener
  1895. e = SiGetListener(s, port);
  1896. if (e == NULL)
  1897. {
  1898. return false;
  1899. }
  1900. if (e->Enabled == false || e->Listener == NULL)
  1901. {
  1902. // Already stopped
  1903. return true;
  1904. }
  1905. // Stop the listener
  1906. StopListener(e->Listener);
  1907. // Release the listener
  1908. ReleaseListener(e->Listener);
  1909. e->Listener = NULL;
  1910. e->Enabled = false;
  1911. return true;
  1912. }
  1913. // Start the listener
  1914. bool SiEnableListener(SERVER *s, UINT port)
  1915. {
  1916. SERVER_LISTENER *e;
  1917. // Validate arguments
  1918. if (s == NULL || port == 0)
  1919. {
  1920. return false;
  1921. }
  1922. // Get the listener
  1923. e = SiGetListener(s, port);
  1924. if (e == NULL)
  1925. {
  1926. return false;
  1927. }
  1928. if (e->Enabled)
  1929. {
  1930. // It has already started
  1931. return true;
  1932. }
  1933. // Create a listener
  1934. e->Listener = NewListener(s->Cedar, LISTENER_TCP, e->Port);
  1935. if (e->Listener == NULL)
  1936. {
  1937. // Failure
  1938. return false;
  1939. }
  1940. e->Listener->DisableDos = e->DisableDos;
  1941. e->Enabled = true;
  1942. return true;
  1943. }
  1944. // Get the listener
  1945. SERVER_LISTENER *SiGetListener(SERVER *s, UINT port)
  1946. {
  1947. UINT i;
  1948. // Validate arguments
  1949. if (s == NULL || port == 0)
  1950. {
  1951. return NULL;
  1952. }
  1953. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  1954. {
  1955. SERVER_LISTENER *e = LIST_DATA(s->ServerListenerList, i);
  1956. if (e->Port == port)
  1957. {
  1958. return e;
  1959. }
  1960. }
  1961. return NULL;
  1962. }
  1963. // Add a listener
  1964. bool SiAddListener(SERVER *s, UINT port, bool enabled)
  1965. {
  1966. return SiAddListenerEx(s, port, enabled, false);
  1967. }
  1968. bool SiAddListenerEx(SERVER *s, UINT port, bool enabled, bool disable_dos)
  1969. {
  1970. SERVER_LISTENER *e;
  1971. UINT i;
  1972. // Validate arguments
  1973. if (s == NULL || port == 0)
  1974. {
  1975. return false;
  1976. }
  1977. // Check whether the listener exists already
  1978. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  1979. {
  1980. e = LIST_DATA(s->ServerListenerList, i);
  1981. if (e->Port == port)
  1982. {
  1983. // Already exist
  1984. return false;
  1985. }
  1986. }
  1987. // Register by initializing a new listener
  1988. e = ZeroMalloc(sizeof(SERVER_LISTENER));
  1989. e->Enabled = enabled;
  1990. e->Port = port;
  1991. e->DisableDos = disable_dos;
  1992. if (e->Enabled)
  1993. {
  1994. // Create a listener
  1995. e->Listener = NewListener(s->Cedar, LISTENER_TCP, e->Port);
  1996. if (e->Listener != NULL)
  1997. {
  1998. e->Listener->DisableDos = e->DisableDos;
  1999. }
  2000. }
  2001. Insert(s->ServerListenerList, e);
  2002. return true;
  2003. }
  2004. // Lock the listener list
  2005. void SiLockListenerList(SERVER *s)
  2006. {
  2007. // Validate arguments
  2008. if (s == NULL)
  2009. {
  2010. return;
  2011. }
  2012. LockList(s->ServerListenerList);
  2013. }
  2014. // Unlock the listener list
  2015. void SiUnlockListenerList(SERVER *s)
  2016. {
  2017. // Validate arguments
  2018. if (s == NULL)
  2019. {
  2020. return;
  2021. }
  2022. UnlockList(s->ServerListenerList);
  2023. }
  2024. // Initialize the Bridge
  2025. void SiInitBridge(SERVER *s)
  2026. {
  2027. HUB *h;
  2028. HUB_OPTION o;
  2029. HUB_LOG g;
  2030. // Validate arguments
  2031. if (s == NULL)
  2032. {
  2033. return;
  2034. }
  2035. Zero(&o, sizeof(o));
  2036. o.MaxSession = 0;
  2037. h = NewHub(s->Cedar, SERVER_DEFAULT_BRIDGE_NAME, &o);
  2038. AddHub(s->Cedar, h);
  2039. h->Offline = true;
  2040. SetHubOnline(h);
  2041. // Log settings
  2042. SiSetDefaultLogSetting(&g);
  2043. SetHubLogSetting(h, &g);
  2044. ReleaseHub(h);
  2045. }
  2046. // Set the default value of the Virtual HUB options
  2047. void SiSetDefaultHubOption(HUB_OPTION *o)
  2048. {
  2049. // Validate arguments
  2050. if (o == NULL)
  2051. {
  2052. return;
  2053. }
  2054. o->MaxSession = 0;
  2055. o->VlanTypeId = MAC_PROTO_TAGVLAN;
  2056. o->NoIPv6DefaultRouterInRAWhenIPv6 = true;
  2057. o->ManageOnlyPrivateIP = true;
  2058. o->ManageOnlyLocalUnicastIPv6 = true;
  2059. o->NoMacAddressLog = true;
  2060. o->NoDhcpPacketLogOutsideHub = true;
  2061. o->AccessListIncludeFileCacheLifetime = ACCESS_LIST_INCLUDE_FILE_CACHE_LIFETIME;
  2062. o->RemoveDefGwOnDhcpForLocalhost = true;
  2063. o->FloodingSendQueueBufferQuota = DEFAULT_FLOODING_QUEUE_LENGTH;
  2064. }
  2065. // Create a default virtual HUB
  2066. void SiInitDefaultHubList(SERVER *s)
  2067. {
  2068. HUB *h;
  2069. HUB_OPTION o;
  2070. HUB_LOG g;
  2071. // Validate arguments
  2072. if (s == NULL)
  2073. {
  2074. return;
  2075. }
  2076. Zero(&o, sizeof(o));
  2077. // Configure a default Virtual HUB management options
  2078. SiSetDefaultHubOption(&o);
  2079. h = NewHub(s->Cedar, s->Cedar->Bridge == false ? SERVER_DEFAULT_HUB_NAME : SERVER_DEFAULT_BRIDGE_NAME, &o);
  2080. h->CreatedTime = SystemTime64();
  2081. AddHub(s->Cedar, h);
  2082. if (s->Cedar->Bridge)
  2083. {
  2084. // Randomize the password
  2085. Rand(h->HashedPassword, sizeof(h->HashedPassword));
  2086. Rand(h->SecurePassword, sizeof(h->SecurePassword));
  2087. }
  2088. h->Offline = true;
  2089. SetHubOnline(h);
  2090. // Log settings
  2091. SiSetDefaultLogSetting(&g);
  2092. SetHubLogSetting(h, &g);
  2093. {
  2094. UINT i;
  2095. for (i = 0;i < 0;i++)
  2096. {
  2097. char tmp[MAX_SIZE];
  2098. USER *u;
  2099. sprintf(tmp, "user%u", i);
  2100. AcLock(h);
  2101. u = NewUser(tmp, L"test", L"", AUTHTYPE_ANONYMOUS, NULL);
  2102. AcAddUser(h, u);
  2103. ReleaseUser(u);
  2104. AcUnlock(h);
  2105. }
  2106. }
  2107. ReleaseHub(h);
  2108. }
  2109. // Set the log settings to default
  2110. void SiSetDefaultLogSetting(HUB_LOG *g)
  2111. {
  2112. // Validate arguments
  2113. if (g == NULL)
  2114. {
  2115. return;
  2116. }
  2117. Zero(g, sizeof(HUB_LOG));
  2118. g->SaveSecurityLog = true;
  2119. g->SecurityLogSwitchType = LOG_SWITCH_DAY;
  2120. g->SavePacketLog = true;
  2121. g->PacketLogSwitchType = LOG_SWITCH_DAY;
  2122. g->PacketLogConfig[PACKET_LOG_TCP_CONN] =
  2123. g->PacketLogConfig[PACKET_LOG_DHCP] = PACKET_LOG_HEADER;
  2124. }
  2125. // Test
  2126. void SiTest(SERVER *s)
  2127. {
  2128. }
  2129. // Set the initial configuration
  2130. void SiLoadInitialConfiguration(SERVER *s)
  2131. {
  2132. RPC_KEEP k;
  2133. // Validate arguments
  2134. if (s == NULL)
  2135. {
  2136. return;
  2137. }
  2138. // Auto saving interval related
  2139. s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
  2140. s->BackupConfigOnlyWhenModified = true;
  2141. s->Weight = FARM_DEFAULT_WEIGHT;
  2142. SiLoadGlobalParamsCfg(NULL);
  2143. // KEEP related
  2144. Zero(&k, sizeof(k));
  2145. {
  2146. k.UseKeepConnect = true;
  2147. }
  2148. k.KeepConnectPort = 80;
  2149. StrCpy(k.KeepConnectHost, sizeof(k.KeepConnectHost), CLIENT_DEFAULT_KEEPALIVE_HOST);
  2150. k.KeepConnectInterval = KEEP_INTERVAL_DEFAULT * 1000;
  2151. k.KeepConnectProtocol = CONNECTION_UDP;
  2152. Lock(s->Keep->lock);
  2153. {
  2154. KEEP *keep = s->Keep;
  2155. keep->Enable = k.UseKeepConnect;
  2156. keep->Server = true;
  2157. StrCpy(keep->ServerName, sizeof(keep->ServerName), k.KeepConnectHost);
  2158. keep->ServerPort = k.KeepConnectPort;
  2159. keep->UdpMode = k.KeepConnectProtocol;
  2160. keep->Interval = k.KeepConnectInterval;
  2161. }
  2162. Unlock(s->Keep->lock);
  2163. // Initialize the password
  2164. {
  2165. Hash(s->HashedPassword, "", 0, true);
  2166. }
  2167. // Set the encryption algorithm name to default
  2168. SiInitCipherName(s);
  2169. // Set the server certificate to default
  2170. SiInitDefaultServerCert(s);
  2171. // Create a default HUB
  2172. {
  2173. SiInitDefaultHubList(s);
  2174. }
  2175. if (s->Cedar->Bridge == false)
  2176. {
  2177. // Create a DDNS client
  2178. s->DDnsClient = NewDDNSClient(s->Cedar, NULL, NULL);
  2179. }
  2180. // Set the listener list to default setting
  2181. SiInitListenerList(s);
  2182. if (s->Cedar->Bridge)
  2183. {
  2184. // SSTP, OpenVPN, and NAT traversal function can not be used in the bridge environment
  2185. s->DisableNatTraversal = true;
  2186. s->DisableSSTPServer = true;
  2187. s->DisableOpenVPNServer = true;
  2188. }
  2189. else
  2190. {
  2191. // Enable the SSTP and OpenVPN for default setting
  2192. OPENVPN_SSTP_CONFIG c;
  2193. Zero(&c, sizeof(c));
  2194. c.EnableOpenVPN = true;
  2195. c.EnableSSTP = true;
  2196. {
  2197. ToStr(c.OpenVPNPortList, OPENVPN_UDP_PORT);
  2198. }
  2199. SiSetOpenVPNAndSSTPConfig(s, &c);
  2200. {
  2201. // Enable VPN-over-ICMP" and VPN-over-DNS for default setting
  2202. s->EnableVpnOverIcmp = false;
  2203. s->EnableVpnOverDns = false;
  2204. }
  2205. }
  2206. s->Eraser = NewEraser(s->Logger, 0);
  2207. }
  2208. // Check whether the ports required for VPN-over-ICMP can be opened
  2209. bool SiCanOpenVpnOverIcmpPort()
  2210. {
  2211. // Whether the ICMP can be opened
  2212. SOCK *s = NewUDP(MAKE_SPECIAL_PORT(IP_PROTO_ICMPV4));
  2213. if (s == NULL)
  2214. {
  2215. // Failure
  2216. return false;
  2217. }
  2218. Disconnect(s);
  2219. ReleaseSock(s);
  2220. return true;
  2221. }
  2222. // Check whether the ports required for VPN-over-DNS can be opened
  2223. bool SiCanOpenVpnOverDnsPort()
  2224. {
  2225. // Whether UDP Port 53 can be listen on
  2226. SOCK *s = NewUDP(53);
  2227. if (s == NULL)
  2228. {
  2229. // Listening failure
  2230. return false;
  2231. }
  2232. Disconnect(s);
  2233. ReleaseSock(s);
  2234. return true;
  2235. }
  2236. // Read the configuration file (main)
  2237. bool SiLoadConfigurationFileMain(SERVER *s, FOLDER *root)
  2238. {
  2239. // Validate arguments
  2240. if (s == NULL || root == NULL)
  2241. {
  2242. return false;
  2243. }
  2244. return SiLoadConfigurationCfg(s, root);
  2245. }
  2246. // Read the configuration file
  2247. bool SiLoadConfigurationFile(SERVER *s)
  2248. {
  2249. // Validate arguments
  2250. bool ret = false;
  2251. FOLDER *root;
  2252. char *server_config_filename = SERVER_CONFIG_FILE_NAME;
  2253. if (s == NULL)
  2254. {
  2255. return false;
  2256. }
  2257. s->CfgRw = NewCfgRwEx2A(&root,
  2258. s->Cedar->Bridge == false ? server_config_filename : BRIDGE_CONFIG_FILE_NAME, false,
  2259. s->Cedar->Bridge == false ? SERVER_CONFIG_TEMPLATE_NAME : BRIDGE_CONFIG_TEMPLATE_NAME);
  2260. if (server_reset_setting)
  2261. {
  2262. CfgDeleteFolder(root);
  2263. root = NULL;
  2264. server_reset_setting = false;
  2265. }
  2266. if (root == NULL)
  2267. {
  2268. return false;
  2269. }
  2270. ret = SiLoadConfigurationFileMain(s, root);
  2271. CfgDeleteFolder(root);
  2272. return ret;
  2273. }
  2274. // Initialize the configuration
  2275. void SiInitConfiguration(SERVER *s)
  2276. {
  2277. // Validate arguments
  2278. if (s == NULL)
  2279. {
  2280. return;
  2281. }
  2282. s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
  2283. s->BackupConfigOnlyWhenModified = true;
  2284. // IPsec server
  2285. if (s->Cedar->Bridge == false)
  2286. {
  2287. s->IPsecServer = NewIPsecServer(s->Cedar);
  2288. }
  2289. // OpenVPN server (UDP)
  2290. if (s->Cedar->Bridge == false)
  2291. {
  2292. s->OpenVpnServerUdp = NewOpenVpnServerUdp(s->Cedar);
  2293. }
  2294. SLog(s->Cedar, "LS_LOAD_CONFIG_1");
  2295. if (SiLoadConfigurationFile(s) == false)
  2296. {
  2297. // Ethernet initialization
  2298. InitEth();
  2299. SLog(s->Cedar, "LS_LOAD_CONFIG_3");
  2300. SiLoadInitialConfiguration(s);
  2301. SetFifoCurrentReallocMemSize(MEM_FIFO_REALLOC_MEM_SIZE);
  2302. server_reset_setting = false;
  2303. }
  2304. else
  2305. {
  2306. SLog(s->Cedar, "LS_LOAD_CONFIG_2");
  2307. }
  2308. s->CfgRw->DontBackup = s->DontBackupConfig;
  2309. // The arp_filter in Linux
  2310. if (GetOsInfo()->OsType == OSTYPE_LINUX)
  2311. {
  2312. if (s->NoLinuxArpFilter == false)
  2313. {
  2314. SetLinuxArpFilter();
  2315. }
  2316. }
  2317. if (s->DisableDosProction)
  2318. {
  2319. DisableDosProtect();
  2320. }
  2321. else
  2322. {
  2323. EnableDosProtect();
  2324. }
  2325. s->AutoSaveConfigSpanSaved = s->AutoSaveConfigSpan;
  2326. // Create a VPN Azure client
  2327. if (s->DDnsClient != NULL && s->Cedar->Bridge == false && s->ServerType == SERVER_TYPE_STANDALONE)
  2328. {
  2329. s->AzureClient = NewAzureClient(s->Cedar, s);
  2330. AcSetEnable(s->AzureClient, s->EnableVpnAzure);
  2331. }
  2332. // Reduce the storage interval in the case of user mode
  2333. #ifdef OS_WIN32
  2334. if (MsIsUserMode())
  2335. {
  2336. s->AutoSaveConfigSpan = MIN(s->AutoSaveConfigSpan, SERVER_FILE_SAVE_INTERVAL_USERMODE);
  2337. }
  2338. #endif //OS_WIN32
  2339. // Create a saving thread
  2340. SLog(s->Cedar, "LS_INIT_SAVE_THREAD", s->AutoSaveConfigSpan / 1000);
  2341. s->SaveHaltEvent = NewEvent();
  2342. s->SaveThread = NewThread(SiSaverThread, s);
  2343. }
  2344. // Set the state of Enabled / Disabled of Azure Client
  2345. void SiSetAzureEnable(SERVER *s, bool enabled)
  2346. {
  2347. // Validate arguments
  2348. if (s == NULL)
  2349. {
  2350. return;
  2351. }
  2352. if (s->AzureClient != NULL)
  2353. {
  2354. AcSetEnable(s->AzureClient, enabled);
  2355. }
  2356. s->EnableVpnAzure = enabled;
  2357. }
  2358. // Get the state of Enabled / Disabled of Azure Client
  2359. bool SiGetAzureEnable(SERVER *s)
  2360. {
  2361. // Validate arguments
  2362. if (s == NULL)
  2363. {
  2364. return false;
  2365. }
  2366. if (s->AzureClient != NULL)
  2367. {
  2368. return AcGetEnable(s->AzureClient);
  2369. }
  2370. else
  2371. {
  2372. return false;
  2373. }
  2374. }
  2375. // Apply the Config to the Azure Client
  2376. void SiApplyAzureConfig(SERVER *s, DDNS_CLIENT_STATUS *ddns_status)
  2377. {
  2378. // Validate arguments
  2379. if (s == NULL)
  2380. {
  2381. return;
  2382. }
  2383. AcApplyCurrentConfig(s->AzureClient, ddns_status);
  2384. }
  2385. // Get whether the Azure Client is enabled
  2386. bool SiIsAzureEnabled(SERVER *s)
  2387. {
  2388. // Validate arguments
  2389. if (s == NULL)
  2390. {
  2391. return false;
  2392. }
  2393. if (s->AzureClient == NULL)
  2394. {
  2395. return false;
  2396. }
  2397. return s->EnableVpnAzure;
  2398. }
  2399. // Get whether the Azure Client is supported
  2400. bool SiIsAzureSupported(SERVER *s)
  2401. {
  2402. // Validate arguments
  2403. if (s == NULL)
  2404. {
  2405. return false;
  2406. }
  2407. if (s->AzureClient == NULL)
  2408. {
  2409. return false;
  2410. }
  2411. return true;
  2412. }
  2413. // Read the server settings from the CFG
  2414. bool SiLoadConfigurationCfg(SERVER *s, FOLDER *root)
  2415. {
  2416. FOLDER *f1, *f2, *f3, *f4, *f5, *f6, *f7, *f8, *f;
  2417. bool is_vgs_enabled = false;
  2418. // Validate arguments
  2419. if (s == NULL || root == NULL)
  2420. {
  2421. return false;
  2422. }
  2423. f = NULL;
  2424. f1 = CfgGetFolder(root, "ServerConfiguration");
  2425. f2 = CfgGetFolder(root, "VirtualHUB");
  2426. f3 = CfgGetFolder(root, "ListenerList");
  2427. f4 = CfgGetFolder(root, "LocalBridgeList");
  2428. f5 = CfgGetFolder(root, "VirtualLayer3SwitchList");
  2429. f6 = CfgGetFolder(root, "LicenseManager");
  2430. f7 = CfgGetFolder(root, "IPsec");
  2431. f8 = CfgGetFolder(root, "DDnsClient");
  2432. if (f1 == NULL)
  2433. {
  2434. SLog(s->Cedar, "LS_BAD_CONFIG");
  2435. return false;
  2436. }
  2437. #ifdef OS_WIN32
  2438. if (f4 != NULL)
  2439. {
  2440. // Read the flag of using the SeLow driver
  2441. bool b = true;
  2442. if (CfgIsItem(f4, "EnableSoftEtherKernelModeDriver"))
  2443. {
  2444. b = CfgGetBool(f4, "EnableSoftEtherKernelModeDriver");
  2445. }
  2446. Win32SetEnableSeLow(b);
  2447. }
  2448. #endif // OS_WIN32
  2449. // Ethernet initialization
  2450. InitEth();
  2451. s->ConfigRevision = CfgGetInt(root, "ConfigRevision");
  2452. if (s->Cedar->Bridge == false && f6 != NULL)
  2453. {
  2454. if (GetServerCapsBool(s, "b_support_license"))
  2455. {
  2456. SiLoadLicenseManager(s, f6);
  2457. }
  2458. }
  2459. DestroyServerCapsCache(s);
  2460. SiLoadServerCfg(s, f1);
  2461. if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
  2462. {
  2463. SiLoadHubs(s, f2);
  2464. }
  2465. SiLoadListeners(s, f3);
  2466. if (f4 != NULL)
  2467. {
  2468. SiLoadLocalBridges(s, f4);
  2469. }
  2470. if (s->Cedar->Bridge == false && f5 != NULL)
  2471. {
  2472. SiLoadL3Switchs(s, f5);
  2473. }
  2474. if (f7 != NULL && GetServerCapsBool(s, "b_support_ipsec"))
  2475. {
  2476. SiLoadIPsec(s, f7);
  2477. }
  2478. if (s->Cedar->Bridge == false)
  2479. {
  2480. if (f8 == NULL)
  2481. {
  2482. // Create a DDNS client with a new key
  2483. s->DDnsClient = NewDDNSClient(s->Cedar, NULL, NULL);
  2484. }
  2485. else
  2486. {
  2487. // Create by reading the setting of the DDNS client
  2488. UCHAR key[SHA1_SIZE];
  2489. if (CfgGetBool(f8, "Disabled"))
  2490. {
  2491. // Disabled
  2492. }
  2493. else
  2494. {
  2495. char machine_name[MAX_SIZE];
  2496. char machine_name2[MAX_SIZE];
  2497. INTERNET_SETTING t;
  2498. BUF *pw;
  2499. // Proxy Setting
  2500. Zero(&t, sizeof(t));
  2501. t.ProxyType = CfgGetInt(f8, "ProxyType");
  2502. CfgGetStr(f8, "ProxyHostName", t.ProxyHostName, sizeof(t.ProxyHostName));
  2503. t.ProxyPort = CfgGetInt(f8, "ProxyPort");
  2504. CfgGetStr(f8, "ProxyUsername", t.ProxyUsername, sizeof(t.ProxyUsername));
  2505. pw = CfgGetBuf(f8, "ProxyPassword");
  2506. if (pw != NULL)
  2507. {
  2508. char *pw_str = DecryptPassword(pw);
  2509. StrCpy(t.ProxyPassword, sizeof(t.ProxyPassword), pw_str);
  2510. Free(pw_str);
  2511. FreeBuf(pw);
  2512. }
  2513. GetMachineHostName(machine_name, sizeof(machine_name));
  2514. CfgGetStr(f8, "LocalHostname", machine_name2, sizeof(machine_name2));
  2515. if (CfgGetByte(f8, "Key", key, sizeof(key)) != sizeof(key) || StrCmpi(machine_name, machine_name2) != 0)
  2516. {
  2517. // Create a DDNS client with a new key
  2518. s->DDnsClient = NewDDNSClient(s->Cedar, NULL, &t);
  2519. }
  2520. else
  2521. {
  2522. // Create the DDNS client with stored key
  2523. s->DDnsClient = NewDDNSClient(s->Cedar, key, &t);
  2524. }
  2525. }
  2526. }
  2527. }
  2528. {
  2529. HUB *h = NULL;
  2530. // Remove the virtual HUB "VPNGATE" when VGS disabled
  2531. LockHubList(s->Cedar);
  2532. {
  2533. h = GetHub(s->Cedar, VG_HUBNAME);
  2534. }
  2535. UnlockHubList(s->Cedar);
  2536. if (h != NULL)
  2537. {
  2538. StopHub(h);
  2539. DelHub(s->Cedar, h);
  2540. ReleaseHub(h);
  2541. }
  2542. }
  2543. s->IPsecMessageDisplayed = CfgGetBool(root, "IPsecMessageDisplayed");
  2544. return true;
  2545. }
  2546. // Write the listener configuration
  2547. void SiWriteListenerCfg(FOLDER *f, SERVER_LISTENER *r)
  2548. {
  2549. // Validate arguments
  2550. if (f == NULL || r == NULL)
  2551. {
  2552. return;
  2553. }
  2554. CfgAddBool(f, "Enabled", r->Enabled);
  2555. CfgAddInt(f, "Port", r->Port);
  2556. CfgAddBool(f, "DisableDos", r->DisableDos);
  2557. }
  2558. // Read the listener configuration
  2559. void SiLoadListenerCfg(SERVER *s, FOLDER *f)
  2560. {
  2561. bool enable;
  2562. UINT port;
  2563. bool disable_dos;
  2564. // Validate arguments
  2565. if (s == NULL || f == NULL)
  2566. {
  2567. return;
  2568. }
  2569. enable = CfgGetBool(f, "Enabled");
  2570. port = CfgGetInt(f, "Port");
  2571. disable_dos = CfgGetBool(f, "DisableDos");
  2572. if (port == 0)
  2573. {
  2574. return;
  2575. }
  2576. SiAddListenerEx(s, port, enable, disable_dos);
  2577. }
  2578. // Read the listener list
  2579. void SiLoadListeners(SERVER *s, FOLDER *f)
  2580. {
  2581. TOKEN_LIST *t;
  2582. UINT i;
  2583. // Validate arguments
  2584. if (s == NULL || f == NULL)
  2585. {
  2586. return;
  2587. }
  2588. t = CfgEnumFolderToTokenList(f);
  2589. for (i = 0;i < t->NumTokens;i++)
  2590. {
  2591. FOLDER *ff = CfgGetFolder(f, t->Token[i]);
  2592. if (ff != NULL)
  2593. {
  2594. SiLoadListenerCfg(s, ff);
  2595. }
  2596. }
  2597. FreeToken(t);
  2598. }
  2599. // Write the listener list
  2600. void SiWriteListeners(FOLDER *f, SERVER *s)
  2601. {
  2602. // Validate arguments
  2603. if (f == NULL || s == NULL)
  2604. {
  2605. return;
  2606. }
  2607. LockList(s->ServerListenerList);
  2608. {
  2609. UINT i;
  2610. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  2611. {
  2612. SERVER_LISTENER *r = LIST_DATA(s->ServerListenerList, i);
  2613. char name[MAX_SIZE];
  2614. Format(name, sizeof(name), "Listener%u", i);
  2615. SiWriteListenerCfg(CfgCreateFolder(f, name), r);
  2616. }
  2617. }
  2618. UnlockList(s->ServerListenerList);
  2619. }
  2620. // Write the bridge
  2621. void SiWriteLocalBridgeCfg(FOLDER *f, LOCALBRIDGE *br)
  2622. {
  2623. // Validate arguments
  2624. if (f == NULL || br == NULL)
  2625. {
  2626. return;
  2627. }
  2628. CfgAddStr(f, "DeviceName", br->DeviceName);
  2629. CfgAddStr(f, "HubName", br->HubName);
  2630. CfgAddBool(f, "NoPromiscuousMode", br->Local);
  2631. CfgAddBool(f, "MonitorMode", br->Monitor);
  2632. CfgAddBool(f, "LimitBroadcast", br->LimitBroadcast);
  2633. if (OS_IS_UNIX(GetOsInfo()->OsType))
  2634. {
  2635. CfgAddBool(f, "TapMode", br->TapMode);
  2636. if (br->TapMode)
  2637. {
  2638. char tmp[MAX_SIZE];
  2639. MacToStr(tmp, sizeof(tmp), br->TapMacAddress);
  2640. CfgAddStr(f, "TapMacAddress", tmp);
  2641. }
  2642. }
  2643. }
  2644. // Write the bridge list
  2645. void SiWriteLocalBridges(FOLDER *f, SERVER *s)
  2646. {
  2647. // Validate arguments
  2648. if (s == NULL || f == NULL)
  2649. {
  2650. return;
  2651. }
  2652. #ifdef OS_WIN32
  2653. CfgAddBool(f, "ShowAllInterfaces", Win32EthGetShowAllIf());
  2654. CfgAddBool(f, "EnableSoftEtherKernelModeDriver", Win32GetEnableSeLow());
  2655. #endif // OS_WIN32
  2656. #ifdef UNIX_LINUX
  2657. CfgAddBool(f, "DoNotDisableOffloading", GetGlobalServerFlag(GSF_LOCALBRIDGE_NO_DISABLE_OFFLOAD));
  2658. #endif // UNIX_LINUX
  2659. LockList(s->Cedar->LocalBridgeList);
  2660. {
  2661. UINT i;
  2662. for (i = 0;i < LIST_NUM(s->Cedar->LocalBridgeList);i++)
  2663. {
  2664. LOCALBRIDGE *br = LIST_DATA(s->Cedar->LocalBridgeList, i);
  2665. char name[MAX_SIZE];
  2666. Format(name, sizeof(name), "LocalBridge%u", i);
  2667. SiWriteLocalBridgeCfg(CfgCreateFolder(f, name), br);
  2668. }
  2669. }
  2670. UnlockList(s->Cedar->LocalBridgeList);
  2671. }
  2672. // Read the bridge
  2673. void SiLoadLocalBridgeCfg(SERVER *s, FOLDER *f)
  2674. {
  2675. char hub[MAX_SIZE];
  2676. char nic[MAX_SIZE];
  2677. bool tapmode = false;
  2678. UCHAR tapaddr[6];
  2679. // Validate arguments
  2680. if (s == NULL || f == NULL)
  2681. {
  2682. return;
  2683. }
  2684. Zero(hub, sizeof(hub));
  2685. Zero(nic, sizeof(nic));
  2686. CfgGetStr(f, "HubName", hub, sizeof(hub));
  2687. CfgGetStr(f, "DeviceName", nic, sizeof(nic));
  2688. if (IsEmptyStr(hub) || IsEmptyStr(nic)
  2689. )
  2690. {
  2691. return;
  2692. }
  2693. if (OS_IS_UNIX(GetOsInfo()->OsType))
  2694. {
  2695. if (CfgGetBool(f, "TapMode"))
  2696. {
  2697. char tmp[MAX_SIZE];
  2698. tapmode = true;
  2699. Zero(tapaddr, sizeof(tapaddr));
  2700. if (CfgGetStr(f, "TapMacAddress", tmp, sizeof(tmp)))
  2701. {
  2702. BUF *b;
  2703. b = StrToBin(tmp);
  2704. if (b != NULL && b->Size == 6)
  2705. {
  2706. Copy(tapaddr, b->Buf, sizeof(tapaddr));
  2707. }
  2708. FreeBuf(b);
  2709. }
  2710. }
  2711. }
  2712. AddLocalBridge(s->Cedar, hub, nic, CfgGetBool(f, "NoPromiscuousMode"), CfgGetBool(f, "MonitorMode"),
  2713. tapmode, tapaddr, CfgGetBool(f, "LimitBroadcast"));
  2714. }
  2715. // Read the bridge list
  2716. void SiLoadLocalBridges(SERVER *s, FOLDER *f)
  2717. {
  2718. TOKEN_LIST *t;
  2719. UINT i;
  2720. // Validate arguments
  2721. if (s == NULL || f == NULL)
  2722. {
  2723. return;
  2724. }
  2725. #ifdef OS_WIN32
  2726. Win32EthSetShowAllIf(CfgGetBool(f, "ShowAllInterfaces"));
  2727. #endif // OS_WIN32
  2728. #ifdef UNIX_LINUX
  2729. SetGlobalServerFlag(GSF_LOCALBRIDGE_NO_DISABLE_OFFLOAD, CfgGetBool(f, "DoNotDisableOffloading"));
  2730. #endif // UNIX_LINUX
  2731. t = CfgEnumFolderToTokenList(f);
  2732. for (i = 0;i < t->NumTokens;i++)
  2733. {
  2734. char *name = t->Token[i];
  2735. SiLoadLocalBridgeCfg(s, CfgGetFolder(f, name));
  2736. }
  2737. FreeToken(t);
  2738. }
  2739. // Increment the configuration revision of the server
  2740. void IncrementServerConfigRevision(SERVER *s)
  2741. {
  2742. // Validate arguments
  2743. if (s == NULL)
  2744. {
  2745. return;
  2746. }
  2747. s->ConfigRevision++;
  2748. }
  2749. // Write the server settings to CFG
  2750. FOLDER *SiWriteConfigurationToCfg(SERVER *s)
  2751. {
  2752. FOLDER *root;
  2753. char region[128];
  2754. // Validate arguments
  2755. if (s == NULL)
  2756. {
  2757. return NULL;
  2758. }
  2759. root = CfgCreateFolder(NULL, TAG_ROOT);
  2760. SiGetCurrentRegion(s->Cedar, region, sizeof(region));
  2761. CfgAddStr(root, "Region", region);
  2762. CfgAddInt(root, "ConfigRevision", s->ConfigRevision);
  2763. SiWriteListeners(CfgCreateFolder(root, "ListenerList"), s);
  2764. SiWriteLocalBridges(CfgCreateFolder(root, "LocalBridgeList"), s);
  2765. SiWriteServerCfg(CfgCreateFolder(root, "ServerConfiguration"), s);
  2766. if (s->UpdatedServerType != SERVER_TYPE_FARM_MEMBER)
  2767. {
  2768. SiWriteHubs(CfgCreateFolder(root, "VirtualHUB"), s);
  2769. }
  2770. if (s->Cedar->Bridge == false)
  2771. {
  2772. SiWriteL3Switchs(CfgCreateFolder(root, "VirtualLayer3SwitchList"), s);
  2773. if (GetServerCapsBool(s, "b_support_license"))
  2774. {
  2775. SiWriteLicenseManager(CfgCreateFolder(root, "LicenseManager"), s);
  2776. }
  2777. }
  2778. if (s->Led)
  2779. {
  2780. CfgAddBool(root, "Led", true);
  2781. CfgAddBool(root, "LedSpecial", s->LedSpecial);
  2782. }
  2783. if (GetServerCapsBool(s, "b_support_ipsec"))
  2784. {
  2785. SiWriteIPsec(CfgCreateFolder(root, "IPsec"), s);
  2786. }
  2787. if (s->Cedar->Bridge == false)
  2788. {
  2789. FOLDER *ddns_folder = CfgCreateFolder(root, "DDnsClient");
  2790. if (s->DDnsClient == NULL)
  2791. {
  2792. // Disabled
  2793. CfgAddBool(ddns_folder, "Disabled", true);
  2794. }
  2795. else
  2796. {
  2797. char machine_name[MAX_SIZE];
  2798. BUF *pw;
  2799. INTERNET_SETTING *t;
  2800. // Enabled
  2801. CfgAddBool(ddns_folder, "Disabled", false);
  2802. CfgAddByte(ddns_folder, "Key", s->DDnsClient->Key, SHA1_SIZE);
  2803. GetMachineHostName(machine_name, sizeof(machine_name));
  2804. CfgAddStr(ddns_folder, "LocalHostname", machine_name);
  2805. t = &s->DDnsClient->InternetSetting;
  2806. CfgAddInt(ddns_folder, "ProxyType", t->ProxyType);
  2807. CfgAddStr(ddns_folder, "ProxyHostName", t->ProxyHostName);
  2808. CfgAddInt(ddns_folder, "ProxyPort", t->ProxyPort);
  2809. CfgAddStr(ddns_folder, "ProxyUsername", t->ProxyUsername);
  2810. if (IsEmptyStr(t->ProxyPassword) == false)
  2811. {
  2812. pw = EncryptPassword(t->ProxyPassword);
  2813. CfgAddBuf(ddns_folder, "ProxyPassword", pw);
  2814. FreeBuf(pw);
  2815. }
  2816. }
  2817. }
  2818. CfgAddBool(root, "IPsecMessageDisplayed", s->IPsecMessageDisplayed);
  2819. return root;
  2820. }
  2821. // Read the policy
  2822. void SiLoadPolicyCfg(POLICY *p, FOLDER *f)
  2823. {
  2824. // Validate arguments
  2825. if (f == NULL || p == NULL)
  2826. {
  2827. return;
  2828. }
  2829. Zero(p, sizeof(POLICY));
  2830. // Ver 2
  2831. p->Access = CfgGetBool(f, "Access");
  2832. p->DHCPFilter = CfgGetBool(f, "DHCPFilter");
  2833. p->DHCPNoServer = CfgGetBool(f, "DHCPNoServer");
  2834. p->DHCPForce = CfgGetBool(f, "DHCPForce");
  2835. p->NoBridge = CfgGetBool(f, "NoBridge");
  2836. p->NoRouting = CfgGetBool(f, "NoRouting");
  2837. p->CheckMac = CfgGetBool(f, "CheckMac");
  2838. p->CheckIP = CfgGetBool(f, "CheckIP");
  2839. p->ArpDhcpOnly = CfgGetBool(f, "ArpDhcpOnly");
  2840. p->PrivacyFilter = CfgGetBool(f, "PrivacyFilter");
  2841. p->NoServer = CfgGetBool(f, "NoServer");
  2842. p->NoBroadcastLimiter = CfgGetBool(f, "NoBroadcastLimiter");
  2843. p->MonitorPort = CfgGetBool(f, "MonitorPort");
  2844. p->MaxConnection = CfgGetInt(f, "MaxConnection");
  2845. p->TimeOut = CfgGetInt(f, "TimeOut");
  2846. p->MaxMac = CfgGetInt(f, "MaxMac");
  2847. p->MaxIP = CfgGetInt(f, "MaxIP");
  2848. p->MaxUpload = CfgGetInt(f, "MaxUpload");
  2849. p->MaxDownload = CfgGetInt(f, "MaxDownload");
  2850. p->FixPassword = CfgGetBool(f, "FixPassword");
  2851. p->MultiLogins = CfgGetInt(f, "MultiLogins");
  2852. p->NoQoS = CfgGetBool(f, "NoQoS");
  2853. // Ver 3
  2854. p->RSandRAFilter = CfgGetBool(f, "RSandRAFilter");
  2855. p->RAFilter = CfgGetBool(f, "RAFilter");
  2856. p->DHCPv6Filter = CfgGetBool(f, "DHCPv6Filter");
  2857. p->DHCPv6NoServer = CfgGetBool(f, "DHCPv6NoServer");
  2858. p->NoRoutingV6 = CfgGetBool(f, "NoRoutingV6");
  2859. p->CheckIPv6 = CfgGetBool(f, "CheckIPv6");
  2860. p->NoServerV6 = CfgGetBool(f, "NoServerV6");
  2861. p->MaxIPv6 = CfgGetInt(f, "MaxIPv6");
  2862. p->NoSavePassword = CfgGetBool(f, "NoSavePassword");
  2863. p->AutoDisconnect = CfgGetInt(f, "AutoDisconnect");
  2864. p->FilterIPv4 = CfgGetBool(f, "FilterIPv4");
  2865. p->FilterIPv6 = CfgGetBool(f, "FilterIPv6");
  2866. p->FilterNonIP = CfgGetBool(f, "FilterNonIP");
  2867. p->NoIPv6DefaultRouterInRA = CfgGetBool(f, "NoIPv6DefaultRouterInRA");
  2868. p->NoIPv6DefaultRouterInRAWhenIPv6 = CfgGetBool(f, "NoIPv6DefaultRouterInRAWhenIPv6");
  2869. p->VLanId = CfgGetInt(f, "VLanId");
  2870. }
  2871. // Write the policy
  2872. void SiWritePolicyCfg(FOLDER *f, POLICY *p, bool cascade_mode)
  2873. {
  2874. // Validate arguments
  2875. if (f == NULL || p == NULL)
  2876. {
  2877. return;
  2878. }
  2879. // Ver 2.0
  2880. if (cascade_mode == false)
  2881. {
  2882. CfgAddBool(f, "Access", p->Access);
  2883. }
  2884. CfgAddBool(f, "DHCPFilter", p->DHCPFilter);
  2885. CfgAddBool(f, "DHCPNoServer", p->DHCPNoServer);
  2886. CfgAddBool(f, "DHCPForce", p->DHCPForce);
  2887. if (cascade_mode == false)
  2888. {
  2889. CfgAddBool(f, "NoBridge", p->NoBridge);
  2890. CfgAddBool(f, "NoRouting", p->NoRouting);
  2891. }
  2892. CfgAddBool(f, "CheckMac", p->CheckMac);
  2893. CfgAddBool(f, "CheckIP", p->CheckIP);
  2894. CfgAddBool(f, "ArpDhcpOnly", p->ArpDhcpOnly);
  2895. if (cascade_mode == false)
  2896. {
  2897. CfgAddBool(f, "PrivacyFilter", p->PrivacyFilter);
  2898. }
  2899. CfgAddBool(f, "NoServer", p->NoServer);
  2900. CfgAddBool(f, "NoBroadcastLimiter", p->NoBroadcastLimiter);
  2901. if (cascade_mode == false)
  2902. {
  2903. CfgAddBool(f, "MonitorPort", p->MonitorPort);
  2904. CfgAddInt(f, "MaxConnection", p->MaxConnection);
  2905. CfgAddInt(f, "TimeOut", p->TimeOut);
  2906. }
  2907. CfgAddInt(f, "MaxMac", p->MaxMac);
  2908. CfgAddInt(f, "MaxIP", p->MaxIP);
  2909. CfgAddInt(f, "MaxUpload", p->MaxUpload);
  2910. CfgAddInt(f, "MaxDownload", p->MaxDownload);
  2911. if (cascade_mode == false)
  2912. {
  2913. CfgAddBool(f, "FixPassword", p->FixPassword);
  2914. CfgAddInt(f, "MultiLogins", p->MultiLogins);
  2915. CfgAddBool(f, "NoQoS", p->NoQoS);
  2916. }
  2917. // Ver 3.0
  2918. CfgAddBool(f, "RSandRAFilter", p->RSandRAFilter);
  2919. CfgAddBool(f, "RAFilter", p->RAFilter);
  2920. CfgAddBool(f, "DHCPv6Filter", p->DHCPv6Filter);
  2921. CfgAddBool(f, "DHCPv6NoServer", p->DHCPv6NoServer);
  2922. if (cascade_mode == false)
  2923. {
  2924. CfgAddBool(f, "NoRoutingV6", p->NoRoutingV6);
  2925. }
  2926. CfgAddBool(f, "CheckIPv6", p->CheckIPv6);
  2927. CfgAddBool(f, "NoServerV6", p->NoServerV6);
  2928. CfgAddInt(f, "MaxIPv6", p->MaxIPv6);
  2929. if (cascade_mode == false)
  2930. {
  2931. CfgAddBool(f, "NoSavePassword", p->NoSavePassword);
  2932. CfgAddInt(f, "AutoDisconnect", p->AutoDisconnect);
  2933. }
  2934. CfgAddBool(f, "FilterIPv4", p->FilterIPv4);
  2935. CfgAddBool(f, "FilterIPv6", p->FilterIPv6);
  2936. CfgAddBool(f, "FilterNonIP", p->FilterNonIP);
  2937. CfgAddBool(f, "NoIPv6DefaultRouterInRA", p->NoIPv6DefaultRouterInRA);
  2938. CfgAddBool(f, "NoIPv6DefaultRouterInRAWhenIPv6", p->NoIPv6DefaultRouterInRAWhenIPv6);
  2939. CfgAddInt(f, "VLanId", p->VLanId);
  2940. }
  2941. // Write the link information of the Virtual HUB
  2942. void SiWriteHubLinkCfg(FOLDER *f, LINK *k)
  2943. {
  2944. // Validate arguments
  2945. if (f == NULL || k == NULL)
  2946. {
  2947. return;
  2948. }
  2949. Lock(k->lock);
  2950. {
  2951. // Online
  2952. CfgAddBool(f, "Online", k->Offline ? false : true);
  2953. // Client options
  2954. CiWriteClientOption(CfgCreateFolder(f, "ClientOption"), k->Option);
  2955. // Client authentication data
  2956. CiWriteClientAuth(CfgCreateFolder(f, "ClientAuth"), k->Auth);
  2957. // Policy
  2958. if (k->Policy != NULL)
  2959. {
  2960. SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), k->Policy, true);
  2961. }
  2962. CfgAddBool(f, "CheckServerCert", k->CheckServerCert);
  2963. if (k->ServerCert != NULL)
  2964. {
  2965. BUF *b = XToBuf(k->ServerCert, false);
  2966. CfgAddBuf(f, "ServerCert", b);
  2967. FreeBuf(b);
  2968. }
  2969. }
  2970. Unlock(k->lock);
  2971. }
  2972. // Read the link information
  2973. void SiLoadHubLinkCfg(FOLDER *f, HUB *h)
  2974. {
  2975. bool online;
  2976. CLIENT_OPTION *o;
  2977. CLIENT_AUTH *a;
  2978. FOLDER *pf;
  2979. POLICY p;
  2980. LINK *k;
  2981. // Validate arguments
  2982. if (f == NULL || h == NULL)
  2983. {
  2984. return;
  2985. }
  2986. pf = CfgGetFolder(f, "Policy");
  2987. if (pf == NULL)
  2988. {
  2989. return;
  2990. }
  2991. SiLoadPolicyCfg(&p, pf);
  2992. online = CfgGetBool(f, "Online");
  2993. o = CiLoadClientOption(CfgGetFolder(f, "ClientOption"));
  2994. a = CiLoadClientAuth(CfgGetFolder(f, "ClientAuth"));
  2995. if (o == NULL || a == NULL)
  2996. {
  2997. Free(o);
  2998. CiFreeClientAuth(a);
  2999. return;
  3000. }
  3001. k = NewLink(h->Cedar, h, o, a, &p);
  3002. if (k != NULL)
  3003. {
  3004. BUF *b;
  3005. k->CheckServerCert = CfgGetBool(f, "CheckServerCert");
  3006. b = CfgGetBuf(f, "ServerCert");
  3007. if (b != NULL)
  3008. {
  3009. k->ServerCert = BufToX(b, false);
  3010. FreeBuf(b);
  3011. }
  3012. if (online)
  3013. {
  3014. k->Offline = true;
  3015. SetLinkOnline(k);
  3016. }
  3017. else
  3018. {
  3019. k->Offline = false;
  3020. SetLinkOffline(k);
  3021. }
  3022. ReleaseLink(k);
  3023. }
  3024. Free(o);
  3025. CiFreeClientAuth(a);
  3026. }
  3027. // Write the SecureNAT of the Virtual HUB
  3028. void SiWriteSecureNAT(HUB *h, FOLDER *f)
  3029. {
  3030. // Validate arguments
  3031. if (h == NULL || f == NULL)
  3032. {
  3033. return;
  3034. }
  3035. CfgAddBool(f, "Disabled", h->EnableSecureNAT ? false : true);
  3036. NiWriteVhOptionEx(h->SecureNATOption, f);
  3037. }
  3038. // Read the administration options for the virtual HUB
  3039. void SiLoadHubAdminOptions(HUB *h, FOLDER *f)
  3040. {
  3041. TOKEN_LIST *t;
  3042. // Validate arguments
  3043. if (h == NULL || f == NULL)
  3044. {
  3045. return;
  3046. }
  3047. t = CfgEnumItemToTokenList(f);
  3048. if (t != NULL)
  3049. {
  3050. UINT i;
  3051. LockList(h->AdminOptionList);
  3052. {
  3053. DeleteAllHubAdminOption(h, false);
  3054. for (i = 0;i < t->NumTokens;i++)
  3055. {
  3056. char *name = t->Token[i];
  3057. ADMIN_OPTION *a;
  3058. UINT value = CfgGetInt(f, name);;
  3059. Trim(name);
  3060. a = ZeroMalloc(sizeof(ADMIN_OPTION));
  3061. StrCpy(a->Name, sizeof(a->Name), name);
  3062. a->Value = value;
  3063. Insert(h->AdminOptionList, a);
  3064. }
  3065. AddHubAdminOptionsDefaults(h, false);
  3066. }
  3067. UnlockList(h->AdminOptionList);
  3068. FreeToken(t);
  3069. }
  3070. }
  3071. // Write the administration options for the virtual HUB
  3072. void SiWriteHubAdminOptions(FOLDER *f, HUB *h)
  3073. {
  3074. // Validate arguments
  3075. if (f == NULL || h == NULL)
  3076. {
  3077. return;
  3078. }
  3079. LockList(h->AdminOptionList);
  3080. {
  3081. UINT i;
  3082. for (i = 0;i < LIST_NUM(h->AdminOptionList);i++)
  3083. {
  3084. ADMIN_OPTION *a = LIST_DATA(h->AdminOptionList, i);
  3085. CfgAddInt(f, a->Name, a->Value);
  3086. }
  3087. }
  3088. UnlockList(h->AdminOptionList);
  3089. }
  3090. // Write the link list of the Virtual HUB
  3091. void SiWriteHubLinks(FOLDER *f, HUB *h)
  3092. {
  3093. // Validate arguments
  3094. if (f == NULL || h == NULL)
  3095. {
  3096. return;
  3097. }
  3098. LockList(h->LinkList);
  3099. {
  3100. UINT i;
  3101. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  3102. {
  3103. LINK *k = LIST_DATA(h->LinkList, i);
  3104. char name[MAX_SIZE];
  3105. Format(name, sizeof(name), "Cascade%u", i);
  3106. SiWriteHubLinkCfg(CfgCreateFolder(f, name), k);
  3107. }
  3108. }
  3109. UnlockList(h->LinkList);
  3110. }
  3111. // Read the link list
  3112. void SiLoadHubLinks(HUB *h, FOLDER *f)
  3113. {
  3114. TOKEN_LIST *t;
  3115. UINT i;
  3116. // Validate arguments
  3117. if (h == NULL || f == NULL)
  3118. {
  3119. return;
  3120. }
  3121. t = CfgEnumFolderToTokenList(f);
  3122. for (i = 0;i < t->NumTokens;i++)
  3123. {
  3124. char *name = t->Token[i];
  3125. SiLoadHubLinkCfg(CfgGetFolder(f, name), h);
  3126. }
  3127. FreeToken(t);
  3128. }
  3129. // Write an item of the access list
  3130. void SiWriteHubAccessCfg(FOLDER *f, ACCESS *a)
  3131. {
  3132. // Validate arguments
  3133. if (f == NULL || a == NULL)
  3134. {
  3135. return;
  3136. }
  3137. CfgAddUniStr(f, "Note", a->Note);
  3138. CfgAddBool(f, "Active", a->Active);
  3139. CfgAddInt(f, "Priority", a->Priority);
  3140. CfgAddBool(f, "Discard", a->Discard);
  3141. CfgAddBool(f, "IsIPv6", a->IsIPv6);
  3142. if (a->IsIPv6 == false)
  3143. {
  3144. CfgAddIp32(f, "SrcIpAddress", a->SrcIpAddress);
  3145. CfgAddIp32(f, "SrcSubnetMask", a->SrcSubnetMask);
  3146. CfgAddIp32(f, "DestIpAddress", a->DestIpAddress);
  3147. CfgAddIp32(f, "DestSubnetMask", a->DestSubnetMask);
  3148. }
  3149. else
  3150. {
  3151. CfgAddIp6Addr(f, "SrcIpAddress6", &a->SrcIpAddress6);
  3152. CfgAddIp6Addr(f, "SrcSubnetMask6", &a->SrcSubnetMask6);
  3153. CfgAddIp6Addr(f, "DestIpAddress6", &a->DestIpAddress6);
  3154. CfgAddIp6Addr(f, "DestSubnetMask6", &a->DestSubnetMask6);
  3155. }
  3156. CfgAddInt(f, "Protocol", a->Protocol);
  3157. CfgAddInt(f, "SrcPortStart", a->SrcPortStart);
  3158. CfgAddInt(f, "SrcPortEnd", a->SrcPortEnd);
  3159. CfgAddInt(f, "DestPortStart", a->DestPortStart);
  3160. CfgAddInt(f, "DestPortEnd", a->DestPortEnd);
  3161. CfgAddStr(f, "SrcUsername", a->SrcUsername);
  3162. CfgAddStr(f, "DestUsername", a->DestUsername);
  3163. CfgAddBool(f, "CheckSrcMac", a->CheckSrcMac);
  3164. if (a->CheckSrcMac)
  3165. {
  3166. char tmp[MAX_PATH];
  3167. MacToStr(tmp, sizeof(tmp), a->SrcMacAddress);
  3168. CfgAddStr(f, "SrcMacAddress", tmp);
  3169. MacToStr(tmp, sizeof(tmp), a->SrcMacMask);
  3170. CfgAddStr(f, "SrcMacMask", tmp);
  3171. }
  3172. CfgAddBool(f, "CheckDstMac", a->CheckDstMac);
  3173. if (a->CheckDstMac)
  3174. {
  3175. char tmp[MAX_PATH];
  3176. MacToStr(tmp, sizeof(tmp), a->DstMacAddress);
  3177. CfgAddStr(f, "DstMacAddress", tmp);
  3178. MacToStr(tmp, sizeof(tmp), a->DstMacMask);
  3179. CfgAddStr(f, "DstMacMask", tmp);
  3180. }
  3181. CfgAddBool(f, "CheckTcpState", a->CheckTcpState);
  3182. CfgAddBool(f, "Established", a->Established);
  3183. CfgAddStr(f, "RedirectUrl", a->RedirectUrl);
  3184. CfgAddInt(f, "Delay", a->Delay);
  3185. CfgAddInt(f, "Jitter", a->Jitter);
  3186. CfgAddInt(f, "Loss", a->Loss);
  3187. }
  3188. // Read an item of the access list
  3189. void SiLoadHubAccessCfg(HUB *h, FOLDER *f)
  3190. {
  3191. ACCESS a;
  3192. char tmp[MAX_PATH];
  3193. // Validate arguments
  3194. if (h == NULL || f == NULL)
  3195. {
  3196. return;
  3197. }
  3198. Zero(&a, sizeof(a));
  3199. CfgGetUniStr(f, "Note", a.Note, sizeof(a.Note));
  3200. a.Active = CfgGetBool(f, "Active");
  3201. a.Priority = CfgGetInt(f, "Priority");
  3202. a.Discard = CfgGetBool(f, "Discard");
  3203. a.IsIPv6 = CfgGetBool(f, "IsIPv6");
  3204. if (a.IsIPv6 == false)
  3205. {
  3206. a.SrcIpAddress = CfgGetIp32(f, "SrcIpAddress");
  3207. a.SrcSubnetMask = CfgGetIp32(f, "SrcSubnetMask");
  3208. a.DestIpAddress = CfgGetIp32(f, "DestIpAddress");
  3209. a.DestSubnetMask = CfgGetIp32(f, "DestSubnetMask");
  3210. }
  3211. else
  3212. {
  3213. CfgGetIp6Addr(f, "SrcIpAddress6", &a.SrcIpAddress6);
  3214. CfgGetIp6Addr(f, "SrcSubnetMask6", &a.SrcSubnetMask6);
  3215. CfgGetIp6Addr(f, "DestIpAddress6", &a.DestIpAddress6);
  3216. CfgGetIp6Addr(f, "DestSubnetMask6", &a.DestSubnetMask6);
  3217. }
  3218. a.Protocol = CfgGetInt(f, "Protocol");
  3219. a.SrcPortStart = CfgGetInt(f, "SrcPortStart");
  3220. a.SrcPortEnd = CfgGetInt(f, "SrcPortEnd");
  3221. a.DestPortStart = CfgGetInt(f, "DestPortStart");
  3222. a.DestPortEnd = CfgGetInt(f, "DestPortEnd");
  3223. CfgGetStr(f, "SrcUsername", a.SrcUsername, sizeof(a.SrcUsername));
  3224. CfgGetStr(f, "DestUsername", a.DestUsername, sizeof(a.DestUsername));
  3225. a.CheckSrcMac = CfgGetBool(f, "CheckSrcMac");
  3226. if (CfgGetByte(f, "SrcMacAddress", a.SrcMacAddress, sizeof(a.SrcMacAddress)) == 0)
  3227. {
  3228. CfgGetStr(f, "SrcMacAddress", tmp, sizeof(tmp));
  3229. if (StrToMac(a.SrcMacAddress, tmp) == false)
  3230. {
  3231. a.CheckSrcMac = false;
  3232. }
  3233. }
  3234. if (CfgGetByte(f, "SrcMacMask", a.SrcMacMask, sizeof(a.SrcMacMask)) == 0)
  3235. {
  3236. CfgGetStr(f, "SrcMacMask", tmp, sizeof(tmp));
  3237. if (StrToMac(a.SrcMacMask, tmp) == false)
  3238. {
  3239. a.CheckSrcMac = false;
  3240. }
  3241. }
  3242. a.CheckDstMac = CfgGetBool(f, "CheckDstMac");
  3243. if (CfgGetByte(f, "DstMacAddress", a.DstMacAddress, sizeof(a.DstMacAddress)) == 0)
  3244. {
  3245. CfgGetStr(f, "DstMacAddress", tmp, sizeof(tmp));
  3246. if (StrToMac(a.DstMacAddress, tmp) == false)
  3247. {
  3248. a.CheckDstMac = false;
  3249. }
  3250. }
  3251. if (CfgGetByte(f, "DstMacMask", a.DstMacMask, sizeof(a.DstMacMask)) == 0)
  3252. {
  3253. CfgGetStr(f, "DstMacMask", tmp, sizeof(tmp));
  3254. if (StrToMac(a.DstMacMask, tmp) == false)
  3255. {
  3256. a.CheckDstMac = false;
  3257. }
  3258. }
  3259. a.CheckTcpState = CfgGetBool(f, "CheckTcpState");
  3260. a.Established = CfgGetBool(f, "Established");
  3261. a.Delay = MAKESURE(CfgGetInt(f, "Delay"), 0, HUB_ACCESSLIST_DELAY_MAX);
  3262. a.Jitter = MAKESURE(CfgGetInt(f, "Jitter"), 0, HUB_ACCESSLIST_JITTER_MAX);
  3263. a.Loss = MAKESURE(CfgGetInt(f, "Loss"), 0, HUB_ACCESSLIST_LOSS_MAX);
  3264. CfgGetStr(f, "RedirectUrl", a.RedirectUrl, sizeof(a.RedirectUrl));
  3265. AddAccessList(h, &a);
  3266. }
  3267. // Write the access list
  3268. void SiWriteHubAccessLists(FOLDER *f, HUB *h)
  3269. {
  3270. // Validate arguments
  3271. if (f == NULL || h == NULL)
  3272. {
  3273. return;
  3274. }
  3275. LockList(h->AccessList);
  3276. {
  3277. UINT i;
  3278. for (i = 0;i < LIST_NUM(h->AccessList);i++)
  3279. {
  3280. ACCESS *a = LIST_DATA(h->AccessList, i);
  3281. char name[MAX_SIZE];
  3282. ToStr(name, a->Id);
  3283. SiWriteHubAccessCfg(CfgCreateFolder(f, name), a);
  3284. }
  3285. }
  3286. UnlockList(h->AccessList);
  3287. }
  3288. // Read the access list
  3289. void SiLoadHubAccessLists(HUB *h, FOLDER *f)
  3290. {
  3291. TOKEN_LIST *t;
  3292. UINT i;
  3293. // Validate arguments
  3294. if (f == NULL || h == NULL)
  3295. {
  3296. return;
  3297. }
  3298. t = CfgEnumFolderToTokenList(f);
  3299. for (i = 0;i < t->NumTokens;i++)
  3300. {
  3301. char *name = t->Token[i];
  3302. UINT id = ToInt(name);
  3303. SiLoadHubAccessCfg(h, CfgGetFolder(f, name));
  3304. }
  3305. FreeToken(t);
  3306. }
  3307. // Read the HUB_OPTION
  3308. void SiLoadHubOptionCfg(FOLDER *f, HUB_OPTION *o)
  3309. {
  3310. char tmp[MAX_SIZE];
  3311. // Validate arguments
  3312. if (f == NULL || o == NULL)
  3313. {
  3314. return;
  3315. }
  3316. o->MaxSession = CfgGetInt(f, "MaxSession");
  3317. o->NoArpPolling = CfgGetBool(f, "NoArpPolling");
  3318. o->NoIPv6AddrPolling = CfgGetBool(f, "NoIPv6AddrPolling");
  3319. o->NoIpTable = CfgGetBool(f, "NoIpTable");
  3320. o->NoEnum = CfgGetBool(f, "NoEnum");
  3321. o->FilterPPPoE = CfgGetBool(f, "FilterPPPoE");
  3322. o->FilterOSPF = CfgGetBool(f, "FilterOSPF");
  3323. o->FilterIPv4 = CfgGetBool(f, "FilterIPv4");
  3324. o->FilterIPv6 = CfgGetBool(f, "FilterIPv6");
  3325. o->FilterNonIP = CfgGetBool(f, "FilterNonIP");
  3326. o->FilterBPDU = CfgGetBool(f, "FilterBPDU");
  3327. o->NoIPv4PacketLog = CfgGetBool(f, "NoIPv4PacketLog");
  3328. o->NoIPv6PacketLog = CfgGetBool(f, "NoIPv6PacketLog");
  3329. o->NoIPv6DefaultRouterInRAWhenIPv6 = CfgGetBool(f, "NoIPv6DefaultRouterInRAWhenIPv6");
  3330. o->DisableIPParsing = CfgGetBool(f, "DisableIPParsing");
  3331. o->YieldAfterStorePacket = CfgGetBool(f, "YieldAfterStorePacket");
  3332. o->NoSpinLockForPacketDelay = CfgGetBool(f, "NoSpinLockForPacketDelay");
  3333. o->BroadcastStormDetectionThreshold = CfgGetInt(f, "BroadcastStormDetectionThreshold");
  3334. o->ClientMinimumRequiredBuild = CfgGetInt(f, "ClientMinimumRequiredBuild");
  3335. o->RequiredClientId = CfgGetInt(f, "RequiredClientId");
  3336. o->NoManageVlanId = CfgGetBool(f, "NoManageVlanId");
  3337. o->VlanTypeId = 0;
  3338. if (CfgGetStr(f, "VlanTypeId", tmp, sizeof(tmp)))
  3339. {
  3340. o->VlanTypeId = HexToInt(tmp);
  3341. }
  3342. if (o->VlanTypeId == 0)
  3343. {
  3344. o->VlanTypeId = MAC_PROTO_TAGVLAN;
  3345. }
  3346. o->FixForDLinkBPDU = CfgGetBool(f, "FixForDLinkBPDU");
  3347. o->BroadcastLimiterStrictMode = CfgGetBool(f, "BroadcastLimiterStrictMode");
  3348. o->MaxLoggedPacketsPerMinute = CfgGetInt(f, "MaxLoggedPacketsPerMinute");
  3349. if (CfgIsItem(f, "FloodingSendQueueBufferQuota"))
  3350. {
  3351. o->FloodingSendQueueBufferQuota = CfgGetInt(f, "FloodingSendQueueBufferQuota");
  3352. }
  3353. else
  3354. {
  3355. o->FloodingSendQueueBufferQuota = DEFAULT_FLOODING_QUEUE_LENGTH;
  3356. }
  3357. o->DoNotSaveHeavySecurityLogs = CfgGetBool(f, "DoNotSaveHeavySecurityLogs");
  3358. if (CfgIsItem(f, "DropBroadcastsInPrivacyFilterMode"))
  3359. {
  3360. o->DropBroadcastsInPrivacyFilterMode = CfgGetBool(f, "DropBroadcastsInPrivacyFilterMode");
  3361. }
  3362. else
  3363. {
  3364. o->DropBroadcastsInPrivacyFilterMode = true;
  3365. }
  3366. if (CfgIsItem(f, "DropArpInPrivacyFilterMode"))
  3367. {
  3368. o->DropArpInPrivacyFilterMode = CfgGetBool(f, "DropArpInPrivacyFilterMode");
  3369. }
  3370. else
  3371. {
  3372. o->DropArpInPrivacyFilterMode = true;
  3373. }
  3374. o->NoLookBPDUBridgeId = CfgGetBool(f, "NoLookBPDUBridgeId");
  3375. o->AdjustTcpMssValue = CfgGetInt(f, "AdjustTcpMssValue");
  3376. o->DisableAdjustTcpMss = CfgGetBool(f, "DisableAdjustTcpMss");
  3377. if (CfgIsItem(f, "NoDhcpPacketLogOutsideHub"))
  3378. {
  3379. o->NoDhcpPacketLogOutsideHub = CfgGetBool(f, "NoDhcpPacketLogOutsideHub");
  3380. }
  3381. else
  3382. {
  3383. o->NoDhcpPacketLogOutsideHub = true;
  3384. }
  3385. o->DisableHttpParsing = CfgGetBool(f, "DisableHttpParsing");
  3386. o->DisableUdpAcceleration = CfgGetBool(f, "DisableUdpAcceleration");
  3387. o->DisableUdpFilterForLocalBridgeNic = CfgGetBool(f, "DisableUdpFilterForLocalBridgeNic");
  3388. o->ApplyIPv4AccessListOnArpPacket = CfgGetBool(f, "ApplyIPv4AccessListOnArpPacket");
  3389. if (CfgIsItem(f, "RemoveDefGwOnDhcpForLocalhost"))
  3390. {
  3391. o->RemoveDefGwOnDhcpForLocalhost = CfgGetBool(f, "RemoveDefGwOnDhcpForLocalhost");
  3392. }
  3393. else
  3394. {
  3395. o->RemoveDefGwOnDhcpForLocalhost = true;
  3396. }
  3397. o->SecureNAT_MaxTcpSessionsPerIp = CfgGetInt(f, "SecureNAT_MaxTcpSessionsPerIp");
  3398. o->SecureNAT_MaxTcpSynSentPerIp = CfgGetInt(f, "SecureNAT_MaxTcpSynSentPerIp");
  3399. o->SecureNAT_MaxUdpSessionsPerIp = CfgGetInt(f, "SecureNAT_MaxUdpSessionsPerIp");
  3400. o->SecureNAT_MaxDnsSessionsPerIp = CfgGetInt(f, "SecureNAT_MaxDnsSessionsPerIp");
  3401. o->SecureNAT_MaxIcmpSessionsPerIp = CfgGetInt(f, "SecureNAT_MaxIcmpSessionsPerIp");
  3402. o->AccessListIncludeFileCacheLifetime = CfgGetInt(f, "AccessListIncludeFileCacheLifetime");
  3403. if (o->AccessListIncludeFileCacheLifetime == 0)
  3404. {
  3405. o->AccessListIncludeFileCacheLifetime = ACCESS_LIST_INCLUDE_FILE_CACHE_LIFETIME;
  3406. }
  3407. o->DisableKernelModeSecureNAT = CfgGetBool(f, "DisableKernelModeSecureNAT");
  3408. o->DisableUserModeSecureNAT = CfgGetBool(f, "DisableUserModeSecureNAT");
  3409. o->DisableCheckMacOnLocalBridge = CfgGetBool(f, "DisableCheckMacOnLocalBridge");
  3410. o->DisableCorrectIpOffloadChecksum = CfgGetBool(f, "DisableCorrectIpOffloadChecksum");
  3411. o->SuppressClientUpdateNotification = CfgGetBool(f, "SuppressClientUpdateNotification");
  3412. o->AssignVLanIdByRadiusAttribute = CfgGetBool(f, "AssignVLanIdByRadiusAttribute");
  3413. o->SecureNAT_RandomizeAssignIp = CfgGetBool(f, "SecureNAT_RandomizeAssignIp");
  3414. o->DetectDormantSessionInterval = CfgGetInt(f, "DetectDormantSessionInterval");
  3415. o->NoPhysicalIPOnPacketLog = CfgGetBool(f, "NoPhysicalIPOnPacketLog");
  3416. // Enabled by default
  3417. if (CfgIsItem(f, "ManageOnlyPrivateIP"))
  3418. {
  3419. o->ManageOnlyPrivateIP = CfgGetBool(f, "ManageOnlyPrivateIP");
  3420. }
  3421. else
  3422. {
  3423. o->ManageOnlyPrivateIP = true;
  3424. }
  3425. if (CfgIsItem(f, "ManageOnlyLocalUnicastIPv6"))
  3426. {
  3427. o->ManageOnlyLocalUnicastIPv6 = CfgGetBool(f, "ManageOnlyLocalUnicastIPv6");
  3428. }
  3429. else
  3430. {
  3431. o->ManageOnlyLocalUnicastIPv6 = true;
  3432. }
  3433. if (CfgIsItem(f, "NoMacAddressLog"))
  3434. {
  3435. o->NoMacAddressLog = CfgGetBool(f, "NoMacAddressLog");
  3436. }
  3437. else
  3438. {
  3439. o->NoMacAddressLog = true;
  3440. }
  3441. }
  3442. // Write the HUB_OPTION
  3443. void SiWriteHubOptionCfg(FOLDER *f, HUB_OPTION *o)
  3444. {
  3445. char tmp[MAX_SIZE];
  3446. // Validate arguments
  3447. if (f == NULL || o == NULL)
  3448. {
  3449. return;
  3450. }
  3451. CfgAddInt(f, "MaxSession", o->MaxSession);
  3452. CfgAddBool(f, "NoArpPolling", o->NoArpPolling);
  3453. CfgAddBool(f, "NoIPv6AddrPolling", o->NoIPv6AddrPolling);
  3454. CfgAddBool(f, "NoIpTable", o->NoIpTable);
  3455. CfgAddBool(f, "NoEnum", o->NoEnum);
  3456. CfgAddBool(f, "FilterPPPoE", o->FilterPPPoE);
  3457. CfgAddBool(f, "FilterOSPF", o->FilterOSPF);
  3458. CfgAddBool(f, "FilterIPv4", o->FilterIPv4);
  3459. CfgAddBool(f, "FilterIPv6", o->FilterIPv6);
  3460. CfgAddBool(f, "FilterNonIP", o->FilterNonIP);
  3461. CfgAddBool(f, "NoIPv4PacketLog", o->NoIPv4PacketLog);
  3462. CfgAddBool(f, "NoIPv6PacketLog", o->NoIPv6PacketLog);
  3463. CfgAddBool(f, "FilterBPDU", o->FilterBPDU);
  3464. CfgAddBool(f, "NoIPv6DefaultRouterInRAWhenIPv6", o->NoIPv6DefaultRouterInRAWhenIPv6);
  3465. CfgAddBool(f, "NoMacAddressLog", o->NoMacAddressLog);
  3466. CfgAddBool(f, "ManageOnlyPrivateIP", o->ManageOnlyPrivateIP);
  3467. CfgAddBool(f, "ManageOnlyLocalUnicastIPv6", o->ManageOnlyLocalUnicastIPv6);
  3468. CfgAddBool(f, "DisableIPParsing", o->DisableIPParsing);
  3469. CfgAddBool(f, "YieldAfterStorePacket", o->YieldAfterStorePacket);
  3470. CfgAddBool(f, "NoSpinLockForPacketDelay", o->NoSpinLockForPacketDelay);
  3471. CfgAddInt(f, "BroadcastStormDetectionThreshold", o->BroadcastStormDetectionThreshold);
  3472. CfgAddInt(f, "ClientMinimumRequiredBuild", o->ClientMinimumRequiredBuild);
  3473. CfgAddInt(f, "RequiredClientId", o->RequiredClientId);
  3474. CfgAddBool(f, "NoManageVlanId", o->NoManageVlanId);
  3475. Format(tmp, sizeof(tmp), "0x%x", o->VlanTypeId);
  3476. CfgAddStr(f, "VlanTypeId", tmp);
  3477. if (o->FixForDLinkBPDU)
  3478. {
  3479. CfgAddBool(f, "FixForDLinkBPDU", o->FixForDLinkBPDU);
  3480. }
  3481. CfgAddBool(f, "BroadcastLimiterStrictMode", o->BroadcastLimiterStrictMode);
  3482. CfgAddInt(f, "MaxLoggedPacketsPerMinute", o->MaxLoggedPacketsPerMinute);
  3483. CfgAddInt(f, "FloodingSendQueueBufferQuota", o->FloodingSendQueueBufferQuota);
  3484. CfgAddBool(f, "DoNotSaveHeavySecurityLogs", o->DoNotSaveHeavySecurityLogs);
  3485. CfgAddBool(f, "DropBroadcastsInPrivacyFilterMode", o->DropBroadcastsInPrivacyFilterMode);
  3486. CfgAddBool(f, "DropArpInPrivacyFilterMode", o->DropArpInPrivacyFilterMode);
  3487. CfgAddBool(f, "SuppressClientUpdateNotification", o->SuppressClientUpdateNotification);
  3488. CfgAddBool(f, "AssignVLanIdByRadiusAttribute", o->AssignVLanIdByRadiusAttribute);
  3489. CfgAddBool(f, "SecureNAT_RandomizeAssignIp", o->SecureNAT_RandomizeAssignIp);
  3490. CfgAddBool(f, "NoPhysicalIPOnPacketLog", o->NoPhysicalIPOnPacketLog);
  3491. CfgAddInt(f, "DetectDormantSessionInterval", o->DetectDormantSessionInterval);
  3492. CfgAddBool(f, "NoLookBPDUBridgeId", o->NoLookBPDUBridgeId);
  3493. CfgAddInt(f, "AdjustTcpMssValue", o->AdjustTcpMssValue);
  3494. CfgAddBool(f, "DisableAdjustTcpMss", o->DisableAdjustTcpMss);
  3495. CfgAddBool(f, "NoDhcpPacketLogOutsideHub", o->NoDhcpPacketLogOutsideHub);
  3496. CfgAddBool(f, "DisableHttpParsing", o->DisableHttpParsing);
  3497. CfgAddBool(f, "DisableUdpAcceleration", o->DisableUdpAcceleration);
  3498. CfgAddBool(f, "DisableUdpFilterForLocalBridgeNic", o->DisableUdpFilterForLocalBridgeNic);
  3499. CfgAddBool(f, "ApplyIPv4AccessListOnArpPacket", o->ApplyIPv4AccessListOnArpPacket);
  3500. CfgAddBool(f, "RemoveDefGwOnDhcpForLocalhost", o->RemoveDefGwOnDhcpForLocalhost);
  3501. CfgAddInt(f, "SecureNAT_MaxTcpSessionsPerIp", o->SecureNAT_MaxTcpSessionsPerIp);
  3502. CfgAddInt(f, "SecureNAT_MaxTcpSynSentPerIp", o->SecureNAT_MaxTcpSynSentPerIp);
  3503. CfgAddInt(f, "SecureNAT_MaxUdpSessionsPerIp", o->SecureNAT_MaxUdpSessionsPerIp);
  3504. CfgAddInt(f, "SecureNAT_MaxDnsSessionsPerIp", o->SecureNAT_MaxDnsSessionsPerIp);
  3505. CfgAddInt(f, "SecureNAT_MaxIcmpSessionsPerIp", o->SecureNAT_MaxIcmpSessionsPerIp);
  3506. CfgAddInt(f, "AccessListIncludeFileCacheLifetime", o->AccessListIncludeFileCacheLifetime);
  3507. CfgAddBool(f, "DisableKernelModeSecureNAT", o->DisableKernelModeSecureNAT);
  3508. CfgAddBool(f, "DisableUserModeSecureNAT", o->DisableUserModeSecureNAT);
  3509. CfgAddBool(f, "DisableCheckMacOnLocalBridge", o->DisableCheckMacOnLocalBridge);
  3510. CfgAddBool(f, "DisableCorrectIpOffloadChecksum", o->DisableCorrectIpOffloadChecksum);
  3511. }
  3512. // Write the user
  3513. void SiWriteUserCfg(FOLDER *f, USER *u)
  3514. {
  3515. BUF *b;
  3516. AUTHPASSWORD *password;
  3517. AUTHRADIUS *radius;
  3518. AUTHNT *nt;
  3519. AUTHUSERCERT *usercert;
  3520. AUTHROOTCERT *rootcert;
  3521. // Validate arguments
  3522. if (f == NULL || u == NULL)
  3523. {
  3524. return;
  3525. }
  3526. Lock(u->lock);
  3527. {
  3528. CfgAddUniStr(f, "RealName", u->RealName);
  3529. CfgAddUniStr(f, "Note", u->Note);
  3530. if (u->Group != NULL)
  3531. {
  3532. CfgAddStr(f, "GroupName", u->GroupName);
  3533. }
  3534. CfgAddInt64(f, "CreatedTime", u->CreatedTime);
  3535. CfgAddInt64(f, "UpdatedTime", u->UpdatedTime);
  3536. CfgAddInt64(f, "ExpireTime", u->ExpireTime);
  3537. CfgAddInt64(f, "LastLoginTime", u->LastLoginTime);
  3538. CfgAddInt(f, "NumLogin", u->NumLogin);
  3539. if (u->Policy != NULL)
  3540. {
  3541. SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), u->Policy, false);
  3542. }
  3543. SiWriteTraffic(f, "Traffic", u->Traffic);
  3544. CfgAddInt(f, "AuthType", u->AuthType);
  3545. if (u->AuthData != NULL)
  3546. {
  3547. switch (u->AuthType)
  3548. {
  3549. case AUTHTYPE_ANONYMOUS:
  3550. break;
  3551. case AUTHTYPE_PASSWORD:
  3552. password = (AUTHPASSWORD *)u->AuthData;
  3553. CfgAddByte(f, "AuthPassword", password->HashedKey, sizeof(password->HashedKey));
  3554. if (IsZero(password->NtLmSecureHash, sizeof(password->NtLmSecureHash)) == false)
  3555. {
  3556. CfgAddByte(f, "AuthNtLmSecureHash", password->NtLmSecureHash, sizeof(password->NtLmSecureHash));
  3557. }
  3558. break;
  3559. case AUTHTYPE_NT:
  3560. nt = (AUTHNT *)u->AuthData;
  3561. CfgAddUniStr(f, "AuthNtUserName", nt->NtUsername);
  3562. break;
  3563. case AUTHTYPE_RADIUS:
  3564. radius = (AUTHRADIUS *)u->AuthData;
  3565. CfgAddUniStr(f, "AuthRadiusUsername", radius->RadiusUsername);
  3566. break;
  3567. case AUTHTYPE_USERCERT:
  3568. usercert = (AUTHUSERCERT *)u->AuthData;
  3569. b = XToBuf(usercert->UserX, false);
  3570. if (b != NULL)
  3571. {
  3572. CfgAddBuf(f, "AuthUserCert", b);
  3573. FreeBuf(b);
  3574. }
  3575. break;
  3576. case AUTHTYPE_ROOTCERT:
  3577. rootcert = (AUTHROOTCERT *)u->AuthData;
  3578. if (rootcert->Serial != NULL && rootcert->Serial->size >= 1)
  3579. {
  3580. CfgAddByte(f, "AuthSerial", rootcert->Serial->data, rootcert->Serial->size);
  3581. }
  3582. if (rootcert->CommonName != NULL && UniIsEmptyStr(rootcert->CommonName) == false)
  3583. {
  3584. CfgAddUniStr(f, "AuthCommonName", rootcert->CommonName);
  3585. }
  3586. break;
  3587. }
  3588. }
  3589. }
  3590. Unlock(u->lock);
  3591. }
  3592. // Read an user
  3593. void SiLoadUserCfg(HUB *h, FOLDER *f)
  3594. {
  3595. char *username;
  3596. wchar_t realname[MAX_SIZE];
  3597. wchar_t note[MAX_SIZE];
  3598. char groupname[MAX_SIZE];
  3599. FOLDER *pf;
  3600. UINT64 created_time;
  3601. UINT64 updated_time;
  3602. UINT64 expire_time;
  3603. UINT64 last_login_time;
  3604. UINT num_login;
  3605. POLICY p;
  3606. TRAFFIC t;
  3607. BUF *b;
  3608. UINT authtype;
  3609. void *authdata;
  3610. X_SERIAL *serial = NULL;
  3611. wchar_t common_name[MAX_SIZE];
  3612. UCHAR hashed_password[SHA1_SIZE];
  3613. UCHAR md4_password[MD5_SIZE];
  3614. wchar_t tmp[MAX_SIZE];
  3615. USER *u;
  3616. USERGROUP *g;
  3617. // Validate arguments
  3618. if (h == NULL || f == NULL)
  3619. {
  3620. return;
  3621. }
  3622. username = f->Name;
  3623. CfgGetUniStr(f, "RealName", realname, sizeof(realname));
  3624. CfgGetUniStr(f, "Note", note, sizeof(note));
  3625. CfgGetStr(f, "GroupName", groupname, sizeof(groupname));
  3626. created_time = CfgGetInt64(f, "CreatedTime");
  3627. updated_time = CfgGetInt64(f, "UpdatedTime");
  3628. expire_time = CfgGetInt64(f, "ExpireTime");
  3629. last_login_time = CfgGetInt64(f, "LastLoginTime");
  3630. num_login = CfgGetInt(f, "NumLogin");
  3631. pf = CfgGetFolder(f, "Policy");
  3632. if (pf != NULL)
  3633. {
  3634. SiLoadPolicyCfg(&p, pf);
  3635. }
  3636. SiLoadTraffic(f, "Traffic", &t);
  3637. authtype = CfgGetInt(f, "AuthType");
  3638. authdata = NULL;
  3639. switch (authtype)
  3640. {
  3641. case AUTHTYPE_PASSWORD:
  3642. Zero(hashed_password, sizeof(hashed_password));
  3643. Zero(md4_password, sizeof(md4_password));
  3644. CfgGetByte(f, "AuthPassword", hashed_password, sizeof(hashed_password));
  3645. CfgGetByte(f, "AuthNtLmSecureHash", md4_password, sizeof(md4_password));
  3646. authdata = NewPasswordAuthDataRaw(hashed_password, md4_password);
  3647. break;
  3648. case AUTHTYPE_NT:
  3649. if (CfgGetUniStr(f, "AuthNtUserName", tmp, sizeof(tmp)))
  3650. {
  3651. authdata = NewNTAuthData(tmp);
  3652. }
  3653. else
  3654. {
  3655. authdata = NewNTAuthData(NULL);
  3656. }
  3657. break;
  3658. case AUTHTYPE_RADIUS:
  3659. if (CfgGetUniStr(f, "AuthRadiusUsername", tmp, sizeof(tmp)))
  3660. {
  3661. authdata = NewRadiusAuthData(tmp);
  3662. }
  3663. else
  3664. {
  3665. authdata = NewRadiusAuthData(NULL);
  3666. }
  3667. break;
  3668. case AUTHTYPE_USERCERT:
  3669. b = CfgGetBuf(f, "AuthUserCert");
  3670. if (b != NULL)
  3671. {
  3672. X *x = BufToX(b, false);
  3673. if (x != NULL)
  3674. {
  3675. authdata = NewUserCertAuthData(x);
  3676. FreeX(x);
  3677. }
  3678. FreeBuf(b);
  3679. }
  3680. break;
  3681. case AUTHTYPE_ROOTCERT:
  3682. b = CfgGetBuf(f, "AuthSerial");
  3683. if (b != NULL)
  3684. {
  3685. serial = NewXSerial(b->Buf, b->Size);
  3686. FreeBuf(b);
  3687. }
  3688. CfgGetUniStr(f, "AuthCommonName", common_name, sizeof(common_name));
  3689. authdata = NewRootCertAuthData(serial, common_name);
  3690. break;
  3691. }
  3692. // Add an user
  3693. AcLock(h);
  3694. {
  3695. if (StrLen(groupname) > 0)
  3696. {
  3697. g = AcGetGroup(h, groupname);
  3698. }
  3699. else
  3700. {
  3701. g = NULL;
  3702. }
  3703. u = NewUser(username, realname, note, authtype, authdata);
  3704. if (u != NULL)
  3705. {
  3706. if (g != NULL)
  3707. {
  3708. JoinUserToGroup(u, g);
  3709. }
  3710. SetUserTraffic(u, &t);
  3711. if (pf != NULL)
  3712. {
  3713. SetUserPolicy(u, &p);
  3714. }
  3715. Lock(u->lock);
  3716. {
  3717. u->CreatedTime = created_time;
  3718. u->UpdatedTime = updated_time;
  3719. u->ExpireTime = expire_time;
  3720. u->LastLoginTime = last_login_time;
  3721. u->NumLogin = num_login;
  3722. }
  3723. Unlock(u->lock);
  3724. AcAddUser(h, u);
  3725. ReleaseUser(u);
  3726. }
  3727. if (g != NULL)
  3728. {
  3729. ReleaseGroup(g);
  3730. }
  3731. }
  3732. AcUnlock(h);
  3733. if (serial != NULL)
  3734. {
  3735. FreeXSerial(serial);
  3736. }
  3737. }
  3738. // Write the user list
  3739. void SiWriteUserList(FOLDER *f, LIST *o)
  3740. {
  3741. // Validate arguments
  3742. if (f == NULL || o == NULL)
  3743. {
  3744. return;
  3745. }
  3746. LockList(o);
  3747. {
  3748. UINT i;
  3749. for (i = 0;i < LIST_NUM(o);i++)
  3750. {
  3751. USER *u = LIST_DATA(o, i);
  3752. SiWriteUserCfg(CfgCreateFolder(f, u->Name), u);
  3753. }
  3754. }
  3755. UnlockList(o);
  3756. }
  3757. // Read the user list
  3758. void SiLoadUserList(HUB *h, FOLDER *f)
  3759. {
  3760. TOKEN_LIST *t;
  3761. UINT i;
  3762. char *name;
  3763. // Validate arguments
  3764. if (f == NULL || h == NULL)
  3765. {
  3766. return;
  3767. }
  3768. t = CfgEnumFolderToTokenList(f);
  3769. for (i = 0;i < t->NumTokens;i++)
  3770. {
  3771. FOLDER *ff;
  3772. name = t->Token[i];
  3773. ff = CfgGetFolder(f, name);
  3774. SiLoadUserCfg(h, ff);
  3775. }
  3776. FreeToken(t);
  3777. }
  3778. // Write the group information
  3779. void SiWriteGroupCfg(FOLDER *f, USERGROUP *g)
  3780. {
  3781. // Validate arguments
  3782. if (f == NULL || g == NULL)
  3783. {
  3784. return;
  3785. }
  3786. Lock(g->lock);
  3787. {
  3788. CfgAddUniStr(f, "RealName", g->RealName);
  3789. CfgAddUniStr(f, "Note", g->Note);
  3790. if (g->Policy != NULL)
  3791. {
  3792. SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), g->Policy, false);
  3793. }
  3794. SiWriteTraffic(f, "Traffic", g->Traffic);
  3795. }
  3796. Unlock(g->lock);
  3797. }
  3798. // Read the group information
  3799. void SiLoadGroupCfg(HUB *h, FOLDER *f)
  3800. {
  3801. wchar_t realname[MAX_SIZE];
  3802. wchar_t note[MAX_SIZE];
  3803. char *name;
  3804. FOLDER *pf;
  3805. POLICY p;
  3806. TRAFFIC t;
  3807. USERGROUP *g;
  3808. // Validate arguments
  3809. if (h == NULL || f == NULL)
  3810. {
  3811. return;
  3812. }
  3813. name = f->Name;
  3814. CfgGetUniStr(f, "RealName", realname, sizeof(realname));
  3815. CfgGetUniStr(f, "Note", note, sizeof(note));
  3816. pf = CfgGetFolder(f, "Policy");
  3817. if (pf != NULL)
  3818. {
  3819. SiLoadPolicyCfg(&p, pf);
  3820. }
  3821. SiLoadTraffic(f, "Traffic", &t);
  3822. g = NewGroup(name, realname, note);
  3823. if (g == NULL)
  3824. {
  3825. return;
  3826. }
  3827. if (pf != NULL)
  3828. {
  3829. SetGroupPolicy(g, &p);
  3830. }
  3831. SetGroupTraffic(g, &t);
  3832. AcLock(h);
  3833. {
  3834. AcAddGroup(h, g);
  3835. }
  3836. AcUnlock(h);
  3837. ReleaseGroup(g);
  3838. }
  3839. // Write the group list
  3840. void SiWriteGroupList(FOLDER *f, LIST *o)
  3841. {
  3842. // Validate arguments
  3843. if (f == NULL || o == NULL)
  3844. {
  3845. return;
  3846. }
  3847. LockList(o);
  3848. {
  3849. UINT i;
  3850. for (i = 0;i < LIST_NUM(o);i++)
  3851. {
  3852. USERGROUP *g = LIST_DATA(o, i);
  3853. SiWriteGroupCfg(CfgCreateFolder(f, g->Name), g);
  3854. }
  3855. }
  3856. UnlockList(o);
  3857. }
  3858. // Read the group List
  3859. void SiLoadGroupList(HUB *h, FOLDER *f)
  3860. {
  3861. TOKEN_LIST *t;
  3862. UINT i;
  3863. char *name;
  3864. // Validate arguments
  3865. if (f == NULL || h == NULL)
  3866. {
  3867. return;
  3868. }
  3869. t = CfgEnumFolderToTokenList(f);
  3870. for (i = 0;i < t->NumTokens;i++)
  3871. {
  3872. name = t->Token[i];
  3873. SiLoadGroupCfg(h, CfgGetFolder(f, name));
  3874. }
  3875. FreeToken(t);
  3876. }
  3877. // Write the AC list
  3878. void SiWriteAcList(FOLDER *f, LIST *o)
  3879. {
  3880. // Validate arguments
  3881. if (f == NULL || o == NULL)
  3882. {
  3883. return;
  3884. }
  3885. LockList(o);
  3886. {
  3887. UINT i;
  3888. for (i = 0;i < LIST_NUM(o);i++)
  3889. {
  3890. char name[MAX_SIZE];
  3891. AC *ac = LIST_DATA(o, i);
  3892. FOLDER *ff;
  3893. Format(name, sizeof(name), "Acl%u", i + 1);
  3894. ff = CfgCreateFolder(f, name);
  3895. CfgAddBool(ff, "Deny", ac->Deny);
  3896. CfgAddInt(ff, "Priority", ac->Priority);
  3897. CfgAddIp(ff, "IpAddress", &ac->IpAddress);
  3898. if (ac->Masked)
  3899. {
  3900. CfgAddIp(ff, "NetMask", &ac->SubnetMask);
  3901. }
  3902. }
  3903. }
  3904. UnlockList(o);
  3905. }
  3906. // Read the AC list
  3907. void SiLoadAcList(LIST *o, FOLDER *f)
  3908. {
  3909. // Validate arguments
  3910. if (o == NULL || f == NULL)
  3911. {
  3912. return;
  3913. }
  3914. LockList(o);
  3915. {
  3916. TOKEN_LIST *t = CfgEnumFolderToTokenList(f);
  3917. if (t != NULL)
  3918. {
  3919. UINT i;
  3920. for (i = 0;i < t->NumTokens;i++)
  3921. {
  3922. FOLDER *ff = CfgGetFolder(f, t->Token[i]);
  3923. if (ff != NULL)
  3924. {
  3925. AC ac;
  3926. Zero(&ac, sizeof(ac));
  3927. ac.Deny = CfgGetBool(ff, "Deny");
  3928. ac.Priority = CfgGetInt(ff, "Priority");
  3929. CfgGetIp(ff, "IpAddress", &ac.IpAddress);
  3930. if (CfgGetIp(ff, "NetMask", &ac.SubnetMask))
  3931. {
  3932. ac.Masked = true;
  3933. }
  3934. AddAc(o, &ac);
  3935. }
  3936. }
  3937. FreeToken(t);
  3938. }
  3939. }
  3940. UnlockList(o);
  3941. }
  3942. // Write the certificate revocation list
  3943. void SiWriteCrlList(FOLDER *f, LIST *o)
  3944. {
  3945. // Validate arguments
  3946. if (f == NULL || o == NULL)
  3947. {
  3948. return;
  3949. }
  3950. LockList(o);
  3951. {
  3952. UINT i;
  3953. for (i = 0;i < LIST_NUM(o);i++)
  3954. {
  3955. char name[MAX_SIZE];
  3956. CRL *crl = LIST_DATA(o, i);
  3957. FOLDER *ff;
  3958. NAME *n;
  3959. Format(name, sizeof(name), "Crl%u", i);
  3960. ff = CfgCreateFolder(f, name);
  3961. n = crl->Name;
  3962. if (UniIsEmptyStr(n->CommonName) == false)
  3963. {
  3964. CfgAddUniStr(ff, "CommonName", n->CommonName);
  3965. }
  3966. if (UniIsEmptyStr(n->Organization) == false)
  3967. {
  3968. CfgAddUniStr(ff, "Organization", n->Organization);
  3969. }
  3970. if (UniIsEmptyStr(n->Unit) == false)
  3971. {
  3972. CfgAddUniStr(ff, "Unit", n->Unit);
  3973. }
  3974. if (UniIsEmptyStr(n->Country) == false)
  3975. {
  3976. CfgAddUniStr(ff, "Country", n->Country);
  3977. }
  3978. if (UniIsEmptyStr(n->State) == false)
  3979. {
  3980. CfgAddUniStr(ff, "State", n->State);
  3981. }
  3982. if (UniIsEmptyStr(n->Local) == false)
  3983. {
  3984. CfgAddUniStr(ff, "Local", n->Local);
  3985. }
  3986. if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
  3987. {
  3988. char tmp[MAX_SIZE];
  3989. BinToStr(tmp, sizeof(tmp), crl->DigestMD5, MD5_SIZE);
  3990. CfgAddStr(ff, "DigestMD5", tmp);
  3991. }
  3992. if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
  3993. {
  3994. char tmp[MAX_SIZE];
  3995. BinToStr(tmp, sizeof(tmp), crl->DigestSHA1, SHA1_SIZE);
  3996. CfgAddStr(ff, "DigestSHA1", tmp);
  3997. }
  3998. if (crl->Serial != NULL)
  3999. {
  4000. char tmp[MAX_SIZE];
  4001. BinToStr(tmp, sizeof(tmp), crl->Serial->data, crl->Serial->size);
  4002. CfgAddStr(ff, "Serial", tmp);
  4003. }
  4004. }
  4005. }
  4006. UnlockList(o);
  4007. }
  4008. // Read the certificate revocation list
  4009. void SiLoadCrlList(LIST *o, FOLDER *f)
  4010. {
  4011. // Validate arguments
  4012. if (o == NULL || f == NULL)
  4013. {
  4014. return;
  4015. }
  4016. LockList(o);
  4017. {
  4018. UINT i;
  4019. TOKEN_LIST *t;
  4020. t = CfgEnumFolderToTokenList(f);
  4021. for (i = 0;i < t->NumTokens;i++)
  4022. {
  4023. CRL *crl;
  4024. FOLDER *ff = CfgGetFolder(f, t->Token[i]);
  4025. wchar_t cn[MAX_SIZE], org[MAX_SIZE], u[MAX_SIZE], c[MAX_SIZE],
  4026. st[MAX_SIZE], l[MAX_SIZE];
  4027. char tmp[MAX_SIZE];
  4028. if (ff != NULL)
  4029. {
  4030. BUF *b;
  4031. crl = ZeroMalloc(sizeof(CRL));
  4032. CfgGetUniStr(ff, "CommonName", cn, sizeof(cn));
  4033. CfgGetUniStr(ff, "Organization", org, sizeof(org));
  4034. CfgGetUniStr(ff, "Unit", u, sizeof(u));
  4035. CfgGetUniStr(ff, "Country", c, sizeof(c));
  4036. CfgGetUniStr(ff, "State", st, sizeof(st));
  4037. CfgGetUniStr(ff, "Local", l, sizeof(l));
  4038. crl->Name = NewName(cn, org, u, c, st, l);
  4039. if (CfgGetStr(ff, "Serial", tmp, sizeof(tmp)))
  4040. {
  4041. b = StrToBin(tmp);
  4042. if (b != NULL)
  4043. {
  4044. if (b->Size >= 1)
  4045. {
  4046. crl->Serial = NewXSerial(b->Buf, b->Size);
  4047. }
  4048. FreeBuf(b);
  4049. }
  4050. }
  4051. if (CfgGetStr(ff, "DigestMD5", tmp, sizeof(tmp)))
  4052. {
  4053. b = StrToBin(tmp);
  4054. if (b != NULL)
  4055. {
  4056. if (b->Size == MD5_SIZE)
  4057. {
  4058. Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
  4059. }
  4060. FreeBuf(b);
  4061. }
  4062. }
  4063. if (CfgGetStr(ff, "DigestSHA1", tmp, sizeof(tmp)))
  4064. {
  4065. b = StrToBin(tmp);
  4066. if (b != NULL)
  4067. {
  4068. if (b->Size == SHA1_SIZE)
  4069. {
  4070. Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
  4071. }
  4072. FreeBuf(b);
  4073. }
  4074. }
  4075. Insert(o, crl);
  4076. }
  4077. }
  4078. FreeToken(t);
  4079. }
  4080. UnlockList(o);
  4081. }
  4082. // Write the certificates list
  4083. void SiWriteCertList(FOLDER *f, LIST *o)
  4084. {
  4085. // Validate arguments
  4086. if (f == NULL || o == NULL)
  4087. {
  4088. return;
  4089. }
  4090. LockList(o);
  4091. {
  4092. UINT i;
  4093. X *x;
  4094. for (i = 0;i < LIST_NUM(o);i++)
  4095. {
  4096. char name[MAX_SIZE];
  4097. BUF *b;
  4098. x = LIST_DATA(o, i);
  4099. Format(name, sizeof(name), "Cert%u", i);
  4100. b = XToBuf(x, false);
  4101. if (b != NULL)
  4102. {
  4103. CfgAddBuf(CfgCreateFolder(f, name), "X509", b);
  4104. FreeBuf(b);
  4105. }
  4106. }
  4107. }
  4108. UnlockList(o);
  4109. }
  4110. // Read the certificates list
  4111. void SiLoadCertList(LIST *o, FOLDER *f)
  4112. {
  4113. // Validate arguments
  4114. if (o == NULL || f == NULL)
  4115. {
  4116. return;
  4117. }
  4118. LockList(o);
  4119. {
  4120. UINT i;
  4121. TOKEN_LIST *t;
  4122. t = CfgEnumFolderToTokenList(f);
  4123. for (i = 0;i < t->NumTokens;i++)
  4124. {
  4125. FOLDER *ff = CfgGetFolder(f, t->Token[i]);
  4126. BUF *b;
  4127. b = CfgGetBuf(ff, "X509");
  4128. if (b != NULL)
  4129. {
  4130. X *x = BufToX(b, false);
  4131. if (x != NULL)
  4132. {
  4133. Insert(o, x);
  4134. }
  4135. FreeBuf(b);
  4136. }
  4137. }
  4138. FreeToken(t);
  4139. }
  4140. UnlockList(o);
  4141. }
  4142. // Write the database
  4143. void SiWriteHubDb(FOLDER *f, HUBDB *db, bool no_save_ac_list)
  4144. {
  4145. // Validate arguments
  4146. if (f == NULL || db == NULL)
  4147. {
  4148. return;
  4149. }
  4150. SiWriteUserList(CfgCreateFolder(f, "UserList"), db->UserList);
  4151. SiWriteGroupList(CfgCreateFolder(f, "GroupList"), db->GroupList);
  4152. SiWriteCertList(CfgCreateFolder(f, "CertList"), db->RootCertList);
  4153. SiWriteCrlList(CfgCreateFolder(f, "CrlList"), db->CrlList);
  4154. if (no_save_ac_list == false)
  4155. {
  4156. SiWriteAcList(CfgCreateFolder(f, "IPAccessControlList"), db->AcList);
  4157. }
  4158. }
  4159. // Read the database
  4160. void SiLoadHubDb(HUB *h, FOLDER *f)
  4161. {
  4162. // Validate arguments
  4163. if (f == NULL || h == NULL)
  4164. {
  4165. return;
  4166. }
  4167. SiLoadGroupList(h, CfgGetFolder(f, "GroupList"));
  4168. SiLoadUserList(h, CfgGetFolder(f, "UserList"));
  4169. if (h->HubDb != NULL)
  4170. {
  4171. SiLoadCertList(h->HubDb->RootCertList, CfgGetFolder(f, "CertList"));
  4172. SiLoadCrlList(h->HubDb->CrlList, CfgGetFolder(f, "CrlList"));
  4173. SiLoadAcList(h->HubDb->AcList, CfgGetFolder(f, "IPAccessControlList"));
  4174. }
  4175. }
  4176. // Write the Virtual HUB setting
  4177. void SiWriteHubCfg(FOLDER *f, HUB *h)
  4178. {
  4179. // Validate arguments
  4180. if (f == NULL || h == NULL)
  4181. {
  4182. return;
  4183. }
  4184. // Radius server name
  4185. Lock(h->RadiusOptionLock);
  4186. {
  4187. if (h->RadiusServerName != NULL)
  4188. {
  4189. CfgAddStr(f, "RadiusServerName", h->RadiusServerName);
  4190. CfgAddBuf(f, "RadiusSecret", h->RadiusSecret);
  4191. }
  4192. CfgAddInt(f, "RadiusServerPort", h->RadiusServerPort);
  4193. CfgAddInt(f, "RadiusRetryInterval", h->RadiusRetryInterval);
  4194. CfgAddStr(f, "RadiusSuffixFilter", h->RadiusSuffixFilter);
  4195. }
  4196. Unlock(h->RadiusOptionLock);
  4197. // Password
  4198. CfgAddByte(f, "HashedPassword", h->HashedPassword, sizeof(h->HashedPassword));
  4199. CfgAddByte(f, "SecurePassword", h->SecurePassword, sizeof(h->SecurePassword));
  4200. // Online / Offline flag
  4201. if (h->Cedar->Bridge == false)
  4202. {
  4203. CfgAddBool(f, "Online", (h->Offline && (h->HubIsOnlineButHalting == false)) ? false : true);
  4204. }
  4205. // Traffic information
  4206. SiWriteTraffic(f, "Traffic", h->Traffic);
  4207. // HUB options
  4208. SiWriteHubOptionCfg(CfgCreateFolder(f, "Option"), h->Option);
  4209. // Message
  4210. {
  4211. FOLDER *folder = CfgCreateFolder(f, "Message");
  4212. if (IsEmptyUniStr(h->Msg) == false)
  4213. {
  4214. CfgAddUniStr(folder, "MessageText", h->Msg);
  4215. }
  4216. }
  4217. // HUB_LOG
  4218. SiWriteHubLogCfg(CfgCreateFolder(f, "LogSetting"), &h->LogSetting);
  4219. if (h->Type == HUB_TYPE_STANDALONE)
  4220. {
  4221. // Link list
  4222. SiWriteHubLinks(CfgCreateFolder(f, "CascadeList"), h);
  4223. }
  4224. if (h->Type != HUB_TYPE_FARM_STATIC)
  4225. {
  4226. if (GetServerCapsBool(h->Cedar->Server, "b_support_securenat"))
  4227. {
  4228. // SecureNAT
  4229. SiWriteSecureNAT(h, CfgCreateFolder(f, "SecureNAT"));
  4230. }
  4231. }
  4232. // Access list
  4233. SiWriteHubAccessLists(CfgCreateFolder(f, "AccessList"), h);
  4234. // Administration options
  4235. SiWriteHubAdminOptions(CfgCreateFolder(f, "AdminOption"), h);
  4236. // Type of HUB
  4237. CfgAddInt(f, "Type", h->Type);
  4238. // Database
  4239. if (h->Cedar->Bridge == false)
  4240. {
  4241. SiWriteHubDb(CfgCreateFolder(f, "SecurityAccountDatabase"), h->HubDb,
  4242. false
  4243. );
  4244. }
  4245. // Usage status
  4246. CfgAddInt64(f, "LastCommTime", h->LastCommTime);
  4247. CfgAddInt64(f, "LastLoginTime", h->LastLoginTime);
  4248. CfgAddInt64(f, "CreatedTime", h->CreatedTime);
  4249. CfgAddInt(f, "NumLogin", h->NumLogin);
  4250. }
  4251. // Read the logging options
  4252. void SiLoadHubLogCfg(HUB_LOG *g, FOLDER *f)
  4253. {
  4254. // Validate arguments
  4255. if (f == NULL || g == NULL)
  4256. {
  4257. return;
  4258. }
  4259. Zero(g, sizeof(HUB_LOG));
  4260. g->SaveSecurityLog = CfgGetBool(f, "SaveSecurityLog");
  4261. g->SecurityLogSwitchType = CfgGetInt(f, "SecurityLogSwitchType");
  4262. g->SavePacketLog = CfgGetBool(f, "SavePacketLog");
  4263. g->PacketLogSwitchType = CfgGetInt(f, "PacketLogSwitchType");
  4264. g->PacketLogConfig[PACKET_LOG_TCP_CONN] = CfgGetInt(f, "PACKET_LOG_TCP_CONN");
  4265. g->PacketLogConfig[PACKET_LOG_TCP] = CfgGetInt(f, "PACKET_LOG_TCP");
  4266. g->PacketLogConfig[PACKET_LOG_DHCP] = CfgGetInt(f, "PACKET_LOG_DHCP");
  4267. g->PacketLogConfig[PACKET_LOG_UDP] = CfgGetInt(f, "PACKET_LOG_UDP");
  4268. g->PacketLogConfig[PACKET_LOG_ICMP] = CfgGetInt(f, "PACKET_LOG_ICMP");
  4269. g->PacketLogConfig[PACKET_LOG_IP] = CfgGetInt(f, "PACKET_LOG_IP");
  4270. g->PacketLogConfig[PACKET_LOG_ARP] = CfgGetInt(f, "PACKET_LOG_ARP");
  4271. g->PacketLogConfig[PACKET_LOG_ETHERNET] = CfgGetInt(f, "PACKET_LOG_ETHERNET");
  4272. }
  4273. // Write the logging options
  4274. void SiWriteHubLogCfg(FOLDER *f, HUB_LOG *g)
  4275. {
  4276. SiWriteHubLogCfgEx(f, g, false);
  4277. }
  4278. void SiWriteHubLogCfgEx(FOLDER *f, HUB_LOG *g, bool el_mode)
  4279. {
  4280. // Validate arguments
  4281. if (f == NULL || g == NULL)
  4282. {
  4283. return;
  4284. }
  4285. if (el_mode == false)
  4286. {
  4287. CfgAddBool(f, "SaveSecurityLog", g->SaveSecurityLog);
  4288. CfgAddInt(f, "SecurityLogSwitchType", g->SecurityLogSwitchType);
  4289. CfgAddBool(f, "SavePacketLog", g->SavePacketLog);
  4290. }
  4291. CfgAddInt(f, "PacketLogSwitchType", g->PacketLogSwitchType);
  4292. CfgAddInt(f, "PACKET_LOG_TCP_CONN", g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
  4293. CfgAddInt(f, "PACKET_LOG_TCP", g->PacketLogConfig[PACKET_LOG_TCP]);
  4294. CfgAddInt(f, "PACKET_LOG_DHCP", g->PacketLogConfig[PACKET_LOG_DHCP]);
  4295. CfgAddInt(f, "PACKET_LOG_UDP", g->PacketLogConfig[PACKET_LOG_UDP]);
  4296. CfgAddInt(f, "PACKET_LOG_ICMP", g->PacketLogConfig[PACKET_LOG_ICMP]);
  4297. CfgAddInt(f, "PACKET_LOG_IP", g->PacketLogConfig[PACKET_LOG_IP]);
  4298. CfgAddInt(f, "PACKET_LOG_ARP", g->PacketLogConfig[PACKET_LOG_ARP]);
  4299. CfgAddInt(f, "PACKET_LOG_ETHERNET", g->PacketLogConfig[PACKET_LOG_ETHERNET]);
  4300. }
  4301. // Read the Virtual HUB settings
  4302. void SiLoadHubCfg(SERVER *s, FOLDER *f, char *name)
  4303. {
  4304. HUB *h;
  4305. CEDAR *c;
  4306. HUB_OPTION o;
  4307. bool online;
  4308. UINT hub_old_type = 0;
  4309. // Validate arguments
  4310. if (s == NULL || f == NULL || name == NULL)
  4311. {
  4312. return;
  4313. }
  4314. c = s->Cedar;
  4315. // Get the option
  4316. Zero(&o, sizeof(o));
  4317. SiLoadHubOptionCfg(CfgGetFolder(f, "Option"), &o);
  4318. // Create a HUB
  4319. h = NewHub(c, name, &o);
  4320. if (h != NULL)
  4321. {
  4322. HUB_LOG g;
  4323. // Radius server settings
  4324. Lock(h->RadiusOptionLock);
  4325. {
  4326. char name[MAX_SIZE];
  4327. BUF *secret;
  4328. UINT port;
  4329. UINT interval;
  4330. port = CfgGetInt(f, "RadiusServerPort");
  4331. interval = CfgGetInt(f, "RadiusRetryInterval");
  4332. CfgGetStr(f, "RadiusSuffixFilter", h->RadiusSuffixFilter, sizeof(h->RadiusSuffixFilter));
  4333. if (interval == 0)
  4334. {
  4335. interval = RADIUS_RETRY_INTERVAL;
  4336. }
  4337. if (port != 0 && CfgGetStr(f, "RadiusServerName", name, sizeof(name)))
  4338. {
  4339. secret = CfgGetBuf(f, "RadiusSecret");
  4340. if (secret != NULL)
  4341. {
  4342. char secret_str[MAX_SIZE];
  4343. Zero(secret_str, sizeof(secret_str));
  4344. if (secret->Size < sizeof(secret_str))
  4345. {
  4346. Copy(secret_str, secret->Buf, secret->Size);
  4347. }
  4348. secret_str[sizeof(secret_str) - 1] = 0;
  4349. //SetRadiusServer(h, name, port, secret_str);
  4350. SetRadiusServerEx(h, name, port, secret_str, interval);
  4351. FreeBuf(secret);
  4352. }
  4353. }
  4354. }
  4355. Unlock(h->RadiusOptionLock);
  4356. // Password
  4357. if (CfgGetByte(f, "HashedPassword", h->HashedPassword, sizeof(h->HashedPassword)) != sizeof(h->HashedPassword))
  4358. {
  4359. Hash(h->HashedPassword, "", 0, true);
  4360. }
  4361. if (CfgGetByte(f, "SecurePassword", h->SecurePassword, sizeof(h->SecurePassword)) != sizeof(h->SecurePassword))
  4362. {
  4363. HashPassword(h->SecurePassword, ADMINISTRATOR_USERNAME, "");
  4364. }
  4365. // Log Settings
  4366. Zero(&g, sizeof(g));
  4367. SiLoadHubLogCfg(&g, CfgGetFolder(f, "LogSetting"));
  4368. SetHubLogSetting(h, &g);
  4369. // Online / Offline flag
  4370. if (h->Cedar->Bridge == false)
  4371. {
  4372. online = CfgGetBool(f, "Online");
  4373. }
  4374. else
  4375. {
  4376. online = true;
  4377. }
  4378. // Traffic information
  4379. SiLoadTraffic(f, "Traffic", h->Traffic);
  4380. // Access list
  4381. SiLoadHubAccessLists(h, CfgGetFolder(f, "AccessList"));
  4382. // Type of HUB
  4383. hub_old_type = h->Type = CfgGetInt(f, "Type");
  4384. if (s->ServerType == SERVER_TYPE_STANDALONE)
  4385. {
  4386. if (h->Type != HUB_TYPE_STANDALONE)
  4387. {
  4388. // Change the type of all HUB to a stand-alone if the server is a stand-alone
  4389. h->Type = HUB_TYPE_STANDALONE;
  4390. }
  4391. }
  4392. else
  4393. {
  4394. if (h->Type == HUB_TYPE_STANDALONE)
  4395. {
  4396. // If the server is a farm controller, change the type of HUB to the farm supported types
  4397. h->Type = HUB_TYPE_FARM_DYNAMIC;
  4398. }
  4399. }
  4400. if (h->Type == HUB_TYPE_FARM_DYNAMIC)
  4401. {
  4402. h->CurrentVersion = h->LastVersion = 1;
  4403. }
  4404. // Message
  4405. {
  4406. FOLDER *folder = CfgGetFolder(f, "Message");
  4407. if (folder != NULL)
  4408. {
  4409. wchar_t *tmp = Malloc(sizeof(wchar_t) * (HUB_MAXMSG_LEN + 1));
  4410. if (CfgGetUniStr(folder, "MessageText", tmp, sizeof(wchar_t) * (HUB_MAXMSG_LEN + 1)))
  4411. {
  4412. SetHubMsg(h, tmp);
  4413. }
  4414. Free(tmp);
  4415. }
  4416. }
  4417. // Link list
  4418. if (h->Type == HUB_TYPE_STANDALONE)
  4419. {
  4420. // The link list is used only on stand-alone HUB
  4421. // In VPN Gate hubs, don't load this
  4422. {
  4423. SiLoadHubLinks(h, CfgGetFolder(f, "CascadeList"));
  4424. }
  4425. }
  4426. // SecureNAT
  4427. if (GetServerCapsBool(h->Cedar->Server, "b_support_securenat"))
  4428. {
  4429. if (h->Type == HUB_TYPE_STANDALONE || h->Type == HUB_TYPE_FARM_DYNAMIC)
  4430. {
  4431. // SecureNAT is used only in the case of dynamic HUB or standalone HUB
  4432. SiLoadSecureNAT(h, CfgGetFolder(f, "SecureNAT"));
  4433. if (h->Type != HUB_TYPE_STANDALONE && h->Cedar != NULL && h->Cedar->Server != NULL &&
  4434. h->Cedar->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4435. {
  4436. NiClearUnsupportedVhOptionForDynamicHub(h->SecureNATOption,
  4437. hub_old_type == HUB_TYPE_STANDALONE);
  4438. }
  4439. }
  4440. }
  4441. // Administration options
  4442. SiLoadHubAdminOptions(h, CfgGetFolder(f, "AdminOption"));
  4443. // Database
  4444. if (h->Cedar->Bridge == false)
  4445. {
  4446. SiLoadHubDb(h, CfgGetFolder(f, "SecurityAccountDatabase"));
  4447. }
  4448. // Usage status
  4449. h->LastCommTime = CfgGetInt64(f, "LastCommTime");
  4450. if (h->LastCommTime == 0)
  4451. {
  4452. h->LastCommTime = SystemTime64();
  4453. }
  4454. h->LastLoginTime = CfgGetInt64(f, "LastLoginTime");
  4455. if (h->LastLoginTime == 0)
  4456. {
  4457. h->LastLoginTime = SystemTime64();
  4458. }
  4459. h->CreatedTime = CfgGetInt64(f, "CreatedTime");
  4460. h->NumLogin = CfgGetInt(f, "NumLogin");
  4461. // Start the operation of the HUB
  4462. AddHub(c, h);
  4463. if (online)
  4464. {
  4465. h->Offline = true;
  4466. SetHubOnline(h);
  4467. }
  4468. else
  4469. {
  4470. h->Offline = false;
  4471. SetHubOffline(h);
  4472. }
  4473. WaitLogFlush(h->SecurityLogger);
  4474. WaitLogFlush(h->PacketLogger);
  4475. ReleaseHub(h);
  4476. }
  4477. }
  4478. // Read the SecureNAT configuration
  4479. void SiLoadSecureNAT(HUB *h, FOLDER *f)
  4480. {
  4481. VH_OPTION o;
  4482. // Validate arguments
  4483. if (h == NULL || f == NULL)
  4484. {
  4485. return;
  4486. }
  4487. // Read the VH_OPTION
  4488. NiLoadVhOptionEx(&o, f);
  4489. // Set the VH_OPTION
  4490. Copy(h->SecureNATOption, &o, sizeof(VH_OPTION));
  4491. EnableSecureNAT(h, CfgGetBool(f, "Disabled") ? false : true);
  4492. }
  4493. // Read the virtual layer 3 switch settings
  4494. void SiLoadL3SwitchCfg(L3SW *sw, FOLDER *f)
  4495. {
  4496. UINT i;
  4497. FOLDER *if_folder, *table_folder;
  4498. TOKEN_LIST *t;
  4499. bool active = false;
  4500. // Validate arguments
  4501. if (sw == NULL || f == NULL)
  4502. {
  4503. return;
  4504. }
  4505. active = CfgGetBool(f, "Active");
  4506. // Interface list
  4507. if_folder = CfgGetFolder(f, "InterfaceList");
  4508. if (if_folder != NULL)
  4509. {
  4510. t = CfgEnumFolderToTokenList(if_folder);
  4511. if (t != NULL)
  4512. {
  4513. for (i = 0;i < t->NumTokens;i++)
  4514. {
  4515. FOLDER *ff = CfgGetFolder(if_folder, t->Token[i]);
  4516. char name[MAX_HUBNAME_LEN + 1];
  4517. UINT ip, subnet;
  4518. CfgGetStr(ff, "HubName", name, sizeof(name));
  4519. ip = CfgGetIp32(ff, "IpAddress");
  4520. subnet = CfgGetIp32(ff, "SubnetMask");
  4521. {
  4522. L3AddIf(sw, name, ip, subnet);
  4523. }
  4524. }
  4525. FreeToken(t);
  4526. }
  4527. }
  4528. // Routing table
  4529. table_folder = CfgGetFolder(f, "RoutingTable");
  4530. if (table_folder != NULL)
  4531. {
  4532. t = CfgEnumFolderToTokenList(table_folder);
  4533. if (t != NULL)
  4534. {
  4535. for (i = 0;i < t->NumTokens;i++)
  4536. {
  4537. FOLDER *ff = CfgGetFolder(table_folder, t->Token[i]);
  4538. L3TABLE tbl;
  4539. Zero(&tbl, sizeof(tbl));
  4540. tbl.NetworkAddress = CfgGetIp32(ff, "NetworkAddress");
  4541. tbl.SubnetMask = CfgGetIp32(ff, "SubnetMask");
  4542. tbl.GatewayAddress = CfgGetIp32(ff, "GatewayAddress");
  4543. tbl.Metric = CfgGetInt(ff, "Metric");
  4544. L3AddTable(sw, &tbl);
  4545. }
  4546. FreeToken(t);
  4547. }
  4548. }
  4549. if (active)
  4550. {
  4551. L3SwStart(sw);
  4552. }
  4553. }
  4554. // Write the virtual layer 3 switch settings
  4555. void SiWriteL3SwitchCfg(FOLDER *f, L3SW *sw)
  4556. {
  4557. UINT i;
  4558. FOLDER *if_folder, *table_folder;
  4559. char tmp[MAX_SIZE];
  4560. // Validate arguments
  4561. if (f == NULL || sw == NULL)
  4562. {
  4563. return;
  4564. }
  4565. // Active flag
  4566. CfgAddBool(f, "Active", sw->Active);
  4567. // Interface list
  4568. if_folder = CfgCreateFolder(f, "InterfaceList");
  4569. for (i = 0;i < LIST_NUM(sw->IfList);i++)
  4570. {
  4571. L3IF *e = LIST_DATA(sw->IfList, i);
  4572. FOLDER *ff;
  4573. Format(tmp, sizeof(tmp), "Interface%u", i);
  4574. ff = CfgCreateFolder(if_folder, tmp);
  4575. CfgAddStr(ff, "HubName", e->HubName);
  4576. CfgAddIp32(ff, "IpAddress", e->IpAddress);
  4577. CfgAddIp32(ff, "SubnetMask", e->SubnetMask);
  4578. }
  4579. // Routing table
  4580. table_folder = CfgCreateFolder(f, "RoutingTable");
  4581. for (i = 0;i < LIST_NUM(sw->TableList);i++)
  4582. {
  4583. L3TABLE *e = LIST_DATA(sw->TableList, i);
  4584. FOLDER *ff;
  4585. Format(tmp, sizeof(tmp), "Entry%u", i);
  4586. ff = CfgCreateFolder(table_folder, tmp);
  4587. CfgAddIp32(ff, "NetworkAddress", e->NetworkAddress);
  4588. CfgAddIp32(ff, "SubnetMask", e->SubnetMask);
  4589. CfgAddIp32(ff, "GatewayAddress", e->GatewayAddress);
  4590. CfgAddInt(ff, "Metric", e->Metric);
  4591. }
  4592. }
  4593. // Read the Virtual Layer 3 switch list
  4594. void SiLoadL3Switchs(SERVER *s, FOLDER *f)
  4595. {
  4596. UINT i;
  4597. TOKEN_LIST *t;
  4598. CEDAR *c;
  4599. // Validate arguments
  4600. if (s == NULL || f == NULL)
  4601. {
  4602. return;
  4603. }
  4604. c = s->Cedar;
  4605. t = CfgEnumFolderToTokenList(f);
  4606. if (t != NULL)
  4607. {
  4608. for (i = 0;i < t->NumTokens;i++)
  4609. {
  4610. char *name = t->Token[i];
  4611. L3SW *sw = L3AddSw(c, name);
  4612. SiLoadL3SwitchCfg(sw, CfgGetFolder(f, name));
  4613. ReleaseL3Sw(sw);
  4614. }
  4615. }
  4616. FreeToken(t);
  4617. }
  4618. // Write the Virtual Layer 3 switch list
  4619. void SiWriteL3Switchs(FOLDER *f, SERVER *s)
  4620. {
  4621. UINT i;
  4622. FOLDER *folder;
  4623. CEDAR *c;
  4624. // Validate arguments
  4625. if (f == NULL || s == NULL)
  4626. {
  4627. return;
  4628. }
  4629. c = s->Cedar;
  4630. LockList(c->L3SwList);
  4631. {
  4632. for (i = 0;i < LIST_NUM(c->L3SwList);i++)
  4633. {
  4634. L3SW *sw = LIST_DATA(c->L3SwList, i);
  4635. Lock(sw->lock);
  4636. {
  4637. folder = CfgCreateFolder(f, sw->Name);
  4638. SiWriteL3SwitchCfg(folder, sw);
  4639. }
  4640. Unlock(sw->lock);
  4641. }
  4642. }
  4643. UnlockList(c->L3SwList);
  4644. }
  4645. // Read the IPsec server configuration
  4646. void SiLoadIPsec(SERVER *s, FOLDER *f)
  4647. {
  4648. IPSEC_SERVICES sl;
  4649. FOLDER *list_folder;
  4650. // Validate arguments
  4651. if (s == NULL || f == NULL)
  4652. {
  4653. return;
  4654. }
  4655. Zero(&sl, sizeof(sl));
  4656. CfgGetStr(f, "IPsec_Secret", sl.IPsec_Secret, sizeof(sl.IPsec_Secret));
  4657. CfgGetStr(f, "L2TP_DefaultHub", sl.L2TP_DefaultHub, sizeof(sl.L2TP_DefaultHub));
  4658. if (s->ServerType == SERVER_TYPE_STANDALONE)
  4659. {
  4660. // IPsec feature only be enabled on a standalone server
  4661. sl.L2TP_Raw = CfgGetBool(f, "L2TP_Raw");
  4662. sl.L2TP_IPsec = CfgGetBool(f, "L2TP_IPsec");
  4663. sl.EtherIP_IPsec = CfgGetBool(f, "EtherIP_IPsec");
  4664. }
  4665. IPsecServerSetServices(s->IPsecServer, &sl);
  4666. list_folder = CfgGetFolder(f, "EtherIP_IDSettingsList");
  4667. if (list_folder != NULL)
  4668. {
  4669. TOKEN_LIST *t = CfgEnumFolderToTokenList(list_folder);
  4670. if (t != NULL)
  4671. {
  4672. UINT i;
  4673. for (i = 0;i < t->NumTokens;i++)
  4674. {
  4675. char *name = t->Token[i];
  4676. FOLDER *f = CfgGetFolder(list_folder, name);
  4677. if (f != NULL)
  4678. {
  4679. ETHERIP_ID d;
  4680. BUF *b;
  4681. Zero(&d, sizeof(d));
  4682. StrCpy(d.Id, sizeof(d.Id), name);
  4683. CfgGetStr(f, "HubName", d.HubName, sizeof(d.HubName));
  4684. CfgGetStr(f, "UserName", d.UserName, sizeof(d.UserName));
  4685. b = CfgGetBuf(f, "EncryptedPassword");
  4686. if (b != NULL)
  4687. {
  4688. char *pass = DecryptPassword2(b);
  4689. StrCpy(d.Password, sizeof(d.Password), pass);
  4690. Free(pass);
  4691. AddEtherIPId(s->IPsecServer, &d);
  4692. FreeBuf(b);
  4693. }
  4694. }
  4695. }
  4696. FreeToken(t);
  4697. }
  4698. }
  4699. }
  4700. // Write the IPsec server configuration
  4701. void SiWriteIPsec(FOLDER *f, SERVER *s)
  4702. {
  4703. IPSEC_SERVICES sl;
  4704. FOLDER *list_folder;
  4705. UINT i;
  4706. // Validate arguments
  4707. if (s == NULL || f == NULL)
  4708. {
  4709. return;
  4710. }
  4711. if (s->IPsecServer == NULL)
  4712. {
  4713. return;
  4714. }
  4715. Zero(&sl, sizeof(sl));
  4716. IPsecServerGetServices(s->IPsecServer, &sl);
  4717. CfgAddStr(f, "IPsec_Secret", sl.IPsec_Secret);
  4718. CfgAddStr(f, "L2TP_DefaultHub", sl.L2TP_DefaultHub);
  4719. CfgAddBool(f, "L2TP_Raw", sl.L2TP_Raw);
  4720. CfgAddBool(f, "L2TP_IPsec", sl.L2TP_IPsec);
  4721. CfgAddBool(f, "EtherIP_IPsec", sl.EtherIP_IPsec);
  4722. list_folder = CfgCreateFolder(f, "EtherIP_IDSettingsList");
  4723. Lock(s->IPsecServer->LockSettings);
  4724. {
  4725. for (i = 0;i < LIST_NUM(s->IPsecServer->EtherIPIdList);i++)
  4726. {
  4727. ETHERIP_ID *d = LIST_DATA(s->IPsecServer->EtherIPIdList, i);
  4728. FOLDER *f;
  4729. BUF *b;
  4730. f = CfgCreateFolder(list_folder, d->Id);
  4731. CfgAddStr(f, "HubName", d->HubName);
  4732. CfgAddStr(f, "UserName", d->UserName);
  4733. b = EncryptPassword2(d->Password);
  4734. CfgAddBuf(f, "EncryptedPassword", b);
  4735. FreeBuf(b);
  4736. }
  4737. }
  4738. Unlock(s->IPsecServer->LockSettings);
  4739. }
  4740. // Write the license list
  4741. void SiWriteLicenseManager(FOLDER *f, SERVER *s)
  4742. {
  4743. }
  4744. // Read the license list
  4745. void SiLoadLicenseManager(SERVER *s, FOLDER *f)
  4746. {
  4747. }
  4748. // Write the Virtual HUB list
  4749. void SiWriteHubs(FOLDER *f, SERVER *s)
  4750. {
  4751. UINT i;
  4752. FOLDER *hub_folder;
  4753. CEDAR *c;
  4754. UINT num;
  4755. HUB **hubs;
  4756. // Validate arguments
  4757. if (f == NULL || s == NULL)
  4758. {
  4759. return;
  4760. }
  4761. c = s->Cedar;
  4762. LockList(c->HubList);
  4763. {
  4764. hubs = ToArray(c->HubList);
  4765. num = LIST_NUM(c->HubList);
  4766. for (i = 0;i < num;i++)
  4767. {
  4768. AddRef(hubs[i]->ref);
  4769. }
  4770. }
  4771. UnlockList(c->HubList);
  4772. for (i = 0;i < num;i++)
  4773. {
  4774. HUB *h = hubs[i];
  4775. Lock(h->lock);
  4776. {
  4777. hub_folder = CfgCreateFolder(f, h->Name);
  4778. SiWriteHubCfg(hub_folder, h);
  4779. }
  4780. Unlock(h->lock);
  4781. ReleaseHub(h);
  4782. if ((i % 30) == 1)
  4783. {
  4784. YieldCpu();
  4785. }
  4786. }
  4787. Free(hubs);
  4788. }
  4789. // Read the Virtual HUB list
  4790. void SiLoadHubs(SERVER *s, FOLDER *f)
  4791. {
  4792. UINT i;
  4793. FOLDER *hub_folder;
  4794. CEDAR *c;
  4795. TOKEN_LIST *t;
  4796. bool b = false;
  4797. // Validate arguments
  4798. if (f == NULL || s == NULL)
  4799. {
  4800. return;
  4801. }
  4802. c = s->Cedar;
  4803. t = CfgEnumFolderToTokenList(f);
  4804. for (i = 0;i < t->NumTokens;i++)
  4805. {
  4806. char *name = t->Token[i];
  4807. if (s->Cedar->Bridge)
  4808. {
  4809. if (StrCmpi(name, SERVER_DEFAULT_BRIDGE_NAME) == 0)
  4810. {
  4811. // Read only the setting of Virtual HUB named "BRIDGE"
  4812. // in the case of the Bridge
  4813. b = true;
  4814. }
  4815. else
  4816. {
  4817. continue;
  4818. }
  4819. }
  4820. hub_folder = CfgGetFolder(f, name);
  4821. if (hub_folder != NULL)
  4822. {
  4823. SiLoadHubCfg(s, hub_folder, name);
  4824. }
  4825. }
  4826. FreeToken(t);
  4827. if (s->Cedar->Bridge && b == false)
  4828. {
  4829. // If there isn't "BRIDGE" virtual HUB setting, create it newly
  4830. SiInitDefaultHubList(s);
  4831. }
  4832. }
  4833. // Read the server-specific settings
  4834. void SiLoadServerCfg(SERVER *s, FOLDER *f)
  4835. {
  4836. BUF *b;
  4837. CEDAR *c;
  4838. char tmp[MAX_SIZE];
  4839. X *x = NULL;
  4840. K *k = NULL;
  4841. bool cluster_allowed = false;
  4842. UINT num_connections_per_ip = 0;
  4843. FOLDER *params_folder;
  4844. UINT i;
  4845. // Validate arguments
  4846. if (s == NULL || f == NULL)
  4847. {
  4848. return;
  4849. }
  4850. // Save interval related
  4851. s->AutoSaveConfigSpan = CfgGetInt(f, "AutoSaveConfigSpan") * 1000;
  4852. if (s->AutoSaveConfigSpan == 0)
  4853. {
  4854. s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
  4855. }
  4856. else
  4857. {
  4858. s->AutoSaveConfigSpan = MAKESURE(s->AutoSaveConfigSpan, SERVER_FILE_SAVE_INTERVAL_MIN, SERVER_FILE_SAVE_INTERVAL_MAX);
  4859. }
  4860. i = CfgGetInt(f, "MaxConcurrentDnsClientThreads");
  4861. if (i != 0)
  4862. {
  4863. SetGetIpThreadMaxNum(i);
  4864. }
  4865. else
  4866. {
  4867. SetGetIpThreadMaxNum(DEFAULT_GETIP_THREAD_MAX_NUM);
  4868. }
  4869. s->DontBackupConfig = CfgGetBool(f, "DontBackupConfig");
  4870. if (CfgIsItem(f, "BackupConfigOnlyWhenModified"))
  4871. {
  4872. s->BackupConfigOnlyWhenModified = CfgGetBool(f, "BackupConfigOnlyWhenModified");
  4873. }
  4874. else
  4875. {
  4876. s->BackupConfigOnlyWhenModified = true;
  4877. }
  4878. // Server log switch type
  4879. if (CfgIsItem(f, "ServerLogSwitchType"))
  4880. {
  4881. UINT st = CfgGetInt(f, "ServerLogSwitchType");
  4882. SetLogSwitchType(s->Logger, st);
  4883. }
  4884. SetMaxLogSize(CfgGetInt64(f, "LoggerMaxLogSize"));
  4885. params_folder = CfgGetFolder(f, "GlobalParams");
  4886. SiLoadGlobalParamsCfg(params_folder);
  4887. c = s->Cedar;
  4888. Lock(c->lock);
  4889. {
  4890. OPENVPN_SSTP_CONFIG config;
  4891. FOLDER *syslog_f;
  4892. {
  4893. RPC_KEEP k;
  4894. // Keep-alive related
  4895. Zero(&k, sizeof(k));
  4896. k.UseKeepConnect = CfgGetBool(f, "UseKeepConnect");
  4897. CfgGetStr(f, "KeepConnectHost", k.KeepConnectHost, sizeof(k.KeepConnectHost));
  4898. k.KeepConnectPort = CfgGetInt(f, "KeepConnectPort");
  4899. k.KeepConnectProtocol = CfgGetInt(f, "KeepConnectProtocol");
  4900. k.KeepConnectInterval = CfgGetInt(f, "KeepConnectInterval") * 1000;
  4901. if (k.KeepConnectPort == 0)
  4902. {
  4903. k.KeepConnectPort = 80;
  4904. }
  4905. if (StrLen(k.KeepConnectHost) == 0)
  4906. {
  4907. StrCpy(k.KeepConnectHost, sizeof(k.KeepConnectHost), CLIENT_DEFAULT_KEEPALIVE_HOST);
  4908. }
  4909. if (k.KeepConnectInterval == 0)
  4910. {
  4911. k.KeepConnectInterval = KEEP_INTERVAL_DEFAULT * 1000;
  4912. }
  4913. if (k.KeepConnectInterval < 5000)
  4914. {
  4915. k.KeepConnectInterval = 5000;
  4916. }
  4917. if (k.KeepConnectInterval > 600000)
  4918. {
  4919. k.KeepConnectInterval = 600000;
  4920. }
  4921. Lock(s->Keep->lock);
  4922. {
  4923. KEEP *keep = s->Keep;
  4924. keep->Enable = k.UseKeepConnect;
  4925. keep->Server = true;
  4926. StrCpy(keep->ServerName, sizeof(keep->ServerName), k.KeepConnectHost);
  4927. keep->ServerPort = k.KeepConnectPort;
  4928. keep->UdpMode = k.KeepConnectProtocol;
  4929. keep->Interval = k.KeepConnectInterval;
  4930. }
  4931. Unlock(s->Keep->lock);
  4932. }
  4933. // syslog
  4934. syslog_f = CfgGetFolder(f, "SyslogSettings");
  4935. if (syslog_f != NULL && GetServerCapsBool(s, "b_support_syslog"))
  4936. {
  4937. SYSLOG_SETTING set;
  4938. Zero(&set, sizeof(set));
  4939. set.SaveType = CfgGetInt(syslog_f, "SaveType");
  4940. CfgGetStr(syslog_f, "HostName", set.Hostname, sizeof(set.Hostname));
  4941. set.Port = CfgGetInt(syslog_f, "Port");
  4942. SiSetSysLogSetting(s, &set);
  4943. }
  4944. // Whether to disable the IPv6 listener
  4945. s->Cedar->DisableIPv6Listener = CfgGetBool(f, "DisableIPv6Listener");
  4946. // DoS
  4947. s->DisableDosProction = CfgGetBool(f, "DisableDosProction");
  4948. // Num Connections Per IP
  4949. SetMaxConnectionsPerIp(CfgGetInt(f, "MaxConnectionsPerIP"));
  4950. // MaxUnestablishedConnections
  4951. SetMaxUnestablishedConnections(CfgGetInt(f, "MaxUnestablishedConnections"));
  4952. // DeadLock
  4953. s->DisableDeadLockCheck = CfgGetBool(f, "DisableDeadLockCheck");
  4954. // Eraser
  4955. SetEraserCheckInterval(CfgGetInt(f, "AutoDeleteCheckIntervalSecs"));
  4956. s->Eraser = NewEraser(s->Logger, CfgGetInt64(f, "AutoDeleteCheckDiskFreeSpaceMin"));
  4957. // WebUI
  4958. s->UseWebUI = CfgGetBool(f, "UseWebUI");
  4959. // WebTimePage
  4960. s->UseWebTimePage = CfgGetBool(f, "UseWebTimePage");
  4961. // NoLinuxArpFilter
  4962. s->NoLinuxArpFilter = CfgGetBool(f, "NoLinuxArpFilter");
  4963. // NoHighPriorityProcess
  4964. s->NoHighPriorityProcess = CfgGetBool(f, "NoHighPriorityProcess");
  4965. // NoDebugDump
  4966. s->NoDebugDump = CfgGetBool(f, "NoDebugDump");
  4967. if (s->NoDebugDump)
  4968. {
  4969. #ifdef OS_WIN32
  4970. MsSetEnableMinidump(false);
  4971. #endif // OS_WIN32
  4972. }
  4973. // Disable the SSTP server function
  4974. s->DisableSSTPServer = CfgGetBool(f, "DisableSSTPServer");
  4975. // Disable the OpenVPN server function
  4976. s->DisableOpenVPNServer = CfgGetBool(f, "DisableOpenVPNServer");
  4977. // OpenVPN Default Option String
  4978. if (CfgGetStr(f, "OpenVPNDefaultClientOption", tmp, sizeof(tmp)))
  4979. {
  4980. if (IsEmptyStr(tmp) == false)
  4981. {
  4982. StrCpy(c->OpenVPNDefaultClientOption,
  4983. sizeof(c->OpenVPNDefaultClientOption), tmp);
  4984. }
  4985. }
  4986. // Disable the NAT-traversal feature
  4987. s->DisableNatTraversal = CfgGetBool(f, "DisableNatTraversal");
  4988. // Intel AES
  4989. s->DisableIntelAesAcceleration = CfgGetBool(f, "DisableIntelAesAcceleration");
  4990. if (s->Cedar->Bridge == false)
  4991. {
  4992. // Enable the VPN-over-ICMP
  4993. if (CfgIsItem(f, "EnableVpnOverIcmp"))
  4994. {
  4995. s->EnableVpnOverIcmp = CfgGetBool(f, "EnableVpnOverIcmp");
  4996. }
  4997. else
  4998. {
  4999. s->EnableVpnOverIcmp = false;
  5000. }
  5001. // Enable the VPN-over-DNS
  5002. if (CfgIsItem(f, "EnableVpnOverDns"))
  5003. {
  5004. s->EnableVpnOverDns = CfgGetBool(f, "EnableVpnOverDns");
  5005. }
  5006. else
  5007. {
  5008. s->EnableVpnOverDns = false;
  5009. }
  5010. }
  5011. // Debug log
  5012. s->SaveDebugLog = CfgGetBool(f, "SaveDebugLog");
  5013. if (s->SaveDebugLog)
  5014. {
  5015. s->DebugLog = NewTinyLog();
  5016. }
  5017. // Let the client not to send a signature
  5018. s->NoSendSignature = CfgGetBool(f, "NoSendSignature");
  5019. // Server certificate
  5020. b = CfgGetBuf(f, "ServerCert");
  5021. if (b != NULL)
  5022. {
  5023. x = BufToX(b, false);
  5024. FreeBuf(b);
  5025. }
  5026. // Server private key
  5027. b = CfgGetBuf(f, "ServerKey");
  5028. if (b != NULL)
  5029. {
  5030. k = BufToK(b, true, false, NULL);
  5031. FreeBuf(b);
  5032. }
  5033. if (x == NULL || k == NULL || CheckXandK(x, k) == false)
  5034. {
  5035. FreeX(x);
  5036. FreeK(k);
  5037. SiGenerateDefaultCert(&x, &k);
  5038. SetCedarCert(c, x, k);
  5039. FreeX(x);
  5040. FreeK(k);
  5041. }
  5042. else
  5043. {
  5044. SetCedarCert(c, x, k);
  5045. FreeX(x);
  5046. FreeK(k);
  5047. }
  5048. // Cipher Name
  5049. if (CfgGetStr(f, "CipherName", tmp, sizeof(tmp)))
  5050. {
  5051. StrUpper(tmp);
  5052. if (CheckCipherListName(tmp))
  5053. {
  5054. SetCedarCipherList(c, tmp);
  5055. }
  5056. }
  5057. // Traffic information
  5058. Lock(c->TrafficLock);
  5059. {
  5060. SiLoadTraffic(f, "ServerTraffic", c->Traffic);
  5061. }
  5062. Unlock(c->TrafficLock);
  5063. // Get whether the current license allows cluster mode
  5064. cluster_allowed = true;
  5065. // Type of server
  5066. s->UpdatedServerType = s->ServerType =
  5067. cluster_allowed ? CfgGetInt(f, "ServerType") : SERVER_TYPE_STANDALONE;
  5068. // Password
  5069. if (CfgGetByte(f, "HashedPassword", s->HashedPassword, sizeof(s->HashedPassword)) != sizeof(s->HashedPassword))
  5070. {
  5071. Hash(s->HashedPassword, "", 0, true);
  5072. }
  5073. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5074. {
  5075. // Performance ratio of the server
  5076. s->Weight = CfgGetInt(f, "ClusterMemberWeight");
  5077. if (s->Weight == 0)
  5078. {
  5079. s->Weight = FARM_DEFAULT_WEIGHT;
  5080. }
  5081. }
  5082. else
  5083. {
  5084. s->Weight = FARM_DEFAULT_WEIGHT;
  5085. }
  5086. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  5087. {
  5088. s->ControllerOnly = CfgGetBool(f, "ControllerOnly");
  5089. }
  5090. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5091. {
  5092. // SSTP, OpenVPN, and NAT traversal can not be used in a cluster environment
  5093. s->DisableNatTraversal = true;
  5094. s->DisableSSTPServer = true;
  5095. s->DisableOpenVPNServer = true;
  5096. }
  5097. if (s->Cedar->Bridge)
  5098. {
  5099. // SSTP, OpenVPN, and NAT traversal function can not be used in the bridge environment
  5100. s->DisableNatTraversal = true;
  5101. s->DisableSSTPServer = true;
  5102. s->DisableOpenVPNServer = true;
  5103. }
  5104. // Read the OpenVPN Port List
  5105. if (CfgGetStr(f, "OpenVPN_UdpPortList", tmp, sizeof(tmp)) == false)
  5106. {
  5107. {
  5108. ToStr(tmp, OPENVPN_UDP_PORT);
  5109. }
  5110. }
  5111. // Apply the configuration of SSTP and OpenVPN
  5112. Zero(&config, sizeof(config));
  5113. config.EnableOpenVPN = !s->DisableOpenVPNServer;
  5114. config.EnableSSTP = !s->DisableSSTPServer;
  5115. StrCpy(config.OpenVPNPortList, sizeof(config.OpenVPNPortList), tmp);
  5116. SiSetOpenVPNAndSSTPConfig(s, &config);
  5117. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5118. {
  5119. char tmp[6 * MAX_PUBLIC_PORT_NUM + 1];
  5120. // Load the settings item in the case of farm members
  5121. CfgGetStr(f, "ControllerName", s->ControllerName, sizeof(s->ControllerName));
  5122. s->ControllerPort = CfgGetInt(f, "ControllerPort");
  5123. CfgGetByte(f, "MemberPassword", s->MemberPassword, SHA1_SIZE);
  5124. s->PublicIp = CfgGetIp32(f, "PublicIp");
  5125. if (CfgGetStr(f, "PublicPorts", tmp, sizeof(tmp)))
  5126. {
  5127. TOKEN_LIST *t = ParseToken(tmp, ", ");
  5128. UINT i;
  5129. s->NumPublicPort = t->NumTokens;
  5130. s->PublicPorts = ZeroMalloc(s->NumPublicPort * sizeof(UINT));
  5131. for (i = 0;i < s->NumPublicPort;i++)
  5132. {
  5133. s->PublicPorts[i] = ToInt(t->Token[i]);
  5134. }
  5135. FreeToken(t);
  5136. }
  5137. }
  5138. // Configuration of VPN Azure Client
  5139. s->EnableVpnAzure = CfgGetBool(f, "EnableVpnAzure");
  5140. // Disable GetHostName when accepting TCP
  5141. s->DisableGetHostNameWhenAcceptTcp = CfgGetBool(f, "DisableGetHostNameWhenAcceptTcp");
  5142. if (s->DisableGetHostNameWhenAcceptTcp)
  5143. {
  5144. DisableGetHostNameWhenAcceptInit();
  5145. }
  5146. // Disable core dump on UNIX
  5147. s->DisableCoreDumpOnUnix = CfgGetBool(f, "DisableCoreDumpOnUnix");
  5148. // Disable session reconnect
  5149. SetGlobalServerFlag(GSF_DISABLE_SESSION_RECONNECT, CfgGetBool(f, "DisableSessionReconnect"));
  5150. // AcceptOnlyTls
  5151. c->AcceptOnlyTls = CfgGetBool(f, "AcceptOnlyTls");
  5152. }
  5153. Unlock(c->lock);
  5154. #ifdef OS_UNIX
  5155. if (s->DisableCoreDumpOnUnix)
  5156. {
  5157. UnixDisableCoreDump();
  5158. }
  5159. #endif // OS_UNIX
  5160. }
  5161. // Load global params
  5162. void SiLoadGlobalParamsCfg(FOLDER *f)
  5163. {
  5164. SiLoadGlobalParamItem(GP_MAX_SEND_SOCKET_QUEUE_SIZE, CfgGetInt(f, "MAX_SEND_SOCKET_QUEUE_SIZE"));
  5165. SiLoadGlobalParamItem(GP_MIN_SEND_SOCKET_QUEUE_SIZE, CfgGetInt(f, "MIN_SEND_SOCKET_QUEUE_SIZE"));
  5166. SiLoadGlobalParamItem(GP_MAX_SEND_SOCKET_QUEUE_NUM, CfgGetInt(f, "MAX_SEND_SOCKET_QUEUE_NUM"));
  5167. SiLoadGlobalParamItem(GP_SELECT_TIME, CfgGetInt(f, "SELECT_TIME"));
  5168. SiLoadGlobalParamItem(GP_SELECT_TIME_FOR_NAT, CfgGetInt(f, "SELECT_TIME_FOR_NAT"));
  5169. SiLoadGlobalParamItem(GP_MAX_STORED_QUEUE_NUM, CfgGetInt(f, "MAX_STORED_QUEUE_NUM"));
  5170. SiLoadGlobalParamItem(GP_MAX_BUFFERING_PACKET_SIZE, CfgGetInt(f, "MAX_BUFFERING_PACKET_SIZE"));
  5171. SiLoadGlobalParamItem(GP_HUB_ARP_SEND_INTERVAL, CfgGetInt(f, "HUB_ARP_SEND_INTERVAL"));
  5172. SiLoadGlobalParamItem(GP_MAC_TABLE_EXPIRE_TIME, CfgGetInt(f, "MAC_TABLE_EXPIRE_TIME"));
  5173. SiLoadGlobalParamItem(GP_IP_TABLE_EXPIRE_TIME, CfgGetInt(f, "IP_TABLE_EXPIRE_TIME"));
  5174. SiLoadGlobalParamItem(GP_IP_TABLE_EXPIRE_TIME_DHCP, CfgGetInt(f, "IP_TABLE_EXPIRE_TIME_DHCP"));
  5175. SiLoadGlobalParamItem(GP_STORM_CHECK_SPAN, CfgGetInt(f, "STORM_CHECK_SPAN"));
  5176. SiLoadGlobalParamItem(GP_STORM_DISCARD_VALUE_START, CfgGetInt(f, "STORM_DISCARD_VALUE_START"));
  5177. SiLoadGlobalParamItem(GP_STORM_DISCARD_VALUE_END, CfgGetInt(f, "STORM_DISCARD_VALUE_END"));
  5178. SiLoadGlobalParamItem(GP_MAX_MAC_TABLES, CfgGetInt(f, "MAX_MAC_TABLES"));
  5179. SiLoadGlobalParamItem(GP_MAX_IP_TABLES, CfgGetInt(f, "MAX_IP_TABLES"));
  5180. SiLoadGlobalParamItem(GP_MAX_HUB_LINKS, CfgGetInt(f, "MAX_HUB_LINKS"));
  5181. SiLoadGlobalParamItem(GP_MEM_FIFO_REALLOC_MEM_SIZE, CfgGetInt(f, "MEM_FIFO_REALLOC_MEM_SIZE"));
  5182. SiLoadGlobalParamItem(GP_QUEUE_BUDGET, CfgGetInt(f, "QUEUE_BUDGET"));
  5183. SiLoadGlobalParamItem(GP_FIFO_BUDGET, CfgGetInt(f, "FIFO_BUDGET"));
  5184. SetFifoCurrentReallocMemSize(MEM_FIFO_REALLOC_MEM_SIZE);
  5185. }
  5186. // Load global param itesm
  5187. void SiLoadGlobalParamItem(UINT id, UINT value)
  5188. {
  5189. // Validate arguments
  5190. if (id == 0)
  5191. {
  5192. return;
  5193. }
  5194. vpn_global_parameters[id] = value;
  5195. }
  5196. // Write global params
  5197. void SiWriteGlobalParamsCfg(FOLDER *f)
  5198. {
  5199. // Validate arguments
  5200. if (f == NULL)
  5201. {
  5202. return;
  5203. }
  5204. CfgAddInt(f, "MAX_SEND_SOCKET_QUEUE_SIZE", MAX_SEND_SOCKET_QUEUE_SIZE);
  5205. CfgAddInt(f, "MIN_SEND_SOCKET_QUEUE_SIZE", MIN_SEND_SOCKET_QUEUE_SIZE);
  5206. CfgAddInt(f, "MAX_SEND_SOCKET_QUEUE_NUM", MAX_SEND_SOCKET_QUEUE_NUM);
  5207. CfgAddInt(f, "SELECT_TIME", SELECT_TIME);
  5208. CfgAddInt(f, "SELECT_TIME_FOR_NAT", SELECT_TIME_FOR_NAT);
  5209. CfgAddInt(f, "MAX_STORED_QUEUE_NUM", MAX_STORED_QUEUE_NUM);
  5210. CfgAddInt(f, "MAX_BUFFERING_PACKET_SIZE", MAX_BUFFERING_PACKET_SIZE);
  5211. CfgAddInt(f, "HUB_ARP_SEND_INTERVAL", HUB_ARP_SEND_INTERVAL);
  5212. CfgAddInt(f, "MAC_TABLE_EXPIRE_TIME", MAC_TABLE_EXPIRE_TIME);
  5213. CfgAddInt(f, "IP_TABLE_EXPIRE_TIME", IP_TABLE_EXPIRE_TIME);
  5214. CfgAddInt(f, "IP_TABLE_EXPIRE_TIME_DHCP", IP_TABLE_EXPIRE_TIME_DHCP);
  5215. CfgAddInt(f, "STORM_CHECK_SPAN", STORM_CHECK_SPAN);
  5216. CfgAddInt(f, "STORM_DISCARD_VALUE_START", STORM_DISCARD_VALUE_START);
  5217. CfgAddInt(f, "STORM_DISCARD_VALUE_END", STORM_DISCARD_VALUE_END);
  5218. CfgAddInt(f, "MAX_MAC_TABLES", MAX_MAC_TABLES);
  5219. CfgAddInt(f, "MAX_IP_TABLES", MAX_IP_TABLES);
  5220. CfgAddInt(f, "MAX_HUB_LINKS", MAX_HUB_LINKS);
  5221. CfgAddInt(f, "MEM_FIFO_REALLOC_MEM_SIZE", MEM_FIFO_REALLOC_MEM_SIZE);
  5222. CfgAddInt(f, "QUEUE_BUDGET", QUEUE_BUDGET);
  5223. CfgAddInt(f, "FIFO_BUDGET", FIFO_BUDGET);
  5224. }
  5225. // Write the server-specific settings
  5226. void SiWriteServerCfg(FOLDER *f, SERVER *s)
  5227. {
  5228. BUF *b;
  5229. CEDAR *c;
  5230. FOLDER *params_folder;
  5231. // Validate arguments
  5232. if (f == NULL || s == NULL)
  5233. {
  5234. return;
  5235. }
  5236. CfgAddInt(f, "MaxConcurrentDnsClientThreads", GetGetIpThreadMaxNum());
  5237. CfgAddInt(f, "CurrentBuild", s->Cedar->Build);
  5238. CfgAddInt(f, "AutoSaveConfigSpan", s->AutoSaveConfigSpanSaved / 1000);
  5239. CfgAddBool(f, "DontBackupConfig", s->DontBackupConfig);
  5240. CfgAddBool(f, "BackupConfigOnlyWhenModified", s->BackupConfigOnlyWhenModified);
  5241. if (s->Logger != NULL)
  5242. {
  5243. CfgAddInt(f, "ServerLogSwitchType", s->Logger->SwitchType);
  5244. }
  5245. CfgAddInt64(f, "LoggerMaxLogSize", GetMaxLogSize());
  5246. params_folder = CfgCreateFolder(f, "GlobalParams");
  5247. if (params_folder != NULL)
  5248. {
  5249. SiWriteGlobalParamsCfg(params_folder);
  5250. }
  5251. c = s->Cedar;
  5252. Lock(c->lock);
  5253. {
  5254. bool is_vgs_cert = false;
  5255. FOLDER *syslog_f;
  5256. Lock(s->Keep->lock);
  5257. {
  5258. KEEP *k = s->Keep;
  5259. CfgAddBool(f, "UseKeepConnect", k->Enable);
  5260. CfgAddStr(f, "KeepConnectHost", k->ServerName);
  5261. CfgAddInt(f, "KeepConnectPort", k->ServerPort);
  5262. CfgAddInt(f, "KeepConnectProtocol", k->UdpMode);
  5263. CfgAddInt(f, "KeepConnectInterval", k->Interval / 1000);
  5264. }
  5265. Unlock(s->Keep->lock);
  5266. // syslog
  5267. syslog_f = CfgCreateFolder(f, "SyslogSettings");
  5268. if (syslog_f != NULL)
  5269. {
  5270. SYSLOG_SETTING set;
  5271. SiGetSysLogSetting(s, &set);
  5272. CfgAddInt(syslog_f, "SaveType", set.SaveType);
  5273. CfgAddStr(syslog_f, "HostName", set.Hostname);
  5274. CfgAddInt(syslog_f, "Port", set.Port);
  5275. }
  5276. // IPv6 listener disable setting
  5277. CfgAddBool(f, "DisableIPv6Listener", s->Cedar->DisableIPv6Listener);
  5278. // DoS
  5279. CfgAddBool(f, "DisableDosProction", s->DisableDosProction);
  5280. // MaxConnectionsPerIP
  5281. CfgAddInt(f, "MaxConnectionsPerIP", GetMaxConnectionsPerIp());
  5282. // MaxUnestablishedConnections
  5283. CfgAddInt(f, "MaxUnestablishedConnections", GetMaxUnestablishedConnections());
  5284. // DeadLock
  5285. CfgAddBool(f, "DisableDeadLockCheck", s->DisableDeadLockCheck);
  5286. // Eraser related
  5287. CfgAddInt64(f, "AutoDeleteCheckDiskFreeSpaceMin", s->Eraser->MinFreeSpace);
  5288. CfgAddInt(f, "AutoDeleteCheckIntervalSecs", GetEraserCheckInterval());
  5289. // WebUI
  5290. CfgAddBool(f, "UseWebUI", s->UseWebUI);
  5291. // NoLinuxArpFilter
  5292. if (GetOsInfo()->OsType == OSTYPE_LINUX)
  5293. {
  5294. CfgAddBool(f, "NoLinuxArpFilter", s->NoLinuxArpFilter);
  5295. }
  5296. // NoHighPriorityProcess
  5297. CfgAddBool(f, "NoHighPriorityProcess", s->NoHighPriorityProcess);
  5298. #ifdef OS_WIN32
  5299. CfgAddBool(f, "NoDebugDump", s->NoDebugDump);
  5300. #endif // OS_WIN32
  5301. if (s->ServerType == SERVER_TYPE_STANDALONE)
  5302. {
  5303. if (c->Bridge == false)
  5304. {
  5305. // Disable the NAT-traversal feature
  5306. CfgAddBool(f, "DisableNatTraversal", s->DisableNatTraversal);
  5307. // Disable the SSTP server function
  5308. CfgAddBool(f, "DisableSSTPServer", s->DisableSSTPServer);
  5309. // Disable the OpenVPN server function
  5310. CfgAddBool(f, "DisableOpenVPNServer", s->DisableOpenVPNServer);
  5311. }
  5312. }
  5313. CfgAddStr(f, "OpenVPNDefaultClientOption", c->OpenVPNDefaultClientOption);
  5314. if (c->Bridge == false)
  5315. {
  5316. // VPN over ICMP
  5317. CfgAddBool(f, "EnableVpnOverIcmp", s->EnableVpnOverIcmp);
  5318. // VPN over DNS
  5319. CfgAddBool(f, "EnableVpnOverDns", s->EnableVpnOverDns);
  5320. }
  5321. // Intel AES
  5322. CfgAddBool(f, "DisableIntelAesAcceleration", s->DisableIntelAesAcceleration);
  5323. if (c->Bridge == false)
  5324. {
  5325. OPENVPN_SSTP_CONFIG config;
  5326. SiGetOpenVPNAndSSTPConfig(s, &config);
  5327. CfgAddStr(f, "OpenVPN_UdpPortList", config.OpenVPNPortList);
  5328. }
  5329. // WebTimePage
  5330. CfgAddBool(f, "UseWebTimePage", s->UseWebTimePage);
  5331. // Debug log
  5332. CfgAddBool(f, "SaveDebugLog", s->SaveDebugLog);
  5333. // Let the client not to send a signature
  5334. CfgAddBool(f, "NoSendSignature", s->NoSendSignature);
  5335. if (is_vgs_cert == false)
  5336. {
  5337. // Server certificate
  5338. b = XToBuf(c->ServerX, false);
  5339. CfgAddBuf(f, "ServerCert", b);
  5340. FreeBuf(b);
  5341. // Server private key
  5342. b = KToBuf(c->ServerK, false, NULL);
  5343. CfgAddBuf(f, "ServerKey", b);
  5344. FreeBuf(b);
  5345. }
  5346. // Traffic information
  5347. Lock(c->TrafficLock);
  5348. {
  5349. SiWriteTraffic(f, "ServerTraffic", c->Traffic);
  5350. }
  5351. Unlock(c->TrafficLock);
  5352. // Type of server
  5353. if (s->Cedar->Bridge == false)
  5354. {
  5355. CfgAddInt(f, "ServerType", s->UpdatedServerType);
  5356. }
  5357. // Cipher Name
  5358. CfgAddStr(f, "CipherName", s->Cedar->CipherList);
  5359. // Password
  5360. CfgAddByte(f, "HashedPassword", s->HashedPassword, sizeof(s->HashedPassword));
  5361. if (s->UpdatedServerType == SERVER_TYPE_FARM_MEMBER)
  5362. {
  5363. char tmp[6 * MAX_PUBLIC_PORT_NUM + 1];
  5364. UINT i;
  5365. // Setting items in the case of farm members
  5366. CfgAddStr(f, "ControllerName", s->ControllerName);
  5367. CfgAddInt(f, "ControllerPort", s->ControllerPort);
  5368. CfgAddByte(f, "MemberPassword", s->MemberPassword, SHA1_SIZE);
  5369. CfgAddIp32(f, "PublicIp", s->PublicIp);
  5370. tmp[0] = 0;
  5371. for (i = 0;i < s->NumPublicPort;i++)
  5372. {
  5373. char tmp2[MAX_SIZE];
  5374. ToStr(tmp2, s->PublicPorts[i]);
  5375. StrCat(tmp, sizeof(tmp), tmp2);
  5376. StrCat(tmp, sizeof(tmp), ",");
  5377. }
  5378. if (StrLen(tmp) >= 1)
  5379. {
  5380. if (tmp[StrLen(tmp) - 1] == ',')
  5381. {
  5382. tmp[StrLen(tmp) - 1] = 0;
  5383. }
  5384. }
  5385. CfgAddStr(f, "PublicPorts", tmp);
  5386. }
  5387. if (s->UpdatedServerType != SERVER_TYPE_STANDALONE)
  5388. {
  5389. CfgAddInt(f, "ClusterMemberWeight", s->Weight);
  5390. }
  5391. if (s->UpdatedServerType == SERVER_TYPE_FARM_CONTROLLER)
  5392. {
  5393. CfgAddBool(f, "ControllerOnly", s->ControllerOnly);
  5394. }
  5395. // VPN Azure Client
  5396. if (s->AzureClient != NULL)
  5397. {
  5398. CfgAddBool(f, "EnableVpnAzure", s->EnableVpnAzure);
  5399. }
  5400. CfgAddBool(f, "DisableGetHostNameWhenAcceptTcp", s->DisableGetHostNameWhenAcceptTcp);
  5401. CfgAddBool(f, "DisableCoreDumpOnUnix", s->DisableCoreDumpOnUnix);
  5402. CfgAddBool(f, "AcceptOnlyTls", c->AcceptOnlyTls);
  5403. // Disable session reconnect
  5404. CfgAddBool(f, "DisableSessionReconnect", GetGlobalServerFlag(GSF_DISABLE_SESSION_RECONNECT));
  5405. }
  5406. Unlock(c->lock);
  5407. }
  5408. // Read the traffic information
  5409. void SiLoadTraffic(FOLDER *parent, char *name, TRAFFIC *t)
  5410. {
  5411. FOLDER *f;
  5412. // Validate arguments
  5413. if (t != NULL)
  5414. {
  5415. Zero(t, sizeof(TRAFFIC));
  5416. }
  5417. if (parent == NULL || name == NULL || t == NULL)
  5418. {
  5419. return;
  5420. }
  5421. f = CfgGetFolder(parent, name);
  5422. if (f == NULL)
  5423. {
  5424. return;
  5425. }
  5426. SiLoadTrafficInner(f, "SendTraffic", &t->Send);
  5427. SiLoadTrafficInner(f, "RecvTraffic", &t->Recv);
  5428. }
  5429. void SiLoadTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e)
  5430. {
  5431. FOLDER *f;
  5432. // Validate arguments
  5433. if (e != NULL)
  5434. {
  5435. Zero(e, sizeof(TRAFFIC_ENTRY));
  5436. }
  5437. if (parent == NULL || name == NULL || e == NULL)
  5438. {
  5439. return;
  5440. }
  5441. f = CfgGetFolder(parent, name);
  5442. if (f == NULL)
  5443. {
  5444. return;
  5445. }
  5446. e->BroadcastCount = CfgGetInt64(f, "BroadcastCount");
  5447. e->BroadcastBytes = CfgGetInt64(f, "BroadcastBytes");
  5448. e->UnicastCount = CfgGetInt64(f, "UnicastCount");
  5449. e->UnicastBytes = CfgGetInt64(f, "UnicastBytes");
  5450. }
  5451. // Write the traffic information
  5452. void SiWriteTraffic(FOLDER *parent, char *name, TRAFFIC *t)
  5453. {
  5454. FOLDER *f;
  5455. // Validate arguments
  5456. if (parent == NULL || name == NULL || t == NULL)
  5457. {
  5458. return;
  5459. }
  5460. f = CfgCreateFolder(parent, name);
  5461. SiWriteTrafficInner(f, "SendTraffic", &t->Send);
  5462. SiWriteTrafficInner(f, "RecvTraffic", &t->Recv);
  5463. }
  5464. void SiWriteTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e)
  5465. {
  5466. FOLDER *f;
  5467. // Validate arguments
  5468. if (parent == NULL || name == NULL || e == NULL)
  5469. {
  5470. return;
  5471. }
  5472. f = CfgCreateFolder(parent, name);
  5473. CfgAddInt64(f, "BroadcastCount", e->BroadcastCount);
  5474. CfgAddInt64(f, "BroadcastBytes", e->BroadcastBytes);
  5475. CfgAddInt64(f, "UnicastCount", e->UnicastCount);
  5476. CfgAddInt64(f, "UnicastBytes", e->UnicastBytes);
  5477. }
  5478. // Thread for writing configuration file
  5479. void SiSaverThread(THREAD *thread, void *param)
  5480. {
  5481. SERVER *s = (SERVER *)param;
  5482. // Validate arguments
  5483. if (thread == NULL || param == NULL)
  5484. {
  5485. return;
  5486. }
  5487. while (s->Halt == false)
  5488. {
  5489. // Save to the configuration file
  5490. if (s->NoMoreSave == false)
  5491. {
  5492. SiWriteConfigurationFile(s);
  5493. }
  5494. Wait(s->SaveHaltEvent, s->AutoSaveConfigSpan);
  5495. }
  5496. }
  5497. // Write to the configuration file
  5498. UINT SiWriteConfigurationFile(SERVER *s)
  5499. {
  5500. UINT ret;
  5501. // Validate arguments
  5502. if (s == NULL)
  5503. {
  5504. return 0;
  5505. }
  5506. if (s->CfgRw == NULL)
  5507. {
  5508. return 0;
  5509. }
  5510. if (s->NoMoreSave)
  5511. {
  5512. return 0;
  5513. }
  5514. Lock(s->SaveCfgLock);
  5515. {
  5516. FOLDER *f;
  5517. Debug("save: SiWriteConfigurationToCfg() start.\n");
  5518. f = SiWriteConfigurationToCfg(s);
  5519. Debug("save: SiWriteConfigurationToCfg() finished.\n");
  5520. Debug("save: SaveCfgRw() start.\n");
  5521. ret = SaveCfgRwEx(s->CfgRw, f, s->BackupConfigOnlyWhenModified ? s->ConfigRevision : INFINITE);
  5522. Debug("save: SaveCfgRw() finished.\n");
  5523. Debug("save: CfgDeleteFolder() start.\n");
  5524. CfgDeleteFolder(f);
  5525. Debug("save: CfgDeleteFolder() finished.\n");
  5526. }
  5527. Unlock(s->SaveCfgLock);
  5528. return ret;
  5529. }
  5530. // Release the configuration
  5531. void SiFreeConfiguration(SERVER *s)
  5532. {
  5533. // Validate arguments
  5534. if (s == NULL)
  5535. {
  5536. return;
  5537. }
  5538. // Write to the configuration file
  5539. SiWriteConfigurationFile(s);
  5540. // Terminate the configuration file saving thread
  5541. s->NoMoreSave = true;
  5542. s->Halt = true;
  5543. Set(s->SaveHaltEvent);
  5544. WaitThread(s->SaveThread, INFINITE);
  5545. ReleaseEvent(s->SaveHaltEvent);
  5546. ReleaseThread(s->SaveThread);
  5547. s->SaveHaltEvent = NULL;
  5548. s->SaveThread = NULL;
  5549. // Stop the IPsec server
  5550. if (s->IPsecServer != NULL)
  5551. {
  5552. FreeIPsecServer(s->IPsecServer);
  5553. s->IPsecServer = NULL;
  5554. }
  5555. // Terminate the OpenVPN server
  5556. if (s->OpenVpnServerUdp != NULL)
  5557. {
  5558. FreeOpenVpnServerUdp(s->OpenVpnServerUdp);
  5559. s->OpenVpnServerUdp = NULL;
  5560. }
  5561. // Terminate the DDNS client
  5562. if (s->DDnsClient != NULL)
  5563. {
  5564. FreeDDNSClient(s->DDnsClient);
  5565. s->DDnsClient = NULL;
  5566. }
  5567. // Terminate the VPN Azure client
  5568. if (s->AzureClient != NULL)
  5569. {
  5570. FreeAzureClient(s->AzureClient);
  5571. s->AzureClient = NULL;
  5572. }
  5573. FreeCfgRw(s->CfgRw);
  5574. s->CfgRw = NULL;
  5575. // Release the Ethernet
  5576. FreeEth();
  5577. }
  5578. // Initialize the StXxx related function
  5579. void StInit()
  5580. {
  5581. if (server_lock != NULL)
  5582. {
  5583. return;
  5584. }
  5585. server_lock = NewLock();
  5586. }
  5587. // Release the StXxx related function
  5588. void StFree()
  5589. {
  5590. DeleteLock(server_lock);
  5591. server_lock = NULL;
  5592. }
  5593. // Start the server
  5594. void StStartServer(bool bridge)
  5595. {
  5596. Lock(server_lock);
  5597. {
  5598. if (server != NULL)
  5599. {
  5600. // It has already started
  5601. Unlock(server_lock);
  5602. return;
  5603. }
  5604. // Create a server
  5605. server = SiNewServer(bridge);
  5606. }
  5607. Unlock(server_lock);
  5608. // StartCedarLog();
  5609. }
  5610. // Get the server
  5611. SERVER *StGetServer()
  5612. {
  5613. if (server == NULL)
  5614. {
  5615. return NULL;
  5616. }
  5617. return server;
  5618. }
  5619. // Stop the server
  5620. void StStopServer()
  5621. {
  5622. Lock(server_lock);
  5623. {
  5624. if (server == NULL)
  5625. {
  5626. // Not started
  5627. Unlock(server_lock);
  5628. return;
  5629. }
  5630. // Release the server
  5631. SiReleaseServer(server);
  5632. server = NULL;
  5633. }
  5634. Unlock(server_lock);
  5635. StopCedarLog();
  5636. }
  5637. // Set the type of server
  5638. void SiSetServerType(SERVER *s, UINT type,
  5639. UINT ip, UINT num_port, UINT *ports,
  5640. char *controller_name, UINT controller_port, UCHAR *password, UINT weight, bool controller_only)
  5641. {
  5642. bool bridge;
  5643. // Validate arguments
  5644. if (s == NULL)
  5645. {
  5646. return;
  5647. }
  5648. if (type == SERVER_TYPE_FARM_MEMBER &&
  5649. (num_port == 0 || ports == NULL || controller_name == NULL ||
  5650. controller_port == 0 || password == NULL || num_port > MAX_PUBLIC_PORT_NUM))
  5651. {
  5652. return;
  5653. }
  5654. if (weight == 0)
  5655. {
  5656. weight = FARM_DEFAULT_WEIGHT;
  5657. }
  5658. bridge = s->Cedar->Bridge;
  5659. Lock(s->lock);
  5660. {
  5661. // Update types
  5662. s->UpdatedServerType = type;
  5663. s->Weight = weight;
  5664. // Set the value
  5665. if (type == SERVER_TYPE_FARM_MEMBER)
  5666. {
  5667. StrCpy(s->ControllerName, sizeof(s->ControllerName), controller_name);
  5668. s->ControllerPort = controller_port;
  5669. if (IsZero(password, SHA1_SIZE) == false)
  5670. {
  5671. Copy(s->MemberPassword, password, SHA1_SIZE);
  5672. }
  5673. s->PublicIp = ip;
  5674. s->NumPublicPort = num_port;
  5675. if (s->PublicPorts != NULL)
  5676. {
  5677. Free(s->PublicPorts);
  5678. }
  5679. s->PublicPorts = ZeroMalloc(num_port * sizeof(UINT));
  5680. Copy(s->PublicPorts, ports, num_port * sizeof(UINT));
  5681. }
  5682. if (type == SERVER_TYPE_FARM_CONTROLLER)
  5683. {
  5684. s->ControllerOnly = controller_only;
  5685. }
  5686. }
  5687. Unlock(s->lock);
  5688. // Restart the server
  5689. SiRebootServer(bridge);
  5690. }
  5691. // Thread to restart the server
  5692. void SiRebootServerThread(THREAD *thread, void *param)
  5693. {
  5694. // Validate arguments
  5695. if (thread == NULL)
  5696. {
  5697. return;
  5698. }
  5699. if (server == NULL)
  5700. {
  5701. return;
  5702. }
  5703. // Stop the server
  5704. StStopServer();
  5705. // Start the server
  5706. StStartServer((bool)param);
  5707. }
  5708. // Restart the server
  5709. void SiRebootServer(bool bridge)
  5710. {
  5711. SiRebootServerEx(bridge, false);
  5712. }
  5713. void SiRebootServerEx(bool bridge, bool reset_setting)
  5714. {
  5715. THREAD *t;
  5716. server_reset_setting = reset_setting;
  5717. t = NewThread(SiRebootServerThread, (void *)bridge);
  5718. ReleaseThread(t);
  5719. }
  5720. // Set the state of the special listener
  5721. void SiApplySpecialListenerStatus(SERVER *s)
  5722. {
  5723. // Validate arguments
  5724. if (s == NULL)
  5725. {
  5726. return;
  5727. }
  5728. if (s->DynListenerDns != NULL)
  5729. {
  5730. *s->DynListenerDns->EnablePtr = s->EnableVpnOverDns;
  5731. ApplyDynamicListener(s->DynListenerDns);
  5732. }
  5733. if (s->DynListenerIcmp != NULL)
  5734. {
  5735. *s->DynListenerIcmp->EnablePtr = s->EnableVpnOverIcmp;
  5736. ApplyDynamicListener(s->DynListenerIcmp);
  5737. }
  5738. }
  5739. // Stop all listeners
  5740. void SiStopAllListener(SERVER *s)
  5741. {
  5742. // Validate arguments
  5743. if (s == NULL)
  5744. {
  5745. return;
  5746. }
  5747. SiLockListenerList(s);
  5748. {
  5749. UINT i;
  5750. LIST *o = NewListFast(NULL);
  5751. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  5752. {
  5753. SERVER_LISTENER *e = LIST_DATA(s->ServerListenerList, i);
  5754. Add(o, e);
  5755. }
  5756. for (i = 0;i < LIST_NUM(o);i++)
  5757. {
  5758. SERVER_LISTENER *e = LIST_DATA(o, i);
  5759. SiDeleteListener(s, e->Port);
  5760. }
  5761. ReleaseList(o);
  5762. }
  5763. SiUnlockListenerList(s);
  5764. ReleaseList(s->ServerListenerList);
  5765. // Stop the VPN over ICMP listener
  5766. FreeDynamicListener(s->DynListenerIcmp);
  5767. s->DynListenerIcmp = NULL;
  5768. // Stop the VPN over DNS listener
  5769. FreeDynamicListener(s->DynListenerDns);
  5770. s->DynListenerDns = NULL;
  5771. }
  5772. // Clean-up the server
  5773. void SiCleanupServer(SERVER *s)
  5774. {
  5775. UINT i;
  5776. CEDAR *c;
  5777. LISTENER **listener_list;
  5778. UINT num_listener;
  5779. HUB **hub_list;
  5780. UINT num_hub;
  5781. // Validate arguments
  5782. if (s == NULL)
  5783. {
  5784. return;
  5785. }
  5786. SiFreeDeadLockCheck(s);
  5787. c = s->Cedar;
  5788. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5789. {
  5790. // In the case of farm members, stop the connection to the farm controller
  5791. SLog(c, "LS_STOP_FARM_MEMBER");
  5792. SiStopConnectToController(s->FarmController);
  5793. s->FarmController = NULL;
  5794. SLog(c, "LS_STOP_FARM_MEMBER_2");
  5795. }
  5796. IncrementServerConfigRevision(s);
  5797. SLog(c, "LS_END_2");
  5798. SLog(c, "LS_STOP_ALL_LISTENER");
  5799. // Stop all listeners
  5800. LockList(c->ListenerList);
  5801. {
  5802. listener_list = ToArray(c->ListenerList);
  5803. num_listener = LIST_NUM(c->ListenerList);
  5804. for (i = 0;i < num_listener;i++)
  5805. {
  5806. AddRef(listener_list[i]->ref);
  5807. }
  5808. }
  5809. UnlockList(c->ListenerList);
  5810. for (i = 0;i < num_listener;i++)
  5811. {
  5812. StopListener(listener_list[i]);
  5813. ReleaseListener(listener_list[i]);
  5814. }
  5815. Free(listener_list);
  5816. SLog(c, "LS_STOP_ALL_LISTENER_2");
  5817. SLog(c, "LS_STOP_ALL_HUB");
  5818. // Stop all HUBs
  5819. LockList(c->HubList);
  5820. {
  5821. hub_list = ToArray(c->HubList);
  5822. num_hub = LIST_NUM(c->HubList);
  5823. for (i = 0;i < num_hub;i++)
  5824. {
  5825. AddRef(hub_list[i]->ref);
  5826. }
  5827. }
  5828. UnlockList(c->HubList);
  5829. for (i = 0;i < num_hub;i++)
  5830. {
  5831. StopHub(hub_list[i]);
  5832. ReleaseHub(hub_list[i]);
  5833. }
  5834. Free(hub_list);
  5835. SLog(c, "LS_STOP_ALL_HUB_2");
  5836. // Release the configuration
  5837. SiFreeConfiguration(s);
  5838. // Stop the Cedar
  5839. SLog(c, "LS_STOP_CEDAR");
  5840. StopCedar(s->Cedar);
  5841. SLog(c, "LS_STOP_CEDAR_2");
  5842. // Stop all listeners
  5843. SiStopAllListener(s);
  5844. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  5845. {
  5846. // In the case of farm controller
  5847. UINT i;
  5848. SLog(c, "LS_STOP_FARM_CONTROL");
  5849. // Stop the farm controling
  5850. SiStopFarmControl(s);
  5851. // Release the farm member information
  5852. ReleaseList(s->FarmMemberList);
  5853. s->FarmMemberList = NULL;
  5854. for (i = 0;i < LIST_NUM(s->Me->HubList);i++)
  5855. {
  5856. Free(LIST_DATA(s->Me->HubList, i));
  5857. }
  5858. ReleaseList(s->Me->HubList);
  5859. Free(s->Me);
  5860. SLog(c, "LS_STOP_FARM_CONTROL_2");
  5861. }
  5862. if (s->PublicPorts != NULL)
  5863. {
  5864. Free(s->PublicPorts);
  5865. }
  5866. SLog(s->Cedar, "LS_END_1");
  5867. SLog(s->Cedar, "L_LINE");
  5868. #ifdef ENABLE_AZURE_SERVER
  5869. if (s->AzureServer != NULL)
  5870. {
  5871. FreeAzureServer(s->AzureServer);
  5872. }
  5873. #endif // ENABLE_AZURE_SERVER
  5874. ReleaseCedar(s->Cedar);
  5875. DeleteLock(s->lock);
  5876. DeleteLock(s->SaveCfgLock);
  5877. StopKeep(s->Keep);
  5878. FreeEraser(s->Eraser);
  5879. FreeLog(s->Logger);
  5880. FreeSysLog(s->Syslog);
  5881. DeleteLock(s->SyslogLock);
  5882. FreeServerCapsCache(s);
  5883. SiFreeHubCreateHistory(s);
  5884. // Stop the debug log
  5885. FreeTinyLog(s->DebugLog);
  5886. DeleteLock(s->TasksFromFarmControllerLock);
  5887. DeleteLock(s->OpenVpnSstpConfigLock);
  5888. Free(s);
  5889. }
  5890. // Release the server
  5891. void SiReleaseServer(SERVER *s)
  5892. {
  5893. // Validate arguments
  5894. if (s == NULL)
  5895. {
  5896. return;
  5897. }
  5898. if (Release(s->ref) == 0)
  5899. {
  5900. SiCleanupServer(s);
  5901. }
  5902. }
  5903. // Get the URL of the member selector
  5904. bool SiGetMemberSelectorUrl(char *url, UINT url_size)
  5905. {
  5906. BUF *b;
  5907. bool ret = false;
  5908. // Validate arguments
  5909. if (url == NULL)
  5910. {
  5911. return false;
  5912. }
  5913. b = ReadDump(MEMBER_SELECTOR_TXT_FILENAME);
  5914. if (b == NULL)
  5915. {
  5916. return false;
  5917. }
  5918. while (true)
  5919. {
  5920. char *line = CfgReadNextLine(b);
  5921. if (line == NULL)
  5922. {
  5923. break;
  5924. }
  5925. Trim(line);
  5926. if (IsEmptyStr(line) == false && ret == false)
  5927. {
  5928. StrCpy(url, url_size, line);
  5929. ret = true;
  5930. }
  5931. Free(line);
  5932. }
  5933. FreeBuf(b);
  5934. return ret;
  5935. }
  5936. // Specify the farm member for the next processing
  5937. FARM_MEMBER *SiGetNextFarmMember(SERVER *s, CONNECTION *c, HUB *h)
  5938. {
  5939. UINT i, num;
  5940. UINT min_point = 0;
  5941. FARM_MEMBER *ret = NULL;
  5942. PACK *p;
  5943. char url[MAX_SIZE];
  5944. // Validate arguments
  5945. if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER || c == NULL || h == NULL)
  5946. {
  5947. return NULL;
  5948. }
  5949. num = LIST_NUM(s->FarmMemberList);
  5950. if (num == 0)
  5951. {
  5952. return NULL;
  5953. }
  5954. if (SiGetMemberSelectorUrl(url, sizeof(url)))
  5955. {
  5956. UINT64 ret_key = 0;
  5957. // Generate the data for the member selector
  5958. p = NewPack();
  5959. for (i = 0;i < num;i++)
  5960. {
  5961. UINT num_sessions;
  5962. UINT max_sessions;
  5963. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  5964. bool do_not_select = false;
  5965. if (s->ControllerOnly)
  5966. {
  5967. if (f->Me)
  5968. {
  5969. // No to select myself in the case of ControllerOnly
  5970. do_not_select = true;
  5971. }
  5972. }
  5973. if (f->Me == false)
  5974. {
  5975. num_sessions = f->NumSessions;
  5976. max_sessions = f->MaxSessions;
  5977. }
  5978. else
  5979. {
  5980. num_sessions = Count(s->Cedar->CurrentSessions);
  5981. max_sessions = GetServerCapsInt(s, "i_max_sessions");
  5982. }
  5983. if (max_sessions == 0)
  5984. {
  5985. max_sessions = GetServerCapsInt(s, "i_max_sessions");
  5986. }
  5987. if (num_sessions >= max_sessions)
  5988. {
  5989. do_not_select = true;
  5990. }
  5991. if (true)
  5992. {
  5993. UINT point = f->Point;
  5994. char public_ip_str[MAX_SIZE];
  5995. IPToStr32(public_ip_str, sizeof(public_ip_str), f->Ip);
  5996. PackAddIntEx(p, "Point", point, i, num);
  5997. PackAddInt64Ex(p, "Key", (UINT64)f, i, num);
  5998. PackAddStrEx(p, "Hostname", f->hostname, i, num);
  5999. PackAddStrEx(p, "PublicIp", public_ip_str, i, num);
  6000. PackAddIntEx(p, "NumSessions", num_sessions, i, num);
  6001. PackAddIntEx(p, "MaxSessions", max_sessions, i, num);
  6002. PackAddIntEx(p, "AssignedClientLicense", f->AssignedClientLicense, i, num);
  6003. PackAddIntEx(p, "AssignedBridgeLicense", f->AssignedBridgeLicense, i, num);
  6004. PackAddIntEx(p, "Weight", f->Weight, i, num);
  6005. PackAddDataEx(p, "RandomKey", f->RandomKey, SHA1_SIZE, i, num);
  6006. PackAddIntEx(p, "NumTcpConnections", f->NumTcpConnections, i, num);
  6007. PackAddIntEx(p, "NumHubs", LIST_NUM(f->HubList), i, num);
  6008. PackAddBoolEx(p, "Me", f->Me, i, num);
  6009. PackAddInt64Ex(p, "ConnectedTime", f->ConnectedTime, i, num);
  6010. PackAddInt64Ex(p, "SystemId", f->SystemId, i, num);
  6011. PackAddBoolEx(p, "DoNotSelect", do_not_select, i, num);
  6012. }
  6013. }
  6014. if (true)
  6015. {
  6016. char client_ip_str[MAX_SIZE];
  6017. UINT client_port = 0;
  6018. UINT server_port = 0;
  6019. SOCK *s = c->FirstSock;
  6020. Zero(client_ip_str, sizeof(client_ip_str));
  6021. if (s != NULL)
  6022. {
  6023. IPToStr(client_ip_str, sizeof(client_ip_str), &s->RemoteIP);
  6024. client_port = s->RemotePort;
  6025. server_port = s->LocalPort;
  6026. }
  6027. PackAddStr(p, "ClientIp", client_ip_str);
  6028. PackAddInt(p, "ClientPort", client_port);
  6029. PackAddInt(p, "ServerPort", server_port);
  6030. PackAddInt(p, "ClientBuild", c->ClientBuild);
  6031. PackAddStr(p, "CipherName", c->CipherName);
  6032. PackAddStr(p, "ClientStr", c->ClientStr);
  6033. PackAddInt(p, "ClientVer", c->ClientVer);
  6034. PackAddInt64(p, "ConnectedTime", Tick64ToTime64(c->ConnectedTick));
  6035. PackAddStr(p, "HubName", h->Name);
  6036. PackAddBool(p, "StaticHub", h->Type == HUB_TYPE_FARM_STATIC);
  6037. }
  6038. PackAddInt(p, "NumMembers", num);
  6039. // Make the member selector choose a member
  6040. UnlockList(s->FarmMemberList);
  6041. Unlock(s->Cedar->CedarSuperLock);
  6042. {
  6043. PACK *ret;
  6044. Debug("Calling %s ...\n", url);
  6045. ret = WpcCall(url, NULL, MEMBER_SELECTOR_CONNECT_TIMEOUT, MEMBER_SELECTOR_DATA_TIMEOUT,
  6046. "Select", p, NULL, NULL, NULL);
  6047. if (GetErrorFromPack(ret) == ERR_NO_ERROR)
  6048. {
  6049. ret_key = PackGetInt64(ret, "Key");
  6050. Debug("Ret Key = %I64u\n", ret_key);
  6051. }
  6052. else
  6053. {
  6054. Debug("Error: %u\n", GetErrorFromPack(ret));
  6055. }
  6056. FreePack(ret);
  6057. }
  6058. Lock(s->Cedar->CedarSuperLock);
  6059. LockList(s->FarmMemberList);
  6060. FreePack(p);
  6061. if (ret_key != 0)
  6062. {
  6063. FARM_MEMBER *f = (FARM_MEMBER *)ret_key;
  6064. if (IsInList(s->FarmMemberList, f))
  6065. {
  6066. Debug("Farm Member Selected by Selector: %s\n", f->hostname);
  6067. return f;
  6068. }
  6069. else
  6070. {
  6071. Debug("Farm Member Key = %I64u Not Found.\n", ret_key);
  6072. }
  6073. }
  6074. else
  6075. {
  6076. // The member selector failed to select a member
  6077. return NULL;
  6078. }
  6079. }
  6080. num = LIST_NUM(s->FarmMemberList);
  6081. if (num == 0)
  6082. {
  6083. return NULL;
  6084. }
  6085. for (i = 0;i < num;i++)
  6086. {
  6087. UINT num_sessions;
  6088. UINT max_sessions;
  6089. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6090. if (s->ControllerOnly)
  6091. {
  6092. if (f->Me)
  6093. {
  6094. // No to select myself in the case of ControllerOnly
  6095. continue;
  6096. }
  6097. }
  6098. if (f->Me == false)
  6099. {
  6100. num_sessions = f->NumSessions;
  6101. max_sessions = f->MaxSessions;
  6102. }
  6103. else
  6104. {
  6105. num_sessions = Count(s->Cedar->CurrentSessions);
  6106. max_sessions = GetServerCapsInt(s, "i_max_sessions");
  6107. }
  6108. if (max_sessions == 0)
  6109. {
  6110. max_sessions = GetServerCapsInt(s, "i_max_sessions");
  6111. }
  6112. if (num_sessions < max_sessions)
  6113. {
  6114. if (f->Point >= min_point)
  6115. {
  6116. min_point = f->Point;
  6117. ret = f;
  6118. }
  6119. }
  6120. }
  6121. return ret;
  6122. }
  6123. // Receive a HUB enumeration directive
  6124. void SiCalledEnumHub(SERVER *s, PACK *p, PACK *req)
  6125. {
  6126. UINT i;
  6127. CEDAR *c;
  6128. UINT num = 0;
  6129. // Validate arguments
  6130. if (s == NULL || p == NULL || req == NULL)
  6131. {
  6132. return;
  6133. }
  6134. c = s->Cedar;
  6135. LockList(c->HubList);
  6136. {
  6137. UINT num = LIST_NUM(c->HubList);
  6138. for (i = 0;i < num;i++)
  6139. {
  6140. HUB *h = LIST_DATA(c->HubList, i);
  6141. Lock(h->lock);
  6142. {
  6143. PackAddStrEx(p, "HubName", h->Name, i, num);
  6144. PackAddIntEx(p, "HubType", h->Type, i, num);
  6145. PackAddIntEx(p, "NumSession", Count(h->NumSessions), i, num);
  6146. PackAddIntEx(p, "NumSessions", LIST_NUM(h->SessionList), i, num);
  6147. PackAddIntEx(p, "NumSessionsClient", Count(h->NumSessionsClient), i, num);
  6148. PackAddIntEx(p, "NumSessionsBridge", Count(h->NumSessionsBridge), i, num);
  6149. PackAddIntEx(p, "NumMacTables", HASH_LIST_NUM(h->MacHashTable), i, num);
  6150. PackAddIntEx(p, "NumIpTables", LIST_NUM(h->IpTable), i, num);
  6151. PackAddInt64Ex(p, "LastCommTime", h->LastCommTime, i, num);
  6152. PackAddInt64Ex(p, "CreatedTime", h->CreatedTime, i, num);
  6153. }
  6154. Unlock(h->lock);
  6155. }
  6156. }
  6157. UnlockList(c->HubList);
  6158. PackAddInt(p, "Point", SiGetPoint(s));
  6159. PackAddInt(p, "NumTcpConnections", Count(s->Cedar->CurrentTcpConnections));
  6160. PackAddInt(p, "NumTotalSessions", Count(s->Cedar->CurrentSessions));
  6161. PackAddInt(p, "MaxSessions", GetServerCapsInt(s, "i_max_sessions"));
  6162. PackAddInt(p, "AssignedClientLicense", Count(s->Cedar->AssignedClientLicense));
  6163. PackAddInt(p, "AssignedBridgeLicense", Count(s->Cedar->AssignedBridgeLicense));
  6164. PackAddData(p, "RandomKey", s->MyRandomKey, SHA1_SIZE);
  6165. Lock(c->TrafficLock);
  6166. {
  6167. OutRpcTraffic(p, c->Traffic);
  6168. }
  6169. Unlock(c->TrafficLock);
  6170. LockList(c->TrafficDiffList);
  6171. {
  6172. UINT num = LIST_NUM(c->TrafficDiffList);
  6173. UINT i;
  6174. for (i = 0;i < num;i++)
  6175. {
  6176. TRAFFIC_DIFF *d = LIST_DATA(c->TrafficDiffList, i);
  6177. PackAddIntEx(p, "TdType", d->Type, i, num);
  6178. PackAddStrEx(p, "TdHubName", d->HubName, i, num);
  6179. PackAddStrEx(p, "TdName", d->Name, i, num);
  6180. OutRpcTrafficEx(&d->Traffic, p, i, num);
  6181. Free(d->HubName);
  6182. Free(d->Name);
  6183. Free(d);
  6184. }
  6185. DeleteAll(c->TrafficDiffList);
  6186. }
  6187. UnlockList(c->TrafficDiffList);
  6188. }
  6189. // Receive a HUB delete directive
  6190. void SiCalledDeleteHub(SERVER *s, PACK *p)
  6191. {
  6192. char name[MAX_SIZE];
  6193. HUB *h;
  6194. // Validate arguments
  6195. if (s == NULL || p == NULL)
  6196. {
  6197. return;
  6198. }
  6199. if (PackGetStr(p, "HubName", name, sizeof(name)) == false)
  6200. {
  6201. return;
  6202. }
  6203. LockHubList(s->Cedar);
  6204. h = GetHub(s->Cedar, name);
  6205. if (h == NULL)
  6206. {
  6207. UnlockHubList(s->Cedar);
  6208. return;
  6209. }
  6210. UnlockHubList(s->Cedar);
  6211. SetHubOffline(h);
  6212. LockHubList(s->Cedar);
  6213. DelHubEx(s->Cedar, h, true);
  6214. UnlockHubList(s->Cedar);
  6215. ReleaseHub(h);
  6216. }
  6217. // Receive a HUB update directive
  6218. void SiCalledUpdateHub(SERVER *s, PACK *p)
  6219. {
  6220. char name[MAX_SIZE];
  6221. UINT type;
  6222. HUB_OPTION o;
  6223. HUB_LOG log;
  6224. bool save_packet_log;
  6225. UINT packet_log_switch_type;
  6226. UINT packet_log_config[NUM_PACKET_LOG];
  6227. bool save_security_log;
  6228. bool type_changed = false;
  6229. UINT security_log_switch_type;
  6230. UINT i;
  6231. HUB *h;
  6232. // Validate arguments
  6233. if (s == NULL || p == NULL)
  6234. {
  6235. return;
  6236. }
  6237. PackGetStr(p, "HubName", name, sizeof(name));
  6238. type = PackGetInt(p, "HubType");
  6239. Zero(&o, sizeof(o));
  6240. o.MaxSession = PackGetInt(p, "MaxSession");
  6241. o.NoArpPolling = PackGetBool(p, "NoArpPolling");
  6242. o.NoIPv6AddrPolling = PackGetBool(p, "NoIPv6AddrPolling");
  6243. o.FilterPPPoE = PackGetBool(p, "FilterPPPoE");
  6244. o.YieldAfterStorePacket = PackGetBool(p, "YieldAfterStorePacket");
  6245. o.NoSpinLockForPacketDelay = PackGetBool(p, "NoSpinLockForPacketDelay");
  6246. o.BroadcastStormDetectionThreshold = PackGetInt(p, "BroadcastStormDetectionThreshold");
  6247. o.ClientMinimumRequiredBuild = PackGetInt(p, "ClientMinimumRequiredBuild");
  6248. o.FixForDLinkBPDU = PackGetBool(p, "FixForDLinkBPDU");
  6249. o.BroadcastLimiterStrictMode = PackGetBool(p, "BroadcastLimiterStrictMode");
  6250. o.NoLookBPDUBridgeId = PackGetBool(p, "NoLookBPDUBridgeId");
  6251. o.NoManageVlanId = PackGetBool(p, "NoManageVlanId");
  6252. o.MaxLoggedPacketsPerMinute = PackGetInt(p, "MaxLoggedPacketsPerMinute");
  6253. o.FloodingSendQueueBufferQuota = PackGetInt(p, "FloodingSendQueueBufferQuota");
  6254. o.DoNotSaveHeavySecurityLogs = PackGetBool(p, "DoNotSaveHeavySecurityLogs");
  6255. o.DropBroadcastsInPrivacyFilterMode = PackGetBool(p, "DropBroadcastsInPrivacyFilterMode");
  6256. o.DropArpInPrivacyFilterMode = PackGetBool(p, "DropArpInPrivacyFilterMode");
  6257. o.SuppressClientUpdateNotification = PackGetBool(p, "SuppressClientUpdateNotification");
  6258. o.AssignVLanIdByRadiusAttribute = PackGetBool(p, "AssignVLanIdByRadiusAttribute");
  6259. o.SecureNAT_RandomizeAssignIp = PackGetBool(p, "SecureNAT_RandomizeAssignIp");
  6260. o.DetectDormantSessionInterval = PackGetInt(p, "DetectDormantSessionInterval");
  6261. o.VlanTypeId = PackGetInt(p, "VlanTypeId");
  6262. o.NoPhysicalIPOnPacketLog = PackGetBool(p, "NoPhysicalIPOnPacketLog");
  6263. if (o.VlanTypeId == 0)
  6264. {
  6265. o.VlanTypeId = MAC_PROTO_TAGVLAN;
  6266. }
  6267. o.FilterOSPF = PackGetBool(p, "FilterOSPF");
  6268. o.FilterIPv4 = PackGetBool(p, "FilterIPv4");
  6269. o.FilterIPv6 = PackGetBool(p, "FilterIPv6");
  6270. o.FilterNonIP = PackGetBool(p, "FilterNonIP");
  6271. o.NoIPv4PacketLog = PackGetBool(p, "NoIPv4PacketLog");
  6272. o.NoIPv6PacketLog = PackGetBool(p, "NoIPv6PacketLog");
  6273. o.FilterBPDU = PackGetBool(p, "FilterBPDU");
  6274. o.NoIPv6DefaultRouterInRAWhenIPv6 = PackGetBool(p, "NoIPv6DefaultRouterInRAWhenIPv6");
  6275. o.NoMacAddressLog = PackGetBool(p, "NoMacAddressLog");
  6276. o.ManageOnlyPrivateIP = PackGetBool(p, "ManageOnlyPrivateIP");
  6277. o.ManageOnlyLocalUnicastIPv6 = PackGetBool(p, "ManageOnlyLocalUnicastIPv6");
  6278. o.DisableIPParsing = PackGetBool(p, "DisableIPParsing");
  6279. o.NoIpTable = PackGetBool(p, "NoIpTable");
  6280. o.NoEnum = PackGetBool(p, "NoEnum");
  6281. o.AdjustTcpMssValue = PackGetInt(p, "AdjustTcpMssValue");
  6282. o.DisableAdjustTcpMss = PackGetBool(p, "DisableAdjustTcpMss");
  6283. o.NoDhcpPacketLogOutsideHub = PackGetBool(p, "NoDhcpPacketLogOutsideHub");
  6284. o.DisableHttpParsing = PackGetBool(p, "DisableHttpParsing");
  6285. o.DisableUdpAcceleration = PackGetBool(p, "DisableUdpAcceleration");
  6286. o.DisableUdpFilterForLocalBridgeNic = PackGetBool(p, "DisableUdpFilterForLocalBridgeNic");
  6287. o.ApplyIPv4AccessListOnArpPacket = PackGetBool(p, "ApplyIPv4AccessListOnArpPacket");
  6288. o.RemoveDefGwOnDhcpForLocalhost = PackGetBool(p, "RemoveDefGwOnDhcpForLocalhost");
  6289. o.SecureNAT_MaxTcpSessionsPerIp = PackGetInt(p, "SecureNAT_MaxTcpSessionsPerIp");
  6290. o.SecureNAT_MaxTcpSynSentPerIp = PackGetInt(p, "SecureNAT_MaxTcpSynSentPerIp");
  6291. o.SecureNAT_MaxUdpSessionsPerIp = PackGetInt(p, "SecureNAT_MaxUdpSessionsPerIp");
  6292. o.SecureNAT_MaxDnsSessionsPerIp = PackGetInt(p, "SecureNAT_MaxDnsSessionsPerIp");
  6293. o.SecureNAT_MaxIcmpSessionsPerIp = PackGetInt(p, "SecureNAT_MaxIcmpSessionsPerIp");
  6294. o.AccessListIncludeFileCacheLifetime = PackGetInt(p, "AccessListIncludeFileCacheLifetime");
  6295. if (o.AccessListIncludeFileCacheLifetime == 0)
  6296. {
  6297. o.AccessListIncludeFileCacheLifetime = ACCESS_LIST_INCLUDE_FILE_CACHE_LIFETIME;
  6298. }
  6299. o.DisableKernelModeSecureNAT = PackGetBool(p, "DisableKernelModeSecureNAT");
  6300. o.DisableUserModeSecureNAT = PackGetBool(p, "DisableUserModeSecureNAT");
  6301. o.DisableCheckMacOnLocalBridge = PackGetBool(p, "DisableCheckMacOnLocalBridge");
  6302. o.DisableCorrectIpOffloadChecksum = PackGetBool(p, "DisableCorrectIpOffloadChecksum");
  6303. save_packet_log = PackGetInt(p, "SavePacketLog");
  6304. packet_log_switch_type = PackGetInt(p, "PacketLogSwitchType");
  6305. for (i = 0;i < NUM_PACKET_LOG;i++)
  6306. {
  6307. packet_log_config[i] = PackGetIntEx(p, "PacketLogConfig", i);
  6308. }
  6309. save_security_log = PackGetInt(p, "SaveSecurityLog");
  6310. security_log_switch_type = PackGetInt(p, "SecurityLogSwitchType");
  6311. Zero(&log, sizeof(log));
  6312. log.SavePacketLog = save_packet_log;
  6313. log.PacketLogSwitchType = packet_log_switch_type;
  6314. Copy(log.PacketLogConfig, packet_log_config, sizeof(log.PacketLogConfig));
  6315. log.SaveSecurityLog = save_security_log;
  6316. log.SecurityLogSwitchType = security_log_switch_type;
  6317. h = GetHub(s->Cedar, name);
  6318. if (h == NULL)
  6319. {
  6320. return;
  6321. }
  6322. h->FarmMember_MaxSessionClient = PackGetInt(p, "MaxSessionClient");
  6323. h->FarmMember_MaxSessionBridge = PackGetInt(p, "MaxSessionBridge");
  6324. h->FarmMember_MaxSessionClientBridgeApply = PackGetBool(p, "MaxSessionClientBridgeApply");
  6325. if (h->FarmMember_MaxSessionClientBridgeApply == false)
  6326. {
  6327. h->FarmMember_MaxSessionClient = INFINITE;
  6328. h->FarmMember_MaxSessionBridge = INFINITE;
  6329. }
  6330. Lock(h->lock);
  6331. {
  6332. Copy(h->Option, &o, sizeof(HUB_OPTION));
  6333. PackGetData2(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
  6334. PackGetData2(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
  6335. }
  6336. Unlock(h->lock);
  6337. SetHubLogSetting(h, &log);
  6338. if (h->Type != type)
  6339. {
  6340. h->Type = type;
  6341. type_changed = true;
  6342. }
  6343. LockList(h->AccessList);
  6344. {
  6345. UINT i;
  6346. for (i = 0;i < LIST_NUM(h->AccessList);i++)
  6347. {
  6348. ACCESS *a = LIST_DATA(h->AccessList, i);
  6349. Free(a);
  6350. }
  6351. DeleteAll(h->AccessList);
  6352. }
  6353. UnlockList(h->AccessList);
  6354. for (i = 0;i < SiNumAccessFromPack(p);i++)
  6355. {
  6356. ACCESS *a = SiPackToAccess(p, i);
  6357. AddAccessList(h, a);
  6358. Free(a);
  6359. }
  6360. if (PackGetBool(p, "EnableSecureNAT"))
  6361. {
  6362. VH_OPTION t;
  6363. bool changed;
  6364. InVhOption(&t, p);
  6365. changed = Cmp(h->SecureNATOption, &t, sizeof(VH_OPTION)) == 0 ? false : true;
  6366. Copy(h->SecureNATOption, &t, sizeof(VH_OPTION));
  6367. EnableSecureNAT(h, true);
  6368. if (changed)
  6369. {
  6370. Lock(h->lock_online);
  6371. {
  6372. if (h->SecureNAT != NULL)
  6373. {
  6374. SetVirtualHostOption(h->SecureNAT->Nat->Virtual, &t);
  6375. Debug("SiCalledUpdateHub: SecureNAT Updated.\n");
  6376. }
  6377. }
  6378. Unlock(h->lock_online);
  6379. }
  6380. }
  6381. else
  6382. {
  6383. EnableSecureNAT(h, false);
  6384. Debug("SiCalledUpdateHub: SecureNAT Disabled.\n");
  6385. }
  6386. if (type_changed)
  6387. {
  6388. // Remove all sessions since the type of HUB has been changed
  6389. if (h->Offline == false)
  6390. {
  6391. SetHubOffline(h);
  6392. SetHubOnline(h);
  6393. }
  6394. }
  6395. ReleaseHub(h);
  6396. }
  6397. // Inspect the ticket
  6398. bool SiCheckTicket(HUB *h, UCHAR *ticket, char *username, UINT username_size, char *usernamereal, UINT usernamereal_size, POLICY *policy, char *sessionname, UINT sessionname_size, char *groupname, UINT groupname_size)
  6399. {
  6400. bool ret = false;
  6401. // Validate arguments
  6402. if (h == NULL || ticket == NULL || username == NULL || usernamereal == NULL || policy == NULL || sessionname == NULL)
  6403. {
  6404. return false;
  6405. }
  6406. LockList(h->TicketList);
  6407. {
  6408. UINT i;
  6409. for (i = 0;i < LIST_NUM(h->TicketList);i++)
  6410. {
  6411. TICKET *t = LIST_DATA(h->TicketList, i);
  6412. if (Cmp(t->Ticket, ticket, SHA1_SIZE) == 0)
  6413. {
  6414. ret = true;
  6415. StrCpy(username, username_size, t->Username);
  6416. StrCpy(usernamereal, usernamereal_size, t->UsernameReal);
  6417. StrCpy(sessionname, sessionname_size, t->SessionName);
  6418. StrCpy(groupname, groupname_size, t->GroupName);
  6419. Copy(policy, &t->Policy, sizeof(POLICY));
  6420. Delete(h->TicketList, t);
  6421. Free(t);
  6422. break;
  6423. }
  6424. }
  6425. }
  6426. UnlockList(h->TicketList);
  6427. return ret;
  6428. }
  6429. // Receive a MAC address deletion directive
  6430. void SiCalledDeleteMacTable(SERVER *s, PACK *p)
  6431. {
  6432. UINT key;
  6433. char hubname[MAX_HUBNAME_LEN + 1];
  6434. HUB *h;
  6435. // Validate arguments
  6436. if (s == NULL || p == NULL)
  6437. {
  6438. return;
  6439. }
  6440. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6441. {
  6442. return;
  6443. }
  6444. key = PackGetInt(p, "Key");
  6445. LockHubList(s->Cedar);
  6446. {
  6447. h = GetHub(s->Cedar, hubname);
  6448. }
  6449. UnlockHubList(s->Cedar);
  6450. if (h == NULL)
  6451. {
  6452. return;
  6453. }
  6454. LockHashList(h->MacHashTable);
  6455. {
  6456. MAC_TABLE_ENTRY *e = HashListKeyToPointer(h->MacHashTable, key);
  6457. DeleteHash(h->MacHashTable, e);
  6458. Free(e);
  6459. }
  6460. UnlockHashList(h->MacHashTable);
  6461. ReleaseHub(h);
  6462. }
  6463. // Receive an IP address delete directive
  6464. void SiCalledDeleteIpTable(SERVER *s, PACK *p)
  6465. {
  6466. UINT key;
  6467. char hubname[MAX_HUBNAME_LEN + 1];
  6468. HUB *h;
  6469. // Validate arguments
  6470. if (s == NULL || p == NULL)
  6471. {
  6472. return;
  6473. }
  6474. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6475. {
  6476. return;
  6477. }
  6478. key = PackGetInt(p, "Key");
  6479. LockHubList(s->Cedar);
  6480. {
  6481. h = GetHub(s->Cedar, hubname);
  6482. }
  6483. UnlockHubList(s->Cedar);
  6484. if (h == NULL)
  6485. {
  6486. return;
  6487. }
  6488. LockList(h->IpTable);
  6489. {
  6490. if (IsInList(h->IpTable, (void *)key))
  6491. {
  6492. IP_TABLE_ENTRY *e = (IP_TABLE_ENTRY *)key;
  6493. Delete(h->IpTable, e);
  6494. Free(e);
  6495. }
  6496. }
  6497. UnlockList(h->IpTable);
  6498. ReleaseHub(h);
  6499. }
  6500. // Receive a session deletion directive
  6501. void SiCalledDeleteSession(SERVER *s, PACK *p)
  6502. {
  6503. char name[MAX_SESSION_NAME_LEN + 1];
  6504. char hubname[MAX_HUBNAME_LEN + 1];
  6505. HUB *h;
  6506. SESSION *sess;
  6507. // Validate arguments
  6508. if (s == NULL || p == NULL)
  6509. {
  6510. return;
  6511. }
  6512. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6513. {
  6514. return;
  6515. }
  6516. if (PackGetStr(p, "SessionName", name, sizeof(name)) == false)
  6517. {
  6518. return;
  6519. }
  6520. LockHubList(s->Cedar);
  6521. {
  6522. h = GetHub(s->Cedar, hubname);
  6523. }
  6524. UnlockHubList(s->Cedar);
  6525. if (h == NULL)
  6526. {
  6527. return;
  6528. }
  6529. sess = GetSessionByName(h, name);
  6530. if (sess != NULL)
  6531. {
  6532. if (sess->BridgeMode == false && sess->LinkModeServer == false && sess->SecureNATMode == false)
  6533. {
  6534. StopSession(sess);
  6535. }
  6536. ReleaseSession(sess);
  6537. }
  6538. ReleaseHub(h);
  6539. }
  6540. // Receive a log file reading directive
  6541. PACK *SiCalledReadLogFile(SERVER *s, PACK *p)
  6542. {
  6543. RPC_READ_LOG_FILE t;
  6544. PACK *ret;
  6545. char filepath[MAX_PATH];
  6546. UINT offset;
  6547. // Validate arguments
  6548. if (s == NULL || p == NULL)
  6549. {
  6550. return NULL;
  6551. }
  6552. PackGetStr(p, "FilePath", filepath, sizeof(filepath));
  6553. offset = PackGetInt(p, "Offset");
  6554. Zero(&t, sizeof(t));
  6555. SiReadLocalLogFile(s, filepath, offset, &t);
  6556. ret = NewPack();
  6557. OutRpcReadLogFile(ret, &t);
  6558. FreeRpcReadLogFile(&t);
  6559. return ret;
  6560. }
  6561. // Receive a log file enumeration directive
  6562. PACK *SiCalledEnumLogFileList(SERVER *s, PACK *p)
  6563. {
  6564. RPC_ENUM_LOG_FILE t;
  6565. PACK *ret;
  6566. char hubname[MAX_HUBNAME_LEN + 1];
  6567. // Validate arguments
  6568. if (s == NULL || p == NULL)
  6569. {
  6570. return NULL;
  6571. }
  6572. PackGetStr(p, "HubName", hubname, sizeof(hubname));
  6573. Zero(&t, sizeof(t));
  6574. SiEnumLocalLogFileList(s, hubname, &t);
  6575. ret = NewPack();
  6576. OutRpcEnumLogFile(ret, &t);
  6577. FreeRpcEnumLogFile(&t);
  6578. return ret;
  6579. }
  6580. // Receive a session information directive
  6581. PACK *SiCalledGetSessionStatus(SERVER *s, PACK *p)
  6582. {
  6583. RPC_SESSION_STATUS t;
  6584. ADMIN a;
  6585. PACK *ret;
  6586. // Validate arguments
  6587. if (s == NULL || p == NULL)
  6588. {
  6589. return NULL;
  6590. }
  6591. Zero(&t, sizeof(t));
  6592. InRpcSessionStatus(&t, p);
  6593. Zero(&a, sizeof(a));
  6594. a.Server = s;
  6595. a.ServerAdmin = true;
  6596. if (StGetSessionStatus(&a, &t) != ERR_NO_ERROR)
  6597. {
  6598. FreeRpcSessionStatus(&t);
  6599. return NULL;
  6600. }
  6601. ret = NewPack();
  6602. OutRpcSessionStatus(ret, &t);
  6603. FreeRpcSessionStatus(&t);
  6604. return ret;
  6605. }
  6606. // IP table enumeration directive
  6607. PACK *SiCalledEnumIpTable(SERVER *s, PACK *p)
  6608. {
  6609. char hubname[MAX_HUBNAME_LEN + 1];
  6610. RPC_ENUM_IP_TABLE t;
  6611. PACK *ret;
  6612. // Validate arguments
  6613. if (s == NULL || p == NULL)
  6614. {
  6615. return NewPack();
  6616. }
  6617. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6618. {
  6619. return NewPack();
  6620. }
  6621. Zero(&t, sizeof(t));
  6622. SiEnumIpTable(s, hubname, &t);
  6623. ret = NewPack();
  6624. OutRpcEnumIpTable(ret, &t);
  6625. FreeRpcEnumIpTable(&t);
  6626. return ret;
  6627. }
  6628. // MAC table enumeration directive
  6629. PACK *SiCalledEnumMacTable(SERVER *s, PACK *p)
  6630. {
  6631. char hubname[MAX_HUBNAME_LEN + 1];
  6632. RPC_ENUM_MAC_TABLE t;
  6633. PACK *ret;
  6634. // Validate arguments
  6635. if (s == NULL || p == NULL)
  6636. {
  6637. return NewPack();
  6638. }
  6639. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6640. {
  6641. return NewPack();
  6642. }
  6643. Zero(&t, sizeof(t));
  6644. SiEnumMacTable(s, hubname, &t);
  6645. ret = NewPack();
  6646. OutRpcEnumMacTable(ret, &t);
  6647. FreeRpcEnumMacTable(&t);
  6648. return ret;
  6649. }
  6650. // NAT status acquisition directive
  6651. PACK *SiCalledGetNatStatus(SERVER *s, PACK *p)
  6652. {
  6653. char hubname[MAX_HUBNAME_LEN + 1];
  6654. RPC_NAT_STATUS t;
  6655. PACK *ret;
  6656. HUB *h;
  6657. // Validate arguments
  6658. if (s == NULL || p == NULL)
  6659. {
  6660. return NewPack();
  6661. }
  6662. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6663. {
  6664. return NewPack();
  6665. }
  6666. Zero(&t, sizeof(t));
  6667. LockHubList(s->Cedar);
  6668. {
  6669. h = GetHub(s->Cedar, hubname);
  6670. }
  6671. UnlockHubList(s->Cedar);
  6672. if (h != NULL)
  6673. {
  6674. Lock(h->lock_online);
  6675. {
  6676. if (h->SecureNAT != NULL)
  6677. {
  6678. NtGetStatus(h->SecureNAT->Nat, &t);
  6679. }
  6680. }
  6681. Unlock(h->lock_online);
  6682. }
  6683. ReleaseHub(h);
  6684. ret = NewPack();
  6685. OutRpcNatStatus(ret, &t);
  6686. FreeRpcNatStatus(&t);
  6687. return ret;
  6688. }
  6689. // DHCP table enumeration directive
  6690. PACK *SiCalledEnumDhcp(SERVER *s, PACK *p)
  6691. {
  6692. char hubname[MAX_HUBNAME_LEN + 1];
  6693. RPC_ENUM_DHCP t;
  6694. PACK *ret;
  6695. HUB *h;
  6696. // Validate arguments
  6697. if (s == NULL || p == NULL)
  6698. {
  6699. return NewPack();
  6700. }
  6701. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6702. {
  6703. return NewPack();
  6704. }
  6705. Zero(&t, sizeof(t));
  6706. LockHubList(s->Cedar);
  6707. {
  6708. h = GetHub(s->Cedar, hubname);
  6709. }
  6710. UnlockHubList(s->Cedar);
  6711. if (h != NULL)
  6712. {
  6713. Lock(h->lock_online);
  6714. {
  6715. if (h->SecureNAT != NULL)
  6716. {
  6717. NtEnumDhcpList(h->SecureNAT->Nat, &t);
  6718. }
  6719. }
  6720. Unlock(h->lock_online);
  6721. }
  6722. ReleaseHub(h);
  6723. ret = NewPack();
  6724. OutRpcEnumDhcp(ret, &t);
  6725. FreeRpcEnumDhcp(&t);
  6726. return ret;
  6727. }
  6728. // NAT table enumeration directive
  6729. PACK *SiCalledEnumNat(SERVER *s, PACK *p)
  6730. {
  6731. char hubname[MAX_HUBNAME_LEN + 1];
  6732. RPC_ENUM_NAT t;
  6733. PACK *ret;
  6734. HUB *h;
  6735. // Validate arguments
  6736. if (s == NULL || p == NULL)
  6737. {
  6738. return NewPack();
  6739. }
  6740. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6741. {
  6742. return NewPack();
  6743. }
  6744. Zero(&t, sizeof(t));
  6745. LockHubList(s->Cedar);
  6746. {
  6747. h = GetHub(s->Cedar, hubname);
  6748. }
  6749. UnlockHubList(s->Cedar);
  6750. if (h != NULL)
  6751. {
  6752. Lock(h->lock_online);
  6753. {
  6754. if (h->SecureNAT != NULL)
  6755. {
  6756. NtEnumNatList(h->SecureNAT->Nat, &t);
  6757. }
  6758. }
  6759. Unlock(h->lock_online);
  6760. }
  6761. ReleaseHub(h);
  6762. ret = NewPack();
  6763. OutRpcEnumNat(ret, &t);
  6764. FreeRpcEnumNat(&t);
  6765. return ret;
  6766. }
  6767. // Receive a session enumeration directive
  6768. PACK *SiCalledEnumSession(SERVER *s, PACK *p)
  6769. {
  6770. char hubname[MAX_HUBNAME_LEN + 1];
  6771. RPC_ENUM_SESSION t;
  6772. PACK *ret;
  6773. // Validate arguments
  6774. if (s == NULL || p == NULL)
  6775. {
  6776. return NewPack();
  6777. }
  6778. if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
  6779. {
  6780. return NewPack();
  6781. }
  6782. Zero(&t, sizeof(t));
  6783. SiEnumLocalSession(s, hubname, &t);
  6784. ret = NewPack();
  6785. OutRpcEnumSession(ret, &t);
  6786. FreeRpcEnumSession(&t);
  6787. return ret;
  6788. }
  6789. // Receive a ticket creation directive
  6790. PACK *SiCalledCreateTicket(SERVER *s, PACK *p)
  6791. {
  6792. char username[MAX_SIZE];
  6793. char hubname[MAX_SIZE];
  6794. char groupname[MAX_SIZE];
  6795. char realusername[MAX_SIZE];
  6796. char sessionname[MAX_SESSION_NAME_LEN + 1];
  6797. POLICY policy;
  6798. UCHAR ticket[SHA1_SIZE];
  6799. char ticket_str[MAX_SIZE];
  6800. HUB *h;
  6801. UINT i;
  6802. PACK *ret;
  6803. TICKET *t;
  6804. // Validate arguments
  6805. if (s == NULL || p == NULL)
  6806. {
  6807. return NewPack();
  6808. }
  6809. PackGetStr(p, "UserName", username, sizeof(username));
  6810. PackGetStr(p, "GroupName", groupname, sizeof(groupname));
  6811. PackGetStr(p, "HubName", hubname, sizeof(hubname));
  6812. PackGetStr(p, "RealUserName", realusername, sizeof(realusername));
  6813. PackGetStr(p, "SessionName", sessionname, sizeof(sessionname));
  6814. InRpcPolicy(&policy, p);
  6815. if (PackGetDataSize(p, "Ticket") == SHA1_SIZE)
  6816. {
  6817. PackGetData(p, "Ticket", ticket);
  6818. }
  6819. BinToStr(ticket_str, sizeof(ticket_str), ticket, SHA1_SIZE);
  6820. SLog(s->Cedar, "LS_TICKET_2", hubname, username, realusername, sessionname,
  6821. ticket_str, TICKET_EXPIRES / 1000);
  6822. // Get the HUB
  6823. h = GetHub(s->Cedar, hubname);
  6824. if (h == NULL)
  6825. {
  6826. return NewPack();
  6827. }
  6828. LockList(h->TicketList);
  6829. {
  6830. LIST *o = NewListFast(NULL);
  6831. // Discard old tickets
  6832. for (i = 0;i < LIST_NUM(h->TicketList);i++)
  6833. {
  6834. TICKET *t = LIST_DATA(h->TicketList, i);
  6835. if ((t->CreatedTick + TICKET_EXPIRES) < Tick64())
  6836. {
  6837. Add(o, t);
  6838. }
  6839. }
  6840. for (i = 0;i < LIST_NUM(o);i++)
  6841. {
  6842. TICKET *t = LIST_DATA(o, i);
  6843. Delete(h->TicketList, t);
  6844. Free(t);
  6845. }
  6846. ReleaseList(o);
  6847. // Create a ticket
  6848. t = ZeroMalloc(sizeof(TICKET));
  6849. t->CreatedTick = Tick64();
  6850. Copy(&t->Policy, &policy, sizeof(POLICY));
  6851. Copy(t->Ticket, ticket, SHA1_SIZE);
  6852. StrCpy(t->Username, sizeof(t->Username), username);
  6853. StrCpy(t->UsernameReal, sizeof(t->UsernameReal), realusername);
  6854. StrCpy(t->GroupName, sizeof(t->GroupName), groupname);
  6855. StrCpy(t->SessionName, sizeof(t->SessionName), sessionname);
  6856. Add(h->TicketList, t);
  6857. }
  6858. UnlockList(h->TicketList);
  6859. ReleaseHub(h);
  6860. ret = NewPack();
  6861. PackAddInt(ret, "Point", SiGetPoint(s));
  6862. return ret;
  6863. }
  6864. // Receive a HUB creation directive
  6865. void SiCalledCreateHub(SERVER *s, PACK *p)
  6866. {
  6867. char name[MAX_SIZE];
  6868. UINT type;
  6869. HUB_OPTION o;
  6870. HUB_LOG log;
  6871. bool save_packet_log;
  6872. UINT packet_log_switch_type;
  6873. UINT packet_log_config[NUM_PACKET_LOG];
  6874. bool save_security_log;
  6875. UINT security_log_switch_type;
  6876. UINT i;
  6877. HUB *h;
  6878. // Validate arguments
  6879. if (s == NULL || p == NULL)
  6880. {
  6881. return;
  6882. }
  6883. PackGetStr(p, "HubName", name, sizeof(name));
  6884. type = PackGetInt(p, "HubType");
  6885. Zero(&o, sizeof(o));
  6886. o.MaxSession = PackGetInt(p, "MaxSession");
  6887. save_packet_log = PackGetInt(p, "SavePacketLog");
  6888. packet_log_switch_type = PackGetInt(p, "PacketLogSwitchType");
  6889. for (i = 0;i < NUM_PACKET_LOG;i++)
  6890. {
  6891. packet_log_config[i] = PackGetIntEx(p, "PacketLogConfig", i);
  6892. }
  6893. save_security_log = PackGetInt(p, "SaveSecurityLog");
  6894. security_log_switch_type = PackGetInt(p, "SecurityLogSwitchType");
  6895. Zero(&log, sizeof(log));
  6896. log.SavePacketLog = save_packet_log;
  6897. log.PacketLogSwitchType = packet_log_switch_type;
  6898. Copy(log.PacketLogConfig, packet_log_config, sizeof(log.PacketLogConfig));
  6899. log.SaveSecurityLog = save_security_log;
  6900. log.SecurityLogSwitchType = security_log_switch_type;
  6901. h = NewHub(s->Cedar, name, &o);
  6902. h->LastCommTime = h->LastLoginTime = h->CreatedTime = 0;
  6903. SetHubLogSetting(h, &log);
  6904. h->Type = type;
  6905. h->FarmMember_MaxSessionClient = PackGetInt(p, "MaxSessionClient");
  6906. h->FarmMember_MaxSessionBridge = PackGetInt(p, "MaxSessionBridge");
  6907. h->FarmMember_MaxSessionClientBridgeApply = PackGetBool(p, "MaxSessionClientBridgeApply");
  6908. if (h->FarmMember_MaxSessionClientBridgeApply == false)
  6909. {
  6910. h->FarmMember_MaxSessionClient = INFINITE;
  6911. h->FarmMember_MaxSessionBridge = INFINITE;
  6912. }
  6913. PackGetData2(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
  6914. PackGetData2(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
  6915. for (i = 0;i < SiNumAccessFromPack(p);i++)
  6916. {
  6917. ACCESS *a = SiPackToAccess(p, i);
  6918. AddAccessList(h, a);
  6919. Free(a);
  6920. }
  6921. if (PackGetBool(p, "EnableSecureNAT"))
  6922. {
  6923. VH_OPTION t;
  6924. InVhOption(&t, p);
  6925. Copy(h->SecureNATOption, &t, sizeof(VH_OPTION));
  6926. EnableSecureNAT(h, true);
  6927. Debug("SiCalledCreateHub: SecureNAT Created.\n");
  6928. }
  6929. AddHub(s->Cedar, h);
  6930. h->Offline = true;
  6931. SetHubOnline(h);
  6932. ReleaseHub(h);
  6933. }
  6934. // Farm control thread
  6935. void SiFarmControlThread(THREAD *thread, void *param)
  6936. {
  6937. SERVER *s;
  6938. CEDAR *c;
  6939. EVENT *e;
  6940. LIST *o;
  6941. UINT i;
  6942. char tmp[MAX_PATH];
  6943. // Validate arguments
  6944. if (thread == NULL || param == NULL)
  6945. {
  6946. return;
  6947. }
  6948. s = (SERVER *)param;
  6949. c = s->Cedar;
  6950. e = s->FarmControlThreadHaltEvent;
  6951. while (true)
  6952. {
  6953. Lock(c->CedarSuperLock);
  6954. // Enumerate HUB list which is hosted by each farm member
  6955. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  6956. SiDebugLog(s, tmp);
  6957. LockList(s->FarmMemberList);
  6958. {
  6959. UINT i;
  6960. UINT num;
  6961. UINT assigned_client_license = 0;
  6962. UINT assigned_bridge_license = 0;
  6963. LIST *fm_list = NewListFast(NULL);
  6964. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  6965. SiDebugLog(s, tmp);
  6966. num = 0;
  6967. while (true)
  6968. {
  6969. bool escape = true;
  6970. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  6971. {
  6972. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6973. if (IsInList(fm_list, f) == false)
  6974. {
  6975. SiCallEnumHub(s, f);
  6976. // Get the total number of sessions across the server farm
  6977. num += f->NumSessions;
  6978. assigned_client_license += f->AssignedClientLicense;
  6979. assigned_bridge_license += f->AssignedBridgeLicense;
  6980. escape = false;
  6981. Add(fm_list, f);
  6982. break;
  6983. }
  6984. }
  6985. if (escape)
  6986. {
  6987. break;
  6988. }
  6989. UnlockList(s->FarmMemberList);
  6990. LockList(s->FarmMemberList);
  6991. }
  6992. ReleaseList(fm_list);
  6993. s->CurrentTotalNumSessionsOnFarm = num;
  6994. // Update the number of assigned licenses
  6995. s->CurrentAssignedBridgeLicense = assigned_bridge_license;
  6996. s->CurrentAssignedClientLicense = assigned_client_license;
  6997. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  6998. SiDebugLog(s, tmp);
  6999. }
  7000. UnlockList(s->FarmMemberList);
  7001. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  7002. SiDebugLog(s, tmp);
  7003. o = NewListFast(NULL);
  7004. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  7005. SiDebugLog(s, tmp);
  7006. // Emit an update notification for each HUB
  7007. LockList(c->HubList);
  7008. {
  7009. UINT i;
  7010. for (i = 0;i < LIST_NUM(c->HubList);i++)
  7011. {
  7012. HUB *h = LIST_DATA(c->HubList, i);
  7013. AddRef(h->ref);
  7014. Add(o, h);
  7015. }
  7016. }
  7017. UnlockList(c->HubList);
  7018. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  7019. SiDebugLog(s, tmp);
  7020. for (i = 0;i < LIST_NUM(o);i++)
  7021. {
  7022. HUB *h = LIST_DATA(o, i);
  7023. SiHubUpdateProc(h);
  7024. ReleaseHub(h);
  7025. }
  7026. Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
  7027. SiDebugLog(s, tmp);
  7028. ReleaseList(o);
  7029. Unlock(c->CedarSuperLock);
  7030. Wait(e, SERVER_FARM_CONTROL_INTERVAL);
  7031. if (s->Halt)
  7032. {
  7033. break;
  7034. }
  7035. }
  7036. }
  7037. // Start the farm controling
  7038. void SiStartFarmControl(SERVER *s)
  7039. {
  7040. // Validate arguments
  7041. if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7042. {
  7043. return;
  7044. }
  7045. s->FarmControlThreadHaltEvent = NewEvent();
  7046. s->FarmControlThread = NewThread(SiFarmControlThread, s);
  7047. }
  7048. // Stop the farm controling
  7049. void SiStopFarmControl(SERVER *s)
  7050. {
  7051. // Validate arguments
  7052. if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7053. {
  7054. return;
  7055. }
  7056. Set(s->FarmControlThreadHaltEvent);
  7057. WaitThread(s->FarmControlThread, INFINITE);
  7058. ReleaseEvent(s->FarmControlThreadHaltEvent);
  7059. ReleaseThread(s->FarmControlThread);
  7060. }
  7061. // HUB enumeration directive (asynchronous start)
  7062. void SiCallEnumHubBegin(SERVER *s, FARM_MEMBER *f)
  7063. {
  7064. // Validate arguments
  7065. if (s == NULL || f == NULL)
  7066. {
  7067. return;
  7068. }
  7069. }
  7070. // HUB enumeration directive (asynchronous end)
  7071. void SiCallEnumHubEnd(SERVER *s, FARM_MEMBER *f)
  7072. {
  7073. // Validate arguments
  7074. if (s == NULL || f == NULL)
  7075. {
  7076. return;
  7077. }
  7078. }
  7079. // HUB enumeration directive
  7080. void SiCallEnumHub(SERVER *s, FARM_MEMBER *f)
  7081. {
  7082. CEDAR *c;
  7083. // Validate arguments
  7084. if (s == NULL || f == NULL)
  7085. {
  7086. return;
  7087. }
  7088. c = s->Cedar;
  7089. if (f->Me)
  7090. {
  7091. // Enumerate local HUBs
  7092. LockList(f->HubList);
  7093. {
  7094. // For a local HUB, re-enumerate by erasing all STATIC HUB list once first
  7095. UINT i;
  7096. LIST *o = NewListFast(NULL);
  7097. for (i = 0;i < LIST_NUM(f->HubList);i++)
  7098. {
  7099. HUB_LIST *h = LIST_DATA(f->HubList, i);
  7100. if (h->DynamicHub == false)
  7101. {
  7102. Add(o, h);
  7103. }
  7104. }
  7105. // Clear all the STATIC HUB
  7106. for (i = 0;i < LIST_NUM(o);i++)
  7107. {
  7108. HUB_LIST *h = LIST_DATA(o, i);
  7109. Free(h);
  7110. Delete(f->HubList, h);
  7111. }
  7112. ReleaseList(o);
  7113. // Second, stop DYNAMIC HUBs without user
  7114. o = NewListFast(NULL);
  7115. for (i = 0;i < LIST_NUM(f->HubList);i++)
  7116. {
  7117. HUB_LIST *h = LIST_DATA(f->HubList, i);
  7118. if (h->DynamicHub == true)
  7119. {
  7120. LockList(c->HubList);
  7121. {
  7122. HUB *hub = GetHub(s->Cedar, h->Name);
  7123. if (hub != NULL)
  7124. {
  7125. if (Count(hub->NumSessions) == 0 || hub->Type != HUB_TYPE_FARM_DYNAMIC)
  7126. {
  7127. Add(o, h);
  7128. }
  7129. ReleaseHub(hub);
  7130. }
  7131. }
  7132. UnlockList(c->HubList);
  7133. }
  7134. }
  7135. for (i = 0;i < LIST_NUM(o);i++)
  7136. {
  7137. HUB_LIST *h = LIST_DATA(o, i);
  7138. Debug("Delete HUB: %s\n", h->Name);
  7139. Free(h);
  7140. Delete(f->HubList, h);
  7141. }
  7142. ReleaseList(o);
  7143. // Set the enumeration results
  7144. LockList(c->HubList);
  7145. {
  7146. for (i = 0;i < LIST_NUM(c->HubList);i++)
  7147. {
  7148. HUB *h = LIST_DATA(c->HubList, i);
  7149. if (h->Offline == false)
  7150. {
  7151. if (h->Type == HUB_TYPE_FARM_STATIC)
  7152. {
  7153. HUB_LIST *hh = ZeroMalloc(sizeof(HUB_LIST));
  7154. hh->FarmMember = f;
  7155. hh->DynamicHub = false;
  7156. StrCpy(hh->Name, sizeof(hh->Name), h->Name);
  7157. Add(f->HubList, hh);
  7158. LockList(h->SessionList);
  7159. {
  7160. hh->NumSessions = LIST_NUM(h->SessionList);
  7161. hh->NumSessionsBridge = Count(h->NumSessionsBridge);
  7162. hh->NumSessionsClient = Count(h->NumSessionsClient);
  7163. }
  7164. UnlockList(h->SessionList);
  7165. LockHashList(h->MacHashTable);
  7166. {
  7167. hh->NumMacTables = HASH_LIST_NUM(h->MacHashTable);
  7168. }
  7169. UnlockHashList(h->MacHashTable);
  7170. LockList(h->IpTable);
  7171. {
  7172. hh->NumIpTables = LIST_NUM(h->IpTable);
  7173. }
  7174. UnlockList(h->IpTable);
  7175. }
  7176. }
  7177. }
  7178. }
  7179. UnlockList(c->HubList);
  7180. }
  7181. UnlockList(f->HubList);
  7182. // Point
  7183. f->Point = SiGetPoint(s);
  7184. f->NumSessions = Count(s->Cedar->CurrentSessions);
  7185. f->MaxSessions = GetServerCapsInt(s, "i_max_sessions");
  7186. f->NumTcpConnections = Count(s->Cedar->CurrentTcpConnections);
  7187. Lock(s->Cedar->TrafficLock);
  7188. {
  7189. Copy(&f->Traffic, s->Cedar->Traffic, sizeof(TRAFFIC));
  7190. }
  7191. Unlock(s->Cedar->TrafficLock);
  7192. f->AssignedBridgeLicense = Count(s->Cedar->AssignedBridgeLicense);
  7193. f->AssignedClientLicense = Count(s->Cedar->AssignedClientLicense);
  7194. Copy(f->RandomKey, s->MyRandomKey, SHA1_SIZE);
  7195. Debug("Server %s: Point %u\n", f->hostname, f->Point);
  7196. }
  7197. else
  7198. {
  7199. // Enumerate HUBs which are remote member
  7200. PACK *p = NewPack();
  7201. UINT i, num, j;
  7202. LIST *o = NewListFast(NULL);
  7203. num = 0;
  7204. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  7205. {
  7206. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7207. if (IsZero(f->RandomKey, SHA1_SIZE) == false && f->SystemId != 0)
  7208. {
  7209. num++;
  7210. }
  7211. }
  7212. j = 0;
  7213. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  7214. {
  7215. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7216. if (IsZero(f->RandomKey, SHA1_SIZE) == false && f->SystemId != 0)
  7217. {
  7218. PackAddDataEx(p, "MemberRandomKey", f->RandomKey, SHA1_SIZE, j, num);
  7219. PackAddInt64Ex(p, "MemberSystemId", f->SystemId, j, num);
  7220. j++;
  7221. }
  7222. }
  7223. PackAddInt(p, "MemberSystemIdNum", num);
  7224. p = SiCallTask(f, p, "enumhub");
  7225. if (p != NULL)
  7226. {
  7227. LockList(f->HubList);
  7228. {
  7229. UINT i;
  7230. // Erase the list
  7231. for (i = 0;i < LIST_NUM(f->HubList);i++)
  7232. {
  7233. HUB_LIST *hh = LIST_DATA(f->HubList, i);
  7234. Free(hh);
  7235. }
  7236. DeleteAll(f->HubList);
  7237. for (i = 0;i < PackGetIndexCount(p, "HubName");i++)
  7238. {
  7239. HUB_LIST *hh = ZeroMalloc(sizeof(HUB_LIST));
  7240. UINT num;
  7241. UINT64 LastCommTime;
  7242. PackGetStrEx(p, "HubName", hh->Name, sizeof(hh->Name), i);
  7243. num = PackGetIntEx(p, "NumSession", i);
  7244. hh->DynamicHub = ((PackGetIntEx(p, "HubType", i) == HUB_TYPE_FARM_DYNAMIC) ? true : false);
  7245. hh->FarmMember = f;
  7246. hh->NumSessions = PackGetIntEx(p, "NumSessions", i);
  7247. hh->NumSessionsClient = PackGetIntEx(p, "NumSessionsClient", i);
  7248. hh->NumSessionsBridge = PackGetIntEx(p, "NumSessionsBridge", i);
  7249. hh->NumIpTables = PackGetIntEx(p, "NumIpTables", i);
  7250. hh->NumMacTables = PackGetIntEx(p, "NumMacTables", i);
  7251. LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
  7252. Add(f->HubList, hh);
  7253. //Debug("%s\n", hh->Name);
  7254. LockList(c->HubList);
  7255. {
  7256. HUB *h = GetHub(c, hh->Name);
  7257. if (h != NULL)
  7258. {
  7259. // Update the LastCommTime of the Virtual HUB
  7260. Lock(h->lock);
  7261. {
  7262. if (h->LastCommTime < LastCommTime)
  7263. {
  7264. h->LastCommTime = LastCommTime;
  7265. }
  7266. }
  7267. Unlock(h->lock);
  7268. ReleaseHub(h);
  7269. }
  7270. }
  7271. UnlockList(c->HubList);
  7272. if (hh->DynamicHub && num >= 1)
  7273. {
  7274. // It is not necessary to be registered in the virtual HUB creation
  7275. // history list because user session is already connected.
  7276. // Remove from the Virtual HUB creation history list
  7277. SiDelHubCreateHistory(s, hh->Name);
  7278. }
  7279. if (hh->DynamicHub && num == 0)
  7280. {
  7281. // Check the Virtual HUB creation history list.
  7282. // If it is created within 60 seconds of the most recent
  7283. // in the case of Virtual HUB which the first user is not
  7284. // connected yet, not to remove because there is no user
  7285. if (SiIsHubRegistedOnCreateHistory(s, hh->Name) == false)
  7286. {
  7287. // Stop because all uses have gone in the dynamic HUB
  7288. HUB *h;
  7289. LockList(c->HubList);
  7290. {
  7291. h = GetHub(c, hh->Name);
  7292. }
  7293. UnlockList(c->HubList);
  7294. if (h != NULL)
  7295. {
  7296. Add(o, h);
  7297. }
  7298. }
  7299. }
  7300. }
  7301. }
  7302. UnlockList(f->HubList);
  7303. f->Point = PackGetInt(p, "Point");
  7304. Debug("Server %s: Point %u\n", f->hostname, f->Point);
  7305. f->NumSessions = PackGetInt(p, "NumTotalSessions");
  7306. if (f->NumSessions == 0)
  7307. {
  7308. f->NumSessions = PackGetInt(p, "NumSessions");
  7309. }
  7310. f->MaxSessions = PackGetInt(p, "MaxSessions");
  7311. f->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
  7312. InRpcTraffic(&f->Traffic, p);
  7313. f->AssignedBridgeLicense = PackGetInt(p, "AssignedBridgeLicense");
  7314. f->AssignedClientLicense = PackGetInt(p, "AssignedClientLicense");
  7315. if (PackGetDataSize(p, "RandomKey") == SHA1_SIZE)
  7316. {
  7317. PackGetData(p, "RandomKey", f->RandomKey);
  7318. }
  7319. f->SystemId = PackGetInt64(p, "SystemId");
  7320. // Apply the traffic difference information
  7321. num = PackGetIndexCount(p, "TdType");
  7322. for (i = 0;i < num;i++)
  7323. {
  7324. TRAFFIC traffic;
  7325. UINT type;
  7326. HUB *h;
  7327. char name[MAX_SIZE];
  7328. char hubname[MAX_SIZE];
  7329. type = PackGetIntEx(p, "TdType", i);
  7330. PackGetStrEx(p, "TdName", name, sizeof(name), i);
  7331. PackGetStrEx(p, "TdHubName", hubname, sizeof(hubname), i);
  7332. InRpcTrafficEx(&traffic, p, i);
  7333. LockList(c->HubList);
  7334. {
  7335. h = GetHub(c, hubname);
  7336. if (h != NULL)
  7337. {
  7338. if (type == TRAFFIC_DIFF_HUB)
  7339. {
  7340. Lock(h->TrafficLock);
  7341. {
  7342. AddTraffic(h->Traffic, &traffic);
  7343. }
  7344. Unlock(h->TrafficLock);
  7345. }
  7346. else
  7347. {
  7348. AcLock(h);
  7349. {
  7350. USER *u = AcGetUser(h, name);
  7351. if (u != NULL)
  7352. {
  7353. Lock(u->lock);
  7354. {
  7355. AddTraffic(u->Traffic, &traffic);
  7356. }
  7357. Unlock(u->lock);
  7358. if (u->Group != NULL)
  7359. {
  7360. Lock(u->Group->lock);
  7361. {
  7362. AddTraffic(u->Group->Traffic, &traffic);
  7363. }
  7364. Unlock(u->Group->lock);
  7365. }
  7366. ReleaseUser(u);
  7367. }
  7368. }
  7369. AcUnlock(h);
  7370. }
  7371. ReleaseHub(h);
  7372. }
  7373. UnlockList(c->HubList);
  7374. }
  7375. }
  7376. FreePack(p);
  7377. }
  7378. for (i = 0;i < LIST_NUM(o);i++)
  7379. {
  7380. HUB *h = LIST_DATA(o, i);
  7381. SiCallDeleteHub(s, f, h);
  7382. Debug("Delete HUB: %s\n", h->Name);
  7383. ReleaseHub(h);
  7384. }
  7385. ReleaseList(o);
  7386. }
  7387. }
  7388. // Send a session information directive
  7389. bool SiCallGetSessionStatus(SERVER *s, FARM_MEMBER *f, RPC_SESSION_STATUS *t)
  7390. {
  7391. PACK *p;
  7392. // Validate arguments
  7393. if (s == NULL || f == NULL)
  7394. {
  7395. return false;
  7396. }
  7397. p = NewPack();
  7398. OutRpcSessionStatus(p, t);
  7399. FreeRpcSessionStatus(t);
  7400. Zero(t, sizeof(RPC_SESSION_STATUS));
  7401. p = SiCallTask(f, p, "getsessionstatus");
  7402. if (p == NULL)
  7403. {
  7404. return false;
  7405. }
  7406. InRpcSessionStatus(t, p);
  7407. FreePack(p);
  7408. return true;
  7409. }
  7410. // Log file reading directive
  7411. bool SiCallReadLogFile(SERVER *s, FARM_MEMBER *f, RPC_READ_LOG_FILE *t)
  7412. {
  7413. PACK *p;
  7414. // Validate arguments
  7415. if (s == NULL || f == NULL)
  7416. {
  7417. return false;
  7418. }
  7419. p = NewPack();
  7420. OutRpcReadLogFile(p, t);
  7421. FreeRpcReadLogFile(t);
  7422. Zero(t, sizeof(RPC_READ_LOG_FILE));
  7423. p = SiCallTask(f, p, "readlogfile");
  7424. if (p == NULL)
  7425. {
  7426. return false;
  7427. }
  7428. InRpcReadLogFile(t, p);
  7429. FreePack(p);
  7430. return true;
  7431. }
  7432. // Log file enumeration directive
  7433. bool SiCallEnumLogFileList(SERVER *s, FARM_MEMBER *f, RPC_ENUM_LOG_FILE *t, char *hubname)
  7434. {
  7435. PACK *p;
  7436. // Validate arguments
  7437. if (s == NULL || f == NULL)
  7438. {
  7439. return false;
  7440. }
  7441. p = NewPack();
  7442. OutRpcEnumLogFile(p, t);
  7443. FreeRpcEnumLogFile(t);
  7444. Zero(t, sizeof(RPC_ENUM_LOG_FILE));
  7445. PackAddStr(p, "HubName", hubname);
  7446. p = SiCallTask(f, p, "enumlogfilelist");
  7447. if (p == NULL)
  7448. {
  7449. return false;
  7450. }
  7451. InRpcEnumLogFile(t, p);
  7452. FreePack(p);
  7453. return true;
  7454. }
  7455. // HUB delete directive
  7456. void SiCallDeleteHub(SERVER *s, FARM_MEMBER *f, HUB *h)
  7457. {
  7458. PACK *p;
  7459. UINT i;
  7460. // Validate arguments
  7461. if (s == NULL || f == NULL)
  7462. {
  7463. return;
  7464. }
  7465. if (f->Me == false)
  7466. {
  7467. p = NewPack();
  7468. PackAddStr(p, "HubName", h->Name);
  7469. p = SiCallTask(f, p, "deletehub");
  7470. FreePack(p);
  7471. }
  7472. LockList(f->HubList);
  7473. {
  7474. for (i = 0;i < LIST_NUM(f->HubList);i++)
  7475. {
  7476. HUB_LIST *hh = LIST_DATA(f->HubList, i);
  7477. if (StrCmpi(hh->Name, h->Name) == 0)
  7478. {
  7479. Free(hh);
  7480. Delete(f->HubList, hh);
  7481. }
  7482. }
  7483. }
  7484. UnlockList(f->HubList);
  7485. }
  7486. // Submit a HUB update directive
  7487. void SiCallUpdateHub(SERVER *s, FARM_MEMBER *f, HUB *h)
  7488. {
  7489. PACK *p;
  7490. // Validate arguments
  7491. if (s == NULL || f == NULL)
  7492. {
  7493. return;
  7494. }
  7495. if (f->Me == false)
  7496. {
  7497. p = NewPack();
  7498. SiPackAddCreateHub(p, h);
  7499. p = SiCallTask(f, p, "updatehub");
  7500. FreePack(p);
  7501. }
  7502. }
  7503. // Send a ticket creation directive
  7504. void SiCallCreateTicket(SERVER *s, FARM_MEMBER *f, char *hubname, char *username, char *realusername, POLICY *policy, UCHAR *ticket, UINT counter, char *groupname)
  7505. {
  7506. PACK *p;
  7507. char name[MAX_SESSION_NAME_LEN + 1];
  7508. char hub_name_upper[MAX_SIZE];
  7509. char user_name_upper[MAX_USERNAME_LEN + 1];
  7510. char ticket_str[MAX_SIZE];
  7511. UINT point;
  7512. // Validate arguments
  7513. if (s == NULL || f == NULL || realusername == NULL || hubname == NULL || username == NULL || policy == NULL || ticket == NULL)
  7514. {
  7515. return;
  7516. }
  7517. if (groupname == NULL)
  7518. {
  7519. groupname = "";
  7520. }
  7521. p = NewPack();
  7522. PackAddStr(p, "HubName", hubname);
  7523. PackAddStr(p, "UserName", username);
  7524. PackAddStr(p, "groupname", groupname);
  7525. PackAddStr(p, "RealUserName", realusername);
  7526. OutRpcPolicy(p, policy);
  7527. PackAddData(p, "Ticket", ticket, SHA1_SIZE);
  7528. BinToStr(ticket_str, sizeof(ticket_str), ticket, SHA1_SIZE);
  7529. StrCpy(hub_name_upper, sizeof(hub_name_upper), hubname);
  7530. StrUpper(hub_name_upper);
  7531. StrCpy(user_name_upper, sizeof(user_name_upper), username);
  7532. StrUpper(user_name_upper);
  7533. Format(name, sizeof(name), "SID-%s-%u", user_name_upper,
  7534. counter);
  7535. PackAddStr(p, "SessionName", name);
  7536. p = SiCallTask(f, p, "createticket");
  7537. SLog(s->Cedar, "LS_TICKET_1", f->hostname, hubname, username, realusername, name, ticket_str);
  7538. point = PackGetInt(p, "Point");
  7539. if (point != 0)
  7540. {
  7541. f->Point = point;
  7542. f->NumSessions++;
  7543. }
  7544. FreePack(p);
  7545. }
  7546. // Send a MAC address deletion directive
  7547. void SiCallDeleteMacTable(SERVER *s, FARM_MEMBER *f, char *hubname, UINT key)
  7548. {
  7549. PACK *p;
  7550. // Validate arguments
  7551. if (s == NULL || f == NULL || hubname == NULL)
  7552. {
  7553. return;
  7554. }
  7555. p = NewPack();
  7556. PackAddStr(p, "HubName", hubname);
  7557. PackAddInt(p, "Key", key);
  7558. p = SiCallTask(f, p, "deletemactable");
  7559. FreePack(p);
  7560. }
  7561. // Send an IP address delete directive
  7562. void SiCallDeleteIpTable(SERVER *s, FARM_MEMBER *f, char *hubname, UINT key)
  7563. {
  7564. PACK *p;
  7565. // Validate arguments
  7566. if (s == NULL || f == NULL || hubname == NULL)
  7567. {
  7568. return;
  7569. }
  7570. p = NewPack();
  7571. PackAddStr(p, "HubName", hubname);
  7572. PackAddInt(p, "Key", key);
  7573. p = SiCallTask(f, p, "deleteiptable");
  7574. FreePack(p);
  7575. }
  7576. // Send a session deletion directive
  7577. void SiCallDeleteSession(SERVER *s, FARM_MEMBER *f, char *hubname, char *session_name)
  7578. {
  7579. PACK *p;
  7580. // Validate arguments
  7581. if (s == NULL || f == NULL || hubname == NULL || session_name == NULL)
  7582. {
  7583. return;
  7584. }
  7585. p = NewPack();
  7586. PackAddStr(p, "HubName", hubname);
  7587. PackAddStr(p, "SessionName", session_name);
  7588. p = SiCallTask(f, p, "deletesession");
  7589. FreePack(p);
  7590. }
  7591. // Send an IP table enumeration directive
  7592. void SiCallEnumIpTable(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_IP_TABLE *t)
  7593. {
  7594. PACK *p;
  7595. UINT i;
  7596. // Validate arguments
  7597. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7598. {
  7599. return;
  7600. }
  7601. p = NewPack();
  7602. PackAddStr(p, "HubName", hubname);
  7603. p = SiCallTask(f, p, "enumiptable");
  7604. Zero(t, sizeof(RPC_ENUM_IP_TABLE));
  7605. InRpcEnumIpTable(t, p);
  7606. for (i = 0;i < t->NumIpTable;i++)
  7607. {
  7608. t->IpTables[i].RemoteItem = true;
  7609. StrCpy(t->IpTables[i].RemoteHostname, sizeof(t->IpTables[i].RemoteHostname),
  7610. f->hostname);
  7611. }
  7612. FreePack(p);
  7613. }
  7614. // Submit a MAC table enumeration directive
  7615. void SiCallEnumMacTable(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_MAC_TABLE *t)
  7616. {
  7617. PACK *p;
  7618. UINT i;
  7619. // Validate arguments
  7620. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7621. {
  7622. return;
  7623. }
  7624. p = NewPack();
  7625. PackAddStr(p, "HubName", hubname);
  7626. p = SiCallTask(f, p, "enummactable");
  7627. Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
  7628. InRpcEnumMacTable(t, p);
  7629. for (i = 0;i < t->NumMacTable;i++)
  7630. {
  7631. t->MacTables[i].RemoteItem = true;
  7632. StrCpy(t->MacTables[i].RemoteHostname, sizeof(t->MacTables[i].RemoteHostname),
  7633. f->hostname);
  7634. }
  7635. FreePack(p);
  7636. }
  7637. // Send a SecureNAT status acquisition directive
  7638. void SiCallGetNatStatus(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_NAT_STATUS *t)
  7639. {
  7640. PACK *p;
  7641. // Validate arguments
  7642. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7643. {
  7644. return;
  7645. }
  7646. p = NewPack();
  7647. PackAddStr(p, "HubName", hubname);
  7648. p = SiCallTask(f, p, "getnatstatus");
  7649. Zero(t, sizeof(RPC_NAT_STATUS));
  7650. InRpcNatStatus(t, p);
  7651. FreePack(p);
  7652. }
  7653. // Submit a DHCP entry enumeration directive
  7654. void SiCallEnumDhcp(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_DHCP *t)
  7655. {
  7656. PACK *p;
  7657. // Validate arguments
  7658. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7659. {
  7660. return;
  7661. }
  7662. p = NewPack();
  7663. PackAddStr(p, "HubName", hubname);
  7664. p = SiCallTask(f, p, "enumdhcp");
  7665. Zero(t, sizeof(RPC_ENUM_DHCP));
  7666. InRpcEnumDhcp(t, p);
  7667. FreePack(p);
  7668. }
  7669. // Submit a NAT entry enumeration directive
  7670. void SiCallEnumNat(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_NAT *t)
  7671. {
  7672. PACK *p;
  7673. // Validate arguments
  7674. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7675. {
  7676. return;
  7677. }
  7678. p = NewPack();
  7679. PackAddStr(p, "HubName", hubname);
  7680. p = SiCallTask(f, p, "enumnat");
  7681. Zero(t, sizeof(RPC_ENUM_NAT));
  7682. InRpcEnumNat(t, p);
  7683. FreePack(p);
  7684. }
  7685. // Send a session enumeration directive
  7686. void SiCallEnumSession(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_SESSION *t)
  7687. {
  7688. PACK *p;
  7689. UINT i;
  7690. // Validate arguments
  7691. if (s == NULL || f == NULL || hubname == NULL || t == NULL)
  7692. {
  7693. return;
  7694. }
  7695. p = NewPack();
  7696. PackAddStr(p, "HubName", hubname);
  7697. p = SiCallTask(f, p, "enumsession");
  7698. Zero(t, sizeof(RPC_ENUM_SESSION));
  7699. InRpcEnumSession(t, p);
  7700. for (i = 0;i < t->NumSession;i++)
  7701. {
  7702. t->Sessions[i].RemoteSession = true;
  7703. StrCpy(t->Sessions[i].RemoteHostname, sizeof(t->Sessions[i].RemoteHostname),
  7704. f->hostname);
  7705. }
  7706. FreePack(p);
  7707. }
  7708. // Send a HUB creation directive
  7709. void SiCallCreateHub(SERVER *s, FARM_MEMBER *f, HUB *h)
  7710. {
  7711. PACK *p;
  7712. HUB_LIST *hh;
  7713. // Validate arguments
  7714. if (s == NULL || f == NULL)
  7715. {
  7716. return;
  7717. }
  7718. if (f->Me == false)
  7719. {
  7720. p = NewPack();
  7721. SiPackAddCreateHub(p, h);
  7722. p = SiCallTask(f, p, "createhub");
  7723. FreePack(p);
  7724. }
  7725. hh = ZeroMalloc(sizeof(HUB_LIST));
  7726. hh->DynamicHub = (h->Type == HUB_TYPE_FARM_DYNAMIC ? true : false);
  7727. StrCpy(hh->Name, sizeof(hh->Name), h->Name);
  7728. hh->FarmMember = f;
  7729. LockList(f->HubList);
  7730. {
  7731. bool exists = false;
  7732. UINT i;
  7733. for (i = 0;i < LIST_NUM(f->HubList);i++)
  7734. {
  7735. HUB_LIST *t = LIST_DATA(f->HubList, i);
  7736. if (StrCmpi(t->Name, hh->Name) == 0)
  7737. {
  7738. exists = true;
  7739. }
  7740. }
  7741. if (exists == false)
  7742. {
  7743. Add(f->HubList, hh);
  7744. }
  7745. else
  7746. {
  7747. Free(hh);
  7748. }
  7749. }
  7750. UnlockList(f->HubList);
  7751. }
  7752. // Write the PACK for creating HUB
  7753. void SiPackAddCreateHub(PACK *p, HUB *h)
  7754. {
  7755. UINT i;
  7756. UINT max_session;
  7757. SERVER *s;
  7758. // Validate arguments
  7759. if (p == NULL || h == NULL)
  7760. {
  7761. return;
  7762. }
  7763. s = h->Cedar->Server;
  7764. if (s != NULL)
  7765. {
  7766. }
  7767. PackAddStr(p, "HubName", h->Name);
  7768. PackAddInt(p, "HubType", h->Type);
  7769. max_session = h->Option->MaxSession;
  7770. if (GetHubAdminOption(h, "max_sessions") != 0)
  7771. {
  7772. if (max_session == 0)
  7773. {
  7774. max_session = GetHubAdminOption(h, "max_sessions");
  7775. }
  7776. else
  7777. {
  7778. UINT r = GetHubAdminOption(h, "max_sessions");
  7779. max_session = MIN(max_session, r);
  7780. }
  7781. }
  7782. PackAddInt(p, "MaxSession", max_session);
  7783. if (GetHubAdminOption(h, "max_sessions_client_bridge_apply") != 0
  7784. )
  7785. {
  7786. PackAddInt(p, "MaxSessionClient", GetHubAdminOption(h, "max_sessions_client"));
  7787. PackAddInt(p, "MaxSessionBridge", GetHubAdminOption(h, "max_sessions_bridge"));
  7788. PackAddBool(p, "MaxSessionClientBridgeApply", true);
  7789. }
  7790. else
  7791. {
  7792. PackAddInt(p, "MaxSessionClient", INFINITE);
  7793. PackAddInt(p, "MaxSessionBridge", INFINITE);
  7794. }
  7795. PackAddBool(p, "NoArpPolling", h->Option->NoArpPolling);
  7796. PackAddBool(p, "NoIPv6AddrPolling", h->Option->NoIPv6AddrPolling);
  7797. PackAddBool(p, "NoIpTable", h->Option->NoIpTable);
  7798. PackAddBool(p, "NoEnum", h->Option->NoEnum);
  7799. PackAddBool(p, "FilterPPPoE", h->Option->FilterPPPoE);
  7800. PackAddBool(p, "YieldAfterStorePacket", h->Option->YieldAfterStorePacket);
  7801. PackAddBool(p, "NoSpinLockForPacketDelay", h->Option->NoSpinLockForPacketDelay);
  7802. PackAddInt(p, "BroadcastStormDetectionThreshold", h->Option->BroadcastStormDetectionThreshold);
  7803. PackAddInt(p, "MaxLoggedPacketsPerMinute", h->Option->MaxLoggedPacketsPerMinute);
  7804. PackAddInt(p, "FloodingSendQueueBufferQuota", h->Option->FloodingSendQueueBufferQuota);
  7805. PackAddBool(p, "DoNotSaveHeavySecurityLogs", h->Option->DoNotSaveHeavySecurityLogs);
  7806. PackAddBool(p, "DropBroadcastsInPrivacyFilterMode", h->Option->DropBroadcastsInPrivacyFilterMode);
  7807. PackAddBool(p, "DropArpInPrivacyFilterMode", h->Option->DropArpInPrivacyFilterMode);
  7808. PackAddBool(p, "SuppressClientUpdateNotification", h->Option->SuppressClientUpdateNotification);
  7809. PackAddBool(p, "AssignVLanIdByRadiusAttribute", h->Option->AssignVLanIdByRadiusAttribute);
  7810. PackAddInt(p, "ClientMinimumRequiredBuild", h->Option->ClientMinimumRequiredBuild);
  7811. PackAddBool(p, "SecureNAT_RandomizeAssignIp", h->Option->SecureNAT_RandomizeAssignIp);
  7812. PackAddBool(p, "NoPhysicalIPOnPacketLog", h->Option->NoPhysicalIPOnPacketLog);
  7813. PackAddInt(p, "DetectDormantSessionInterval", h->Option->DetectDormantSessionInterval);
  7814. PackAddBool(p, "FixForDLinkBPDU", h->Option->FixForDLinkBPDU);
  7815. PackAddBool(p, "BroadcastLimiterStrictMode", h->Option->BroadcastLimiterStrictMode);
  7816. PackAddBool(p, "NoLookBPDUBridgeId", h->Option->NoLookBPDUBridgeId);
  7817. PackAddBool(p, "NoManageVlanId", h->Option->NoManageVlanId);
  7818. PackAddInt(p, "VlanTypeId", h->Option->VlanTypeId);
  7819. PackAddBool(p, "FilterOSPF", h->Option->FilterOSPF);
  7820. PackAddBool(p, "FilterIPv4", h->Option->FilterIPv4);
  7821. PackAddBool(p, "FilterIPv6", h->Option->FilterIPv6);
  7822. PackAddBool(p, "FilterNonIP", h->Option->FilterNonIP);
  7823. PackAddBool(p, "NoIPv4PacketLog", h->Option->NoIPv4PacketLog);
  7824. PackAddBool(p, "NoIPv6PacketLog", h->Option->NoIPv6PacketLog);
  7825. PackAddBool(p, "FilterBPDU", h->Option->FilterBPDU);
  7826. PackAddBool(p, "NoIPv6DefaultRouterInRAWhenIPv6", h->Option->NoIPv6DefaultRouterInRAWhenIPv6);
  7827. PackAddBool(p, "NoMacAddressLog", h->Option->NoMacAddressLog);
  7828. PackAddBool(p, "ManageOnlyPrivateIP", h->Option->ManageOnlyPrivateIP);
  7829. PackAddBool(p, "ManageOnlyLocalUnicastIPv6", h->Option->ManageOnlyLocalUnicastIPv6);
  7830. PackAddBool(p, "DisableIPParsing", h->Option->DisableIPParsing);
  7831. PackAddInt(p, "AdjustTcpMssValue", h->Option->AdjustTcpMssValue);
  7832. PackAddBool(p, "DisableAdjustTcpMss", h->Option->DisableAdjustTcpMss);
  7833. PackAddBool(p, "NoDhcpPacketLogOutsideHub", h->Option->NoDhcpPacketLogOutsideHub);
  7834. PackAddBool(p, "DisableHttpParsing", h->Option->DisableHttpParsing);
  7835. PackAddBool(p, "DisableUdpAcceleration", h->Option->DisableUdpAcceleration);
  7836. PackAddBool(p, "DisableUdpFilterForLocalBridgeNic", h->Option->DisableUdpFilterForLocalBridgeNic);
  7837. PackAddBool(p, "ApplyIPv4AccessListOnArpPacket", h->Option->ApplyIPv4AccessListOnArpPacket);
  7838. PackAddBool(p, "RemoveDefGwOnDhcpForLocalhost", h->Option->RemoveDefGwOnDhcpForLocalhost);
  7839. PackAddInt(p, "SecureNAT_MaxTcpSessionsPerIp", h->Option->SecureNAT_MaxTcpSessionsPerIp);
  7840. PackAddInt(p, "SecureNAT_MaxTcpSynSentPerIp", h->Option->SecureNAT_MaxTcpSynSentPerIp);
  7841. PackAddInt(p, "SecureNAT_MaxUdpSessionsPerIp", h->Option->SecureNAT_MaxUdpSessionsPerIp);
  7842. PackAddInt(p, "SecureNAT_MaxDnsSessionsPerIp", h->Option->SecureNAT_MaxDnsSessionsPerIp);
  7843. PackAddInt(p, "SecureNAT_MaxIcmpSessionsPerIp", h->Option->SecureNAT_MaxIcmpSessionsPerIp);
  7844. PackAddInt(p, "AccessListIncludeFileCacheLifetime", h->Option->AccessListIncludeFileCacheLifetime);
  7845. PackAddBool(p, "DisableKernelModeSecureNAT", h->Option->DisableKernelModeSecureNAT);
  7846. PackAddBool(p, "DisableUserModeSecureNAT", h->Option->DisableUserModeSecureNAT);
  7847. PackAddBool(p, "DisableCheckMacOnLocalBridge", h->Option->DisableCheckMacOnLocalBridge);
  7848. PackAddBool(p, "DisableCorrectIpOffloadChecksum", h->Option->DisableCorrectIpOffloadChecksum);
  7849. PackAddInt(p, "SavePacketLog", h->LogSetting.SavePacketLog);
  7850. PackAddInt(p, "PacketLogSwitchType", h->LogSetting.PacketLogSwitchType);
  7851. for (i = 0;i < NUM_PACKET_LOG;i++)
  7852. {
  7853. PackAddIntEx(p, "PacketLogConfig", h->LogSetting.PacketLogConfig[i], i, NUM_PACKET_LOG);
  7854. }
  7855. PackAddInt(p, "SaveSecurityLog", h->LogSetting.SaveSecurityLog);
  7856. PackAddInt(p, "SecurityLogSwitchType", h->LogSetting.SecurityLogSwitchType);
  7857. PackAddData(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
  7858. PackAddData(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
  7859. SiAccessListToPack(p, h->AccessList);
  7860. if (h->EnableSecureNAT)
  7861. {
  7862. PackAddBool(p, "EnableSecureNAT", h->EnableSecureNAT);
  7863. OutVhOption(p, h->SecureNATOption);
  7864. }
  7865. }
  7866. // Setting of the HUB has been updated
  7867. void SiHubUpdateProc(HUB *h)
  7868. {
  7869. SERVER *s;
  7870. UINT i;
  7871. // Validate arguments
  7872. if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7873. {
  7874. return;
  7875. }
  7876. s = h->Cedar->Server;
  7877. if (s->FarmMemberList == NULL)
  7878. {
  7879. return;
  7880. }
  7881. if (h->LastVersion != h->CurrentVersion || h->CurrentVersion == 0)
  7882. {
  7883. LIST *fm_list;
  7884. if (h->CurrentVersion == 0)
  7885. {
  7886. h->CurrentVersion = 1;
  7887. }
  7888. h->LastVersion = h->CurrentVersion;
  7889. Debug("SiHubUpdateProc HUB=%s, Ver=%u, Type=%u, Offline=%u\n", h->Name, h->CurrentVersion,
  7890. h->Type, h->Offline);
  7891. fm_list = NewListFast(NULL);
  7892. LockList(s->FarmMemberList);
  7893. {
  7894. while (true)
  7895. {
  7896. bool escape = true;
  7897. // Update the HUB on all members
  7898. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  7899. {
  7900. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7901. if (IsInList(fm_list, f) == false)
  7902. {
  7903. Add(fm_list, f);
  7904. escape = false;
  7905. if (f->Me == false)
  7906. {
  7907. SiCallUpdateHub(s, f, h);
  7908. }
  7909. break;
  7910. }
  7911. }
  7912. if (escape)
  7913. {
  7914. break;
  7915. }
  7916. UnlockList(s->FarmMemberList);
  7917. LockList(s->FarmMemberList);
  7918. }
  7919. }
  7920. UnlockList(s->FarmMemberList);
  7921. ReleaseList(fm_list);
  7922. }
  7923. if (h->Offline == false)
  7924. {
  7925. SiHubOnlineProc(h);
  7926. }
  7927. }
  7928. // HUB turns to online
  7929. void SiHubOnlineProc(HUB *h)
  7930. {
  7931. SERVER *s;
  7932. UINT i;
  7933. // Validate arguments
  7934. if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7935. {
  7936. // Process only on the farm controller
  7937. return;
  7938. }
  7939. s = h->Cedar->Server;
  7940. if (s->FarmMemberList == NULL)
  7941. {
  7942. return;
  7943. }
  7944. LockList(s->FarmMemberList);
  7945. {
  7946. if (h->Type == HUB_TYPE_FARM_STATIC)
  7947. {
  7948. // Static HUB
  7949. // Create the HUB on all members
  7950. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  7951. {
  7952. UINT j;
  7953. bool exists = false;
  7954. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7955. LockList(f->HubList);
  7956. {
  7957. for (j = 0;j < LIST_NUM(f->HubList);j++)
  7958. {
  7959. HUB_LIST *hh = LIST_DATA(f->HubList, j);
  7960. if (StrCmpi(hh->Name, h->Name) == 0)
  7961. {
  7962. exists = true;
  7963. }
  7964. }
  7965. }
  7966. UnlockList(f->HubList);
  7967. if (exists == false)
  7968. {
  7969. SiCallCreateHub(s, f, h);
  7970. }
  7971. }
  7972. }
  7973. }
  7974. UnlockList(s->FarmMemberList);
  7975. }
  7976. // HUB turns to offline
  7977. void SiHubOfflineProc(HUB *h)
  7978. {
  7979. SERVER *s;
  7980. char hubname[MAX_HUBNAME_LEN + 1];
  7981. UINT i;
  7982. LIST *fm_list;
  7983. // Validate arguments
  7984. if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7985. {
  7986. // Process only on the farm controller
  7987. return;
  7988. }
  7989. s = h->Cedar->Server;
  7990. if (s->FarmMemberList == NULL)
  7991. {
  7992. return;
  7993. }
  7994. StrCpy(hubname, sizeof(hubname), h->Name);
  7995. fm_list = NewListFast(NULL);
  7996. LockList(s->FarmMemberList);
  7997. {
  7998. while (true)
  7999. {
  8000. bool escape = true;
  8001. // Stop the HUB on all members
  8002. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  8003. {
  8004. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  8005. if (IsInList(fm_list, f) == false)
  8006. {
  8007. Add(fm_list, f);
  8008. escape = false;
  8009. SiCallDeleteHub(s, f, h);
  8010. break;
  8011. }
  8012. }
  8013. if (escape)
  8014. {
  8015. break;
  8016. }
  8017. UnlockList(s->FarmMemberList);
  8018. LockList(s->FarmMemberList);
  8019. }
  8020. }
  8021. UnlockList(s->FarmMemberList);
  8022. ReleaseList(fm_list);
  8023. }
  8024. // Convert an access to PACK
  8025. void SiAccessToPack(PACK *p, ACCESS *a, UINT i, UINT total)
  8026. {
  8027. // Validate arguments
  8028. if (p == NULL || a == NULL)
  8029. {
  8030. return;
  8031. }
  8032. PackAddUniStrEx(p, "Note", a->Note, i, total);
  8033. PackAddIntEx(p, "Active", a->Active, i, total);
  8034. PackAddIntEx(p, "Priority", a->Priority, i, total);
  8035. PackAddIntEx(p, "Discard", a->Discard, i, total);
  8036. if (a->IsIPv6)
  8037. {
  8038. PackAddIp32Ex(p, "SrcIpAddress", 0xFDFFFFDF, i, total);
  8039. PackAddIp32Ex(p, "SrcSubnetMask", 0xFFFFFFFF, i, total);
  8040. PackAddIp32Ex(p, "DestIpAddress", 0xFDFFFFDF, i, total);
  8041. PackAddIp32Ex(p, "DestSubnetMask", 0xFFFFFFFF, i, total);
  8042. }
  8043. else
  8044. {
  8045. PackAddIp32Ex(p, "SrcIpAddress", a->SrcIpAddress, i, total);
  8046. PackAddIp32Ex(p, "SrcSubnetMask", a->SrcSubnetMask, i, total);
  8047. PackAddIp32Ex(p, "DestIpAddress", a->DestIpAddress, i, total);
  8048. PackAddIp32Ex(p, "DestSubnetMask", a->DestSubnetMask, i, total);
  8049. }
  8050. PackAddIntEx(p, "Protocol", a->Protocol, i, total);
  8051. PackAddIntEx(p, "SrcPortStart", a->SrcPortStart, i, total);
  8052. PackAddIntEx(p, "SrcPortEnd", a->SrcPortEnd, i, total);
  8053. PackAddIntEx(p, "DestPortStart", a->DestPortStart, i, total);
  8054. PackAddIntEx(p, "DestPortEnd", a->DestPortEnd, i, total);
  8055. PackAddStrEx(p, "SrcUsername", a->SrcUsername, i, total);
  8056. PackAddStrEx(p, "DestUsername", a->DestUsername, i, total);
  8057. PackAddBoolEx(p, "CheckSrcMac", a->CheckSrcMac, i, total);
  8058. PackAddDataEx(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), i, total);
  8059. PackAddDataEx(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), i, total);
  8060. PackAddBoolEx(p, "CheckDstMac", a->CheckDstMac, i, total);
  8061. PackAddDataEx(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), i, total);
  8062. PackAddDataEx(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), i, total);
  8063. PackAddBoolEx(p, "CheckTcpState", a->CheckTcpState, i, total);
  8064. PackAddBoolEx(p, "Established", a->Established, i, total);
  8065. PackAddIntEx(p, "Delay", a->Delay, i, total);
  8066. PackAddIntEx(p, "Jitter", a->Jitter, i, total);
  8067. PackAddIntEx(p, "Loss", a->Loss, i, total);
  8068. PackAddStrEx(p, "RedirectUrl", a->RedirectUrl, i, total);
  8069. PackAddBoolEx(p, "IsIPv6", a->IsIPv6, i, total);
  8070. if (a->IsIPv6)
  8071. {
  8072. PackAddIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, i, total);
  8073. PackAddIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, i, total);
  8074. PackAddIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, i, total);
  8075. PackAddIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, i, total);
  8076. }
  8077. else
  8078. {
  8079. IPV6_ADDR zero;
  8080. Zero(&zero, sizeof(zero));
  8081. PackAddIp6AddrEx(p, "SrcIpAddress6", &zero, i, total);
  8082. PackAddIp6AddrEx(p, "SrcSubnetMask6", &zero, i, total);
  8083. PackAddIp6AddrEx(p, "DestIpAddress6", &zero, i, total);
  8084. PackAddIp6AddrEx(p, "DestSubnetMask6", &zero, i, total);
  8085. }
  8086. }
  8087. // Get number of access contained in the PACK
  8088. UINT SiNumAccessFromPack(PACK *p)
  8089. {
  8090. // Validate arguments
  8091. if (p == NULL)
  8092. {
  8093. return 0;
  8094. }
  8095. return PackGetIndexCount(p, "Active");
  8096. }
  8097. // Convert the PACK to access
  8098. ACCESS *SiPackToAccess(PACK *p, UINT i)
  8099. {
  8100. ACCESS *a;
  8101. // Validate arguments
  8102. if (p == NULL)
  8103. {
  8104. return NULL;
  8105. }
  8106. a = ZeroMalloc(sizeof(ACCESS));
  8107. PackGetUniStrEx(p, "Note", a->Note, sizeof(a->Note), i);
  8108. a->Active = PackGetIntEx(p, "Active", i);
  8109. a->Priority = PackGetIntEx(p, "Priority", i);
  8110. a->Discard = PackGetIntEx(p, "Discard", i);
  8111. a->SrcIpAddress = PackGetIp32Ex(p, "SrcIpAddress", i);
  8112. a->SrcSubnetMask = PackGetIp32Ex(p, "SrcSubnetMask", i);
  8113. a->DestIpAddress = PackGetIp32Ex(p, "DestIpAddress", i);
  8114. a->DestSubnetMask = PackGetIp32Ex(p, "DestSubnetMask", i);
  8115. a->Protocol = PackGetIntEx(p, "Protocol", i);
  8116. a->SrcPortStart = PackGetIntEx(p, "SrcPortStart", i);
  8117. a->SrcPortEnd = PackGetIntEx(p, "SrcPortEnd", i);
  8118. a->DestPortStart = PackGetIntEx(p, "DestPortStart", i);
  8119. a->DestPortEnd = PackGetIntEx(p, "DestPortEnd", i);
  8120. PackGetStrEx(p, "SrcUsername", a->SrcUsername, sizeof(a->SrcUsername), i);
  8121. PackGetStrEx(p, "DestUsername", a->DestUsername, sizeof(a->DestUsername), i);
  8122. a->CheckSrcMac = PackGetBoolEx(p, "CheckSrcMac", i);
  8123. PackGetDataEx2(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), i);
  8124. PackGetDataEx2(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), i);
  8125. a->CheckDstMac = PackGetBoolEx(p, "CheckDstMac", i);
  8126. PackGetDataEx2(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), i);
  8127. PackGetDataEx2(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), i);
  8128. a->CheckTcpState = PackGetBoolEx(p, "CheckTcpState", i);
  8129. a->Established = PackGetBoolEx(p, "Established", i);
  8130. a->Delay = PackGetIntEx(p, "Delay", i);
  8131. a->Jitter = PackGetIntEx(p, "Jitter", i);
  8132. a->Loss = PackGetIntEx(p, "Loss", i);
  8133. a->IsIPv6 = PackGetBoolEx(p, "IsIPv6", i);
  8134. PackGetStrEx(p, "RedirectUrl", a->RedirectUrl, sizeof(a->RedirectUrl), i);
  8135. if (a->IsIPv6)
  8136. {
  8137. PackGetIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, i);
  8138. PackGetIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, i);
  8139. PackGetIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, i);
  8140. PackGetIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, i);
  8141. }
  8142. return a;
  8143. }
  8144. // Convert the PACK to an access list
  8145. void SiAccessListToPack(PACK *p, LIST *o)
  8146. {
  8147. // Validate arguments
  8148. if (p == NULL || o == NULL)
  8149. {
  8150. return;
  8151. }
  8152. LockList(o);
  8153. {
  8154. UINT i;
  8155. for (i = 0;i < LIST_NUM(o);i++)
  8156. {
  8157. ACCESS *a = LIST_DATA(o, i);
  8158. SiAccessToPack(p, a, i, LIST_NUM(o));
  8159. }
  8160. }
  8161. UnlockList(o);
  8162. }
  8163. // Get the member that is hosting the specified HUB
  8164. FARM_MEMBER *SiGetHubHostingMember(SERVER *s, HUB *h, bool admin_mode, CONNECTION *c)
  8165. {
  8166. FARM_MEMBER *ret = NULL;
  8167. char name[MAX_SIZE];
  8168. UINT i;
  8169. // Validate arguments
  8170. if (s == NULL || h == NULL || c == NULL)
  8171. {
  8172. return NULL;
  8173. }
  8174. StrCpy(name, sizeof(name), h->Name);
  8175. if (h->Type == HUB_TYPE_FARM_STATIC)
  8176. {
  8177. // It is good to select any member in the case of static HUB
  8178. if (admin_mode == false)
  8179. {
  8180. ret = SiGetNextFarmMember(s, c, h);
  8181. }
  8182. else
  8183. {
  8184. UINT i;
  8185. ret = NULL;
  8186. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  8187. {
  8188. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  8189. if (f->Me)
  8190. {
  8191. ret = f;
  8192. break;
  8193. }
  8194. }
  8195. }
  8196. }
  8197. else
  8198. {
  8199. // Examine whether there is a member that is hosting the HUB already in the case of dynamic HUB
  8200. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  8201. {
  8202. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  8203. HUB_LIST *hh, t;
  8204. StrCpy(t.Name, sizeof(t.Name), name);
  8205. LockList(f->HubList);
  8206. {
  8207. hh = Search(f->HubList, &t);
  8208. if (hh != NULL)
  8209. {
  8210. // Found
  8211. ret = f;
  8212. }
  8213. }
  8214. UnlockList(f->HubList);
  8215. }
  8216. if (ret == NULL)
  8217. {
  8218. // Let host the new HUB
  8219. FARM_MEMBER *f;
  8220. // Select the member to host
  8221. ret = SiGetNextFarmMember(s, c, h);
  8222. f = ret;
  8223. if (f != NULL)
  8224. {
  8225. // HUB creation directive
  8226. SiAddHubCreateHistory(s, name);
  8227. SiCallCreateHub(s, f, h);
  8228. SiCallUpdateHub(s, f, h);
  8229. }
  8230. }
  8231. }
  8232. return ret;
  8233. }
  8234. // Task is called
  8235. PACK *SiCalledTask(FARM_CONTROLLER *f, PACK *p, char *taskname)
  8236. {
  8237. PACK *ret;
  8238. SERVER *s;
  8239. // Validate arguments
  8240. if (f == NULL || p == NULL || taskname == NULL)
  8241. {
  8242. return NULL;
  8243. }
  8244. ret = NULL;
  8245. s = f->Server;
  8246. if (StrCmpi(taskname, "noop") == 0)
  8247. {
  8248. // NO OPERATION
  8249. ret = NewPack();
  8250. }
  8251. else
  8252. {
  8253. Debug("Task Called: [%s].\n", taskname);
  8254. if (StrCmpi(taskname, "createhub") == 0)
  8255. {
  8256. SiCalledCreateHub(s, p);
  8257. ret = NewPack();
  8258. }
  8259. else if (StrCmpi(taskname, "deletehub") == 0)
  8260. {
  8261. SiCalledDeleteHub(s, p);
  8262. ret = NewPack();
  8263. }
  8264. else if (StrCmpi(taskname, "enumhub") == 0)
  8265. {
  8266. ret = NewPack();
  8267. SiCalledEnumHub(s, ret, p);
  8268. }
  8269. else if (StrCmpi(taskname, "updatehub") == 0)
  8270. {
  8271. SiCalledUpdateHub(s, p);
  8272. ret = NewPack();
  8273. }
  8274. else if (StrCmpi(taskname, "createticket") == 0)
  8275. {
  8276. ret = SiCalledCreateTicket(s, p);
  8277. }
  8278. else if (StrCmpi(taskname, "enumnat") == 0)
  8279. {
  8280. ret = SiCalledEnumNat(s, p);
  8281. }
  8282. else if (StrCmpi(taskname, "enumdhcp") == 0)
  8283. {
  8284. ret = SiCalledEnumDhcp(s, p);
  8285. }
  8286. else if (StrCmpi(taskname, "getnatstatus") == 0)
  8287. {
  8288. ret = SiCalledGetNatStatus(s, p);
  8289. }
  8290. else if (StrCmpi(taskname, "enumsession") == 0)
  8291. {
  8292. ret = SiCalledEnumSession(s, p);
  8293. }
  8294. else if (StrCmpi(taskname, "deletesession") == 0)
  8295. {
  8296. SiCalledDeleteSession(s, p);
  8297. ret = NewPack();
  8298. }
  8299. else if (StrCmpi(taskname, "deletemactable") == 0)
  8300. {
  8301. SiCalledDeleteMacTable(s, p);
  8302. ret = NewPack();
  8303. }
  8304. else if (StrCmpi(taskname, "deleteiptable") == 0)
  8305. {
  8306. SiCalledDeleteIpTable(s, p);
  8307. ret = NewPack();
  8308. }
  8309. else if (StrCmpi(taskname, "enummactable") == 0)
  8310. {
  8311. ret = SiCalledEnumMacTable(s, p);
  8312. }
  8313. else if (StrCmpi(taskname, "enumiptable") == 0)
  8314. {
  8315. ret = SiCalledEnumIpTable(s, p);
  8316. }
  8317. else if (StrCmpi(taskname, "getsessionstatus") == 0)
  8318. {
  8319. ret = SiCalledGetSessionStatus(s, p);
  8320. }
  8321. else if (StrCmpi(taskname, "enumlogfilelist") == 0)
  8322. {
  8323. ret = SiCalledEnumLogFileList(s, p);
  8324. }
  8325. else if (StrCmpi(taskname, "readlogfile") == 0)
  8326. {
  8327. ret = SiCalledReadLogFile(s, p);
  8328. }
  8329. }
  8330. return ret;
  8331. }
  8332. // Call the task (asynchronous)
  8333. FARM_TASK *SiCallTaskAsyncBegin(FARM_MEMBER *f, PACK *p, char *taskname)
  8334. {
  8335. char tmp[MAX_PATH];
  8336. FARM_TASK *t;
  8337. // Validate arguments
  8338. if (f == NULL || p == NULL || taskname == NULL)
  8339. {
  8340. return NULL;
  8341. }
  8342. PackAddStr(p, "taskname", taskname);
  8343. Debug("Call Async Task [%s] (%s)\n", taskname, f->hostname);
  8344. Format(tmp, sizeof(tmp), "CLUSTER_CALL_ASYNC: Entering Call [%s] to %s", taskname, f->hostname);
  8345. SiDebugLog(f->Cedar->Server, tmp);
  8346. t = SiFarmServPostTask(f, p);
  8347. StrCpy(t->TaskName, sizeof(t->TaskName), taskname);
  8348. StrCpy(t->HostName, sizeof(t->HostName), f->hostname);
  8349. t->FarmMember = f;
  8350. return t;
  8351. }
  8352. // Get the results of the asynchronous task
  8353. PACK *SiCallTaskAsyncEnd(CEDAR *c, FARM_TASK *t)
  8354. {
  8355. PACK *p;
  8356. char taskname[MAX_PATH];
  8357. char hostname[MAX_PATH];
  8358. char tmp[MAX_SIZE];
  8359. // Validate arguments
  8360. if (t == NULL || c == NULL)
  8361. {
  8362. return NULL;
  8363. }
  8364. StrCpy(taskname, sizeof(taskname), t->TaskName);
  8365. StrCpy(hostname, sizeof(hostname), t->HostName);
  8366. p = SiFarmServWaitTask(t);
  8367. if (p == NULL)
  8368. {
  8369. Format(tmp, sizeof(tmp), "CLUSTER_CALL_ASYNC: Call ERROR [%s] to %s", taskname, hostname);
  8370. SiDebugLog(c->Server, tmp);
  8371. return NULL;
  8372. }
  8373. Format(tmp, sizeof(tmp), "CLUSTER_CALL_ASYNC: Retrieving Call Result [%s] to %s", taskname, hostname);
  8374. SiDebugLog(c->Server, tmp);
  8375. return p;
  8376. }
  8377. // Call the task
  8378. PACK *SiCallTask(FARM_MEMBER *f, PACK *p, char *taskname)
  8379. {
  8380. PACK *ret;
  8381. char tmp[MAX_PATH];
  8382. // Validate arguments
  8383. if (f == NULL || p == NULL || taskname == NULL)
  8384. {
  8385. return NULL;
  8386. }
  8387. PackAddStr(p, "taskname", taskname);
  8388. Debug("Call Task [%s] (%s)\n", taskname, f->hostname);
  8389. Format(tmp, sizeof(tmp), "CLUSTER_CALL: Entering Call [%s] to %s", taskname, f->hostname);
  8390. SiDebugLog(f->Cedar->Server, tmp);
  8391. ret = SiExecTask(f, p);
  8392. Format(tmp, sizeof(tmp), "CLUSTER_CALL: Leaving Call [%s] to %s", taskname, f->hostname);
  8393. SiDebugLog(f->Cedar->Server, tmp);
  8394. return ret;
  8395. }
  8396. // Task listening procedure (Main Process)
  8397. void SiAcceptTasksFromControllerMain(FARM_CONTROLLER *f, SOCK *sock)
  8398. {
  8399. PACK *request;
  8400. PACK *response;
  8401. char taskname[MAX_SIZE];
  8402. // Validate arguments
  8403. if (f == NULL || sock == NULL)
  8404. {
  8405. return;
  8406. }
  8407. f->IsConnected = true;
  8408. while (true)
  8409. {
  8410. bool ret;
  8411. // Receive the PACK
  8412. request = HttpClientRecv(sock);
  8413. if (request == NULL)
  8414. {
  8415. // Disconnect
  8416. break;
  8417. }
  8418. response = NULL;
  8419. // Get the name
  8420. if (PackGetStr(request, "taskname", taskname, sizeof(taskname)))
  8421. {
  8422. Lock(f->Server->TasksFromFarmControllerLock);
  8423. {
  8424. response = SiCalledTask(f, request, taskname);
  8425. }
  8426. Unlock(f->Server->TasksFromFarmControllerLock);
  8427. }
  8428. FreePack(request);
  8429. // Return a response
  8430. if (response == NULL)
  8431. {
  8432. response = NewPack();
  8433. }
  8434. else
  8435. {
  8436. PackAddInt(response, "succeed", 1);
  8437. }
  8438. ret = HttpClientSend(sock, response);
  8439. FreePack(response);
  8440. if (ret == false)
  8441. {
  8442. // Disconnect
  8443. break;
  8444. }
  8445. }
  8446. f->IsConnected = false;
  8447. }
  8448. // Task waiting procedure
  8449. void SiAcceptTasksFromController(FARM_CONTROLLER *f, SOCK *sock)
  8450. {
  8451. UINT i;
  8452. HUB **hubs;
  8453. UINT num_hubs;
  8454. CEDAR *c;
  8455. SERVER *s;
  8456. // Validate arguments
  8457. if (f == NULL || sock == NULL)
  8458. {
  8459. return;
  8460. }
  8461. s = f->Server;
  8462. c = s->Cedar;
  8463. // Main process
  8464. SiAcceptTasksFromControllerMain(f, sock);
  8465. // Stop all Virtual HUBs since the connection to the controller is disconnected
  8466. LockList(c->HubList);
  8467. {
  8468. hubs = ToArray(c->HubList);
  8469. num_hubs = LIST_NUM(c->HubList);
  8470. for (i = 0;i < num_hubs;i++)
  8471. {
  8472. AddRef(hubs[i]->ref);
  8473. }
  8474. }
  8475. UnlockList(c->HubList);
  8476. for (i = 0;i < num_hubs;i++)
  8477. {
  8478. SetHubOffline(hubs[i]);
  8479. DelHub(c, hubs[i]);
  8480. ReleaseHub(hubs[i]);
  8481. }
  8482. Free(hubs);
  8483. }
  8484. // Execute the task
  8485. PACK *SiExecTask(FARM_MEMBER *f, PACK *p)
  8486. {
  8487. FARM_TASK *t;
  8488. // Validate arguments
  8489. if (f == NULL || p == NULL)
  8490. {
  8491. return NULL;
  8492. }
  8493. t = SiFarmServPostTask(f, p);
  8494. if (t == NULL)
  8495. {
  8496. return NULL;
  8497. }
  8498. return SiFarmServWaitTask(t);
  8499. }
  8500. // Task queuing
  8501. FARM_TASK *SiFarmServPostTask(FARM_MEMBER *f, PACK *request)
  8502. {
  8503. FARM_TASK *t;
  8504. // Validate arguments
  8505. if (f == NULL || request == NULL)
  8506. {
  8507. return NULL;
  8508. }
  8509. t = ZeroMalloc(sizeof(FARM_TASK));
  8510. t->CompleteEvent = NewEvent();
  8511. t->Request = request;
  8512. LockQueue(f->TaskQueue);
  8513. {
  8514. if (f->Halting)
  8515. {
  8516. // Halting (failure)
  8517. UnlockQueue(f->TaskQueue);
  8518. ReleaseEvent(t->CompleteEvent);
  8519. Free(t);
  8520. return NULL;
  8521. }
  8522. InsertQueue(f->TaskQueue, t);
  8523. }
  8524. UnlockQueue(f->TaskQueue);
  8525. Set(f->TaskPostEvent);
  8526. return t;
  8527. }
  8528. // Wait for task results
  8529. PACK *SiFarmServWaitTask(FARM_TASK *t)
  8530. {
  8531. PACK *response;
  8532. // Validate arguments
  8533. if (t == NULL)
  8534. {
  8535. return NULL;
  8536. }
  8537. Wait(t->CompleteEvent, INFINITE);
  8538. ReleaseEvent(t->CompleteEvent);
  8539. FreePack(t->Request);
  8540. response = t->Response;
  8541. Free(t);
  8542. if (PackGetInt(response, "succeed") == 0)
  8543. {
  8544. // Task calling fails for any reason
  8545. FreePack(response);
  8546. return NULL;
  8547. }
  8548. return response;
  8549. }
  8550. // Server farm processing main
  8551. void SiFarmServMain(SERVER *server, SOCK *sock, FARM_MEMBER *f)
  8552. {
  8553. UINT wait_time = SERVER_CONTROL_TCP_TIMEOUT / 2;
  8554. bool send_noop = false;
  8555. UINT i;
  8556. CEDAR *c;
  8557. // Validate arguments
  8558. if (server == NULL || sock == NULL || f == NULL)
  8559. {
  8560. Debug("SiFarmServMain Failed.\n");
  8561. return;
  8562. }
  8563. Debug("SiFarmServMain Started.\n");
  8564. c = server->Cedar;
  8565. // Send a directive to create all static HUBs at the stage
  8566. // where the members have been connected to the controller
  8567. LockList(c->HubList);
  8568. {
  8569. for (i = 0;i < LIST_NUM(c->HubList);i++)
  8570. {
  8571. HUB *h = LIST_DATA(c->HubList, i);
  8572. if (h->Offline == false)
  8573. {
  8574. if (h->Type == HUB_TYPE_FARM_STATIC)
  8575. {
  8576. PACK *p;
  8577. HUB_LIST *hh;
  8578. p = NewPack();
  8579. SiPackAddCreateHub(p, h);
  8580. PackAddStr(p, "taskname", "createhub");
  8581. HttpServerSend(sock, p);
  8582. FreePack(p);
  8583. p = HttpServerRecv(sock);
  8584. FreePack(p);
  8585. p = NewPack();
  8586. SiPackAddCreateHub(p, h);
  8587. PackAddStr(p, "taskname", "updatehub");
  8588. HttpServerSend(sock, p);
  8589. FreePack(p);
  8590. p = HttpServerRecv(sock);
  8591. FreePack(p);
  8592. hh = ZeroMalloc(sizeof(HUB_LIST));
  8593. hh->DynamicHub = false;
  8594. hh->FarmMember = f;
  8595. StrCpy(hh->Name, sizeof(hh->Name), h->Name);
  8596. LockList(f->HubList);
  8597. {
  8598. Add(f->HubList, hh);
  8599. }
  8600. UnlockList(f->HubList);
  8601. }
  8602. }
  8603. }
  8604. }
  8605. UnlockList(c->HubList);
  8606. Debug("SiFarmServMain: while (true)\n");
  8607. while (true)
  8608. {
  8609. FARM_TASK *t;
  8610. UINT64 tick;
  8611. do
  8612. {
  8613. // Check whether a new task arrived
  8614. LockQueue(f->TaskQueue);
  8615. {
  8616. t = GetNext(f->TaskQueue);
  8617. }
  8618. UnlockQueue(f->TaskQueue);
  8619. if (t != NULL)
  8620. {
  8621. // Handle this task
  8622. PACK *p = t->Request;
  8623. bool ret;
  8624. // Transmission
  8625. ret = HttpServerSend(sock, p);
  8626. send_noop = false;
  8627. if (ret == false)
  8628. {
  8629. // Disconnected
  8630. // Cancel this task
  8631. Set(t->CompleteEvent);
  8632. goto DISCONNECTED;
  8633. }
  8634. // Receive
  8635. p = HttpServerRecv(sock);
  8636. t->Response = p;
  8637. Set(t->CompleteEvent);
  8638. send_noop = false;
  8639. }
  8640. }
  8641. while (t != NULL);
  8642. if (send_noop)
  8643. {
  8644. // Send a NOOP
  8645. PACK *p;
  8646. bool ret;
  8647. p = NewPack();
  8648. PackAddStr(p, "taskname", "noop");
  8649. ret = HttpServerSend(sock, p);
  8650. FreePack(p);
  8651. if (ret == false)
  8652. {
  8653. goto DISCONNECTED;
  8654. }
  8655. p = HttpServerRecv(sock);
  8656. if (p == NULL)
  8657. {
  8658. goto DISCONNECTED;
  8659. }
  8660. FreePack(p);
  8661. }
  8662. tick = Tick64();
  8663. while (true)
  8664. {
  8665. bool break_flag;
  8666. if ((tick + wait_time) <= Tick64())
  8667. {
  8668. break;
  8669. }
  8670. Wait(f->TaskPostEvent, 250);
  8671. break_flag = false;
  8672. LockQueue(f->TaskQueue);
  8673. {
  8674. if (f->TaskQueue->num_item != 0)
  8675. {
  8676. break_flag = true;
  8677. }
  8678. }
  8679. UnlockQueue(f->TaskQueue);
  8680. if (break_flag || f->Halting || server->Halt)
  8681. {
  8682. break;
  8683. }
  8684. }
  8685. send_noop = true;
  8686. }
  8687. DISCONNECTED:
  8688. Debug("SiFarmServMain: DISCONNECTED\n");
  8689. f->Halting = true;
  8690. // Cancel all outstanding tasks
  8691. LockQueue(f->TaskQueue);
  8692. {
  8693. FARM_TASK *t;
  8694. while (t = GetNext(f->TaskQueue))
  8695. {
  8696. Set(t->CompleteEvent);
  8697. }
  8698. }
  8699. UnlockQueue(f->TaskQueue);
  8700. }
  8701. // Farm server function that handles the connection from farm members
  8702. void SiFarmServ(SERVER *server, SOCK *sock, X *cert, UINT ip, UINT num_port, UINT *ports, char *hostname, UINT point, UINT weight, UINT max_sessions)
  8703. {
  8704. PACK *p;
  8705. FARM_MEMBER *f;
  8706. UINT i;
  8707. char tmp[MAX_SIZE];
  8708. // Validate arguments
  8709. if (server == NULL || sock == NULL || cert == NULL || num_port == 0 || ports == NULL || hostname == NULL)
  8710. {
  8711. return;
  8712. }
  8713. if (weight == 0)
  8714. {
  8715. weight = FARM_DEFAULT_WEIGHT;
  8716. }
  8717. if (max_sessions == 0)
  8718. {
  8719. max_sessions = SERVER_MAX_SESSIONS;
  8720. }
  8721. if (ip == 0)
  8722. {
  8723. // If the public IP address is not specified, specify the connection
  8724. // source IP address of this farm member server
  8725. ip = IPToUINT(&sock->RemoteIP);
  8726. }
  8727. IPToStr32(tmp, sizeof(tmp), ip);
  8728. SLog(server->Cedar, "LS_FARM_SERV_START", tmp, hostname);
  8729. // Inform the success
  8730. p = NewPack();
  8731. HttpServerSend(sock, p);
  8732. FreePack(p);
  8733. IPToStr32(tmp, sizeof(tmp), ip);
  8734. Debug("Farm Member %s Connected. IP: %s\n", hostname, tmp);
  8735. SetTimeout(sock, SERVER_CONTROL_TCP_TIMEOUT);
  8736. f = ZeroMalloc(sizeof(FARM_MEMBER));
  8737. f->Cedar = server->Cedar;
  8738. f->Ip = ip;
  8739. f->NumPort = num_port;
  8740. f->Ports = ports;
  8741. StrCpy(f->hostname, sizeof(f->hostname), hostname);
  8742. f->ServerCert = cert;
  8743. f->ConnectedTime = SystemTime64();
  8744. f->Weight = weight;
  8745. f->MaxSessions = max_sessions;
  8746. f->HubList = NewList(CompareHubList);
  8747. f->Point = point;
  8748. f->TaskQueue = NewQueue();
  8749. f->TaskPostEvent = NewEvent();
  8750. // Add to the list
  8751. LockList(server->FarmMemberList);
  8752. {
  8753. Add(server->FarmMemberList, f);
  8754. }
  8755. UnlockList(server->FarmMemberList);
  8756. // Main process
  8757. SiFarmServMain(server, sock, f);
  8758. // Remove from the list
  8759. LockList(server->FarmMemberList);
  8760. {
  8761. Delete(server->FarmMemberList, f);
  8762. }
  8763. UnlockList(server->FarmMemberList);
  8764. ReleaseQueue(f->TaskQueue);
  8765. ReleaseEvent(f->TaskPostEvent);
  8766. for (i = 0;i < LIST_NUM(f->HubList);i++)
  8767. {
  8768. HUB_LIST *hh = LIST_DATA(f->HubList, i);
  8769. Free(hh);
  8770. }
  8771. ReleaseList(f->HubList);
  8772. Free(f);
  8773. SLog(server->Cedar, "LS_FARM_SERV_END", hostname);
  8774. }
  8775. // Search in HUB list
  8776. int CompareHubList(void *p1, void *p2)
  8777. {
  8778. HUB_LIST *h1, *h2;
  8779. if (p1 == NULL || p2 == NULL)
  8780. {
  8781. return 0;
  8782. }
  8783. h1 = *(HUB_LIST **)p1;
  8784. h2 = *(HUB_LIST **)p2;
  8785. if (h1 == NULL || h2 == NULL)
  8786. {
  8787. return 0;
  8788. }
  8789. return StrCmpi(h1->Name, h2->Name);
  8790. }
  8791. // Connection thread to the controller
  8792. void SiConnectToControllerThread(THREAD *thread, void *param)
  8793. {
  8794. FARM_CONTROLLER *f;
  8795. SESSION *s;
  8796. CONNECTION *c;
  8797. SERVER *server;
  8798. bool first_failed;
  8799. // Validate arguments
  8800. if (thread == NULL || param == NULL)
  8801. {
  8802. return;
  8803. }
  8804. #ifdef OS_WIN32
  8805. MsSetThreadPriorityRealtime();
  8806. #endif // OS_WIN32
  8807. f = (FARM_CONTROLLER *)param;
  8808. f->Thread = thread;
  8809. AddRef(f->Thread->ref);
  8810. NoticeThreadInit(thread);
  8811. f->StartedTime = SystemTime64();
  8812. server = f->Server;
  8813. f->StartedTime = SystemTime64();
  8814. SLog(server->Cedar, "LS_FARM_CONNECT_1", server->ControllerName);
  8815. first_failed = true;
  8816. while (true)
  8817. {
  8818. // Attempt to connect
  8819. CLIENT_OPTION o;
  8820. f->LastError = ERR_TRYING_TO_CONNECT;
  8821. Zero(&o, sizeof(CLIENT_OPTION));
  8822. StrCpy(o.Hostname, sizeof(o.Hostname), server->ControllerName);
  8823. o.Port = server->ControllerPort;
  8824. f->NumTry++;
  8825. Debug("Try to Connect %s (Controller).\n", server->ControllerName);
  8826. s = NewRpcSessionEx(server->Cedar, &o, NULL, CEDAR_SERVER_FARM_STR);
  8827. if (s != NULL)
  8828. {
  8829. // Connection success: send the authentication data
  8830. PACK *p = NewPack();
  8831. UCHAR secure_password[SHA1_SIZE];
  8832. BUF *b;
  8833. c = s->Connection;
  8834. Lock(f->lock);
  8835. {
  8836. f->Sock = c->FirstSock;
  8837. AddRef(f->Sock->ref);
  8838. SetTimeout(f->Sock, SERVER_CONTROL_TCP_TIMEOUT);
  8839. }
  8840. Unlock(f->lock);
  8841. // Method
  8842. PackAddStr(p, "method", "farm_connect");
  8843. PackAddClientVersion(p, s->Connection);
  8844. // Password
  8845. SecurePassword(secure_password, server->MemberPassword, s->Connection->Random);
  8846. PackAddData(p, "SecurePassword", secure_password, sizeof(secure_password));
  8847. Lock(server->Cedar->lock);
  8848. {
  8849. b = XToBuf(server->Cedar->ServerX, false);
  8850. }
  8851. Unlock(server->Cedar->lock);
  8852. if (b != NULL)
  8853. {
  8854. char tmp[MAX_SIZE];
  8855. bool ret;
  8856. UINT i;
  8857. // Server certificate
  8858. PackAddBuf(p, "ServerCert", b);
  8859. FreeBuf(b);
  8860. // Maximum number of sessions
  8861. PackAddInt(p, "MaxSessions", GetServerCapsInt(server, "i_max_sessions"));
  8862. // Point
  8863. PackAddInt(p, "Point", SiGetPoint(server));
  8864. PackAddInt(p, "Weight", server->Weight);
  8865. // Host name
  8866. GetMachineName(tmp, sizeof(tmp));
  8867. PackAddStr(p, "HostName", tmp);
  8868. // Public IP
  8869. PackAddIp32(p, "PublicIp", server->PublicIp);
  8870. // Public port
  8871. for (i = 0;i < server->NumPublicPort;i++)
  8872. {
  8873. PackAddIntEx(p, "PublicPort", server->PublicPorts[i], i, server->NumPublicPort);
  8874. }
  8875. ret = HttpClientSend(c->FirstSock, p);
  8876. if (ret)
  8877. {
  8878. PACK *p;
  8879. UINT err = ERR_PROTOCOL_ERROR;
  8880. first_failed = true;
  8881. p = HttpClientRecv(c->FirstSock);
  8882. if (p != NULL && (err = GetErrorFromPack(p)) == 0)
  8883. {
  8884. // Successful connection
  8885. SLog(server->Cedar, "LS_FARM_START");
  8886. f->CurrentConnectedTime = SystemTime64();
  8887. if (f->FirstConnectedTime == 0)
  8888. {
  8889. f->FirstConnectedTime = SystemTime64();
  8890. }
  8891. f->NumConnected++;
  8892. Debug("Connect Succeed.\n");
  8893. f->Online = true;
  8894. // Main process
  8895. SiAcceptTasksFromController(f, c->FirstSock);
  8896. f->Online = false;
  8897. }
  8898. else
  8899. {
  8900. // Error
  8901. f->LastError = err;
  8902. SLog(server->Cedar, "LS_FARM_CONNECT_2", server->ControllerName,
  8903. GetUniErrorStr(err), err);
  8904. }
  8905. FreePack(p);
  8906. }
  8907. else
  8908. {
  8909. f->LastError = ERR_DISCONNECTED;
  8910. if (first_failed)
  8911. {
  8912. SLog(server->Cedar, "LS_FARM_CONNECT_3", server->ControllerName, RETRY_CONNECT_TO_CONTROLLER_INTERVAL / 1000);
  8913. first_failed = false;
  8914. }
  8915. }
  8916. }
  8917. FreePack(p);
  8918. // Disconnect
  8919. Lock(f->lock);
  8920. {
  8921. if (f->Sock != NULL)
  8922. {
  8923. ReleaseSock(f->Sock);
  8924. f->Sock = NULL;
  8925. }
  8926. }
  8927. Unlock(f->lock);
  8928. ReleaseSession(s);
  8929. s = NULL;
  8930. if (f->LastError == ERR_TRYING_TO_CONNECT)
  8931. {
  8932. f->LastError = ERR_DISCONNECTED;
  8933. }
  8934. }
  8935. else
  8936. {
  8937. // Connection failure
  8938. f->LastError = ERR_CONNECT_TO_FARM_CONTROLLER;
  8939. if (first_failed)
  8940. {
  8941. SLog(server->Cedar, "LS_FARM_CONNECT_3", server->ControllerName, RETRY_CONNECT_TO_CONTROLLER_INTERVAL / 1000);
  8942. first_failed = false;
  8943. }
  8944. }
  8945. Debug("Controller Disconnected. ERROR = %S\n", _E(f->LastError));
  8946. f->NumFailed = f->NumTry - f->NumConnected;
  8947. // Wait for event
  8948. Wait(f->HaltEvent, RETRY_CONNECT_TO_CONTROLLER_INTERVAL);
  8949. if (f->Halt)
  8950. {
  8951. // Halting flag
  8952. break;
  8953. }
  8954. }
  8955. SLog(server->Cedar, "LS_FARM_DISCONNECT");
  8956. }
  8957. // Disconnect the connection to the controller
  8958. void SiStopConnectToController(FARM_CONTROLLER *f)
  8959. {
  8960. // Validate arguments
  8961. if (f == NULL)
  8962. {
  8963. return;
  8964. }
  8965. f->Halt = true;
  8966. // Stop the connection
  8967. Lock(f->lock);
  8968. {
  8969. Disconnect(f->Sock);
  8970. }
  8971. Unlock(f->lock);
  8972. Set(f->HaltEvent);
  8973. // Wait for the thread termination
  8974. WaitThread(f->Thread, INFINITE);
  8975. ReleaseThread(f->Thread);
  8976. DeleteLock(f->lock);
  8977. ReleaseEvent(f->HaltEvent);
  8978. Free(f);
  8979. }
  8980. // Start a connection to the controller
  8981. FARM_CONTROLLER *SiStartConnectToController(SERVER *s)
  8982. {
  8983. FARM_CONTROLLER *f;
  8984. THREAD *t;
  8985. // Validate arguments
  8986. if (s == NULL)
  8987. {
  8988. return NULL;
  8989. }
  8990. f = ZeroMalloc(sizeof(FARM_CONTROLLER));
  8991. f->Server = s;
  8992. f->LastError = ERR_TRYING_TO_CONNECT;
  8993. f->HaltEvent = NewEvent();
  8994. f->lock = NewLock();
  8995. t = NewThread(SiConnectToControllerThread, f);
  8996. WaitThreadInit(t);
  8997. ReleaseThread(t);
  8998. return f;
  8999. }
  9000. // Get the current version
  9001. void SiGetCurrentRegion(CEDAR *c, char *region, UINT region_size)
  9002. {
  9003. ClearStr(region, region_size);
  9004. // Validate arguments
  9005. if (c == NULL || region == NULL)
  9006. {
  9007. return;
  9008. }
  9009. Lock(c->CurrentRegionLock);
  9010. {
  9011. StrCpy(region, region_size, c->CurrentRegion);
  9012. }
  9013. Unlock(c->CurrentRegionLock);
  9014. if (IsEmptyStr(region))
  9015. {
  9016. if (GetCurrentLangId() == SE_LANG_JAPANESE)
  9017. {
  9018. StrCpy(region, region_size, "JP");
  9019. }
  9020. else if (GetCurrentLangId() == SE_LANG_CHINESE_ZH)
  9021. {
  9022. StrCpy(region, region_size, "CN");
  9023. }
  9024. }
  9025. }
  9026. // Check the current region
  9027. bool SiCheckCurrentRegion(CEDAR *c, char *r)
  9028. {
  9029. char tmp[64];
  9030. // Validate arguments
  9031. if (c == NULL || r == NULL)
  9032. {
  9033. return false;
  9034. }
  9035. SiGetCurrentRegion(c, tmp, sizeof(tmp));
  9036. return (StrCmpi(r, tmp) == 0);
  9037. }
  9038. // Check whether some enterprise functions are restricted
  9039. //
  9040. // ** Hints by Daiyuu Nobori, written on March 19, 2014 **
  9041. //
  9042. // The following 'enterprise functions' are implemented on SoftEther VPN Server
  9043. // since March 19, 2014. However, these functions are disabled on
  9044. // SoftEther VPN Servers which run in Japan and China.
  9045. //
  9046. // - RADIUS / NT Domain user authentication
  9047. // - RSA certificate authentication
  9048. // - Deep-inspect packet logging
  9049. // - Source IP address control list
  9050. // - syslog transfer
  9051. //
  9052. // The SoftEther VPN Project intentionally disables these functions for users
  9053. // in Japan and China. The reason is: Daiyuu Nobori, the chief author of
  9054. // SoftEther VPN, has been liable to observe the existing agreements and
  9055. // restrictions between him and some companies. The agreements have regulated
  9056. // the region-limited restriction to implement and distribute the above
  9057. // enterprise functions on the SoftEther VPN open-source program.
  9058. //
  9059. // Therefore, the SoftEther VPN Project distributes the binary program and
  9060. // the source code with the "SiIsEnterpriseFunctionsRestrictedOnOpenSource"
  9061. // function. This function identifies whether the SoftEther VPN Server
  9062. // program is running in either Japan or China. If the restricted region is
  9063. // detected, then the above enterprise functions will be disabled.
  9064. //
  9065. // Please note that the above restriction has been imposed only on the
  9066. // original binaries and source codes from the SoftEther VPN Project.
  9067. // Anyone, except Daiyuu Nobori, who understands and writes the C language
  9068. // program can remove this restriction at his own risk.
  9069. //
  9070. bool SiIsEnterpriseFunctionsRestrictedOnOpenSource(CEDAR *c)
  9071. {
  9072. char region[128];
  9073. bool ret = false;
  9074. // Validate arguments
  9075. if (c == NULL)
  9076. {
  9077. return false;
  9078. }
  9079. SiGetCurrentRegion(c, region, sizeof(region));
  9080. if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0)
  9081. {
  9082. ret = true;
  9083. }
  9084. return ret;
  9085. }
  9086. // Update the current region
  9087. void SiUpdateCurrentRegion(CEDAR *c, char *region, bool force_update)
  9088. {
  9089. bool changed = false;
  9090. // Validate arguments
  9091. if (c == NULL)
  9092. {
  9093. return;
  9094. }
  9095. if (IsEmptyStr(region) == false)
  9096. {
  9097. Lock(c->CurrentRegionLock);
  9098. {
  9099. if (StrCmpi(c->CurrentRegion, region) != 0)
  9100. {
  9101. StrCpy(c->CurrentRegion, sizeof(c->CurrentRegion), region);
  9102. changed = true;
  9103. }
  9104. }
  9105. Unlock(c->CurrentRegionLock);
  9106. }
  9107. if (force_update)
  9108. {
  9109. changed = true;
  9110. }
  9111. if (changed)
  9112. {
  9113. FlushServerCaps(c->Server);
  9114. }
  9115. }
  9116. // Create a server
  9117. SERVER *SiNewServer(bool bridge)
  9118. {
  9119. return SiNewServerEx(bridge, false, false);
  9120. }
  9121. SERVER *SiNewServerEx(bool bridge, bool in_client_inner_server, bool relay_server)
  9122. {
  9123. SERVER *s;
  9124. LISTENER *inproc;
  9125. LISTENER *azure;
  9126. LISTENER *rudp;
  9127. SetGetIpThreadMaxNum(DEFAULT_GETIP_THREAD_MAX_NUM);
  9128. s = ZeroMalloc(sizeof(SERVER));
  9129. SetEraserCheckInterval(0);
  9130. SiInitHubCreateHistory(s);
  9131. InitServerCapsCache(s);
  9132. Rand(s->MyRandomKey, sizeof(s->MyRandomKey));
  9133. s->lock = NewLock();
  9134. s->OpenVpnSstpConfigLock = NewLock();
  9135. s->SaveCfgLock = NewLock();
  9136. s->ref = NewRef();
  9137. s->Cedar = NewCedar(NULL, NULL);
  9138. s->Cedar->Server = s;
  9139. #ifdef OS_WIN32
  9140. s->IsInVm = MsIsInVm();
  9141. #else // OS_WIN32
  9142. s->IsInVm = UnixIsInVm();
  9143. #endif // OS_WIN32
  9144. #ifdef ENABLE_AZURE_SERVER
  9145. if (IsFileExists("@azureserver.config"))
  9146. {
  9147. DisableRDUPServerGlobally();
  9148. s->AzureServer = NewAzureServer(s->Cedar);
  9149. SleepThread(500);
  9150. }
  9151. #endif // ENABLE_AZURE_SERVER
  9152. s->Cedar->CheckExpires = true;
  9153. s->ServerListenerList = NewList(CompareServerListener);
  9154. s->StartTime = SystemTime64();
  9155. s->Syslog = NewSysLog(NULL, 0);
  9156. s->SyslogLock = NewLock();
  9157. s->TasksFromFarmControllerLock = NewLock();
  9158. if (bridge)
  9159. {
  9160. SetCedarVpnBridge(s->Cedar);
  9161. }
  9162. #ifdef OS_WIN32
  9163. if (IsHamMode() == false)
  9164. {
  9165. RegistWindowsFirewallAll();
  9166. }
  9167. #endif
  9168. s->Keep = StartKeep();
  9169. // Log related
  9170. MakeDir(bridge == false ? SERVER_LOG_DIR_NAME : BRIDGE_LOG_DIR_NAME);
  9171. s->Logger = NewLog(bridge == false ? SERVER_LOG_DIR_NAME : BRIDGE_LOG_DIR_NAME, SERVER_LOG_PERFIX, LOG_SWITCH_DAY);
  9172. SLog(s->Cedar, "L_LINE");
  9173. SLog(s->Cedar, "LS_START_2", s->Cedar->ServerStr, s->Cedar->VerString);
  9174. SLog(s->Cedar, "LS_START_3", s->Cedar->BuildInfo);
  9175. SLog(s->Cedar, "LS_START_UTF8");
  9176. SLog(s->Cedar, "LS_START_1");
  9177. // Initialize the configuration
  9178. SiInitConfiguration(s);
  9179. SetFifoCurrentReallocMemSize(MEM_FIFO_REALLOC_MEM_SIZE);
  9180. if (s->DisableIntelAesAcceleration)
  9181. {
  9182. // Disable the Intel AES acceleration
  9183. DisableIntelAesAccel();
  9184. }
  9185. // Raise the priority
  9186. if (s->NoHighPriorityProcess == false)
  9187. {
  9188. OSSetHighPriority();
  9189. }
  9190. #ifdef OS_UNIX
  9191. UnixSetHighOomScore();
  9192. #endif // OS_UNIX
  9193. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  9194. {
  9195. // Start a connection to the controller
  9196. s->FarmController = SiStartConnectToController(s);
  9197. }
  9198. else if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  9199. {
  9200. FARM_MEMBER *f;
  9201. // Start operating as a controller
  9202. s->FarmMemberList = NewList(NULL);
  9203. f = ZeroMalloc(sizeof(FARM_MEMBER));
  9204. f->Cedar = s->Cedar;
  9205. GetMachineName(f->hostname, sizeof(f->hostname));
  9206. f->Me = true;
  9207. f->HubList = NewList(CompareHubList);
  9208. f->Weight = s->Weight;
  9209. s->Me = f;
  9210. Add(s->FarmMemberList, f);
  9211. SiStartFarmControl(s);
  9212. s->FarmControllerInited = true;
  9213. }
  9214. // Start a in-processlistener
  9215. inproc = NewListener(s->Cedar, LISTENER_INPROC, 0);
  9216. ReleaseListener(inproc);
  9217. // Start a listener for Azure
  9218. if (s->AzureClient != NULL)
  9219. {
  9220. azure = NewListener(s->Cedar, LISTENER_REVERSE, 0);
  9221. ReleaseListener(azure);
  9222. }
  9223. // Start a R-UDP listener
  9224. if (s->DisableNatTraversal == false && s->Cedar->Bridge == false)
  9225. {
  9226. rudp = NewListenerEx4(s->Cedar, LISTENER_RUDP, 0, TCPAcceptedThread, NULL, false, false,
  9227. &s->NatTGlobalUdpPort, RAND_PORT_ID_SERVER_LISTEN);
  9228. ReleaseListener(rudp);
  9229. }
  9230. // Start a VPN-over-ICMP listener
  9231. s->DynListenerIcmp = NewDynamicListener(s->Cedar, &s->EnableVpnOverIcmp, LISTENER_ICMP, 0);
  9232. // Start a VPN-over-DNS listener
  9233. s->DynListenerDns = NewDynamicListener(s->Cedar, &s->EnableVpnOverDns, LISTENER_DNS, 53);
  9234. SiInitDeadLockCheck(s);
  9235. SiUpdateCurrentRegion(s->Cedar, "", true);
  9236. return s;
  9237. }
  9238. // Developed by SoftEther VPN Project at University of Tsukuba in Japan.
  9239. // Department of Computer Science has dozens of overly-enthusiastic geeks.
  9240. // Join us: http://www.tsukuba.ac.jp/english/admission/