Bug 3156 - Strange bug occuring due to usage of a username map and long printer names:
Summary: Strange bug occuring due to usage of a username map and long printer names:
Status: RESOLVED FIXED
Alias: None
Product: Samba 3.0
Classification: Unclassified
Component: Printing (show other bugs)
Version: 3.0.14a
Hardware: All Windows XP
: P3 major
Target Milestone: none
Assignee: Gerald (Jerry) Carter (dead mail address)
QA Contact: Samba QA Contact
URL:
Keywords:
: 3158 (view as bug list)
Depends on:
Blocks:
 
Reported: 2005-10-11 03:29 UTC by Christoph Klein (dead mail address)
Modified: 2005-11-22 08:50 UTC (History)
0 users

See Also:


Attachments
remove use of find_service when looking for a printername specifically (6.35 KB, patch)
2005-11-22 08:46 UTC, Gerald (Jerry) Carter (dead mail address)
no flags Details
too much in the last patch. This is only the necessary changes (2.15 KB, patch)
2005-11-22 08:50 UTC, Gerald (Jerry) Carter (dead mail address)
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Christoph Klein (dead mail address) 2005-10-11 03:29:30 UTC
Starting from possibly 3.0.7 Samba no longer resolves printer names successfully. 


Here's is the username map:

!smbop = christophk
zbenutzer = *

The smb.conf entry:

[hp43dpc]
        path = /tmp
        printable = Yes
        printer name = FWI-HP4300D
        cups options = "raw"

and the rpcclient output

rpcclient $> getprinter hp43dpc 2
        servername:[\\127.0.0.1]
        printername:[\\127.0.0.1\CIP-Service D]
        sharename:[hp43dpc]
        portname:[FWI-HP4300D]
        drivername:[HP LaserJet 4300 PCL 6]
        comment:[0,05 Euro pro Seite]
        location:[Servicebüro]
        sepfile:[]
        printprocessor:[winprint]
        datatype:[RAW]
        parameters:[]
        attributes:[0x3048]
        priority:[0x1]
        defaultpriority:[0x1]
        starttime:[0x0]
        untiltime:[0x0]
        status:[0x0]
        cjobs:[0x0]
        averageppm:[0x0]

and the log:

[2005/10/11 11:03:37, 3]
rpc_server/srv_spoolss_nt.c:set_printer_hnd_printertype(471)
  Setting printer type=\\fwi-fortuna\CIP-Service A Farbe
  Printer is a printer
[2005/10/11 11:03:37, 4] rpc_server/srv_spoolss_nt.c:set_printer_hnd_name(507)
  Setting printer name=\\fwi-fortuna\CIP-Service A Farbe (len=33)
  searching for [CIP-Service A Farbe]
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_alloc(313)
  Finding user CIP-Service A Farbe
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(262)
  Trying _Get_Pwnam(), username as lowercase is cip-service a farbe
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(269)
  Trying _Get_Pwnam(), username as given is CIP-Service A Farbe
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(278)
  Trying _Get_Pwnam(), username as uppercase is CIP-SERVICE A FARBE
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(286)
  Checking combinations of 0 uppercase letters in cip-service a farbe
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(290)
  Get_Pwnam_internals didn't find user [CIP-Service A Farbe]!
[2005/10/11 11:03:37, 4] lib/username.c:map_username(171)
  Scanning username map /etc/samba/usermap
[2005/10/11 11:03:37, 5] lib/username.c:user_in_netgroup_list(369)
  Unable to get default yp domain
[2005/10/11 11:03:37, 3] lib/username.c:map_username(212)
  Mapped user CIP-Service A Farbe to zbenutzer
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_alloc(313)
  Finding user zbenutzer
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(262)
  Trying _Get_Pwnam(), username as lowercase is zbenutzer
[2005/10/11 11:03:37, 5] lib/username.c:Get_Pwnam_internals(290)
  Get_Pwnam_internals did find user [zbenutzer]!
