密猟オンラインサーバープログラム
管理者用コマンドを実装
*ユーザー削除
*シャットダウン
*ユーザーアカウントのブロック/解除
*管理者のスコアおよびHPを回復
ユーザーアカウントのブロック状態を実装
| @@ -231,6 +231,12 @@ | ||
| 231 | 231 | unsigned long maybearrest; |
| 232 | 232 | unsigned crime_level; |
| 233 | 233 | unsigned arrest_count; |
| 234 | + enum account_t | |
| 235 | + { | |
| 236 | + AccountActive, | |
| 237 | + AccountBlock | |
| 238 | + } | |
| 239 | + account_status; | |
| 234 | 240 | enum move_t |
| 235 | 241 | { |
| 236 | 242 | NoMove, |
| @@ -2190,6 +2196,7 @@ | ||
| 2190 | 2196 | User[i].myshop[j].build = 0; |
| 2191 | 2197 | } |
| 2192 | 2198 | memset (User[i].password, 0, PASSWORD_LEN); |
| 2199 | + User[i].account_status = AccountActive; | |
| 2193 | 2200 | User[i].session.handle = INVALID_SOCKET; |
| 2194 | 2201 | User[i].idletimer = 0; |
| 2195 | 2202 | User[i].hp = 0; |
| @@ -4798,7 +4805,7 @@ | ||
| 4798 | 4805 | puts ("protocol mismatch."); |
| 4799 | 4806 | SendResultPacket (psession->handle, -1); |
| 4800 | 4807 | } |
| 4801 | - else if (nuser != -1) | |
| 4808 | + else if (nuser != -1 && User[nuser].account_status == AccountActive) | |
| 4802 | 4809 | { |
| 4803 | 4810 | int i; |
| 4804 | 4811 | const unsigned char *p = packet + 2 + USERNAME_LEN; |
| @@ -4805,7 +4812,7 @@ | ||
| 4805 | 4812 | char uname[USERNAME_LEN]; |
| 4806 | 4813 | char work[PASSWORD_LEN]; |
| 4807 | 4814 | memcpy (uname, User[nuser].name, USERNAME_LEN); |
| 4808 | - printf ("User name:%-16.24s\n", uname); | |
| 4815 | + printf ("User name:%-.24s\n", uname); | |
| 4809 | 4816 | for (i = 0; i < PASSWORD_LEN; i++) |
| 4810 | 4817 | { |
| 4811 | 4818 | if (*(p + i) == '\0') |
| @@ -4883,7 +4890,14 @@ | ||
| 4883 | 4890 | } |
| 4884 | 4891 | else |
| 4885 | 4892 | { |
| 4886 | - puts ("no user."); | |
| 4893 | + if (nuser == -1) | |
| 4894 | + { | |
| 4895 | + puts ("no user."); | |
| 4896 | + } | |
| 4897 | + else | |
| 4898 | + { | |
| 4899 | + printf ("Blocked User:%-.24s\n", User[nuser].name); | |
| 4900 | + } | |
| 4887 | 4901 | SendResultPacket (psession->handle, -1); |
| 4888 | 4902 | } |
| 4889 | 4903 | } |
| @@ -4984,49 +4998,6 @@ | ||
| 4984 | 4998 | } |
| 4985 | 4999 | } |
| 4986 | 5000 | } |
| 4987 | - else if (packet[0] == HCLIT_DELUSER) | |
| 4988 | - { | |
| 4989 | - int nuser = SearchUser ((char *) (packet + 2)); | |
| 4990 | - puts ("attempt to delete."); | |
| 4991 | - if (nuser != -1) | |
| 4992 | - { | |
| 4993 | - int i; | |
| 4994 | - const unsigned char *p = packet + 2 + USERNAME_LEN; | |
| 4995 | - char uname[USERNAME_LEN]; | |
| 4996 | - char work[PASSWORD_LEN]; | |
| 4997 | - memcpy (uname, User[nuser].name, USERNAME_LEN); | |
| 4998 | - printf ("User name:%-16.24s\n", uname); | |
| 4999 | - for (i = 0; i < PASSWORD_LEN; i++) | |
| 5000 | - { | |
| 5001 | - if (*(p + i) == '\0') | |
| 5002 | - { | |
| 5003 | - break; | |
| 5004 | - } | |
| 5005 | - work[i] = *(p + i); | |
| 5006 | - } | |
| 5007 | - for (; i < PASSWORD_LEN; i++) | |
| 5008 | - { | |
| 5009 | - work[i] = ' '; | |
| 5010 | - } | |
| 5011 | - if (memcmp (User[nuser].password, work, PASSWORD_LEN) == 0) | |
| 5012 | - { | |
| 5013 | - /* ok. delete this user. */ | |
| 5014 | - puts ("OK. delete this user."); | |
| 5015 | - DeleteUser (nuser); | |
| 5016 | - SendResultPacket (psession->handle, 0); | |
| 5017 | - } | |
| 5018 | - else | |
| 5019 | - { | |
| 5020 | - puts ("password mismatch."); | |
| 5021 | - SendResultPacket (psession->handle, -1); | |
| 5022 | - } | |
| 5023 | - } | |
| 5024 | - else | |
| 5025 | - { | |
| 5026 | - puts ("no user."); | |
| 5027 | - SendResultPacket (psession->handle, -1); | |
| 5028 | - } | |
| 5029 | - } | |
| 5030 | 5001 | } |
| 5031 | 5002 | return ret; |
| 5032 | 5003 | } |
| @@ -5487,7 +5458,7 @@ | ||
| 5487 | 5458 | { |
| 5488 | 5459 | char work[MESG_BUFFER]; |
| 5489 | 5460 | unsigned n = ntohl (*(unsigned long *) (p + USERNAME_LEN)); |
| 5490 | - unsigned ntax = n / 100; | |
| 5461 | + unsigned ntax = (nuser != 0) ? (n / 100) : 0; | |
| 5491 | 5462 | if (User[nuser].score < n + ntax) |
| 5492 | 5463 | { |
| 5493 | 5464 | /* no score */ |
| @@ -5528,6 +5499,64 @@ | ||
| 5528 | 5499 | return; |
| 5529 | 5500 | } |
| 5530 | 5501 | |
| 5502 | +/* block or recover user account */ | |
| 5503 | +static void | |
| 5504 | +doJailAccount (unsigned char *p) | |
| 5505 | +{ | |
| 5506 | + int ntarget = SearchUser ((char *) p); | |
| 5507 | + if (ntarget != -1) | |
| 5508 | + { | |
| 5509 | + unsigned char action = *(p + USERNAME_LEN); | |
| 5510 | + if (action) | |
| 5511 | + { | |
| 5512 | + /* block user account */ | |
| 5513 | + puts ("block user account"); | |
| 5514 | + printf ("User %d [%-.24s]\n", ntarget, User[ntarget].name); | |
| 5515 | + DisconnectUser (ntarget); | |
| 5516 | + User[ntarget].account_status = AccountBlock; | |
| 5517 | + } | |
| 5518 | + else | |
| 5519 | + { | |
| 5520 | + /* recover user account */ | |
| 5521 | + puts ("recover user account"); | |
| 5522 | + printf ("User %d [%-.24s]\n", ntarget, User[ntarget].name); | |
| 5523 | + User[ntarget].account_status = AccountActive; | |
| 5524 | + } | |
| 5525 | + } | |
| 5526 | + return; | |
| 5527 | +} | |
| 5528 | + | |
| 5529 | +/* execute admin command */ | |
| 5530 | +static void | |
| 5531 | +doAdminCommand (unsigned char *p) | |
| 5532 | +{ | |
| 5533 | + unsigned n; | |
| 5534 | + switch (*p) | |
| 5535 | + { | |
| 5536 | + case 1: | |
| 5537 | + /* gain score */ | |
| 5538 | + n = ntohl (*(unsigned long *) (p + 1)); | |
| 5539 | + add_score (0, n); | |
| 5540 | + break; | |
| 5541 | + case 2: | |
| 5542 | + /* gain HP */ | |
| 5543 | + n = ntohl (*(unsigned long *) (p + 1)); | |
| 5544 | + cause_heal (0, n); | |
| 5545 | + default: | |
| 5546 | + printf ("unknown admin command %02X\n", (unsigned) *p); | |
| 5547 | + break; | |
| 5548 | + } | |
| 5549 | + return; | |
| 5550 | +} | |
| 5551 | + | |
| 5552 | +/* shutdown server */ | |
| 5553 | +static void | |
| 5554 | +doShutDownServer (void) | |
| 5555 | +{ | |
| 5556 | + NowRunning = 0; | |
| 5557 | + return; | |
| 5558 | +} | |
| 5559 | + | |
| 5531 | 5560 | /* parse user command */ |
| 5532 | 5561 | static void |
| 5533 | 5562 | parseCommand (int nuser, unsigned char *packet) |
| @@ -5689,9 +5718,59 @@ | ||
| 5689 | 5718 | case HCLIT_TRANSFERSCORE: |
| 5690 | 5719 | doTransferScore (nuser, packet + 2); |
| 5691 | 5720 | break; |
| 5721 | + case HCLIT_DELUSER: | |
| 5722 | + puts ("attempt to delete."); | |
| 5723 | + if (nuser == 0) | |
| 5724 | + { | |
| 5725 | + /* for administrator */ | |
| 5726 | + int ntarget = SearchUser ((char *) (packet + 2)); | |
| 5727 | + if (ntarget != -1) | |
| 5728 | + { | |
| 5729 | + char uname[USERNAME_LEN]; | |
| 5730 | + memcpy (uname, User[nuser].name, USERNAME_LEN); | |
| 5731 | + printf ("Delete User name:%-.24s\n", uname); | |
| 5732 | + DeleteUser (nuser); | |
| 5733 | + SendResultPacket (User[nuser].session.handle, 0); | |
| 5734 | + } | |
| 5735 | + else | |
| 5736 | + { | |
| 5737 | + puts ("no user."); | |
| 5738 | + SendResultPacket (User[nuser].session.handle, -1); | |
| 5739 | + } | |
| 5740 | + } | |
| 5741 | + else | |
| 5742 | + { | |
| 5743 | + printf ("User:%d [%-.24s] is cracking!\n", nuser, User[nuser].name); | |
| 5744 | + SendResultPacket (User[nuser].session.handle, -1); | |
| 5745 | + } | |
| 5746 | + break; | |
| 5692 | 5747 | case HCLIT_LOGOFF: |
| 5693 | 5748 | doLogoff (nuser); |
| 5694 | 5749 | break; |
| 5750 | + case HCLIT_JAILUSER: | |
| 5751 | + if (nuser == 0) | |
| 5752 | + { | |
| 5753 | + /* for administrator */ | |
| 5754 | + /* block or recover user account */ | |
| 5755 | + doJailAccount (packet + 2); | |
| 5756 | + } | |
| 5757 | + break; | |
| 5758 | + case HCLIT_ADMINCMD: | |
| 5759 | + if (nuser == 0) | |
| 5760 | + { | |
| 5761 | + /* for administrator */ | |
| 5762 | + /* execute admin command */ | |
| 5763 | + doAdminCommand (packet + 2); | |
| 5764 | + } | |
| 5765 | + break; | |
| 5766 | + case HCLIT_SHUTDOWN: | |
| 5767 | + if (nuser == 0) | |
| 5768 | + { | |
| 5769 | + /* for administrator */ | |
| 5770 | + /* shutdown server */ | |
| 5771 | + doShutDownServer (); | |
| 5772 | + } | |
| 5773 | + break; | |
| 5695 | 5774 | } |
| 5696 | 5775 | return; |
| 5697 | 5776 | } |
| @@ -82,6 +82,9 @@ | ||
| 82 | 82 | #define HCLIT_LOGOFF 0x3a |
| 83 | 83 | #define HCLIT_NEWUSER 0x3b |
| 84 | 84 | #define HCLIT_DELUSER 0x3c |
| 85 | +#define HCLIT_JAILUSER 0x3d | |
| 86 | +#define HCLIT_ADMINCMD 0x3e | |
| 87 | +#define HCLIT_SHUTDOWN 0x3f | |
| 85 | 88 | |
| 86 | 89 | /* map data */ |
| 87 | 90 | #define HCLIT_MAP_INVALID '?' |