~lefteris-nikoltsios/+junk/samba-lp1016895

« back to all changes in this revision

Viewing changes to source3/smbd/lanman.c

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2011-12-21 13:18:04 UTC
  • mfrom: (0.39.21 sid)
  • Revision ID: package-import@ubuntu.com-20111221131804-xtlr39wx6njehxxr
Tags: 2:3.6.1-3ubuntu1
* Merge from Debian testing.  Remaining changes:
  + debian/patches/VERSION.patch:
    - set SAMBA_VERSION_SUFFIX to Ubuntu.
  + debian/patches/error-trans.fix-276472:
    - Add the translation of Unix Error code -ENOTSUP to NT Error Code
    - NT_STATUS_NOT_SUPPORTED to prevent the Permission denied error.
  + debian/smb.conf:
    - add "(Samba, Ubuntu)" to server string.
    - comment out the default [homes] share, and add a comment about
      "valid users = %S" to show users how to restrict access to
      \\server\username to only username.
    - Set 'usershare allow guests', so that usershare admins are 
      allowed to create public shares in addition to authenticated
      ones.
    - add map to guest = Bad user, maps bad username to guest access.
  + debian/samba-common.config:
    - Do not change priority to high if dhclient3 is installed.
    - Use priority medium instead of high for the workgroup question.
  + debian/control:
    - Don't build against or suggest ctdb.
    - Add dependency on samba-common-bin to samba.
  + Add ufw integration:
    - Created debian/samba.ufw.profile
    - debian/rules, debian/samba.dirs, debian/samba.files: install
      profile
    - debian/control: have samba suggest ufw
  + Add apport hook:
    - Created debian/source_samba.py.
    - debian/rules, debian/samba.dirs, debian/samba-common-bin.files: install
  + Switch to upstart:
    - Add debian/samba.{nmbd,smbd}.upstart.
  + debian/samba.logrotate, debian/samba-common.dhcp, debian/samba.if-up:
    - Make them upstart compatible
  + debian/samba.postinst: 
    - Avoid scary pdbedit warnings on first import.
  + debian/samba-common.postinst: Add more informative error message for
    the case where smb.conf was manually deleted
  + debian/patches/fix-debuglevel-name-conflict.patch: don't use 'debug_level'
    as a global variable name in an NSS module 
  + Dropped:
    - debian/patches/error-trans.fix-276472
    - debian/patches/fix-debuglevel-name-conflict.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
 
1
/*
2
2
   Unix SMB/CIFS implementation.
3
3
   Inter-process communication and named pipe handling
4
4
   Copyright (C) Andrew Tridgell 1992-1998
26
26
   */
27
27
 
28
28
#include "includes.h"
 
29
#include "smbd/smbd.h"
29
30
#include "smbd/globals.h"
30
 
#include "../librpc/gen_ndr/cli_samr.h"
31
 
#include "../librpc/gen_ndr/srv_samr.h"
 
31
#include "rpc_client/rpc_client.h"
 
32
#include "../librpc/gen_ndr/ndr_samr_c.h"
 
33
#include "../librpc/gen_ndr/ndr_spoolss_c.h"
 
34
#include "rpc_client/cli_spoolss.h"
 
35
#include "rpc_client/init_spoolss.h"
 
36
#include "../librpc/gen_ndr/ndr_srvsvc_c.h"
 
37
#include "../librpc/gen_ndr/rap.h"
32
38
#include "../lib/util/binsearch.h"
 
39
#include "../libcli/auth/libcli_auth.h"
 
40
#include "rpc_client/init_lsa.h"
 
41
#include "../libcli/security/security.h"
 
42
#include "printing.h"
 
43
#include "passdb/machine_sid.h"
 
44
#include "auth.h"
 
45
#include "rpc_server/rpc_ncacn_np.h"
33
46
 
34
47
#ifdef CHECK_TYPES
35
48
#undef CHECK_TYPES
65
78
        return val;
66
79
}
67
80
 
68
 
static bool api_Unsupported(connection_struct *conn, uint16 vuid,
 
81
static bool api_Unsupported(struct smbd_server_connection *sconn,
 
82
                            connection_struct *conn, uint16 vuid,
69
83
                                char *param, int tpscnt,
70
84
                                char *data, int tdscnt,
71
85
                                int mdrcnt, int mprcnt,
72
86
                                char **rdata, char **rparam,
73
87
                                int *rdata_len, int *rparam_len);
74
88
 
75
 
static bool api_TooSmall(connection_struct *conn, uint16 vuid, char *param, char *data,
 
89
static bool api_TooSmall(struct smbd_server_connection *sconn,
 
90
                         connection_struct *conn, uint16 vuid, char *param, char *data,
76
91
                         int mdrcnt, int mprcnt,
77
92
                         char **rdata, char **rparam,
78
93
                         int *rdata_len, int *rparam_len);
102
117
        }
103
118
        buf = talloc_sub_advanced(ctx,
104
119
                                lp_servicename(SNUM(conn)),
105
 
                                conn->server_info->unix_name,
 
120
                                conn->session_info->unix_name,
106
121
                                conn->connectpath,
107
 
                                conn->server_info->utok.gid,
108
 
                                conn->server_info->sanitized_username,
109
 
                                pdb_get_domain(conn->server_info->sam_account),
 
122
                                conn->session_info->utok.gid,
 
123
                                conn->session_info->sanitized_username,
 
124
                                conn->session_info->info3->base.domain.string,
110
125
                                buf);
111
126
        if (!buf) {
112
127
                *p_space_remaining = 0;
153
168
        }
154
169
        buf = talloc_sub_advanced(ctx,
155
170
                                lp_servicename(SNUM(conn)),
156
 
                                conn->server_info->unix_name,
 
171
                                conn->session_info->unix_name,
157
172
                                conn->connectpath,
158
 
                                conn->server_info->utok.gid,
159
 
                                conn->server_info->sanitized_username,
160
 
                                pdb_get_domain(conn->server_info->sam_account),
 
173
                                conn->session_info->utok.gid,
 
174
                                conn->session_info->sanitized_username,
 
175
                                conn->session_info->info3->base.domain.string,
161
176
                                buf);
162
177
        if (!buf) {
163
178
                return 0;
165
180
        return strlen(buf) + 1;
166
181
}
167
182
 
168
 
static char *Expand(connection_struct *conn, int snum, char *s)
169
 
{
170
 
        TALLOC_CTX *ctx = talloc_tos();
171
 
        char *buf = NULL;
172
 
 
173
 
        if (!s) {
174
 
                return NULL;
175
 
        }
176
 
        buf = talloc_strdup(ctx,s);
177
 
        if (!buf) {
178
 
                return 0;
179
 
        }
180
 
        buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(snum));
181
 
        if (!buf) {
182
 
                return 0;
183
 
        }
184
 
        return talloc_sub_advanced(ctx,
185
 
                                lp_servicename(SNUM(conn)),
186
 
                                conn->server_info->unix_name,
187
 
                                conn->connectpath,
188
 
                                conn->server_info->utok.gid,
189
 
                                conn->server_info->sanitized_username,
190
 
                                pdb_get_domain(conn->server_info->sam_account),
191
 
                                buf);
192
 
}
193
 
 
194
183
/*******************************************************************
195
184
 Check a API string for validity when we only need to check the prefix.
196
185
******************************************************************/
207
196
        int buflen;        /* remaining size for fixed part; on init: length of base */
208
197
        int subcount;       /* count of substructures */
209
198
        char *structbuf;  /* pointer into buffer for remaining fixed part */
210
 
        int stringlen;    /* remaining size for variable part */                
 
199
        int stringlen;    /* remaining size for variable part */
211
200
        char *stringbuf;  /* pointer into buffer for remaining variable part */
212
201
        int neededlen;    /* total needed size */
213
202
        int usedlen;        /* total used size (usedlen <= neededlen and usedlen <= buflen) */
528
517
#define RAP_QUEUE_STATUS_PAUSED 1
529
518
#define RAP_QUEUE_STATUS_ERROR 2
530
519
 
531
 
/* turn a print job status into a on the wire status 
 
520
/* turn a print job status into a on the wire status
532
521
*/
533
 
static int printj_status(int v)
 
522
static int printj_spoolss_status(int v)
534
523
{
535
 
        switch (v) {
536
 
        case LPQ_QUEUED:
 
524
        if (v == JOB_STATUS_QUEUED)
537
525
                return RAP_JOB_STATUS_QUEUED;
538
 
        case LPQ_PAUSED:
 
526
        if (v & JOB_STATUS_PAUSED)
539
527
                return RAP_JOB_STATUS_PAUSED;
540
 
        case LPQ_SPOOLING:
 
528
        if (v & JOB_STATUS_SPOOLING)
541
529
                return RAP_JOB_STATUS_SPOOLING;
542
 
        case LPQ_PRINTING:
 
530
        if (v & JOB_STATUS_PRINTING)
543
531
                return RAP_JOB_STATUS_PRINTING;
544
 
        }
545
532
        return 0;
546
533
}
547
534
 
548
 
/* turn a print queue status into a on the wire status 
 
535
/* turn a print queue status into a on the wire status
549
536
*/
550
 
static int printq_status(int v)
 
537
static int printq_spoolss_status(int v)
551
538
{
552
 
        switch (v) {
553
 
        case LPQ_QUEUED:
 
539
        if (v == PRINTER_STATUS_OK)
554
540
                return 0;
555
 
        case LPQ_PAUSED:
 
541
        if (v & PRINTER_STATUS_PAUSED)
556
542
                return RAP_QUEUE_STATUS_PAUSED;
557
 
        }
558
543
        return RAP_QUEUE_STATUS_ERROR;
559
544
}
560
545
 
561
 
static void fill_printjob_info(connection_struct *conn, int snum, int uLevel,
562
 
                               struct pack_desc *desc,
563
 
                               print_queue_struct *queue, int n)
 
546
static void fill_spoolss_printjob_info(int uLevel,
 
547
                                       struct pack_desc *desc,
 
548
                                       struct spoolss_JobInfo2 *info2,
 
549
                                       int n)
564
550
{
565
 
        time_t t = queue->time;
 
551
        time_t t = spoolss_Time_to_time_t(&info2->submitted);
566
552
 
567
553
        /* the client expects localtime */
568
554
        t -= get_time_zone(t);
569
555
 
570
 
        PACKI(desc,"W",pjobid_to_rap(lp_const_servicename(snum),queue->job)); /* uJobId */
 
556
        PACKI(desc,"W",pjobid_to_rap(info2->printer_name, info2->job_id)); /* uJobId */
571
557
        if (uLevel == 1) {
572
 
                PACKS(desc,"B21",queue->fs_user); /* szUserName */
 
558
                PACKS(desc,"B21", info2->user_name); /* szUserName */
573
559
                PACKS(desc,"B","");             /* pad */
574
560
                PACKS(desc,"B16","");   /* szNotifyName */
575
561
                PACKS(desc,"B10","PM_Q_RAW"); /* szDataType */
576
562
                PACKS(desc,"z","");             /* pszParms */
577
563
                PACKI(desc,"W",n+1);            /* uPosition */
578
 
                PACKI(desc,"W",printj_status(queue->status)); /* fsStatus */
 
564
                PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */
579
565
                PACKS(desc,"z","");             /* pszStatus */
580
 
                PACKI(desc,"D",t); /* ulSubmitted */
581
 
                PACKI(desc,"D",queue->size); /* ulSize */
582
 
                PACKS(desc,"z",queue->fs_file); /* pszComment */
 
566
                PACKI(desc,"D", t); /* ulSubmitted */
 
567
                PACKI(desc,"D", info2->size); /* ulSize */
 
568
                PACKS(desc,"z", info2->document_name); /* pszComment */
583
569
        }
584
570
        if (uLevel == 2 || uLevel == 3 || uLevel == 4) {
585
 
                PACKI(desc,"W",queue->priority);                /* uPriority */
586
 
                PACKS(desc,"z",queue->fs_user); /* pszUserName */
 
571
                PACKI(desc,"W", info2->priority);               /* uPriority */
 
572
                PACKS(desc,"z", info2->user_name); /* pszUserName */
587
573
                PACKI(desc,"W",n+1);            /* uPosition */
588
 
                PACKI(desc,"W",printj_status(queue->status)); /* fsStatus */
 
574
                PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */
589
575
                PACKI(desc,"D",t); /* ulSubmitted */
590
 
                PACKI(desc,"D",queue->size); /* ulSize */
 
576
                PACKI(desc,"D", info2->size); /* ulSize */
591
577
                PACKS(desc,"z","Samba");        /* pszComment */
592
 
                PACKS(desc,"z",queue->fs_file); /* pszDocument */
 
578
                PACKS(desc,"z", info2->document_name); /* pszDocument */
593
579
                if (uLevel == 3) {
594
580
                        PACKS(desc,"z","");     /* pszNotifyName */
595
581
                        PACKS(desc,"z","PM_Q_RAW"); /* pszDataType */
596
582
                        PACKS(desc,"z","");     /* pszParms */
597
583
                        PACKS(desc,"z","");     /* pszStatus */
598
 
                        PACKS(desc,"z",SERVICE(snum)); /* pszQueue */
 
584
                        PACKS(desc,"z", info2->printer_name); /* pszQueue */
599
585
                        PACKS(desc,"z","lpd");  /* pszQProcName */
600
586
                        PACKS(desc,"z","");     /* pszQProcParms */
601
587
                        PACKS(desc,"z","NULL"); /* pszDriverName */
617
603
}
618
604
 
619
605
/********************************************************************
620
 
 Return a driver name given an snum.
621
 
 Returns True if from tdb, False otherwise.
622
 
 ********************************************************************/
623
 
 
624
 
static bool get_driver_name(int snum, char **pp_drivername)
625
 
{
626
 
        NT_PRINTER_INFO_LEVEL *info = NULL;
627
 
        bool in_tdb = false;
628
 
 
629
 
        get_a_printer (NULL, &info, 2, lp_servicename(snum));
630
 
        if (info != NULL) {
631
 
                *pp_drivername = talloc_strdup(talloc_tos(),
632
 
                                        info->info_2->drivername);
633
 
                in_tdb = true;
634
 
                free_a_printer(&info, 2);
635
 
                if (!*pp_drivername) {
636
 
                        return false;
637
 
                }
638
 
        }
639
 
 
640
 
        return in_tdb;
641
 
}
642
 
 
643
 
/********************************************************************
644
606
 Respond to the DosPrintQInfo command with a level of 52
645
607
 This is used to get printer driver information for Win9x clients
646
608
 ********************************************************************/
647
 
static void fill_printq_info_52(connection_struct *conn, int snum, 
648
 
                                struct pack_desc* desc, int count )
 
609
static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver,
 
610
                                struct pack_desc* desc, int count,
 
611
                                const char *printer_name)
649
612
{
650
613
        int                             i;
651
614
        fstring                         location;
652
 
        struct spoolss_DriverInfo8 *driver = NULL;
653
 
        NT_PRINTER_INFO_LEVEL           *printer = NULL;
654
 
 
655
 
        if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) {
656
 
                DEBUG(3,("fill_printq_info_52: Failed to lookup printer [%s]\n", 
657
 
                        lp_servicename(snum)));
658
 
                goto err;
659
 
        }
660
 
 
661
 
        if (!W_ERROR_IS_OK(get_a_printer_driver(talloc_tos(), &driver, printer->info_2->drivername,
662
 
                "Windows 4.0", 0)) )
663
 
        {
664
 
                DEBUG(3,("fill_printq_info_52: Failed to lookup driver [%s]\n", 
665
 
                        printer->info_2->drivername));
666
 
                goto err;
667
 
        }
668
 
 
669
615
        trim_string((char *)driver->driver_path, "\\print$\\WIN40\\0\\", 0);
670
616
        trim_string((char *)driver->data_file, "\\print$\\WIN40\\0\\", 0);
671
617
        trim_string((char *)driver->help_file, "\\print$\\WIN40\\0\\", 0);
705
651
                DEBUG(3,("fill_printq_info_52: file count specified by client [%d] != number of dependent files [%i]\n",
706
652
                        count, i));
707
653
 
708
 
        DEBUG(3,("fill_printq_info on <%s> gave %d entries\n", SERVICE(snum),i));
 
654
        DEBUG(3,("fill_printq_info on <%s> gave %d entries\n", printer_name, i));
709
655
 
710
656
        desc->errcode=NERR_Success;
711
 
        goto done;
712
 
 
713
 
err:
714
 
        DEBUG(3,("fill_printq_info: Can't supply driver files\n"));
715
 
        desc->errcode=NERR_notsupported;
716
 
 
717
 
done:
718
 
        if ( printer )
719
 
                free_a_printer( &printer, 2 );
720
 
 
721
 
        free_a_printer_driver(driver);
722
 
}
723
 
 
724
 
 
725
 
static void fill_printq_info(connection_struct *conn, int snum, int uLevel,
 
657
 
 
658
}
 
659
 
 
660
static const char *strip_unc(const char *unc)
 
661
{
 
662
        char *p;
 
663
 
 
664
        if (unc == NULL) {
 
665
                return NULL;
 
666
        }
 
667
 
 
668
        if ((p = strrchr(unc, '\\')) != NULL) {
 
669
                return p+1;
 
670
        }
 
671
 
 
672
        return unc;
 
673
}
 
674
 
 
675
static void fill_printq_info(int uLevel,
726
676
                             struct pack_desc* desc,
727
 
                             int count, print_queue_struct* queue,
728
 
                             print_status_struct* status)
 
677
                             int count,
 
678
                             union spoolss_JobInfo *job_info,
 
679
                             struct spoolss_DriverInfo3 *driver_info,
 
680
                             struct spoolss_PrinterInfo2 *printer_info)
729
681
{
730
682
        switch (uLevel) {
 
683
        case 0:
731
684
        case 1:
732
685
        case 2:
733
 
                PACKS(desc,"B13",SERVICE(snum));
 
686
                PACKS(desc,"B13", strip_unc(printer_info->printername));
734
687
                break;
735
688
        case 3:
736
689
        case 4:
737
690
        case 5:
738
 
                PACKS(desc,"z",Expand(conn,snum,SERVICE(snum)));
 
691
                PACKS(desc,"z", strip_unc(printer_info->printername));
739
692
                break;
740
693
        case 51:
741
 
                PACKI(desc,"K",printq_status(status->status));
 
694
                PACKI(desc,"K", printq_spoolss_status(printer_info->status));
742
695
                break;
743
696
        }
744
697
 
749
702
                PACKI(desc,"W",0);              /* until time */
750
703
                PACKS(desc,"z","");             /* pSepFile */
751
704
                PACKS(desc,"z","lpd");  /* pPrProc */
752
 
                PACKS(desc,"z",SERVICE(snum)); /* pDestinations */
 
705
                PACKS(desc,"z", strip_unc(printer_info->printername)); /* pDestinations */
753
706
                PACKS(desc,"z","");             /* pParms */
754
 
                if (snum < 0) {
 
707
                if (printer_info->printername == NULL) {
755
708
                        PACKS(desc,"z","UNKNOWN PRINTER");
756
709
                        PACKI(desc,"W",LPSTAT_ERROR);
757
 
                }
758
 
                else if (!status || !status->message[0]) {
759
 
                        PACKS(desc,"z",Expand(conn,snum,lp_comment(snum)));
760
 
                        PACKI(desc,"W",LPSTAT_OK); /* status */
761
710
                } else {
762
 
                        PACKS(desc,"z",status->message);
763
 
                        PACKI(desc,"W",printq_status(status->status)); /* status */
 
711
                        PACKS(desc,"z", printer_info->comment);
 
712
                        PACKI(desc,"W", printq_spoolss_status(printer_info->status)); /* status */
764
713
                }
765
714
                PACKI(desc,(uLevel == 1 ? "W" : "N"),count);
766
715
        }
767
716
 
768
717
        if (uLevel == 3 || uLevel == 4) {
769
 
                char *drivername = NULL;
770
 
 
771
718
                PACKI(desc,"W",5);              /* uPriority */
772
719
                PACKI(desc,"W",0);              /* uStarttime */
773
720
                PACKI(desc,"W",0);              /* uUntiltime */
778
725
                PACKS(desc,"z",NULL);           /* pszComment - don't ask.... JRA */
779
726
                /* "don't ask" that it's done this way to fix corrupted
780
727
                   Win9X/ME printer comments. */
781
 
                if (!status) {
782
 
                        PACKI(desc,"W",LPSTAT_OK); /* fsStatus */
783
 
                } else {
784
 
                        PACKI(desc,"W",printq_status(status->status)); /* fsStatus */
785
 
                }
 
728
                PACKI(desc,"W", printq_spoolss_status(printer_info->status)); /* fsStatus */
786
729
                PACKI(desc,(uLevel == 3 ? "W" : "N"),count);    /* cJobs */
787
 
                PACKS(desc,"z",SERVICE(snum)); /* pszPrinters */
788
 
                get_driver_name(snum,&drivername);
789
 
                if (!drivername) {
790
 
                        return;
791
 
                }
792
 
                PACKS(desc,"z",drivername);             /* pszDriverName */
 
730
                PACKS(desc,"z", strip_unc(printer_info->printername)); /* pszPrinters */
 
731
                PACKS(desc,"z", printer_info->drivername);              /* pszDriverName */
793
732
                PackDriverData(desc);   /* pDriverData */
794
733
        }
795
734
 
796
735
        if (uLevel == 2 || uLevel == 4) {
797
736
                int i;
798
 
                for (i=0;i<count;i++)
799
 
                        fill_printjob_info(conn,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);
 
737
                for (i = 0; i < count; i++) {
 
738
                        fill_spoolss_printjob_info(uLevel == 2 ? 1 : 2, desc, &job_info[i].info2, i);
 
739
                }
800
740
        }
801
741
 
802
742
        if (uLevel==52)
803
 
                fill_printq_info_52( conn, snum, desc, count );
 
743
                fill_printq_info_52(driver_info, desc, count, printer_info->printername);
804
744
}
805
745
 
