メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月14日火曜日

[Apache Shindig][お勉強][OpenSocial] メモ48 opensocial.requestPermissionを実装してみた

Shindigデフォルトだと、requestPermissionは必ず


opensocial.ResponseItem.Error.UNAUTHORIZED

が返ってくる。

ちっとも面白くないので、実装してみた。

実装手順は以下のとおり。

1) features/opensocial-jsonrpc/jsonrpccontainer.jsを拡張し、requestPermissionの際はサーバに問い合わせるようにする。
2) サーバ側を実装する。

そんだけ。jsonrpcじゃないけど、とりあえず。
正しい手順かどうかは知らない。

で、jsonrpccontainer.js。

JsonRpcContainer.prototype.requestPermissionUrl_ = 'container/requestPermission.json';
JsonRpcContainer.prototype.requestPermission = function(permissions, reason, opt_callback) {
var ret = {};
var token = shindig.auth.getSecurityToken();
if (window.confirm("ガジェットがあなたのプロフィール情報の使用許可を求めています。\n【理由】" + reason + "\nここで許可するとあなたの全プロフィール情報が利用可能になり
ます。許可しますか?")) {
var parm = {};
parm.permission = permissions;
parm.st = token;
$.ajax({
type: "GET",
url: this.requestPermissionUrl_,
cache: false,
async: false,
data: parm,
dataType: 'json',
success: function(json) {
ret.result = json;
}
});
if (ret.result.errorCode === 'OK') {
opt_callback(new opensocial.ResponseItem(
null, null, null, null));
return;
}
}
opt_callback(new opensocial.ResponseItem(
null, null, opensocial.ResponseItem.Error.UNAUTHORIZED, null));
};


JavaScript要勉強。とりあえずはこんな感じで。

で、Java側。
環境はShindig+SpringFramework2.5(Java)。
まずはコントローラ。

/**
* opensocial.requestPermissionのサーバ側実装.
*
* @author Atsushi Konno(QSDN
*/
public class RequestPermissionController extends AbstractController {

protected final Log logger = LogFactory.getLog(RequestPermissionController.class);
protected String viewName = "";

protected Logic logic;
private HttpUserSessionService session;

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("パーミッション要求コントローラ開始");
String[] permissions = RequestUtils.getRequiredStringParameters(request, "permission");

if (logger.isDebugEnabled()) {
for (int ii=0, length = permissions.length; ii<length; ii++) {
logger.info("permission:[" + permissions[ii] + "]");
}
}
SecurityToken token = logic.getSecurityToken(request);
long moduleId = token.getModuleId();

String sessionId = null;
try {
sessionId = session.getId(request);
}
catch (UserSessionTimeOutException utoe) {
}
ModelAndView mav = new ModelAndView(viewName);


if (logic.requestPermission(sessionId, moduleId, permissions)) {
mav.addObject("errorCode", "OK");
}
else {
mav.addObject("errorCode", "NG");
}

logger.info("パーミッション要求コントローラ終了");

return mav;
}


public Logic getLogic() {
return logic;
}
public void setLogic(Logic logic) {
this.logic = logic;
}

/**
* Get viewName.
*
* @return viewName as String.
*/
public String getViewName() {
return viewName;
}

/**
* Set viewName.
*
* @param viewName the value to set.
*/
public void setViewName(String viewName) {
this.viewName = viewName;
}

/**
* Get session.
*
* @return session as HttpUserSessionService.
*/
public HttpUserSessionService getSession() {
return session;
}

/**
* Set session.
*
* @param session the value to set.
*/
public void setSession(HttpUserSessionService session) {
this.session = session;
}
}


とりあえずはこんな感じ。

で、そのJSP。

{
"errorCode": "${errorCode}"
}


そんだけ。

で、本体のlogic。

/**
* opensocial.requestPermissionに対応するサーバ側実装
*
* @param sessionId sessionId
* @param moduleId ガジェットのID
* @param permissions パーミッションの配列
*/
public boolean requestPermission(String sessionId, long moduleId, String[] permissions) throws DataAccessException {
assert sessionId != null;
assert permissions != null && permissions.length == 1;

GmsPerson viewer = getUser();
if (viewer == null) {
if (logger.isDebugEnabled()) {
logger.debug("Guestユーザのため、requestPermissionできない");
}
return false;
}

/*=======================================================================*/
/* ロック */
/*=======================================================================*/
gmsPersonDao.select(viewer.getId(), true);
/*=======================================================================*/
/* すでにrequestPermissionされているか. */
/*=======================================================================*/
for (int ii=0, length = permissions.length; ii<length; ii++) {
try {
gmsSessionPermitDao.selectBySessionIdAndModuleIdAndPermission(sessionId, moduleId, permissions[ii]);
}
catch (ObjectRetrievalFailureException ex) {
GmsSessionPermit permit = new GmsSessionPermit();
permit.setId(UuidGenerator.compress(UuidGenerator.generate()));
permit.setSessionId(sessionId);
permit.setModuleId(moduleId);
permit.setPermission(permissions[ii]);
permit.setCreatedAt(new Timestamp(System.currentTimeMillis()));
gmsSessionPermitDao.insert(permit);
}
}

return true;
}


gmsSessionPermitテーブルは、qurtzなんかで定期的に削除。ログアウトしても削除。
GuestはrequestPermissionしてもなにもしない。
viewerは現在ログイン中のユーザかもしくはGuestユーザ。
viewerがGuestで無い場合は、viewerでロック。

で、動かした。

それっぽく動いた。
そんだけ。

--
ガジェットXMLは、

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="opensocial.requestPermission()">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html"><![CDATA[
<h1>opensocial.requestPermission()</h1>
<div id='env'></div>
<script type="text/javascript">

if (opensocial.hasPermission(opensocial.Permission.VIEWER)) {
$('#env').append('<h1>許可されてるよぉーん</h1>');
}
else {
$('#env').append('<h1>許可されてないよーん</h1>');
opensocial.requestPermission([opensocial.Permission.VIEWER],
"なんとなく",
function(/*pensocial.ResponseItem*/res) {
if (res.hadError()) {
switch(res.getErrorCode()) {
case opensocial.ResponseItem.Error.NOT_IMPLEMENTED :
$('#env').append('<h1>NOT IMPLEMENTEDだってさ</h1>');
break;
default:
$('#env').append('<h1>' + res.getErrorMessage() + 'だってさ</h1>');
break;
}
}
else {
$('#env').append('<h1>うまくいったっぽいよーん</h1>');
}
});
}
</script>
]]>
</Content>
</Module>



.

0 コメント: