암호 *****로 보이게 하기

2007.04.12 13:01

그리움 조회 수:181 추천:42

제 목 : [패치] 암호입력시 ****로 표시해주기. 찬성 : 0 반대 : 0
올린이 : croaky (서민철 ) 읽음 : 34 날짜 : 99/09/01 23:08
------------------------------------------------------------------------------
이 패치는 암호 입력을 할때 일반적인 비비에스처럼 **** 로 암호를 표시해주는
패치입니다.
물론, 이전에 제가 공개한 패치들처럼 이미 소스에 많은 수정을 한 사람들을
위해서, 패치로 만들지 않고, 고치는 방법을 적습니다.
이 패치안에는 cntl + enter 로 입력해야 엔터키가 입력되는 문제의 패치도
같이 포함된 것입니다.

아래의 코드에 대한 저작권은 본인에게 있으며, 상업적 목적의 머드에서는
사용할수 없습니다. 무료 운영중인 머드에서 사용시, 자유롭게 사용할수 있으나,
아래의 코드로 인해 발생되는 문제에 대해서 제가 반드시 답변을 한다거나
책임을 지지는 않습니다.
1999년 9월 1일.
서민철

-----------------------------------------------------------
Wicked Angel.. Network Programmer, Game Designer
E-Mail Address : croaky@frog.sarang.net croaky@nownuri.net
Home Page : http://frog.sarang.net/
-----------------------------------------------------------

1. mstruct.h

typedef struct iobuf { /* I/O buffers for players */
   char input[IBUFSIZE];
   char output[OBUFSIZE];
   short ihead, itail;
   short ohead, otail;
   void (*fn)();
   char fnparam;
   long ltime;
   char intrpt;
   char commands;
   int lookup_pid;
   char address[40];
   char userid[9];
   int telflag; /* 추가 부분 */
} iobuf;

2. command1.c

void login(fd, param, str)
int fd;
int param;
unsigned char *str;
{

/* 중략 */

/* 추가부분 */
   Ply[fd].io->telflag = 1;
   print(fd,"%c%c%c", 255,251,3);
   print(fd,"%c%c%c", 255,251,1);
/* 여기까지 */
   print(fd, "암호를 넣어 주십시요: ");
   RETURN(fd, login, 3);

/* 중략 */

else {
/* 추가부분 */
   Ply[fd].io->telflag = 0;
   print(fd, "%c%c%c\n",255,252,3);
/* 여기까지 */
   print(fd, "%c%c%c\n",255,252,1);
   strcpy(tempstr, Ply[fd].ply->name);
   for(i=0; i  
---
고치는 방법 :
print(fd,"%c%c%c", 255,251,1); 의 앞쪽에
Ply[fd].io->telflag = 1;
print(fd,"%c%c%c", 255,251,3); 을 추가해주고,
print(fd, "%c%c%c\n",255,252,1); 의 앞쪽에
Ply[fd].io->telflag = 0;
print(fd, "%c%c%c\n",255,252,3); 을 추가해줌.

create_ply() 함수에서의 암호입력 및 command11.c 에서의 암호변경 부분에서도
위와 같이 고쳐주십시요.

3. io.c

int accept_input(fd)
int fd;
{
/* 변경 부분 */
   unsigned char buf[128], lastchar;
/* 여기까지 */
   int i, n, prev, itail, ihead;

   n = read(fd, buf, 127);

   if(n<=0)
       Ply[fd].io->commands = -1; /* Connection dropped */

   else {
       ihead = Ply[fd].io->ihead;
       lastchar = 0;
       itail = Ply[fd].io->itail;
       for(i=0; i /* cntl + enter 입력 패치 */
/* 여기서 부터 추가 */
           if(Ply[fd].io->telflag < 1) {
               if(buf[i] == 0)
                   buf[i] = '\n';
               else if(buf[i] == 13 && i != n-1 &&
                   (buf[i+1] == '\n' || buf[i+1] == 0))
                   buf[i] = '\r';
               else if(buf[i] == 13)
                   buf[i] = '\n';
               else if(buf[i] == 10 && i < n-1 && buf[i+1] == 13)
                   continue;
               if(buf[i] == 255) continue;
               if(i > 0 && buf[i-1] == 255 &&
                   (buf[i] == 251 || buf[i] == 252 || buf[i] == 253
                   || buf[i] == 254)) {
                   i++;
                   continue;
               }
           }
           else {
               if(i > 0 && buf[i] == 0 && buf[i-1] == 13)
                   buf[i] = '\n';
               if(buf[i] == 255) continue;
               if(i > 0 && buf[i-1] == 255 &&
                   (buf[i] == 251 || buf[i] == 252 || buf[i] == 253
                   || buf[i] == 254)) {
                   i++;
                   continue;
               }
           }
            
/* 여기까지 */

           if(buf[i] > 31 || ((buf[i]&0x80) && (unsigned char)buf[i]!=155)
               || (buf[i] == '\n' && lastchar != '\r')
               || buf[i] == '\b' ||buf[i]==127) {
/* 추가 부분 */
               if(Ply[fd].io->telflag == 1) {
                   if(buf[i] < 253 && buf[i] != '\r' && buf[i] != '\n'
                       && buf[i] != '\b' && buf[i] != 127) {
                       write(fd, "*", 1);
                   }
                   else if(buf[i] == '\b' || buf[i] == 127) {
                       write(fd, "\b", 1);
                   }
                   else if(buf[i] == '\n') {
                       write(fd, "\n", 1);
                   }
               }
/* 여기까지 */

               if(buf[i]==127) buf[i]='\b';
               lastchar = buf[i];
               if(buf[i] == '\r') buf[i] = '\n';
               if(buf[i] == '\n') Ply[fd].io->commands++;
---
이하 원소스랑 동일

---
여기까지 한다면, 암호 입력이 비비에스처럼 **** 로 표시될것입니다.
단, telnet 의 옵션을 제대로 사용하지 못하는 italk 나 tt++ (패치되지 않은)
등의 클라이언트에서는 약간씩 에러가 나오게 됩니다.(심각한 에러는 아님.)
그리고 무한 소스에서의 정확한 테스트는 안해본 관계로 약간의 에러가 있을지도
모릅니다. (간단히 해본 테스트에선 별 문제 없었지만요.)

위의 내용에서 Ctrl+Enter기능은 되지 않는다는 글이 다시 올라왔었습니다.
참고하시기 바랍니다.

홈지기 "그륨"


XE Login