806
746
/* This function returns the number of files for a given driver */
807
 
static int get_printerdrivernumber(int snum)
 
747
static int get_printerdrivernumber(const struct spoolss_DriverInfo3 *driver)
808
748
{
809
749
        int                             result = 0;
810
 
        struct spoolss_DriverInfo8 *driver;
811
 
        NT_PRINTER_INFO_LEVEL           *printer = NULL;
812
 
 
813
 
        ZERO_STRUCT(driver);
814
 
 
815
 
        if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) {
816
 
                DEBUG(3,("get_printerdrivernumber: Failed to lookup printer [%s]\n", 
817
 
                        lp_servicename(snum)));
818
 
                goto done;
819
 
        }
820
 
 
821
 
        if (!W_ERROR_IS_OK(get_a_printer_driver(talloc_tos(), &driver, printer->info_2->drivername,
822
 
                "Windows 4.0", 0)) )
823
 
        {
824
 
                DEBUG(3,("get_printerdrivernumber: Failed to lookup driver [%s]\n", 
825
 
                        printer->info_2->drivername));
826
 
                goto done;
827
 
        }
828
750
 
829
751
        /* count the number of files */
830
752
        while (driver->dependent_files && *driver->dependent_files[result])
831
753
                result++;
832
 
 done:
833
 
        if ( printer )
834
 
                free_a_printer( &printer, 2 );
835
 
 
836
 
        free_a_printer_driver(driver);
837
754
 
838
755
        return result;
839
756
}
840
757
 
841
 
static bool api_DosPrintQGetInfo(connection_struct *conn, uint16 vuid,
 
758
static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn,
 
759
                                 connection_struct *conn, uint16 vuid,
842
760
                                char *param, int tpscnt,
843
761
                                char *data, int tdscnt,
844
762
                                int mdrcnt,int mprcnt,
850
768
        char *p = skip_string(param,tpscnt,str2);
851
769
        char *QueueName = p;
852
770
        unsigned int uLevel;
853
 
        int count=0;
854
 
        int snum;
 
771
        uint32_t count = 0;
855
772
        char *str3;
856
773
        struct pack_desc desc;
857
 
        print_queue_struct *queue=NULL;
858
 
        print_status_struct status;
859
774
        char* tmpdata=NULL;
860
775
 
 
776
        WERROR werr = WERR_OK;
 
777
        TALLOC_CTX *mem_ctx = talloc_tos();
 
778
        NTSTATUS status;
 
779
        struct rpc_pipe_client *cli = NULL;
 
780
        struct dcerpc_binding_handle *b = NULL;
 
781
        struct policy_handle handle;
 
782
        struct spoolss_DevmodeContainer devmode_ctr;
 
783
        union spoolss_DriverInfo driver_info;
 
784
        union spoolss_JobInfo *job_info = NULL;
 
785
        union spoolss_PrinterInfo printer_info;
 
786
 
861
787
        if (!str1 || !str2 || !p) {
862
788
                return False;
863
789
        }
864
 
        memset((char *)&status,'\0',sizeof(status));
865
790
        memset((char *)&desc,'\0',sizeof(desc));
866
791
 
867
792
        p = skip_string(param,tpscnt,p);
899
824
                return(True);
900
825
        }
901
826
 
902
 
        snum = find_service(QueueName);
903
 
        if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) )
904
 
                return False;
 
827
        ZERO_STRUCT(handle);
 
828
 
 
829
        if (QueueName == NULL || (strlen(QueueName) < 1)) {
 
830
                desc.errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
831
                goto out;
 
832
        }
 
833
 
 
834
        status = rpc_pipe_open_interface(conn,
 
835
                                         &ndr_table_spoolss.syntax_id,
 
836
                                         conn->session_info,
 
837
                                         &conn->sconn->client_id,
 
838
                                         conn->sconn->msg_ctx,
 
839
                                         &cli);
 
840
        if (!NT_STATUS_IS_OK(status)) {
 
841
                DEBUG(0,("api_DosPrintQGetInfo: could not connect to spoolss: %s\n",
 
842
                          nt_errstr(status)));
 
843
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
844
                goto out;
 
845
        }
 
846
        b = cli->binding_handle;
 
847
 
 
848
        ZERO_STRUCT(devmode_ctr);
 
849
 
 
850
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
851
                                            QueueName,
 
852
                                            "RAW",
 
853
                                            devmode_ctr,
 
854
                                            PRINTER_ACCESS_USE,
 
855
                                            &handle,
 
856
                                            &werr);
 
857
        if (!NT_STATUS_IS_OK(status)) {
 
858
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
859
                goto out;
 
860
        }
 
861
        if (!W_ERROR_IS_OK(werr)) {
 
862
                desc.errcode = W_ERROR_V(werr);
 
863
                goto out;
 
864
        }
 
865
 
 
866
        werr = rpccli_spoolss_getprinter(cli, mem_ctx,
 
867
                                         &handle,
 
868
                                         2,
 
869
                                         0,
 
870
                                         &printer_info);
 
871
        if (!W_ERROR_IS_OK(werr)) {
 
872
                desc.errcode = W_ERROR_V(werr);
 
873
                goto out;
 
874
        }
905
875
 
906
876
        if (uLevel==52) {
907
 
                count = get_printerdrivernumber(snum);
 
877
                uint32_t server_major_version;
 
878
                uint32_t server_minor_version;
 
879
 
 
880
                werr = rpccli_spoolss_getprinterdriver2(cli, mem_ctx,
 
881
                                                        &handle,
 
882
                                                        "Windows 4.0",
 
883
                                                        3, /* level */
 
884
                                                        0,
 
885
                                                        0, /* version */
 
886
                                                        0,
 
887
                                                        &driver_info,
 
888
                                                        &server_major_version,
 
889
                                                        &server_minor_version);
 
890
                if (!W_ERROR_IS_OK(werr)) {
 
891
                        desc.errcode = W_ERROR_V(werr);
 
892
                        goto out;
 
893
                }
 
894
 
 
895
                count = get_printerdrivernumber(&driver_info.info3);
908
896
                DEBUG(3,("api_DosPrintQGetInfo: Driver files count: %d\n",count));
909
897
        } else {
910
 
                count = print_queue_status(snum, &queue,&status);
 
898
                uint32_t num_jobs;
 
899
                werr = rpccli_spoolss_enumjobs(cli, mem_ctx,
 
900
                                               &handle,
 
901
                                               0, /* firstjob */
 
902
                                               0xff, /* numjobs */
 
903
                                               2, /* level */
 
904
                                               0, /* offered */
 
905
                                               &num_jobs,
 
906
                                               &job_info);
 
907
                if (!W_ERROR_IS_OK(werr)) {
 
908
                        desc.errcode = W_ERROR_V(werr);
 
909
                        goto out;
 
910
                }
 
911
 
 
912
                count = num_jobs;
911
913
        }
912
914
 
913
915
        if (mdrcnt > 0) {
914
916
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
915
917
                if (!*rdata) {
916
 
                        SAFE_FREE(queue);
917
918
                        return False;
918
919
                }
919
920
                desc.base = *rdata;
929
930
 
930
931
        if (init_package(&desc,1,count)) {
931
932
                desc.subcount = count;
932
 
                fill_printq_info(conn,snum,uLevel,&desc,count,queue,&status);
 
933
                fill_printq_info(uLevel,&desc,count, job_info, &driver_info.info3, &printer_info.info2);
933
934
        }
934
935
 
935
936
        *rdata_len = desc.usedlen;
942
943
        if (!mdrcnt && lp_disable_spoolss())
943
944
                desc.errcode = ERRbuftoosmall;
944
945
 
 
946
 out:
 
947
        if (b && is_valid_policy_hnd(&handle)) {
 
948
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
949
        }
 
950
 
945
951
        *rdata_len = desc.usedlen;
946
952
        *rparam_len = 6;
947
953
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
948
954
        if (!*rparam) {
949
 
                SAFE_FREE(queue);
950
955
                SAFE_FREE(tmpdata);
951
956
                return False;
952
957
        }
956
961
 
957
962
        DEBUG(4,("printqgetinfo: errorcode %d\n",desc.errcode));
958
963
 
959
 
        SAFE_FREE(queue);
960
964
        SAFE_FREE(tmpdata);
961
965
 
962
966
        return(True);
966
970
 View list of all print jobs on all queues.
967
971
****************************************************************************/
968
972
 
969
 
static bool api_DosPrintQEnum(connection_struct *conn, uint16 vuid,
 
973
static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
 
974
                              connection_struct *conn, uint16 vuid,
970
975
                                char *param, int tpscnt,
971
976
                                char *data, int tdscnt,
972
977
                                int mdrcnt, int mprcnt,
978
983
        char *p = skip_string(param,tpscnt,output_format1);
979
984
        unsigned int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
980
985
        char *output_format2 = get_safe_str_ptr(param,tpscnt,p,4);
981
 
        int services = lp_numservices();
982
 
        int i, n;
 
986
        int i;
983
987
        struct pack_desc desc;
984
 
        print_queue_struct **queue = NULL;
985
 
        print_status_struct *status = NULL;
986
988
        int *subcntarr = NULL;
987
989
        int queuecnt = 0, subcnt = 0, succnt = 0;
988
990
 
 
991
        WERROR werr = WERR_OK;
 
992
        TALLOC_CTX *mem_ctx = talloc_tos();
 
993
        NTSTATUS status;
 
994
        struct rpc_pipe_client *cli = NULL;
 
995
        struct dcerpc_binding_handle *b = NULL;
 
996
        struct spoolss_DevmodeContainer devmode_ctr;
 
997
        uint32_t num_printers;
 
998
        union spoolss_PrinterInfo *printer_info;
 
999
        union spoolss_DriverInfo *driver_info;
 
1000
        union spoolss_JobInfo **job_info;
 
1001
 
989
1002
        if (!param_format || !output_format1 || !p) {
990
1003
                return False;
991
1004
        }
1015
1028
                return(True);
1016
1029
        }
1017
1030
 
1018
 
        for (i = 0; i < services; i++) {
1019
 
                if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
1020
 
                        queuecnt++;
1021
 
                }
1022
 
        }
1023
 
 
1024
 
        if((queue = SMB_MALLOC_ARRAY(print_queue_struct*, queuecnt)) == NULL) {
1025
 
                DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
1026
 
                goto err;
1027
 
        }
1028
 
        memset(queue,0,queuecnt*sizeof(print_queue_struct*));
1029
 
        if((status = SMB_MALLOC_ARRAY(print_status_struct,queuecnt)) == NULL) {
1030
 
                DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
1031
 
                goto err;
1032
 
        }
1033
 
        memset(status,0,queuecnt*sizeof(print_status_struct));
 
1031
        status = rpc_pipe_open_interface(conn,
 
1032
                                         &ndr_table_spoolss.syntax_id,
 
1033
                                         conn->session_info,
 
1034
                                         &conn->sconn->client_id,
 
1035
                                         conn->sconn->msg_ctx,
 
1036
                                         &cli);
 
1037
        if (!NT_STATUS_IS_OK(status)) {
 
1038
                DEBUG(0,("api_DosPrintQEnum: could not connect to spoolss: %s\n",
 
1039
                          nt_errstr(status)));
 
1040
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
1041
                goto out;
 
1042
        }
 
1043
        b = cli->binding_handle;
 
1044
 
 
1045
        werr = rpccli_spoolss_enumprinters(cli, mem_ctx,
 
1046
                                           PRINTER_ENUM_LOCAL,
 
1047
                                           cli->srv_name_slash,
 
1048
                                           2,
 
1049
                                           0,
 
1050
                                           &num_printers,
 
1051
                                           &printer_info);
 
1052
        if (!W_ERROR_IS_OK(werr)) {
 
1053
                desc.errcode = W_ERROR_V(werr);
 
1054
                goto out;
 
1055
        }
 
1056
 
 
1057
        queuecnt = num_printers;
 
1058
 
 
1059
        job_info = talloc_array(mem_ctx, union spoolss_JobInfo *, num_printers);
 
1060
        if (job_info == NULL) {
 
1061
                goto err;
 
1062
        }
 
1063
 
 
1064
        driver_info = talloc_array(mem_ctx, union spoolss_DriverInfo, num_printers);
 
1065
        if (driver_info == NULL) {
 
1066
                goto err;
 
1067
        }
 
1068
 
1034
1069
        if((subcntarr = SMB_MALLOC_ARRAY(int,queuecnt)) == NULL) {
1035
1070
                DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
1036
1071
                goto err;
1037
1072
        }
1038
1073
 
 
1074
        if (mdrcnt > 0) {
 
1075
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
 
1076
                if (!*rdata) {
 
1077
                        goto err;
 
1078
                }
 
1079
        }
 
1080
        desc.base = *rdata;
 
1081
        desc.buflen = mdrcnt;
 
1082
 
1039
1083
        subcnt = 0;
1040
 
        n = 0;
1041
 
        for (i = 0; i < services; i++) {
1042
 
                if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
1043
 
                        subcntarr[n] = print_queue_status(i, &queue[n],&status[n]);
1044
 
                        subcnt += subcntarr[n];
1045
 
                        n++;
1046
 
                }
1047
 
        }
