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

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기능은 되지 않는다는 글이 다시 올라왔었습니다.
참고하시기 바랍니다.

홈지기 "그륨"
번호 제목 글쓴이 날짜 조회 수
57 도배방지 그리움 2007.04.12 222
56 그룹경험치 소스 그리움 2007.04.12 220
55 패거리전쟁중 "휴전" 그리움 2007.04.12 220
54 직업 추가하기 그리움 2007.04.12 218
53 자동으로 돈줍기 소스 그리움 2007.04.12 213
52 경매는 이렇게 그리움 2007.04.12 213
51 어디 그리움 2007.04.12 211
50 무한에서 안시 넣는 방법 그리움 2007.04.12 210
49 방설명 지우기 그리움 2007.04.12 209
48 특수 아이템 만들기 그리움 2007.04.12 209
47 복권 소스 그리움 2007.04.12 207
46 혼자 말하는 몹 그리움 2007.04.12 206
45 자동 이벤트 그리움 2007.04.12 204
44 낮과 밤이 되면 어둡고 환하게 그리움 2007.04.12 203
43 귀환장소 변경 소스 #1 그리움 2007.04.12 202
42 개량형 우체국 그리움 2007.04.12 202
41 주문추가 소스 그리움 2007.04.12 201
40 출구모양 개량 소스 그리움 2007.04.12 201
39 자동수련 소스 그리움 2007.04.12 201
38 잡담 안시 사용하기 그리움 2007.04.12 200


XE Login