2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
26 * Copyright (c) 1998 by Apple Computer, Inc.
27 * Portions Copyright (c) 1988 by Sun Microsystems, Inc.
28 * Portions Copyright (c) 1988 The Regents of the University of California.
29 * All rights reserved.
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
34 * 1. Redistributions of source code must retain the above copyright
35 * notice, this list of conditions and the following disclaimer.
36 * 2. Redistributions in binary form must reproduce the above copyright
37 * notice, this list of conditions and the following disclaimer in the
38 * documentation and/or other materials provided with the distribution.
39 * 3. All advertising materials mentioning features or use of this software
40 * must display the following acknowledgement:
41 * This product includes software developed by the University of
42 * California, Berkeley and its contributors.
43 * 4. Neither the name of the University nor the names of its contributors
44 * may be used to endorse or promote products derived from this software
45 * without specific prior written permission.
47 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65 #include <netinet/in.h>
66 #include <rpc/types.h>
69 #include <rpcsvc/yp_prot.h>
70 #include <rpcsvc/ypclnt.h>
71 #include <rpcsvc/yppasswd.h>
73 #include <sys/socket.h>
77 #include <DirectoryService/DirServices.h>
78 #include <DirectoryService/DirServicesConst.h>
79 #include <DirectoryService/DirServicesTypes.h>
80 #include <DirectoryService/DirServicesUtils.h>
82 // password server can store 511 characters + a terminator.
83 #define kMaxPassword 512
85 #define SaySorryAndBail() {status = -1; break;}
87 //-------------------------------------------------------------------------------------
89 //-------------------------------------------------------------------------------------
91 int ds_check_passwd(char *uname
, char *domain
)
94 tDirReference dsRef
= 0;
95 tDataBuffer
*tDataBuff
= NULL
;
96 tDirNodeReference nodeRef
= 0;
97 long status
= eDSNoErr
;
98 tContextData context
= NULL
;
99 unsigned long nodeCount
= 0;
100 unsigned long attrIndex
= 0;
101 tDataList
*nodeName
= NULL
;
102 tAttributeEntryPtr pAttrEntry
= NULL
;
103 tDataList
*pRecName
= NULL
;
104 tDataList
*pRecType
= NULL
;
105 tDataList
*pAttrType
= NULL
;
106 unsigned long recCount
= 0;
107 tRecordEntry
*pRecEntry
= NULL
;
108 tAttributeListRef attrListRef
= 0;
109 char *pUserLocation
= NULL
;
110 char *pUserName
= NULL
;
111 tAttributeValueListRef valueRef
= 0;
112 tAttributeValueEntry
*pValueEntry
= NULL
;
113 tDataList
*pUserNode
= NULL
;
114 tDirNodeReference userNodeRef
= 0;
115 tDataBuffer
*pStepBuff
= NULL
;
116 tDataNode
*pAuthType
= NULL
;
117 unsigned long uiCurr
= 0;
118 unsigned long uiLen
= 0;
125 printf("Checking password for %s.\n", uname
);
126 p
= getpass("Password:");
130 status
= dsOpenDirService( &dsRef
);
131 if ( status
!= eDSNoErr
)
134 tDataBuff
= dsDataBufferAllocate( dsRef
, 4096 );
135 if (tDataBuff
== NULL
)
138 if ( domain
!= NULL
)
140 nodeName
= dsBuildFromPath( dsRef
, domain
, "/" );
141 if ( nodeName
== NULL
) break;
144 status
= dsFindDirNodes( dsRef
, tDataBuff
, nodeName
, eDSiExact
, &nodeCount
, &context
);
148 // find on search node
149 status
= dsFindDirNodes( dsRef
, tDataBuff
, NULL
, eDSSearchNodeName
, &nodeCount
, &context
);
152 if ( status
!= eDSNoErr
)
158 status
= dsGetDirNodeName( dsRef
, tDataBuff
, 1, &nodeName
);
159 if (status
!= eDSNoErr
)
162 status
= dsOpenDirNode( dsRef
, nodeName
, &nodeRef
);
163 dsDataListDeallocate( dsRef
, nodeName
);
166 if (status
!= eDSNoErr
)
169 pRecName
= dsBuildListFromStrings( dsRef
, uname
, NULL
);
170 pRecType
= dsBuildListFromStrings( dsRef
, kDSStdRecordTypeUsers
, NULL
);
171 pAttrType
= dsBuildListFromStrings( dsRef
, kDSNAttrMetaNodeLocation
, kDSNAttrRecordName
, NULL
);
174 status
= dsGetRecordList( nodeRef
, tDataBuff
, pRecName
, eDSExact
, pRecType
,
175 pAttrType
, 0, &recCount
, &context
);
176 if ( status
!= eDSNoErr
|| recCount
== 0 )
179 status
= dsGetRecordEntry( nodeRef
, tDataBuff
, 1, &attrListRef
, &pRecEntry
);
180 if ( status
!= eDSNoErr
)
183 for ( attrIndex
= 1; (attrIndex
<= pRecEntry
->fRecordAttributeCount
) && (status
== eDSNoErr
); attrIndex
++ )
185 status
= dsGetAttributeEntry( nodeRef
, tDataBuff
, attrListRef
, attrIndex
, &valueRef
, &pAttrEntry
);
186 if ( status
== eDSNoErr
&& pAttrEntry
!= NULL
)
188 if ( strcmp( pAttrEntry
->fAttributeSignature
.fBufferData
, kDSNAttrMetaNodeLocation
) == 0 )
190 status
= dsGetAttributeValue( nodeRef
, tDataBuff
, 1, valueRef
, &pValueEntry
);
191 if ( status
== eDSNoErr
&& pValueEntry
!= NULL
)
193 pUserLocation
= (char *) calloc( pValueEntry
->fAttributeValueData
.fBufferLength
+ 1, sizeof(char) );
194 memcpy( pUserLocation
, pValueEntry
->fAttributeValueData
.fBufferData
, pValueEntry
->fAttributeValueData
.fBufferLength
);
198 if ( strcmp( pAttrEntry
->fAttributeSignature
.fBufferData
, kDSNAttrRecordName
) == 0 )
200 status
= dsGetAttributeValue( nodeRef
, tDataBuff
, 1, valueRef
, &pValueEntry
);
201 if ( status
== eDSNoErr
&& pValueEntry
!= NULL
)
203 pUserName
= (char *) calloc( pValueEntry
->fAttributeValueData
.fBufferLength
+ 1, sizeof(char) );
204 memcpy( pUserName
, pValueEntry
->fAttributeValueData
.fBufferData
, pValueEntry
->fAttributeValueData
.fBufferLength
);
208 if ( pValueEntry
!= NULL
)
209 dsDeallocAttributeValueEntry( dsRef
, pValueEntry
);
212 dsDeallocAttributeEntry( dsRef
, pAttrEntry
);
214 dsCloseAttributeValueList( valueRef
);
219 pUserNode
= dsBuildFromPath( dsRef
, pUserLocation
, "/" );
220 status
= dsOpenDirNode( dsRef
, pUserNode
, &userNodeRef
);
221 if ( status
!= eDSNoErr
)
224 pStepBuff
= dsDataBufferAllocate( dsRef
, 128 );
226 pAuthType
= dsDataNodeAllocateString( dsRef
, kDSStdAuthNodeNativeClearTextOK
);
230 uiLen
= strlen( pUserName
);
231 memcpy( &(tDataBuff
->fBufferData
[ uiCurr
]), &uiLen
, sizeof( unsigned long ) );
232 uiCurr
+= sizeof( unsigned long );
233 memcpy( &(tDataBuff
->fBufferData
[ uiCurr
]), pUserName
, uiLen
);
238 memcpy( &(tDataBuff
->fBufferData
[ uiCurr
]), &uiLen
, sizeof( unsigned long ) );
239 uiCurr
+= sizeof( unsigned long );
240 memcpy( &(tDataBuff
->fBufferData
[ uiCurr
]), p
, uiLen
);
243 tDataBuff
->fBufferLength
= uiCurr
;
245 status
= dsDoDirNodeAuth( userNodeRef
, pAuthType
, 1, tDataBuff
, pStepBuff
, NULL
);
251 if (tDataBuff
!= NULL
) {
252 memset(tDataBuff
, 0, tDataBuff
->fBufferSize
);
253 dsDataBufferDeAllocate( dsRef
, tDataBuff
);
257 if (pStepBuff
!= NULL
) {
258 dsDataBufferDeAllocate( dsRef
, pStepBuff
);
261 if (pUserLocation
!= NULL
) {
263 pUserLocation
= NULL
;
265 if (pRecName
!= NULL
) {
266 dsDataListDeallocate( dsRef
, pRecName
);
270 if (pRecType
!= NULL
) {
271 dsDataListDeallocate( dsRef
, pRecType
);
275 if (pAttrType
!= NULL
) {
276 dsDataListDeallocate( dsRef
, pAttrType
);
281 dsCloseDirNode(nodeRef
);
285 dsCloseDirService(dsRef
);
289 if ( status
!= eDSNoErr
)
292 fprintf(stderr
, "Sorry\n");