def navigateToURL(self, dimdimID, roomID, sessionID, encodedURL): # navigateToURL is called only from within a page. # so this is always for the 'current' resourceID originalURL = urllib.unquote(encodedURL) page = self.stateEngine.getCurrentPage(dimdimID) currentBaseURL = self.baseURL(page.get('url')) baseURL = self.baseURL(originalURL) if string.find(originalURL, osconfig.serverURL()) >= 0: # some pages don't have base injected (e.g. youtube) # these pages might give out relative links which # assume osconfig.serverURL() as the base URL. originalURL = string.lstrip(originalURL, osconfig.serverURL()) # it is possible that originalURL isn't an absolute link if string.find(originalURL, 'http://') != 0: # the only way originalURL isn't an absolute link is if # it belongs to the existing server. so we can # safely set baseURL to existing currentBaseURL baseURL = currentBaseURL originalURL = urlparse.urljoin(baseURL, originalURL) encodedURL = urllib.quote(originalURL) meeting = self.stateEngine.getMeeting(dimdimID) resourceID = meeting.get('currentResource') resource = self.stateEngine.getCurrentResource(dimdimID) lastPageNum = resource.get('lastPage') currentPageNum = resource.get('currentPage') if (currentPageNum != lastPageNum): self.stateEngine.trimResourceToCurrentPage(dimdimID) resourceType = self.stateEngine.getResourceType(dimdimID, resourceID) currentPageNum = currentPageNum + 1 # just create the page and return its location resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID) pagePath = os.path.join(resourcePath, str(currentPageNum)) presenterPagePath = os.path.join(pagePath, 'presenter') attendeePagePath = os.path.join(pagePath, 'attendee') if not os.path.isdir(presenterPagePath): os.makedirs(presenterPagePath) if not os.path.isdir(attendeePagePath): os.makedirs(attendeePagePath) tempStore = os.path.join(resourcePath, 'temp.html') try: os.remove(tempStore) except: pass retval = self.curlHandle.downloadToFileFromHTTPURL(encodedURL, tempStore) if len(retval) < 3: try: os.remove(tempStore) except: pass try: shutil.rmtree(pagePath) except: pass response = self.jsonObj.encode({'result' : False, 'error' : 7500}) return response.encode() if originalURL != retval: # must be a 302. this is our new URL originalURL = retval baseURL = self.baseURL(originalURL) encodedURL = urllib.quote(originalURL) htmlHandle = open(tempStore, 'r') htmlContent = htmlHandle.read() htmlHandle.close() htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL) self.prepareHtml(originalURL, htmlContent, presenterPagePath, attendeePagePath) try: os.remove(tempStore) except: pass # add this page to the stateMachine self.stateEngine.registerPage(dimdimID, originalURL) resource = self.stateEngine.getCurrentResource(dimdimID) lastPage = resource.get('lastPage') response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200}) return response.encode()
def createURLResource(self, dimdimID, roomID, sessionID, encodedURL, resourceID = '_default', resourceType = 'regular'): # createURLResource is only called for a fresh resource jsonError = jsonObject() jsonError.clearResponse() jsonError.add('result', 'false') jsonError.add('method', 'cacheURL') jsonError.add('error', '7500') meeting = self.stateEngine.getMeeting(dimdimID) if not meeting: # register the meeting first # ideally, this call should never come.. # meeting should be registered in listURLResources logManager.log('Detected that meeting ' + dimdimID + ' was never registered. This could mean that listURLResources was not called', logging.WARN) self.stateEngine.registerMeeting(dimdimID, '') self.stateEngine.registerMeeting(dimdimID, 'http://webmeeting.dimdim.com:80/dimdim/BookmarkCobResource.action') #return jsonError.jsonResponse() if resourceType != 'regular': resourceType = 'preloaded' if resourceID == '_default': resourceType = 'regular' # can't have preloaded resources with _default originalURL = urllib.unquote(encodedURL) baseURL = self.baseURL(originalURL) pageNum = '0' # duh! this is a new resource resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID) presenterPagePath = os.path.join(os.path.join(resourcePath, pageNum), 'presenter') attendeePagePath = os.path.join(os.path.join(resourcePath, pageNum), 'attendee') if not os.path.isdir(presenterPagePath): os.makedirs(presenterPagePath) if not os.path.isdir(attendeePagePath): os.makedirs(attendeePagePath) tempStore = os.path.join(resourcePath, 'temp.html') try: os.remove(tempStore) except: pass retval = self.curlHandle.downloadToFileFromHTTPURL(encodedURL, tempStore) if len(retval) < 3: try: shutil.rmtree(presenterPagePath) shutil.rmtree(attendeePagePath) os.remove(tempStore) except: pass return jsonError.jsonResponse() if originalURL != retval: # must be a 302. this is our new URL originalURL = retval baseURL = self.baseURL(originalURL) encodedURL = urllib.quote(originalURL) htmlHandle = open(tempStore, 'r') htmlContent = htmlHandle.read() htmlHandle.close() # inject baseURL htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL) self.prepareHtml(originalURL, htmlContent, presenterPagePath, attendeePagePath) # prepare cache presenterLocation = resourceType + '/' + resourceID + '/' + pageNum + '/presenter/content.html' presenterCache = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', presenterLocation) attendeeLocation = resourceType + '/' + resourceID + '/' + pageNum + '/attendee/content.html' attendeeCache = string.replace(self.attendeeCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', attendeeLocation) pCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'p_cache.html') pCacheHandle = open(pCacheLocation, 'wb') pCacheHandle.write(presenterCache) pCacheHandle.close() aCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'a_cache.html') aCacheHandle = open(aCacheLocation, 'wb') aCacheHandle.write(attendeeCache) aCacheHandle.close() # clean up try: os.remove(tempStore) except: pass # register everything self.stateEngine.registerResource(dimdimID, resourceID, resourceType) self.stateEngine.registerPage(dimdimID, originalURL) jsonSuccess = jsonObject() jsonSuccess.clearResponse() jsonSuccess.add('result', 'true') jsonSuccess.add('method', 'cacheURL') jsonSuccess.add('error', '7200') jsonSuccess.add('location', '/content/' + str(dimdimID)) return jsonSuccess.jsonResponse()
def formSubmit(self, paramDict): dimdimID = paramDict.pop('dimdimsl_dimdimID') roomID = paramDict.pop('dimdimsl_roomID') sessionID = paramDict.pop('dimdimsl_sessionID') method = paramDict.pop('dimdimsl_method') action = paramDict.pop('dimdimsl_action') originalAction = urllib.unquote(action) page = self.stateEngine.getCurrentPage(dimdimID) currentBaseURL = self.baseURL(page.get('url')) baseURL = self.baseURL(originalAction) if string.find(originalAction, osconfig.serverURL()) >= 0: # some pages don't have base injected (e.g. youtube) # these pages might give out relative links which # assume osconfig.serverURL() as the base URL. originalAction = string.lstrip(originalAction, osconfig.serverURL()) # it is possible that originalAction isn't an absolute link if string.find(originalAction, 'http://') != 0: # the only way originalAction isn't an absolute link is if # it belongs to the existing server. so we can # safely set baseURL to existing currentBaseURL baseURL = currentBaseURL originalAction = urlparse.urljoin(baseURL, originalAction) action = urllib.quote(originalAction) meeting = self.stateEngine.getMeeting(dimdimID) resourceID = meeting.get('currentResource') resource = self.stateEngine.getCurrentResource(dimdimID) lastPageNum = resource.get('lastPage') currentPageNum = resource.get('currentPage') if (currentPageNum != lastPageNum): self.stateEngine.trimResourceToCurrentPage(dimdimID) resourceType = self.stateEngine.getResourceType(dimdimID, resourceID) currentPageNum = currentPageNum + 1 # just create the page and return its location resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID) pagePath = os.path.join(resourcePath, str(currentPageNum)) presenterPagePath = os.path.join(pagePath, 'presenter') attendeePagePath = os.path.join(pagePath, 'attendee') if not os.path.isdir(presenterPagePath): os.makedirs(presenterPagePath) if not os.path.isdir(attendeePagePath): os.makedirs(attendeePagePath) tempStore = os.path.join(resourcePath, 'temp.html') try: os.remove(tempStore) except: pass retval = self.curlHandle.downloadToFileFromHTTPFormSubmit(action, method, paramDict, tempStore) if len(retval) < 3: try: os.remove(tempStore) except: pass try: shutil.rmtree(pagePath) except: pass response = self.jsonObj.encode({'result' : False, 'error' : 7500}) return response.encode() if originalAction != retval: # must be a 302. this is our new URL originalAction = retval baseURL = self.baseURL(originalAction) encodedURL = urllib.quote(originalAction) htmlHandle = open(tempStore, 'r') htmlContent = htmlHandle.read() htmlHandle.close() # inject baseURL and jquery.noConflict # TODO - WHAT IF BASE URL IS ALREADY THERE ?? htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL) self.prepareHtml(originalAction, htmlContent, presenterPagePath, attendeePagePath) try: os.remove(tempStore) except: pass # add this page to the stateMachine self.stateEngine.registerPage(dimdimID, originalAction) resource = self.stateEngine.getCurrentResource(dimdimID) lastPage = resource.get('lastPage') response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200}) return response.encode()