Search in sources :

Example 36 with Request

use of javax.sip.message.Request in project XobotOS by xamarin.

the class DialogFilter method processResponse.

/*
     * (non-Javadoc)
     * 
     * @see gov.nist.javax.sip.stack.ServerResponseInterface#processResponse(gov.nist.javax.sip.message.SIPResponse,
     *      gov.nist.javax.sip.stack.MessageChannel)
     */
public void processResponse(SIPResponse sipResponse, MessageChannel incomingChannel) {
    String dialogID = sipResponse.getDialogId(false);
    SIPDialog sipDialog = this.sipStack.getDialog(dialogID);
    String method = sipResponse.getCSeq().getMethod();
    if (sipStack.isLoggingEnabled()) {
        sipStack.getStackLogger().logDebug("PROCESSING INCOMING RESPONSE: " + sipResponse.encodeMessage());
    }
    if (sipStack.checkBranchId() && !Utils.getInstance().responseBelongsToUs(sipResponse)) {
        if (sipStack.isLoggingEnabled()) {
            sipStack.getStackLogger().logError("Detected stray response -- dropping");
        }
        return;
    }
    if (listeningPoint == null) {
        if (sipStack.isLoggingEnabled())
            sipStack.getStackLogger().logDebug("Dropping message: No listening point" + " registered!");
        return;
    }
    SipProviderImpl sipProvider = listeningPoint.getProvider();
    if (sipProvider == null) {
        if (sipStack.isLoggingEnabled()) {
            sipStack.getStackLogger().logDebug("Dropping message:  no provider");
        }
        return;
    }
    if (sipProvider.getSipListener() == null) {
        if (sipStack.isLoggingEnabled()) {
            sipStack.getStackLogger().logDebug("Dropping message:  no sipListener registered!");
        }
        return;
    }
    SIPClientTransaction transaction = (SIPClientTransaction) this.transactionChannel;
    // 3PCC).
    if (sipDialog == null && transaction != null) {
        sipDialog = transaction.getDialog(dialogID);
        if (sipDialog != null && sipDialog.getState() == DialogState.TERMINATED)
            sipDialog = null;
    }
    if (sipStack.isLoggingEnabled())
        sipStack.getStackLogger().logDebug("Transaction = " + transaction + " sipDialog = " + sipDialog);
    if (this.transactionChannel != null) {
        String originalFrom = ((SIPRequest) this.transactionChannel.getRequest()).getFromTag();
        if (originalFrom == null ^ sipResponse.getFrom().getTag() == null) {
            if (sipStack.isLoggingEnabled())
                sipStack.getStackLogger().logDebug("From tag mismatch -- dropping response");
            return;
        }
        if (originalFrom != null && !originalFrom.equalsIgnoreCase(sipResponse.getFrom().getTag())) {
            if (sipStack.isLoggingEnabled())
                sipStack.getStackLogger().logDebug("From tag mismatch -- dropping response");
            return;
        }
    }
    if (sipStack.isDialogCreated(method) && sipResponse.getStatusCode() != 100 && sipResponse.getFrom().getTag() != null && sipResponse.getTo().getTag() != null && sipDialog == null) {
        if (sipProvider.isAutomaticDialogSupportEnabled()) {
            if (this.transactionChannel != null) {
                if (sipDialog == null) {
                    // There could be an existing dialog for this response.
                    sipDialog = sipStack.createDialog((SIPClientTransaction) this.transactionChannel, sipResponse);
                    this.transactionChannel.setDialog(sipDialog, sipResponse.getDialogId(false));
                }
            } else {
                sipDialog = this.sipStack.createDialog(sipProvider, sipResponse);
            }
        }
    } else {
        // Have a dialog but could not find transaction.
        if (sipDialog != null && transaction == null && sipDialog.getState() != DialogState.TERMINATED) {
            if (sipResponse.getStatusCode() / 100 != 2) {
                if (sipStack.isLoggingEnabled())
                    sipStack.getStackLogger().logDebug("status code != 200 ; statusCode = " + sipResponse.getStatusCode());
            } else if (sipDialog.getState() == DialogState.TERMINATED) {
                if (sipStack.isLoggingEnabled()) {
                    sipStack.getStackLogger().logDebug("Dialog is terminated -- dropping response!");
                }
                // It could be late arriving.
                if (sipResponse.getStatusCode() / 100 == 2 && sipResponse.getCSeq().getMethod().equals(Request.INVITE)) {
                    try {
                        Request ackRequest = sipDialog.createAck(sipResponse.getCSeq().getSeqNumber());
                        sipDialog.sendAck(ackRequest);
                    } catch (Exception ex) {
                        sipStack.getStackLogger().logError("Error creating ack", ex);
                    }
                }
                return;
            } else {
                boolean ackAlreadySent = false;
                if (sipDialog.isAckSeen() && sipDialog.getLastAckSent() != null) {
                    if (sipDialog.getLastAckSent().getCSeq().getSeqNumber() == sipResponse.getCSeq().getSeqNumber() && sipResponse.getDialogId(false).equals(sipDialog.getLastAckSent().getDialogId(false))) {
                        // the last ack sent corresponded to this 200
                        ackAlreadySent = true;
                    }
                }
                // 200 retransmission for the final response.
                if (ackAlreadySent && sipResponse.getCSeq().getMethod().equals(sipDialog.getMethod())) {
                    try {
                        // dont pass up the null transaction
                        if (sipStack.isLoggingEnabled())
                            sipStack.getStackLogger().logDebug("resending ACK");
                        sipDialog.resendAck();
                        return;
                    } catch (SipException ex) {
                    // What to do here ?? kill the dialog?
                    }
                }
            }
        }
    // Pass the response up to the application layer to handle
    // statelessly.
    }
    if (sipStack.isLoggingEnabled())
        sipStack.getStackLogger().logDebug("sending response to TU for processing ");
    if (sipDialog != null && sipResponse.getStatusCode() != 100 && sipResponse.getTo().getTag() != null) {
        sipDialog.setLastResponse(transaction, sipResponse);
    }
    ResponseEventExt responseEvent = new ResponseEventExt(sipProvider, (ClientTransactionExt) transaction, sipDialog, (Response) sipResponse);
    if (sipResponse.getCSeq().getMethod().equals(Request.INVITE)) {
        ClientTransactionExt originalTx = this.sipStack.getForkedTransaction(sipResponse.getTransactionId());
        responseEvent.setOriginalTransaction(originalTx);
    }
    sipProvider.handleEvent(responseEvent, transaction);
}
Also used : SIPClientTransaction(gov.nist.javax.sip.stack.SIPClientTransaction) SIPDialog(gov.nist.javax.sip.stack.SIPDialog) Request(javax.sip.message.Request) SIPRequest(gov.nist.javax.sip.message.SIPRequest) SipException(javax.sip.SipException) SIPRequest(gov.nist.javax.sip.message.SIPRequest) InvalidArgumentException(javax.sip.InvalidArgumentException) SipException(javax.sip.SipException) IOException(java.io.IOException) ObjectInUseException(javax.sip.ObjectInUseException)

