"""
IncludeExternalFile macro

Outputs the external file's content.

Usage:

<<IncludeExternalFile(externalfilename)>>
<<IncludeExternalFile(externalfilename, coding)>>

Note: please set IncludeExternalFileRoot in your wiki config for security reasons.

@copyright: originally by Albert Ma  http://www.ieasy.org,
            refactored by MoinMoin:ThomasWaldmann
license: GNU GPL, see COPYING for details
"""

import os, codecs


def macro_IncludeExternalFile(macro, fname=u'', coding='utf-8'):
    if ".." in fname:
        return u"Invalid argument - .. is not allowed."
    abs_fname = os.path.join(macro.request.cfg.IncludeExternalFileRoot, fname)
    try:
        f = codecs.open(abs_fname, "r", coding)
    except IOError:
        result = u"Can't not open %s." % abs_fname # discloses internal path
    else:   
        result = f.read()
        f.close()
    return result

