1 | #!/usr/bin/env python |
---|
2 | |
---|
3 | """ |
---|
4 | FCKeditor - The text editor for Internet - http://www.fckeditor.net |
---|
5 | Copyright (C) 2003-2009 Frederico Caldeira Knabben |
---|
6 | |
---|
7 | == BEGIN LICENSE == |
---|
8 | |
---|
9 | Licensed under the terms of any of the following licenses at your |
---|
10 | choice: |
---|
11 | |
---|
12 | - GNU General Public License Version 2 or later (the "GPL") |
---|
13 | http://www.gnu.org/licenses/gpl.html |
---|
14 | |
---|
15 | - GNU Lesser General Public License Version 2.1 or later (the "LGPL") |
---|
16 | http://www.gnu.org/licenses/lgpl.html |
---|
17 | |
---|
18 | - Mozilla Public License Version 1.1 or later (the "MPL") |
---|
19 | http://www.mozilla.org/MPL/MPL-1.1.html |
---|
20 | |
---|
21 | == END LICENSE == |
---|
22 | |
---|
23 | Connector for Python (CGI and WSGI). |
---|
24 | |
---|
25 | """ |
---|
26 | |
---|
27 | from time import gmtime, strftime |
---|
28 | import string |
---|
29 | |
---|
30 | def escape(text, replace=string.replace): |
---|
31 | """ |
---|
32 | Converts the special characters '<', '>', and '&'. |
---|
33 | |
---|
34 | RFC 1866 specifies that these characters be represented |
---|
35 | in HTML as < > and & respectively. In Python |
---|
36 | 1.5 we use the new string.replace() function for speed. |
---|
37 | """ |
---|
38 | text = replace(text, '&', '&') # must be done 1st |
---|
39 | text = replace(text, '<', '<') |
---|
40 | text = replace(text, '>', '>') |
---|
41 | text = replace(text, '"', '"') |
---|
42 | return text |
---|
43 | |
---|
44 | def convertToXmlAttribute(value): |
---|
45 | if (value is None): |
---|
46 | value = "" |
---|
47 | return escape(value) |
---|
48 | |
---|
49 | class BaseHttpMixin(object): |
---|
50 | def setHttpHeaders(self, content_type='text/xml'): |
---|
51 | "Purpose: to prepare the headers for the xml to return" |
---|
52 | # Prevent the browser from caching the result. |
---|
53 | # Date in the past |
---|
54 | self.setHeader('Expires','Mon, 26 Jul 1997 05:00:00 GMT') |
---|
55 | # always modified |
---|
56 | self.setHeader('Last-Modified',strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime())) |
---|
57 | # HTTP/1.1 |
---|
58 | self.setHeader('Cache-Control','no-store, no-cache, must-revalidate') |
---|
59 | self.setHeader('Cache-Control','post-check=0, pre-check=0') |
---|
60 | # HTTP/1.0 |
---|
61 | self.setHeader('Pragma','no-cache') |
---|
62 | |
---|
63 | # Set the response format. |
---|
64 | self.setHeader( 'Content-Type', content_type + '; charset=utf-8' ) |
---|
65 | return |
---|
66 | |
---|
67 | class BaseXmlMixin(object): |
---|
68 | def createXmlHeader(self, command, resourceType, currentFolder, url): |
---|
69 | "Purpose: returns the xml header" |
---|
70 | self.setHttpHeaders() |
---|
71 | # Create the XML document header |
---|
72 | s = """<?xml version="1.0" encoding="utf-8" ?>""" |
---|
73 | # Create the main connector node |
---|
74 | s += """<Connector command="%s" resourceType="%s">""" % ( |
---|
75 | command, |
---|
76 | resourceType |
---|
77 | ) |
---|
78 | # Add the current folder node |
---|
79 | s += """<CurrentFolder path="%s" url="%s" />""" % ( |
---|
80 | convertToXmlAttribute(currentFolder), |
---|
81 | convertToXmlAttribute(url), |
---|
82 | ) |
---|
83 | return s |
---|
84 | |
---|
85 | def createXmlFooter(self): |
---|
86 | "Purpose: returns the xml footer" |
---|
87 | return """</Connector>""" |
---|
88 | |
---|
89 | def sendError(self, number, text): |
---|
90 | "Purpose: in the event of an error, return an xml based error" |
---|
91 | self.setHttpHeaders() |
---|
92 | return ("""<?xml version="1.0" encoding="utf-8" ?>""" + |
---|
93 | """<Connector>""" + |
---|
94 | self.sendErrorNode (number, text) + |
---|
95 | """</Connector>""" ) |
---|
96 | |
---|
97 | def sendErrorNode(self, number, text): |
---|
98 | return """<Error number="%s" text="%s" />""" % (number, convertToXmlAttribute(text)) |
---|
99 | |
---|
100 | class BaseHtmlMixin(object): |
---|
101 | def sendUploadResults( self, errorNo = 0, fileUrl = '', fileName = '', customMsg = '' ): |
---|
102 | self.setHttpHeaders("text/html") |
---|
103 | "This is the function that sends the results of the uploading process" |
---|
104 | |
---|
105 | "Minified version of the document.domain automatic fix script (#1919)." |
---|
106 | "The original script can be found at _dev/domain_fix_template.js" |
---|
107 | return """<script type="text/javascript"> |
---|
108 | (function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})(); |
---|
109 | |
---|
110 | window.parent.OnUploadCompleted(%(errorNumber)s,"%(fileUrl)s","%(fileName)s","%(customMsg)s"); |
---|
111 | </script>""" % { |
---|
112 | 'errorNumber': errorNo, |
---|
113 | 'fileUrl': fileUrl.replace ('"', '\\"'), |
---|
114 | 'fileName': fileName.replace ( '"', '\\"' ) , |
---|
115 | 'customMsg': customMsg.replace ( '"', '\\"' ), |
---|
116 | } |
---|