00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 defcom cMessage = message I S S S S;;
00038
00039 struct NetComm{
00040
00041 NC_channel (Chn);
00042 NC_serverName (S);
00043 NC_serverPort (I);
00044 NC_script (S);
00045 NC_env (Env);
00046 NC_rsaPrivate (S);
00047 NC_rsaPublic (S);
00048 NC_rsaServerPublic (S);
00049 NC_aesServerKey (S);
00050 NC_roomName (S);
00051 NC_lUsers ([[I NetUser] r1]);
00052 NC_userId (I);
00053 NC_status (I);
00054 NC_messageBuffer (S);
00055 NC_roomItems ([[S S] r1]);
00056
00057 NC_cbConnected (fun [NetComm] I);
00058 NC_cbClosed (fun [NetComm] I);
00059 NC_cbSConnected (fun [NetComm] I);
00060 NC_cbSrvMessage (fun [NetComm S S S] I);
00061 NC_cbUserMessage (fun [NetComm NetUser S S S] I);
00062 NC_cbGetFile (fun [NetComm NetUser S S S] I);
00063 NC_cbUserGetItem (fun [NetComm NetUser S S] I);
00064 NC_cbRoomGetItem (fun [NetComm S S] I);
00065 NC_cbNewUser (fun [NetComm NetUser] I);
00066 NC_cbDelUser (fun [NetComm NetUser] I);
00067 NC_cbUserChangeLogin (fun [NetComm NetUser S] I);
00068 NC_cbNbUsers (fun [NetComm I] I);
00069 NC_cbRoomChanged (fun [NetComm S] I
00070
00071 );
00072 };
00073 typedef struct mkNetComm NetComm;
00074
00075
00076 struct NetUser{
00077
00078 NU_id (I);
00079 NU_login (S);
00080 NU_items ([[S S] r1]);
00081 NU_status (I
00082
00083 );
00084 };
00085 typedef struct mkNetUser NetUser;
00086
00087
00088 typeof lNetCommInst=[[Chn NetComm] r1];
00089
00090 var iComFlagDefault=0;
00091 var iComFlagRSA=1;
00092 var iComFlagAES=2;
00093 var iComFlagBroad=4;
00094 var iComFlagMulti=8;
00095 var iComFlagMultiEnd=16;
00096 var iComFlagFile=32;
00097 var iComFlagPrivate=64;
00098 var iComFlagBroadOthers=128;
00099
00100 var iStatusDisconnected=0;
00101 var iStatusConnected=1;
00102 var iStatusSecurised=2;
00103
00104 var iMaxMessageSize=16384;
00105
00106
00107 isIP(s,i){
00108 if i>=strlen s then 1
00109 else let nth_char s i-> a in
00110 if a!='. && (a<'0 || a>'9) then 0
00111 else isIP s i+1;
00112 }
00113
00114 /* ********************************************************************************************* /
00115 generate AppID modify on of the app package or ressource will modify this AppID
00116 / ********************************************************************************************* */
00117
00118 typeof sAppId=S;
00119
00120 getAppId(scenepath){
00121 let mkAppletGetAppMd5 scenepath -> lmd5 in
00122 let
00123 let _envchannel _channel -> env in
00124 let nil -> lenv in
00125 (
00126 while ((_envfirstname env) != nil) do
00127 (
00128 set lenv = (_envfirstname env)::lenv;
00129 set env = _removepkg env;
00130 );
00131 lenv;
00132 )
00133 -> lenv in
00134
00135 let hexListToBignumList (lcat lmd5 lenv) -> lbig in
00136
00137 let sizelist lmd5 -> size in
00138 let BigFromInt 0 -> nvalue in
00139 let 0 -> i in
00140 (
00141 while i < size do
00142 (
00143 let nth_list lmd5 i -> elem in
00144 let nth_list lbig i -> big in
00145 set nvalue = BigAdd nvalue big;
00146
00147 set i = i + 1;
00148 );
00149 set sAppId = strmd5 BigToAsc nvalue;
00150 );
00151 0;
00152 }
00153
00154
00155 /* ********************************************************************************************* /
00156 User management
00157 / ********************************************************************************************* */
00158
00159 netUserGetItemValue(netstr, userstr, item){
00160 if userstr == nil then nil else
00161 switchstr userstr.NU_items item
00162 ;
00163 }
00164
00165
00166 netUserSetItemValue(netstr, userstr, item, val){
00167 if userstr == nil then nil else
00168 let switchstr userstr.NU_items item -> exist in
00169 if (exist == nil) then
00170 (
00171 set userstr.NU_items = [item val]::userstr.NU_items;
00172 0;
00173 )
00174 else
00175 let sizelist userstr.NU_items -> size in
00176 let 0 -> i in
00177 let nil -> fitem in
00178 while (i < size) && (fitem == nil) do
00179 (
00180 let nth_list userstr.NU_items i -> titem in
00181 let titem -> [name value] in
00182 if (strcmpi item name) then nil else
00183 (
00184 mutate titem <- [_ val];
00185 set fitem = titem;
00186 );
00187
00188 set i = i + 1;
00189 );
00190 exec netstr.NC_cbUserGetItem with [netstr userstr item val];
00191 0;
00192 }
00193
00194
00195 netRoomGetItemValue(netstr, item){
00196 if netstr == nil then nil else
00197 switchstr netstr.NC_roomItems item
00198 ;
00199 }
00200
00201
00202 netRoomSetItemValue(netstr, item, val){
00203 if netstr == nil then nil else
00204 let switchstr netstr.NC_roomItems item -> exist in
00205 if (exist == nil) then
00206 (
00207 set netstr.NC_roomItems = [item val]::netstr.NC_roomItems;
00208 0;
00209 )
00210 else
00211 let sizelist netstr.NC_roomItems -> size in
00212 let 0 -> i in
00213 let nil -> fitem in
00214 while (i < size) && (fitem == nil) do
00215 (
00216 let nth_list netstr.NC_roomItems i -> titem in
00217 let titem -> [name value] in
00218 if (strcmpi item name) then nil else
00219 (
00220 mutate titem <- [_ val];
00221 set fitem = titem;
00222 );
00223
00224 set i = i + 1;
00225 );
00226 exec netstr.NC_cbRoomGetItem with [netstr item val];
00227 0;
00228 }
00229
00230
00231 netAddUser(netstr, id, login){
00232 let switch netstr.NC_lUsers id -> userstr in
00233 if userstr != nil then userstr else
00234 let mkNetUser [id login ["Login" login]::nil 1] -> nuserstr in
00235 (
00236 exec netstr.NC_cbNbUsers with [netstr (sizelist netstr.NC_lUsers)];
00237 set netstr.NC_lUsers = [id nuserstr]::netstr.NC_lUsers;
00238 exec netstr.NC_cbNewUser with [netstr nuserstr];
00239 nuserstr;
00240 );
00241 }
00242
00243
00244 netDelUser(netstr, userstr){
00245 if userstr == nil then nil else
00246 (
00247 exec netstr.NC_cbNbUsers with [netstr (sizelist netstr.NC_lUsers)];
00248 exec netstr.NC_cbDelUser with [netstr userstr];
00249 set netstr.NC_lUsers = remove_idx_from_list netstr.NC_lUsers userstr.NU_id;
00250 );
00251 0;
00252 }
00253
00254
00255 netDelUserById(netstr, id){
00256 let switch netstr.NC_lUsers id -> userstr in
00257 if userstr == nil then nil else
00258 (
00259 exec netstr.NC_cbNbUsers with [netstr (sizelist netstr.NC_lUsers)];
00260 exec netstr.NC_cbDelUser with [netstr userstr];
00261 set netstr.NC_lUsers = remove_idx_from_list netstr.NC_lUsers id;
00262 );
00263 0;
00264 }
00265
00266
00267 netUserSetLoginById(netstr, id, login){
00268 let switch netstr.NC_lUsers id -> userstr in
00269 let if userstr == nil then (netAddUser netstr id login) else userstr -> userstr in
00270 (
00271 exec netstr.NC_cbUserChangeLogin with [netstr userstr login];
00272 set userstr.NU_login = login;
00273 netUserSetItemValue netstr userstr "Login" login;
00274 userstr;
00275 );
00276 }
00277
00278
00279 netUserSetLogin(netstr, userstr, login){
00280 if userstr == nil then nil else
00281 (
00282 exec netstr.NC_cbUserChangeLogin with [netstr userstr login];
00283 set userstr.NU_login = login;
00284 netUserSetItemValue netstr userstr "Login" login;
00285 userstr;
00286 );
00287 }
00288
00289
00290 netUserGetLoginById(netstr, id){
00291 let switch netstr.NC_lUsers id -> userstr in
00292 if userstr == nil then nil else
00293 userstr.NU_login
00294 ;
00295 }
00296
00297
00298 netUserGetLogin(userstr){
00299 if userstr == nil then nil else
00300 userstr.NU_login
00301 ;
00302 }
00303
00304
00305 netUserGetId(userstr){
00306 if userstr == nil then nil else
00307 userstr.NU_id
00308 ;
00309 }
00310
00311
00312 netGetUserByLogin(netstr, login){
00313 let nil -> user in
00314 let sizelist netstr.NC_lUsers -> size in
00315 let 0 -> i in
00316 (
00317 while i < size do
00318 (
00319 let nth_list netstr.NC_lUsers i -> [_ iuser] in
00320 if (!strcmp login iuser.NU_login) then
00321 set user = iuser
00322 else nil;
00323
00324 set i = i + 1;
00325 );
00326 user;
00327 );
00328 }
00329
00330
00331 netGetUserById(netstr, id){
00332 switch netstr.NC_lUsers id;
00333 }
00334
00335
00336 netThisId(netstr){
00337 netstr.NC_userId;
00338 }
00339
00340
00341 netThisUser(netstr){
00342 switch netstr.NC_lUsers netstr.NC_userId;
00343 }
00344
00345
00346 netThisLogin(netstr){
00347 netUserGetLogin netThisUser netstr;
00348 }
00349
00350
00351 netGetNbUsers(netstr){
00352 sizelist netstr.NC_lUsers;
00353 }
00354
00355
00356 /* ********************************************************************************************* /
00357 Connection Channel management
00358 / ********************************************************************************************* */
00359
00360 _connected(){
00361 let switch lNetCommInst _channel -> netstr in
00362 (
00363 exec netstr.NC_cbConnected with [netstr];
00364 );
00365 0;
00366 }
00367
00368
00369 _closed(){
00370 let switch lNetCommInst _channel -> netstr in
00371 (
00372 exec netstr.NC_cbClosed with [netstr];
00373 );
00374 0;
00375 }
00376
00377
00378
00379 /* ********************************************************************************************* /
00380 Callback management
00381 / ********************************************************************************************* */
00382
00383 netSetCbConnected(netstr, cbfun){
00384 set netstr.NC_cbConnected = cbfun;
00385 0;
00386 }
00387
00388
00389 netSetCbClosed(netstr, cbfun){
00390 set netstr.NC_cbClosed = cbfun;
00391 0;
00392 }
00393
00394
00395 netSetCbSConnected(netstr, cbfun){
00396 set netstr.NC_cbSConnected = cbfun;
00397 0;
00398 }
00399
00400
00401 netSetCbSrvMessage(netstr, cbfun){
00402 set netstr.NC_cbSrvMessage = cbfun;
00403 0;
00404 }
00405
00406
00407 netSetCbUserMessage(netstr, cbfun){
00408 set netstr.NC_cbUserMessage = cbfun;
00409 0;
00410 }
00411
00412
00413 netSetCbGetFile(netstr, cbfun){
00414 set netstr.NC_cbGetFile = cbfun;
00415 0;
00416 }
00417
00418
00419 netSetCbNewUser(netstr, cbfun){
00420 set netstr.NC_cbNewUser = cbfun;
00421 0;
00422 }
00423
00424
00425 netSetCbDelUser(netstr, cbfun){
00426 set netstr.NC_cbDelUser = cbfun;
00427 0;
00428 }
00429
00430
00431 netSetCbUserChangeLogin(netstr, cbfun){
00432 set netstr.NC_cbUserChangeLogin = cbfun;
00433 0;
00434 }
00435
00436
00437 netSetCbUserGetItem(netstr, cbfun){
00438 set netstr.NC_cbUserGetItem = cbfun;
00439 0;
00440 }
00441
00442
00443 netSetCbRoomGetItem(netstr, cbfun){
00444 set netstr.NC_cbRoomGetItem = cbfun;
00445 0;
00446 }
00447
00448
00449 netSetCbNbUsers(netstr, cbfun){
00450 set netstr.NC_cbNbUsers = cbfun;
00451 0;
00452 }
00453
00454
00455 netSetCbRoomChanged(netstr, cbfun){
00456 set netstr.NC_cbRoomChanged = cbfun;
00457 0;
00458 }
00459
00460
00461 /* ********************************************************************************************* /
00462 Message management
00463 / ********************************************************************************************* */
00464
00465 netSendMultiPart(netstr, userstr, flag, cmd, message, arg, pos){
00466 let if flag == nil then iComFlagDefault else flag -> flag in
00467 let strlen message -> len in
00468 let substr message pos iMaxMessageSize -> part in
00469 let if (pos + iMaxMessageSize) >= len then flag|iComFlagMultiEnd else flag|iComFlagMulti -> nflag in
00470 (
00471 _on netstr.NC_channel cMessage [nflag (itoa userstr.NU_id) cmd part arg];
00472 if (pos + iMaxMessageSize) >= len then nil else
00473 netSendMultiPart netstr userstr flag cmd message arg (pos + iMaxMessageSize);
00474 );
00475 0;
00476 }
00477
00478
00479 netSendFile(netstr, userstr, flag, cmd, filename){
00480 let if flag == nil then iComFlagDefault else flag -> flag in
00481 let strtoweb (_getpack _checkpack filename) -> data in
00482 if (data == nil) then nil else
00483 let if userstr == nil then flag|iComFlagBroad else flag|iComFlagPrivate -> flag in
00484 let if (flag & iComFlagAES) then _AESencryptMessage data netstr.NC_aesServerKey else data -> data in
00485 let if (flag & iComFlagAES) then _AESencryptMessage filename netstr.NC_aesServerKey else filename -> filename in
00486 if ((strlen data) > iMaxMessageSize) then
00487 netSendMultiPart netstr userstr flag|iComFlagFile cmd data filename 0
00488 else
00489 _on netstr.NC_channel cMessage [flag|iComFlagFile (itoa userstr.NU_id) cmd data filename];
00490 0;
00491 }
00492
00493
00494 netGetFile(netstr, userstr, flag, cmd, filename){
00495 let if flag == nil then iComFlagDefault else flag -> flag in
00496 let if userstr == nil then flag|iComFlagBroadOthers else flag|iComFlagPrivate -> flag in
00497 let if (flag & iComFlagAES) then _AESencryptMessage cmd netstr.NC_aesServerKey else cmd -> cmd in
00498 let if (flag & iComFlagAES) then _AESencryptMessage filename netstr.NC_aesServerKey else filename -> filename in
00499 _on netstr.NC_channel cMessage [flag (itoa userstr.NU_id) "requestFile" cmd filename];
00500 0;
00501 }
00502
00503
00504 netSendMessageExt(netstr, cmd, message, arg){
00505 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES else iComFlagDefault -> flag in
00506 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage message netstr.NC_aesServerKey else message -> message in
00507 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage arg netstr.NC_aesServerKey else arg -> arg in
00508 if ((strlen message) > iMaxMessageSize) then
00509 netSendMultiPart netstr nil flag cmd message arg 0
00510 else
00511 _on netstr.NC_channel cMessage [flag nil cmd message arg];
00512 0;
00513 }
00514
00515
00516 netSendMessage(netstr, cmd, message){
00517 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES else iComFlagDefault -> flag in
00518 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage message netstr.NC_aesServerKey else message -> message in
00519 if ((strlen message) > iMaxMessageSize) then
00520 netSendMultiPart netstr nil flag cmd message nil 0
00521 else
00522 _on netstr.NC_channel cMessage [flag nil cmd message nil];
00523 0;
00524 }
00525
00526
00527 netSendBroadMessage(netstr, cmd, message){
00528 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES|iComFlagBroad else iComFlagDefault|iComFlagBroad -> flag in
00529 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage message netstr.NC_aesServerKey else message -> message in
00530 if ((strlen message) > iMaxMessageSize) then
00531 netSendMultiPart netstr nil flag cmd message nil 0
00532 else
00533 _on netstr.NC_channel cMessage [flag nil cmd message nil];
00534 0;
00535 }
00536
00537
00538 netUpdateUserItem(netstr, item, val){
00539 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES else iComFlagDefault -> flag in
00540 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage item netstr.NC_aesServerKey else item -> item in
00541 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage val netstr.NC_aesServerKey else val -> val in
00542 if ((strlen item) > iMaxMessageSize) then
00543 netSendMultiPart netstr nil flag "setCliItem" item val 0
00544 else
00545 _on netstr.NC_channel cMessage [flag nil "setCliItem" item val];
00546 0;
00547 }
00548
00549
00550 netUpdateRoomItem(netstr, item, val){
00551 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES else iComFlagDefault -> flag in
00552 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage item netstr.NC_aesServerKey else item -> item in
00553 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage val netstr.NC_aesServerKey else val -> val in
00554 if ((strlen item) > iMaxMessageSize) then
00555 netSendMultiPart netstr nil flag "setRoomItem" item val 0
00556 else
00557 _on netstr.NC_channel cMessage [flag nil "setRoomItem" item val];
00558 0;
00559 }
00560
00561
00562 netSendRsaMessage(netstr, cmd, message){
00563 let _RSAencryptMessage message netstr.NC_rsaServerPublic -> message in
00564 if ((strlen message) > iMaxMessageSize) then
00565 netSendMultiPart netstr nil iComFlagRSA cmd message nil 0
00566 else
00567 _on netstr.NC_channel cMessage [iComFlagRSA nil cmd message nil];
00568 0;
00569 }
00570
00571
00572 netSendPrivateMessage(netstr, userstr, cmd, message){
00573 let if (netstr.NC_status & iStatusSecurised) then iComFlagAES|iComFlagPrivate else iComFlagPrivate -> flag in
00574 let if (netstr.NC_status & iStatusSecurised) then _AESencryptMessage message netstr.NC_aesServerKey else message -> message in
00575 if ((strlen message) > iMaxMessageSize) then
00576 netSendMultiPart netstr userstr flag cmd message nil 0
00577 else
00578 _on netstr.NC_channel cMessage [flag (itoa userstr.NU_id) cmd message nil];
00579 0;
00580 }
00581
00582
00583 netKickUser(netstr, userstr){
00584 _on netstr.NC_channel cMessage [iComFlagPrivate (itoa userstr.NU_id) "kickUser" nil nil];
00585 0;
00586 }
00587
00588
00589 netCryptMessage(netstr, message, mode){
00590 if (mode & iComFlagRSA) then
00591 _RSAencryptMessage message netstr.NC_rsaServerPublic
00592 else
00593 _AESencryptMessage message netstr.NC_aesServerKey
00594 ;
00595 }
00596
00597
00598 netUnCryptMessage(netstr, message, mode){
00599 if (mode & iComFlagRSA) then
00600 _RSAdecryptMessage message netstr.NC_rsaPrivate
00601 else
00602 _AESdecryptMessage message netstr.NC_aesServerKey
00603 ;
00604 }
00605
00606
00607 netFormatMessage(netstr, userstr, message){
00608 let sizelist userstr.NU_items -> size in
00609 let 0 -> i in
00610 while i < size do
00611 (
00612 let nth_list userstr.NU_items i -> [item value] in
00613 set message = strreplacei message (strcatn "%"::item::"%"::nil) value;
00614
00615 set i = i + 1;
00616 );
00617 message;
00618 }
00619
00620
00621 netChannel(netstr){
00622 netstr.NC_channel;
00623 }
00624
00625
00626 netIsConnected(netstr){
00627 if netstr.NC_channel == nil then 0 else 1;
00628 }
00629
00630
00631 netDisconnect(netstr){
00632 let netstr.NC_channel -> chan in
00633 (
00634 _killchannel chan;
00635 set netstr.NC_channel = nil;
00636 set netstr.NC_status = iStatusDisconnected;
00637 set lNetCommInst = remove_idx_from_list lNetCommInst chan;
00638 exec netstr.NC_cbClosed with [netstr];
00639 );
00640 0;
00641 }
00642
00643
00644 netCreateExt(server, port, script, env){
00645 let if env == nil then (_envchannel _channel) else env -> env in
00646 let if (isIP server 0) then server else _gethostbyname server -> server in
00647 mkNetComm[nil server port script env nil nil nil nil nil nil nil 0 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]
00648 ;
00649 }
00650
00651
00652 netCreate(server, port){
00653 let _envchannel _channel -> env in
00654 let if (isIP server 0) then server else _gethostbyname server -> server in
00655 mkNetComm[nil server port nil env nil nil nil nil nil nil nil 0 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]
00656 ;
00657 }
00658
00659
00660 netCreateMinimum(){
00661 let _envchannel _channel -> env in
00662 mkNetComm[nil nil nil nil env nil nil nil nil nil nil nil 0 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]
00663 ;
00664 }
00665
00666
00667 netConnect(netstr){
00668 if (netstr.NC_status & iStatusConnected) then 1 else
00669 let 0 -> ret in
00670 (
00671 // remove existing users
00672 set netstr.NC_lUsers = nil;
00673
00674 set netstr.NC_channel = _openchannel strcatn netstr.NC_serverName::":"::(itoa netstr.NC_serverPort)::nil netstr.NC_script netstr.NC_env;
00675
00676 if netstr.NC_channel == nil then nil else
00677 (
00678 set netstr.NC_status = iStatusConnected;
00679 set lNetCommInst = [netstr.NC_channel netstr]::lNetCommInst;
00680 set ret = 1;
00681 );
00682 ret;
00683 );
00684 }
00685
00686
00687 netReconnect(netstr){
00688 if netstr.NC_channel == nil then nil else
00689 netDisconnect netstr;
00690 netConnect netstr;
00691 }
00692
00693
00694 netSetServer(netstr, server, port){
00695 let if (isIP server 0) then server else _gethostbyname server -> server in
00696 set netstr.NC_serverName = server;
00697 set netstr.NC_serverPort = port;
00698 if (netstr.NC_status & iStatusConnected) then
00699 netReconnect netstr
00700 else nil;
00701
00702 netstr;
00703 }
00704
00705
00706 netChangeLogin(netstr, login){
00707 netSendMessage netstr "setLogin" login;
00708 0;
00709 }
00710
00711
00712 netChangeRoom(netstr, room){
00713 set netstr.NC_roomItems = nil;
00714 netSendMessage netstr "setRoom" room;
00715 0;
00716 }
00717
00718
00719 /* ********************************************************************************************* /
00720 Server responses
00721 / ********************************************************************************************* */
00722
00723 __connectedToServer(cid, clogin, srvpubkey){
00724 let switch lNetCommInst _channel -> netstr in
00725 let _RSAgetKeyPair 1024 -> [priv pub] in
00726 (
00727 set netstr.NC_rsaServerPublic = srvpubkey;
00728 set netstr.NC_rsaPrivate = priv;
00729 set netstr.NC_rsaPublic = pub;
00730 set netstr.NC_userId = atoi cid;
00731
00732 netAddUser netstr atoi cid clogin;
00733
00734 // send client public key to server
00735 netSendMessageExt netstr "setCliSecure" pub (netCryptMessage netstr sAppId iComFlagRSA);
00736 );
00737 0;
00738 }
00739
00740
00741 __srvMessage(mode, cmd, message, arg){
00742 let switch lNetCommInst _channel -> netstr in
00743 if (mode & iComFlagMulti) then
00744 (
00745 set netstr.NC_messageBuffer = strcat netstr.NC_messageBuffer message;
00746 0;
00747 )
00748 else
00749 let if (mode & iComFlagMultiEnd) then (strcat netstr.NC_messageBuffer message) else message -> message in
00750 let if (mode & iComFlagRSA) then
00751 _RSAdecryptMessage message netstr.NC_rsaPrivate
00752 else if (mode & iComFlagAES) then
00753 _AESdecryptMessage message netstr.NC_aesServerKey
00754 else
00755 message
00756 -> message in
00757 let if (mode & iComFlagRSA) then
00758 _RSAdecryptMessage arg netstr.NC_rsaPrivate
00759 else if (mode & iComFlagAES) then
00760 _AESdecryptMessage arg netstr.NC_aesServerKey
00761 else
00762 arg
00763 -> arg in
00764 (
00765 set netstr.NC_messageBuffer = nil;
00766 if (!strcmp cmd "setCryptoAES") then
00767 (
00768 set netstr.NC_aesServerKey = message;
00769 set netstr.NC_status = netstr.NC_status|iStatusSecurised;
00770 exec netstr.NC_cbSConnected with [netstr];
00771 0;
00772 )
00773 else if (!strcmp cmd "delUser") then
00774 (
00775 netDelUserById netstr atoi message;
00776 0;
00777 )
00778 else if (!strcmp cmd "addUser") then
00779 (
00780 netAddUser netstr (atoi message) arg;
00781 0;
00782 )
00783 else if (!strcmp cmd "getRoomItem") then
00784 (
00785 netRoomSetItemValue netstr message arg;
00786 0;
00787 )
00788 else if (!strcmp cmd "getRoom") then
00789 (
00790 set netstr.NC_roomName = message;
00791 exec netstr.NC_cbRoomChanged with [netstr message];
00792 0;
00793 )
00794 else
00795 (
00796 exec netstr.NC_cbSrvMessage with [netstr cmd message arg];
00797 0;
00798 );
00799 );
00800 0;
00801 }
00802
00803
00804 __usrMessage(mode, from, cmd, message, arg){
00805 let switch lNetCommInst _channel -> netstr in
00806 let switch netstr.NC_lUsers (atoi from) -> userstr in
00807 if netstr == nil || userstr == nil then nil else
00808 if (mode & iComFlagMulti) then
00809 (
00810 set netstr.NC_messageBuffer = strcat netstr.NC_messageBuffer message;
00811 0;
00812 )
00813 else
00814 let if (mode & iComFlagMultiEnd) then (strcat netstr.NC_messageBuffer message) else message -> message in
00815 let if (mode & iComFlagRSA) then
00816 _RSAdecryptMessage message netstr.NC_rsaPrivate
00817 else if (mode & iComFlagAES) then
00818 _AESdecryptMessage message netstr.NC_aesServerKey
00819 else
00820 message
00821 -> message in
00822 let if (mode & iComFlagRSA) then
00823 _RSAdecryptMessage arg netstr.NC_rsaPrivate
00824 else if (mode & iComFlagAES) then
00825 _AESdecryptMessage arg netstr.NC_aesServerKey
00826 else
00827 arg
00828 -> arg in
00829 (
00830 set netstr.NC_messageBuffer = nil;
00831
00832 if (mode & iComFlagFile) then
00833 (
00834 if arg == nil then nil else
00835 // _storepack webtostr message arg;
00836 exec netstr.NC_cbGetFile with [netstr userstr cmd (webtostr message) arg];
00837 0;
00838 )
00839 else if (!strcmp cmd "loginChanged") then
00840 (
00841 netUserSetLogin netstr userstr message;
00842 0;
00843 )
00844 else if (!strcmp cmd "getCliItem") then
00845 (
00846 netUserSetItemValue netstr userstr message arg;
00847 )
00848 else if (!strcmp cmd "requestFile") then
00849 (
00850 netSendFile netstr userstr mode message arg;
00851 0;
00852 )
00853 else
00854 (
00855 exec netstr.NC_cbUserMessage with [netstr userstr cmd message arg];
00856 0;
00857 );
00858 );
00859 0;
00860 }
00861 // -- [/filterPKG] --
00862