#!/usr/bin/env python
import os
+import subprocess
import sys
+import unicodedata
+from canari.utils.fs import fmutex
from pkg_resources import resource_filename
from distutils.dist import Distribution
from canari.config import CanariConfigParser
import threading
+
+
def synchronized(func):
func.__lock__ = threading.RLock()
print('Could not automatically find Maltego\'s settings directory. Use the -w parameter to specify its location, instead.')
+def to_utf8(s):
+ return unicodedata.normalize('NFKD', unicode(s)).encode('ascii', 'ignore')
+
+
def detect_settings_dir():
d = None
if sys.platform.startswith('linux'):
return d
+def sudo(args):
+ p = subprocess.Popen([os.path.join(get_bin_dir(), 'pysudo')] + args, stdin=subprocess.PIPE)
+ p.communicate()
+ return p.returncode
+
+
def read_template(name, values):
t = Template(file(resource_filename('canari.resources.template', '%s.plate' % name)).read())
return t.substitute(**values)
from argparse import ArgumentParser
from traceback import format_exc
-from canari.maltego.message import MaltegoException, MaltegoTransformResponseMessage
-from common import croak, import_transform, cmd_name, console_message, fix_binpath
+from canari.maltego.message import MaltegoException, MaltegoTransformResponseMessage, UIMessage
+from common import croak, import_transform, cmd_name, console_message, fix_binpath, sudo
from canari.maltego.utils import onterminate, parseargs
from canari.config import config
__credits__ = []
__license__ = 'GPL'
-__version__ = '0.2'
+__version__ = '0.3'
__maintainer__ = 'Nadeem Douba'
__email__ = 'ndouba@gmail.com'
__status__ = 'Development'
m = import_transform(transform)
if os.name == 'posix' and hasattr(m.dotransform, 'privileged') and os.geteuid():
- os.execvp('sudo', ['sudo'] + list(sys.argv))
- exit(-1)
+ rc = sudo(sys.argv)
+ if rc == 1:
+ console_message(MaltegoTransformResponseMessage() + UIMessage('User cancelled transform.'))
+ elif rc == 2:
+ console_message(MaltegoTransformResponseMessage() + UIMessage('Too many incorrect password attempts.'))
+ elif rc:
+ console_message(MaltegoTransformResponseMessage() + UIMessage('Unknown error occurred.'))
+ exit(rc)
if hasattr(m, 'onterminate'):
onterminate(m.onterminate)
from argparse import ArgumentParser
from traceback import format_exc
-from canari.maltego.message import MaltegoException, MaltegoTransformResponseMessage
-from common import cmd_name, import_transform, fix_binpath, get_bin_dir
+from canari.maltego.message import MaltegoException, MaltegoTransformResponseMessage, UIMessage
+from common import cmd_name, import_transform, fix_binpath, get_bin_dir, sudo
from canari.maltego.utils import onterminate, parseargs, croak, message
from canari.config import config
__credits__ = []
__license__ = 'GPL'
-__version__ = '0.2'
+__version__ = '0.3'
__maintainer__ = 'Nadeem Douba'
__email__ = 'ndouba@gmail.com'
__status__ = 'Development'
m = import_transform(transform)
if os.name == 'posix' and hasattr(m.dotransform, 'privileged') and os.geteuid():
-# Keep it for another day
-# if platform == 'darwin':
-# execvp(
-# 'osascript',
-# ['osascript', '-e', 'do shell script "%s" with administrator privileges' % ' '.join(sys.argv)]
-# )
-# if sys.platform.startswith('linux') and path.exists("/usr/bin/gksudo"):
-# execvp('/usr/bin/gksudo', ['/usr/bin/gksudo'] + list(sys.argv))
-# else:
- os.execvp(pysudo, [pysudo] + list(sys.argv))
- exit(-1)
+ rc = sudo(sys.argv)
+ if rc == 1:
+ message(MaltegoTransformResponseMessage() + UIMessage('User cancelled transform.'))
+ elif rc == 2:
+ message(MaltegoTransformResponseMessage() + UIMessage('Too many incorrect password attempts.'))
+ elif rc:
+ message(MaltegoTransformResponseMessage() + UIMessage('Unknown error occurred.'))
+ exit(0)
if hasattr(m, 'onterminate'):
onterminate(m.onterminate)
#!/usr/bin/env python
-from canari.easygui import passwordbox
-from canari.utils.fs import fmutex
-
-from pexpect import spawn, EOF
-from sys import argv, stderr
-from os import execvp
+import sys
+import subprocess
+from canari.utils.fs import fmutex
+from canari.easygui import passwordbox
__author__ = 'Nadeem Douba'
__copyright__ = 'Copyright 2012, Canari Project'
__credits__ = []
__license__ = 'GPL'
-__version__ = '0.1'
+__version__ = '0.2'
__maintainer__ = 'Nadeem Douba'
__email__ = 'ndouba@gmail.com'
__status__ = 'Development'
def main():
- if len(argv) == 1:
- print 'usage: %s <command>' % argv[0]
+ if not sys.argv[1:]:
+ print 'usage: %s <command>' % sys.argv[0]
exit(-1)
- child = None
+ l = fmutex('pysudo.lock')
- try:
- l = fmutex('pysudo.lock')
- child = spawn('sudo -S echo start')
- while not child.expect(['Password:', 'start']):
- password = passwordbox('Please enter your password.', 'sudo', '')
- child.sendline(password)
- del l
- execvp('sudo', ['sudo'] + argv[1:])
+ p = subprocess.Popen(['sudo', '-S'] + sys.argv[1:], stdin=subprocess.PIPE, stderr=subprocess.PIPE)
+ p.communicate()
- except EOF:
- stderr.write(child.before)
- except TypeError:
- stderr.write('Terminated.')
- except Exception, e:
- stderr.write(str(e))
+ if not p.returncode:
+ exit(0)
+ for i in range(0, 3):
+ password = passwordbox('Please enter your password.', 'sudo', '')
+ if password is None:
+ exit(1)
+ p = subprocess.Popen(['sudo', '-S'] + sys.argv[1:], stdin=subprocess.PIPE)
+ p.communicate(input='%s\n' % password)
+ if not p.returncode:
+ exit(0)
+ exit(2)
if __name__ == '__main__':
main()