several oauth fixes - shred doesn't completely work yet, but it also doesn't completely NOT work, so at least there's some improvement
This commit is contained in:
parent
4b5d91ccb5
commit
9bff739d96
@ -1823,9 +1823,13 @@ require_once('include/photos.php');
|
|||||||
function api_oauth_request_token(&$a, $type){
|
function api_oauth_request_token(&$a, $type){
|
||||||
try{
|
try{
|
||||||
$oauth = new FKOAuth1();
|
$oauth = new FKOAuth1();
|
||||||
$r = $oauth->fetch_request_token(OAuthRequest::from_request());
|
$req = OAuthRequest::from_request();
|
||||||
|
logger('Req: ' . var_export($req,true));
|
||||||
|
$r = $oauth->fetch_request_token($req);
|
||||||
}catch(Exception $e){
|
}catch(Exception $e){
|
||||||
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
|
logger('oauth_exception: ' . print_r($e->getMessage(),true));
|
||||||
|
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage());
|
||||||
|
killme();
|
||||||
}
|
}
|
||||||
echo $r;
|
echo $r;
|
||||||
killme();
|
killme();
|
||||||
@ -1833,7 +1837,8 @@ require_once('include/photos.php');
|
|||||||
function api_oauth_access_token(&$a, $type){
|
function api_oauth_access_token(&$a, $type){
|
||||||
try{
|
try{
|
||||||
$oauth = new FKOAuth1();
|
$oauth = new FKOAuth1();
|
||||||
$r = $oauth->fetch_access_token(OAuthRequest::from_request());
|
$req = OAuthRequest::from_request();
|
||||||
|
$r = $oauth->fetch_access_token($req);
|
||||||
}catch(Exception $e){
|
}catch(Exception $e){
|
||||||
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
|
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'",
|
$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'",
|
||||||
dbesc($consumer_key)
|
dbesc($consumer_key)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (count($r))
|
if (count($r))
|
||||||
return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
|
return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
|
||||||
return null;
|
return null;
|
||||||
@ -30,11 +31,13 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
|
|
||||||
function lookup_token($consumer, $token_type, $token) {
|
function lookup_token($consumer, $token_type, $token) {
|
||||||
logger(__function__.":".$consumer.", ". $token_type.", ".$token);
|
logger(__function__.":".$consumer.", ". $token_type.", ".$token);
|
||||||
|
|
||||||
$r = q("SELECT id, secret,scope, expires, uid FROM tokens WHERE client_id='%s' AND scope='%s' AND id='%s'",
|
$r = q("SELECT id, secret,scope, expires, uid FROM tokens WHERE client_id='%s' AND scope='%s' AND id='%s'",
|
||||||
dbesc($consumer->key),
|
dbesc($consumer->key),
|
||||||
dbesc($token_type),
|
dbesc($token_type),
|
||||||
dbesc($token)
|
dbesc($token)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (count($r)){
|
if (count($r)){
|
||||||
$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
|
$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
|
||||||
$ot->scope=$r[0]['scope'];
|
$ot->scope=$r[0]['scope'];
|
||||||
@ -47,11 +50,13 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
|
|
||||||
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
|
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
|
||||||
// echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
|
// echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
|
||||||
|
|
||||||
$r = q("SELECT id, secret FROM tokens WHERE client_id='%s' AND id='%s' AND expires=%d",
|
$r = q("SELECT id, secret FROM tokens WHERE client_id='%s' AND id='%s' AND expires=%d",
|
||||||
dbesc($consumer->key),
|
dbesc($consumer->key),
|
||||||
dbesc($nonce),
|
dbesc($nonce),
|
||||||
intval($timestamp)
|
intval($timestamp)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (count($r))
|
if (count($r))
|
||||||
return new OAuthToken($r[0]['id'],$r[0]['secret']);
|
return new OAuthToken($r[0]['id'],$r[0]['secret']);
|
||||||
return null;
|
return null;
|
||||||
@ -74,6 +79,7 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
dbesc($k),
|
dbesc($k),
|
||||||
'request',
|
'request',
|
||||||
intval(REQUEST_TOKEN_DURATION));
|
intval(REQUEST_TOKEN_DURATION));
|
||||||
|
|
||||||
if (!$r) return null;
|
if (!$r) return null;
|
||||||
return new OAuthToken($key,$sec);
|
return new OAuthToken($key,$sec);
|
||||||
}
|
}
|
||||||
@ -95,6 +101,7 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
|
|
||||||
$key = $this->gen_token();
|
$key = $this->gen_token();
|
||||||
$sec = $this->gen_token();
|
$sec = $this->gen_token();
|
||||||
|
|
||||||
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)",
|
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)",
|
||||||
dbesc($key),
|
dbesc($key),
|
||||||
dbesc($sec),
|
dbesc($sec),
|
||||||
@ -102,6 +109,7 @@ class FKOAuthDataStore extends OAuthDataStore {
|
|||||||
'access',
|
'access',
|
||||||
intval(ACCESS_TOKEN_DURATION),
|
intval(ACCESS_TOKEN_DURATION),
|
||||||
intval($uverifier));
|
intval($uverifier));
|
||||||
|
|
||||||
if ($r)
|
if ($r)
|
||||||
$ret = new OAuthToken($key,$sec);
|
$ret = new OAuthToken($key,$sec);
|
||||||
}
|
}
|
||||||
@ -131,9 +139,9 @@ class FKOAuth1 extends OAuthServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function loginUser($uid){
|
function loginUser($uid){
|
||||||
logger("FKOAuth1::loginUser $uid");
|
logger("RedOAuth1::loginUser $uid");
|
||||||
$a = get_app();
|
$a = get_app();
|
||||||
$r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
|
$r = q("SELECT * FROM channel WHERE channel_id = %d LIMIT 1",
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
if(count($r)){
|
if(count($r)){
|
||||||
@ -143,35 +151,36 @@ class FKOAuth1 extends OAuthServer {
|
|||||||
header('HTTP/1.0 401 Unauthorized');
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
die('This api requires login');
|
die('This api requires login');
|
||||||
}
|
}
|
||||||
$_SESSION['uid'] = $record['uid'];
|
$_SESSION['uid'] = $record['channel_id'];
|
||||||
$_SESSION['theme'] = $record['theme'];
|
$_SESSION['theme'] = $record['channel_theme'];
|
||||||
$_SESSION['mobile_theme'] = get_pconfig($record['uid'], 'system', 'mobile_theme');
|
$_SESSION['account_id'] = $record['channel_account_id'];
|
||||||
|
$_SESSION['mobile_theme'] = get_pconfig($record['channel_id'], 'system', 'mobile_theme');
|
||||||
$_SESSION['authenticated'] = 1;
|
$_SESSION['authenticated'] = 1;
|
||||||
$_SESSION['page_flags'] = $record['page-flags'];
|
// $_SESSION['page_flags'] = $record['page-flags'];
|
||||||
$_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['nickname'];
|
$_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['channel_address'];
|
||||||
$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
|
$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
|
||||||
|
$_SESSION['allow_api'] = true;
|
||||||
|
|
||||||
//notice( t("Welcome back ") . $record['username'] . EOL);
|
$a->channel = $record;
|
||||||
$a->user = $record;
|
|
||||||
|
|
||||||
if(strlen($a->user['timezone'])) {
|
if(strlen($a->channel['channel_timezone'])) {
|
||||||
date_default_timezone_set($a->user['timezone']);
|
date_default_timezone_set($a->channel['channel_timezone']);
|
||||||
$a->timezone = $a->user['timezone'];
|
// $a->timezone = $a->user['timezone'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
|
// $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
|
||||||
intval($_SESSION['uid']));
|
// intval($_SESSION['uid']));
|
||||||
if(count($r)) {
|
// if(count($r)) {
|
||||||
$a->contact = $r[0];
|
// $a->contact = $r[0];
|
||||||
$a->cid = $r[0]['id'];
|
// $a->cid = $r[0]['id'];
|
||||||
$_SESSION['cid'] = $a->cid;
|
// $_SESSION['cid'] = $a->cid;
|
||||||
}
|
// }
|
||||||
q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
|
// q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
|
||||||
dbesc(datetime_convert()),
|
// dbesc(datetime_convert()),
|
||||||
intval($_SESSION['uid'])
|
// intval($_SESSION['uid'])
|
||||||
);
|
// );
|
||||||
|
//
|
||||||
call_hooks('logged_in', $a->user);
|
// call_hooks('logged_in', $a->user);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -273,6 +273,7 @@ class OAuthRequest {
|
|||||||
&& @strstr($request_headers["Content-Type"],
|
&& @strstr($request_headers["Content-Type"],
|
||||||
"application/x-www-form-urlencoded")
|
"application/x-www-form-urlencoded")
|
||||||
) {
|
) {
|
||||||
|
|
||||||
$post_data = OAuthUtil::parse_parameters(
|
$post_data = OAuthUtil::parse_parameters(
|
||||||
file_get_contents(self::$POST_INPUT)
|
file_get_contents(self::$POST_INPUT)
|
||||||
);
|
);
|
||||||
@ -286,15 +287,15 @@ class OAuthRequest {
|
|||||||
$request_headers['Authorization']
|
$request_headers['Authorization']
|
||||||
);
|
);
|
||||||
$parameters = array_merge($parameters, $header_parameters);
|
$parameters = array_merge($parameters, $header_parameters);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// fix for friendica redirect system
|
// fix for friendica redirect system
|
||||||
|
// FIXME or don't, but figure out if this is absolutely necessary and act accordingly
|
||||||
$http_url = substr($http_url, 0, strpos($http_url,$parameters['q'])+strlen($parameters['q']));
|
$http_url = substr($http_url, 0, strpos($http_url,$parameters['q'])+strlen($parameters['q']));
|
||||||
unset( $parameters['q'] );
|
unset( $parameters['q'] );
|
||||||
|
|
||||||
//echo "<pre>".__function__."\n"; var_dump($http_method, $http_url, $parameters, $_SERVER['REQUEST_URI']); killme();
|
|
||||||
return new OAuthRequest($http_method, $http_url, $parameters);
|
return new OAuthRequest($http_method, $http_url, $parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,9 +515,7 @@ class OAuthServer {
|
|||||||
*/
|
*/
|
||||||
public function fetch_request_token(&$request) {
|
public function fetch_request_token(&$request) {
|
||||||
$this->get_version($request);
|
$this->get_version($request);
|
||||||
|
|
||||||
$consumer = $this->get_consumer($request);
|
$consumer = $this->get_consumer($request);
|
||||||
|
|
||||||
// no token required for the initial token request
|
// no token required for the initial token request
|
||||||
$token = NULL;
|
$token = NULL;
|
||||||
|
|
||||||
@ -525,7 +524,6 @@ class OAuthServer {
|
|||||||
// Rev A change
|
// Rev A change
|
||||||
$callback = $request->get_parameter('oauth_callback');
|
$callback = $request->get_parameter('oauth_callback');
|
||||||
$new_token = $this->data_store->new_request_token($consumer, $callback);
|
$new_token = $this->data_store->new_request_token($consumer, $callback);
|
||||||
|
|
||||||
return $new_token;
|
return $new_token;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,7 +794,8 @@ class OAuthUtil {
|
|||||||
);
|
);
|
||||||
$out[$key] = $value;
|
$out[$key] = $value;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
if((! isset($out)) || (! array_key_exists('Authorization',$out))) {
|
||||||
// otherwise we don't have apache and are just going to have to hope
|
// otherwise we don't have apache and are just going to have to hope
|
||||||
// that $_SERVER actually contains what we need
|
// that $_SERVER actually contains what we need
|
||||||
$out = array();
|
$out = array();
|
||||||
@ -806,6 +805,8 @@ class OAuthUtil {
|
|||||||
$out['Content-Type'] = $_ENV['CONTENT_TYPE'];
|
$out['Content-Type'] = $_ENV['CONTENT_TYPE'];
|
||||||
|
|
||||||
foreach ($_SERVER as $key => $value) {
|
foreach ($_SERVER as $key => $value) {
|
||||||
|
if($key === 'REDIRECT_REMOTE_USER')
|
||||||
|
$out['Authorization'] = $value;
|
||||||
if (substr($key, 0, 5) == "HTTP_") {
|
if (substr($key, 0, 5) == "HTTP_") {
|
||||||
// this is chaos, basically it is just there to capitalize the first
|
// this is chaos, basically it is just there to capitalize the first
|
||||||
// letter of every word that is not an initial HTTP and strip HTTP
|
// letter of every word that is not an initial HTTP and strip HTTP
|
||||||
|
173
util/shred/FriendicaOAuth.sh
Executable file
173
util/shred/FriendicaOAuth.sh
Executable file
@ -0,0 +1,173 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2012 Fabio Comuni
|
||||||
|
# Copyright (c) 2012 Michael Nowack
|
||||||
|
# Copyright (c) 2010, 2012 Yu-Jie Lin
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
# this software and associated documentation files (the "Software"), to deal in
|
||||||
|
# the Software without restriction, including without limitation the rights to
|
||||||
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
# of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
# so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
FRIENDICAOAUTH_VERSION=0.1.1
|
||||||
|
|
||||||
|
F_API_VERSION="1"
|
||||||
|
|
||||||
|
# Friendica API endpoints
|
||||||
|
|
||||||
|
F_ACCOUNF_UPDATE_PROFILE_IMAGE="${redmatrix_url}/api/account/update_profile_image"
|
||||||
|
F_STATUSES_UPDATE="${redmatrix_url}/api/statuses/update"
|
||||||
|
F_STATUSES_HOME_TIMELINE="${redmatrix_url}/api/statuses/home_timeline"
|
||||||
|
|
||||||
|
F_REQUESF_TOKEN=${redmatrix_url}'/api/oauth/request_token'
|
||||||
|
F_ACCESS_TOKEN=${redmatrix_url}'/api/oauth/access_token'
|
||||||
|
F_AUTHORIZE_TOKEN=${redmatrix_url}'/api/oauth/authorize'
|
||||||
|
|
||||||
|
# Source OAuth.sh
|
||||||
|
|
||||||
|
OAuth_sh=$(which OAuth.sh)
|
||||||
|
(( $? != 0 )) && echo 'Unable to locate OAuth.sh! Make sure it is in searching PATH.' && exit 1
|
||||||
|
source "$OAuth_sh"
|
||||||
|
|
||||||
|
FO_debug () {
|
||||||
|
# Print out all parameters, each in own line
|
||||||
|
[[ "$FO_DEBUG" == "" ]] && return
|
||||||
|
local t=$(date +%FT%T.%N)
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
echo "[FO][DEBUG][$t] $1"
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
FO_extract_value () {
|
||||||
|
# $1 key name
|
||||||
|
# $2 string to find
|
||||||
|
egrep -o "$1=[a-zA-Z0-9-]*" <<< "$2" | cut -d\= -f 2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FO_init() {
|
||||||
|
# Initialize FriendicaOAuth
|
||||||
|
oauth_version='1.0'
|
||||||
|
oauth_signature_method='HMAC-SHA1'
|
||||||
|
oauth_basic_params=(
|
||||||
|
$(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
|
||||||
|
$(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
|
||||||
|
$(OAuth_param 'oauth_version' "$oauth_version")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
FO_access_token_helper () {
|
||||||
|
# Help guide user to get access token
|
||||||
|
|
||||||
|
local resp PIN
|
||||||
|
|
||||||
|
# Request Token
|
||||||
|
|
||||||
|
local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" '' '' "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_REQUESF_TOKEN" "$(OAuth_param 'oauth_callback' 'oob')"), $(OAuth_param_quote 'oauth_callback' 'oob')"
|
||||||
|
|
||||||
|
# echo $auth_header
|
||||||
|
# echo $F_REQUESF_TOKEN
|
||||||
|
|
||||||
|
resp=$(curl -s -d '' -H "$auth_header" "$F_REQUESF_TOKEN")
|
||||||
|
FO_rval=$?
|
||||||
|
(( $? != 0 )) && return $FO_rval
|
||||||
|
|
||||||
|
local _oauth_token=$(FO_extract_value 'oauth_token' "$resp")
|
||||||
|
local _oauth_token_secret=$(FO_extract_value 'oauth_token_secret' "$resp")
|
||||||
|
|
||||||
|
echo 'Please go to the following link to get the PIN:'
|
||||||
|
echo " ${F_AUTHORIZE_TOKEN}?oauth_token=$_oauth_token"
|
||||||
|
|
||||||
|
read -p 'PIN: ' PIN
|
||||||
|
|
||||||
|
# Access Token
|
||||||
|
|
||||||
|
local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" "$_oauth_token" "$_oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_ACCESS_TOKEN" "$(OAuth_param 'oauth_verifier' "$PIN")"), $(OAuth_param_quote 'oauth_verifier' "$PIN")"
|
||||||
|
|
||||||
|
resp=$(curl -s -d "" -H "$auth_header" "$F_ACCESS_TOKEN")
|
||||||
|
FO_rval=$?
|
||||||
|
(( $? != 0 )) && return $FO_rval
|
||||||
|
|
||||||
|
FO_ret=(
|
||||||
|
$(FO_extract_value 'oauth_token' "$resp")
|
||||||
|
$(FO_extract_value 'oauth_token_secret' "$resp")
|
||||||
|
$(FO_extract_value 'user_id' "$resp")
|
||||||
|
$(FO_extract_value 'screen_name' "$resp")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# APIs
|
||||||
|
######
|
||||||
|
|
||||||
|
FO_statuses_update () {
|
||||||
|
# $1 format
|
||||||
|
# $2 status
|
||||||
|
# $3 in_reply_to_status_id
|
||||||
|
# The followins are not implemented yet:
|
||||||
|
# $4 lat
|
||||||
|
# $5 long
|
||||||
|
# $6 place_id
|
||||||
|
# $7 display_coordinates
|
||||||
|
local format="$1"
|
||||||
|
[[ "$format" == "" ]] && format="xml"
|
||||||
|
|
||||||
|
local params=(
|
||||||
|
$(OAuth_param 'status' "$2")
|
||||||
|
)
|
||||||
|
|
||||||
|
params[${#params[@]}]=$(OAuth_param 'source' "fcli")
|
||||||
|
|
||||||
|
[[ "$3" != "" ]] && params[${#params[@]}]=$(OAuth_param 'in_reply_to_status_id' "$3") && local in_reply_to_status_id=( '--data-urlencode' "in_reply_to_status_id=$3" )
|
||||||
|
|
||||||
|
|
||||||
|
local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'POST' "$F_STATUSES_UPDATE.$format" ${params[@]})
|
||||||
|
|
||||||
|
|
||||||
|
FO_ret=$(curl -s -H "$auth_header" --data-urlencode "status=$2" --data-urlencode "source=fcli" ${in_reply_to_status_id[@]} "$F_STATUSES_UPDATE.$format")
|
||||||
|
|
||||||
|
FO_rval=$?
|
||||||
|
return $FO_rval
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# gets the user home_timeline.
|
||||||
|
#
|
||||||
|
# @sets FO_ret API response
|
||||||
|
# @returns status
|
||||||
|
# @public
|
||||||
|
FO_statuses_home_timeline () {
|
||||||
|
# $1 format
|
||||||
|
# $2 screen_name
|
||||||
|
# $3 count
|
||||||
|
local format="$1"
|
||||||
|
local screen_name="$2"
|
||||||
|
local count="$3"
|
||||||
|
[[ "$format" == "" ]] && format="xml"
|
||||||
|
[[ "$count" == "" ]] && count=1
|
||||||
|
|
||||||
|
local params=(
|
||||||
|
$(OAuth_param 'screen_name' $screen_name)
|
||||||
|
$(OAuth_param 'count' $count)
|
||||||
|
)
|
||||||
|
g
|
||||||
|
local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'GET' "$F_STATUSES_HOME_TIMELINE.$format" ${params[@]})
|
||||||
|
|
||||||
|
convscreen=$(OAuth_PE "$screen_name");
|
||||||
|
FO_ret=$(curl -s --get "${F_STATUSES_HOME_TIMELINE}.${format}" --data "screen_name=${convscreen}&count=${count}" --header "${auth_header}")
|
||||||
|
FO_rval=$?
|
||||||
|
|
||||||
|
return $FO_rval
|
||||||
|
}
|
129
util/shred/JSON.sh
Executable file
129
util/shred/JSON.sh
Executable file
@ -0,0 +1,129 @@
|
|||||||
|
# The MIT License
|
||||||
|
#
|
||||||
|
# Copyright (c) 2011 Dominic Tarr
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge,
|
||||||
|
# to any person obtaining a copy of this software and
|
||||||
|
# associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including
|
||||||
|
# without limitation the rights to use, copy, modify,
|
||||||
|
# merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom
|
||||||
|
# the Software is furnished to do so,
|
||||||
|
# subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice
|
||||||
|
# shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||||
|
# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# https://github.com/dominictarr/JSON.sh
|
||||||
|
#
|
||||||
|
throw () {
|
||||||
|
echo "$*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenize () {
|
||||||
|
local ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
||||||
|
local CHAR='[^[:cntrl:]"\\]'
|
||||||
|
local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
|
||||||
|
local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
|
||||||
|
local KEYWORD='null|false|true'
|
||||||
|
local SPACE='[[:space:]]+'
|
||||||
|
egrep -ao "$STRING|$NUMBER|$KEYWORD|$SPACE|." --color=never |
|
||||||
|
egrep -v "^$SPACE$" # eat whitespace
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_array () {
|
||||||
|
local index=0
|
||||||
|
local ary=''
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
']') ;;
|
||||||
|
*)
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
parse_value "$1" "$index"
|
||||||
|
let index=$index+1
|
||||||
|
ary="$ary""$value"
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
']') break ;;
|
||||||
|
',') ary="$ary," ;;
|
||||||
|
*) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
|
||||||
|
esac
|
||||||
|
read -r token
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
value=`printf '[%s]' "$ary"`
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_object () {
|
||||||
|
local key
|
||||||
|
local obj=''
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
'}') ;;
|
||||||
|
*)
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
case "$token" in
|
||||||
|
'"'*'"') key=$token ;;
|
||||||
|
*) throw "EXPECTED string GOT ${token:-EOF}" ;;
|
||||||
|
esac
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
':') ;;
|
||||||
|
*) throw "EXPECTED : GOT ${token:-EOF}" ;;
|
||||||
|
esac
|
||||||
|
read -r token
|
||||||
|
parse_value "$1" "$key"
|
||||||
|
obj="$obj$key:$value"
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
'}') break ;;
|
||||||
|
',') obj="$obj," ;;
|
||||||
|
*) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
|
||||||
|
esac
|
||||||
|
read -r token
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
value=`printf '{%s}' "$obj"`
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_value () {
|
||||||
|
local jpath="${1:+$1,}$2"
|
||||||
|
case "$token" in
|
||||||
|
'{') parse_object "$jpath" ;;
|
||||||
|
'[') parse_array "$jpath" ;;
|
||||||
|
# At this point, the only valid single-character tokens are digits.
|
||||||
|
''|[^0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
|
||||||
|
*) value=$token ;;
|
||||||
|
esac
|
||||||
|
printf "[%s]\t%s\n" "$jpath" "$value"
|
||||||
|
}
|
||||||
|
|
||||||
|
parse () {
|
||||||
|
read -r token
|
||||||
|
parse_value
|
||||||
|
read -r token
|
||||||
|
case "$token" in
|
||||||
|
'') ;;
|
||||||
|
*) throw "EXPECTED EOF GOT $token" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $0 = $BASH_SOURCE ];
|
||||||
|
then
|
||||||
|
tokenize | parse
|
||||||
|
fi
|
214
util/shred/OAuth.sh
Executable file
214
util/shred/OAuth.sh
Executable file
@ -0,0 +1,214 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2010, 2012 Yu-Jie Lin
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
# this software and associated documentation files (the "Software"), to deal in
|
||||||
|
# the Software without restriction, including without limitation the rights to
|
||||||
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
# of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
# so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
BASHOAUTH_VERSION=0.1.2
|
||||||
|
|
||||||
|
OAuth_debug () {
|
||||||
|
# Print out all parameters, each in own line
|
||||||
|
[[ "$OAUTH_DEBUG" == "" ]] && return
|
||||||
|
local t=$(date +%FT%T.%N)
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
echo "[OAuth][DEBUG][$t] $1"
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_nonce () {
|
||||||
|
# Return a nonce
|
||||||
|
md5sum <<< "$RANDOM-$(date +%s.%N)" | cut -d' ' -f 1
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_timestamp () {
|
||||||
|
# Return timestamp
|
||||||
|
echo "$(date +%s)"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_PE () {
|
||||||
|
# Encode $1 using Percent-encoding as defined in
|
||||||
|
# http://tools.ietf.org/html/rfc5849#section-3.6
|
||||||
|
# Any character other than [a-zA-Z0-9-._~] is converted into format %XX
|
||||||
|
[ -n "$1" ] \
|
||||||
|
&& echo -n "$1" | perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg'
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_PE_file () {
|
||||||
|
# Encode a file $1 using Percent-encoding as defined in
|
||||||
|
# http://tools.ietf.org/html/rfc5849#section-3.6
|
||||||
|
# $1 a filename, not the content of file
|
||||||
|
perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg' < "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_params_string () {
|
||||||
|
# Sort the paramters and join them into one-line string
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
echo $1
|
||||||
|
shift 1
|
||||||
|
done | sort | tr '\n' '&' | sed 's/&$//'
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_base_string () {
|
||||||
|
# $1 method: "GET", "POST", etc
|
||||||
|
# $2 url
|
||||||
|
# $3-$N params
|
||||||
|
local method=$1
|
||||||
|
local url=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
local params_string=$(OAuth_params_string $@)
|
||||||
|
|
||||||
|
echo "$method&$(OAuth_PE "$url")&$(OAuth_PE "$params_string")"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_param () {
|
||||||
|
# Return a percent encoded key-value pair
|
||||||
|
# $1 key
|
||||||
|
# $2 value
|
||||||
|
echo "$(OAuth_PE "$1")=$(OAuth_PE "$2")"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_param_quote () {
|
||||||
|
# Return a percent encoded key-value pair, value is quoted
|
||||||
|
# $1 key
|
||||||
|
# $2 value
|
||||||
|
echo "$(OAuth_PE "$1")=\"$(OAuth_PE "$2")\""
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_param_file () {
|
||||||
|
# Return a percent encoded key-value pair, the value is an encoded file content
|
||||||
|
# $1 key
|
||||||
|
# $2 filename
|
||||||
|
echo "$(OAuth_PE "$1")=$(OAuth_PE_file "$2")"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_param_raw_value () {
|
||||||
|
# Return a percent encoded key-value pair, only key will be encoded by this function
|
||||||
|
# $1 key
|
||||||
|
# $2 value
|
||||||
|
echo "$(OAuth_PE "$1")=$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_HMAC_SHA1 () {
|
||||||
|
# Hash the text $1 with key $2
|
||||||
|
local text="$1"
|
||||||
|
local key="$2"
|
||||||
|
echo -n "$text" | openssl dgst -sha1 -binary -hmac "$key" | base64
|
||||||
|
}
|
||||||
|
|
||||||
|
_OAuth_signature () {
|
||||||
|
# Return the signature, note it's necessary to pass to OAuth_PE before add to header
|
||||||
|
# $1 signature_method
|
||||||
|
# $2 base_string
|
||||||
|
# $3 consumer_secret
|
||||||
|
# $4 token_secret
|
||||||
|
local signature_method="OAuth_${1//-/_}"
|
||||||
|
local base_string=$2
|
||||||
|
local c_secret=$3
|
||||||
|
local t_secret=$4
|
||||||
|
$signature_method "$base_string" "$c_secret&$t_secret"
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_signature () {
|
||||||
|
# Return the signature, note it's necessary to pass to OAuth_PE before add to header
|
||||||
|
# $1 base_string
|
||||||
|
_OAuth_signature "$oauth_signature_method" "$1" "$oauth_consumer_secret" "$oauth_token_secret"
|
||||||
|
}
|
||||||
|
|
||||||
|
_OAuth_authorization_header_params_string () {
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
echo -n "$(cut -d\= -f 1 <<< "$1")=\"$(cut -d\= -f 2 <<< "$1")\""
|
||||||
|
shift 1
|
||||||
|
# Use break to prevent error code being returned
|
||||||
|
(( $# > 0 )) && echo -n ', ' || break
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_OAuth_authorization_header () {
|
||||||
|
# Return header string
|
||||||
|
# $1 header key
|
||||||
|
# $2 OAuth realm, can be empty string
|
||||||
|
# $3 OAuth consumer key
|
||||||
|
# $4 OAuth consumer secret
|
||||||
|
# $5 OAuth token
|
||||||
|
# $6 OAuth token secret
|
||||||
|
# $7 OAuth signature method
|
||||||
|
# $8 OAuth version
|
||||||
|
# $9 nonce
|
||||||
|
# $10 timestamp
|
||||||
|
# $11 method
|
||||||
|
# $12 url
|
||||||
|
# $13-$N params
|
||||||
|
echo -n "$1: OAuth "
|
||||||
|
[[ "$2" != "" ]] && echo -n "realm=\"$2\", "
|
||||||
|
local oauth_consumer_key="$3"
|
||||||
|
local oauth_consumer_secret="$4"
|
||||||
|
local oauth_token="$5"
|
||||||
|
local oauth_token_secret="$6"
|
||||||
|
local oauth_signature_method="$7"
|
||||||
|
local oauth_version="$8"
|
||||||
|
local oauth_nonce="$9"
|
||||||
|
[[ "$oauth_nonce" == "" ]] && oauth_nonce="$(OAuth_nonce)"
|
||||||
|
local oauth_timestamp="${10}"
|
||||||
|
[[ "$oauth_timestamp" == "" ]] && oauth_timestamp="$(OAuth_timestamp)"
|
||||||
|
local method="${11}"
|
||||||
|
local url="${12}"
|
||||||
|
shift 12
|
||||||
|
local params=(
|
||||||
|
$(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
|
||||||
|
$(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
|
||||||
|
$(OAuth_param 'oauth_version' "$oauth_version")
|
||||||
|
$(OAuth_param 'oauth_nonce' "$oauth_nonce")
|
||||||
|
$(OAuth_param 'oauth_timestamp' "$oauth_timestamp")
|
||||||
|
)
|
||||||
|
[[ "$oauth_token" != "" ]] && params[${#params[@]}]=$(OAuth_param 'oauth_token' "$oauth_token")
|
||||||
|
local sign_params=${params[@]}
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
sign_params[${#sign_params[@]}]="$1"
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
local base_string=$(OAuth_base_string "$method" "$url" ${sign_params[@]})
|
||||||
|
local signature=$(_OAuth_signature "$oauth_signature_method" "$base_string" "$oauth_consumer_secret" "$oauth_token_secret")
|
||||||
|
params[${#params[@]}]=$(OAuth_param 'oauth_signature' "$signature")
|
||||||
|
_OAuth_authorization_header_params_string ${params[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth_authorization_header () {
|
||||||
|
# Return header string
|
||||||
|
# $1 header key
|
||||||
|
# $2 OAuth realm, can be empty string
|
||||||
|
# $3 OAuth nonce
|
||||||
|
# $4 OAuth timestamp
|
||||||
|
# $5 method
|
||||||
|
# $6 url
|
||||||
|
# $7-$N params
|
||||||
|
local header_key="$1"
|
||||||
|
local realm="$2"
|
||||||
|
local oauth_nonce="$3"
|
||||||
|
local oauth_timestamp="$4"
|
||||||
|
local method="$5"
|
||||||
|
local url="$6"
|
||||||
|
shift 6
|
||||||
|
local params=()
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
params[${#params[@]}]="$1"
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
_OAuth_authorization_header "$header_key" "$realm" "$oauth_consumer_key" "$oauth_consumer_secret" "$oauth_token" "$oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$oauth_nonce" "$oauth_timestamp" "$method" "$url" ${params[@]}
|
||||||
|
}
|
211
util/shred/shred
Executable file
211
util/shred/shred
Executable file
@ -0,0 +1,211 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2012 Fabio Comuni
|
||||||
|
# Copyright (c) 2010, 2012 Yu-Jie Lin
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
# this software and associated documentation files (the "Software"), to deal in
|
||||||
|
# the Software without restriction, including without limitation the rights to
|
||||||
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
# of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
# so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
FCLI_RC="$HOME/.shred.rc"
|
||||||
|
|
||||||
|
# Source Config
|
||||||
|
[[ -f "$FCLI_RC" ]] && . "$FCLI_RC" || show_config_help 1
|
||||||
|
|
||||||
|
# Source FriendicaOAuth.sh
|
||||||
|
OAuth_sh=$(which FriendicaOAuth.sh)
|
||||||
|
(( $? != 0 )) && echo 'Unable to locate FriendicaOAuth.sh! Make sure it is in searching PATH.' && exit 1
|
||||||
|
source "$OAuth_sh"
|
||||||
|
|
||||||
|
# Source JSON.sh
|
||||||
|
JSON_sh=$(which JSON.sh)
|
||||||
|
(( $? != 0 )) && echo 'Unable to locate JSON.sh! Make sure it is in searching PATH.' && exit 1
|
||||||
|
source "$JSON_sh"
|
||||||
|
|
||||||
|
|
||||||
|
usage () {
|
||||||
|
echo "usage: $0 options
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-h Show this message
|
||||||
|
|
||||||
|
-c Command
|
||||||
|
|
||||||
|
Valid Commands:
|
||||||
|
statuses_update
|
||||||
|
home_timeline
|
||||||
|
|
||||||
|
Use -h -c command to get options for the command.
|
||||||
|
"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
show_config_help () {
|
||||||
|
echo "Please create $FCLI_RC with:
|
||||||
|
redmatrix_url=YOR_SERVER_URL (no trailing /)
|
||||||
|
oauth_consumer_key=YOUR_CONSUMER_KEY
|
||||||
|
oauth_consumer_secret=YOUR_CONSUMER_SECRET
|
||||||
|
|
||||||
|
You can register new app consumer key and secret at
|
||||||
|
http://yourserver.com/settings/oauth
|
||||||
|
"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
show_statuses_update () {
|
||||||
|
echo "Command statuses_update
|
||||||
|
|
||||||
|
Requires:
|
||||||
|
-s status
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
-r in_reply_to_status_id
|
||||||
|
"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
show_home_timeline () {
|
||||||
|
echo "Command home_timeline"
|
||||||
|
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
#json helper
|
||||||
|
#
|
||||||
|
# usage:
|
||||||
|
# echo "$parsed_json" | js key1 [key2 [key3 ...]][,]
|
||||||
|
#
|
||||||
|
# echoes the value of json[key1][key2][key3], without surronding quotes
|
||||||
|
# with "," as last argument, no newline is printed
|
||||||
|
#
|
||||||
|
js () {
|
||||||
|
local arg
|
||||||
|
local rg='^\['
|
||||||
|
local ret
|
||||||
|
for arg in $@
|
||||||
|
do
|
||||||
|
[[ "$arg" == "," ]] && break;
|
||||||
|
if [[ $arg == ${arg//[0-9]/} ]]
|
||||||
|
then
|
||||||
|
rg="${rg}\"$arg\","
|
||||||
|
else
|
||||||
|
rg="${rg}$arg,"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
rg="${rg%?}\]"
|
||||||
|
ret=$(grep $rg | cut -f 2 | sed 's/^"\(.*\)"$/\1/' | sed "s/\\\\\//\//g" )
|
||||||
|
if [[ "$arg" == "," ]]
|
||||||
|
then
|
||||||
|
echo -e "$ret" | tr -d '\012\015'
|
||||||
|
else
|
||||||
|
echo -e "$ret"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
load_config () {
|
||||||
|
|
||||||
|
[[ "$oauth_consumer_key" == "" ]] && show_config_help 1
|
||||||
|
[[ "$oauth_consumer_secret" == "" ]] && show_config_help 1
|
||||||
|
|
||||||
|
|
||||||
|
FO_init
|
||||||
|
|
||||||
|
if [[ "$oauth_token" == "" ]] || [[ "$oauth_token_secret" == "" ]]; then
|
||||||
|
FO_access_token_helper
|
||||||
|
if (( $? == 0 )); then
|
||||||
|
oauth_token=${FO_ret[0]}
|
||||||
|
oauth_token_secret=${FO_ret[1]}
|
||||||
|
echo "oauth_token='${FO_ret[0]}'" >> "$FCLI_RC"
|
||||||
|
echo "oauth_token_secret='${FO_ret[1]}'" >> "$FCLI_RC"
|
||||||
|
echo "Token saved."
|
||||||
|
else
|
||||||
|
echo 'Unable to get access token'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main () {
|
||||||
|
load_config
|
||||||
|
|
||||||
|
fcli_command=
|
||||||
|
fcli_status=
|
||||||
|
fcli_in_reply_to_status_id=
|
||||||
|
fcli_file=
|
||||||
|
fcli_help_flag=
|
||||||
|
while getopts "c:s:r:f:h" name
|
||||||
|
do
|
||||||
|
case $name in
|
||||||
|
c) fcli_command="$OPTARG";;
|
||||||
|
s) fcli_status="$OPTARG";;
|
||||||
|
r) fcli_in_reply_to_status_id="$OPTARG";;
|
||||||
|
f) fcli_file="$OPTARG";;
|
||||||
|
h) fcli_help_flag="1";;
|
||||||
|
?) usage
|
||||||
|
exit 2;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$fcli_help_flag" == "1" ]]; then case $fcli_command in
|
||||||
|
statuses_update)
|
||||||
|
show_statuses_update 0
|
||||||
|
;;
|
||||||
|
home_timeline)
|
||||||
|
show_home_timeline 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
[[ "$fcli_command" == "" ]] && usage 0
|
||||||
|
usage 1
|
||||||
|
esac ; fi
|
||||||
|
|
||||||
|
case $fcli_command in
|
||||||
|
home_timeline)
|
||||||
|
FO_statuses_home_timeline 'json' '' 5
|
||||||
|
JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
|
||||||
|
for id in 0 1 2 3 4
|
||||||
|
do
|
||||||
|
echo "$JS_Parsed" | js $id "user" "name" ,
|
||||||
|
echo -n " - "
|
||||||
|
echo "$JS_Parsed" | js $id "created_at"
|
||||||
|
echo "$JS_Parsed" | js $id "text"
|
||||||
|
echo ""
|
||||||
|
echo "------------------------------------------------------------------------------"
|
||||||
|
done
|
||||||
|
|
||||||
|
return $FO_rval
|
||||||
|
;;
|
||||||
|
statuses_update)
|
||||||
|
[[ "$fcli_status" == "" ]] && show_statuses_update 1
|
||||||
|
FO_statuses_update 'json' "$fcli_status" "$fcli_in_reply_to_status_id"
|
||||||
|
JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
|
||||||
|
echo "$JS_Parsed" | js "user" "name" ,
|
||||||
|
echo -n " - "
|
||||||
|
echo "$JS_Parsed" | js "created_at"
|
||||||
|
echo "$JS_Parsed" | js "text"
|
||||||
|
echo ""
|
||||||
|
echo "------------------------------------------------------------------------------"
|
||||||
|
return $FO_rval
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
@ -1 +1 @@
|
|||||||
2013-09-15.437
|
2013-09-16.438
|
||||||
|
Reference in New Issue
Block a user