1048
 
 
1049
 
        if (mdrcnt > 0) {
1050
 
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
1051
 
                if (!*rdata) {
 
1084
        for (i = 0; i < num_printers; i++) {
 
1085
 
 
1086
                uint32_t num_jobs;
 
1087
                struct policy_handle handle;
 
1088
                const char *printername;
 
1089
 
 
1090
                printername = talloc_strdup(mem_ctx, printer_info[i].info2.printername);
 
1091
                if (printername == NULL) {
1052
1092
                        goto err;
1053
1093
                }
 
1094
 
 
1095
                ZERO_STRUCT(handle);
 
1096
                ZERO_STRUCT(devmode_ctr);
 
1097
 
 
1098
                status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
1099
                                                    printername,
 
1100
                                                    "RAW",
 
1101
                                                    devmode_ctr,
 
1102
                                                    PRINTER_ACCESS_USE,
 
1103
                                                    &handle,
 
1104
                                                    &werr);
 
1105
                if (!NT_STATUS_IS_OK(status)) {
 
1106
                        desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
1107
                        goto out;
 
1108
                }
 
1109
                if (!W_ERROR_IS_OK(werr)) {
 
1110
                        desc.errcode = W_ERROR_V(werr);
 
1111
                        goto out;
 
1112
                }
 
1113
 
 
1114
                werr = rpccli_spoolss_enumjobs(cli, mem_ctx,
 
1115
                                               &handle,
 
1116
                                               0, /* firstjob */
 
1117
                                               0xff, /* numjobs */
 
1118
                                               2, /* level */
 
1119
                                               0, /* offered */
 
1120
                                               &num_jobs,
 
1121
                                               &job_info[i]);
 
1122
                if (!W_ERROR_IS_OK(werr)) {
 
1123
                        desc.errcode = W_ERROR_V(werr);
 
1124
                        goto out;
 
1125
                }
 
1126
 
 
1127
                if (uLevel==52) {
 
1128
                        uint32_t server_major_version;
 
1129
                        uint32_t server_minor_version;
 
1130
 
 
1131
                        werr = rpccli_spoolss_getprinterdriver2(cli, mem_ctx,
 
1132
                                                                &handle,
 
1133
                                                                "Windows 4.0",
 
1134
                                                                3, /* level */
 
1135
                                                                0,
 
1136
                                                                0, /* version */
 
1137
                                                                0,
 
1138
                                                                &driver_info[i],
 
1139
                                                                &server_major_version,
 
1140
                                                                &server_minor_version);
 
1141
                        if (!W_ERROR_IS_OK(werr)) {
 
1142
                                desc.errcode = W_ERROR_V(werr);
 
1143
                                goto out;
 
1144
                        }
 
1145
                }
 
1146
 
 
1147
                subcntarr[i] = num_jobs;
 
1148
                subcnt += subcntarr[i];
 
1149
 
 
1150
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
1054
1151
        }
1055
 
        desc.base = *rdata;
1056
 
        desc.buflen = mdrcnt;
1057
1152
 
1058
1153
        if (init_package(&desc,queuecnt,subcnt)) {
1059
 
                n = 0;
1060
 
                succnt = 0;
1061
 
                for (i = 0; i < services; i++) {
1062
 
                        if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
1063
 
                                fill_printq_info(conn,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
1064
 
                                n++;
1065
 
                                if (desc.errcode == NERR_Success) {
1066
 
                                        succnt = n;
1067
 
                                }
 
1154
                for (i = 0; i < num_printers; i++) {
 
1155
                        fill_printq_info(uLevel,&desc,subcntarr[i], job_info[i], &driver_info[i].info3, &printer_info[i].info2);
 
1156
                        if (desc.errcode == NERR_Success) {
 
1157
                                succnt = i;
1068
1158
                        }
1069
1159
                }
1070
1160
        }
1071
1161
 
1072
1162
        SAFE_FREE(subcntarr);
1073
 
 
 
1163
 out:
1074
1164
        *rdata_len = desc.usedlen;
1075
1165
        *rparam_len = 8;
1076
1166
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
1082
1172
        SSVAL(*rparam,4,succnt);
1083
1173
        SSVAL(*rparam,6,queuecnt);
1084
1174
 
1085
 
        for (i = 0; i < queuecnt; i++) {
1086
 
                if (queue) {
1087
 
                        SAFE_FREE(queue[i]);
1088
 
                }
1089
 
        }
1090
 
 
1091
 
        SAFE_FREE(queue);
1092
 
        SAFE_FREE(status);
1093
 
 
1094
1175
        return True;
1095
1176
 
1096
1177
  err:
1097
1178
 
1098
1179
        SAFE_FREE(subcntarr);
1099
 
        for (i = 0; i < queuecnt; i++) {
1100
 
                if (queue) {
1101
 
                        SAFE_FREE(queue[i]);
1102
 
                }
1103
 
        }
1104
 
        SAFE_FREE(queue);
1105
 
        SAFE_FREE(status);
1106
1180
 
1107
1181
        return False;
1108
1182
}
1111
1185
 Get info level for a server list query.
1112
1186
****************************************************************************/
1113
1187
 
1114
 
static bool check_server_info(int uLevel, char* id)
 
1188
static bool check_session_info(int uLevel, char* id)
1115
1189
{
1116
1190
        switch( uLevel ) {
1117
1191
                case 0:
1124
1198
                                return False;
1125
1199
                        }
1126
1200
                        break;
1127
 
                default: 
 
1201
                default:
1128
1202
                        return False;
1129
1203
        }
1130
1204
        return True;
1143
1217
 number of entries.
1144
1218
******************************************************************/
1145
1219
 
1146
 
static int get_server_info(uint32 servertype, 
 
1220
static int get_session_info(uint32 servertype,
1147
1221
                           struct srv_info_struct **servers,
1148
1222
                           const char *domain)
1149
1223
{
1184
1258
                        alloced += 10;
1185
1259
                        *servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
1186
1260
                        if (!*servers) {
1187
 
                                DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
 
1261
                                DEBUG(0,("get_session_info: failed to enlarge servers info struct!\n"));
1188
1262
                                TALLOC_FREE(lines);
1189
1263
                                return 0;
1190
1264
                        }
1243
1317
                        ok = False;
1244
1318
                }
1245
1319
 
1246
 
                if ((servertype & SV_TYPE_DOMAIN_ENUM) != 
 
1320
                if ((servertype & SV_TYPE_DOMAIN_ENUM) !=
1247
1321
                                (s->type & SV_TYPE_DOMAIN_ENUM)) {
1248
1322
                        DEBUG(4,("s: dom mismatch "));
1249
1323
                        ok = False;
1275
1349
 Fill in a server info structure.
1276
1350
******************************************************************/
1277
1351
 
1278
 
static int fill_srv_info(struct srv_info_struct *service, 
1279
 
                         int uLevel, char **buf, int *buflen, 
 
1352
static int fill_srv_info(struct srv_info_struct *service,
 
1353
                         int uLevel, char **buf, int *buflen,
1280
1354
                         char **stringbuf, int *stringspace, char *baseaddr)
1281
1355
{
1282
1356
        int struct_len;
1361
1435
 extracted from lists saved by nmbd on the local host.
1362
1436
****************************************************************************/
1363
1437
 
1364
 
static bool api_RNetServerEnum2(connection_struct *conn, uint16 vuid,
 
1438
static bool api_RNetServerEnum2(struct smbd_server_connection *sconn,
 
1439
                                connection_struct *conn, uint16 vuid,
1365
1440
                                char *param, int tpscnt,
1366
1441
                                char *data, int tdscnt,
1367
 
                                int mdrcnt, int mprcnt, char **rdata, 
 
1442
                                int mdrcnt, int mprcnt, char **rdata,
1368
1443
                                char **rparam, int *rdata_len, int *rparam_len)
1369
1444
{
1370
1445
        char *str1 = get_safe_str_ptr(param, tpscnt, param, 2);
1396
1471
        }
1397
1472
 
1398
1473
        /* If someone sets SV_TYPE_LOCAL_LIST_ONLY but hasn't set
1399
 
           any other bit (they may just set this bit on its own) they 
1400
 
           want all the locally seen servers. However this bit can be 
1401
 
           set on its own so set the requested servers to be 
 
1474
           any other bit (they may just set this bit on its own) they
 
1475
           want all the locally seen servers. However this bit can be
 
1476
           set on its own so set the requested servers to be
1402
1477
           ALL - DOMAIN_ENUM. */
1403
1478
 
1404
1479
        if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) && !(servertype & SV_TYPE_DOMAIN_ENUM)) {
1413
1488
        if (!prefix_ok(str1,"WrLehD")) {
1414
1489
                return False;
1415
1490
        }
1416
 
        if (!check_server_info(uLevel,str2)) {
 
1491
        if (!check_session_info(uLevel,str2)) {
1417
1492
                return False;
1418
1493
        }
1419
1494
 
1433
1508
        DEBUG(4, ("domain [%s]\n", domain));
1434
1509
 
1435
1510
        if (lp_browse_list()) {
1436
 
                total = get_server_info(servertype,&servers,domain);
 
1511
                total = get_session_info(servertype,&servers,domain);
1437
1512
        }
1438
1513
 
1439
1514
        data_len = fixed_len = string_len = 0;
1440
1515
        missed = 0;
1441
1516
 
1442
 
        if (total > 0) {
1443
 
                qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
1444
 
        }
 
1517
        TYPESAFE_QSORT(servers, total, srv_comp);
1445
1518
 
1446
1519
        {
1447
1520
                char *lastname=NULL;
1532
1605
        return ret;
1533
1606
}
1534
1607
 
1535
 
static bool api_RNetServerEnum3(connection_struct *conn, uint16 vuid,
 
1608
static bool api_RNetServerEnum3(struct smbd_server_connection *sconn,
 
1609
                                connection_struct *conn, uint16 vuid,
1536
1610
                                char *param, int tpscnt,
1537
1611
                                char *data, int tdscnt,
1538
1612
                                int mdrcnt, int mprcnt, char **rdata,
1585
1659
        if (strcmp(str1, "WrLehDzz") != 0) {
1586
1660
                return false;
1587
1661
        }
1588
 
        if (!check_server_info(uLevel,str2)) {
 
1662
        if (!check_session_info(uLevel,str2)) {
1589
1663
                return False;
1590
1664
        }
1591
1665
 
1610
1684
                  domain, first_name));
1611
1685
 
1612
1686
        if (lp_browse_list()) {
1613
 
                total = get_server_info(servertype,&servers,domain);
 
1687
                total = get_session_info(servertype,&servers,domain);
1614
1688
        }
1615
1689
 
1616
1690
        data_len = fixed_len = string_len = 0;
1617
1691
        missed = 0;
1618
1692
 
1619
 
        if (total > 0) {
1620
 
                qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
1621
 
        }
 
1693
        TYPESAFE_QSORT(servers, total, srv_comp);
1622
1694
 
1623
1695
        if (first_name[0] != '\0') {
1624
1696
                struct srv_info_struct *first_server = NULL;
1726
1798
  command 0x34 - suspected of being a "Lookup Names" stub api
1727
1799
  ****************************************************************************/
1728
1800
 
1729
 
static bool api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid,
 
1801
static bool api_RNetGroupGetUsers(struct smbd_server_connection *sconn,
 
1802
                                  connection_struct *conn, uint16 vuid,
1730
1803
                                char *param, int tpscnt,
1731
1804
                                char *data, int tdscnt,
1732
 
                                int mdrcnt, int mprcnt, char **rdata, 
 
1805
                                int mdrcnt, int mprcnt, char **rdata,
1733
1806
                                char **rparam, int *rdata_len, int *rparam_len)
1734
1807
{
1735
1808
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
1916
1989
        return len;
1917
1990
}
1918
1991
 
1919
 
static bool api_RNetShareGetInfo(connection_struct *conn,uint16 vuid,
 
1992
static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn,
 
1993
                                 connection_struct *conn,uint16 vuid,
1920
1994
                                char *param, int tpscnt,
1921
1995
                                char *data, int tdscnt,
1922
1996
                                int mdrcnt,int mprcnt,
1925
1999
{
1926
2000
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
1927
2001
        char *str2 = skip_string(param,tpscnt,str1);
1928
 
        char *netname = skip_string(param,tpscnt,str2);
 
2002
        char *netname_in = skip_string(param,tpscnt,str2);
 
2003
        char *netname = NULL;
1929
2004
        char *p = skip_string(param,tpscnt,netname);
1930
2005
        int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
1931
2006
        int snum;
1934
2009
                return False;
1935
2010
        }
1936
2011
 
1937
 
        snum = find_service(netname);
1938
 
        if (snum < 0) {
 
2012
        snum = find_service(talloc_tos(), netname_in, &netname);
 
2013
        if (snum < 0 || !netname) {
1939
2014
                return False;
1940
2015
        }
1941
2016
 
1979
2054
  Share names longer than 12 bytes must be skipped.
1980
2055
 ****************************************************************************/
1981
2056
 
1982
 
static bool api_RNetShareEnum( connection_struct *conn, uint16 vuid,
 
2057
static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
 
2058
                              connection_struct *conn, uint16 vuid,
1983
2059
                                char *param, int tpscnt,
1984
2060
                                char *data, int tdscnt,
1985
2061
                                int                mdrcnt,
2086
2162
  Add a share
2087
2163
  ****************************************************************************/
2088
2164
 
2089
 
static bool api_RNetShareAdd(connection_struct *conn,uint16 vuid,
 
2165
static bool api_RNetShareAdd(struct smbd_server_connection *sconn,
 
2166
                             connection_struct *conn,uint16 vuid,
2090
2167
                                char *param, int tpscnt,
2091
2168
                                char *data, int tdscnt,
2092
2169
                                int mdrcnt,int mprcnt,
2100
2177
        fstring sharename;
2101
2178
        fstring comment;
2102
2179
        char *pathname = NULL;
2103
 
        char *command, *cmdname;
2104
2180
        unsigned int offset;
2105
 
        int snum;
2106
2181
        int res = ERRunsup;
2107
2182
        size_t converted_size;
2108
2183
 
 
2184
        WERROR werr = WERR_OK;
 
2185
        TALLOC_CTX *mem_ctx = talloc_tos();
 
2186
        NTSTATUS status;
 
2187
        struct rpc_pipe_client *cli = NULL;
 
2188
        union srvsvc_NetShareInfo info;
 
2189
        struct srvsvc_NetShareInfo2 info2;
 
2190
        struct dcerpc_binding_handle *b;
 
2191
 
2109
2192
        if (!str1 || !str2 || !p) {
2110
2193
                return False;
2111
2194
        }
2126
2209
                return False;
2127
2210
        }
2128
2211
        pull_ascii_fstring(sharename,data);
2129
 
        snum = find_service(sharename);
2130
 
        if (snum >= 0) { /* already exists */
2131
 
                res = ERRfilexists;
2132
 
                goto error_exit;
2133
 
        }
2134
2212
 
2135
2213
        if (mdrcnt < 28) {
2136
2214
                return False;
2144
2222
        offset = IVAL(data, 16);
2145
2223
        if (offset >= mdrcnt) {
2146
2224
                res = ERRinvalidparam;
2147
 
                goto error_exit;
 
2225
                goto out;
2148
2226
        }
2149
2227
 
2150
2228
        /* Do we have a string ? */
2157
2235
 
2158
2236
        if (offset >= mdrcnt) {
2159
2237
                res = ERRinvalidparam;
2160
 
                goto error_exit;
 
2238
                goto out;
2161
2239
        }
2162
2240
 
2163
2241
        /* Do we have a string ? */
2176
2254
                return false;
2177
2255
        }
2178
2256
 
2179
 
        string_replace(sharename, '"', ' ');
2180
 
        string_replace(pathname, '"', ' ');
2181
 
        string_replace(comment, '"', ' ');
2182
 
 
2183
 
        cmdname = lp_add_share_cmd();
2184
 
 
2185
 
        if (!cmdname || *cmdname == '\0') {
2186
 
                return False;
2187
 
        }
2188
 
 
2189
 
        if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
2190
 
                     lp_add_share_cmd(), get_dyn_CONFIGFILE(), sharename,
2191
 
                     pathname, comment) == -1) {
2192
 
                return false;
2193
 
        }
2194
 
 
2195
 
        DEBUG(10,("api_RNetShareAdd: Running [%s]\n", command ));
2196
 
 
2197
 
        if ((res = smbrun(command, NULL)) != 0) {
2198
 
                DEBUG(1,("api_RNetShareAdd: Running [%s] returned (%d)\n",
2199
 
                         command, res ));
2200
 
                SAFE_FREE(command);
2201
 
                res = ERRnoaccess;
2202
 
                goto error_exit;
2203
 
        } else {
2204
 
                SAFE_FREE(command);
2205
 
                message_send_all(smbd_messaging_context(),
2206
 
                                 MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
 
2257
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
 
2258
                                        conn->session_info,
 
2259
                                        &conn->sconn->client_id,
 
2260
                                        conn->sconn->msg_ctx,
 
2261
                                        &cli);
 
2262
        if (!NT_STATUS_IS_OK(status)) {
 
2263
                DEBUG(0,("api_RNetShareAdd: could not connect to srvsvc: %s\n",
 
2264
                          nt_errstr(status)));
 
2265
                res = W_ERROR_V(ntstatus_to_werror(status));
 
2266
                goto out;
 
2267
        }
 
2268
 
 
2269
        b = cli->binding_handle;
 
2270
 
 
2271
        info2.name              = sharename;
 
2272
        info2.type              = STYPE_DISKTREE;
 
2273
        info2.comment           = comment;
 
2274
        info2.permissions       = 0;
 
2275
        info2.max_users         = 0;
 
2276
        info2.current_users     = 0;
 
2277
        info2.path              = pathname;
 
2278
        info2.password          = NULL;
 
2279
 
 
2280
        info.info2 = &info2;
 
2281
 
 
2282
        status = dcerpc_srvsvc_NetShareAdd(b, mem_ctx,
 
2283
                                           cli->srv_name_slash,
 
2284
                                           2,
 
2285
                                           &info,
 
2286
                                           NULL,
 
2287
                                           &werr);
 
2288
        if (!NT_STATUS_IS_OK(status)) {
 
2289
                res = W_ERROR_V(ntstatus_to_werror(status));
 
2290
                goto out;
 
2291
        }
 
2292
        if (!W_ERROR_IS_OK(werr)) {
 
2293
                res = W_ERROR_V(werr);
 
2294
                goto out;
2207
2295
        }
2208
2296
 
2209
2297
        *rparam_len = 6;
2218
2306
 
2219
2307
        return True;
2220
2308
 
2221
 
  error_exit:
 
2309
  out:
2222
2310
 
2223
2311
        *rparam_len = 4;
2224
2312
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
2235
2323
  view list of groups available
2236
2324
  ****************************************************************************/
2237
2325
 
2238
 
static bool api_RNetGroupEnum(connection_struct *conn,uint16 vuid,
 
2326
static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
 
2327
                              connection_struct *conn,uint16 vuid,
2239
2328
                                char *param, int tpscnt,
2240
2329
                                char *data, int tdscnt,
2241
2330
                                int mdrcnt,int mprcnt,
2253
2342
        uint32_t resume_handle;
2254
2343
        struct rpc_pipe_client *samr_pipe;
2255
2344
        struct policy_handle samr_handle, domain_handle;
2256
 
        NTSTATUS status;
 
2345
        NTSTATUS status, result;
 
2346
        struct dcerpc_binding_handle *b;
2257
2347
 
2258
2348
        if (!str1 || !str2 || !p) {
2259
2349
                return False;
2263
2353
                return False;
2264
2354
        }
2265
2355
 
2266
 
        /* parameters  
 
2356
        /* parameters
2267
2357
         * W-> resume context (number of users to skip)
2268
 
         * r -> return parameter pointer to receive buffer 
 
2358
         * r -> return parameter pointer to receive buffer
2269
2359
         * L -> length of receive buffer
2270
2360
         * e -> return parameter number of entries
2271
2361
         * h -> return parameter total number of users
2275
2365
                return False;
2276
2366
        }
2277
2367
 
2278
 
        status = rpc_pipe_open_internal(
2279
 
                talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
2280
 
                conn->server_info, &samr_pipe);
 
2368
        status = rpc_pipe_open_interface(
 
2369
                talloc_tos(), &ndr_table_samr.syntax_id,
 
2370
                conn->session_info, &conn->sconn->client_id,
 
2371
                conn->sconn->msg_ctx, &samr_pipe);
2281
2372
        if (!NT_STATUS_IS_OK(status)) {
2282
2373
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
2283
2374
                          nt_errstr(status)));
2284
2375
                return false;
2285
2376
        }
2286
2377
 
2287
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
2288
 
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
 
2378
        b = samr_pipe->binding_handle;
 
2379
 
 
2380
        status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(),
 
2381
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
 
2382
                                      &result);
2289
2383
        if (!NT_STATUS_IS_OK(status)) {
2290
2384
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
2291
2385
                          nt_errstr(status)));
2292
2386
                return false;
2293
2387
        }
 
2388
        if (!NT_STATUS_IS_OK(result)) {
 
2389
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
 
2390
                          nt_errstr(result)));
 
2391
                return false;
 
2392
        }
2294
2393
 
2295
 
        status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
 
2394
        status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
2296
2395
                                        SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
2297
 
                                        get_global_sam_sid(), &domain_handle);
 
2396
                                        get_global_sam_sid(), &domain_handle,
 
2397
                                        &result);
2298
2398
        if (!NT_STATUS_IS_OK(status)) {
2299
2399
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
2300
2400
                          nt_errstr(status)));
2301
 
                rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
 
2401
                dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
 
2402
                return false;
 
2403
        }
 
2404
        if (!NT_STATUS_IS_OK(result)) {
 
2405
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
 
2406
                          nt_errstr(result)));
 
2407
                dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
2302
2408
                return false;
2303
2409
        }
2304
2410
 
2323
2429
                struct samr_SamArray *sam_entries;
2324
2430
                uint32_t num_entries;
2325
2431
 
2326
 
                status = rpccli_samr_EnumDomainGroups(samr_pipe, talloc_tos(),
 
2432
                status = dcerpc_samr_EnumDomainGroups(b, talloc_tos(),
2327
2433
                                                      &domain_handle,
2328
2434
                                                      &resume_handle,
2329
2435
                                                      &sam_entries, 1,
2330
 
                                                      &num_entries);
 
2436
                                                      &num_entries,
 
2437
                                                      &result);
2331
2438
                if (!NT_STATUS_IS_OK(status)) {
2332
 
                        DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
 
2439
                        DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
2333
2440
                                   "%s\n", nt_errstr(status)));
2334
2441
                        break;
2335
2442
                }
 
2443
                if (!NT_STATUS_IS_OK(result)) {
 
2444
                        status = result;
 
2445
                        DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
 
2446
                                   "%s\n", nt_errstr(result)));
 
2447
                        break;
 
2448
                }
2336
2449
 
2337
2450
                if (num_entries == 0) {
2338
 
                        DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
 
2451
                        DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
2339
2452
                                   "no entries -- done\n"));
2340
2453
                        break;
2341
2454
                }
2370
2483
                TALLOC_FREE(sam_entries);
2371
2484
        }
2372
2485
 
2373
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
2374
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
 
2486
        dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
 
2487
        dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
2375
2488
 
2376
2489
        *rdata_len = PTR_DIFF(p,*rdata);
2377
2490
 
2392
2505
 Get groups that a user is a member of.
2393
2506
******************************************************************/
2394
2507
 
2395
 
static bool api_NetUserGetGroups(connection_struct *conn,uint16 vuid,
 
2508
static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
 
2509
                                 connection_struct *conn,uint16 vuid,
2396
2510
                                char *param, int tpscnt,
2397
2511
                                char *data, int tdscnt,
2398
2512
                                int mdrcnt,int mprcnt,
2416
2530
        struct lsa_Strings names;
2417
2531
        struct samr_Ids type, rid;
2418
2532
        struct samr_RidWithAttributeArray *rids;
2419
 
        NTSTATUS status;
 
2533
        NTSTATUS status, result;
 
2534
        struct dcerpc_binding_handle *b;
2420
2535
 
2421
2536
        if (!str1 || !str2 || !UserName || !p) {
2422
2537
                return False;
2456
2571
        p = *rdata;
2457
2572
        endp = *rdata + *rdata_len;
2458
2573
 
2459
 
        status = rpc_pipe_open_internal(
2460
 
                talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
2461
 
                conn->server_info, &samr_pipe);
 
2574
        status = rpc_pipe_open_interface(
 
2575
                talloc_tos(), &ndr_table_samr.syntax_id,
 
2576
                conn->session_info, &conn->sconn->client_id,
 
2577
                conn->sconn->msg_ctx, &samr_pipe);
2462
2578
        if (!NT_STATUS_IS_OK(status)) {
2463
2579
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
2464
2580
                          nt_errstr(status)));
2465
2581
                return false;
2466
2582
        }
2467
2583
 
2468
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
2469
 
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
 
2584
        b = samr_pipe->binding_handle;
 
2585
 
 
2586
        status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(),
 
2587
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
 
2588
                                      &result);
2470
2589
        if (!NT_STATUS_IS_OK(status)) {
2471
2590
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
2472
2591
                          nt_errstr(status)));
2473
2592
                return false;
2474
2593
        }
 
2594
        if (!NT_STATUS_IS_OK(result)) {
 
2595
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
 
2596
                          nt_errstr(result)));
 
2597
                return false;
 
2598
        }
2475
2599
 
2476
 
        status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
 
2600
        status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
2477
2601
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
2478
 
                                        get_global_sam_sid(), &domain_handle);
 
2602
                                        get_global_sam_sid(), &domain_handle,
 
2603
                                        &result);
2479
2604
        if (!NT_STATUS_IS_OK(status)) {
2480
2605
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
2481
2606
                          nt_errstr(status)));
2482
2607
                goto close_sam;
2483
2608
        }
 
2609
        if (!NT_STATUS_IS_OK(result)) {
 
2610
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
 
2611
                          nt_errstr(result)));
 
2612
                goto close_sam;
 
2613
        }
2484
2614
 
2485
2615
        name.string = UserName;
2486
2616
 
2487
 
        status = rpccli_samr_LookupNames(samr_pipe, talloc_tos(),
 
2617
        status = dcerpc_samr_LookupNames(b, talloc_tos(),
2488
2618
                                         &domain_handle, 1, &name,
2489
 
                                         &rid, &type);
 
2619
                                         &rid, &type,
 
2620
                                         &result);
2490
2621
        if (!NT_STATUS_IS_OK(status)) {
2491
2622
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
2492
2623
                          nt_errstr(status)));
2493
2624
                goto close_domain;
2494
2625
        }
 
2626
        if (!NT_STATUS_IS_OK(result)) {
 
2627
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
 
2628
                          nt_errstr(result)));
 
