home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / nosaa107.zip / cvssec.cmd < prev    next >
OS/2 REXX Batch file  |  1999-11-11  |  9KB  |  313 lines

  1. /*
  2.  *      CVSSEC.CMD - V1.07 - NOSA Administrator - C.Langanke@TeamOS2.DE - 1999
  3.  *
  4.  *     Syntax: cvssec CHECKCOMMIT|CHECKTAG parms...
  5.  *
  6.  *     cvssec is a filter to be specified in $CVSROOT/CVSROOT/commitinfo
  7.  *     and $CVSROOT/CVSROOT/taginfo and checks, wether a commit or
  8.  *     tag is allowed for a writer. The user is read from the environment
  9.  *     variable $USER set by the pserver.
  10.  *
  11.  *     If write is allowed, this script returns rc=0, else != 0.
  12.  *
  13.  *     NOTE: The file $CVSROOT/CVSROOT/writers or readers should be used in
  14.  *     order to specify those persons, who may (not) change anything in the
  15.  *     archive.
  16.  */
  17. /* First comment is used as help text */
  18.  
  19.  SIGNAL ON HALT
  20.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  21.  PARSE VAR TitleLine CmdName'.CMD 'Info
  22.  Title     = CmdName Info
  23.  
  24.  env          = 'OS2ENVIRONMENT';
  25.  TRUE         = (1 = 1);
  26.  FALSE        = (0 = 1);
  27.  Redirection  = '> NUL 2>&1';
  28.  CrLf         = "0d0a"x;
  29.  '@ECHO OFF'
  30.  
  31.  /* OS/2 errorcodes */
  32.  ERROR.NO_ERROR           =  0;
  33.  ERROR.INVALID_FUNCTION   =  1;
  34.  ERROR.FILE_NOT_FOUND     =  2;
  35.  ERROR.PATH_NOT_FOUND     =  3;
  36.  ERROR.ACCESS_DENIED      =  5;
  37.  ERROR.NOT_ENOUGH_MEMORY  =  8;
  38.  ERROR.INVALID_FORMAT     = 11;
  39.  ERROR.INVALID_DATA       = 13;
  40.  ERROR.NO_MORE_FILES      = 18;
  41.  ERROR.WRITE_FAULT        = 29;
  42.  ERROR.READ_FAULT         = 30;
  43.  ERROR.GEN_FAILURE        = 31;
  44.  ERROR.INVALID_PARAMETER  = 87;
  45.  ERROR.ENVVAR_NOT_FOUND   = 203;
  46.  
  47.  GlobalVars = 'Title CmdName env TRUE FALSE Redirection ERROR.';
  48.  SAY;
  49.  
  50.  /* show help */
  51.  ARG Parm .
  52.  IF ((Parm = '') | (POS('?', Parm) > 0)) THEN
  53.  DO
  54.     rc = ShowHelp();
  55.     EXIT(ERROR.INVALID_PARAMETER);
  56.  END;
  57.  
  58.  /* load RexxUtil */
  59.  CALL RxFuncAdd    'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
  60.  CALL SysLoadFuncs;
  61.  
  62.  /* Defaults */
  63.  GlobalVars     = GlobalVars 'CvsRoot CvsUser WriteInfoFile';
  64.  fWriteAllowed  = FALSE;
  65.  fCheckTag      = FALSE;
  66.  Action         = ':';
  67.  
  68.  rc = ERROR.NO_ERROR;
  69.  
  70.  DO UNTIL (TRUE)
  71.  
  72.     /* -------------------------------------------------------------- */
  73.  
  74.     /* read some vars being filled by the cvs pserver */
  75.     CvsRoot = VALUE('CVSROOT',,env);
  76.     PARSE VAR CvsRoot ':local:'CvsRoot
  77.     WriteInfoFile = dosslash(CvsRoot'\CVSROOT\writeinfo');
  78.     LogFile       = dosslash(CvsRoot'\CVSROOT\writeinfo.log');
  79.     CvsUser = VALUE('USER',,env);
  80.  
  81.     /* if environment is not correct, abort with error */
  82.     IF (CvsRoot = '') THEN
  83.     DO
  84.        SAY Title;
  85.        SAY CmdName': environment variable CVSROOT not set.'
  86.        SAY;
  87.        EXIT(ERROR.ENVVAR_NOT_FOUND);
  88.     END;
  89.     IF (CvsUser = '') THEN
  90.     DO
  91.        SAY Title;
  92.        SAY CmdName': environment variable USER not set.'
  93.        SAY;
  94.        EXIT(ERROR.ENVVAR_NOT_FOUND);
  95.     END;
  96.  
  97.     /* does writeinfo file exist ? If not, do nothing ! */
  98.     IF (\FileExist( WriteInfoFile)) THEN
  99.        RETURN(0);
  100.  
  101.     /* get command line parms */
  102.     /* PARSE ARG does not work here well, use ARG() to emulate */
  103.     Parms = '';
  104.     DO i = 1 TO ARG()
  105.        Parms = Parms ARG(i);
  106.     END;
  107.     Parms = STRIP(Parms);
  108.  
  109.     Action = STRIP(TRANSLATE(WORD( Parms, 1)));
  110.     SELECT
  111.        WHEN (Action = 'CHECKCOMMIT') THEN
  112.        DO
  113.           Action = 'commit:';
  114.           fWriteAllowed = CheckCommitAllowed( Parms);
  115.        END;
  116.    
  117.        WHEN (Action = 'CHECKTAG') THEN
  118.        DO
  119.           fWriteAllowed = CheckTagAllowed( Parms);
  120.           Action = 'tag ('CvsTagOperation '"'CvsTagName'"):';
  121.        END;
  122.     END;
  123.  
  124.  END;
  125.  
  126.  IF (FileExist( Logfile)) THEN
  127.  DO
  128.     IF (fWriteAllowed) THEN
  129.        LogLine = '0:' Action 'in' CvsDirectory 'allowed for:' CvsUser;
  130.     ELSE
  131.        LogLine = '#:' Action 'in' CvsDirectory 'permitted for:' CvsUser;
  132.     rc = LINEOUT( Logfile, LogLine);
  133.     rc = LINEOUT( Logfile);
  134.  END;
  135.  EXIT( \fWriteAllowed); /* 0: commit allowed; \0: commit not allowed */
  136.  
  137.  
  138. /* ------------------------------------------------------------------------- */
  139. HALT:
  140.  SAY;
  141.  SAY 'Interrupted by user.';
  142.  EXIT(ERROR.GEN_FAILURE);
  143.  
  144. /* ------------------------------------------------------------------------- */
  145. ShowHelp: PROCEDURE EXPOSE (GlobalVars)
  146.  
  147.  SAY Title;
  148.  SAY;
  149.  
  150.  PARSE SOURCE . . ThisFile
  151.  DO i = 1 TO 3
  152.     rc = LINEIN(ThisFile);
  153.  END;
  154.  
  155.  ThisLine = LINEIN(Thisfile);
  156.  DO WHILE (ThisLine \= ' */')
  157.     SAY SUBSTR(ThisLine, 7);
  158.     ThisLine = LINEIN(Thisfile);
  159.  END;
  160.  
  161.  rc = LINEOUT(Thisfile);
  162.  
  163.  RETURN('');
  164.  
  165. /* ------------------------------------------------------------------------- */
  166. FileExist: PROCEDURE
  167.  PARSE ARG FileName
  168.  
  169.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  170.  
  171. /* ========================================================================= */
  172. unixslash: PROCEDURE
  173.  PARSE ARG string
  174.  RETURN(TRANSLATE( string, '/', '\'));
  175.  
  176. /* ========================================================================= */
  177. dosslash: PROCEDURE
  178.  PARSE ARG string
  179.  RETURN(TRANSLATE( string, '\', '/'));
  180.  
  181.  
  182. /* ========================================================================= */
  183. CheckWriteInfo: PROCEDURE EXPOSE (GlobalVars)
  184. PARSE ARG InfoFile, SearchDir, CvsUser, Wildcard;
  185.  
  186.  fWriteAllowed = FALSE;
  187.  
  188.  /* replace backslash by slash */
  189.  SearchDir = unixslash( SearchDir);
  190.  
  191. rc = LINEOUT( 'C:\log', '---------');
  192.  
  193.  DO WHILE (TRUE)
  194.  
  195.     /* search write permission */
  196.     rc = SysFileSearch( SearchDir, InfoFile, 'Line.');
  197.     IF (rc \= 0) THEN
  198.        LEAVE;
  199.  
  200.     DO i = 1 TO Line.0
  201.        PARSE VAR Line.i InfoDir InfoUser;
  202.        InfoUser = TRANSLATE( STRIP(InfoUser), ' ', ',');
  203.  
  204.        /* check this directory */
  205.        IF (TRANSLATE(InfoDir) = TRANSLATE(SearchDir)) THEN
  206.        DO
  207.           IF ((Wildcard \= '') & (POS( Wildcard, InfoUser))) THEN
  208.           DO
  209.              fWriteAllowed = TRUE;
  210.              LEAVE;
  211.           END;
  212.  
  213.           IF (WORDPOS( TRANSLATE(CvsUser), TRANSLATE(InfoUser)) > 0) THEN
  214.           DO
  215.              fWriteAllowed = TRUE;
  216.              LEAVE;
  217.           END;
  218.        END;
  219.     END;
  220.  
  221.     /* is it already root dir ? then exit */
  222.     IF (SearchDir = '/') THEN
  223.        LEAVE;
  224.  
  225.     /* cut off one directory */
  226.     SlashPos = LASTPOS( '/', SearchDir);
  227.     IF (SlashPos = 1) THEN SlashPos = 2;
  228.     SearchDir = LEFT( SearchDir, SlashPos - 1);
  229.  
  230.  END;
  231.  
  232.  RETURN(fWriteAllowed);
  233.  
  234. /* ========================================================================= */
  235. CheckCommitAllowed: PROCEDURE EXPOSE (GlobalVars) CvsDirectory
  236.  PARSE ARG CvsCheckTag CvsDirectory CvsFile;
  237.  
  238.  CvsDirectory     =  STRIP( CvsDirectory);
  239.  CvsFile          =  STRIP( CvsFile);
  240.  
  241.  fWriteAllowed = FALSE;
  242.  
  243.  
  244.  DO UNTIL (TRUE)
  245.  
  246.     /* directory to be written must reside below cvsroot */
  247.     IF (POS( TRANSLATE( CvsRoot), TRANSLATE( CvsDirectory)) \= 1) THEN
  248.        LEAVE;
  249.     SearchDirectory = DELSTR( CvsDirectory, 1, LENGTH( CvsRoot));
  250.     IF (SearchDirectory = '') THEN
  251.        SearchDirectory = '/';
  252.  
  253.     fWriteAllowed = CheckWriteInfo( WriteInfoFile, SearchDirectory, CvsUser, '*');
  254.  
  255.  END;
  256.  
  257.  IF (\fWriteAllowed) THEN
  258.  DO
  259.     SAY 'cvs commit: pre-commit check for' unixslash(CvsDirectory);
  260.     SAY 'cvs commit: access denied for user:' CvsUSer;
  261.  END;
  262.  RETURN( fWriteAllowed);
  263.  
  264. /* ========================================================================= */
  265. CheckTagAllowed: PROCEDURE EXPOSE (GlobalVars) CvsDirectory CvsTagname CvsTagOperation
  266.  PARSE ARG CvsCheckTag CvsTagName CvsTagOperation CvsDirectory CvsFileList;
  267.  
  268.  CvsTagName       =  STRIP( CvsTagName);
  269.  CvsTagOperation  =  STRIP( CvsTagOperation);
  270.  CvsDirectory     =  STRIP( CvsDirectory);
  271.  CvsFileList      =  STRIP( CvsFileList);
  272.  
  273.  fWriteAllowed = FALSE;
  274.  fCheckTag     = FALSE;
  275.  
  276.  DO UNTIL (TRUE)
  277.  
  278.     /* directory to be written must reside below cvsroot */
  279.     IF (POS( TRANSLATE( CvsRoot), TRANSLATE( CvsDirectory)) \= 1) THEN
  280.        LEAVE;
  281.     SearchDirectory = DELSTR( CvsDirectory, 1, LENGTH( CvsRoot));
  282.     IF (SearchDirectory = '') THEN
  283.        SearchDirectory = '/';
  284.  
  285.     fWriteAllowed = CheckWriteInfo( WriteInfoFile, SearchDirectory, CvsUser, '*');
  286.     IF (\fWriteAllowed) THEN
  287.        LEAVE;
  288.  
  289.     /* has user access to CVSROOT ? Then do not check for personal tags */
  290.     SearchDirectory = '/cvsroot';
  291.     fCheckTag = \CheckWriteInfo( WriteInfoFile, SearchDirectory, CvsUser);
  292.  
  293.     /* allow only personal tags here */
  294.     IF (fCheckTag) THEN
  295.        fWriteAllowed = (POS( TRANSLATE(CvsUser)'_', TRANSLATE( CvsTagName)) = 1)
  296.  
  297.  END;
  298.  
  299.  IF (\fWriteAllowed) THEN
  300.  DO
  301.     SAY 'cvs tag: pre-tag check for' unixslash(CvsDirectory);
  302.     IF (fCheckTag) THEN
  303.     DO
  304.        SAY 'cvs tag: personal tags allowed only for user:' CvsUser;
  305.        SAY '         Preceed tag names with "'CvsUser'_" !';
  306.     END;
  307.     ELSE
  308.        SAY 'cvs tag: access denied for user:' CvsUser;
  309.  END;
  310.  
  311.  RETURN( fWriteAllowed);
  312.  
  313.