17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*9a70fc3bSMark J. Nelson  * Common Development and Distribution License (the "License").
6*9a70fc3bSMark J. Nelson  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
227c478bd9Sstevel@tonic-gate  * Copyright (c) 1999 by Sun Microsystems, Inc.
237c478bd9Sstevel@tonic-gate  * All rights reserved.
247c478bd9Sstevel@tonic-gate  *
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate //  CSrvMsg.java:     Message class for SLP service reply.
287c478bd9Sstevel@tonic-gate //  Author:           James Kempf
297c478bd9Sstevel@tonic-gate //  Created On:       Thu Oct  9 15:09:32 1997
307c478bd9Sstevel@tonic-gate //  Last Modified By: James Kempf
317c478bd9Sstevel@tonic-gate //  Last Modified On: Tue Oct 27 11:01:45 1998
327c478bd9Sstevel@tonic-gate //  Update Count:     127
337c478bd9Sstevel@tonic-gate //
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate package com.sun.slp;
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate import java.util.*;
387c478bd9Sstevel@tonic-gate import java.io.*;
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate /**
417c478bd9Sstevel@tonic-gate  * The CSrvMsg class models the SLP client side service message.
427c478bd9Sstevel@tonic-gate  *
437c478bd9Sstevel@tonic-gate  * @author James Kempf
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate class CSrvMsg extends SrvLocMsgImpl {
477c478bd9Sstevel@tonic-gate 
487c478bd9Sstevel@tonic-gate     Vector serviceURLs = new Vector();		// vector of ServiceURL objects
497c478bd9Sstevel@tonic-gate     Hashtable  URLSignatures = new Hashtable();	// authentication block lists.
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate     // Only used for testing.
527c478bd9Sstevel@tonic-gate 
CSrvMsg()537c478bd9Sstevel@tonic-gate     protected CSrvMsg() { }
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate     // Construct a CSrvMsg from the byte input stream. This is a SrvRply.
567c478bd9Sstevel@tonic-gate     //  error code is already parsed.
577c478bd9Sstevel@tonic-gate 
CSrvMsg(SLPHeaderV2 hdr, DataInputStream dis)587c478bd9Sstevel@tonic-gate     CSrvMsg(SLPHeaderV2 hdr, DataInputStream dis)
597c478bd9Sstevel@tonic-gate 	throws ServiceLocationException, IOException {
607c478bd9Sstevel@tonic-gate 	super(hdr, SrvLocHeader.SrvRply);
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate 	// Don't parse the rest if there's an error.
637c478bd9Sstevel@tonic-gate 
647c478bd9Sstevel@tonic-gate 	if (hdr.errCode != ServiceLocationException.OK) {
657c478bd9Sstevel@tonic-gate 	    return;
667c478bd9Sstevel@tonic-gate 	}
677c478bd9Sstevel@tonic-gate 
687c478bd9Sstevel@tonic-gate 	// Note that we ignore the overflow flag here, because the spec
697c478bd9Sstevel@tonic-gate 	//  disallows partial URL entries, and so we should be able
707c478bd9Sstevel@tonic-gate 	//  to parse in the rest of the message even if there is overflow.
717c478bd9Sstevel@tonic-gate 	//  This is different from other messages.
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate 	parseServiceURLsIn(hdr, dis);
747c478bd9Sstevel@tonic-gate     }
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate     // Parse in a vector of service URLs including lifetime.
777c478bd9Sstevel@tonic-gate 
parseServiceURLsIn(SLPHeaderV2 hdr, DataInputStream dis)787c478bd9Sstevel@tonic-gate     protected void parseServiceURLsIn(SLPHeaderV2 hdr, DataInputStream dis)
797c478bd9Sstevel@tonic-gate 	throws ServiceLocationException, IOException {
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate 	// Get the number of service URL's.
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate 	int i, n = hdr.getInt(dis);
847c478bd9Sstevel@tonic-gate 
857c478bd9Sstevel@tonic-gate 	// Get the service URL's including lifetime.
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate 	for (i = 0; i < n; i++) {
887c478bd9Sstevel@tonic-gate 
897c478bd9Sstevel@tonic-gate 	    ServiceURL surl =
907c478bd9Sstevel@tonic-gate 		hdr.parseServiceURLIn(dis, URLSignatures,
917c478bd9Sstevel@tonic-gate 				      ServiceLocationException.PARSE_ERROR);
927c478bd9Sstevel@tonic-gate 
937c478bd9Sstevel@tonic-gate 	    serviceURLs.addElement(surl);
947c478bd9Sstevel@tonic-gate 
957c478bd9Sstevel@tonic-gate 	    // Verify the signature if any. Doing it here saves muss and
967c478bd9Sstevel@tonic-gate 	    //  fuss in the upper layers.
977c478bd9Sstevel@tonic-gate 
987c478bd9Sstevel@tonic-gate 	    Hashtable auth = (Hashtable) URLSignatures.get(surl);
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 	    if (auth != null) {
1017c478bd9Sstevel@tonic-gate 		AuthBlock.verifyAll(auth);
1027c478bd9Sstevel@tonic-gate 	    }
1037c478bd9Sstevel@tonic-gate 	}
1047c478bd9Sstevel@tonic-gate 
1057c478bd9Sstevel@tonic-gate 	// Set the header number of replies received.
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate 	hdr.iNumReplies = serviceURLs.size();
1087c478bd9Sstevel@tonic-gate 
1097c478bd9Sstevel@tonic-gate     }
1107c478bd9Sstevel@tonic-gate 
1117c478bd9Sstevel@tonic-gate     // Construct a CSrvMsg from the arguments.
1127c478bd9Sstevel@tonic-gate 
CSrvMsg(Locale locale, ServiceType serviceType, Vector scopes, String query)1137c478bd9Sstevel@tonic-gate     CSrvMsg(Locale locale,
1147c478bd9Sstevel@tonic-gate 	    ServiceType serviceType,
1157c478bd9Sstevel@tonic-gate 	    Vector scopes,
1167c478bd9Sstevel@tonic-gate 	    String query)
1177c478bd9Sstevel@tonic-gate 	throws ServiceLocationException {
1187c478bd9Sstevel@tonic-gate 
1197c478bd9Sstevel@tonic-gate 	this.initialize(locale, serviceType, scopes, query);
1207c478bd9Sstevel@tonic-gate 
1217c478bd9Sstevel@tonic-gate     }
1227c478bd9Sstevel@tonic-gate 
1237c478bd9Sstevel@tonic-gate     // Initialize as a SLPv2 SrvRqst.
1247c478bd9Sstevel@tonic-gate 
1257c478bd9Sstevel@tonic-gate     protected void
initialize(Locale locale, ServiceType serviceType, Vector scopes, String query)1267c478bd9Sstevel@tonic-gate 	initialize(Locale locale,
1277c478bd9Sstevel@tonic-gate 		   ServiceType serviceType,
1287c478bd9Sstevel@tonic-gate 		   Vector scopes,
1297c478bd9Sstevel@tonic-gate 		   String query)
1307c478bd9Sstevel@tonic-gate 	throws ServiceLocationException {
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate 	SLPHeaderV2 hdr = new SLPHeaderV2(SrvLocHeader.SrvReq, false, locale);
1337c478bd9Sstevel@tonic-gate 	this.hdr = hdr;
1347c478bd9Sstevel@tonic-gate 	hdr.scopes = (Vector)scopes.clone();
1357c478bd9Sstevel@tonic-gate 
1367c478bd9Sstevel@tonic-gate 	// Set up for previous responders.
1377c478bd9Sstevel@tonic-gate 
1387c478bd9Sstevel@tonic-gate 	hdr.previousResponders = new Vector();
1397c478bd9Sstevel@tonic-gate 
1407c478bd9Sstevel@tonic-gate 	// Create the payload for the message.
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate 	ByteArrayOutputStream baos = new ByteArrayOutputStream();
1437c478bd9Sstevel@tonic-gate 
1447c478bd9Sstevel@tonic-gate 	// Escape scope strings.
1457c478bd9Sstevel@tonic-gate 
1467c478bd9Sstevel@tonic-gate 	hdr.escapeScopeStrings(scopes);
1477c478bd9Sstevel@tonic-gate 
1487c478bd9Sstevel@tonic-gate 	// Retrieve the configured SPI, if any
1497c478bd9Sstevel@tonic-gate 	String spi = "";
1507c478bd9Sstevel@tonic-gate 	if (SLPConfig.getSLPConfig().getHasSecurity()) {
1517c478bd9Sstevel@tonic-gate 	    LinkedList spiList = AuthBlock.getSPIList("sun.net.slp.SPIs");
1527c478bd9Sstevel@tonic-gate 	    if (spiList != null && !spiList.isEmpty()) {
1537c478bd9Sstevel@tonic-gate 		// There can be only one configured SPI for UAs
1547c478bd9Sstevel@tonic-gate 		spi = (String) spiList.getFirst();
1557c478bd9Sstevel@tonic-gate 	    }
1567c478bd9Sstevel@tonic-gate 	}
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate 	// Write out the service type.
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate 	hdr.putString(serviceType.toString(), baos);
1617c478bd9Sstevel@tonic-gate 
1627c478bd9Sstevel@tonic-gate 	// Write out scopes.
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate 	hdr.parseCommaSeparatedListOut(scopes, baos);
1657c478bd9Sstevel@tonic-gate 
1667c478bd9Sstevel@tonic-gate 	// Write out query.
1677c478bd9Sstevel@tonic-gate 
1687c478bd9Sstevel@tonic-gate 	hdr.putString(query, baos);
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate 	// Write out SPI
1717c478bd9Sstevel@tonic-gate 
1727c478bd9Sstevel@tonic-gate 	hdr.putString(spi, baos);
1737c478bd9Sstevel@tonic-gate 
1747c478bd9Sstevel@tonic-gate 	hdr.payload = baos.toByteArray();
1757c478bd9Sstevel@tonic-gate     }
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate     //
1787c478bd9Sstevel@tonic-gate     // Property accessors
1797c478bd9Sstevel@tonic-gate     //
1807c478bd9Sstevel@tonic-gate 
getURLSignature(ServiceURL URL)1817c478bd9Sstevel@tonic-gate     final Hashtable getURLSignature(ServiceURL URL) {
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate 	return (Hashtable)(URLSignatures.get(URL));
1847c478bd9Sstevel@tonic-gate     }
1857c478bd9Sstevel@tonic-gate 
setURLSignature(ServiceURL URL, Hashtable sig)1867c478bd9Sstevel@tonic-gate     final void setURLSignature(ServiceURL URL, Hashtable sig)
1877c478bd9Sstevel@tonic-gate 	throws IllegalArgumentException {
1887c478bd9Sstevel@tonic-gate 
1897c478bd9Sstevel@tonic-gate 	if (sig == null) {
1907c478bd9Sstevel@tonic-gate 	    URLSignatures.remove(URL);
1917c478bd9Sstevel@tonic-gate 	} else {
1927c478bd9Sstevel@tonic-gate 	    URLSignatures.put(URL, sig);
1937c478bd9Sstevel@tonic-gate 	}
1947c478bd9Sstevel@tonic-gate     }
1957c478bd9Sstevel@tonic-gate 
1967c478bd9Sstevel@tonic-gate }
197