Home | History | Annotate | Download | only in pbap
      1 /*
      2  * Copyright (c) 2008-2009, Motorola, Inc.
      3  *
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions are met:
      8  *
      9  * - Redistributions of source code must retain the above copyright notice,
     10  * this list of conditions and the following disclaimer.
     11  *
     12  * - Redistributions in binary form must reproduce the above copyright notice,
     13  * this list of conditions and the following disclaimer in the documentation
     14  * and/or other materials provided with the distribution.
     15  *
     16  * - Neither the name of the Motorola, Inc. nor the names of its contributors
     17  * may be used to endorse or promote products derived from this software
     18  * without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
     24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  * POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.android.bluetooth.pbap;
     34 
     35 import android.util.Log;
     36 
     37 import javax.obex.Authenticator;
     38 import javax.obex.PasswordAuthentication;
     39 
     40 /**
     41  * BluetoothPbapAuthenticator is a used by BluetoothObexServer for obex
     42  * authentication procedure.
     43  */
     44 public class BluetoothPbapAuthenticator implements Authenticator {
     45     private static final String TAG = "PbapAuthenticator";
     46 
     47     private boolean mChallenged;
     48     private boolean mAuthCancelled;
     49     private String mSessionKey;
     50     private PbapStateMachine mPbapStateMachine;
     51 
     52     BluetoothPbapAuthenticator(final PbapStateMachine stateMachine) {
     53         mPbapStateMachine = stateMachine;
     54         mChallenged = false;
     55         mAuthCancelled = false;
     56         mSessionKey = null;
     57     }
     58 
     59     final synchronized void setChallenged(final boolean bool) {
     60         mChallenged = bool;
     61         notify();
     62     }
     63 
     64     final synchronized void setCancelled(final boolean bool) {
     65         mAuthCancelled = bool;
     66         notify();
     67     }
     68 
     69     final synchronized void setSessionKey(final String string) {
     70         mSessionKey = string;
     71     }
     72 
     73     private void waitUserConfirmation() {
     74         mPbapStateMachine.sendMessage(PbapStateMachine.CREATE_NOTIFICATION);
     75         mPbapStateMachine.sendMessageDelayed(PbapStateMachine.REMOVE_NOTIFICATION,
     76                 BluetoothPbapService.USER_CONFIRM_TIMEOUT_VALUE);
     77         synchronized (this) {
     78             while (!mChallenged && !mAuthCancelled) {
     79                 try {
     80                     wait();
     81                 } catch (InterruptedException e) {
     82                     Log.e(TAG, "Interrupted while waiting on isChallenged or AuthCancelled");
     83                 }
     84             }
     85         }
     86     }
     87 
     88     @Override
     89     public PasswordAuthentication onAuthenticationChallenge(final String description,
     90             final boolean isUserIdRequired, final boolean isFullAccess) {
     91         waitUserConfirmation();
     92         if (mSessionKey.trim().length() != 0) {
     93             return new PasswordAuthentication(null, mSessionKey.getBytes());
     94         }
     95         return null;
     96     }
     97 
     98     // TODO: Reserved for future use only, in case PSE challenge PCE
     99     @Override
    100     public byte[] onAuthenticationResponse(final byte[] userName) {
    101         byte[] b = null;
    102         return b;
    103     }
    104 }
    105