2629
                goto close_domain;
 
2630
        }
2495
2631
 
2496
2632
        if (type.ids[0] != SID_NAME_USER) {
2497
2633
                DEBUG(10, ("%s is a %s, not a user\n", UserName,
2499
2635
                goto close_domain;
2500
2636
        }
2501
2637
 
2502
 
        status = rpccli_samr_OpenUser(samr_pipe, talloc_tos(),
 
2638
        status = dcerpc_samr_OpenUser(b, talloc_tos(),
2503
2639
                                      &domain_handle,
2504
2640
                                      SAMR_USER_ACCESS_GET_GROUPS,
2505
 
                                      rid.ids[0], &user_handle);
 
2641
                                      rid.ids[0], &user_handle,
 
2642
                                      &result);
2506
2643
        if (!NT_STATUS_IS_OK(status)) {
2507
2644
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
2508
2645
                          nt_errstr(status)));
2509
2646
                goto close_domain;
2510
2647
        }
 
2648
        if (!NT_STATUS_IS_OK(result)) {
 
2649
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
 
2650
                          nt_errstr(result)));
 
2651
                goto close_domain;
 
2652
        }
2511
2653
 
2512
 
        status = rpccli_samr_GetGroupsForUser(samr_pipe, talloc_tos(),
2513
 
                                              &user_handle, &rids);
 
2654
        status = dcerpc_samr_GetGroupsForUser(b, talloc_tos(),
 
2655
                                              &user_handle, &rids,
 
2656
                                              &result);
2514
2657
        if (!NT_STATUS_IS_OK(status)) {
2515
2658
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
2516
2659
                          nt_errstr(status)));
 
2660
                goto close_user;
 
2661
        }
 
2662
        if (!NT_STATUS_IS_OK(result)) {
 
2663
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
 
2664
                          nt_errstr(result)));
2517
2665
                goto close_user;
2518
2666
        }
2519
2667
 
2520
2668
        for (i=0; i<rids->count; i++) {
2521
2669
 
2522
 
                status = rpccli_samr_LookupRids(samr_pipe, talloc_tos(),
 
2670
                status = dcerpc_samr_LookupRids(b, talloc_tos(),
2523
2671
                                                &domain_handle,
2524
2672
                                                1, &rids->rids[i].rid,
2525
 
                                                &names, &type);
2526
 
                if (NT_STATUS_IS_OK(status) && (names.count == 1)) {
 
2673
                                                &names, &type,
 
2674
                                                &result);
 
2675
                if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result) && (names.count == 1)) {
2527
2676
                        strlcpy(p, names.names[0].string, PTR_DIFF(endp,p));
2528
2677
                        p += 21;
2529
2678
                        count++;
2538
2687
        ret = True;
2539
2688
 
2540
2689
 close_user:
2541
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &user_handle);
 
2690
        dcerpc_samr_Close(b, talloc_tos(), &user_handle, &result);
2542
2691
 close_domain:
2543
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
 
2692
        dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
2544
2693
 close_sam:
2545
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
 
2694
        dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
2546
2695
 
2547
2696
        return ret;
2548
2697
}
2551
2700
 Get all users.
2552
2701
******************************************************************/
2553
2702
 
2554
 
static bool api_RNetUserEnum(connection_struct *conn, uint16 vuid,
 
2703
static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
 
2704
                             connection_struct *conn, uint16 vuid,
2555
2705
                                char *param, int tpscnt,
2556
2706
                                char *data, int tdscnt,
2557
2707
                                int mdrcnt,int mprcnt,
2566
2716
 
2567
2717
        struct rpc_pipe_client *samr_pipe;
2568
2718
        struct policy_handle samr_handle, domain_handle;
2569
 
        NTSTATUS status;
 
2719
        NTSTATUS status, result;
2570
2720
 
2571
2721
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
2572
2722
        char *str2 = skip_string(param,tpscnt,str1);
2573
2723
        char *p = skip_string(param,tpscnt,str2);
2574
2724
        char *endp = NULL;
2575
2725
 
 
2726
        struct dcerpc_binding_handle *b;
 
2727
 
2576
2728
        if (!str1 || !str2 || !p) {
2577
2729
                return False;
2578
2730
        }
2611
2763
        p = *rdata;
2612
2764
        endp = *rdata + *rdata_len;
2613
2765
 
2614
 
        status = rpc_pipe_open_internal(
2615
 
                talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
2616
 
                conn->server_info, &samr_pipe);
 
2766
        status = rpc_pipe_open_interface(
 
2767
                talloc_tos(), &ndr_table_samr.syntax_id,
 
2768
                conn->session_info, &conn->sconn->client_id,
 
2769
                conn->sconn->msg_ctx, &samr_pipe);
2617
2770
        if (!NT_STATUS_IS_OK(status)) {
2618
2771
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
2619
2772
                          nt_errstr(status)));
2620
2773
                return false;
2621
2774
        }
2622
2775
 
2623
 
        status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
2624
 
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
 
2776
        b = samr_pipe->binding_handle;
 
2777
 
 
2778
        status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(),
 
2779
                                      SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
 
2780
                                      &result);
2625
2781
        if (!NT_STATUS_IS_OK(status)) {
2626
2782
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
2627
2783
                          nt_errstr(status)));
2628
2784
                return false;
2629
2785
        }
 
2786
        if (!NT_STATUS_IS_OK(result)) {
 
2787
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
 
2788
                          nt_errstr(result)));
 
2789
                return false;
 
2790
        }
2630
2791
 
2631
 
        status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
 
2792
        status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
2632
2793
                                        SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
2633
 
                                        get_global_sam_sid(), &domain_handle);
 
2794
                                        get_global_sam_sid(), &domain_handle,
 
2795
                                        &result);
2634
2796
        if (!NT_STATUS_IS_OK(status)) {
2635
2797
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
2636
2798
                          nt_errstr(status)));
2637
 
                rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
 
2799
                dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
 
2800
                return false;
 
2801
        }
 
2802
        if (!NT_STATUS_IS_OK(result)) {
 
2803
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
 
2804
                          nt_errstr(result)));
 
2805
                dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
2638
2806
                return false;
2639
2807
        }
2640
2808
 
2646
2814
                struct samr_SamArray *sam_entries;
2647
2815
                uint32_t num_entries;
2648
2816
 
2649
 
                status = rpccli_samr_EnumDomainUsers(samr_pipe, talloc_tos(),
 
2817
                status = dcerpc_samr_EnumDomainUsers(b, talloc_tos(),
2650
2818
                                                     &domain_handle,
2651
2819
                                                     &resume_handle,
2652
2820
                                                     0, &sam_entries, 1,
2653
 
                                                     &num_entries);
 
2821
                                                     &num_entries,
 
2822
                                                     &result);
2654
2823
 
2655
2824
                if (!NT_STATUS_IS_OK(status)) {
2656
 
                        DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
 
2825
                        DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
2657
2826
                                   "%s\n", nt_errstr(status)));
2658
2827
                        break;
2659
2828
                }
 
2829
                if (!NT_STATUS_IS_OK(result)) {
 
2830
                        DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
 
2831
                                   "%s\n", nt_errstr(result)));
 
2832
                        break;
 
2833
                }
2660
2834
 
2661
2835
                if (num_entries == 0) {
2662
 
                        DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
 
2836
                        DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
2663
2837
                                   "no entries -- done\n"));
2664
2838
                        break;
2665
2839
                }
2692
2866
                TALLOC_FREE(sam_entries);
2693
2867
        }
2694
2868
 
2695
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
2696
 
        rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
 
2869
        dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
 
2870
        dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
2697
2871
 
2698
2872
        *rdata_len = PTR_DIFF(p,*rdata);
2699
2873
 
2709
2883
 Get the time of day info.
2710
2884
****************************************************************************/
2711
2885
 
2712
 