Example 37 with Request

use of javax.sip.message.Request in project XobotOS by xamarin.

the class AuthenticationHelperImpl method handleChallenge.

/*
     * (non-Javadoc)
     *
     * @see gov.nist.javax.sip.clientauthutils.AuthenticationHelper#handleChallenge(javax.sip.message.Response,
     *      javax.sip.ClientTransaction, javax.sip.SipProvider)
     */
public ClientTransaction handleChallenge(Response challenge, ClientTransaction challengedTransaction, SipProvider transactionCreator, int cacheTime) throws SipException, NullPointerException {
    try {
        if (sipStack.isLoggingEnabled()) {
            sipStack.getStackLogger().logDebug("handleChallenge: " + challenge);
        }
        SIPRequest challengedRequest = ((SIPRequest) challengedTransaction.getRequest());
        Request reoriginatedRequest = null;
        /*
             * If the challenged request is part of a Dialog and the
             * Dialog is confirmed the re-originated request should be
             * generated as an in-Dialog request.
             */
        if (challengedRequest.getToTag() != null || challengedTransaction.getDialog() == null || challengedTransaction.getDialog().getState() != DialogState.CONFIRMED) {
            reoriginatedRequest = (Request) challengedRequest.clone();
        } else {
            /*
                 * Re-originate the request by consulting the dialog. In particular
                 * the route set could change between the original request and the 
                 * in-dialog challenge.
                 */
            reoriginatedRequest = challengedTransaction.getDialog().createRequest(challengedRequest.getMethod());
            Iterator<String> headerNames = challengedRequest.getHeaderNames();
            while (headerNames.hasNext()) {
                String headerName = headerNames.next();
                if (reoriginatedRequest.getHeader(headerName) != null) {
                    ListIterator<Header> iterator = reoriginatedRequest.getHeaders(headerName);
                    while (iterator.hasNext()) {
                        reoriginatedRequest.addHeader(iterator.next());
                    }
                }
            }
        }
        // remove the branch id so that we could use the request in a new
        // transaction
        removeBranchID(reoriginatedRequest);
        if (challenge == null || reoriginatedRequest == null) {
            throw new NullPointerException("A null argument was passed to handle challenge.");
        }
        ListIterator authHeaders = null;
        if (challenge.getStatusCode() == Response.UNAUTHORIZED) {
            authHeaders = challenge.getHeaders(WWWAuthenticateHeader.NAME);
        } else if (challenge.getStatusCode() == Response.PROXY_AUTHENTICATION_REQUIRED) {
            authHeaders = challenge.getHeaders(ProxyAuthenticateHeader.NAME);
        } else {
            throw new IllegalArgumentException("Unexpected status code ");
        }
        if (authHeaders == null) {
            throw new IllegalArgumentException("Could not find WWWAuthenticate or ProxyAuthenticate headers");
        }
        // Remove all authorization headers from the request (we'll re-add them
        // from cache)
        reoriginatedRequest.removeHeader(AuthorizationHeader.NAME);
        reoriginatedRequest.removeHeader(ProxyAuthorizationHeader.NAME);
        // rfc 3261 says that the cseq header should be augmented for the new
        // request. do it here so that the new dialog (created together with
        // the new client transaction) takes it into account.
        // Bug report - Fredrik Wickstrom
        CSeqHeader cSeq = (CSeqHeader) reoriginatedRequest.getHeader((CSeqHeader.NAME));
        try {
            cSeq.setSeqNumber(cSeq.getSeqNumber() + 1l);
        } catch (InvalidArgumentException ex) {
            throw new SipException("Invalid CSeq -- could not increment : " + cSeq.getSeqNumber());
        }
        /* Resolve this to the next hop based on the previous lookup. If we are not using
             * lose routing (RFC2543) then just attach hop as a maddr param.
             */
        if (challengedRequest.getRouteHeaders() == null) {
            Hop hop = ((SIPClientTransaction) challengedTransaction).getNextHop();
            SipURI sipUri = (SipURI) reoriginatedRequest.getRequestURI();
            // BEGIN android-added
            if (!hop.getHost().equalsIgnoreCase(sipUri.getHost()) && !hop.equals(sipStack.getRouter(challengedRequest).getOutboundProxy()))
                // END android-added
                sipUri.setMAddrParam(hop.getHost());
            if (hop.getPort() != -1)
                sipUri.setPort(hop.getPort());
        }
        ClientTransaction retryTran = transactionCreator.getNewClientTransaction(reoriginatedRequest);
        WWWAuthenticateHeader authHeader = null;
        SipURI requestUri = (SipURI) challengedTransaction.getRequest().getRequestURI();
        while (authHeaders.hasNext()) {
            authHeader = (WWWAuthenticateHeader) authHeaders.next();
            String realm = authHeader.getRealm();
            AuthorizationHeader authorization = null;
            String sipDomain;
            if (this.accountManager instanceof SecureAccountManager) {
                UserCredentialHash credHash = ((SecureAccountManager) this.accountManager).getCredentialHash(challengedTransaction, realm);
                URI uri = reoriginatedRequest.getRequestURI();
                sipDomain = credHash.getSipDomain();
                authorization = this.getAuthorization(reoriginatedRequest.getMethod(), uri.toString(), (reoriginatedRequest.getContent() == null) ? "" : new String(reoriginatedRequest.getRawContent()), authHeader, credHash);
            } else {
                UserCredentials userCreds = ((AccountManager) this.accountManager).getCredentials(challengedTransaction, realm);
                sipDomain = userCreds.getSipDomain();
                if (userCreds == null)
                    throw new SipException("Cannot find user creds for the given user name and realm");
                // we haven't yet authenticated this realm since we were
                // started.
                authorization = this.getAuthorization(reoriginatedRequest.getMethod(), reoriginatedRequest.getRequestURI().toString(), (reoriginatedRequest.getContent() == null) ? "" : new String(reoriginatedRequest.getRawContent()), authHeader, userCreds);
            }
            if (sipStack.isLoggingEnabled())
                sipStack.getStackLogger().logDebug("Created authorization header: " + authorization.toString());
            if (cacheTime != 0)
                cachedCredentials.cacheAuthorizationHeader(sipDomain, authorization, cacheTime);
            reoriginatedRequest.addHeader(authorization);
        }
        if (sipStack.isLoggingEnabled()) {
            sipStack.getStackLogger().logDebug("Returning authorization transaction." + retryTran);
        }
        return retryTran;
    } catch (SipException ex) {
        throw ex;
    } catch (Exception ex) {
        sipStack.getStackLogger().logError("Unexpected exception ", ex);
        throw new SipException("Unexpected exception ", ex);
    }
}
Also used : SIPClientTransaction(gov.nist.javax.sip.stack.SIPClientTransaction) SIPClientTransaction(gov.nist.javax.sip.stack.SIPClientTransaction) ClientTransaction(javax.sip.ClientTransaction) ProxyAuthorizationHeader(javax.sip.header.ProxyAuthorizationHeader) AuthorizationHeader(javax.sip.header.AuthorizationHeader) Request(javax.sip.message.Request) SIPRequest(gov.nist.javax.sip.message.SIPRequest) Hop(javax.sip.address.Hop) WWWAuthenticateHeader(javax.sip.header.WWWAuthenticateHeader) ListIterator(java.util.ListIterator) SipURI(javax.sip.address.SipURI) SIPRequest(gov.nist.javax.sip.message.SIPRequest) URI(javax.sip.address.URI) SipURI(javax.sip.address.SipURI) InvalidArgumentException(javax.sip.InvalidArgumentException) ParseException(java.text.ParseException) SipException(javax.sip.SipException) CSeqHeader(javax.sip.header.CSeqHeader) InvalidArgumentException(javax.sip.InvalidArgumentException) CSeqHeader(javax.sip.header.CSeqHeader) ProxyAuthorizationHeader(javax.sip.header.ProxyAuthorizationHeader) ProxyAuthenticateHeader(javax.sip.header.ProxyAuthenticateHeader) ViaHeader(javax.sip.header.ViaHeader) WWWAuthenticateHeader(javax.sip.header.WWWAuthenticateHeader) AuthorizationHeader(javax.sip.header.AuthorizationHeader) Header(javax.sip.header.Header) SipException(javax.sip.SipException)

