1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/* 2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project 3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License. 6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at 7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software 11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and 14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License. 15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.pbap; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.os.Handler; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.Authenticator; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.PasswordAuthentication; 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaclass BluetoothPbapObexAuthenticator implements Authenticator { 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final static String TAG = "BluetoothPbapObexAuthenticator"; 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private String mSessionKey; 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private boolean mReplied; 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final Handler mCallback; 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public BluetoothPbapObexAuthenticator(Handler callback) { 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mCallback = callback; 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public synchronized void setReply(String key) { 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.d(TAG, "setReply key=" + key); 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mSessionKey = key; 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mReplied = true; 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta notify(); 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public PasswordAuthentication onAuthenticationChallenge(String description, 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta boolean isUserIdRequired, boolean isFullAccess) { 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta PasswordAuthentication pa = null; 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mReplied = false; 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.d(TAG, "onAuthenticationChallenge: sending request"); 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mCallback.obtainMessage(BluetoothPbapObexSession.OBEX_SESSION_AUTHENTICATION_REQUEST) 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta .sendToTarget(); 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta synchronized (this) { 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta while (!mReplied) { 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onAuthenticationChallenge: waiting for response"); 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta this.wait(); 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (InterruptedException e) { 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "Interrupted while waiting for challenge response"); 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mSessionKey != null && mSessionKey.length() != 0) { 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onAuthenticationChallenge: mSessionKey=" + mSessionKey); 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta pa = new PasswordAuthentication(null, mSessionKey.getBytes()); 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else { 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onAuthenticationChallenge: mSessionKey is empty, timeout/cancel occured"); 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return pa; 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public byte[] onAuthenticationResponse(byte[] userName) { 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* required only in case PCE challenges PSE which we don't do now */ 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return null; 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 87