static bool api_NetRemoteTOD(connection_struct *conn,uint16 vuid,
 
2886
static bool api_NetRemoteTOD(struct smbd_server_connection *sconn,
 
2887
                             connection_struct *conn,uint16 vuid,
2713
2888
                                char *param, int tpscnt,
2714
2889
                                char *data, int tdscnt,
2715
2890
                                int mdrcnt,int mprcnt,
2741
2916
                                            by NT in a "net time" operation,
2742
2917
                                            it seems to ignore the one below */
2743
2918
 
2744
 
        /* the client expects to get localtime, not GMT, in this bit 
 
2919
        /* the client expects to get localtime, not GMT, in this bit
2745
2920
                (I think, this needs testing) */
2746
2921
        t = localtime(&unixdate);
2747
2922
        if (!t) {
2767
2942
 Set the user password.
2768
2943
*****************************************************************************/
2769
2944
 
2770
 
static bool api_SetUserPassword(connection_struct *conn,uint16 vuid,
 
2945
static bool api_SetUserPassword(struct smbd_server_connection *sconn,
 
2946
                                connection_struct *conn,uint16 vuid,
2771
2947
                                char *param, int tpscnt,
2772
2948
                                char *data, int tdscnt,
2773
2949
                                int mdrcnt,int mprcnt,
2778
2954
        char *p = NULL;
2779
2955
        fstring user;
2780
2956
        fstring pass1,pass2;
 
2957
        TALLOC_CTX *mem_ctx = talloc_tos();
 
2958
        NTSTATUS status, result;
 
2959
        struct rpc_pipe_client *cli = NULL;
 
2960
        struct policy_handle connect_handle, domain_handle, user_handle;
 
2961
        struct lsa_String domain_name;
 
2962
        struct dom_sid2 *domain_sid;
 
2963
        struct lsa_String names;
 
2964
        struct samr_Ids rids;
 
2965
        struct samr_Ids types;
 
2966
        struct samr_Password old_lm_hash;
 
2967
        struct samr_Password new_lm_hash;
 
2968
        int errcode = NERR_badpass;
 
2969
        uint32_t rid;
 
2970
        int encrypted;
 
2971
        int min_pwd_length;
 
2972
        struct dcerpc_binding_handle *b = NULL;
2781
2973
 
2782
2974
        /* Skip 2 strings. */
2783
2975
        p = skip_string(param,tpscnt,np);
2810
3002
        memcpy(pass1,p,16);
2811
3003
        memcpy(pass2,p+16,16);
2812
3004
 
 
3005
        encrypted = get_safe_SVAL(param,tpscnt,p+32,0,-1);
 
3006
        if (encrypted == -1) {
 
3007
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3008
                goto out;
 
3009
        }
 
3010
 
 
3011
        min_pwd_length = get_safe_SVAL(param,tpscnt,p+34,0,-1);
 
3012
        if (min_pwd_length == -1) {
 
3013
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3014
                goto out;
 
3015
        }
 
3016
 
2813
3017
        *rparam_len = 4;
2814
3018
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
2815
3019
        if (!*rparam) {
2818
3022
 
2819
3023
        *rdata_len = 0;
2820
3024
 
2821
 
        SSVAL(*rparam,0,NERR_badpass);
2822
 
        SSVAL(*rparam,2,0);             /* converter word */
2823
 
 
2824
 
        DEBUG(3,("Set password for <%s>\n",user));
2825
 
 
2826
 
        /*
2827
 
         * Attempt to verify the old password against smbpasswd entries
2828
 
         * Win98 clients send old and new password in plaintext for this call.
2829
 
         */
2830
 
 
2831
 
        {
2832
 
                auth_serversupplied_info *server_info = NULL;
2833
 
                DATA_BLOB password = data_blob(pass1, strlen(pass1)+1);
2834
 
 
2835
 
                if (NT_STATUS_IS_OK(check_plaintext_password(user,password,&server_info))) {
2836
 
 
2837
 
                        become_root();
2838
 
                        if (NT_STATUS_IS_OK(change_oem_password(server_info->sam_account, pass1, pass2, False, NULL))) {
2839
 
                                SSVAL(*rparam,0,NERR_Success);
2840
 
                        }
2841
 
                        unbecome_root();
2842
 
 
2843
 
                        TALLOC_FREE(server_info);
2844
 
                }
2845
 
                data_blob_clear_free(&password);
2846
 
        }
2847
 
 
2848
 
        /*
2849
 
         * If the plaintext change failed, attempt
2850
 
         * the old encrypted method. NT will generate this
2851
 
         * after trying the samr method. Note that this
2852
 
         * method is done as a last resort as this
2853
 
         * password change method loses the NT password hash
2854
 
         * and cannot change the UNIX password as no plaintext
2855
 
         * is received.
2856
 
         */
2857
 
 
2858
 
        if(SVAL(*rparam,0) != NERR_Success) {
2859
 
                struct samu *hnd = NULL;
2860
 
 
2861
 
                if (check_lanman_password(user,(unsigned char *)pass1,(unsigned char *)pass2, &hnd)) {
2862
 
                        become_root();
2863
 
                        if (change_lanman_password(hnd,(uchar *)pass2)) {
2864
 
                                SSVAL(*rparam,0,NERR_Success);
2865
 
                        }
2866
 
                        unbecome_root();
2867
 
                        TALLOC_FREE(hnd);
2868
 
                }
 
3025
        DEBUG(3,("Set password for <%s> (encrypted: %d, min_pwd_length: %d)\n",
 
3026
                user, encrypted, min_pwd_length));
 
3027
 
 
3028
        ZERO_STRUCT(connect_handle);
 
3029
        ZERO_STRUCT(domain_handle);
 
3030
        ZERO_STRUCT(user_handle);
 
3031
 
 
3032
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
 
3033
                                        conn->session_info,
 
3034
                                        &conn->sconn->client_id,
 
3035
                                        conn->sconn->msg_ctx,
 
3036
                                        &cli);
 
3037
        if (!NT_STATUS_IS_OK(status)) {
 
3038
                DEBUG(0,("api_SetUserPassword: could not connect to samr: %s\n",
 
3039
                          nt_errstr(status)));
 
3040
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3041
                goto out;
 
3042
        }
 
3043
 
 
3044
        b = cli->binding_handle;
 
3045
 
 
3046
        status = dcerpc_samr_Connect2(b, mem_ctx,
 
3047
                                      global_myname(),
 
3048
                                      SAMR_ACCESS_CONNECT_TO_SERVER |
 
3049
                                      SAMR_ACCESS_ENUM_DOMAINS |
 
3050
                                      SAMR_ACCESS_LOOKUP_DOMAIN,
 
3051
                                      &connect_handle,
 
3052
                                      &result);
 
3053
        if (!NT_STATUS_IS_OK(status)) {
 
3054
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3055
                goto out;
 
3056
        }
 
3057
        if (!NT_STATUS_IS_OK(result)) {
 
3058
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3059
                goto out;
 
3060
        }
 
3061
 
 
3062
        init_lsa_String(&domain_name, get_global_sam_name());
 
3063
 
 
3064
        status = dcerpc_samr_LookupDomain(b, mem_ctx,
 
3065
                                          &connect_handle,
 
3066
                                          &domain_name,
 
3067
                                          &domain_sid,
 
3068
                                          &result);
 
3069
        if (!NT_STATUS_IS_OK(status)) {
 
3070
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3071
                goto out;
 
3072
        }
 
3073
        if (!NT_STATUS_IS_OK(result)) {
 
3074
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3075
                goto out;
 
3076
        }
 
3077
 
 
3078
        status = dcerpc_samr_OpenDomain(b, mem_ctx,
 
3079
                                        &connect_handle,
 
3080
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
 
3081
                                        domain_sid,
 
3082
                                        &domain_handle,
 
3083
                                        &result);
 
3084
        if (!NT_STATUS_IS_OK(status)) {
 
3085
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3086
                goto out;
 
3087
        }
 
3088
        if (!NT_STATUS_IS_OK(result)) {
 
3089
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3090
                goto out;
 
3091
        }
 
3092
 
 
3093
        init_lsa_String(&names, user);
 
3094
 
 
3095
        status = dcerpc_samr_LookupNames(b, mem_ctx,
 
3096
                                         &domain_handle,
 
3097
                                         1,
 
3098
                                         &names,
 
3099
                                         &rids,
 
3100
                                         &types,
 
3101
                                         &result);
 
3102
        if (!NT_STATUS_IS_OK(status)) {
 
3103
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3104
                goto out;
 
3105
        }
 
3106
        if (!NT_STATUS_IS_OK(result)) {
 
3107
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3108
                goto out;
 
3109
        }
 
3110
 
 
3111
        if (rids.count != 1) {
 
3112
                errcode = W_ERROR_V(WERR_NO_SUCH_USER);
 
3113
                goto out;
 
3114
        }
 
3115
        if (rids.count != types.count) {
 
3116
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3117
                goto out;
 
3118
        }
 
3119
        if (types.ids[0] != SID_NAME_USER) {
 
3120
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3121
                goto out;
 
3122
        }
 
3123
 
 
3124
        rid = rids.ids[0];
 
3125
 
 
3126
        status = dcerpc_samr_OpenUser(b, mem_ctx,
 
3127
                                      &domain_handle,
 
3128
                                      SAMR_USER_ACCESS_CHANGE_PASSWORD,
 
3129
                                      rid,
 
3130
                                      &user_handle,
 
3131
                                      &result);
 
3132
        if (!NT_STATUS_IS_OK(status)) {
 
3133
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3134
                goto out;
 
3135
        }
 
3136
        if (!NT_STATUS_IS_OK(result)) {
 
3137
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3138
                goto out;
 
3139
        }
 
3140
 
 
3141
        if (encrypted == 0) {
 
3142
                E_deshash(pass1, old_lm_hash.hash);
 
3143
                E_deshash(pass2, new_lm_hash.hash);
 
3144
        } else {
 
3145
                ZERO_STRUCT(old_lm_hash);
 
3146
                ZERO_STRUCT(new_lm_hash);
 
3147
                memcpy(old_lm_hash.hash, pass1, MIN(strlen(pass1), 16));
 
3148
                memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16));
 
3149
        }
 
3150
 
 
3151
        status = dcerpc_samr_ChangePasswordUser(b, mem_ctx,
 
3152
                                                &user_handle,
 
3153
                                                true, /* lm_present */
 
3154
                                                &old_lm_hash,
 
3155
                                                &new_lm_hash,
 
3156
                                                false, /* nt_present */
 
3157
                                                NULL, /* old_nt_crypted */
 
3158
                                                NULL, /* new_nt_crypted */
 
3159
                                                false, /* cross1_present */
 
3160
                                                NULL, /* nt_cross */
 
3161
                                                false, /* cross2_present */
 
3162
                                                NULL, /* lm_cross */
 
3163
                                                &result);
 
3164
        if (!NT_STATUS_IS_OK(status)) {
 
3165
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3166
                goto out;
 
3167
        }
 
3168
        if (!NT_STATUS_IS_OK(result)) {
 
3169
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3170
                goto out;
 
3171
        }
 
3172
 
 
3173
        errcode = NERR_Success;
 
3174
 out:
 
3175
 
 
3176
        if (b && is_valid_policy_hnd(&user_handle)) {
 
3177
                dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
 
3178
        }
 
3179
        if (b && is_valid_policy_hnd(&domain_handle)) {
 
3180
                dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
 
3181
        }
 
3182
        if (b && is_valid_policy_hnd(&connect_handle)) {
 
3183
                dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
2869
3184
        }
2870
3185
 
2871
3186
        memset((char *)pass1,'\0',sizeof(fstring));
2872
 
        memset((char *)pass2,'\0',sizeof(fstring));      
 
3187
        memset((char *)pass2,'\0',sizeof(fstring));
2873
3188
 
 
3189
        SSVAL(*rparam,0,errcode);
 
3190
        SSVAL(*rparam,2,0);             /* converter word */
2874
3191
        return(True);
2875
3192
}
2876
3193
 
2878
3195
  Set the user password (SamOEM version - gets plaintext).
2879
3196
****************************************************************************/
2880
3197
 
2881
 
static bool api_SamOEMChangePassword(connection_struct *conn,uint16 vuid,
 
3198
static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
 
3199
                                     connection_struct *conn,uint16 vuid,
2882
3200
                                char *param, int tpscnt,
2883
3201
                                char *data, int tdscnt,
2884
3202
                                int mdrcnt,int mprcnt,
2885
3203
                                char **rdata,char **rparam,
2886
3204
                                int *rdata_len,int *rparam_len)
2887
3205
{
2888
 
        struct smbd_server_connection *sconn = smbd_server_conn;
2889
3206
        fstring user;
2890
3207
        char *p = get_safe_str_ptr(param,tpscnt,param,2);
2891
 
        *rparam_len = 2;
 
3208
 
 
3209
        TALLOC_CTX *mem_ctx = talloc_tos();
 
3210
        NTSTATUS status, result;
 
3211
        struct rpc_pipe_client *cli = NULL;
 
3212
        struct lsa_AsciiString server, account;
 
3213
        struct samr_CryptPassword password;
 
3214
        struct samr_Password hash;
 
3215
        int errcode = NERR_badpass;
 
3216
        int bufsize;
 
3217
        struct dcerpc_binding_handle *b;
 
3218
 
 
3219
        *rparam_len = 4;
2892
3220
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
2893
3221
        if (!*rparam) {
2894
3222
                return False;
2938
3266
 
2939
3267
        DEBUG(3,("api_SamOEMChangePassword: Change password for <%s>\n",user));
2940
3268
 
2941
 
        /*
2942
 
         * Pass the user through the NT -> unix user mapping
2943
 
         * function.
2944
 
         */
2945
 
 
2946
 
        (void)map_username(sconn, user);
2947
 
 
2948
 
        if (NT_STATUS_IS_OK(pass_oem_change(user, (uchar*) data, (uchar *)&data[516], NULL, NULL, NULL))) {
2949
 
                SSVAL(*rparam,0,NERR_Success);
2950
 
        }
 
3269
        if (tdscnt != 532) {
 
3270
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3271
                goto out;
 
3272
        }
 
3273
 
 
3274
        bufsize = get_safe_SVAL(param,tpscnt,p,0,-1);
 
3275
        if (bufsize != 532) {
 
3276
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3277
                goto out;
 
3278
        }
 
3279
 
 
3280
        memcpy(password.data, data, 516);
 
3281
        memcpy(hash.hash, data+516, 16);
 
3282
 
 
3283
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
 
3284
                                        conn->session_info,
 
3285
                                        &conn->sconn->client_id,
 
3286
                                        conn->sconn->msg_ctx,
 
3287
                                        &cli);
 
3288
        if (!NT_STATUS_IS_OK(status)) {
 
3289
                DEBUG(0,("api_SamOEMChangePassword: could not connect to samr: %s\n",
 
3290
                          nt_errstr(status)));
 
3291
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3292
                goto out;
 
3293
        }
 
3294
 
 
3295
        b = cli->binding_handle;
 
3296
 
 
3297
        init_lsa_AsciiString(&server, global_myname());
 
3298
        init_lsa_AsciiString(&account, user);
 
3299
 
 
3300
        status = dcerpc_samr_OemChangePasswordUser2(b, mem_ctx,
 
3301
                                                    &server,
 
3302
                                                    &account,
 
3303
                                                    &password,
 
3304
                                                    &hash,
 
3305
                                                    &result);
 
3306
        if (!NT_STATUS_IS_OK(status)) {
 
3307
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3308
                goto out;
 
3309
        }
 
3310
        if (!NT_STATUS_IS_OK(result)) {
 
3311
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
3312
                goto out;
 
3313
        }
 
3314
 
 
3315
        errcode = NERR_Success;
 
3316
 out:
 
3317
        SSVAL(*rparam,0,errcode);
 
3318
        SSVAL(*rparam,2,0);             /* converter word */
2951
3319
 
2952
3320
        return(True);
2953
3321
}
2954
3322
 
2955
3323
/****************************************************************************
2956
3324
  delete a print job
2957
 
  Form: <W> <> 
 
3325
  Form: <W> <>
2958
3326
  ****************************************************************************/
2959
3327
 
2960
 
static bool api_RDosPrintJobDel(connection_struct *conn,uint16 vuid,
 
3328
static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn,
 
3329
                                connection_struct *conn,uint16 vuid,
2961
3330
                                char *param, int tpscnt,
2962
3331
                                char *data, int tdscnt,
2963
3332
                                int mdrcnt,int mprcnt,
2969
3338
        char *str2 = skip_string(param,tpscnt,str1);
2970
3339
        char *p = skip_string(param,tpscnt,str2);
2971
3340
        uint32 jobid;
2972
 
        int snum;
2973
3341
        fstring sharename;
2974
3342
        int errcode;
2975
3343
        WERROR werr = WERR_OK;
2976
3344
 
 
3345
        TALLOC_CTX *mem_ctx = talloc_tos();
 
3346
        NTSTATUS status;
 
3347
        struct rpc_pipe_client *cli = NULL;
 
3348
        struct dcerpc_binding_handle *b = NULL;
 
3349
        struct policy_handle handle;
 
3350
        struct spoolss_DevmodeContainer devmode_ctr;
 
3351
        enum spoolss_JobControl command;
 
3352
 
2977
3353
        if (!str1 || !str2 || !p) {
2978
3354
                return False;
2979
3355
        }
2998
3374
        }
2999
3375
        *rdata_len = 0;
3000
3376
 
3001
 
        if (!print_job_exists(sharename, jobid)) {
3002
 
                errcode = NERR_JobNotFound;
3003
 
                goto out;
3004
 
        }
3005
 
 
3006
 
        snum = lp_servicenumber( sharename);
3007
 
        if (snum == -1) {
3008
 
                errcode = NERR_DestNotFound;
3009
 
                goto out;
3010
 
        }
3011
 
 
3012
 
        errcode = NERR_notsupported;
 
3377
        ZERO_STRUCT(handle);
 
3378
 
 
3379
        status = rpc_pipe_open_interface(conn,
 
3380
                                         &ndr_table_spoolss.syntax_id,
 
3381
                                         conn->session_info,
 
3382
                                         &conn->sconn->client_id,
 
3383
                                         conn->sconn->msg_ctx,
 
3384
                                         &cli);
 
3385
        if (!NT_STATUS_IS_OK(status)) {
 
3386
                DEBUG(0,("api_RDosPrintJobDel: could not connect to spoolss: %s\n",
 
3387
                          nt_errstr(status)));
 
3388
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3389
                goto out;
 
3390
        }
 
3391
        b = cli->binding_handle;
 
3392
 
 
3393
        ZERO_STRUCT(devmode_ctr);
 
3394
 
 
3395
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
3396
                                            sharename,
 
3397
                                            "RAW",
 
3398
                                            devmode_ctr,
 
3399
                                            JOB_ACCESS_ADMINISTER,
 
3400
                                            &handle,
 
3401
                                            &werr);
 
3402
        if (!NT_STATUS_IS_OK(status)) {
 
3403
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3404
                goto out;
 
3405
        }
 
3406
        if (!W_ERROR_IS_OK(werr)) {
 
3407
                errcode = W_ERROR_V(werr);
 
3408
                goto out;
 
3409
        }
 
3410
 
 
3411
        /* FIXME: formerly NERR_JobNotFound was returned if job did not exist
 
3412
         * and NERR_DestNotFound if share did not exist */
 
3413
 
 
3414
        errcode = NERR_Success;
3013
3415
 
3014
3416
        switch (function) {
3015
 
        case 81:                /* delete */ 
3016
 
                if (print_job_delete(conn->server_info, snum, jobid, &werr))
3017
 
                        errcode = NERR_Success;
 
3417
        case 81:                /* delete */
 
3418
                command = SPOOLSS_JOB_CONTROL_DELETE;
3018
3419
                break;
3019
3420
        case 82:                /* pause */
3020
 
                if (print_job_pause(conn->server_info, snum, jobid, &werr))
3021
 
                        errcode = NERR_Success;
 
3421
                command = SPOOLSS_JOB_CONTROL_PAUSE;
3022
3422
                break;
3023
3423
        case 83:                /* resume */
3024
 
                if (print_job_resume(conn->server_info, snum, jobid, &werr))
3025
 
                        errcode = NERR_Success;
 
3424
                command = SPOOLSS_JOB_CONTROL_RESUME;
3026
3425
                break;
 
3426
        default:
 
3427
                errcode = NERR_notsupported;
 
3428
                goto out;
3027
3429
        }
3028
3430
 
3029
 
        if (!W_ERROR_IS_OK(werr))
 
3431
        status = dcerpc_spoolss_SetJob(b, mem_ctx,
 
3432
                                       &handle,
 
3433
                                       jobid,
 
3434
                                       NULL, /* unique ptr ctr */
 
3435
                                       command,
 
3436
                                       &werr);
 
3437
        if (!NT_STATUS_IS_OK(status)) {
 
3438
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3439
                goto out;
 
3440
        }
 
3441
        if (!W_ERROR_IS_OK(werr)) {
3030
3442
                errcode = W_ERROR_V(werr);
 
3443
                goto out;
 
3444
        }
3031
3445
 
3032
3446
 out:
3033
 
        SSVAL(*rparam,0,errcode);       
 
3447
        if (b && is_valid_policy_hnd(&handle)) {
 
3448
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
3449
        }
 
3450
 
 
3451
        SSVAL(*rparam,0,errcode);
3034
3452
        SSVAL(*rparam,2,0);             /* converter word */
3035
3453
 
3036
3454
        return(True);
3040
3458
  Purge a print queue - or pause or resume it.
3041
3459
  ****************************************************************************/
3042
3460
 
3043
 
static bool api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid,
 
3461
static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn,
 
3462
                                connection_struct *conn,uint16 vuid,
3044
3463
                                char *param, int tpscnt,
3045
3464
                                char *data, int tdscnt,
3046
3465
                                int mdrcnt,int mprcnt,
3052
3471
        char *str2 = skip_string(param,tpscnt,str1);
3053
3472
        char *QueueName = skip_string(param,tpscnt,str2);
3054
3473
        int errcode = NERR_notsupported;
3055
 
        int snum;
3056
3474
        WERROR werr = WERR_OK;
 
3475
        NTSTATUS status;
 
3476
 
 
3477
        TALLOC_CTX *mem_ctx = talloc_tos();
 
3478
        struct rpc_pipe_client *cli = NULL;
 
3479
        struct dcerpc_binding_handle *b = NULL;
 
3480
        struct policy_handle handle;
 
3481
        struct spoolss_SetPrinterInfoCtr info_ctr;
 
3482
        struct spoolss_DevmodeContainer devmode_ctr;
 
3483
        struct sec_desc_buf secdesc_ctr;
 
3484
        enum spoolss_PrinterControl command;
3057
3485
 
3058
3486
        if (!str1 || !str2 || !QueueName) {
3059
3487
                return False;
3073
3501
        if (skip_string(param,tpscnt,QueueName) == NULL) {
3074
3502
                return False;
3075
3503
        }
3076
 
        snum = print_queue_snum(QueueName);
3077
 
 
3078
 
        if (snum == -1) {
3079
 
                errcode = NERR_JobNotFound;
 
3504
 
 
3505
        ZERO_STRUCT(handle);
 
3506
 
 
3507
        status = rpc_pipe_open_interface(conn,
 
3508
                                         &ndr_table_spoolss.syntax_id,
 
3509
                                         conn->session_info,
 
3510
                                         &conn->sconn->client_id,
 
3511
                                         conn->sconn->msg_ctx,
 
3512
                                         &cli);
 
3513
        if (!NT_STATUS_IS_OK(status)) {
 
3514
                DEBUG(0,("api_WPrintQueueCtrl: could not connect to spoolss: %s\n",
 
3515
                          nt_errstr(status)));
 
3516
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3517
                goto out;
 
3518
        }
 
3519
        b = cli->binding_handle;
 
3520
 
 
3521
        ZERO_STRUCT(devmode_ctr);
 
3522
 
 
3523
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
3524
                                            QueueName,
 
3525
                                            NULL,
 
3526
                                            devmode_ctr,
 
3527
                                            SEC_FLAG_MAXIMUM_ALLOWED,
 
3528
                                            &handle,
 
3529
                                            &werr);
 
3530
        if (!NT_STATUS_IS_OK(status)) {
 
3531
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3532
                goto out;
 
3533
        }
 
3534
        if (!W_ERROR_IS_OK(werr)) {
 
3535
                errcode = W_ERROR_V(werr);
3080
3536
                goto out;
3081
3537
        }
3082
3538
 
3083
3539
        switch (function) {
3084
3540
        case 74: /* Pause queue */
3085
 
                werr = print_queue_pause(conn->server_info, snum);
 
3541
                command = SPOOLSS_PRINTER_CONTROL_PAUSE;
3086
3542
                break;
3087
3543
        case 75: /* Resume queue */
3088
 
                werr = print_queue_resume(conn->server_info, snum);
 
3544
                command = SPOOLSS_PRINTER_CONTROL_RESUME;
3089
3545
                break;
3090
3546
        case 103: /* Purge */
3091
 
                werr = print_queue_purge(conn->server_info, snum);
 
3547
                command = SPOOLSS_PRINTER_CONTROL_PURGE;
3092
3548
                break;
3093
3549
        default:
3094
3550
                werr = WERR_NOT_SUPPORTED;
3095
3551
                break;
3096
3552
        }
3097
3553
 
 
3554
        if (!W_ERROR_IS_OK(werr)) {
 
3555
                errcode = W_ERROR_V(werr);
 
3556
                goto out;
 
3557
        }
 
3558
 
 
3559
        ZERO_STRUCT(info_ctr);
 
3560
        ZERO_STRUCT(secdesc_ctr);
 
3561
 
 
3562
        status = dcerpc_spoolss_SetPrinter(b, mem_ctx,
 
3563
                                           &handle,
 
3564
                                           &info_ctr,
 
3565
                                           &devmode_ctr,
 
3566
                                           &secdesc_ctr,
 
3567
                                           command,
 
3568
                                           &werr);
 
3569
        if (!NT_STATUS_IS_OK(status)) {
 
3570
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3571
                goto out;
 
3572
        }
 
3573
        if (!W_ERROR_IS_OK(werr)) {
 
3574
                errcode = W_ERROR_V(werr);
 
3575
                goto out;
 
3576
        }
 
3577
 
3098
3578
        errcode = W_ERROR_V(werr);
3099
3579
 
3100
3580
 out:
 
3581
 
 
3582
        if (b && is_valid_policy_hnd(&handle)) {
 
3583
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
3584
        }
 
3585
 
3101
3586
        SSVAL(*rparam,0,errcode);
3102
3587
        SSVAL(*rparam,2,0);             /* converter word */
3103
3588
 
3108
3593
  set the property of a print job (undocumented?)
3109
3594
  ? function = 0xb -> set name of print job
3110
3595
  ? function = 0x6 -> move print job up/down
3111
 
  Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz> 
3112
 
  or   <WWsTP> <WB21BB16B10zWWzDDz> 
 
3596
  Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz>
 
3597
  or   <WWsTP> <WB21BB16B10zWWzDDz>
3113
3598
****************************************************************************/
3114
3599
 
3115
3600
static int check_printjob_info(struct pack_desc* desc,
3135
3620
        return True;
3136
3621
}
3137
3622
 
3138
 
static bool api_PrintJobInfo(connection_struct *conn, uint16 vuid,
 
3623
static bool api_PrintJobInfo(struct smbd_server_connection *sconn,
 
3624
                             connection_struct *conn, uint16 vuid,
3139
3625
                                char *param, int tpscnt,
3140
3626
                                char *data, int tdscnt,
3141
3627
                                int mdrcnt,int mprcnt,
3150
3636
        fstring sharename;
3151
3637
        int uLevel = get_safe_SVAL(param,tpscnt,p,2,-1);
3152
3638
        int function = get_safe_SVAL(param,tpscnt,p,4,-1);
3153
 
        int place, errcode;
 
3639
        int errcode;
 
3640
 
 
3641
        TALLOC_CTX *mem_ctx = talloc_tos();
 
3642
        WERROR werr;
 
3643
        NTSTATUS status;
 
3644
        struct rpc_pipe_client *cli = NULL;
 
3645
        struct dcerpc_binding_handle *b = NULL;
 
3646
        struct policy_handle handle;
 
3647
        struct spoolss_DevmodeContainer devmode_ctr;
 
3648
        struct spoolss_JobInfoContainer ctr;
 
3649
        union spoolss_JobInfo info;
 
3650
        struct spoolss_SetJobInfo1 info1;
3154
3651
 
3155
3652
        if (!str1 || !str2 || !p) {
3156
3653
                return False;
3170
3667
                return False;
3171
3668
        }
3172
3669
 
3173
 
        if (!share_defined(sharename)) {
3174
 
                DEBUG(0,("api_PrintJobInfo: sharen [%s] not defined\n",
3175
 
                         sharename));
3176
 
                return False;
3177
 
        }
3178
 
 
3179
3670
        *rdata_len = 0;
3180
3671
 
3181
3672
        /* check it's a supported varient */
3182
 
        if ((strcmp(str1,"WWsTP")) || 
 
3673
        if ((strcmp(str1,"WWsTP")) ||
3183
3674
            (!check_printjob_info(&desc,uLevel,str2)))
3184
3675
                return(False);
3185
3676
 
3186
 
        if (!print_job_exists(sharename, jobid)) {
3187
 
                errcode=NERR_JobNotFound;
3188
 
                goto out;
3189
 
        }
3190
 
 
3191
3677
        errcode = NERR_notsupported;
3192
3678
 
3193
3679
        switch (function) {
3194
 
        case 0x6:
3195
 
                /* change job place in the queue, 
3196
 
                   data gives the new place */
3197
 
                place = SVAL(data,0);
3198
 
                if (print_job_set_place(sharename, jobid, place)) {
3199
 
                        errcode=NERR_Success;
3200
 
                }
3201
 
                break;
3202
 
 
3203
 
        case 0xb:   
 
3680
        case 0xb:
3204
3681
                /* change print job name, data gives the name */
3205
 
                if (print_job_set_name(sharename, jobid, data)) {
3206
 
                        errcode=NERR_Success;
3207
 
                }
3208
3682
                break;
3209
 
 
3210
3683
        default:
3211
 
                return False;
3212
 
        }
3213
 
 
 
3684
                goto out;
 
3685
        }
 
3686
 
 
3687
        ZERO_STRUCT(handle);
 
3688
 
 
3689
        status = rpc_pipe_open_interface(conn,
 
3690
                                         &ndr_table_spoolss.syntax_id,
 
3691
                                         conn->session_info,
 
3692
                                         &conn->sconn->client_id,
 
3693
                                         conn->sconn->msg_ctx,
 
3694
                                         &cli);
 
3695
        if (!NT_STATUS_IS_OK(status)) {
 
3696
                DEBUG(0,("api_PrintJobInfo: could not connect to spoolss: %s\n",
 
3697
                          nt_errstr(status)));
 
3698
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3699
                goto out;
 
3700
        }
 
3701
        b = cli->binding_handle;
 
3702
 
 
3703
        ZERO_STRUCT(devmode_ctr);
 
3704
 
 
3705
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
3706
                                            sharename,
 
3707
                                            "RAW",
 
3708
                                            devmode_ctr,
 
3709
                                            PRINTER_ACCESS_USE,
 
3710
                                            &handle,
 
3711
                                            &werr);
 
3712
        if (!NT_STATUS_IS_OK(status)) {
 
3713
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3714
                goto out;
 
3715
        }
 
3716
        if (!W_ERROR_IS_OK(werr)) {
 
3717
                errcode = W_ERROR_V(werr);
 
3718
                goto out;
 
3719
        }
 
3720
 
 
3721
        werr = rpccli_spoolss_getjob(cli, mem_ctx,
 
3722
                                     &handle,
 
3723
                                     jobid,
 
3724
                                     1, /* level */
 
3725
                                     0, /* offered */
 
3726
                                     &info);
 
3727
        if (!W_ERROR_IS_OK(werr)) {
 
3728
                errcode = W_ERROR_V(werr);
 
3729
                goto out;
 
3730
        }
 
3731
 
 
3732
        ZERO_STRUCT(ctr);
 
3733
 
 
3734
        info1.job_id            = info.info1.job_id;
 
3735
        info1.printer_name      = info.info1.printer_name;
 
3736
        info1.user_name         = info.info1.user_name;
 
3737
        info1.document_name     = data;
 
3738
        info1.data_type         = info.info1.data_type;
 
3739
        info1.text_status       = info.info1.text_status;
 
3740
        info1.status            = info.info1.status;
 
3741
        info1.priority          = info.info1.priority;
 
3742
        info1.position          = info.info1.position;
 
3743
        info1.total_pages       = info.info1.total_pages;
 
3744
        info1.pages_printed     = info.info1.pages_printed;
 
3745
        info1.submitted         = info.info1.submitted;
 
3746
 
 
3747
        ctr.level = 1;
 
3748
        ctr.info.info1 = &info1;
 
3749
 
 
3750
        status = dcerpc_spoolss_SetJob(b, mem_ctx,
 
3751
                                       &handle,
 
3752
                                       jobid,
 
3753
                                       &ctr,
 
3754
                                       0,
 
3755
                                       &werr);
 
3756
        if (!NT_STATUS_IS_OK(status)) {
 
3757
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3758
                goto out;
 
3759
        }
 
3760
        if (!W_ERROR_IS_OK(werr)) {
 
3761
                errcode = W_ERROR_V(werr);
 
3762
                goto out;
 
3763
        }
 
3764
 
 
3765
        errcode = NERR_Success;
3214
3766
 out:
 
3767
 
 
3768
        if (b && is_valid_policy_hnd(&handle)) {
 
3769
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
3770
        }
 
3771
 
3215
3772
        SSVALS(*rparam,0,errcode);
3216
3773
        SSVAL(*rparam,2,0);             /* converter word */
3217
3774
 
3223
3780
 Get info about the server.
3224
3781
****************************************************************************/
3225
3782
 
3226
 
static bool api_RNetServerGetInfo(connection_struct *conn,uint16 vuid,
 
3783
static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn,
 
3784
                                  connection_struct *conn,uint16 vuid,
3227
3785
                                char *param, int tpscnt,
3228
3786
                                char *data, int tdscnt,
3229
3787
                                int mdrcnt,int mprcnt,
3237
3795
        char *p2;
3238
3796
        int struct_len;
3239
3797
 
 
3798
        NTSTATUS status;
 
3799
        WERROR werr;
 
3800
        TALLOC_CTX *mem_ctx = talloc_tos();
 
3801
        struct rpc_pipe_client *cli = NULL;
 
3802
        union srvsvc_NetSrvInfo info;
 
3803
        int errcode;
 
3804
        struct dcerpc_binding_handle *b;
 
3805
 
3240
3806
        if (!str1 || !str2 || !p) {
3241
3807
                return False;
3242
3808
        }
3297
3863
 
3298
3864
        p = *rdata;
3299
3865
        p2 = p + struct_len;
 
3866
 
 
3867
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
 
3868
                                        conn->session_info,
 
3869
                                        &conn->sconn->client_id,
 
3870
                                        conn->sconn->msg_ctx,
 
3871
                                        &cli);
 
3872
        if (!NT_STATUS_IS_OK(status)) {
 
3873
                DEBUG(0,("api_RNetServerGetInfo: could not connect to srvsvc: %s\n",
 
3874
                          nt_errstr(status)));
 
3875
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3876
                goto out;
 
3877
        }
 
3878
 
 
3879
        b = cli->binding_handle;
 
3880
 
 
3881
        status = dcerpc_srvsvc_NetSrvGetInfo(b, mem_ctx,
 
3882
                                             NULL,
 
3883
                                             101,
 
3884
                                             &info,
 
3885
                                             &werr);
 
3886
        if (!NT_STATUS_IS_OK(status)) {
 
3887
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
3888
                goto out;
 
3889
        }
 
3890
        if (!W_ERROR_IS_OK(werr)) {
 
3891
                errcode = W_ERROR_V(werr);
 
3892
                goto out;
 
3893
        }
 
3894
 
 
3895
        if (info.info101 == NULL) {
 
3896
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
3897
                goto out;
 
3898
        }
 
3899
 
3300
3900
        if (uLevel != 20) {
3301
 
                srvstr_push(NULL, 0, p,global_myname(),16,
 
3901
                srvstr_push(NULL, 0, p, info.info101->server_name, 16,
3302
3902
                        STR_ASCII|STR_UPPER|STR_TERMINATE);
3303
3903
        }
3304
3904
        p += 16;
3305
3905
        if (uLevel > 0) {
3306
 
                struct srv_info_struct *servers=NULL;
3307
 
                int i,count;
3308
 
                char *comment = NULL;
3309
 
                TALLOC_CTX *ctx = talloc_tos();
3310
 
                uint32 servertype= lp_default_server_announce();
3311
 
 
3312
 
                comment = talloc_strdup(ctx,lp_serverstring());
3313
 
                if (!comment) {
3314
 
                        return false;
3315
 
                }
3316
 
 
3317
 
                if ((count=get_server_info(SV_TYPE_ALL,&servers,lp_workgroup()))>0) {
3318
 
                        for (i=0;i<count;i++) {
3319
 
                                if (strequal(servers[i].name,global_myname())) {
3320
 
                                        servertype = servers[i].type;
3321
 
                                        TALLOC_FREE(comment);
3322
 
                                        comment = talloc_strdup(ctx,
3323
 
                                                        servers[i].comment);
3324
 
                                        if (comment) {
3325
 
                                                return false;
3326
 
                                        }
3327
 
                                }
3328
 
                        }
3329
 
                }
3330
 
 
3331
 
                SAFE_FREE(servers);
3332
 
 
3333
 
                SCVAL(p,0,lp_major_announce_version());
3334
 
                SCVAL(p,1,lp_minor_announce_version());
3335
 
                SIVAL(p,2,servertype);
 
3906
                SCVAL(p,0,info.info101->version_major);
 
3907
                SCVAL(p,1,info.info101->version_minor);
 
3908
                SIVAL(p,2,info.info101->server_type);
3336
3909
 
3337
3910
                if (mdrcnt == struct_len) {
3338
3911
                        SIVAL(p,6,0);
3339
3912
                } else {
3340
3913
                        SIVAL(p,6,PTR_DIFF(p2,*rdata));
3341
 
                        comment = talloc_sub_advanced(
3342
 
                                ctx,
3343
 
                                lp_servicename(SNUM(conn)),
3344
 
                                conn->server_info->unix_name,
3345
 
                                conn->connectpath,
3346
 
                                conn->server_info->utok.gid,
3347
 
                                conn->server_info->sanitized_username,
3348
 
                                pdb_get_domain(conn->server_info->sam_account),
3349
 
                                comment);
3350
 
                        if (comment) {
3351
 
                                return false;
3352
 
                        }
3353
3914
                        if (mdrcnt - struct_len <= 0) {
3354
3915
                                return false;
3355
3916
                        }
3356
3917
                        push_ascii(p2,
3357
 
                                comment,
 
3918
                                info.info101->comment,
3358
3919
                                MIN(mdrcnt - struct_len,
3359
3920
                                        MAX_SERVER_STRING_LENGTH),
3360
3921
                                STR_TERMINATE);
3369
3930
                return False;           /* not yet implemented */
3370
3931
        }
3371
3932
 
 
3933
        errcode = NERR_Success;
 
3934
 
 
3935
 out:
 
3936
 
3372
3937
        *rdata_len = PTR_DIFF(p2,*rdata);
3373
3938
 
3374
3939
        *rparam_len = 6;
3376
3941
        if (!*rparam) {
3377
3942
                return False;
3378
3943
        }
3379
 
        SSVAL(*rparam,0,NERR_Success);
 
3944
        SSVAL(*rparam,0,errcode);
3380
3945
        SSVAL(*rparam,2,0);             /* converter word */
3381
3946
        SSVAL(*rparam,4,*rdata_len);
3382
3947
 
3387
3952
 Get info about the server.
3388
3953
****************************************************************************/
3389
3954
 
3390
 
static bool api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid,
 
3955
static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn,
 
3956
                                connection_struct *conn,uint16 vuid,
3391
3957
                                char *param, int tpscnt,
3392
3958
                                char *data, int tdscnt,
3393
3959
                                int mdrcnt,int mprcnt,
3445
4011
        p += 4;
3446
4012
 
3447
4013
        SIVAL(p,0,PTR_DIFF(p2,*rdata));
3448
 
        strlcpy(p2,conn->server_info->sanitized_username,PTR_DIFF(endp,p2));
 
4014
        strlcpy(p2,conn->session_info->sanitized_username,PTR_DIFF(endp,p2));
3449
4015
        p2 = skip_string(*rdata,*rdata_len,p2);
3450
4016
        if (!p2) {
3451
4017
                return False;
3492
4058
  get info about a user
3493
4059
 
3494
4060
    struct user_info_11 {
3495
 
        char                usri11_name[21];  0-20 
3496
 
        char                usri11_pad;       21 
3497
 
        char                *usri11_comment;  22-25 
 
4061
        char                usri11_name[21];  0-20
 
4062
        char                usri11_pad;       21
 
4063
        char                *usri11_comment;  22-25
3498
4064
        char            *usri11_usr_comment;  26-29
3499
4065
        unsigned short      usri11_priv;      30-31
3500
4066
        unsigned long       usri11_auth_flags; 32-35
3625
4191
 
3626
4192
  ****************************************************************************/
3627
4193
 
3628
 
#define usri11_name           0 
 
4194
#define usri11_name           0
3629
4195
#define usri11_pad            21
3630
4196
#define usri11_comment        22
3631
4197
#define usri11_usr_comment    26
3648
4214
#define usri11_code_page      84
3649
4215
#define usri11_end            86
3650
4216
 
3651
 
#define USER_PRIV_GUEST 0
3652
 
#define USER_PRIV_USER 1
3653
 
#define USER_PRIV_ADMIN 2
3654
 
 
3655
 
#define AF_OP_PRINT     0 
3656
 
#define AF_OP_COMM      1
3657
 
#define AF_OP_SERVER    2
3658
 
#define AF_OP_ACCOUNTS  3
3659
 
 
3660
 
 
3661
 
static bool api_RNetUserGetInfo(connection_struct *conn, uint16 vuid,
 
4217
static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
 
4218
                                connection_struct *conn, uint16 vuid,
3662
4219
                                char *param, int tpscnt,
3663
4220
                                char *data, int tdscnt,
3664
4221
                                int mdrcnt,int mprcnt,
3665
4222
                                char **rdata,char **rparam,
3666
4223
                                int *rdata_len,int *rparam_len)
3667
4224
{
3668
 
        struct smbd_server_connection *sconn = smbd_server_conn;
3669
4225
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
3670
4226
        char *str2 = skip_string(param,tpscnt,str1);
3671
4227
        char *UserName = skip_string(param,tpscnt,str2);
3675
4231
        char *endp;
3676
4232
        const char *level_string;
3677
4233
 
3678
 
        /* get NIS home of a previously validated user - simeon */
3679
 
        /* With share level security vuid will always be zero.
3680
 
           Don't depend on vuser being non-null !!. JRA */
3681
 
        user_struct *vuser = get_valid_user_struct(sconn, vuid);
3682
 
        if(vuser != NULL) {
3683
 
                DEBUG(3,("  Username of UID %d is %s\n",
3684
 
                         (int)vuser->server_info->utok.uid,
3685
 
                         vuser->server_info->unix_name));
3686
 
        }
 
4234
        TALLOC_CTX *mem_ctx = talloc_tos();
 
4235
        NTSTATUS status, result;
 
4236
        struct rpc_pipe_client *cli = NULL;
 
4237
        struct policy_handle connect_handle, domain_handle, user_handle;
 
4238
        struct lsa_String domain_name;
 
4239
        struct dom_sid2 *domain_sid;
 
4240
        struct lsa_String names;
 
4241
        struct samr_Ids rids;
 
4242
        struct samr_Ids types;
 
4243
        int errcode = W_ERROR_V(WERR_USER_NOT_FOUND);
 
4244
        uint32_t rid;
 
4245
        union samr_UserInfo *info;
 
4246
        struct dcerpc_binding_handle *b = NULL;
3687
4247
 
3688
4248
        if (!str1 || !str2 || !UserName || !p) {
3689
4249
                return False;
3720
4280
                return False;
3721
4281
        }
3722
4282
 
3723
 
        SSVAL(*rparam,0,NERR_Success);
3724
 
        SSVAL(*rparam,2,0);             /* converter word */
3725
 
 
3726
4283
        p = *rdata;
3727
4284
        endp = *rdata + *rdata_len;
3728
4285
        p2 = get_safe_ptr(*rdata,*rdata_len,p,usri11_end);
3730
4287
                return False;
3731
4288
        }
3732
4289
 
 
4290
        ZERO_STRUCT(connect_handle);
 
4291
        ZERO_STRUCT(domain_handle);
 
4292
        ZERO_STRUCT(user_handle);
 
4293
 
 
4294
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
 
4295
                                        conn->session_info,
 
4296
                                        &conn->sconn->client_id,
 
4297
                                        conn->sconn->msg_ctx,
 
4298
                                        &cli);
 
4299
        if (!NT_STATUS_IS_OK(status)) {
 
4300
                DEBUG(0,("api_RNetUserGetInfo: could not connect to samr: %s\n",
 
4301
                          nt_errstr(status)));
 
4302
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4303
                goto out;
 
4304
        }
 
4305
 
 
4306
        b = cli->binding_handle;
 
4307
 
 
4308
        status = dcerpc_samr_Connect2(b, mem_ctx,
 
4309
                                      global_myname(),
 
4310
                                      SAMR_ACCESS_CONNECT_TO_SERVER |
 
4311
                                      SAMR_ACCESS_ENUM_DOMAINS |
 
4312
                                      SAMR_ACCESS_LOOKUP_DOMAIN,
 
4313
                                      &connect_handle,
 
4314
                                      &result);
 
4315
        if (!NT_STATUS_IS_OK(status)) {
 
4316
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4317
                goto out;
 
4318
        }
 
4319
        if (!NT_STATUS_IS_OK(result)) {
 
4320
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4321
                goto out;
 
4322
        }
 
4323
 
 
4324
        init_lsa_String(&domain_name, get_global_sam_name());
 
4325
 
 
4326
        status = dcerpc_samr_LookupDomain(b, mem_ctx,
 
4327
                                          &connect_handle,
 
4328
                                          &domain_name,
 
4329
                                          &domain_sid,
 
4330
                                          &result);
 
4331
        if (!NT_STATUS_IS_OK(status)) {
 
4332
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4333
                goto out;
 
4334
        }
 
4335
        if (!NT_STATUS_IS_OK(result)) {
 
4336
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4337
                goto out;
 
4338
        }
 
4339
 
 
4340
        status = dcerpc_samr_OpenDomain(b, mem_ctx,
 
4341
                                        &connect_handle,
 
4342
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
 
4343
                                        domain_sid,
 
4344
                                        &domain_handle,
 
4345
                                        &result);
 
4346
        if (!NT_STATUS_IS_OK(status)) {
 
4347
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4348
                goto out;
 
4349
        }
 
4350
        if (!NT_STATUS_IS_OK(result)) {
 
4351
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4352
                goto out;
 
4353
        }
 
4354
 
 
4355
        init_lsa_String(&names, UserName);
 
4356
 
 
4357
        status = dcerpc_samr_LookupNames(b, mem_ctx,
 
4358
                                         &domain_handle,
 
4359
                                         1,
 
4360
                                         &names,
 
4361
                                         &rids,
 
4362
                                         &types,
 
4363
                                         &result);
 
4364
        if (!NT_STATUS_IS_OK(status)) {
 
4365
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4366
                goto out;
 
4367
        }
 
4368
        if (!NT_STATUS_IS_OK(result)) {
 
4369
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4370
                goto out;
 
4371
        }
 
4372
 
 
4373
        if (rids.count != 1) {
 
4374
                errcode = W_ERROR_V(WERR_NO_SUCH_USER);
 
4375
                goto out;
 
4376
        }
 
4377
        if (rids.count != types.count) {
 
4378
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
4379
                goto out;
 
4380
        }
 
4381
        if (types.ids[0] != SID_NAME_USER) {
 
4382
                errcode = W_ERROR_V(WERR_INVALID_PARAM);
 
4383
                goto out;
 
4384
        }
 
4385
 
 
4386
        rid = rids.ids[0];
 
4387
 
 
4388
        status = dcerpc_samr_OpenUser(b, mem_ctx,
 
4389
                                      &domain_handle,
 
4390
                                      SAMR_USER_ACCESS_GET_LOCALE |
 
4391
                                      SAMR_USER_ACCESS_GET_LOGONINFO |
 
4392
                                      SAMR_USER_ACCESS_GET_ATTRIBUTES |
 
4393
                                      SAMR_USER_ACCESS_GET_GROUPS |
 
4394
                                      SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP |
 
4395
                                      SEC_STD_READ_CONTROL,
 
4396
                                      rid,
 
4397
                                      &user_handle,
 
4398
                                      &result);
 
4399
        if (!NT_STATUS_IS_OK(status)) {
 
4400
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4401
                goto out;
 
4402
        }
 
4403
        if (!NT_STATUS_IS_OK(result)) {
 
4404
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4405
                goto out;
 
4406
        }
 
4407
 
 
4408
        status = dcerpc_samr_QueryUserInfo2(b, mem_ctx,
 
4409
                                            &user_handle,
 
4410
                                            UserAllInformation,
 
4411
                                            &info,
 
4412
                                            &result);
 
4413
        if (!NT_STATUS_IS_OK(status)) {
 
4414
                errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4415
                goto out;
 
4416
        }
 
4417
        if (!NT_STATUS_IS_OK(result)) {
 
4418
                errcode = W_ERROR_V(ntstatus_to_werror(result));
 
4419
                goto out;
 
4420
        }
 
4421
 
3733
4422
        memset(p,0,21);
3734
4423
        fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */
3735
4424
 
3755
4444
 
3756
4445
                /* EEK! the cifsrap.txt doesn't have this in!!!! */
3757
4446
                SIVAL(p,usri11_full_name,PTR_DIFF(p2,p)); /* full name */
3758
 
                strlcpy(p2,((vuser != NULL)
3759
 
                            ? pdb_get_fullname(vuser->server_info->sam_account)
3760
 
                            : UserName),PTR_DIFF(endp,p2));
 
4447
                strlcpy(p2,info->info21.full_name.string,PTR_DIFF(endp,p2));
3761
4448
                p2 = skip_string(*rdata,*rdata_len,p2);
3762
4449
                if (!p2) {
3763
4450
                        return False;
3765
4452
        }
3766
4453
 
3767
4454
        if (uLevel == 11) {
3768
 
                const char *homedir = "";
3769
 
                if (vuser != NULL) {
3770
 
                        homedir = pdb_get_homedir(
3771
 
                                vuser->server_info->sam_account);
3772
 
                }
 
4455
                const char *homedir = info->info21.home_directory.string;
3773
4456
                /* modelled after NTAS 3.51 reply */
3774
 
                SSVAL(p,usri11_priv,conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER); 
 
4457
                SSVAL(p,usri11_priv,
 
4458
                        (get_current_uid(conn) == sec_initial_uid())?
 
4459
                        USER_PRIV_ADMIN:USER_PRIV_USER);
3775
4460
                SIVAL(p,usri11_auth_flags,AF_OP_PRINT);         /* auth flags */
3776
4461
                SIVALS(p,usri11_password_age,-1);               /* password age */
3777
4462
                SIVAL(p,usri11_homedir,PTR_DIFF(p2,p)); /* home dir */
3824
4509
                memset(p+22,' ',16);    /* password */
3825
4510
                SIVALS(p,38,-1);                /* password age */
3826
4511
                SSVAL(p,42,
3827
 
                conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
 
4512
                        (get_current_uid(conn) == sec_initial_uid())?
 
4513
                        USER_PRIV_ADMIN:USER_PRIV_USER);
3828
4514
                SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
3829
 
                strlcpy(p2, vuser ? pdb_get_homedir(
3830
 
                                vuser->server_info->sam_account) : "",
 
4515
                strlcpy(p2, info->info21.home_directory.string,
3831
4516
                        PTR_DIFF(endp,p2));
3832
4517
                p2 = skip_string(*rdata,*rdata_len,p2);
3833
4518
                if (!p2) {
3837
4522
                *p2++ = 0;
3838
4523
                SSVAL(p,52,0);          /* flags */
3839
4524
                SIVAL(p,54,PTR_DIFF(p2,*rdata));                /* script_path */
3840
 
                strlcpy(p2, vuser ? pdb_get_logon_script(
3841
 
                                vuser->server_info->sam_account) : "",
 
4525
                strlcpy(p2, info->info21.logon_script.string,
3842
4526
                        PTR_DIFF(endp,p2));
3843
4527
                p2 = skip_string(*rdata,*rdata_len,p2);
3844
4528
                if (!p2) {
3845
4529
                        return False;
3846
4530
                }
3847
4531
                if (uLevel == 2) {
3848
 
                        SIVAL(p,60,0);          /* auth_flags */
3849
 
                        SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* full_name */
3850
 
                        strlcpy(p2,((vuser != NULL)
3851
 
                                    ? pdb_get_fullname(vuser->server_info->sam_account)
3852
 
                                    : UserName),PTR_DIFF(endp,p2));
 
4532
                        SIVAL(p,58,0);          /* auth_flags */
 
4533
                        SIVAL(p,62,PTR_DIFF(p2,*rdata)); /* full_name */
 
4534
                        strlcpy(p2,info->info21.full_name.string,PTR_DIFF(endp,p2));
3853
4535
                        p2 = skip_string(*rdata,*rdata_len,p2);
3854
4536
                        if (!p2) {
3855
4537
                                return False;
3856
4538
                        }
3857
 
                        SIVAL(p,68,0);          /* urs_comment */
3858
 
                        SIVAL(p,72,PTR_DIFF(p2,*rdata)); /* parms */
 
4539
                        SIVAL(p,66,0);          /* urs_comment */
 
4540
                        SIVAL(p,70,PTR_DIFF(p2,*rdata)); /* parms */
3859
4541
                        strlcpy(p2,"",PTR_DIFF(endp,p2));
3860
4542
                        p2 = skip_string(*rdata,*rdata_len,p2);
3861
4543
                        if (!p2) {
3862
4544
                                return False;
3863
4545
                        }
3864
 
                        SIVAL(p,76,0);          /* workstations */
3865
 
                        SIVAL(p,80,0);          /* last_logon */
3866
 
                        SIVAL(p,84,0);          /* last_logoff */
3867
 
                        SIVALS(p,88,-1);                /* acct_expires */
3868
 
                        SIVALS(p,92,-1);                /* max_storage */
3869
 
                        SSVAL(p,96,168);        /* units_per_week */
3870
 
                        SIVAL(p,98,PTR_DIFF(p2,*rdata)); /* logon_hours */
 
4546
                        SIVAL(p,74,0);          /* workstations */
 
4547
                        SIVAL(p,78,0);          /* last_logon */
 
4548
                        SIVAL(p,82,0);          /* last_logoff */
 
4549
                        SIVALS(p,86,-1);                /* acct_expires */
 
4550
                        SIVALS(p,90,-1);                /* max_storage */
 
4551
                        SSVAL(p,94,168);        /* units_per_week */
 
4552
                        SIVAL(p,96,PTR_DIFF(p2,*rdata)); /* logon_hours */
3871
4553
                        memset(p2,-1,21);
3872
4554
                        p2 += 21;
3873
 
                        SSVALS(p,102,-1);       /* bad_pw_count */
3874
 
                        SSVALS(p,104,-1);       /* num_logons */
3875
 
                        SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
 
4555
                        SSVALS(p,100,-1);       /* bad_pw_count */
 
4556
                        SSVALS(p,102,-1);       /* num_logons */
 
4557
                        SIVAL(p,104,PTR_DIFF(p2,*rdata)); /* logon_server */
3876
4558
                        {
3877
4559
                                TALLOC_CTX *ctx = talloc_tos();
3878
4560
                                int space_rem = *rdata_len - (p2 - *rdata);
3902
4584
                        if (!p2) {
3903
4585
                                return False;
3904
4586
                        }
3905
 
                        SSVAL(p,110,49);        /* country_code */
3906
 
                        SSVAL(p,112,860);       /* code page */
 
4587
                        SSVAL(p,108,49);        /* country_code */
 
4588
                        SSVAL(p,110,860);       /* code page */
3907
4589
                }
3908
4590
        }
3909
4591
 
 
4592
        errcode = NERR_Success;
 
4593
 
 
4594
 out:
3910
4595
        *rdata_len = PTR_DIFF(p2,*rdata);
3911
4596
 
 
4597
        if (b && is_valid_policy_hnd(&user_handle)) {
 
4598
                dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
 
4599
        }
 
4600
        if (b && is_valid_policy_hnd(&domain_handle)) {
 
4601
                dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
 
4602
        }
 
4603
        if (b && is_valid_policy_hnd(&connect_handle)) {
 
4604
                dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
 
4605
        }
 
4606
 
 
4607
        SSVAL(*rparam,0,errcode);
 
4608
        SSVAL(*rparam,2,0);             /* converter word */
3912
4609
        SSVAL(*rparam,4,*rdata_len);    /* is this right?? */
3913
4610
 
3914
4611
        return(True);
3915
4612
}
3916
4613
 
3917
 
static bool api_WWkstaUserLogon(connection_struct *conn,uint16 vuid,
 
4614
static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
 
4615
                                connection_struct *conn,uint16 vuid,
3918
4616
                                char *param, int tpscnt,
3919
4617
                                char *data, int tdscnt,
3920
4618
                                int mdrcnt,int mprcnt,
3921
4619
                                char **rdata,char **rparam,
3922
4620
                                int *rdata_len,int *rparam_len)
3923
4621
{
3924
 
        struct smbd_server_connection *sconn = smbd_server_conn;
3925
4622
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
3926
4623
        char *str2 = skip_string(param,tpscnt,str1);
3927
4624
        char *p = skip_string(param,tpscnt,str2);
3938
4635
 
3939
4636
        if(vuser != NULL) {
3940
4637
                DEBUG(3,("  Username of UID %d is %s\n",
3941
 
                         (int)vuser->server_info->utok.uid,
3942
 
                         vuser->server_info->unix_name));
 
4638
                         (int)vuser->session_info->utok.uid,
 
4639
                         vuser->session_info->unix_name));
3943
4640
        }
3944
4641
 
3945
4642
        uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
3975
4672
                PACKI(&desc,"W",0);             /* code */
3976
4673
                PACKS(&desc,"B21",name);        /* eff. name */
3977
4674
                PACKS(&desc,"B","");            /* pad */
3978
 
                PACKI(&desc,"W", conn->admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
 
4675
                PACKI(&desc,"W",
 
4676
                        (get_current_uid(conn) == sec_initial_uid())?
 
4677
                        USER_PRIV_ADMIN:USER_PRIV_USER);
3979
4678
                PACKI(&desc,"D",0);             /* auth flags XXX */
3980
4679
                PACKI(&desc,"W",0);             /* num logons */
3981
4680
                PACKI(&desc,"W",0);             /* bad pw count */
3996
4695
                }
3997
4696
 
3998
4697
                PACKS(&desc,"z",lp_workgroup());/* domain */
3999
 
                PACKS(&desc,"z", vuser ? pdb_get_logon_script(
4000
 
                              vuser->server_info->sam_account) : ""); /* script path */
 
4698
                PACKS(&desc,"z", vuser ?
 
4699
                        vuser->session_info->info3->base.logon_script.string
 
4700
                        : ""); /* script path */
4001
4701
                PACKI(&desc,"D",0x00000000);            /* reserved */
4002
4702
        }
4003
4703
 
4020
4720
 api_WAccessGetUserPerms
4021
4721
****************************************************************************/
4022
4722
 
4023
 
static bool api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid,
 
4723
static bool api_WAccessGetUserPerms(struct smbd_server_connection *sconn,
 
4724
                                    connection_struct *conn,uint16 vuid,
4024
4725
                                char *param, int tpscnt,
4025
4726
                                char *data, int tdscnt,
4026
4727
                                int mdrcnt,int mprcnt,
4065
4766
  api_WPrintJobEnumerate
4066
4767
  ****************************************************************************/
4067
4768
 
4068
 
static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
 
4769
static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn,
 
4770
                                 connection_struct *conn, uint16 vuid,
4069
4771
                                char *param, int tpscnt,
4070
4772
                                char *data, int tdscnt,
4071
4773
                                int mdrcnt,int mprcnt,
4076
4778
        char *str2 = skip_string(param,tpscnt,str1);
4077
4779
        char *p = skip_string(param,tpscnt,str2);
4078
4780
        int uLevel;
4079
 
        int count;
4080
 
        int i;
4081
 
        int snum;
4082
4781
        fstring sharename;
4083
4782
        uint32 jobid;
4084
4783
        struct pack_desc desc;
4085
 
        print_queue_struct *queue=NULL;
4086
 
        print_status_struct status;
4087
4784
        char *tmpdata=NULL;
4088
4785
 
 
4786
        TALLOC_CTX *mem_ctx = talloc_tos();
 
4787
        WERROR werr;
 
4788
        NTSTATUS status;
 
4789
        struct rpc_pipe_client *cli = NULL;
 
4790
        struct dcerpc_binding_handle *b = NULL;
 
4791
        struct policy_handle handle;
 
4792
        struct spoolss_DevmodeContainer devmode_ctr;
 
4793
        union spoolss_JobInfo info;
 
4794
 
4089
4795
        if (!str1 || !str2 || !p) {
4090
4796
                return False;
4091
4797
        }
4109
4815
                return False;
4110
4816
        }
4111
4817
 
4112
 
        snum = lp_servicenumber( sharename);
4113
 
        if (snum < 0 || !VALID_SNUM(snum)) {
4114
 
                return(False);
4115
 
        }
4116
 
 
4117
 
        count = print_queue_status(snum,&queue,&status);
4118
 
        for (i = 0; i < count; i++) {
4119
 
                if (queue[i].job == jobid) {
4120
 
                        break;
4121
 
                }
 
4818
        ZERO_STRUCT(handle);
 
4819
 
 
4820
        status = rpc_pipe_open_interface(conn,
 
4821
                                         &ndr_table_spoolss.syntax_id,
 
4822
                                         conn->session_info,
 
4823
                                         &conn->sconn->client_id,
 
4824
                                         conn->sconn->msg_ctx,
 
4825
                                         &cli);
 
4826
        if (!NT_STATUS_IS_OK(status)) {
 
4827
                DEBUG(0,("api_WPrintJobGetInfo: could not connect to spoolss: %s\n",
 
4828
                          nt_errstr(status)));
 
4829
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4830
                goto out;
 
4831
        }
 
4832
        b = cli->binding_handle;
 
4833
 
 
4834
        ZERO_STRUCT(devmode_ctr);
 
4835
 
 
4836
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
4837
                                            sharename,
 
4838
                                            "RAW",
 
4839
                                            devmode_ctr,
 
4840
                                            PRINTER_ACCESS_USE,
 
4841
                                            &handle,
 
4842
                                            &werr);
 
4843
        if (!NT_STATUS_IS_OK(status)) {
 
4844
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4845
                goto out;
 
4846
        }
 
4847
        if (!W_ERROR_IS_OK(werr)) {
 
4848
                desc.errcode = W_ERROR_V(werr);
 
4849
                goto out;
 
4850
        }
 
4851
 
 
4852
        werr = rpccli_spoolss_getjob(cli, mem_ctx,
 
4853
                                     &handle,
 
4854
                                     jobid,
 
4855
                                     2, /* level */
 
4856
                                     0, /* offered */
 
4857
                                     &info);
 
4858
        if (!W_ERROR_IS_OK(werr)) {
 
4859
                desc.errcode = W_ERROR_V(werr);
 
4860
                goto out;
4122
4861
        }
4123
4862
 
4124
4863
        if (mdrcnt > 0) {
4138
4877
        }
4139
4878
 
4140
4879
        if (init_package(&desc,1,0)) {
4141
 
                if (i < count) {
4142
 
                        fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
4143
 
                        *rdata_len = desc.usedlen;
4144
 
                } else {
4145
 
                        desc.errcode = NERR_JobNotFound;
4146
 
                        *rdata_len = 0;
4147
 
                }
 
4880
                fill_spoolss_printjob_info(uLevel, &desc, &info.info2, info.info2.position);
 
4881
                *rdata_len = desc.usedlen;
 
4882
        } else {
 
4883
                desc.errcode = NERR_JobNotFound;
 
4884
                *rdata_len = 0;
 
4885
        }
 
4886
 out:
 
4887
        if (b && is_valid_policy_hnd(&handle)) {
 
4888
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
4148
4889
        }
4149
4890
 
4150
4891
        *rparam_len = 6;
4156
4897
        SSVAL(*rparam,2,0);
4157
4898
        SSVAL(*rparam,4,desc.neededlen);
4158
4899
 
4159
 
        SAFE_FREE(queue);
4160
4900
        SAFE_FREE(tmpdata);
4161
4901
 
4162
4902
        DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode));
4164
4904
        return True;
4165
4905
}
4166
4906
 
4167
 
static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
 
4907
static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn,
 
4908
                                   connection_struct *conn, uint16 vuid,
4168
4909
                                char *param, int tpscnt,
4169
4910
                                char *data, int tdscnt,
4170
4911
                                int mdrcnt,int mprcnt,
4176
4917
        char *p = skip_string(param,tpscnt,str2);
4177
4918
        char *name = p;
4178
4919
        int uLevel;
4179
 
        int count;
4180
4920
        int i, succnt=0;
4181
 
        int snum;
4182
4921
        struct pack_desc desc;
4183
 
        print_queue_struct *queue=NULL;
4184
 
        print_status_struct status;
 
4922
 
 
4923
        TALLOC_CTX *mem_ctx = talloc_tos();
 
4924
        WERROR werr;
 
4925
        NTSTATUS status;
 
4926
        struct rpc_pipe_client *cli = NULL;
 
4927
        struct dcerpc_binding_handle *b = NULL;
 
4928
        struct policy_handle handle;
 
4929
        struct spoolss_DevmodeContainer devmode_ctr;
 
4930
        uint32_t count = 0;
 
4931
        union spoolss_JobInfo *info;
4185
4932
 
4186
4933
        if (!str1 || !str2 || !p) {
4187
4934
                return False;
4188
4935
        }
4189
4936
 
4190
4937
        memset((char *)&desc,'\0',sizeof(desc));
4191
 
        memset((char *)&status,'\0',sizeof(status));
4192
4938
 
4193
4939
        p = skip_string(param,tpscnt,p);
4194
4940
        if (!p) {
4207
4953
                return False;   /* defined only for uLevel 0,1,2 */
4208
4954
        }
4209
4955
 
4210
 
        if (!check_printjob_info(&desc,uLevel,str2)) { 
4211
 
                return False;
4212
 
        }
4213
 
 
4214
 
        snum = find_service(name);
4215
 
        if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
4216
 
                return False;
4217
 
        }
4218
 
 
4219
 
        count = print_queue_status(snum,&queue,&status);
 
4956
        if (!check_printjob_info(&desc,uLevel,str2)) {
 
4957
                return False;
 
4958
        }
 
4959
 
 
4960
        ZERO_STRUCT(handle);
 
4961
 
 
4962
        status = rpc_pipe_open_interface(conn,
 
4963
                                         &ndr_table_spoolss.syntax_id,
 
4964
                                         conn->session_info,
 
4965
                                         &conn->sconn->client_id,
 
4966
                                         conn->sconn->msg_ctx,
 
4967
                                         &cli);
 
4968
        if (!NT_STATUS_IS_OK(status)) {
 
4969
                DEBUG(0,("api_WPrintJobEnumerate: could not connect to spoolss: %s\n",
 
4970
                          nt_errstr(status)));
 
4971
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4972
                goto out;
 
4973
        }
 
4974
        b = cli->binding_handle;
 
4975
 
 
4976
        ZERO_STRUCT(devmode_ctr);
 
4977
 
 
4978
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
4979
                                            name,
 
4980
                                            NULL,
 
4981
                                            devmode_ctr,
 
4982
                                            SEC_FLAG_MAXIMUM_ALLOWED,
 
4983
                                            &handle,
 
4984
                                            &werr);
 
4985
        if (!NT_STATUS_IS_OK(status)) {
 
4986
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
4987
                goto out;
 
4988
        }
 
4989
        if (!W_ERROR_IS_OK(werr)) {
 
4990
                desc.errcode = W_ERROR_V(werr);
 
4991
                goto out;
 
4992
        }
 
4993
 
 
4994
        werr = rpccli_spoolss_enumjobs(cli, mem_ctx,
 
4995
                                       &handle,
 
4996
                                       0, /* firstjob */
 
4997
                                       0xff, /* numjobs */
 
4998
                                       2, /* level */
 
4999
                                       0, /* offered */
 
5000
                                       &count,
 
5001
                                       &info);
 
5002
        if (!W_ERROR_IS_OK(werr)) {
 
5003
                desc.errcode = W_ERROR_V(werr);
 
5004
                goto out;
 
5005
        }
 
5006
 
4220
5007
        if (mdrcnt > 0) {
4221
5008
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
4222
5009
                if (!*rdata) {
4229
5016
        if (init_package(&desc,count,0)) {
4230
5017
                succnt = 0;
4231
5018
                for (i = 0; i < count; i++) {
4232
 
                        fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i);
 
5019
                        fill_spoolss_printjob_info(uLevel, &desc, &info[i].info2, i);
4233
5020
                        if (desc.errcode == NERR_Success) {
4234
5021
                                succnt = i+1;
4235
5022
                        }
4236
5023
                }
4237
5024
        }
 
5025
 out:
 
5026
        if (b && is_valid_policy_hnd(&handle)) {
 
5027
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
5028
        }
4238
5029
 
4239
5030
        *rdata_len = desc.usedlen;
4240
5031
 
4248
5039
        SSVAL(*rparam,4,succnt);
4249
5040
        SSVAL(*rparam,6,count);
4250
5041
 
4251
 
        SAFE_FREE(queue);
4252
 
 
4253
5042
        DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode));
4254
5043
 
4255
5044
        return True;
4278
5067
                        return False;
4279
5068
        }
4280
5069
        if (id == NULL || strcmp(desc->format,id) != 0) {
4281
 
                DEBUG(0,("check_printdest_info: invalid string %s\n", 
 
5070
                DEBUG(0,("check_printdest_info: invalid string %s\n",
4282
5071
                        id ? id : "<NULL>" ));
4283
5072
                return False;
4284
5073
        }
4285
5074
        return True;
4286
5075
}
4287
5076
 
4288
 
static void fill_printdest_info(connection_struct *conn, int snum, int uLevel,
 
5077
static void fill_printdest_info(struct spoolss_PrinterInfo2 *info2, int uLevel,
4289
5078
                                struct pack_desc* desc)
4290
5079
{
4291
5080
        char buf[100];
4292
5081
 
4293
 
        strncpy(buf,SERVICE(snum),sizeof(buf)-1);
 
5082
        strncpy(buf, info2->printername, sizeof(buf)-1);
4294
5083
        buf[sizeof(buf)-1] = 0;
4295
5084
        strupper_m(buf);
4296
5085
 
4321
5110
        }
4322
5111
}
4323
5112
 
4324
 
static bool api_WPrintDestGetInfo(connection_struct *conn, uint16 vuid,
 
5113
static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn,
 
5114
                                  connection_struct *conn, uint16 vuid,
4325
5115
                                char *param, int tpscnt,
4326
5116
                                char *data, int tdscnt,
4327
5117
                                int mdrcnt,int mprcnt,
4334
5124
        char* PrinterName = p;
4335
5125
        int uLevel;
4336
5126
        struct pack_desc desc;
4337
 
        int snum;
4338
5127
        char *tmpdata=NULL;
4339
5128
 
 
5129
        TALLOC_CTX *mem_ctx = talloc_tos();
 
5130
        WERROR werr;
 
5131
        NTSTATUS status;
 
5132
        struct rpc_pipe_client *cli = NULL;
 
5133
        struct dcerpc_binding_handle *b = NULL;
 
5134
        struct policy_handle handle;
 
5135
        struct spoolss_DevmodeContainer devmode_ctr;
 
5136
        union spoolss_PrinterInfo info;
 
5137
 
4340
5138
        if (!str1 || !str2 || !p) {
4341
5139
                return False;
4342
5140
        }
4359
5157
                return False;
4360
5158
        }
4361
5159
 
4362
 
        snum = find_service(PrinterName);
4363
 
        if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
4364
 
                *rdata_len = 0;
4365
 
                desc.errcode = NERR_DestNotFound;
4366
 
                desc.neededlen = 0;
 
5160
        ZERO_STRUCT(handle);
 
5161
 
 
5162
        status = rpc_pipe_open_interface(conn,
 
5163
                                         &ndr_table_spoolss.syntax_id,
 
5164
                                         conn->session_info,
 
5165
                                         &conn->sconn->client_id,
 
5166
                                         conn->sconn->msg_ctx,
 
5167
                                         &cli);
 
5168
        if (!NT_STATUS_IS_OK(status)) {
 
5169
                DEBUG(0,("api_WPrintDestGetInfo: could not connect to spoolss: %s\n",
 
5170
                          nt_errstr(status)));
 
5171
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
5172
                goto out;
 
5173
        }
 
5174
        b = cli->binding_handle;
 
5175
 
 
5176
        ZERO_STRUCT(devmode_ctr);
 
5177
 
 
5178
        status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
 
5179
                                            PrinterName,
 
5180
                                            NULL,
 
5181
                                            devmode_ctr,
 
5182
                                            SEC_FLAG_MAXIMUM_ALLOWED,
 
5183
                                            &handle,
 
5184
                                            &werr);
 
5185
        if (!NT_STATUS_IS_OK(status)) {
 
5186
                *rdata_len = 0;
 
5187
                desc.errcode = NERR_DestNotFound;
 
5188
                desc.neededlen = 0;
 
5189
                goto out;
 
5190
        }
 
5191
        if (!W_ERROR_IS_OK(werr)) {
 
5192
                *rdata_len = 0;
 
5193
                desc.errcode = NERR_DestNotFound;
 
5194
                desc.neededlen = 0;
 
5195
                goto out;
 
5196
        }
 
5197
 
 
5198
        werr = rpccli_spoolss_getprinter(cli, mem_ctx,
 
5199
                                         &handle,
 
5200
                                         2,
 
5201
                                         0,
 
5202
                                         &info);
 
5203
        if (!W_ERROR_IS_OK(werr)) {
 
5204
                *rdata_len = 0;
 
5205
                desc.errcode = NERR_DestNotFound;
 
5206
                desc.neededlen = 0;
 
5207
                goto out;
 
5208
        }
 
5209
 
 
5210
        if (mdrcnt > 0) {
 
5211
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
 
5212
                if (!*rdata) {
 
5213
                        return False;
 
5214
                }
 
5215
                desc.base = *rdata;
 
5216
                desc.buflen = mdrcnt;
4367
5217
        } else {
4368
 
                if (mdrcnt > 0) {
4369
 
                        *rdata = smb_realloc_limit(*rdata,mdrcnt);
4370
 
                        if (!*rdata) {
4371
 
                                return False;
4372
 
                        }
4373
 
                        desc.base = *rdata;
4374
 
                        desc.buflen = mdrcnt;
4375
 
                } else {
4376
 
                        /*
4377
 
                         * Don't return data but need to get correct length
4378
 
                         * init_package will return wrong size if buflen=0
4379
 
                         */
4380
 
                        desc.buflen = getlen(desc.format);
4381
 
                        desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
4382
 
                }
4383
 
                if (init_package(&desc,1,0)) {
4384
 
                        fill_printdest_info(conn,snum,uLevel,&desc);
4385
 
                }
4386
 
                *rdata_len = desc.usedlen;
4387
 
        }
 
5218
                /*
 
5219
                 * Don't return data but need to get correct length
 
5220
                 * init_package will return wrong size if buflen=0
 
5221
                 */
 
5222
                desc.buflen = getlen(desc.format);
 
5223
                desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
 
5224
        }
 
