# RGDS remote search by Gaz Davidson # a google remote desktop proxy RGDS_VERSION = "0.1" # I'll release this under the GPL, # once I've taken out the copyrighted google page source import string,cgi,time from os import curdir, sep from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import _winreg, urllib import win32com.client import time RGDS_SEARCHHEADER = """[###searchquery###] results from Remote Desktop Search
  
Web    Images    Groups    News    Froogle    Desktop    more »
  
 
 Searching \\\\###machinename###\\*:   ###resultcount### (###searchtime###s)
   Sorted by date
""" RGDS_SEARCHITEM = """
   ###filename###
###snippet###
\\\\###unc### - Open folder
""" RGDS_FOOTER = """""" RGDS_STARTPAGE = """Google Remote Desktop Search
Google Desktop Search

Web    Images    Groups    News    Froogle     Desktop    more »
 
  

Search \\\\###machinename###\*

Google Remote Desktop search v###version### by Gaz Davidson

""" RGDS_MACHINENAME = urllib.thishost() def RGDS_GetShares(SkipHidden=True): """ list of tuples = RGDS_GetShares() - returns whitelist of allowed shares """ # list of share tuples d = [] objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") objSWbemServices = objWMIService.ConnectServer(".","root\cimv2") colItems = objSWbemServices.ExecQuery("Select * from Win32_Share") for objItem in colItems: # skip hidden shares if (((objItem.Name[-1] != "$") or (SkipHidden == False)) and objItem.Status == "OK"): if len(objItem.Path) > 0: d.append( (objItem.Name,objItem.Path) ) return d RGDS_SHARES = RGDS_GetShares() def RGDS_GetSearchURL(): """ string = RGDS_GetSearchURL() queries registry for google desktop search url (security key) """ # open key x = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,"Software\\Google\\Google Desktop\\API") # recurse to get info s = (None,None,None) n=0; while s[0] != "search_url": s = _winreg.EnumValue(x,n) n+=1 # close key _winreg.CloseKey(x) # return the result return s[1] RGDS_SEARCH_URL = RGDS_GetSearchURL() def RGDS_DoSearch(string="",url=RGDS_SEARCH_URL): """ list of tuples = RGDS_DoSearch(string="",url=RGDS_SEARCH_URL) - Does a google desktop search, returning up to 64k results """ results = [] # parse the xml file (quick & dirty) fn = urllib.urlretrieve(url + string + '&format=xml&num=65535')[0] for line in open(fn): a=line.find("") if a != -1: title = line[a+7:-9] #print "title:",title else: a=line.find("<url>") if a != -1: link = line[a+5:-7] #print "url:",link else: a=line.find("<snippet>") if a != -1: try: snippet = line[a+9:-11].encode("latin-1") except: snippet = "**snippet contains unicode chars** unsupported atm" # finished this one... accept = False for n in RGDS_SHARES: #print link[0:len(n[1])] if n[1] == link[0:len(n[1])]: accept = True unc = RGDS_MACHINENAME + "\\" + n[0] + link[len(n[1]):] break if accept: results.append( (title ,unc,snippet ) ) return results def RGDS_BuildStartPage(): """ Builds the start page and returns as a string """ s = RGDS_STARTPAGE s = s.replace("###version###",RGDS_VERSION) s = s.replace("###machinename###",RGDS_MACHINENAME) return s def RGDS_BuildSearchPage(search=""): """ string = RGDS_BuildSearchPage(search="") - does the search and returns the page """ # start the clock t = time.time() # perform the search res = RGDS_DoSearch(search) # stop the clock t = time.time() - t s = RGDS_SEARCHHEADER s = s.replace("###searchquery###",search.replace("%20"," ")) s = s.replace("###machinename###",RGDS_MACHINENAME) s = s.replace("###resultcount###",str(len(res))) s = s.replace("###searchtime###","%.2f" % (t) ) for (title,link,snippet) in res: a = RGDS_SEARCHITEM a = a.replace("###filename###",title) a = a.replace("###unc###", link) a = a.replace("###uncpath###", string.join(link.split("\\")[:-1],("\\")) ) a = a.replace("###snippet###", snippet) s = s + a s = s + RGDS_FOOTER del res return s class MyWebHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type','text/html') self.end_headers() if len(self.path) <=2: # start page self.wfile.write(RGDS_BuildStartPage()) elif self.path == "favicon.ico": pass else: # search request j = self.path.find("q=") if j != -1: if self.path.find("&") != -1: q = self.path[j+2:self.path.find("&")].replace("+","%20") else: q = self.path[j+2:].replace("+","%20") if len(q) >=1: self.wfile.write(RGDS_BuildSearchPage(q)) else: self.wfile.write(RGDS_BuildStartPage()) else: self.wfile.write(RGDS_BuildStartPage()) def main(): try: print "Remote GDS ", RGDS_VERSION, "by Gaz Davidson <gaz@bitplane.net>" server = HTTPServer(('', 81), MyWebHandler) print 'started http server on port 81' server.serve_forever() except: print 'shutting down server :(' server.socket.close() if __name__ == '__main__': main()