xref: /onnv-gate/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c (revision 9343:ef29909f1c11)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
228474SJose.Borrego@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
235331Samw  * Use is subject to license terms.
245331Samw  */
255331Samw 
265331Samw /*
275331Samw  * Utility functions to support the RPC interface library.
285331Samw  */
295331Samw 
305331Samw #include <stdio.h>
315331Samw #include <stdarg.h>
325331Samw #include <strings.h>
335331Samw #include <unistd.h>
345331Samw #include <netdb.h>
355331Samw #include <stdlib.h>
365331Samw #include <sys/time.h>
375331Samw #include <sys/systm.h>
389021Samw@Sun.COM #include <syslog.h>
395331Samw 
405331Samw #include <smbsrv/libsmb.h>
415331Samw #include <smbsrv/libsmbrdr.h>
425331Samw #include <smbsrv/libsmbns.h>
435331Samw #include <smbsrv/libmlsvc.h>
445331Samw #include <smbsrv/smbinfo.h>
458334SJose.Borrego@Sun.COM #include <lsalib.h>
468334SJose.Borrego@Sun.COM #include <samlib.h>
478334SJose.Borrego@Sun.COM #include <smbsrv/netrauth.h>
485331Samw 
495772Sas200622 /* Domain join support (using MS-RPC) */
505772Sas200622 static boolean_t mlsvc_ntjoin_support = B_FALSE;
515772Sas200622 
525331Samw extern int netr_open(char *, char *, mlsvc_handle_t *);
535331Samw extern int netr_close(mlsvc_handle_t *);
545331Samw extern DWORD netlogon_auth(char *, mlsvc_handle_t *, DWORD);
555331Samw extern int mlsvc_user_getauth(char *, char *, smb_auth_info_t *);
565331Samw 
575331Samw /*
585331Samw  * mlsvc_lookup_name
595331Samw  *
605772Sas200622  * This is just a wrapper for lsa_lookup_name.
615331Samw  *
625772Sas200622  * The memory for the sid is allocated using malloc so the caller should
635772Sas200622  * call free when it is no longer required.
645331Samw  */
655772Sas200622 uint32_t
668670SJose.Borrego@Sun.COM mlsvc_lookup_name(char *name, smb_sid_t **sid, uint16_t *sid_type)
675331Samw {
688670SJose.Borrego@Sun.COM 	smb_account_t account;
695772Sas200622 	uint32_t status;
705331Samw 
718670SJose.Borrego@Sun.COM 	status = lsa_lookup_name(name, *sid_type, &account);
725772Sas200622 	if (status == NT_STATUS_SUCCESS) {
738670SJose.Borrego@Sun.COM 		*sid = account.a_sid;
748670SJose.Borrego@Sun.COM 		account.a_sid = NULL;
758670SJose.Borrego@Sun.COM 		*sid_type = account.a_type;
768670SJose.Borrego@Sun.COM 		smb_account_free(&account);
775772Sas200622 	}
785331Samw 
795772Sas200622 	return (status);
805331Samw }
815331Samw 
825331Samw /*
835331Samw  * mlsvc_lookup_sid
845331Samw  *
855772Sas200622  * This is just a wrapper for lsa_lookup_sid.
865772Sas200622  *
875772Sas200622  * The allocated memory for the returned name must be freed by caller upon
885772Sas200622  * successful return.
895331Samw  */
905772Sas200622 uint32_t
916432Sas200622 mlsvc_lookup_sid(smb_sid_t *sid, char **name)
925331Samw {
938670SJose.Borrego@Sun.COM 	smb_account_t ainfo;
945772Sas200622 	uint32_t status;
955772Sas200622 	int namelen;
965331Samw 
978670SJose.Borrego@Sun.COM 	if ((status = lsa_lookup_sid(sid, &ainfo)) == NT_STATUS_SUCCESS) {
988670SJose.Borrego@Sun.COM 		namelen = strlen(ainfo.a_domain) + strlen(ainfo.a_name) + 2;
998670SJose.Borrego@Sun.COM 		if ((*name = malloc(namelen)) != NULL)
1008670SJose.Borrego@Sun.COM 			(void) snprintf(*name, namelen, "%s\\%s",
1018670SJose.Borrego@Sun.COM 			    ainfo.a_domain, ainfo.a_name);
1028670SJose.Borrego@Sun.COM 		else
1038670SJose.Borrego@Sun.COM 			status = NT_STATUS_NO_MEMORY;
1045331Samw 
1058670SJose.Borrego@Sun.COM 		smb_account_free(&ainfo);
1065331Samw 	}
1075331Samw 
1085772Sas200622 	return (status);
1095331Samw }
1105331Samw 
1116139Sjb150015 DWORD
1126139Sjb150015 mlsvc_netlogon(char *server, char *domain)
1136139Sjb150015 {
1146139Sjb150015 	mlsvc_handle_t netr_handle;
1156139Sjb150015 	DWORD status;
1166139Sjb150015 
1176139Sjb150015 	if (netr_open(server, domain, &netr_handle) == 0) {
1189021Samw@Sun.COM 		if ((status = netlogon_auth(server, &netr_handle,
1199021Samw@Sun.COM 		    NETR_FLG_INIT)) != NT_STATUS_SUCCESS)
1209021Samw@Sun.COM 			syslog(LOG_NOTICE, "Failed to establish NETLOGON "
1219021Samw@Sun.COM 			    "credential chain");
1226139Sjb150015 		(void) netr_close(&netr_handle);
1236139Sjb150015 	} else {
1246139Sjb150015 		status = NT_STATUS_OPEN_FAILED;
1256139Sjb150015 	}
1266139Sjb150015 
1276139Sjb150015 	return (status);
1286139Sjb150015 }
1296139Sjb150015 
1305331Samw /*
131*9343SAfshin.Ardakani@Sun.COM  * Joins the specified domain by creating a machine account on
132*9343SAfshin.Ardakani@Sun.COM  * the selected domain controller.
133*9343SAfshin.Ardakani@Sun.COM  *
134*9343SAfshin.Ardakani@Sun.COM  * Disconnect any existing connection with the domain controller.
135*9343SAfshin.Ardakani@Sun.COM  * This will ensure that no stale connection will be used, it will
136*9343SAfshin.Ardakani@Sun.COM  * also pickup any configuration changes in either side by trying
137*9343SAfshin.Ardakani@Sun.COM  * to establish a new connection.
1385331Samw  *
1395331Samw  * Returns NT status codes.
1405331Samw  */
1415331Samw DWORD
1428334SJose.Borrego@Sun.COM mlsvc_join(smb_domain_t *dinfo, char *user, char *plain_text)
1435331Samw {
1445331Samw 	smb_auth_info_t auth;
1455331Samw 	int erc;
1465331Samw 	DWORD status;
1478334SJose.Borrego@Sun.COM 	char machine_passwd[NETR_MACHINE_ACCT_PASSWD_MAX];
1489021Samw@Sun.COM 	smb_adjoin_status_t err;
1495331Samw 
1505331Samw 	machine_passwd[0] = '\0';
1515331Samw 
1528334SJose.Borrego@Sun.COM 	(void) utf8_strupr(dinfo->d_nbdomain);
1535331Samw 
154*9343SAfshin.Ardakani@Sun.COM 	mlsvc_disconnect(dinfo->d_dc);
155*9343SAfshin.Ardakani@Sun.COM 
1568334SJose.Borrego@Sun.COM 	erc = mlsvc_logon(dinfo->d_dc, dinfo->d_nbdomain, user);
1575331Samw 
1585331Samw 	if (erc == AUTH_USER_GRANT) {
1595772Sas200622 		if (mlsvc_ntjoin_support == B_FALSE) {
1605331Samw 
1619021Samw@Sun.COM 			if ((err = smb_ads_join(dinfo->d_fqdomain, user,
1629021Samw@Sun.COM 			    plain_text, machine_passwd,
1639021Samw@Sun.COM 			    sizeof (machine_passwd))) == SMB_ADJOIN_SUCCESS) {
1645331Samw 				status = NT_STATUS_SUCCESS;
1659021Samw@Sun.COM 			} else {
1669021Samw@Sun.COM 				smb_ads_join_errmsg(err);
1675331Samw 				status = NT_STATUS_UNSUCCESSFUL;
1689021Samw@Sun.COM 			}
1695331Samw 		} else {
1708334SJose.Borrego@Sun.COM 			if (mlsvc_user_getauth(dinfo->d_dc, user, &auth)
1715331Samw 			    != 0) {
1725331Samw 				status = NT_STATUS_INVALID_PARAMETER;
1735331Samw 				return (status);
1745331Samw 			}
1755331Samw 
1768334SJose.Borrego@Sun.COM 			status = sam_create_trust_account(dinfo->d_dc,
1778334SJose.Borrego@Sun.COM 			    dinfo->d_nbdomain, &auth);
1785331Samw 			if (status == NT_STATUS_SUCCESS) {
1797961SNatalie.Li@Sun.COM 				(void) smb_getnetbiosname(machine_passwd,
1807961SNatalie.Li@Sun.COM 				    sizeof (machine_passwd));
1815331Samw 				(void) utf8_strlwr(machine_passwd);
1825331Samw 			}
1835331Samw 		}
1845331Samw 
1855331Samw 		if (status == NT_STATUS_SUCCESS) {
1868334SJose.Borrego@Sun.COM 			erc = smb_setdomainprops(NULL, dinfo->d_dc,
1875772Sas200622 			    machine_passwd);
1889021Samw@Sun.COM 			if (erc != 0) {
1899021Samw@Sun.COM 				syslog(LOG_NOTICE, "Failed to update CIFS "
1909021Samw@Sun.COM 				    "configuration");
1915331Samw 				return (NT_STATUS_UNSUCCESSFUL);
1929021Samw@Sun.COM 			}
1935331Samw 
1948334SJose.Borrego@Sun.COM 			status = mlsvc_netlogon(dinfo->d_dc, dinfo->d_nbdomain);
1955331Samw 		}
1965331Samw 	} else {
1975331Samw 		status = NT_STATUS_LOGON_FAILURE;
1985331Samw 	}
1995331Samw 
2005331Samw 	return (status);
2015331Samw }
202