home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFV12J / HTACCFG.CMD < prev    next >
OS/2 REXX Batch file  |  1997-07-22  |  27KB  |  698 lines

  1. /*  */
  2. htaccfg:
  3.  
  4. CHECKIT=0   /* Change this to 0 if you want to enable REMOTE configuration by SUPERUSERS */
  5.  
  6. /* background color */
  7. USECOLOR='2dd52f'
  8.  
  9. /* ---------------- DO NOT MODIFY BELOW THIS LINE  ------------------ */
  10.  
  11.  
  12.  
  13. parse arg ddir,tempfile,sel,list,verb,uri,user,basedir,workdir,privset, ,
  14.                enmadd,transaction,verbose, ,
  15.               servername,host_nickname,homedir
  16.  
  17. if verb=" " then do
  18.     say " This SRE-Filter procedure is NOT meant to be run from the command line."
  19.    exit
  20. end  /* Do */
  21.  
  22. list=translate(list, ' ', '+'||'090a0d'x)  /* Whitespace, etc. */
  23. /* write results (2nd call */
  24. if pos('WRITETO=',translate(list))>0 then do
  25.    call writeres
  26.   return ' Results written '
  27. end
  28.  
  29.  
  30. who2=extract('CLIENTADDR')
  31. saddr2=extract('SERVERADDR')
  32.  
  33. NO_REM=VALUE('SREF_NO_REMOTE_CONFIG',,'OS2ENVIRONMENT')
  34.  
  35. select
  36.    when checkit=1 | no_rem>0 then do
  37.  
  38. /* only if user = serveraddress !!! */
  39.      if who2<>saddr2 | no_rem=2 then do
  40.  
  41.         call lineout tempfile, '<!doctype html public "-//IETF//DTD HTML 3.0//EN">'
  42.         call lineout tempfile, "<html><head><title>SRE-FILTER  remote configurator disabled </title>"
  43.         call lineout tempfile, '</head><body  bgcolor="#'||usecolor||'"> '
  44.  
  45.  
  46.         call lineout tempfile,' <strong> Action not allowed remotely.</strong> <pre>'
  47.         call lineout tempfile,' </body> </html> '
  48.         call lineout tempfile
  49.         'FILE ERASE TYPE text/html NAME' tempfile
  50.         return 'HTACCFG: action not allowed remotely. '
  51.      end
  52.    end
  53.    otherwise do
  54.       if wordpos('SUPERUSER',privset)=0 then do
  55.         'RESPONSE HTTP/1.0 401 Unauthorized '     /* Set HTTP response line */
  56.         'header add WWW-Authenticate: Basic Realm=<CONFIGURE>'  /* challenge */
  57.  
  58.         call lineout tempfile, '<!doctype html public "-//IETF//DTD HTML 3.0//EN">'
  59.         call lineout tempfile, "<html><head><title>Not authorized </title>"
  60.         call lineout tempfile, '</head><body  bgcolor="#'||usecolor||'"> '
  61.  
  62.         call lineout tempfile,' <strong> You do not have configuration rights.</strong> <pre>'
  63.         if who2=saddr2 then 
  64.                 call lineout tempfile,'<br> <Em> You may want to edit HTACCFG.CMD </em> '
  65.         call lineout tempfile,' </body> </html> '
  66.         call lineout tempfile
  67.          iia=dosdir(tempfile,'s')
  68.  
  69.         'FILE ERASE TYPE text/html NAME' tempfile
  70.         return '401 'iia' HTACCFG: not permitted to configure. '
  71.       end
  72.    end
  73. end
  74.  
  75.  
  76. htfile=' ' ;htacc=' '
  77. list=strip(list)
  78. DO UNTIL LIST=""
  79.     PARSE VAR  list a1 '&' list
  80.     parse var a1 avar '=' aval
  81.     if translate(avar)='HTFILE' then do
  82.          htfile=strip(translate(translate(packur(aval),'\','/')))
  83.          htfile=strip(htfile,'t','\')||'\'
  84.     end
  85.     if translate(avar)='ACCFILE' then
  86.          htacc=strip(translate(translate(packur(aval),'\','/')))
  87. end /* do */
  88. if left(htfile,1)='\' | pos(':',htfile)>0 then
  89.    nop
  90. else 
  91.    htfile=translate(ddir||htfile,'\','/')
  92.  
  93. if htacc=' ' then
  94.    htacc=get_value('htaccess_file')
  95.  
  96. if filespec('p',htfile)='\' then do
  97.    call lineout tempfile,' <h2> ' HTFILE ' not permitted </h2> '
  98.   call lineout tempfile,' Sorry, HTACCESS file can <strong>not</strong> be in the root'
  99.   call lineout tempfile, '</body> </html> '
  100.   call lineout tempfile
  101.   'file erase  type text/html name  ' tempfile
  102.   return 'htaccess not allowed in root '
  103. end
  104. if htfile=' '| htacc=' ' then do
  105.    call lineout tempfile,' <h2> Missing information </h2> '
  106.   call lineout tempfile,' Sorry, the directory, or the name for the HTACCESS file,'
  107.   call lineout tempfile,' was not specified.'
  108.   call lineout tempfile, '</body> </html> '
  109.   call lineout tempfile
  110.   'file erase  type text/html name  ' tempfile
  111.   return ' missing information '
  112. end /* do */
  113.  
  114.  
  115. HTFILE=STRIP(HTFILE); HTFILE=STRIP(HTFILE,'T','\')||'\'
  116. tmp1=get_htaccess(0,HTfile,HTACC,ddir,TEMPFILE,2)
  117.  
  118. parse var tmp1 gotlist ',' tmp1
  119. gotlist=strip(gotlist)
  120.  
  121. this1=htfile||htacc
  122. is1=stream(this1,'c','query exists')
  123.  
  124. vlist='GOTLIST AUTH.NAME AUTH.TYPE AUTH.USERFILE AUTH.GROUPFILE '
  125. vlist=vlist||'AUTH.INDEX REDIRECTFILE AUTH.LIMIT DIR.BUILD DIR.EXCLUDE '
  126. vlist=vlist||'DIR.INFO  DIR.DESCRIBE DIR.FORBID RX.BUILDdir RX.ENABLEPOSTPROCESS'
  127.  
  128. vlist2=' x AuthName AuthType AuthUserFile AuthGroupFile DefaultIndex RedirFile '
  129. vlist2=vlist2||' Limit BuildDir Dir.Exclude Dir.Info Dir.Describe Dir.Forbid '
  130. vlist2=vlist2||' Dir.Builder EnablePostProcess '
  131. gotlist0=gotlist
  132.  
  133. call lineout tempfile, '<!doctype html public "-//IETF//DTD HTML 3.0//EN">'
  134. call lineout tempfile, "<html><head><title>SRE-Filter HTACCESS configurator </title>"
  135. call lineout tempfile, '</head><body  bgcolor="#'||usecolor||'"> '
  136.  
  137. call lineout tempfile, "<h1> SRE-Filter: <A NAME="top"> HTACCESS Configurator </A>   </h1> <p>"
  138. call lineout tempfile,' <a href="#review"> Review current parameters & files for ' htfile '</a> ?'
  139.  
  140.  
  141. this1a=strip(this1,'t','.')
  142. foo=wordpos(translate(this1a),translate(gotlist))
  143. if foo>0 then do
  144.     gotlist=delword(gotlist,foo,1)
  145. end  /* Do */
  146.  
  147. call lineout tempfile,' <h2> For directory== ' translate(htfile) ' </h2>'
  148. call lineout tempfile,' <ul> '
  149. if is1=' ' then
  150.   call lineout tempfile,' <li> Currently, there is <strong> no</strong> HTACCESS file in: ' htfile
  151. else
  152.   call lineout tempfile,' <li> The HTACCESS file for ' htfile ' is: <strong> ' this1 '</strong>'
  153.  
  154.  
  155. if gotlist<>' ' then
  156.   call lineout tempfile,' <li> The set of HTACCESS files in the parent directories are: <strong> ' gotlist '</strong>'
  157.  
  158. call lineout tempfile,' </ul>'
  159.  
  160.  
  161. /* get "this files" parameter values (if accessible ) */
  162. if is1 =' ' then do
  163.    call lineout tempfile,' <hr width=30%> <h3> Creating: ' this1 ' </h3>  '
  164. /* initialize some variable */
  165.    auth.name=' '; auth.type=' ' ; auth.userfile=' ' ; auth.groupfile=' '
  166.    auth.index=' '; redirectfile=' '; auth.limit=' '; dir.exclude=' ';
  167.    dir.info=' ' ; dir.describe=' ' ; dir.forbid=' ' ; rx.builddir=' '
  168. end
  169. else do
  170.    tmp1=get_htaccess(0,HTfile,HTACC,ddir,TEMPFILE,3)
  171.  
  172.    do mm=1 to words(vlist)
  173.      parse var tmp1 aval ',' tmp1
  174.      avar=word(vlist,mm) ; aval=strip(aval)
  175.      call value avar,aval
  176.   end /* do */
  177.   call lineout tempfile,' <hr width=30%>  <h3> Modifying: ' this1 ' </h3>  '
  178. end
  179.  
  180. /* let user fill out form */
  181. CALL LINEOUT TEMPFILE,'<FORM ACTION="/HTACCFG" METHOD="POST">'
  182. call lineout tempfile,'<h3> Access control parameters </h3>'
  183.  
  184. ee=makeit('<b>One line comment:</b>','COMMENT',gotlist0,' ')
  185. call lineout tempfile,ee
  186.  
  187.  
  188. ee=makeit(' <p> <b>AuthName</b>: Authorization name (the REALM) ','AuthName',gotlist0,auth.name,10)
  189. call lineout tempfile,ee
  190.  
  191.  
  192. ischeck1=' ' ;IF translate(auth.type)='BASIC' then ischeck1='CHECKED'
  193. ischeck2=' ';IF translate(auth.type)='IDENT' then ischeck2='CHECKED'
  194. call lineout tempfile,' <p><b>AuthType</b>: Authorization type: '
  195. CALL LINEOUT TEMPFILE,' <INPUT TYPE=RADIO NAME="AuthType" VALUE="BASIC"' ISCHECK1 ' >BASIC ||'
  196. CALL LINEOUT TEMPFILE,'<INPUT TYPE=RADIO NAME="AuthType" VALUE="IDENT"' ISCHECK2 ' >IDENT '
  197.  
  198. ee=makeit('<b>AuthUserfile</b>: Userfile (contains usernames and passwords) ','AuthUserFile',gotlist0,auth.userfile)
  199. call lineout tempfile,ee
  200.  
  201. ee=makeit('<b>AuthGroupfile</b>: Group file (groups of users) ','AuthGroupFile',gotlist0,auth.groupfile)
  202. call lineout tempfile,ee
  203.  
  204.  
  205. if wordpos('REQUIRE',translate(auth.limit))=1 then
  206.    auth.limit=delword(auth.limit,1,1)
  207. ee=makeit('<b>Limit</b>:Allowed users list','Limit',gotlist0,auth.limit)
  208. call lineout tempfile,ee
  209.  
  210. call lineout tempfile, ' <p> <h3> Redirection, etc. parameters </h3>'
  211.  
  212. ee=makeit('<b>DefaultIndex</b>: Directory specific default documents ','DefaultIndex',gotlist0,auth.index)
  213. call lineout tempfile,ee
  214.  
  215. ee=makeit('<b>ReDirFile</b>: Redirection file ','ReDirFile',gotlist0,REDIRECTFILE)
  216. call lineout tempfile,ee
  217.  
  218.  
  219. call lineout tempfile,' <p><h3>Parameters used by dynamic directory list processor </h3>'
  220.  
  221. ischeck1=' ' ;IF dir.build=1 then ischeck1='CHECKED'
  222. ischeck2=' ';IF  dir.build=0 then ischeck2='CHECKED'
  223. call lineout tempfile,' <p> <B>BuildDir</b>:Enable dynamic directory list processor: '
  224. CALL LINEOUT TEMPFILE,' <INPUT TYPE=RADIO NAME="Builddir" VALUE="1"' ISCHECK1 ' >YES (allow) || '
  225. CALL LINEOUT TEMPFILE,'<INPUT TYPE=RADIO NAME="Builddir" VALUE="0"' ISCHECK2 ' >NO  (do not allow)'
  226.  
  227. ee=makeit('<b>Dir.Exclude</b>:Exclusion files (these files are not displayed) ', ,
  228.           'Dir.Exclude',gotlist0,dir.exclude)
  229. call lineout tempfile,ee
  230. ischeck1=' ' ;IF _diris=1 then ischeck1='CHECKED'
  231. ischeck0=' ';IF  _diris=0 then ischeck0='CHECKED'
  232. call lineout tempfile,' <br><blockquote> Reset list of exclusion files  '
  233. CALL LINEOUT TEMPFILE,'<menu> <li> <INPUT TYPE=RADIO NAME="_diris" VALUE="1" 'ischeck1' > YES (use _Dir.Exclude) '
  234. CALL LINEOUT TEMPFILE,'<li> <INPUT TYPE=RADIO NAME="_diris" VALUE="0" 'ischeck0'> NO  (use Dir.Exclude) </menu> </blockquote>'
  235.  
  236.  
  237.  
  238. ee=makeit('<b>Dir.Info</b>: Directory Info file (displayed at top of document) ', ,
  239.           'Dir.Info',gotlist0,dir.info)
  240. call lineout tempfile,ee
  241.  
  242.  
  243. ee=makeit('<b>Dir.Describe</b>:File description file (per entry descriptions) ', ,
  244.           'Dir.Describe',gotlist0,dir.describe)
  245. call lineout tempfile,ee
  246.  
  247. ee=makeit('<b>Dir.Builder:</b> Name of dynamic directory list processor ', ,
  248.           'Dir.Builder',gotlist0,rx.builddir)
  249. call lineout tempfile,ee
  250.  
  251. ischeck1=' ' ;IF dir.forbid=1 then ischeck1='CHECKED'
  252. ischeck2=' ';IF  dir.forbid=0 then ischeck2='CHECKED'
  253. call lineout tempfile,' <p><b>Dir.Forbid</b>: Prevent directory list processor from displaying directory: <menu>'
  254. CALL LINEOUT TEMPFILE,' <li> <INPUT TYPE=RADIO NAME="Dir.Forbid" VALUE="1"' ISCHECK1 ' >YES (do NOT allow display) '
  255. CALL LINEOUT TEMPFILE,'<li> <INPUT TYPE=RADIO NAME="Dir.Forbid" VALUE="0"' ISCHECK2 ' >NO  (allow display) </menu>'
  256.  
  257. ischeck=' '; if rx.enablepostprocess=' ' then ischeck='CHECKED'
  258. ischeck0=' ' ;IF rx.enablepostprocess=0 then ischeck0='CHECKED'
  259. ischeck1=' ' ;IF rx.enablepostprocess=1 then ischeck1='CHECKED'
  260. ischeck2=' ' ;IF rx.enablepostprocess=2 then ischeck2='CHECKED'
  261. call lineout tempfile,'<br> <b>EnablePostProcessor</b>: Post processing option: <menu>'
  262. CALL LINEOUT TEMPFILE,' <li><INPUT TYPE=RADIO NAME="EnablePostProcess" VALUE="0"' ISCHECK0 ' >Disable Post Processing ' 
  263. CALL LINEOUT TEMPFILE,' <li><INPUT TYPE=RADIO NAME="EnablePostProcess" VALUE=" "' ISCHECK ' >Enable for all files'
  264. CALL LINEOUT TEMPFILE,' <li><INPUT TYPE=RADIO NAME="EnablePostProcess" VALUE="1"' ISCHECK1 ' >Enable for all files .*HTM* extensions'
  265. CALL LINEOUT TEMPFILE,' <li><INPUT TYPE=RADIO NAME="EnablePostProcess" VALUE="2"' ISCHECK2 ' >Enable for ".SHTML" files only'
  266.  
  267. call lineout tempfile,'</menu>'
  268.  
  269.  
  270. call lineout tempfile,' <p>  <INPUT TYPE="reset" VALUE="reset"> <br>'
  271.  
  272. if is1=' ' then
  273.    call lineout tempfile,'  <INPUT TYPE="submit" VALUE="Create 'this1'"> '
  274. else do
  275.    call lineout tempfile,'<INPUT TYPE="submit" VALUE="Modify 'this1'"> '
  276.   call lineout tempfile,' <br> <Em> --- Caution: the old copy of ' this1 ' will be deleted! </em> '
  277. end
  278.  
  279.  
  280. call lineout tempfile,'<INPUT TYPE="hidden" name="WRITETO" VALUE="'this1'">'
  281. CALL LINEOUT TEMPFILE,'</FORM>'
  282.  
  283.  
  284. /* ------ TIPS AND HINTS SETCION */
  285.  
  286. call lineout tempfile,' <hr> <P> <HR> <a name="review"> <h3> Review: Parameters and Files </h3> </a>'
  287.  
  288. call lineout tempfile," Some notes on SRE-Filter's use of HTACCESS files "
  289. call lineout tempfile,'<br> For the most part, SRE-Filter emulates GOHTTP. '
  290. call lineout tempfile,' The following lists some potential differences: '
  291. call lineout tempfile,' <ul> <li> BASIC authorization uses only the "uppermost" HTACCESS file (rather then all of them)'
  292. call lineout tempfile,'<li> EnablePostProcess is ignored for non-file transfers (that is, it is ignored when server side processing are recieved)'
  293. call lineout tempfile,' <li>Dir.Builder works -- we recommend the "SHOWDIR" variant (see SHOWDIR.DOC for details) '
  294. call lineout tempfile,'<li>To invoke the Dir.Builder "dynamic directory list processsor", put !SHOWDIR at the end of the DefaultIndex list '
  295. call lineout tempfile,' <li> IDENT is a bit flaky (it works reasonably well if you * the portion before the @ )'
  296. call lineout tempfile,'</ul>'
  297. /* parameters from own and parent htaccess files */
  298.          tmp1=get_htaccess(0,HTfile,HTACC,ddir,TEMPFILE,2)
  299.  
  300. do mm=1 to words(vlist)
  301.    parse var tmp1 aval ',' tmp1
  302.    avar=word(vlist,mm) ; aval=strip(aval)
  303.    call value avar,aval
  304. end /* do */
  305. call lineout tempfile,' <hr width=30%> <h3> Effective parameters values for ' htfile ' </h3>  '
  306. call lineout tempfile,' These may include parameters set by HTACCESS files in parent directories <br>'
  307. if gotlist0=' ' then do
  308.    call lineout tempfile,' <BLOCKQUOTE> <strong> No HTACCESS parameters! </strong> </BLOCKQUOTE>'
  309. end  /* Do */
  310. else do
  311.   call lineout tempfile,'<dl>'
  312.   do mm=2 to words(vlist)  /* dont show gotlist */
  313.      avar=word(vlist,mm) ; avar2=word(vlist2,mm)
  314.      aval=value(avar)
  315.      call lineout tempfile,' <dt> <var> ' avar2 ' </var> <dd> ' aval
  316.   end /* do */
  317.   call lineout tempfile,'</dl> '
  318. end
  319.  
  320. /* ----- USER FILE */
  321. call lineout tempfile,' <HR WIDTH=30%> <H3> User file </h3>'
  322. call lineout tempfile,' Username/password file should have entries with the following syntax:<br>'
  323. call lineout tempfile,' <blockquote> USERNAME:PASSWORD </blockquote>'
  324. call lineout tempfile,' For example: <menu> <li> John:final1 <li> Sam:invidious <li> ; comment <li> wonder:womack </menu>'
  325. call lineout tempfile,' <h3> User file for: ' htfile' </h3>'
  326. if  auth.userfile=' ' then do
  327.  call lineout tempfile,' <blockquote><strong> No user file selected </strong> </blockquote>'
  328. end
  329. else do
  330.    call lineout tempfile,' Current user file is: <strong> ' auth.userfile '</strong> <p> '
  331.    foo=get_lines(auth.userfile)
  332.  
  333.    if foo>0  then do
  334.       call lineout tempfile,' Contents of ' auth.userfile ' <code> <ul>'
  335.  
  336.       do mm=1 to foo
  337.          alin=strip(somelines.mm)
  338.          if alin=' ' then iterate
  339.          if abbrev(alin,';')=1 then
  340.                 call lineout tempfile, '<li> <em>'alin ' </em> '
  341.          else
  342.                 call lineout tempfile, '<li> 'alin  
  343.       end /* do */
  344.       call lineout tempfile,'</ul>  </code>'
  345.     end
  346.     else do
  347.         call lineout tempfile,' <blockquote>  File does not exist: <strong> 'auth.userfile '</strong> </blockquote>'
  348.     end
  349. end  /* Do */
  350.  
  351.  
  352. /* ----- groups FILE */
  353. call lineout tempfile,' <HR WIDTH=30%> <H3> Groups file </h3>'
  354. call lineout tempfile,' The user Groups file should have entries with the following syntax:<br>'
  355. call lineout tempfile,' <blockquote> GROUPNAME: user1 user2 use33r@xx.yy.zz </blockquote>'
  356. call lineout tempfile,' For example: <menu> '
  357. call lineout tempfile,' <li> Detroit: phil george '
  358. call lineout tempfile,' <li> Boston:  joe *@dept1.school.edu '
  359. call lineout tempfile,' <em>  ... (note the use of the <strong>IDENT</strong> style name, and the * wildcard)</em>'
  360. call lineout tempfile,' <li> ; comment <li> Miami:  Cheryl Ruby Carlos </menu>'
  361. call lineout tempfile,' <h3> Groups file for: ' htfile ' </h3>'
  362. if  auth.groupfile=' ' then do
  363.  call lineout tempfile,' <blockquote><strong> No group file selected </strong> </blockquote>'
  364. end
  365. else do
  366.    call lineout tempfile,' Current group file is: <strong> ' auth.groupfile '</strong> <p> '
  367.    foo=get_lines(auth.groupfile)
  368.  
  369.    if foo>0  then do
  370.       call lineout tempfile,' Contents of ' auth.groupfile ' <code> <ul>'
  371.  
  372.       do mm=1 to foo
  373.          alin=strip(somelines.mm)
  374.          if alin=' ' then iterate
  375.          if abbrev(alin,';')=1 then
  376.                 call lineout tempfile, '<li> <em>'alin ' </em> '
  377.          else
  378.                 call lineout tempfile, '<li> 'alin  
  379.       end /* do */
  380.       call lineout tempfile,'</ul>  </code>'
  381.     end
  382.     else do
  383.         call lineout tempfile,' <blockquote>  File does not exist: <strong> 'auth.groupfile '</strong> </blockquote>'
  384.     end
  385. end  /* Do */
  386.  
  387. /* ----- redirectFILE */
  388. call lineout tempfile,' <HR WIDTH=30%> <H3> Redirection file </h3>'
  389. call lineout tempfile,' The Redirection file should have entries with the following syntax:<br>'
  390. call lineout tempfile,' <blockquote> old_url  : new_url  NOTIFY </blockquote>'
  391. call lineout tempfile, 'Where NOTIFY is optional (if present, redirection will NOT occur; instead, the client recieves a short notification) <p> '
  392. call lineout tempfile,' For example: <menu> '
  393. call lineout tempfile,' <li> zoo/sched.htm : http://www.newzoo.org/index.htm '
  394. call lineout tempfile,' <li> store/toys/*:  http://toys.newstore.com/inventory/*  NOTIFY '
  395. call lineout tempfile,' <em> ... (note the use of the * wildcard) </em> '
  396. call lineout tempfile,' <li> !CASE SENSITIVE  <em> ... (following entries are case sensitive) </em> '
  397. call lineout tempfile,' <li> candy/VANILLA.HTM :  /icecream/vanilla.htm  <EM> ... ( no http:// in the new_url implies redirect to same site) </em> '
  398. call lineout tempfile,'</menu> '
  399. call lineout tempfile,' <h3> Redirection file  for: ' htfile '</h3>'
  400. if  redirectfile=' ' then do
  401.  call lineout tempfile,' <blockquote><strong> No redirection file selected </strong> </blockquote>'
  402. end
  403. else do
  404.    call lineout tempfile,' Current  redirection file is: <strong> ' redirectfile '</strong> <p> '
  405.    foo=get_lines(redirectfile)
  406.  
  407.    if foo>0  then do
  408.       call lineout tempfile,' Contents of ' redirectfile ' <code> <ul>'
  409.  
  410.       do mm=1 to foo
  411.          alin=strip(somelines.mm)
  412.          if alin=' ' then iterate
  413.          if abbrev(alin,'!')=1 then
  414.                 call lineout tempfile, '<li> <em>'alin ' </em> '
  415.          else
  416.                 call lineout tempfile, '<li> 'alin  
  417.       end /* do */
  418.       call lineout tempfile,'</ul>  </code>'
  419.     end
  420.     else do
  421.         call lineout tempfile,' <blockquote>  File does not exist: <strong> 'redirectfile '</strong> </blockquote>'
  422.     end
  423. end  /* Do */
  424.  
  425.  
  426.  
  427.  
  428. call lineout tempfile,' </body> </html> '
  429. call lineout tempfile
  430.  
  431. 'file erase  type text/html name  ' tempfile
  432.  
  433. return 'Changes made, now submitting '
  434.  
  435.  
  436. /* do mm=1 to words(vlist)
  437.    parse var tmp1 aval ',' tmp1
  438.    avar=word(vlist,mm) ; aval=strip(aval) ; avar2=word(vlist2,mm)
  439.    if mm=1 then iterate 
  440.    call lineout tempfile,' <dt> <var> ' avar2 ' </var> <dd> ' aval
  441. end
  442. call lineout tempfile,' </dl> <p> '
  443. */
  444.  
  445.  
  446. makeit:procedure
  447. parse arg message,avar,gotlist0,aval,nshow
  448. if nshow=' 'then nshow=28
  449. if gotlist0=' ' then 
  450.   t1=' ' 
  451. else 
  452.   t1=aval
  453. rr=' <p> '|| message|| ':'
  454. rr=rr||' <INPUT TYPE="text" NAME="'||avar||'"  VALUE="'||t1||'"  SIZE='nshow' MAXLENGTH=85> '
  455. return rr
  456.  
  457.  
  458.  
  459.  
  460.  
  461. /* ----------- */                                                        
  462. /* get environment value, possibly host specific */                      
  463. /* ------------ */                                                       
  464. get_value: procedure expose enmadd host_nickname usecolor
  465. parse arg vname,hname0
  466. if hname0=0 then 
  467.         hname=' '
  468. else                                                    
  469.     hname=strip(host_nickname)                          
  470.  
  471. vname=strip(vname) ;
  472. if hname<>' ' then do                                                    
  473.    aval=value(enmadd||vname||'.'||hname,,'os2environment')               
  474.    if aval<>' ' Then                                                     
  475.         return aval                                                      
  476. end                                                                      
  477. aval=value(enmadd||vname,,'os2environment')                              
  478. return aval                   
  479.  
  480.  
  481. /* write results routine */
  482. writeres:
  483. list0=list
  484. do until list=""
  485.     parse var list a1 '&' list
  486.     parse upper var a1 avar '=' aval
  487.     if avar='WRITETO' then do
  488.        htout=strip(packur(aval))
  489.        leave
  490.     end  /* Do */
  491. end /* do */
  492. foo=sysfiledelete(htout)
  493. foo=lineout(htout,,1)
  494. _diris=0
  495. if pos('_DIRIS=1',upper(list0))>0 then _diris=1
  496. list=list0
  497. do until list=""
  498.     parse var list a1 '&' list
  499.     parse var a1 avar '=' aval
  500.     avar=strip(packur(avar));
  501.     aval=strip(packur(aval));
  502.  
  503.     if translate(avar)='_DIRIS' then iterate
  504.     if translate(avar)='WRITETO' then iterate
  505.     if translate(avar)='LIMIT' then aval=' require '||aval
  506.     if translate(avar)='COMMENT' then avar='; ' 
  507.     if translate(avar)='DIR.EXCLUDE' & _diris=1 then
  508.         avar='_'||avar
  509.     if aval \=' ' then
  510.         call lineout htout,avar ':' aval
  511. end
  512. call lineout htout
  513.  
  514. call lineout tempfile, '<!doctype html public "-//IETF//DTD HTML 3.0//EN">'
  515. call lineout tempfile, "<html><head><title>SRE-Filter HTACCESS configurator </title>"
  516. call lineout tempfile, '</head><body  bgcolor="#'||usecolor||'"> '
  517.  
  518. call lineout tempfile, "<h1> SRE-Filter: <A NAME="top"> HTACCESS Configurator </A>   </h1> <p>"
  519. call lineout tempfile,' Results were written to ' htout
  520.  
  521. call lineout tempfile, '</body> </html> '
  522. call lineout tempfile
  523. 'file erase  type text/html name  ' tempfile
  524.  
  525. return 0
  526.  
  527.  
  528. /* ----------------------------------------------------------------------- */
  529. /* get_HTACCESS --- a modification of Don Meyer's CHECKAUTH & other stuff:
  530.  
  531. This will CHECK all the accessfilenames in the tree underneath
  532. file for access privileges, etc.  
  533.  
  534. For details on how to set up an accessfile, see
  535.      http://w3.ag.uiuc.edu/DLM/GOHTTP/Auth.Guide.html
  536.  
  537.  
  538. ENABLEPOSTPROCESS (use the post_filter stuff), and _DIR.BUILDER
  539.  
  540.  
  541. When dodirs=2, return ALL parameters (used by htaccess configurator)
  542. Dodirs=3, just the "own directory" (if it exists)
  543.  
  544.  
  545. */
  546.  
  547. /* ----------------------------------------------------------------------- */
  548. get_htaccess:procedure expose _diris
  549.  
  550.   parse arg sel,file,accessfilename,dir,TEMPFILE,dodirs
  551.  
  552.   file = translate( file, '/', '\')
  553.  
  554.   dir.exclude=' '
  555.   PathTo = ''
  556.   rest = file
  557.   retCode = 0
  558.   gotlist=' '
  559.   set=' '
  560.  
  561. /* initialize some variable */
  562. auth.name=' '; auth.type=' ' ; auth.userfile=' ' ; auth.groupfile=' '
  563. auth.index=' '; redirectfile=' '; auth.limit=' '; dir.exclude=' ';
  564. dir.info=' ' ; dir.describe=' ' ; dir.forbid=' ';rx.builddir=' '
  565. _diris=0
  566. rx.enablepostprocess=' '
  567. dir.build=0 ; rx.builddir=' '
  568.  
  569.  
  570.   owndir=filespec('d',file)||filespec('p',file)
  571.   owndir=translate(translate(owndir,'/','\'))
  572.   owndir=strip(owndir,'t','/')
  573.  
  574. /* find htaccess files;
  575.    and if found, extract the parameters, starting at base of directory tree
  576.    (thus, own htaccess file is favored */
  577.  
  578.   do while (rest \= '')
  579.     restdoggy=right(rest,1)
  580.     parse var rest _dir'/'rest
  581.     if (right( _dir,1) == ':') then PathTo = _dir
  582.     else PathTo = PathTo'/'_dir
  583.  
  584.     if dodirs==3 then do;
  585.           if translate(pathto) \= owndir then do
  586.                 iterate
  587.           end
  588.     end
  589.  
  590.     goofy=rest ; if goofy=' ' & restdoggy='/' then goofy='/'
  591.     if (left(PathTo,3) == '///') then 
  592.            PathTo = substr(PathTo,2)
  593.     else if (goofy \= '')  & (right( _dir,1) \= ':') then do
  594.          geek1=pathto'/'accessfilename
  595.          ACLfile = stream(geek1, 'c', 'query exists')
  596.  
  597.  
  598.       if (ACLfile \= '') then do /* if not, climb up the tree */
  599.          gotlist=gotlist' 'aclfile
  600.          Auth.GroupFile = ' '
  601.          Auth.Limit = ' '
  602.          rc = stream( ACLfile, 'c', 'OPEN READ')
  603.          line = linein( ACLfile, 1)
  604.          do while (line \= '')
  605.             do while( pos(left(line,1), "2009"x) > 0); line = substr(line, 2); end
  606.             if ( pos(left(line,1), "#") > 0) then line = substr(line, 2)
  607.             if ( left(line,1) == ';') then line = ';COMMENT'
  608.  
  609.             parse var line key ':' val
  610.             val = strip(val)
  611.             key = translate(key)
  612.             if (key = 'AUTHUSERFILE') | (key = 'AUTHGROUPFILE') | (key = 'REDIRLIST') then do
  613.                if (pos(':', val ) == 0) then do
  614.                   val = translate(val, '\', '/')
  615.                   if (left(val,1) == '\') then val = substr( val, 2)
  616.                   val = dir || val
  617.                end
  618.             end
  619.             select
  620.                when (key = 'AUTHNAME') then Auth.Name = val
  621.                when (key = 'AUTHTYPE') then Auth.Type = translate( strip(val))
  622.                when (key = 'AUTHUSERFILE') then Auth.UserFile = val
  623.                when (key = 'AUTHGROUPFILE') then Auth.GroupFile = val
  624.                when (key = 'DEFAULTINDEX') then Auth.Index = val
  625.                when (key = 'REDIRLIST') then RedirectFile = val
  626.                when (key = 'REDIRFILE') then RedirectFile = val  /* bug? in original code */
  627.                when (key = 'LIMIT') then    Auth.Limit = val
  628.                when (key = 'BUILDDIR') then Dir.Build = (val \= '0')
  629.                when (key = 'DIR.EXCLUDE') then Dir.Exclude = Dir.Exclude val
  630.                when (key = '_DIR.EXCLUDE') then do
  631.                       Dir.Exclude = val
  632.                       _diris=1
  633.                end  /* Do */
  634.                when (key = 'DIR.INFO') then Dir.Info = val
  635.                when (key = 'DIR.DESCRIBE') then Dir.Describe = val
  636.                when (key = 'DIR.FORBID') then Dir.Forbid = (val \= '0')
  637.                when (key = 'DIR.BUILDER') then Rx.BuildDir = val
  638.                when (key = 'ENABLEPOSTPROCESS') then do
  639.                      v = left(strip(val),1)
  640.                      if (pos(v, '012') > 0) then Rx.EnablePostProcess = v
  641.                   end
  642.                otherwise 
  643.             end
  644.  
  645.             line = linein( ACLfile)
  646.          end
  647.          rc = stream( ACLfile, 'c', 'close')
  648.  
  649.        end                /* this aclfile */
  650.     end          /* goofy */
  651.   end                       /* climbing up directory tree */
  652.  
  653.     bigone=gotlist', 'auth.name', 'auth.type', 'auth.userfile', 'auth.groupfile
  654.     bigone=bigone', 'auth.index', 'redirectfile', 'auth.limit', 'dir.build
  655.     bigone=bigone', 'dir.exclude', 'dir.info', 'dir.describe', 'dir.forbid', 'rx.builddir
  656.     bigone=bigone', 'rx.enablepostprocess
  657.   return bigone
  658.  
  659.     
  660.  
  661.  
  662.  
  663. /* get file line by line . Return in somelines. variable */
  664.  
  665. get_lines:procedure expose somelines.
  666.  
  667. parse arg afile
  668. crlf='0d0a'x
  669.  
  670. mm=0
  671.  
  672. foo=stream(afile,'c','query exists')
  673. if foo=' ' then do
  674.    somelines.0=0
  675.    return 0
  676. end
  677.  
  678. foo=charin(afile,1,chars(afile))
  679. foo=strip(foo,'t','1a'x)
  680. a=stream(afile,'c','close')
  681.  
  682. do until foo=''
  683.    parse var foo  aline (crlf) foo
  684.    mm=mm+1
  685.    somelines.mm=aline
  686. end
  687. somelines.0=mm
  688.  
  689. return mm
  690.  
  691.  
  692. end /* do */
  693.  
  694.  
  695.  
  696.  
  697.  
  698.