Return-Path: From: Dave Mielke To: bluez-devel@lists.sourceforge.net Subject: Re: [Bluez-devel] PIN helper Message-ID: <20060310205620.GM4516@beta.private.mielke.cc> References: <20060309192953.52ee8c2e.fotopiper@o2.pl> <20060309193423.GF4516@beta.private.mielke.cc> <20060309225521.0f407da9.fotopiper@o2.pl> <20060309230420.05dc3497.fotopiper@o2.pl> <20060310013307.GG4516@beta.private.mielke.cc> <20060310082859.57eaf23b.fotopiper@o2.pl> <20060310172525.GJ4516@beta.private.mielke.cc> <20060310191346.077462e0.fotopiper@o2.pl> <20060310183933.GK4516@beta.private.mielke.cc> <20060310202247.0ae102c2.fotopiper@o2.pl> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="9UV9rz0O2dU/yYYn" In-Reply-To: <20060310202247.0ae102c2.fotopiper@o2.pl> Sender: bluez-devel-admin@lists.sourceforge.net Errors-To: bluez-devel-admin@lists.sourceforge.net Reply-To: bluez-devel@lists.sourceforge.net List-Unsubscribe: , List-Id: BlueZ development List-Post: List-Help: List-Subscribe: , List-Archive: Date: Fri, 10 Mar 2006 15:56:20 -0500 --9UV9rz0O2dU/yYYn Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Oops! I was too hasty with the send button and forgot to attach the script. Here it is. -- Dave Mielke | 2213 Fox Crescent | I believe that the Bible is the Phone: 1-613-726-0014 | Ottawa, Ontario | Word of God. Please contact me EMail: dave@mielke.cc | Canada K2A 1H7 | if you're concerned about Hell. http://FamilyRadio.com/ | http://Mielke.cc/bible/ --9UV9rz0O2dU/yYYn Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=bluepin #!/bin/sh # This script has been written by Dave Mielke . It's a light # weight, text mode, Bluetooth PIN helper script. # # Step 1: The PINs file, /etc/bluetooth/pins (can be changed with the -f # option), is searched for a line which corresponds to the Bluetooth address of # the device. Each line in this file should contain the address of a device and # its PIN, in that order, separated by space. Any additional data on the line # is ignored and can be used as a comment to help identify the device. For # example, if the address of your cell phone is 01:23:45:67:89:AB, and if its # PIN is 12345, then its line would look like this: # # 01:23:45:67:89:AB 12345 my cell phone # # If the address is found within the PINs file then the corresponding PIN is # returned. # # Step 2: If the -c option has been specified then its operand is interpreted # as the command which is to be used to prompt the user for the PIN. If it is # appropriately quoted so that it can contain space then options may be # specified after the command name. It must interpret its positional parameters # and return its response as if it were being directly invoked as a Bluetooth # PIN helper. If it returns a PIN then that PIN is returned. # # Step 3: If the -n option has not been specified then the user is prompted for # the PIN via a text-mode dialog in a free virtual terminal. The console # automatically returns to the original virtual terminal as soon as the user # responds to the dialog. If the response contains at least one character then # the entire response is returned as the PIN. # # Step 4: Return the fact that the PIN could not be determined. # # Error messages are written to the system log (syslog) if "logger" is in the # command search path ($PATH) and if standard output is not a terminal (tty or # pty). If any of these conditions is not satisfied then errors are written to # standard error. # # Invoke this script with the -h option to see its usage summary. programName="${0##*/}" configurationDirectory="/etc/bluetooth" configurationFile="${configurationDirectory}/${programName}.conf" defaultPinCommand="" defaultPinsFile="${configurationDirectory}/pins" defaultAcceptableModes="600" programMessage() { echo >&2 "${programName}: ${1}" } programError() { programMessage "${2}" error exit "${1}" } syntaxError() { programError 2 "${1}" } setVariable() { eval "${1}"'="${2}"' } findCommand() { variable="${1}" shift command="${1}" while [ "${#}" -gt 0 ] do path="`which "${1}" 2>/dev/null`" [ -n "${path}" ] && { setVariable "${variable}" "${path}" return 0 } shift done programMessage "command not found: ${command}" return 1 } isReadableFile() { [ -f "${1}" ] && { if [ ! -r "${1}" ] then programMessage "file not readable: ${1}" else return 0 fi } return 1 } respondWithPin() { echo "PIN:${1}" exit 0 } [ ! -t 1 ] && { findCommand loggerPath logger && { programMessage() { "${loggerPath}" -t "${programName}[${$}]" -p "daemon.${2:-warning}" -- "${1}" } } } showUsage=false pinCommand="${defaultPinCommand}" pinsFile="${defaultPinsFile}" acceptableModes="${defaultAcceptableModes}" promptUser=true pinLimit=16 [ -n "${configurationFile}" ] && isReadableFile "${configurationFile}" && { exec <"${configurationFile}" lineNumber=0 while read attribute setting do lineNumber=`expr "${lineNumber}" + 1` case "${attribute}" in '') continue;; \#*) continue;; command) variable=pinCommand type=string ;; file) variable=pinsFile type=word ;; modes) variable=acceptableModes type=word ;; prompt) variable=promptUser type=flag ;; *) type=invalid;; esac problem="" if [ "${type}" = "invalid" ] then problem="invalid attribute: ${attribute}" elif [ "${type}" != "string" ] then if [ "${setting}" = "" ] then problem="missing attribute setting: ${attribute}" else excess="${setting#* }" if [ "${excess}" != "${setting}" ] then problem="excess data: ${excess}" elif [ "${type}" = "flag" ] then case "${setting}" in yes|ye|y|true|tru|tr|t) setting=true;; no|n|false|fals|fal|fa|f) setting=false;; *) problem="invalid flag setting: ${setting}";; esac elif [ "${type}" = "word" ] then [ "${setting}" = "off" ] && setting="" else problem="unimplemented attribute type: ${type}" fi fi fi if [ -n "${problem}" ] then programMessage "error at ${configurationFile}[${lineNumber}]: ${problem}" else setVariable "${variable}" "${setting}" fi done exec <&- } while getopts ":c:f:hm:n" option do case "${option}" in c) pinCommand="${OPTARG}";; f) pinsFile="${OPTARG}";; h) showUsage=true;; m) acceptableModes="${OPTARG}";; n) promptUser=false;; \?) syntaxError "invalid option: -${OPTARG}";; :) syntaxError "missing operand: -${OPTARG}";; *) syntaxError "unimplemented option: -${option}";; esac done shift `expr "${OPTIND}" - 1` "${showUsage}" && { cat < ${acceptableModes}" else safeModes=true fi else programMessage "file permission modes not verifiable: ${pinsFile}" fi fi "${safeModes}" && { exec <"${pinsFile}" while read address pin comment do [ "${address}" = "${deviceAddress}" ] && respondWithPin "${pin}" done exec <&- } } [ `expr " ${pinCommand}" : ' *[^ ]'` -gt 0 ] && { set -- ${pinCommand} "${connectionDirection}" "${deviceAddress}" [ -n "${deviceName}" ] && set -- "${@}" "${deviceName}" response="`"${@}" | head -1`" pin="${response#PIN:}" [ "${pin}" != "${response}" ] && respondWithPin "${pin}" } "${promptUser}" && { findCommand openPath open openvt && { dialogTitle="Bluetooth PIN Prompt" dialogTime="`date '+%Y-%m-%d@%H:%M:%S'`" dialogPrompt="Enter PIN for ${connectionAdjective} Bluetooth connection ${connectionPreposition} ${deviceName}[${deviceAddress}]" findCommand dialogPath dialog && { pin="`"${openPath}" 3>&1 -s -w -- "${dialogPath}" --output-fd 3 --clear --title "${dialogTitle}" --cr-wrap --max-input "${pinLimit}" --inputbox "${dialogTime}\n\n${dialogPrompt}" 0 0 ""`" [ -n "${pin}" ] && respondWithPin "${pin}" } } } echo "ERR" exit 0 --9UV9rz0O2dU/yYYn-- ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ Bluez-devel mailing list Bluez-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bluez-devel