source: superlime/Superlime.py

Last change on this file was 14251e4, checked in by azubr <github@…>, 5 years ago

Fix for separate admin user on Windows

  • Property mode set to 100644
File size: 3.1 KB
Line 
1# Superlime - Requests root/admin rights if a file cannot be saved in SublimeText
2# Copyright (C) 2013 Alexey Zubritsky
3
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17import sublime, sublime_plugin, subprocess, os, tempfile, re, binascii
18
19class Superlime(sublime_plugin.EventListener):
20        lineEndings = {'Windows': '\r\n', 'Unix': '\n', 'CR': '\r'}
21        hadSavingError = False
22
23        def on_activated(self, view):
24                hadSavingError = self.hadSavingError
25                self.hadSavingError = False
26                if hadSavingError and sublime.ok_cancel_dialog("Do you want to save file as %s?" % (self.getAdminName()), "Yes"):
27                        content = view.substr(sublime.Region(0, view.size()))
28                        tempFile = tempfile.NamedTemporaryFile(delete=False)
29                        encoding = view.encoding()
30                        encoding = re.sub(r'.*\((.*)\)', r'\1', encoding) \
31                                                .replace("Windows ", "cp") \
32                                                .replace("cp ", "cp") \
33                                                .replace("ISO ", "iso-") \
34                                                .replace("Mac ", "mac") \
35                                                .replace("KOI8-", "koi8_") \
36                                                .replace("UTF-16 ", "utf_16_") \
37                                                .replace("UTF-8 ", "utf_8") \
38                                                .lower()
39                        try:
40                                encoded = content.replace('\n', self.lineEndings[view.line_endings()]).encode(encoding) if encoding != "Hexadecimal" else binascii.unhexlify(string.replace(" ",""))
41                                tempFile.write(encoded)
42                        finally:
43                                tempFile.close()
44
45                        #print view.file_name(), ": Saved temp file with encoding " + encoding
46
47                        oldScratch = view.is_scratch()
48                        view.set_scratch(True)
49                        self.copyFile(tempFile.name, view.file_name())
50                        view.run_command('revert')
51                        sublime.set_timeout(lambda: view.set_scratch(oldScratch), 50)
52                        os.remove(tempFile.name)
53
54        def on_post_save(self, view):
55                self.hadSavingError = view.is_dirty()
56
57        def getAdminName(self):
58                if os.name == "nt":
59                        return "administrator"
60                else:
61                        return "root"
62
63        def copyFile(self, source, target):
64                if os.name == "nt":
65                        command = 'copy /y `\\"%s`\\" `\\"%s`\\"' % (source, target)
66                        runasCommand = '$proc = start-process \\"$env:windir\system32\cmd.exe\\" \\"/c,%s\\" -verb RunAs -WindowStyle Hidden -WorkingDirectory $env:windir -Passthru; do {start-sleep -Milliseconds 100} until ($proc.HasExited)' % command
67                        psCommand = 'powershell -command "%s"' % runasCommand
68                        subprocess.call(psCommand, shell=True)
69                if os.name == "posix":
70                        trySudo = lambda sudo: subprocess.call('%s dd if=%s of=%s' % (sudo, source, target), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
71                        if trySudo("pkexec") == 127:
72                                if trySudo("gksudo") == 127:
73                                        if trySudo("kdesudo"):
74                                                sublime.message_dialog("No sudo GUI found")
75
76
77                       
78
Note: See TracBrowser for help on using the repository browser.