]> granicus.if.org Git - linux-pam/commitdiff
Relevant BUGIDs: 517064
authorAndrew G. Morgan <morgan@kernel.org>
Sun, 26 May 2002 23:58:23 +0000 (23:58 +0000)
committerAndrew G. Morgan <morgan@kernel.org>
Sun, 26 May 2002 23:58:23 +0000 (23:58 +0000)
Purpose of commit: feature

Commit summary:
---------------
document old feature and add '\]' parsing to make it a better feature.
The feature is that we can accept spaces in module arguments by enclosing
the whole argument inside square brackets. For example a module argument
like this:

  "[hello [you\], this is me]"

will be parsed as

  "hello [you], this is me"

Not very interesting, but you get the idea.
Thanks to Russell Kliese for requesting this.

CHANGELOG
doc/pam_source.sgml
libpam/pam_misc.c

index 055f2b7b56da11ecceb3b76034ec77d8583174a8..dd75976499b8e4b67b8cadb330d41f6b8e0d8fb5 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -55,6 +55,9 @@ bug report - outstanding bugs are listed here:
 0.76: please submit patches for this section with actual code/doc
       patches!
 
+* '[...]' parsing: document it and also fix it to support '\]' escape
+  sequence. Feature request from Russell Kliese (Bug 517064 -
+  agmorgan).
 * pam_rootok: compilation warning noted by Tony den Haan wrt no
   prototype for strcmp() (Bug 557322 - agmorgan).
 * documentation: (a few of mine in passing) and app documentation
index 922951263cb4dd55e59e8f6ff2534a62a7f24c64..7ed1e131893d71d5452aeb2183ae53630d2193b6 100644 (file)
@@ -46,7 +46,7 @@ DAMAGE.
 
 <title>The Linux-PAM System Administrators' Guide
 <author>Andrew G. Morgan, <tt>morgan@kernel.org</tt>
-<date>DRAFT v0.76 2002/05/09
+<date>DRAFT v0.76 2002/05/26
 <abstract>
 This manual documents what a system-administrator needs to know about
 the <bf>Linux-PAM</bf> library. It covers the correct syntax of the
@@ -366,7 +366,7 @@ A general configuration line of the <tt>/etc/pam.conf</tt> file has
 the following form:
 <tscreen>
 <verb>
-service-name   module-type   control-flag   module-path   arguments
+service-name   module-type   control-flag   module-path   args
 </verb>
 </tscreen>
 Below, we explain the meaning of each of these tokens. The second (and
@@ -575,6 +575,26 @@ encountering an invalid argument, the module is required to write an
 error to <tt/syslog(3)/. For a list of <em/generic/ options see the
 next section.
 
+Note, if you wish to include spaces in an argument, you should
+surround that argument with square brackets. For example:
+<tscreen>
+<verb>
+squid auth required pam_mysql.so user=passwd_query passwd=mada \
+        db=eminence [query=select user_name from internet_service where \
+                     user_name='%u' and password=PASSWORD('%p') and \
+                     service='web_proxy']
+</verb>
+</tscreen>
+Note, when using this convention, you can include `<tt/[/' characters
+inside the string, and if you wish to include a `<tt/]/' character
+inside the string that will survive the argument parsing, you should
+use `<tt/\[/'. In other words:
+<tscreen>
+<verb>
+[..[..\]..]    -->   ..[..]..
+</verb>
+</tscreen>
+
 </descrip>
 
 <p>
index 2d93a94610022d23cc285ac135e9d5e424ee54d2..bd4ed958d8811705d3b88840fb0ad320acfef6f7 100644 (file)
@@ -43,7 +43,7 @@ char *_pam_StrTok(char *from, const char *format, char **next)
      for (i=1; i<256; table[i++] = '\0');
      for (i=0; format[i] ; table[(int)format[i++]] = 'y');
 
-     /* look for first non-blank char */
+     /* look for first non-format char */
      while (*from && table[(int)*from]) {
          ++from;
      }
@@ -53,10 +53,22 @@ char *_pam_StrTok(char *from, const char *format, char **next)
          * special case, "[...]" is considered to be a single
          * object.  Note, however, if one of the format[] chars is
          * '[' this single string will not be read correctly.
+         * Note, any '[' inside the outer "[...]" pair will survive.
+         * Note, the first ']' will terminate this string, but
+         *  that "\]" will get compressed into "]". That is:
+         *
+         *   "[..[..\]..]..." --> "..[..].."
          */
-        for (end=++from; *end && *end != ']'; ++end) {
+        char *to;
+        for (to=end=++from; *end && *end != ']'; ++to, ++end) {
             if (*end == '\\' && end[1] == ']')
                 ++end;
+            if (to != end) {
+                *to = *end;
+            }
+        }
+        if (to != end) {
+            *to = '\0';
         }
         /* note, this string is stripped of its edges: "..." is what
             remains */