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
33package com.android.bluetooth.pbap;
34
35import android.util.Log;
36
37import javax.obex.Authenticator;
38import javax.obex.PasswordAuthentication;
39
40/**
41 * BluetoothPbapAuthenticator is a used by BluetoothObexServer for obex
42 * authentication procedure.
43 */
44public 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