Example 38 with Request

use of javax.sip.message.Request in project XobotOS by xamarin.

the class SipHelper method createRequest.

private Request createRequest(String requestType, SipProfile caller, SipProfile callee, String tag) throws ParseException, SipException {
    FromHeader fromHeader = createFromHeader(caller, tag);
    ToHeader toHeader = createToHeader(callee);
    SipURI requestURI = callee.getUri();
    List<ViaHeader> viaHeaders = createViaHeaders();
    CallIdHeader callIdHeader = createCallIdHeader();
    CSeqHeader cSeqHeader = createCSeqHeader(requestType);
    MaxForwardsHeader maxForwards = createMaxForwardsHeader();
    Request request = mMessageFactory.createRequest(requestURI, requestType, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards);
    request.addHeader(createContactHeader(caller));
    return request;
}
Also used : CSeqHeader(javax.sip.header.CSeqHeader) MaxForwardsHeader(javax.sip.header.MaxForwardsHeader) ViaHeader(javax.sip.header.ViaHeader) FromHeader(javax.sip.header.FromHeader) ToHeader(javax.sip.header.ToHeader) Request(javax.sip.message.Request) CallIdHeader(javax.sip.header.CallIdHeader) SipURI(javax.sip.address.SipURI)

Aggregations

Request (javax.sip.message.Request)38 ParseException (java.text.ParseException)21 SipException (javax.sip.SipException)21 InvalidArgumentException (javax.sip.InvalidArgumentException)13 ClientTransaction (javax.sip.ClientTransaction)9 SipURI (javax.sip.address.SipURI)9 Response (javax.sip.message.Response)9 NotFoundException (org.jivesoftware.util.NotFoundException)7 TooManyListenersException (java.util.TooManyListenersException)6 ServerTransaction (javax.sip.ServerTransaction)6 UserNotFoundException (org.jivesoftware.openfire.user.UserNotFoundException)6 Address (javax.sip.address.Address)5 CSeqHeader (javax.sip.header.CSeqHeader)5 ViaHeader (javax.sip.header.ViaHeader)5 SIPRequest (gov.nist.javax.sip.message.SIPRequest)4 FromHeader (javax.sip.header.FromHeader)4 SubscriptionStateHeader (javax.sip.header.SubscriptionStateHeader)4 ToHeader (javax.sip.header.ToHeader)4 SIPClientTransaction (gov.nist.javax.sip.stack.SIPClientTransaction)3 IOException (java.io.IOException)3