]> git.pld-linux.org Git - packages/screen.git/blob - screen-debian.patch
pam support && misc fixes
[packages/screen.git] / screen-debian.patch
1 diff -urN screen-3.9.8.org/Makefile.in screen-3.9.8/Makefile.in
2 --- screen-3.9.8.org/Makefile.in        Sun Dec  3 12:12:06 2000
3 +++ screen-3.9.8/Makefile.in    Sun Dec  3 12:15:50 2000
4 @@ -21,10 +21,10 @@
5  ETCSCREENRC = `sed < config.h -n -e '/define ETCSCREENRC/s/^.*"\([^"]*\)"/\1/p'`
6  
7  CC = @CC@
8 -CFLAGS = -O
9 +CFLAGS = @CFLAGS@ @USEPAM@
10  CPPFLAGS = @CPPFLAGS@
11  LDFLAGS =
12 -LIBS = @LIBS@
13 +LIBS = @LIBS@ @LIBPAM@
14  
15  CPP=@CPP@
16  CPP_DEPEND=$(CC) -MM
17 diff -urN screen-3.9.8.org/attacher.c screen-3.9.8/attacher.c
18 --- screen-3.9.8.org/attacher.c Sun Dec  3 12:12:05 2000
19 +++ screen-3.9.8/attacher.c     Sun Dec  3 12:12:24 2000
20 @@ -33,6 +33,10 @@
21  #include "screen.h"
22  #include "extern.h"
23  
24 +#ifdef USE_PAM
25 +#include <security/pam_appl.h>
26 +#endif /* USE_PAM */
27 +
28  #include <pwd.h>
29  
30  static sigret_t AttacherSigInt __P(SIGPROTOARG);
31 @@ -69,6 +73,10 @@
32  # endif
33  #endif
34  
35 +#ifdef USE_PAM
36 +static char *PAM_password;
37 +static char *PAM_name;
38 +#endif
39  
40  #ifdef MULTIUSER
41  static int ContinuePlease;
42 @@ -718,14 +726,67 @@
43      }
44  }                              /* LockTerminal */
45  
46 +#ifdef USE_PAM
47 +static int PAM_conv (int num_msg,
48 +             const struct pam_message **msg,
49 +             struct pam_response **resp,
50 +             void *appdata_ptr) {
51 +    int replies = 0;
52 +    struct pam_response *reply = NULL;
53 +
54 +    reply = malloc(sizeof(struct pam_response)*num_msg);
55 +    if (!reply) return PAM_CONV_ERR;
56 +    #define COPY_STRING(s) (s) ? strdup(s) : NULL
57 +
58 +    for (replies = 0; replies < num_msg; replies++) {
59 +        switch (msg[replies]->msg_style) {
60 +        case PAM_PROMPT_ECHO_OFF:
61 +            /* wants password */
62 +            reply[replies].resp_retcode = PAM_SUCCESS;
63 +            reply[replies].resp = COPY_STRING(PAM_password);
64 +            break;
65 +        case PAM_TEXT_INFO:
66 +            /* ignore the informational mesage */
67 +            /* but first clear out any drek left by malloc */
68 +            reply[replies].resp = NULL;
69 +            break;
70 +        case PAM_PROMPT_ECHO_ON:
71 +            /* user name given to PAM already */
72 +            /* fall through */
73 +        default:
74 +            /* unknown or PAM_ERROR_MSG */
75 +            free (reply);
76 +            return PAM_CONV_ERR;
77 +        }
78 +    }
79 +    *resp = reply;
80 +    return PAM_SUCCESS;
81 +}
82 +
83 +static struct pam_conv PAM_conversation = {
84 +    &PAM_conv,
85 +    NULL
86 +};
87 +#endif
88 +
89 +
90  /* -- original copyright by Luigi Cannelloni 1985 (luigi@faui70.UUCP) -- */
91  static void
92  screen_builtin_lck()
93  {
94    char fullname[100], *cp1, message[100 + 100];
95 -  char *pass, mypass[9];
96 +  char *pass;
97 +#ifdef USE_PAM
98 +  int pam_error;
99 +  pam_handle_t *pamh = NULL;
100 +#else
101 +  char mypass[9];
102 +#endif /* USE_PAM */
103  
104    pass = ppp->pw_passwd;
105 +
106 +#ifndef USE_PAM 
107 +  /* if we're using PAM this will evaluate to true. which we don't want. */
108    if (pass == 0 || *pass == 0)
109      {
110        if ((pass = getpass("Key:   ")))
111 @@ -752,6 +813,7 @@
112          }
113        pass = 0;
114      }
115 +#endif /* USE_PAM */
116  
117    debug("screen_builtin_lck looking in gcos field\n");
118    strncpy(fullname, ppp->pw_gecos, sizeof(fullname) - 9);
119 @@ -780,6 +842,22 @@
120            AttacherFinit(SIGARG);
121            /* NOTREACHED */
122          }
123 +#ifdef USE_PAM
124 +               PAM_password=cp1;
125 +               PAM_name=ppp->pw_name;
126 +
127 +           pam_error = pam_start("screen", PAM_name, &PAM_conversation, &pamh);
128 +
129 +               if (pam_error == PAM_SUCCESS) {
130 +                       pam_error = pam_authenticate(pamh, 0);
131 +                       pam_end(pamh, PAM_SUCCESS);
132 +                       if (pam_error == PAM_SUCCESS) {
133 +                               memset(cp1,0,strlen(cp1));
134 +                               PAM_password = NULL; 
135 +                               break;
136 +                       }
137 +               }
138 +#else
139        if (pass)
140          {
141            if (!strncmp(crypt(cp1, pass), pass, strlen(pass)))
142 @@ -790,6 +868,7 @@
143            if (!strcmp(cp1, mypass))
144              break;
145          }
146 +#endif
147        debug("screen_builtin_lck: NO!!!!!\n");
148      }
149    debug("password ok.\n");
150 diff -urN screen-3.9.8.org/config.h.in screen-3.9.8/config.h.in
151 --- screen-3.9.8.org/config.h.in        Sun Dec  3 12:12:06 2000
152 +++ screen-3.9.8/config.h.in    Sun Dec  3 12:12:24 2000
153 @@ -565,6 +565,11 @@
154   */
155  #undef HAVE_SVR4_PTYS
156  
157 +/*
158 + * define HAVE_GETPT if you have the getpt() function.
159 + */
160 +#undef HAVE_GETPT
161 +
162  /* 
163   * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen
164   * to unusual environments. E.g. For SunOs the defaults are "qpr" and 
165 diff -urN screen-3.9.8.org/configure.in screen-3.9.8/configure.in
166 --- screen-3.9.8.org/configure.in       Sun Dec  3 12:12:06 2000
167 +++ screen-3.9.8/configure.in   Sun Dec  3 12:12:24 2000
168 @@ -28,6 +28,8 @@
169  [echo "$1" 1>&AC_FD_MSG
170  ])dnl
171  
172 +AC_ARG_WITH(libpam, [  --with-libpam           use libpam for PAM support])
173 +
174  dnl
175  dnl Extract version from patchlevel.h
176  dnl
177 @@ -648,6 +650,7 @@
178  if test -c /dev/ptmx ; then
179  AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],AC_DEFINE(HAVE_SVR4_PTYS))
180  fi
181 +AC_CHECK_FUNCS(getpt)
182  
183  AC_CHECKING(for ptyranges)
184  if test -d /dev/ptym ; then
185 @@ -1044,6 +1047,31 @@
186  fi
187  )
188  fi
189 +
190 +AC_SUBST(LIBPAM)
191 +AC_SUBST(USEPAM)
192 +if test "$with_libpam" = "yes"; then
193 +       dnl AC_CHECK_LIB(pam, pam_start, AC_DEFINE(PAM) LIBPAM=-lpam)
194 +       dnl the above doesn't work as there is no libpam.a (only .so)
195 +       dnl XXX - libpam_misc is probably Linux-PAM specific
196 +       LIBPAM="-lpam -lpam_misc -ldl"
197 +       USEPAM="-DUSE_PAM"
198 +       AC_DEFINE(PAM)
199 +#      AC_CACHE_CHECK(whether pam_strerror needs two arguments,
200 +#              ac_cv_pam_strerror_needs_two_args,
201 +#              AC_TRY_COMPILE(
202 +#                              [#include <security/pam_appl.h>],
203 +#                              [ pam_handle_t *pamh; pam_strerror(pamh, PAM_SUCCESS);
204 +#      ],
205 +#                              ac_cv_pam_strerror_needs_two_args=yes,
206 +#                              ac_cv_pam_strerror_needs_two_args=no
207 +#              )
208 +#      )
209 +#      if test "$ac_cv_pam_strerror_needs_two_args" = "yes"; then
210 +#                      AC_DEFINE(PAM_STRERROR_NEEDS_TWO_ARGS)
211 +#      fi
212 +fi
213 +
214  
215  dnl AC_CHECK_HEADER(shadow.h, AC_DEFINE(SHADOWPW))
216  AC_CHECKING(getspnam)
217
218 diff -urN screen-3.9.8.org/etc/etcscreenrc screen-3.9.8/etc/etcscreenrc
219 --- screen-3.9.8.org/etc/etcscreenrc    Sun Dec  3 12:12:06 2000
220 +++ screen-3.9.8/etc/etcscreenrc        Sun Dec  3 12:12:24 2000
221 @@ -1,6 +1,6 @@
222  #3.3
223  # This is a global screenrc file
224 -# Install this file as /usr/local/etc/screenrc. See config.h
225 +# Install this file as /etc/screenrc. See config.h
226  #
227  # Flaws of termcap and standard settings are done here.
228  # Note: This file should not be shared between different hosts.
229 @@ -97,3 +97,6 @@
230  # colon takes a parameter since screen-3.8.6
231  bind 'R' colon "screen -ln rlogin faui -8^b^b^b"
232  bind 'P' colon "^p"
233 +
234 +# On Debian GNU/Linux, `<--' (Backspace key) should send char `\177':
235 +bindkey -k kb stuff "\177"
236 diff -urN screen-3.9.8.org/fileio.c screen-3.9.8/fileio.c
237 --- screen-3.9.8.org/fileio.c   Sun Dec  3 12:12:05 2000
238 +++ screen-3.9.8/fileio.c       Sun Dec  3 12:12:24 2000
239 @@ -364,7 +364,7 @@
240      case DUMP_EXCHANGE:
241        strncpy(fn, BufferFile, sizeof(fn) - 1);
242        fn[sizeof(fn) - 1] = 0;
243 -      public = !strcmp(fn, DEFAULT_BUFFERFILE);
244 +      public = !strcmp(fn, bufferfile);
245  # ifdef HAVE_LSTAT
246        exists = !lstat(fn, &stb);
247        if (public && exists && (S_ISLNK(stb.st_mode) || stb.st_nlink > 1))
248 diff -urN screen-3.9.8.org/os.h screen-3.9.8/os.h
249 --- screen-3.9.8.org/os.h       Sun Dec  3 12:12:05 2000
250 +++ screen-3.9.8/os.h   Sun Dec  3 12:12:23 2000
251 @@ -82,6 +82,9 @@
252  #  undef strlen
253  # else /* NEWSOS */
254  #  include <strings.h>
255 +#  if defined(__GLIBC__) && (__GLIBC__ >= 2)
256 +#   include <string.h>
257 +#  endif
258  # endif /* NEWSOS */
259  #else /* SYSV */
260  # if defined(SVR4) || defined(NEWSOS)
261 diff -urN screen-3.9.8.org/process.c screen-3.9.8/process.c
262 --- screen-3.9.8.org/process.c  Sun Dec  3 12:12:05 2000
263 +++ screen-3.9.8/process.c      Sun Dec  3 12:12:24 2000
264 @@ -1944,7 +1944,7 @@
265  #ifdef COPY_PASTE
266      case RC_BUFFERFILE:
267        if (*args == 0)
268 -       BufferFile = SaveStr(DEFAULT_BUFFERFILE);
269 +       BufferFile = SaveStr(bufferfile);
270        else if (ParseSaveStr(act, &BufferFile))
271          break;
272        if (msgok)
273 diff -urN screen-3.9.8.org/pty.c screen-3.9.8/pty.c
274 --- screen-3.9.8.org/pty.c      Sun Dec  3 12:12:05 2000
275 +++ screen-3.9.8/pty.c  Sun Dec  3 12:12:24 2000
276 @@ -242,11 +242,15 @@
277  {
278    register int f;
279    char *m, *ptsname();
280 -  int unlockpt __P((int)), grantpt __P((int));
281 +  int unlockpt __P((int)), grantpt __P((int)), getpt __P((void));
282    sigret_t (*sigcld)__P(SIGPROTOARG);
283  
284 +#ifdef HAVE_GETPT
285 +  if ((f = getpt()) == -1)
286 +#else
287    strcpy(PtyName, "/dev/ptmx");
288    if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
289 +#endif
290      return -1;
291  
292    /*
293 diff -urN screen-3.9.8.org/screen.c screen-3.9.8/screen.c
294 --- screen-3.9.8.org/screen.c   Sun Dec  3 12:12:05 2000
295 +++ screen-3.9.8/screen.c       Sun Dec  3 12:15:09 2000
296 @@ -103,6 +103,7 @@
297  FILE *dfp;
298  #endif
299  
300 +char bufferfile[MAXPATHLEN];
301  
302  extern char *blank, *null, Term[], screenterm[], **environ, Termcap[];
303  int force_vt = 1;
304 @@ -260,7 +261,7 @@
305  char *name;
306  struct passwd *ppp;
307  {
308 -  int n;
309 +  int n, len;
310  #ifdef SHADOWPW
311    struct spwd *sss = NULL;
312    static char *spw = NULL;
313 @@ -274,13 +275,19 @@
314  pw_try_again:
315  #endif
316    n = 0;
317 +  len = 13;
318    if (ppp->pw_passwd[0] == '#' && ppp->pw_passwd[1] == '#' &&
319        strcmp(ppp->pw_passwd + 2, ppp->pw_name) == 0)
320      n = 13;
321 -  for (; n < 13; n++)
322 +  else if (!strncmp(ppp->pw_passwd, "$1$", 3)) {      /* MD5-based passwords */
323 +    n = 13;
324 +    len = 34;
325 +  }
326 +  for (; n < len; n++)
327      {
328        char c = ppp->pw_passwd[n];
329        if (!(c == '.' || c == '/' || c == '$' ||
330 +            (len == 34 && c == '$') ||
331             (c >= '0' && c <= '9') || 
332             (c >= 'a' && c <= 'z') || 
333             (c >= 'A' && c <= 'Z'))) 
334 @@ -421,9 +428,6 @@
335    logtstamp_string = SaveStr("-- %n:%t -- time-stamp -- %M/%d/%y %c:%s --\n");
336    hstatusstring = SaveStr("%h");
337    captionstring = SaveStr("%3n %t");
338 -#ifdef COPY_PASTE
339 -  BufferFile = SaveStr(DEFAULT_BUFFERFILE);
340 -#endif
341    ShellProg = NULL;
342  #ifdef POW_DETACH
343    PowDetachString = 0;
344 @@ -840,6 +844,7 @@
345  #endif /* DEBUG */
346      }
347    
348 +  snprintf(bufferfile,sizeof(bufferfile),"%s/.screen-exchange", home);
349  #ifdef _MODE_T
350    oumask = umask(0);           /* well, unsigned never fails? jw. */
351  #else
352 @@ -916,8 +921,8 @@
353                 Panic(0, "'%s' must be a directory.", SockDir);
354                if (eff_uid == 0 && real_uid && st.st_uid != eff_uid)
355                 Panic(0, "Directory '%s' must be owned by root.", SockDir);
356 -             n = (eff_uid == 0 && (real_uid || (st.st_mode & 0775) != 0775)) ? 0755 :
357 -                 (eff_gid == st.st_gid && eff_gid != real_gid) ? 0775 :
358 +             n = (eff_gid == st.st_gid && eff_gid != real_gid) ? 0775 :
359 +                 (eff_uid == 0 && (real_uid || (st.st_mode & 0777) != 0777)) ? 0755 :
360                   0777;
361               if ((st.st_mode & 0777) != n)
362                 Panic(0, "Directory '%s' must have mode %03o.", SockDir, n);
363 diff -urN screen-3.9.8.org/screen.h screen-3.9.8/screen.h
364 --- screen-3.9.8.org/screen.h   Sun Dec  3 12:12:05 2000
365 +++ screen-3.9.8/screen.h       Sun Dec  3 12:12:23 2000
366 @@ -44,6 +44,7 @@
367  #include "layer.h"
368  #include "term.h"
369  
370 +extern char bufferfile[MAXPATHLEN];
371  
372  #ifdef DEBUG
373  # define STATIC                /* a function that the debugger should see */
374 diff -urN screen-3.9.8.org/terminfo/screencap screen-3.9.8/terminfo/screencap
375 --- screen-3.9.8.org/terminfo/screencap Sun Dec  3 12:12:06 2000
376 +++ screen-3.9.8/terminfo/screencap     Sun Dec  3 12:12:24 2000
377 @@ -9,7 +9,7 @@
378         :AL=\E[%dL:dl=\E[M:DL=\E[%dM:cs=\E[%i%d;%dr:dc=\E[P:\
379         :DC=\E[%dP:im=\E[4h:ei=\E[4l:IC=\E[%d@:\
380         :ks=\E[?1h\E=:ke=\E[?1l\E>:vb=\Eg:\
381 -       :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\
382 +       :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=\177:\
383         :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
384         :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
385         :kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:@7=\E[4~:kP=\E[5~:\
386 diff -urN screen-3.9.8.org/terminfo/screeninfo.src screen-3.9.8/terminfo/screeninfo.src
387 --- screen-3.9.8.org/terminfo/screeninfo.src    Sun Dec  3 12:12:06 2000
388 +++ screen-3.9.8/terminfo/screeninfo.src        Sun Dec  3 12:12:24 2000
389 @@ -9,7 +9,7 @@
390         dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
391         enacs=\E(B\E)0, home=\E[H,
392         ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
393 -       ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB,
394 +       ind=\n, is2=\E)0, kbs=\177, kcub1=\EOD, kcud1=\EOB,
395         kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP,
396         kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ,
397         kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~,
398 @@ -33,7 +33,7 @@
399         dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
400         enacs=\E(B\E)0, home=\E[H,
401         ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
402 -       ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB,
403 +       ind=\n, is2=\E)0, kbs=\177, kcub1=\EOD, kcud1=\EOB,
404         kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP,
405         kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ,
406         kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~,
407 diff -urN screen-3.9.8.org/window.c screen-3.9.8/window.c
408 --- screen-3.9.8.org/window.c   Sun Dec  3 12:12:05 2000
409 +++ screen-3.9.8/window.c       Sun Dec  3 12:12:24 2000
410 @@ -1517,6 +1517,12 @@
411         FreePseudowin(w);
412         return -1;
413        }
414 +    if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
415 +      {
416 +       Msg(errno, "TIOCPKT ioctl on parent");
417 +       FreePseudowin(w);
418 +       return -1;
419 +      }
420    }
421  #endif /* TIOCPKT */
422    
423 @@ -1553,6 +1559,14 @@
424    evdeq(&pwin->p_writeev);
425    free((char *)pwin);
426    w->w_pwin = NULL;
427 +#ifdef TIOCPKT
428 +  {
429 +    int flag = 1;
430 +
431 +    if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
432 +      Msg(errno, "TIOCPKT reset on parent failed");
433 +  }
434 +#endif /* TIOCPKT */
435  }
436  
437  #endif /* PSEUDOS */
This page took 0.160252 seconds and 4 git commands to generate.