Diff
Not logged in

Differences From:

File src/login.c part of check-in [61ce5e3685] - Get rid of the "locking" capability on wiki pages. Assume that anybody who can write or append to a wiki page can do so to any wiki page. Add the /wikiappend page for appending comments to the end of wiki. by drh on 2007-10-10 23:10:48. [view]

To:

File src/login.c part of check-in [929d28e358] - Added the "e" capability for viewing ticket submitter email addresses. Additional tinkering toward the design of tickets. This check-in is only thinly tested. by drh on 2007-11-05 02:42:58. [view]

@@ -292,9 +292,9 @@
       case 's':   g.okSetup = 1;
       case 'a':   g.okAdmin = g.okRdTkt = g.okWrTkt = g.okQuery =
                               g.okRdWiki = g.okWrWiki = g.okNewWiki =
                               g.okApndWiki = g.okHistory = g.okClone =
-                              g.okNewTkt = g.okPassword = 1;
+                              g.okNewTkt = g.okPassword = g.okRdAddr = 1;
       case 'i':   g.okRead = g.okWrite = 1;                     break;
       case 'o':   g.okRead = 1;                                 break;
 
       case 'd':   g.okDelete = 1;                               break;
@@ -307,15 +307,51 @@
       case 'k':   g.okWrWiki = g.okRdWiki = g.okApndWiki =1;    break;
       case 'm':   g.okApndWiki = 1;                             break;
       case 'f':   g.okNewWiki = 1;                              break;
 
+      case 'e':   g.okRdAddr = 1;                               break;
       case 'r':   g.okRdTkt = 1;                                break;
       case 'n':   g.okNewTkt = 1;                               break;
       case 'w':   g.okWrTkt = g.okRdTkt = g.okNewTkt =
                   g.okApndTkt = 1;                              break;
       case 'c':   g.okApndTkt = 1;                              break;
     }
   }
+}
+
+/*
+** If the current login lacks any of the capabilities listed in
+** the input, then return 0.  If all capabilities are present, then
+** return 1.
+*/
+int login_has_capability(const char *zCap, int nCap){
+  int i;
+  int rc = 1;
+  if( nCap<0 ) nCap = strlen(zCap);
+  for(i=0; i<nCap && rc && zCap[i]; i++){
+    switch( zCap[i] ){
+      case 'a':  rc = g.okAdmin;     break;
+      case 'c':  rc = g.okApndTkt;   break;
+      case 'd':  rc = g.okDelete;    break;
+      case 'e':  rc = g.okRdAddr;    break;
+      case 'f':  rc = g.okNewWiki;   break;
+      case 'g':  rc = g.okClone;     break;
+      case 'h':  rc = g.okHistory;   break;
+      case 'i':  rc = g.okWrite;     break;
+      case 'j':  rc = g.okRdWiki;    break;
+      case 'k':  rc = g.okWrWiki;    break;
+      case 'm':  rc = g.okApndWiki;  break;
+      case 'n':  rc = g.okNewTkt;    break;
+      case 'o':  rc = g.okRead;      break;
+      case 'p':  rc = g.okPassword;  break;
+      case 'q':  rc = g.okQuery;     break;
+      case 'r':  rc = g.okRdTkt;     break;
+      case 's':  rc = g.okSetup;     break;
+      case 'w':  rc = g.okWrTkt;     break;
+      default:   rc = 0;             break;
+    }
+  }
+  return rc;
 }
 
 /*
 ** Call this routine when the credential check fails.  It causes