[Note] Turn on/off MAC WIFI by Command line

我的 MACbook 如果同時開放 WIFI 和 Bluetooth 時,如果離開 Bluetooth touchpad 會自動斷線。但如果這時候靠近時, Bluetooth 會怎麼樣都連不上,包括開關 Bluetooth ,感覺 Bluetooth & WIFI 會相衝。

這時只剩下一個解法,就是把 WIFI 關掉,這時 Bluetooth 會馬上連上我的 touchpad 。但因為螢幕闔起來了,沒有滑鼠 or touchpad ,只剩下外接鍵盤可用。上網找了一下,發現下面的指令可以直接關掉 WIFI。

$ alias wifioff='networksetup -setairportpower airport off'
$ alias wifion='networksetup -setairportpower airport on'

$ wifioff
airport is not a Wi-Fi interface.
Turning off the only airport interface found: en0

$ wifion
airport is not a Wi-Fi interface.
Turning on the only airport interface found: en0

Reference:
* Enable and Disable AirPort Wireless from the Command Line in Mac OS X

Enable HTTPBuilder debug message

在用 groovy & cucumber 寫 API test 時,如果發生問題只會噴個 error 的 body 而已,這樣非常難 debug 。而且有一些參數是設在 http header 上,如果把每個 API 的 header 都印出來,要到處塞 debug logger。如果是 https 的話,也沒辦法使用 tcpdump 來看。

這時可以用下列方法簡單的把 logger 設定打開,就可以直接噴在營幕上了,這樣比較好 debug。

mvn -B integration-test -Dcucumber.options="--tags @test_only" \
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog \
-Dorg.apache.commons.logging.simplelog.showdatetime=true \
-Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG

還有其他的參數可以參考後附的文章內容。

reference

Backup HipChat messages by API

簡單的 Script 來備份 HipChat 該房間所有的 messages。

Why?

因為我沒有 Admin 權限! 所以只好這樣幹。

#!/bin/sh
HOST=https://{your hipchat host}
TOKEN={token}
ROOM={room}
DATE={start time}
NUMBER_OF_DAYS=410
OUTPUT_DIR=/tmp/backup
for i in `seq 1 $NUMBER_OF_DAYS` ;
do
    let DATE+=86400
    let END=DATE+86400
    if [ ! -f /tmp/backup/$DATE ] ; then
        response=$(curl -v  "$HOST/v2/room/$ROOM/history?date=$END&end-date=$DATE&reverse=true&max-results=1000&auth_token=$TOKEN" --write-out %{http_code} -o $OUTPUT_DIR/$DATE)
        test $response -ne 200 && sleep 60;
    fi
done

Reference:
* View room history

淺談TOTP(Time-based One-time Password)

TOTP 是利用 Application and services 上時間是一致,拿二邊共同的 key ,並且作一樣的 Hash 後,結果會產生一樣的 token,即可拿來作驗證,常被使用來作二次驗證(two-step verification)。

因為這部份的演算法是 RFC6238,所以可使用任何的 apps 來協助驗證,例如:Google Authenticator, Duo 之類的。

怎麼實作的

PHP 有人作好了: otphp

跟據 wikipedia 裡的 Implementation 章節中,有一段描述如何產生 token:

  1. Calculate C as the number of times TI has elapsed after T0.
  2. Compute the HMAC hash H with C as the message and K as the key (the HMAC algorithm is defined in the previous section, but also most cryptographical libraries support it). K should be passed as it is, C should be passed as a raw 64-bit unsigned integer.
  3. Take the least 4 significant bits of H and use it as an offset, O.
  4. Take 4 bytes from H starting at O bytes MSB, discard the most significant bit and store the rest as an (unsigned) 32-bit integer, I.
  5. The token is the lowest N digits of I in base 10. If the result has fewer digits than N, pad it with zeroes from the left.

如果覺得太復雜,我挖了一下 otphp,應該在 otphp/src/OTP.php 裡面的 protected function generateOTP($input) 中有實作。

使用

安裝 composer require spomky-labs/otphp

sample code:

<?php
require __DIR__ . '/vendor/autoload.php';
use OTPHP\TOTP;

$totp = new TOTP(
    "whatup.tw@gmail.com" // The label (string)
);
$google_chart = $totp->getQrCodeUri();
$otpCode = $totp->now();
echo "<img src='{$google_chart}'><br/>";
echo "Current OTP: " . $totp->now() . "<br/>\n";
echo "Current Secret: " . $totp->getSecret() . "<br/>\n";
echo "Verify OTP: " . $totp->verify($otpCode) . "<br/>\n";
?>

到 browser 執行後會產生下面畫面:
totp example result

接下來你就拿出你的 Google Authenticator 來掃這個條碼,就可以新增一組新驗證碼。

Google Authenticator 預設是 30s ,所以 30s 後,這個 OTP 產生出來的 token 應該會無法使用。如果你的 application 可以看到 secret 的話,應該會看到 app & service 的 secret 應該要一樣。

剩下的可以參考 document 說的很清楚。

限制

  • 其實無法防止 phishing 網頁用假的頁面來騙你資料,在你輸入 token 後,壞人在 30s 之內也可以同時登入。
  • secret key 如果被人拿走,別人也同時擁有通過二次驗證的能力。
  • app & services 之間的時間一定不能差太多,所以手機不能調整時間(有人喜歡看時鐘快五分鐘)。