/* vi:set tabstop=4 noautoindent nocindent: */ /** 認証サーバ Ver 3.4.0 Diffie-Hellman 対応 */ #include "authd.h" int PortNo = 9000; // デフォルトポート番号 int DaemonMode = ON; int NoCheckMode = OFF; int SecureMode = OFF; int NoChlngMode = OFF; int ADLdapMode = OFF; tList* Allow_IPaddr = NULL; char* IPaddr; char* MnName; char* Unknown_User = "unknown user"; unsigned char* IPaddr_num; /* コマンド解釈部 */ int command_pase(Buffer mesg, int sock) { int endflag = OFF; Buffer buf, dec, command, operand, comment; char* user_id; buf = make_Buffer(LBUF); dec = get_plain_sBuffer(mesg, CRYPT_SharedKey, CRYPT_Type); chomp_Buffer(&dec); command = get_command(dec); operand = get_operand(dec); comment = get_comment(dec); DEBUG_MODE print_message("CLIENT = %s\n", dec.buf); free_Buffer(&dec); if (!strcasecmp("HELLO", (char*)command.buf)){ command_HELLO(operand, comment, sock); } else if (!strcasecmp("KEYEX", (char*)command.buf)){ command_KEYEX(operand, comment, sock); } else if (!strcasecmp("CRYPT", (char*)command.buf)){ command_CRYPT(operand, comment, sock); } else if (!strcasecmp("USERID", (char*)command.buf)){ if (NoCheckMode==ON) { // デバッグ用 常にOKを返す tcp_send_crypt_mesg(sock, "OK\r\n", CRYPT_SharedKey, CRYPT_Type); DEBUG_MODE print_message("SERVER = OK by NoCheckMode.\n"); } else if (SecureMode==ON && CRYPT_SharedKey==NULL) { tcp_send_crypt_mesg(sock, "ERR 801 Secure Mode required CRYPT connection.\r\n", CRYPT_SharedKey, CRYPT_Type); DEBUG_MODE print_message("ERR 801 Secure Mode required CRYPT connection.\n"); endflag = ON; //socket_close(sock); } else if (NoChlngMode==ON && No_isNet_Chlng==FALSE) { tcp_send_crypt_mesg(sock, "ERR 802 Use NOCHLNG command.\r\n", CRYPT_SharedKey, CRYPT_Type); DEBUG_MODE print_message("ERR 802 Use NOCHLNG command.\n"); endflag = ON; //socket_close(sock); } else if (CRYPT_SharedKey==NULL && No_isNet_Chlng==TRUE) { tcp_send_crypt_mesg(sock, "ERR 803 CRYPT Algorism required at NOCHLNG connection.\r\n", CRYPT_SharedKey, CRYPT_Type); DEBUG_MODE print_message("ERR 803 CRYPT Algorism required at NOCHLNG connection.\n"); endflag = ON; //socket_close(sock); } else { command_USERID(operand, comment, sock); } } else if (!strcasecmp("PASSWD", (char*)command.buf)){ if (NoCheckMode==ON) { tcp_send_crypt_mesg(sock, "OK\r\n", CRYPT_SharedKey, CRYPT_Type); DEBUG_MODE print_message("SERVER = OK by NoCheckMode.\n"); } else { command_PASSWD(operand, comment, sock); } } else if (!strcasecmp("BYE", (char*)command.buf)){ command_BYE(operand, comment, sock); endflag = ON; } else { copy_s2Buffer("ERR 988 Unknown Command: ", &buf); cat_Buffer(&command, &buf); cat_s2Buffer(".\r\n", &buf); //tcp_send_sBufferln(sock, &buf); tcp_send_crypt_mesg(sock, (char*)buf.buf, CRYPT_SharedKey, CRYPT_Type); endflag = ON; if (User_ID==NULL) user_id = Unknown_User; else user_id = (char*)User_ID->buf; syslog(LOG_INFO, "[%s] %s: %s", IPaddr, user_id, buf.buf); DEBUG_MODE print_message("[%s] %s: %s", IPaddr, user_id, buf.buf); } if (endflag==ON) { socket_close(sock); if (User_ID==NULL) user_id = Unknown_User; else user_id = (char*)User_ID->buf; syslog(LOG_INFO, "[%s] %s: session end.\n", IPaddr, user_id); DEBUG_MODE print_message("[%s] %s: session end.\n", IPaddr, user_id); exit(0); } free_Buffer(&buf); free_Buffer(&command); free_Buffer(&operand); free_Buffer(&comment); return 0; } /* main関数 -p : 続いてポート番号を指定する. -k : 続いてキー保存ファイル名を指定する. -a : 続いて接続許可ファイル名を指定する. -f : 続いてプロセスIDファイル名を指定する. -i : started by inetd (no daemon mode) -s : セキュアモード(強制暗号化モード) -m : チャレンジキーを交換しないモードでのみ動作.セキュアモード指定した場合のみ有効 -l : AD & LDAP モード.強制的にセキュアモード&チャレンジキー非交換モードになる. -d : デバッグモード -n : no check mode -h : ヘルプ表示 -v : バージョン表示 */ int main(int argc, char** argv) { int i, port=0; int sofd, nsofd; socklen_t cdlen; struct sockaddr_in cl_addr; Buffer pki, dhkeyfile, allowfile, pidfile; dhkeyfile = make_Buffer(LNAME); allowfile = make_Buffer(LNAME); pidfile = make_Buffer(LNAME); for (i=1; i0) { cc = cat_Buffer(&buf, &msg); if (buf.buf[cc-1]==CHAR_LF) { command_pase(msg, sofd); clear_Buffer(&msg); } clear_Buffer(&buf); } } while (cc>0); if (cc<0) { tcp_send_mesgln(sofd, "ERR 999 Time Out."); syslog(LOG_INFO, "[%s] time out.\n", IPaddr); DEBUG_MODE print_message("[%s] time out.\n", IPaddr); } close(sofd); syslog(LOG_INFO, "[%s] session end.\n", IPaddr); DEBUG_MODE print_message("[%s] session end.\n", IPaddr); free_Buffer(&buf); free_Buffer(&msg); free(IPaddr); free(IPaddr_num); free(MnName); exit(0); } void interrupt(int signal) { exit(signal); }