# 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
| Searching \\\\###machinename###\\*: ###resultcount### (###searchtime###s) |
"""
RGDS_SEARCHITEM = """"""
RGDS_FOOTER = """"""
RGDS_STARTPAGE = """Google Remote Desktop Search
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("")
if a != -1:
link = line[a+5:-7]
#print "url:",link
else:
a=line.find("")
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 "
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()