add another one useful for .profile
[shellsnippets/shellsnippets.git] / mksh / ldap_user_info.cgi
1 #!/bin/mksh
2 # $Id: ui.cgi 5123 2017-01-16 16:10:38Z tglase $
3 # root@dev:/var/www/tarentpgp/ui.cgi
4 #-
5 # Copyright (c) 2009, 2010, 2012
6 #       mirabilos <t.glaser@tarent.de>
7 # Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009
8 #       Thorsten Glaser <tg@mirbsd.org>
9 #
10 # Provided that these terms and disclaimer and all copyright notices
11 # are retained or reproduced in an accompanying document, permission
12 # is granted to deal in this work without restriction, including un-
13 # limited rights to use, publicly perform, distribute, sell, modify,
14 # merge, give away, or sublicence.
15 #
16 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
17 # the utmost extent permitted by applicable law, neither express nor
18 # implied; without malicious intent or gross negligence. In no event
19 # may a licensor, author or contributor be held liable for indirect,
20 # direct, other damage, loss, or other issues arising in any way out
21 # of dealing in the work, even if advised of the possibility of such
22 # damage or existence of a defect, except proven that it results out
23 # of said person's immediate fault when using the work as intended.
24
25 # for debugging {{{
26 #print Content-type: text/plain
27 #print
28 #exec 2>&1
29 #set -x
30 # end debugging }}}
31
32 # basic input validation
33 if [[ $AUTH_TYPE != Basic || $HTTPS != on || -z $REMOTE_USER || \
34     $REQUEST_METHOD != GET || -n $QUERY_STRING ]]; then
35         print Status: 400 Bad Request
36         print
37         print Sorry, use the script or leave it.
38         exit 1
39 fi
40
41 ### BEGIN imported code {{{
42 # From MirOS: src/bin/mksh/dot.mkshrc,v 1.43 2009/05/31 17:17:33 tg Rel $
43
44 allu=QWERTYUIOPASDFGHJKLZXCVBNM
45 alll=qwertyuiopasdfghjklzxcvbnm
46 alln=0123456789
47
48 function Lb64decode {
49         typeset u=$-
50         set +U
51         typeset c s="$*" t=
52         [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
53         typeset -i i=0 n=${#s} p=0 v x
54         typeset -i16 o
55
56         while (( i < n )); do
57                 c=${s:(i++):1}
58                 case $c {
59                 (=)     break ;;
60                 ([A-Z]) (( v = 1#$c - 65 )) ;;
61                 ([a-z]) (( v = 1#$c - 71 )) ;;
62                 ([0-9]) (( v = 1#$c + 4 )) ;;
63                 (+)     v=62 ;;
64                 (/)     v=63 ;;
65                 (*)     continue ;;
66                 }
67                 (( x = (x << 6) | v ))
68                 case $((p++)) {
69                 (0)     continue ;;
70                 (1)     (( o = (x >> 4) & 255 )) ;;
71                 (2)     (( o = (x >> 2) & 255 )) ;;
72                 (3)     (( o = x & 255 ))
73                         p=0
74                         ;;
75                 }
76                 t=$t\\x${o#16#}
77         done
78         print -n $t
79         [[ $u = *U* ]] && set -U
80         :
81 }
82
83 ### END imported code }}}
84
85 # get user information from LDAP
86 v_givenName=
87 v_mailPrimaryAddress=
88 v_o=
89 v_sn=
90 env LDAPTLS_CACERT=/etc/ssl/certs/dc.lan.tarent.de.cer \
91     ldapsearch -x -LLL -ZZ -H ldap://dc1.lan.tarent.de -b dc=tarent,dc=de \
92     uid="$REMOTE_USER" givenName mailPrimaryAddress o sn | \
93     tr '\n' '\ 1' | sed 's/\ 1 //g' | tr '\ 1' '\n' |&
94 while read -p key value; do
95         # parse ldap "foo:: BARINBASE64" lines
96         [[ $key = *:: ]] && value=$(Lb64decode "$value")
97         # parse ldap "foo: barunencoded" lines
98         key=${key%%*(:)}
99         eval v_$key=\$value
100 done
101
102 # required fields
103 if [[ -z $v_givenName || -z $v_mailPrimaryAddress || -z $v_sn ]]; then
104         print Status: 400 Bad Request
105         print
106         print You don\'t exist. Go away.
107         exit 1
108 fi
109
110 # output the response
111 print Content-type: text/plain
112 print Entropy: $RANDOM
113 print
114 print status ok
115 print name $v_givenName $v_sn
116 print mail $v_mailPrimaryAddress | tr $allu $alll
117 print comm $v_o
118 exit 0