[2005/10/11 11:03:37, 3] smbd/service.c:find_service(151)
  checking for home directory zbenutzer gave
[2005/10/11 11:03:37, 3] smbd/service.c:find_service(161)
  checking whether zbenutzer is a valid printer name...
[2005/10/11 11:03:37, 3] smbd/service.c:find_service(171)
  zbenutzer is not a valid printer name
[2005/10/11 11:03:37, 3] smbd/service.c:find_service(208)
  find_service() failed to find service zbenutzer

... yes i know its for a different printer, but they are all configured the same
way and all dont work with >3.0.7


To me it seems that find_service called by set_printer_hnd_name doenst find a
share with the printername (due to the long printername) and then looks if the
servicename is a username and the share a homeshare. map_username called by
find_service changes the printername to a username, and then all subsequent
tries to map the long printer name to a share name in set_rpinter_hnd_name fail,
because the servicename was changed.
Comment 1 Gerald (Jerry) Carter (dead mail address) 2005-10-12 06:35:34 UTC
*** Bug 3158 has been marked as a duplicate of this bug. ***
Comment 2 Christoph Klein (dead mail address) 2005-11-13 15:37:40 UTC
here is a UNTESTED patch, mainly to show you again what seems to be problem:

--- service.c   2005-11-13 23:29:23.000000000 +0100
+++ service.c.old       2005-11-13 18:40:51.000000000 +0100
@@ -143,29 +143,14 @@
                         * Try mapping the servicename, it may
                         * be a Windows to unix mapped user name.
                         */
-                       /* but dont modify the servicename if mapping
-                        * doesnt return sth. useful
-                        * christophk@cip.wiwi.uni-karlsruhe.de 14.11.05
-                        */
-                       fstring mapped_username;
-                       fstrcpy(mapped_username,service);
-
-                       if(map_username(mapped_username)) {
-                               phome_dir = get_user_home_dir(mapped_username);
-                               DEBUG(3,("checking for home directory %s gave
%s\n",service,
-                               phome_dir?phome_dir:"(NULL)"));
-                               iService =
add_home_service(mapped_username,mapped_username /* 'username' */, phome_dir);
-                               if (iService >= 0)
-                                       fstrcpy(service, mapped_username);
-                       }
-
-               } else {
+                       if(map_username(service))
+                               phome_dir = get_user_home_dir(service);
+               }

-                       DEBUG(3,("checking for home directory %s gave %s\n",service,
-                               phome_dir?phome_dir:"(NULL)"));
+               DEBUG(3,("checking for home directory %s gave %s\n",service,
+                       phome_dir?phome_dir:"(NULL)"));

-                       iService = add_home_service(service,service /*
'username' */, phome_dir);
-               }
+               iService = add_home_service(service,service /* 'username' */,
phome_dir);
        }

        /* If we still don't have a service, attempt to add it as a printer. */

calling map_username in find_service changes the servicename. find_service is
called by set_printer_hnd_name, which then can't find any printer with the
changed servicename. 
After reading through the code, i had the impression that dynamically genereted
printer shres (i.e. "load printers = yes") can't be found if using a username
map, too!
Comment 3 Gerald (Jerry) Carter (dead mail address) 2005-11-22 08:32:41 UTC
Good catch.  Not the patch I would do.  I'll attach a fix shortly.
Comment 4 Gerald (Jerry) Carter (dead mail address) 2005-11-22 08:46:33 UTC
Created attachment 1588 [details]
remove use of find_service when looking for a printername specifically
Comment 5 Gerald (Jerry) Carter (dead mail address) 2005-11-22 08:47:22 UTC
should be fixed by the attached patch.  Does in my testing 
at least.  Thanks for teh bug report.
Comment 6 Gerald (Jerry) Carter (dead mail address) 2005-11-22 08:50:47 UTC
Created attachment 1589 [details]
too much in the last patch.  This is only the necessary changes