5225
        if (init_package(&desc,1,0)) {
 
5226
                fill_printdest_info(&info.info2, uLevel,&desc);
 
5227
        }
 
5228
 
 
5229
 out:
 
5230
        if (b && is_valid_policy_hnd(&handle)) {
 
5231
                dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
 
5232
        }
 
5233
 
 
5234
        *rdata_len = desc.usedlen;
4388
5235
 
4389
5236
        *rparam_len = 6;
4390
5237
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
4401
5248
        return True;
4402
5249
}
4403
5250
 
4404
 
static bool api_WPrintDestEnum(connection_struct *conn, uint16 vuid,
 
5251
static bool api_WPrintDestEnum(struct smbd_server_connection *sconn,
 
5252
                               connection_struct *conn, uint16 vuid,
4405
5253
                                char *param, int tpscnt,
4406
5254
                                char *data, int tdscnt,
4407
5255
                                int mdrcnt,int mprcnt,
4415
5263
        int queuecnt;
4416
5264
        int i, n, succnt=0;
4417
5265
        struct pack_desc desc;
4418
 
        int services = lp_numservices();
 
5266
 
 
5267
        TALLOC_CTX *mem_ctx = talloc_tos();
 
5268
        WERROR werr;
 
5269
        NTSTATUS status;
 
5270
        struct rpc_pipe_client *cli = NULL;
 
5271
        union spoolss_PrinterInfo *info;
 
5272
        uint32_t count;
4419
5273
 
4420
5274
        if (!str1 || !str2 || !p) {
4421
5275
                return False;
4436
5290
        }
4437
5291
 
4438
5292
        queuecnt = 0;
4439
 
        for (i = 0; i < services; i++) {
4440
 
                if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
4441
 
                        queuecnt++;
4442
 
                }
4443
 
        }
 
5293
 
 
5294
        status = rpc_pipe_open_interface(conn,
 
5295
                                         &ndr_table_spoolss.syntax_id,
 
5296
                                         conn->session_info,
 
5297
                                         &conn->sconn->client_id,
 
5298
                                         conn->sconn->msg_ctx,
 
5299
                                         &cli);
 
5300
        if (!NT_STATUS_IS_OK(status)) {
 
5301
                DEBUG(0,("api_WPrintDestEnum: could not connect to spoolss: %s\n",
 
5302
                          nt_errstr(status)));
 
5303
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
5304
                goto out;
 
5305
        }
 
5306
 
 
5307
        werr = rpccli_spoolss_enumprinters(cli, mem_ctx,
 
5308
                                           PRINTER_ENUM_LOCAL,
 
5309
                                           cli->srv_name_slash,
 
5310
                                           2,
 
5311
                                           0,
 
5312
                                           &count,
 
5313
                                           &info);
 
5314
        if (!W_ERROR_IS_OK(werr)) {
 
5315
                desc.errcode = W_ERROR_V(werr);
 
5316
                *rdata_len = 0;
 
5317
                desc.errcode = NERR_DestNotFound;
 
5318
                desc.neededlen = 0;
 
5319
                goto out;
 
5320
        }
 
5321
 
 
5322
        queuecnt = count;
4444
5323
 
4445
5324
        if (mdrcnt > 0) {
4446
5325
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
4451
5330
 
4452
5331
        desc.base = *rdata;
4453
5332
        desc.buflen = mdrcnt;
4454
 
        if (init_package(&desc,queuecnt,0)) {    
 
5333
        if (init_package(&desc,queuecnt,0)) {
4455
5334
                succnt = 0;
4456
5335
                n = 0;
4457
 
                for (i = 0; i < services; i++) {
4458
 
                        if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
4459
 
                                fill_printdest_info(conn,i,uLevel,&desc);
4460
 
                                n++;
4461
 
                                if (desc.errcode == NERR_Success) {
4462
 
                                        succnt = n;
4463
 
                                }
 
5336
                for (i = 0; i < count; i++) {
 
5337
                        fill_printdest_info(&info[i].info2, uLevel,&desc);
 
5338
                        n++;
 
5339
                        if (desc.errcode == NERR_Success) {
 
5340
                                succnt = n;
4464
5341
                        }
4465
5342
                }
4466
5343
        }
4467
 
 
 
5344
 out:
4468
5345
        *rdata_len = desc.usedlen;
4469
5346
 
4470
5347
        *rparam_len = 8;
4482
5359
        return True;
4483
5360
}
4484
5361
 
4485
 
static bool api_WPrintDriverEnum(connection_struct *conn, uint16 vuid,
 
5362
static bool api_WPrintDriverEnum(struct smbd_server_connection *sconn,
 
5363
                                 connection_struct *conn, uint16 vuid,
4486
5364
                                char *param, int tpscnt,
4487
5365
                                char *data, int tdscnt,
4488
5366
                                int mdrcnt,int mprcnt,
4545
5423
        return True;
4546
5424
}
4547
5425
 
4548
 
static bool api_WPrintQProcEnum(connection_struct *conn, uint16 vuid,
 
5426
static bool api_WPrintQProcEnum(struct smbd_server_connection *sconn,
 
5427
                                connection_struct *conn, uint16 vuid,
4549
5428
                                char *param, int tpscnt,
4550
5429
                                char *data, int tdscnt,
4551
5430
                                int mdrcnt,int mprcnt,
4608
5487
        return True;
4609
5488
}
4610
5489
 
4611
 
static bool api_WPrintPortEnum(connection_struct *conn, uint16 vuid,
 
5490
static bool api_WPrintPortEnum(struct smbd_server_connection *sconn,
 
5491
                               connection_struct *conn, uint16 vuid,
4612
5492
                                char *param, int tpscnt,
4613
5493
                                char *data, int tdscnt,
4614
5494
                                int mdrcnt,int mprcnt,
4677
5557
 List open sessions
4678
5558
 ****************************************************************************/
4679
5559
 
4680
 
static bool api_RNetSessionEnum(connection_struct *conn, uint16 vuid,
 
5560
static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
 
5561
                                connection_struct *conn, uint16 vuid,
4681
5562
                                char *param, int tpscnt,
4682
5563
                                char *data, int tdscnt,
4683
5564
                                int mdrcnt,int mprcnt,
4690
5571
        char *p = skip_string(param,tpscnt,str2);
4691
5572
        int uLevel;
4692
5573
        struct pack_desc desc;
4693
 
        struct sessionid *session_list;
4694
 
        int i, num_sessions;
 
5574
        int i;
 
5575
 
 
5576
        TALLOC_CTX *mem_ctx = talloc_tos();
 
5577
        WERROR werr;
 
5578
        NTSTATUS status;
 
5579
        struct rpc_pipe_client *cli = NULL;
 
5580
        struct dcerpc_binding_handle *b = NULL;
 
5581
        struct srvsvc_NetSessInfoCtr info_ctr;
 
5582
        uint32_t totalentries, resume_handle = 0;
 
5583
        uint32_t count = 0;
4695
5584
 
4696
5585
        if (!str1 || !str2 || !p) {
4697
5586
                return False;
4698
5587
        }
4699
5588
 
4700
 
        memset((char *)&desc,'\0',sizeof(desc));
 
5589
        ZERO_STRUCT(desc);
4701
5590
 
4702
5591
        uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
4703
5592
 
4713
5602
                return False;
4714
5603
        }
4715
5604
 
4716
 
        num_sessions = list_sessions(talloc_tos(), &session_list);
4717
 
 
 
5605
        status = rpc_pipe_open_interface(conn,
 
5606
                                         &ndr_table_srvsvc.syntax_id,
 
5607
                                         conn->session_info,
 
5608
                                         &conn->sconn->client_id,
 
5609
                                         conn->sconn->msg_ctx,
 
5610
                                         &cli);
 
5611
        if (!NT_STATUS_IS_OK(status)) {
 
5612
                DEBUG(0,("RNetSessionEnum: could not connect to srvsvc: %s\n",
 
5613
                          nt_errstr(status)));
 
5614
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
5615
                goto out;
 
5616
        }
 
5617
        b = cli->binding_handle;
 
5618
 
 
5619
        info_ctr.level = 1;
 
5620
        info_ctr.ctr.ctr1 = talloc_zero(talloc_tos(), struct srvsvc_NetSessCtr1);
 
5621
        if (info_ctr.ctr.ctr1 == NULL) {
 
5622
                desc.errcode = W_ERROR_V(WERR_NOMEM);
 
5623
                goto out;
 
5624
        }
 
5625
 
 
5626
        status = dcerpc_srvsvc_NetSessEnum(b, mem_ctx,
 
5627
                                           cli->srv_name_slash,
 
5628
                                           NULL, /* client */
 
5629
                                           NULL, /* user */
 
5630
                                           &info_ctr,
 
5631
                                           (uint32_t)-1, /* max_buffer */
 
5632
                                           &totalentries,
 
5633
                                           &resume_handle,
 
5634
                                           &werr);
 
5635
        if (!NT_STATUS_IS_OK(status)) {
 
5636
                DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
 
5637
                          nt_errstr(status)));
 
5638
                desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
 
5639
                goto out;
 
5640
        }
 
5641
 
 
5642
        if (!W_ERROR_IS_OK(werr)) {
 
5643
                DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
 
5644
                          win_errstr(werr)));
 
5645
                desc.errcode = W_ERROR_V(werr);
 
5646
                goto out;
 
5647
        }
 
5648
 
 
5649
        count = info_ctr.ctr.ctr1->count;
 
5650
 
 
5651
 out:
4718
5652
        if (mdrcnt > 0) {
4719
5653
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
4720
5654
                if (!*rdata) {
4721
5655
                        return False;
4722
5656
                }
4723
5657
        }
4724
 
        memset((char *)&desc,'\0',sizeof(desc));
 
5658
 
4725
5659
        desc.base = *rdata;
4726
5660
        desc.buflen = mdrcnt;
4727
5661
        desc.format = str2;
4728
 
        if (!init_package(&desc,num_sessions,0)) {
 
5662
        if (!init_package(&desc, count,0)) {
4729
5663
                return False;
4730
5664
        }
4731
5665
 
4732
 
        for(i=0; i<num_sessions; i++) {
4733
 
                PACKS(&desc, "z", session_list[i].remote_machine);
4734
 
                PACKS(&desc, "z", session_list[i].username);
 
5666
        for(i=0; i < count; i++) {
 
5667
                PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].client);
 
5668
                PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].user);
4735
5669
                PACKI(&desc, "W", 1); /* num conns */
4736
 
                PACKI(&desc, "W", 0); /* num opens */
 
5670
                PACKI(&desc, "W", info_ctr.ctr.ctr1->array[i].num_open);
4737
5671
                PACKI(&desc, "W", 1); /* num users */
4738
5672
                PACKI(&desc, "D", 0); /* session time */
4739
5673
                PACKI(&desc, "D", 0); /* idle time */
4750
5684
        }
4751
5685
        SSVALS(*rparam,0,desc.errcode);
4752
5686
        SSVAL(*rparam,2,0); /* converter */
4753
 
        SSVAL(*rparam,4,num_sessions); /* count */
 
5687
        SSVAL(*rparam,4, count); /* count */
4754
5688
 
4755
5689
        DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
4756
5690
 
4762
5696
 The buffer was too small.
4763
5697
 ****************************************************************************/
4764
5698
 
4765
 
static bool api_TooSmall(connection_struct *conn,uint16 vuid, char *param, char *data,
 
5699
static bool api_TooSmall(struct smbd_server_connection *sconn,
 
5700
                         connection_struct *conn,uint16 vuid, char *param, char *data,
4766
5701
                         int mdrcnt, int mprcnt,
4767
5702
                         char **rdata, char **rparam,
4768
5703
                         int *rdata_len, int *rparam_len)
4786
5721
 The request is not supported.
4787
5722
 ****************************************************************************/
4788
5723
 
4789
 
static bool api_Unsupported(connection_struct *conn, uint16 vuid,
 
5724
static bool api_Unsupported(struct smbd_server_connection *sconn,
 
5725
                            connection_struct *conn, uint16 vuid,
4790
5726
                                char *param, int tpscnt,
4791
5727
                                char *data, int tdscnt,
4792
5728
                                int mdrcnt, int mprcnt,
4812
5748
static const struct {
4813
5749
        const char *name;
4814
5750
        int id;
4815
 
        bool (*fn)(connection_struct *, uint16,
 
5751
        bool (*fn)(struct smbd_server_connection *sconn,
 
5752
                   connection_struct *, uint16,
4816
5753
                        char *, int,
4817
5754
                        char *, int,
4818
5755
                        int,int,char **,char **,int *,int *);
4855
5792
        {NULL,          -1,     api_Unsupported}
4856
5793
        /*  The following RAP calls are not implemented by Samba:
4857
5794
 
4858
 
        RAP_WFileEnum2 - anon not OK 
 
5795
        RAP_WFileEnum2 - anon not OK
4859
5796
        */
4860
5797
};
4861
5798
 
4870
5807
               int tdscnt, int tpscnt,
4871
5808
               int mdrcnt, int mprcnt)
4872
5809
{
4873
 
        struct smbd_server_connection *sconn = smbd_server_conn;
4874
5810
        int api_command;
4875
5811
        char *rdata = NULL;
4876
5812
        char *rparam = NULL;
4919
5855
        /* Check whether this api call can be done anonymously */
4920
5856
 
4921
5857
        if (api_commands[i].auth_user && lp_restrict_anonymous()) {
4922
 
                user_struct *user = get_valid_user_struct(sconn, vuid);
 
5858
                user_struct *user = get_valid_user_struct(req->sconn, vuid);
4923
5859
 
4924
 
                if (!user || user->server_info->guest) {
 
5860
                if (!user || user->session_info->guest) {
4925
5861
                        reply_nterror(req, NT_STATUS_ACCESS_DENIED);
4926
5862
                        return;
4927
5863
                }
4945
5881
                return;
4946
5882
        }
4947
5883
 
4948
 
        reply = api_commands[i].fn(conn,
 
5884
        reply = api_commands[i].fn(req->sconn, conn,
4949
5885
                                vuid,
4950
5886
                                params,tpscnt,  /* params + length */
4951
5887
                                data,tdscnt,    /* data + length */
4954
5890
 
4955
5891
 
4956
5892
        if (rdata_len > mdrcnt || rparam_len > mprcnt) {
4957
 
                reply = api_TooSmall(conn,vuid,params,data,mdrcnt,mprcnt,
 
5893
                reply = api_TooSmall(req->sconn,conn,vuid,params,data,
 
5894
                                     mdrcnt,mprcnt,
4958
5895
                                        &rdata,&rparam,&rdata_len,&rparam_len);
4959
5896
        }
4960
5897
 
4961
5898
        /* if we get False back then it's actually unsupported */
4962
5899
        if (!reply) {
4963
 
                reply = api_Unsupported(conn,vuid,params,tpscnt,data,tdscnt,mdrcnt,mprcnt,
 
5900
                reply = api_Unsupported(req->sconn,conn,vuid,params,tpscnt,
 
5901
                                        data,
 
5902
                                        tdscnt,mdrcnt,mprcnt,
4964
5903
                        &rdata,&rparam,&rdata_len,&rparam_len);
4965
5904
        }
4966
5905