<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3662250246964409286</id><updated>2011-04-21T18:44:07.716-07:00</updated><category term='myspace opensocial disaster'/><category term='myspace opensocial disaster source code superlatives honesty box'/><title type='text'>MySpace OpenSocial Disaster</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myspace-disaster.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3662250246964409286/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://myspace-disaster.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Abasi</name><uri>http://www.blogger.com/profile/13638814301713130440</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3662250246964409286.post-1836323268452947854</id><published>2008-03-14T15:58:00.000-07:00</published><updated>2008-03-14T16:34:58.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='myspace opensocial disaster source code superlatives honesty box'/><title type='text'>OpenSocial and Security - here is your source code for everyone to explore</title><content type='html'>Why is MySpace so anal about reviewing apps and suspending them for things that are allowed on other application platforms?&lt;div&gt;&lt;br /&gt;&lt;div&gt;Because OpenSocial is insecure. Yes, that's right, this javascript client-side technology exposes a lot of things. Want to see the ENTIRE source code of "Honesty Box" application? Easy! Install that app on MySpace and "view source" in your browser. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just to make it easy for you, I'll paste it here:&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:scroll;height:150px;border:1px solid #cccccc;font-size:10px;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;String.prototype.to_rfc3986 = function (){&lt;br /&gt; var tmp =  encodeURIComponent(this);&lt;br /&gt; tmp = tmp.replace('!','%21');&lt;br /&gt; tmp = tmp.replace('*','%2A');&lt;br /&gt; tmp = tmp.replace('(','%28');&lt;br /&gt; tmp = tmp.replace(')','%29');&lt;br /&gt; tmp = tmp.replace("'",'%27');&lt;br /&gt; return tmp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var ajaxServer = "www.honestybox.com";&lt;br /&gt;var views = new Array("inbox","outbox","message","write","messagesent","invite","settings");&lt;br /&gt;var tabs = new Array("tab_inbox","tab_outbox","tab_settings","tab_write");&lt;br /&gt;var ownerId = null;&lt;br /&gt;var viewerId = null;&lt;br /&gt;var viewerGender = null;&lt;br /&gt;var viewerFriends = null;&lt;br /&gt;var debugStatus = false;&lt;br /&gt;var msgid = 0;&lt;br /&gt;var msie = false;&lt;br /&gt;var classAttributeName = "class";&lt;br /&gt;var friendDictionary = {};&lt;br /&gt;var friendIdList = new Array();&lt;br /&gt;&lt;br /&gt;// for caching user friend information&lt;br /&gt;function User(userId, userName, userThumnail, userProfileURL,userGender){&lt;br /&gt;  this.UserId = userId;&lt;br /&gt;  this.UserName = userName;&lt;br /&gt;  this.UserThumbnail = userThumnail;&lt;br /&gt;  this.UserProfileURL = userProfileURL;&lt;br /&gt;  this.UserGender = userGender;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function loadUserData(){&lt;br /&gt;  var opt_params = {};&lt;br /&gt;  opt_params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = opensocial.Person.Field.GENDER;&lt;br /&gt;&lt;br /&gt;  var dataRequest = opensocial.newDataRequest();&lt;br /&gt;  var ownerRequest = dataRequest.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER);&lt;br /&gt;  var viewerRequest = dataRequest.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER, opt_params);&lt;br /&gt;  var viewerFriends = dataRequest.newFetchPeopleRequest(opensocial.DataRequest.Group.VIEWER_FRIENDS, opt_params);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // Check that viewer has app installed and hit with promo text / partner text&lt;br /&gt;  dataRequest.add(ownerRequest);&lt;br /&gt;  dataRequest.add(viewerRequest);&lt;br /&gt;  dataRequest.add(viewerFriends);&lt;br /&gt;  dataRequest.send(loadUserData_Callback);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function loadUserData_Callback(dataResponse){&lt;br /&gt;  if(!dataResponse.hadError()){&lt;br /&gt;     var ownerData = dataResponse.get(opensocial.DataRequest.PersonId.OWNER).getData();&lt;br /&gt;     ownerId = ownerData.getField(opensocial.Person.Field.ID);&lt;br /&gt;     var viewer = dataResponse.get(opensocial.DataRequest.PersonId.VIEWER);&lt;br /&gt;     if(viewer != null){&lt;br /&gt;        var viewerData = dataResponse.get(opensocial.DataRequest.PersonId.VIEWER).getData();&lt;br /&gt;        for(k in viewerData['fields_']){&lt;br /&gt;           renderStatus('Viewer: ' + k + ' = ' + viewerData['fields_'][k]);&lt;br /&gt;        }&lt;br /&gt;        viewerId = viewerData.getField(opensocial.Person.Field.ID);&lt;br /&gt;        viewerGender = viewerData.getField(opensocial.Person.Field.GENDER);&lt;br /&gt;     } else {&lt;br /&gt;         // user shouldn't be here!&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;      var currentUser = new User(viewerData.getField(opensocial.Person.Field.ID), viewerData.getField(opensocial.Person.Field.NAME), viewerData.getField(opensocial.Person.Field. THUMBNAIL_URL), viewerData.getField(opensocial.Person.Field.PROFILE_URL), viewerData.getField(opensocial.Person.Field.GENDER));&lt;br /&gt;&lt;br /&gt;     var friendsData = dataResponse.get(opensocial.DataRequest.Group.VIEWER_FRIENDS).getData();&lt;br /&gt;&lt;br /&gt;          friendsData.each(function(friendData){&lt;br /&gt;               var friendName = friendData.getField(opensocial.Person.Field.NAME);&lt;br /&gt;               var friendThumbnailUrl = friendData.getField(opensocial.Person.Field.THUMBNAIL_URL);&lt;br /&gt;               var friendId = friendData.getField(opensocial.Person.Field.ID);&lt;br /&gt;               var friendURL = friendData.getField(opensocial.Person.Field.PROFILE_URL);&lt;br /&gt;               var friendGender = friendData.getField(opensocial.Person.Field.GENDER);&lt;br /&gt;&lt;br /&gt;               var friendObj = new User(friendId, friendName, friendThumbnailUrl, friendURL, friendGender);&lt;br /&gt;               friendDictionary[friendId] = friendObj;&lt;br /&gt;               friendIdList.push(friendId);&lt;br /&gt;           });&lt;br /&gt;          &lt;br /&gt;           //Let's shove the current user into the "friendDictionary" so we can look him/her up without silly if login&lt;br /&gt;&lt;br /&gt;           friendDictionary[viewerId] = currentUser;&lt;br /&gt;&lt;br /&gt;     unrender('loading');&lt;br /&gt;     if(viewerId == ownerId){&lt;br /&gt;        render("navigation");&lt;br /&gt;        render("inbox");&lt;br /&gt;     } else {&lt;br /&gt;        render("navigation");&lt;br /&gt;        render("write");&lt;br /&gt;     }&lt;br /&gt;  } else {&lt;br /&gt;     unrender('loading');&lt;br /&gt;     renderError('Unable to determine who you are, if you have the application installed, refresh the page.');&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function surface(type){&lt;br /&gt;  var surface_type = new opensocial.Surface(type);&lt;br /&gt;  opensocial.requestNavigateTo(surface_type);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function render(view){&lt;br /&gt;  // just turn on these items, without adjusting others&lt;br /&gt;  if(view == "status"&lt;br /&gt;     || view == "error"&lt;br /&gt;     || view == "navigation"&lt;br /&gt;     ){&lt;br /&gt;     document.getElementById(view).setAttribute(classAttributeName,"visible");&lt;br /&gt;     return;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // make adjustments to other views&lt;br /&gt;  for(var i=0; i&amp;lt;views.length; i++){&lt;br /&gt;    if(view == views[i]){&lt;br /&gt;       document.getElementById(views[i]).setAttribute(classAttributeName,"visible");&lt;br /&gt;    } else {&lt;br /&gt;       document.getElementById(views[i]).setAttribute(classAttributeName,"invisible");&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // special case views&lt;br /&gt;  if(view == "write") {init_write(); setActiveTab('tab_write'); }&lt;br /&gt;  if(view == "inbox"){ init_inbox(); setActiveTab('tab_inbox'); }&lt;br /&gt;  if(view == "outbox") { init_outbox(); setActiveTab('tab_outbox'); }&lt;br /&gt;  if(view == "message") { init_message(); setActiveTab('tab_inbox'); }&lt;br /&gt;  if(view == "settings") { init_settings(); setActiveTab('tab_settings'); }&lt;br /&gt;  if(view == "invite") { init_settings(); setActiveTab('tab_invite'); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function unrender(view){&lt;br /&gt;  document.getElementById(view).setAttribute(classAttributeName,"invisible");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function setActiveTab(tab){&lt;br /&gt;  renderStatus('Changing to tab: ' + tab);&lt;br /&gt;  for(var i=0; i&amp;lt;tabs.length; i++){&lt;br /&gt;     if(tabs[i] == tab){&lt;br /&gt;        renderStatus('Turning ' + tab + ' on.');&lt;br /&gt;        document.getElementById(tabs[i]).setAttribute(classAttributeName,"active");&lt;br /&gt;     } else {&lt;br /&gt;        document.getElementById(tabs[i]).setAttribute(classAttributeName,"inactive");&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;  renderStatus('Done changing tabs!');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function renderStatus(msg){&lt;br /&gt;  if(debugStatus){&lt;br /&gt;     render("status");&lt;br /&gt;     var el = document.getElementById("status");&lt;br /&gt;     el.innerHTML = "&amp;lt;b&amp;gt;Status:&amp;lt;/b&amp;gt; " + msg + "&amp;lt;br /&amp;gt;" + el.innerHTML;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function renderError(msg){&lt;br /&gt;  renderStatus('renderError invoked');&lt;br /&gt;  render("error");&lt;br /&gt;  var el = document.getElementById("error");&lt;br /&gt;  el.innerHTML += "&amp;lt;b&amp;gt;Error:&amp;lt;/b&amp;gt; " + msg + "&amp;lt;br /&amp;gt;";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_inbox(){&lt;br /&gt;  renderStatus('init_inbox invoked');&lt;br /&gt;  var params = {};&lt;br /&gt;  ajaxRequest("inbox",init_inbox_callback,params);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_inbox_callback(data){&lt;br /&gt;  renderStatus('init_inbox_callback invoked');&lt;br /&gt;  var msgs = "";&lt;br /&gt;  var i=0;&lt;br /&gt;  for(i=0; i&amp;lt;data.messages.length;i++){&lt;br /&gt;     msgs += format_thread_message(data.messages[i], true, data.messages[i].gender, 750);&lt;br /&gt;  }&lt;br /&gt;  var el = document.getElementById("inbox_messages");&lt;br /&gt;  el.innerHTML = msgs;&lt;br /&gt;//   gadgets.window.adjustHeight();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_outbox(){&lt;br /&gt;  renderStatus('init_outbox invoked');&lt;br /&gt;  ajaxRequest("outbox",init_outbox_callback, {});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_outbox_callback(data){&lt;br /&gt;  renderStatus('init_outbox_callback invoked');&lt;br /&gt;  var msgs = "";&lt;br /&gt;  var i=0;&lt;br /&gt;  for(i=0; i&amp;lt;data.messages.length;i++){&lt;br /&gt;     msgs += format_thread_message(data.messages[i], true, data.messages[i].gender, 750, friendDictionary[data.messages[i].recipient].UserThumbnail);&lt;br /&gt;  }&lt;br /&gt;  var el = document.getElementById("outbox_messages");&lt;br /&gt;  el.innerHTML = msgs;&lt;br /&gt;//   gadgets.window.adjustHeight();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function read_message(id){&lt;br /&gt;  renderStatus("read_message invoked - reading message " + id);&lt;br /&gt;  msgid = id;&lt;br /&gt;  render("message");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_message(){&lt;br /&gt;  renderStatus("init_message invoked");&lt;br /&gt;  if(msgid &amp;gt; 0){&lt;br /&gt;     renderStatus('loading message ' + msgid);&lt;br /&gt;     // Reset message canvas&lt;br /&gt;     var el = document.getElementById('message_history');&lt;br /&gt;     el.innerHTML = "";&lt;br /&gt;     var params = {};&lt;br /&gt;     params.msgid = msgid;&lt;br /&gt;     ajaxRequest("thread",init_message_callback, params);&lt;br /&gt;  } else {&lt;br /&gt;     renderError("Invalid message");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_message_callback(data){&lt;br /&gt;  renderStatus("init_message_callback invoked");&lt;br /&gt;  var msgs = "";&lt;br /&gt;  var i=0;&lt;br /&gt;  var icon = null;&lt;br /&gt;  for(i=0; i&amp;lt;data.messages.length;i++){&lt;br /&gt;     msgs += format_thread_message(data.messages[i], false, data.messages[i].gender, 750, null);&lt;br /&gt;  }&lt;br /&gt;  var el = document.getElementById("message_history");&lt;br /&gt;  el.innerHTML = msgs;&lt;br /&gt;  var frm = document.getElementById('reply_message_form');&lt;br /&gt;//   gadgets.window.adjustHeight();&lt;br /&gt;  frm.message.focus();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ajaxRequest(method, callback_func, params){&lt;br /&gt;  // add some default values to the request&lt;br /&gt;  renderStatus('Preparing the request for owner ' + ownerId);&lt;br /&gt;  // params['surface'] = opensocial.Surface.getName();&lt;br /&gt;  var queryString = "method=" + method;&lt;br /&gt;  for (k in params) {&lt;br /&gt;     // queryString += "&amp;amp;" + k + "=" + encodeURIComponent(params[k]);&lt;br /&gt;     queryString += "&amp;amp;" + k + "=" + params[k].to_rfc3986();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // set the datasource location&lt;br /&gt;  var url = "http://" + ajaxServer + "/opensocial/ms_ajax.php?" + queryString + "&amp;amp;r=" + Math.random();&lt;br /&gt;&lt;br /&gt;  // set the opensocial params to sign the request and fetch JSON object&lt;br /&gt;  renderStatus("Setting opensocial call parameters");&lt;br /&gt;  var osParams = {};&lt;br /&gt;&lt;br /&gt;  osParams[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;&lt;br /&gt;  renderStatus("Making call to " + url);&lt;br /&gt;&lt;br /&gt;  gadgets.io.makeRequest(url, makeRequest_callback, osParams);&lt;br /&gt;&lt;br /&gt;  function makeRequest_callback(data){&lt;br /&gt;     renderStatus("Handling ajax response with typeof: " + typeof(data.data));&lt;br /&gt;     var json = gadgets.json.parse(data.data);&lt;br /&gt;     if(!json){&lt;br /&gt;        renderError("Error talking to server: " + json.ErrorMessage);&lt;br /&gt;     }&lt;br /&gt;     callback_func(json);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function init(){&lt;br /&gt;  renderStatus('Init invoked');&lt;br /&gt;  if(navigator.appName=="Microsoft Internet Explorer"){&lt;br /&gt;     msie = true;&lt;br /&gt;     classAttributeName = "className";&lt;br /&gt;     renderStatus('User agent appears to be IE');&lt;br /&gt;  }&lt;br /&gt;  render("loading");&lt;br /&gt;  loadUserData();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;init();&lt;br /&gt;&lt;br /&gt;function format_message(msg, sex){&lt;br /&gt;  renderStatus('format_message invoked');&lt;br /&gt;  var linked = true;&lt;br /&gt;  var strout = "";&lt;br /&gt;  strout += "&amp;lt;div class=\"message\"&amp;gt;";&lt;br /&gt;  strout += '&amp;lt;a href="#no_anchor" onclick="read_message(\'' + msg.msgid + '\');"&amp;gt;';&lt;br /&gt;  strout += msg.comment;&lt;br /&gt;  strout += "&amp;lt;/a&amp;gt;";&lt;br /&gt;  strout += "&amp;lt;/div&amp;gt;";&lt;br /&gt;  return strout;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function format_thread_message(msg, link , sex, width, icon){&lt;br /&gt;  renderStatus('format_thread_message invoked');&lt;br /&gt;  var columnWidth = width - 100;&lt;br /&gt;  var imgPrefix = "gray_";&lt;br /&gt;  var bgColor = "dddddd";&lt;br /&gt;  switch(sex){&lt;br /&gt;     case 'male':&lt;br /&gt;        imgPrefix = "blue_";&lt;br /&gt;        bgColor = "c1e6f6";&lt;br /&gt;        break;&lt;br /&gt;     case 'female':&lt;br /&gt;        imgPrefix = "pink_";&lt;br /&gt;        bgColor = "f9d9e6";&lt;br /&gt;        break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if(icon != "undefined" &amp;amp;&amp;amp; icon != null &amp;amp;&amp;amp; icon.substr(0,4) == "http"){&lt;br /&gt;     var img = icon;&lt;br /&gt;  } else {&lt;br /&gt;     var img = 'http://img.honestybox.com/logo/hb_circle_logo_' + imgPrefix + '50x50.png';&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  var strout = "";&lt;br /&gt;  strout += '&amp;lt;div class=\"message\" style="width:' + width + 'px;"&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;img src="' + img + '" alt="" border="0" style="float:left; padding-right:10px;" /&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;div style="float:right;"&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;table border="0" cellpadding="0" cellspacing="0" width="' + columnWidth + '"&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;tr&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td&amp;gt;&amp;lt;img src="http://img.honestybox.com/bubbles/' + imgPrefix + 'top_left.png" width="8" height="8" border="0" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td bgcolor="' + bgColor + '"&amp;gt;&amp;lt;img src="http://img.honestybox.com/images/clear.gif" width="' + (columnWidth - 16) + '" height="8" border="0" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td align="right"&amp;gt;&amp;lt;img src="http://img.honestybox.com/bubbles/' + imgPrefix + 'top_right.png" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;/tr&amp;gt;&amp;lt;table border="0" cellpadding="0" cellspacing="0" width="' + columnWidth + '"&amp;gt;&amp;lt;tr&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td colspan="3" bgcolor="' + bgColor + '"&amp;gt;&amp;lt;div style="padding:0px 8px;"&amp;gt;';&lt;br /&gt;  if(viewerId == msg.sender){&lt;br /&gt;     strout += "&amp;lt;b&amp;gt;You said:&amp;lt;/b&amp;gt; ";&lt;br /&gt;  }&lt;br /&gt;  if(link){&lt;br /&gt;     strout += '&amp;lt;a href="#no_anchor" onclick="read_message(\'' + msg.msgid + '\');"&amp;gt;';&lt;br /&gt;  }&lt;br /&gt;  if(typeof(msg) == "object"){&lt;br /&gt;     strout += msg.comment;&lt;br /&gt;  } else {&lt;br /&gt;     strout += msg;&lt;br /&gt;  }&lt;br /&gt;  if(link){&lt;br /&gt;     strout += '&amp;lt;/a&amp;gt;';&lt;br /&gt;  }&lt;br /&gt;  strout += '&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;/tr&amp;gt;&amp;lt;table border="0" cellpadding="0" cellspacing="0" width="' + columnWidth + '"&amp;gt;&amp;lt;tr&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td valign="top"&amp;gt;&amp;lt;img src="http://img.honestybox.com/bubbles/' + imgPrefix + 'bottom_left.png" border="0" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td valign="top"&amp;gt;&amp;lt;img src="http://img.honestybox.com/bubbles/' + imgPrefix + 'bottom_gradient.png" width="' + (columnWidth - 48) + '" height="9" border="0" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;td align="right" valign="top"&amp;gt;&amp;lt;img src="http://img.honestybox.com/bubbles/' + imgPrefix + 'bottom_right.png"  height="9" border="0" /&amp;gt;&amp;lt;/td&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;/tr&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;/table&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;/div&amp;gt;';&lt;br /&gt;  strout += '&amp;lt;br clear="all" /&amp;gt;';&lt;br /&gt;  strout += "&amp;lt;/div&amp;gt;";&lt;br /&gt;  return strout;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function init_write(){&lt;br /&gt;  renderStatus('Loading friend list');&lt;br /&gt;  var friend = null;&lt;br /&gt;  var id = null;&lt;br /&gt;  var el = document.getElementById("write_friends");&lt;br /&gt;  var strout = "";&lt;br /&gt;  for(id in friendDictionary){&lt;br /&gt;     friend = friendDictionary[id];&lt;br /&gt;     var comment_body = "Tell &amp;lt;b&amp;gt;" + friend.UserName + "&amp;lt;/b&amp;gt; what you really think...&amp;lt;br /&amp;gt;" + '&amp;lt;textarea name="message_' + friend.UserId + '" class="message" style="padding-bottom:5px; height:60px;"&amp;gt;&amp;lt;/textarea&amp;gt;'&lt;br /&gt;     strout += '&amp;lt;div id="f' + id + '"&amp;gt;';&lt;br /&gt;     strout += format_thread_message(comment_body, false , "unknown", 750, friend.UserThumbnail);&lt;br /&gt;     strout += '&amp;lt;/div&amp;gt;';&lt;br /&gt;  }&lt;br /&gt;  el.innerHTML = strout;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function send_messages(fe){&lt;br /&gt;  render("loading");&lt;br /&gt;  renderStatus("send_messagess invoked");&lt;br /&gt;  fe.form.submit_a.disabled = true;&lt;br /&gt;  fe.form.submit_b.disabled = true;&lt;br /&gt;  var params = {}&lt;br /&gt;  for(var i=0; i&amp;lt;fe.form.elements.length; i++){&lt;br /&gt;     if(fe.form.elements[i].name.substr(0,8) == "message_"){&lt;br /&gt;        params[fe.form.elements[i].name] = fe.form.elements[i].value;&lt;br /&gt;        fe.form.elements[i].value = "";&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;  ajaxRequest('message_new_multi', send_messages_callback, params);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function send_messages_callback(json){&lt;br /&gt;  renderStatus("send_messages_callback invoked.");&lt;br /&gt;  var frm = document.getElementById("new_message_form");&lt;br /&gt;  frm.submit_a.disabled = false;&lt;br /&gt;  frm.submit_b.disabled = false;&lt;br /&gt;  render("messagesent");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function reply_message(fe){&lt;br /&gt;  render("loading");&lt;br /&gt;  renderStatus("reply_message invoked");&lt;br /&gt;  fe.disabled = true;&lt;br /&gt;  fe.form.message.disabled = true;&lt;br /&gt;  var params = {}&lt;br /&gt;  params['threadid'] = msgid;&lt;br /&gt;  params['comment'] = fe.form.message.value;&lt;br /&gt;  ajaxRequest('message_reply',reply_message_callback,params);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function reply_message_callback(data){&lt;br /&gt;  renderStatus("reply_message_callback invoked.");&lt;br /&gt;  render("message");&lt;br /&gt;  var frm = document.getElementById('reply_message_form');&lt;br /&gt;  frm.message.disabled = false;&lt;br /&gt;  frm.message.value = "";&lt;br /&gt;  frm.button_send.disabled = false;&lt;br /&gt;  renderStatus("Form reset.");&lt;br /&gt;  read_message(msgid);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function init_settings(){&lt;br /&gt;  renderStatus("init_settings invoked");&lt;br /&gt;  ajaxRequest('settings',init_settings_callback,{});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init_settings_callback(data){&lt;br /&gt;  var i = 0;&lt;br /&gt;  unrender('loading');&lt;br /&gt;  renderStatus("init_settings_callback invoked.");&lt;br /&gt;  var frm = document.getElementById('settings_form');&lt;br /&gt;  frm.question.value = data.settings.status;&lt;br /&gt;  // set the gender from the data&lt;br /&gt;  for(i=0; i&amp;lt;frm.gender.options.length; i++){&lt;br /&gt;     if(frm.gender.options[i].value == data.settings.gender){&lt;br /&gt;        frm.gender.selectedIndex = i;&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function settings_save(fe){&lt;br /&gt;  renderStatus('settings_save invoked');&lt;br /&gt;  var params = {};&lt;br /&gt;  params['question'] = fe.form.question.value;&lt;br /&gt;  params['gender'] = fe.form.gender.options[fe.form.gender.selectedIndex].value;&lt;br /&gt;  ajaxRequest('settings_save',settings_save_callback, params);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function settings_save_callback(){&lt;br /&gt;  renderStatus('settings_save_callback invoked');&lt;br /&gt;  render('settings');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You think that's bad? It gets even &lt;span style="font-size:140%"&gt;worse&lt;/span&gt;. How about the ENTIRE server-side code for one of the top Facebook apps? Yes, SERVER-SIDE, entire PHP code, database schema and everything else. You don't have to be a hacker to get to it - those guys left a few holes open and OpenSocial exposed them all.&lt;br /&gt;&lt;br /&gt;Don't believe me? You can get it yourself if you like complete with all passwords and security keys, but here is an excerpt of their PHP code:&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:scroll;height:150px;border:1px solid #cccccc;font-size:10px;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;require 'config/myspace.php';&lt;br /&gt;require 'smarty.php';&lt;br /&gt;require 'database.php';&lt;br /&gt;require_once 'classes/Notable.php';&lt;br /&gt;require_once 'classes/User.php';&lt;br /&gt;require_once 'classes/People.php';&lt;br /&gt;require_once '../platform/Space.php';&lt;br /&gt;&lt;br /&gt;$_GET['criteria'] = in_array($_GET['criteria'], array('from', 'to', 'top')) ? $_GET['criteria'] : 'top';&lt;br /&gt;&lt;br /&gt;$current_user = User::get_current_user();&lt;br /&gt;$friends_notables = Notable::get_cached_data(array('Notable', 'list_friends_superlatives'), array($_GET['criteria'], $current_user));&lt;br /&gt;&lt;br /&gt;$ids = array();&lt;br /&gt;foreach ($friends_notables as $row)&lt;br /&gt;{&lt;br /&gt; foreach (array('to_user_id', 'from_user_id') as $field)&lt;br /&gt; {&lt;br /&gt;  if (FALSE == in_array($row[$field], $ids))&lt;br /&gt;  {&lt;br /&gt;   $ids[] = $row[$field];&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$people = People::get_many($ids);&lt;br /&gt;&lt;br /&gt;$smarty-&amp;gt;assign('friends_notables', $friends_notables);&lt;br /&gt;$smarty-&amp;gt;assign('people', $people);&lt;br /&gt;$smarty-&amp;gt;assign('criteria', $_GET['criteria']);&lt;br /&gt;$smarty-&amp;gt;display('friends.tpl');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And now, have fun using and developing OpenSocial applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3662250246964409286-1836323268452947854?l=myspace-disaster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myspace-disaster.blogspot.com/feeds/1836323268452947854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3662250246964409286&amp;postID=1836323268452947854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3662250246964409286/posts/default/1836323268452947854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3662250246964409286/posts/default/1836323268452947854'/><link rel='alternate' type='text/html' href='http://myspace-disaster.blogspot.com/2008/03/opensocial-and-security-here-is-your.html' title='OpenSocial and Security - here is your source code for everyone to explore'/><author><name>Abasi</name><uri>http://www.blogger.com/profile/13638814301713130440</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3662250246964409286.post-7400851030401150985</id><published>2008-03-14T15:40:00.001-07:00</published><updated>2008-12-10T13:47:00.781-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='myspace opensocial disaster'/><title type='text'>MySpace OpenSocial Disaster</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SaAAG0moPoY/R9sCIvy73fI/AAAAAAAAAAM/p4Sqf7rdKXM/s1600-h/Picture+1.png"&gt;&lt;img style="float:left; margin:0 5px 5px 0;cursor:pointer; cursor:hand;padding:20px;" src="http://3.bp.blogspot.com/_SaAAG0moPoY/R9sCIvy73fI/AAAAAAAAAAM/p4Sqf7rdKXM/s320/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5177734545884831218" /&gt;&lt;/a&gt;&lt;br /&gt;It's been less than 24 hours since MySpace OpenSocial platform opened their doors. While Facebook and Bebo value their developers, provide support and rely on their feedback, MySpace is obviously different.&lt;br /&gt;&lt;br /&gt;So what do we have so far?&lt;br /&gt;&lt;br /&gt;- Angry developers complaining about the fact that MySpace "suspended" their applications without explanation. Some received vague reasons for their apps being denied, like:&lt;br /&gt;&lt;br /&gt;"Application logo violates copy rights issue. This logo is belong to google talk."&lt;br /&gt;"Ads in the application navigate the site away from MySpace"&lt;br /&gt;"Application is not working fine."&lt;br /&gt;&lt;br /&gt;Judging by not-so-perfect English it looks like the review process was outsourced overseas?&lt;br /&gt;&lt;br /&gt;According to the developer community forum there is no way to edit/test or re-submit suspended applications right away.&lt;br /&gt;&lt;br /&gt;Great start.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3662250246964409286-7400851030401150985?l=myspace-disaster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myspace-disaster.blogspot.com/feeds/7400851030401150985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3662250246964409286&amp;postID=7400851030401150985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3662250246964409286/posts/default/7400851030401150985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3662250246964409286/posts/default/7400851030401150985'/><link rel='alternate' type='text/html' href='http://myspace-disaster.blogspot.com/2008/03/myspace-opensocial-disaster.html' title='MySpace OpenSocial Disaster'/><author><name>Abasi</name><uri>http://www.blogger.com/profile/13638814301713130440</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SaAAG0moPoY/R9sCIvy73fI/AAAAAAAAAAM/p4Sqf7rdKXM/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
