Compare commits
135 Commits
v1.8.0-bet
...
v1.8.0rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12e5306947 | ||
|
|
9249d6c2f9 | ||
|
|
d0f07ee3a9 | ||
|
|
3992fba168 | ||
|
|
4601ac8b0e | ||
|
|
a81b0db2a8 | ||
|
|
d88751bb8b | ||
|
|
f13dfc19a0 | ||
|
|
0fccf5e50d | ||
|
|
a2aab28ba6 | ||
|
|
8e7b7caf04 | ||
|
|
8cc5ff0e70 | ||
|
|
9086f09fe2 | ||
|
|
5a6eecd694 | ||
|
|
efe9f1b442 | ||
|
|
db7919dc2f | ||
|
|
4a01644625 | ||
|
|
1ca68140f6 | ||
|
|
071177cee2 | ||
|
|
c88742fad3 | ||
|
|
791a0fd01e | ||
|
|
3b12b9d81d | ||
|
|
31e4009737 | ||
|
|
8746914f3b | ||
|
|
2fa6839ac7 | ||
|
|
b09e08c06f | ||
|
|
659f5ad301 | ||
|
|
6fe7f01a8d | ||
|
|
99f51998f2 | ||
|
|
4c13992f5d | ||
|
|
396f38598f | ||
|
|
b6e24cbd45 | ||
|
|
d2848b9c26 | ||
|
|
227ed8ae07 | ||
|
|
b622981b23 | ||
|
|
36e14cfc69 | ||
|
|
668de9bf31 | ||
|
|
3f712dce02 | ||
|
|
2eaeaf33fa | ||
|
|
8e21d612d8 | ||
|
|
398bca9fe4 | ||
|
|
07e60b9161 | ||
|
|
46d5d22f72 | ||
|
|
97c221d860 | ||
|
|
a5d29e6d56 | ||
|
|
4662f59577 | ||
|
|
131cf63d8d | ||
|
|
4d85f1daec | ||
|
|
f913cd97ee | ||
|
|
ccbeb86140 | ||
|
|
b43e0f5ebd | ||
|
|
b3c82fd7b6 | ||
|
|
15a60bb359 | ||
|
|
fe574dbbf9 | ||
|
|
7595c7e697 | ||
|
|
bd6769a3fd | ||
|
|
dc2a919e75 | ||
|
|
c20fc24f4d | ||
|
|
5f8af4527e | ||
|
|
80f3c7584b | ||
|
|
05624e3fc8 | ||
|
|
e381143a8f | ||
|
|
b03209ccef | ||
|
|
ec03ebd69f | ||
|
|
ff68caac24 | ||
|
|
51c617801d | ||
|
|
e53290088f | ||
|
|
4f7c062f3f | ||
|
|
8507aba9f8 | ||
|
|
d8b6e00fe7 | ||
|
|
c8167b77c9 | ||
|
|
c37792f58f | ||
|
|
842e5ba5e0 | ||
|
|
10d28292c6 | ||
|
|
506cc3908a | ||
|
|
ca00b02b0a | ||
|
|
201075827f | ||
|
|
961623d388 | ||
|
|
a98ab6f51d | ||
|
|
5c7fd24ea8 | ||
|
|
76ac628153 | ||
|
|
6f71bd9353 | ||
|
|
f88398e776 | ||
|
|
ed315f54e3 | ||
|
|
08c33cd1dc | ||
|
|
0464947610 | ||
|
|
1929040bb7 | ||
|
|
3af936c8a1 | ||
|
|
3bd48c1b3f | ||
|
|
298ca552c8 | ||
|
|
5dcc6a16ee | ||
|
|
318b858ce6 | ||
|
|
6c09764b35 | ||
|
|
96501322fa | ||
|
|
b1e9a74cc2 | ||
|
|
f38aa698eb | ||
|
|
366f3f68b8 | ||
|
|
276dd50650 | ||
|
|
defd6180c6 | ||
|
|
03e23da6a3 | ||
|
|
2ddaf5a06a | ||
|
|
5e1aa7d383 | ||
|
|
e1871eb325 | ||
|
|
66fc8e9e27 | ||
|
|
3259cf59f5 | ||
|
|
c6442f67c1 | ||
|
|
1998b602b9 | ||
|
|
193fca4a8b | ||
|
|
9659d0bdc7 | ||
|
|
ccf4298c81 | ||
|
|
0b461e2275 | ||
|
|
4f4ae5861a | ||
|
|
fedf368c7a | ||
|
|
c5f78fab51 | ||
|
|
56a907128a | ||
|
|
fb77cd5f7e | ||
|
|
99d674c346 | ||
|
|
9690ca0198 | ||
|
|
9351c7485f | ||
|
|
d43b82dc82 | ||
|
|
ce195bd599 | ||
|
|
c0c8a22fa3 | ||
|
|
93717c95fb | ||
|
|
a955defae5 | ||
|
|
9579102541 | ||
|
|
2423aa592f | ||
|
|
151228b2a6 | ||
|
|
025d74bbcd | ||
|
|
7626478165 | ||
|
|
3dea1eb173 | ||
|
|
bd4f68233f | ||
|
|
d6bdbf9f34 | ||
|
|
2ccfb8671e | ||
|
|
04bb67ef45 | ||
|
|
4b67429234 |
@@ -102,6 +102,11 @@ if(TOKEN_AUTH_ONLY)
|
||||
add_definitions(-DTOKEN_AUTH_ONLY=1)
|
||||
endif()
|
||||
|
||||
option(NO_MSG_HANDLER "Don't redirect QDebug outputs to the log window/file" OFF)
|
||||
if(NO_MSG_HANDLER)
|
||||
add_definitions(-DNO_MSG_HANDLER=1)
|
||||
endif()
|
||||
|
||||
# this option creates only libocsync and libowncloudsync
|
||||
option(BUILD_LIBRARIES_ONLY "BUILD_LIBRARIES_ONLY" OFF)
|
||||
|
||||
|
||||
@@ -14,5 +14,5 @@ set( MAC_INSTALLER_BACKGROUND_FILE "${CMAKE_SOURCE_DIR}/admin/osx/installer-back
|
||||
# set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt )
|
||||
|
||||
option( WITH_CRASHREPORTER "Build crashreporter" OFF )
|
||||
set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.org/submit" CACHE string "URL for crash repoter" )
|
||||
set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.com/submit" CACHE string "URL for crash repoter" )
|
||||
set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
||||
|
||||
@@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 0 )
|
||||
set( MIRALL_SOVERSION 0 )
|
||||
|
||||
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
set( MIRALL_VERSION_SUFFIX "beta1") #e.g. beta1, beta2, rc1
|
||||
set( MIRALL_VERSION_SUFFIX "rc1") #e.g. beta1, beta2, rc1
|
||||
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
|
||||
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
||||
|
||||
75
admin/osx/gen_sym_files.py
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import logging, os, re, subprocess, sys
|
||||
import os.path
|
||||
import pdb, pprint
|
||||
|
||||
if len(sys.argv) < 4:
|
||||
print("Usage:")
|
||||
print("\tgen_sym_files.py <path to breakpad's dump_syms> <path to owncloud.app> <symbol output dir>")
|
||||
print("")
|
||||
print("Symbols will be created in './symbols'")
|
||||
sys.exit(1)
|
||||
|
||||
dump_symsPath = sys.argv[1]
|
||||
bundlePath = sys.argv[2]
|
||||
outPath = sys.argv[3]
|
||||
macOsDir = os.path.join(bundlePath, 'Contents', 'MacOS')
|
||||
pluginsDir = os.path.join(bundlePath, 'Contents', 'PlugIns')
|
||||
|
||||
def resolvePath(input):
|
||||
resolved = re.sub(r'@\w+', macOsDir, input)
|
||||
return os.path.normpath(resolved)
|
||||
|
||||
def extractDeps(macho):
|
||||
deps = [macho]
|
||||
otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE)
|
||||
for l in otool.communicate()[0].splitlines():
|
||||
m = re.search(r'@[^\s]+', l)
|
||||
if m:
|
||||
path = resolvePath(m.group(0))
|
||||
if not os.path.exists(path):
|
||||
logging.warning("Non-existant file found in dependencies, ignoring: [%s]", path)
|
||||
continue
|
||||
deps.append(path)
|
||||
return deps
|
||||
|
||||
def findDeps():
|
||||
deps = []
|
||||
for f in os.listdir(macOsDir):
|
||||
path = os.path.join(macOsDir, f)
|
||||
if not os.path.islink(path):
|
||||
deps += extractDeps(path)
|
||||
for root, dirs, files in os.walk(pluginsDir):
|
||||
for f in files:
|
||||
path = os.path.join(root, f)
|
||||
deps += extractDeps(path)
|
||||
return sorted(set(deps))
|
||||
|
||||
def dumpSyms(deps):
|
||||
for dep in deps:
|
||||
print("Generating symbols for [%s]" % dep)
|
||||
with open('temp.sym', 'w') as temp:
|
||||
subprocess.check_call([dump_symsPath, dep], stdout=temp)
|
||||
with open('temp.sym', 'r') as temp:
|
||||
header = temp.readline()
|
||||
fields = header.split()
|
||||
key, name = fields[3:5]
|
||||
destDir = '%s/%s/%s/' % (outPath, name, key)
|
||||
destPath = destDir + name + '.sym'
|
||||
if os.path.exists(destPath):
|
||||
logging.warning("Symbols already exist: [%s]", destPath)
|
||||
continue
|
||||
if not os.path.exists(destDir):
|
||||
os.makedirs(destDir)
|
||||
os.rename('temp.sym', destPath)
|
||||
|
||||
def strip(deps):
|
||||
for dep in deps:
|
||||
print("Stripping symbols off [%s]" % dep)
|
||||
subprocess.check_call(['strip', '-S', dep])
|
||||
|
||||
print('=== Generating symbols for [%s] in [%s]' % (bundlePath, outPath))
|
||||
deps = findDeps()
|
||||
dumpSyms(deps)
|
||||
strip(deps)
|
||||
@@ -3,7 +3,7 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Amosar as notas de publicaci
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Atopáronse procesos ${APPLICATION_EXECUTABLE} que teñen que ser detidos.$\nQuere que sexa o instalador quen o(s) deteña?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Matando os procesos ${APPLICATION_EXECUTABLE}."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Non se atopou o proceso para matalo!"
|
||||
StrCpy $PageReinstall_NEW_Field_1 "No seu sistema hai instalada unha versión anterior do ${APPLICATION_NAME}. Recomendámoslle que desinstale a versión actual antes de instalar. Seleccione a operación que quere realizar e prema en Seguinte para continuar."
|
||||
StrCpy $PageReinstall_NEW_Field_1 "No seu sistema hai instalada unha versión anterior de ${APPLICATION_NAME}. Recomendámoslle que desinstale a versión actual antes de instalar. Seleccione a operación que quere realizar e prema en Seguinte para continuar."
|
||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||
StrCpy $PageReinstall_NEW_Field_3 "Non desinstalar"
|
||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Xa instalado"
|
||||
@@ -18,7 +18,7 @@ StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciais."
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración con Windows Explorer"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando a integración con Windows Explorer"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo ao programa no menú de inicio"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Engadindo o acceso directo ao ${APPLICATION_NAME} no menú de inicio"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Engadindo o acceso directo a ${APPLICATION_NAME} no menú de inicio"
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo no escritorio"
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando os accesos directos no escritorio"
|
||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Acceso de inicio rápido"
|
||||
|
||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "卸载${APPLICATION_NAME}"
|
||||
StrCpy $UNINSTALLER_APPDATA_TITLE "卸载${APPLICATION_NAME}"
|
||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "选择需要执行的维护选项。"
|
||||
StrCpy $SEC_APPLICATION_DETAILS "安装${APPLICATION_NAME}基本组件。"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "整合到 Windows 资源管理器"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "正在整合到 Windows 资源管理器"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "开始菜单程序快捷方式"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "添加 ${APPLICATION_NAME} 快捷方式到开始菜单。"
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "桌面快捷方式"
|
||||
@@ -42,5 +44,3 @@ StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。"
|
||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试"
|
||||
StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。"
|
||||
StrCpy $SectionGroup_Shortcuts "快捷方式"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||
|
||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Odstrani ${APPLICATION_NAME}"
|
||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odstrani ${APPLICATION_NAME}"
|
||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Izberite možnost vzdrževanja za izvedbo."
|
||||
StrCpy $SEC_APPLICATION_DETAILS "Poteka nameščanje ključnih paketov programa ${APPLICATION_NAME}."
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Podpora programa Windows raziskovalca"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Nameščanje podpore za program Windows Raziskovalec"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Bližnjica programa v programskem meniju"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Poteka dodajanje bližnjice programa ${APPLICATION_NAME} v programski meni."
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Bližnica namizja"
|
||||
@@ -42,5 +44,3 @@ StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je
|
||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
|
||||
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
|
||||
StrCpy $SectionGroup_Shortcuts "Bližnjice"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||
|
||||
@@ -20,8 +20,8 @@ StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando la integraci
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo al programa Menú de Inicio"
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Añadiendo accesos directos para ${APPLICATION_NAME} en el Menú de Inicio."
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo de Escritorio"
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando Accesos Directos de Escritorio"
|
||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Acceso Directo al Lanzador Rápido"
|
||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando accesos directos de escritorio"
|
||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atajo de accceso rápido"
|
||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creando un Acceso Directo al Lanzador Rápido"
|
||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esencial."
|
||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso Directo de ${APPLICATION_NAME}"
|
||||
@@ -36,7 +36,7 @@ StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo claves en el registro del insta
|
||||
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
|
||||
StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no está instalado en el directorio '$INSTDIR'.$$ ¿Continuar de todos modos? (No Recomendado)"
|
||||
StrCpy $UNINSTALL_ABORT "Desinstalación cancelada por el usuario"
|
||||
StrCpy $INIT_NO_QUICK_LAUNCH "Acceso Directo al Lanzador Rápido (N/A)"
|
||||
StrCpy $INIT_NO_QUICK_LAUNCH "Atajo de inicio rápido (N/A)"
|
||||
StrCpy $INIT_NO_DESKTOP "Atajo de escritorio (sobreescribe el existente)"
|
||||
StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, error:"
|
||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "El instalador requiere acceso administrativo, inténtelo de nuevo"
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}
|
||||
{\f172\froman\fcharset238\fprq2 Times New Roman CE;}{\f173\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f175\froman\fcharset161\fprq2 Times New Roman Greek;}{\f176\froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||
{\f177\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f178\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f179\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f180\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\f562\fswiss\fcharset238\fprq2 Verdana CE;}{\f563\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f565\fswiss\fcharset161\fprq2 Verdana Greek;}{\f566\fswiss\fcharset162\fprq2 Verdana Tur;}{\f569\fswiss\fcharset186\fprq2 Verdana Baltic;}
|
||||
{\f570\fswiss\fcharset163\fprq2 Verdana (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
|
||||
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
|
||||
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
|
||||
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\*\cs15 \additive \ul\cf2 \sbasedon10 \styrsid7485074 Hyperlink;}}
|
||||
{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid6712196\rsid7485074\rsid11352300\rsid15940516}{\*\generator Microsoft Word 11.0.5604;}{\info{\title Processes v1}{\author Hardwired}{\operator Hardwired}{\creatim\yr2004\mo12\dy12\hr23\min42}
|
||||
{\revtim\yr2004\mo12\dy12\hr23\min51}{\version2}{\edmins9}{\nofpages1}{\nofwords80}{\nofchars458}{\nofcharsws537}{\vern24689}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180
|
||||
\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
|
||||
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
|
||||
\asianbrkrule\rsidroot7485074\newtblstyruls\nogrowautofit \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}
|
||||
{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}
|
||||
{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain
|
||||
\qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7485074 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\f39\insrsid7485074\charrsid7485074 Processes v1.0}{\f39\insrsid7485074\charrsid7485074 .0.1
|
||||
\par }{\f39\fs20\insrsid7485074
|
||||
\par }\pard \qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15940516 {\f39\fs20\insrsid15940516 This software binaries and source-code are free for any kind of use, including commercial use. }{
|
||||
\f39\fs20\insrsid7485074\charrsid7485074 There is no restriction and no guaranty for using}{\f39\fs20\insrsid7485074\charrsid7485074 t}{\f39\fs20\insrsid7485074\charrsid7485074 his software}{\f39\fs20\insrsid7485074\charrsid7485074 and/or it
|
||||
s source-code. }{\f39\fs20\insrsid15940516
|
||||
\par I}{\f39\fs20\insrsid7485074\charrsid7485074 f you use the plug}{\f39\fs20\insrsid7485074\charrsid7485074 -}{\f39\fs20\insrsid7485074\charrsid7485074 in }{\f39\fs20\insrsid7485074\charrsid7485074 and/}{\f39\fs20\insrsid7485074\charrsid7485074 or it}{
|
||||
\f39\fs20\insrsid7485074\charrsid7485074 s}{\f39\fs20\insrsid7485074\charrsid7485074 source-code, I would }{\f39\fs20\insrsid7485074\charrsid7485074 appreciate }{\f39\fs20\insrsid7485074\charrsid7485074 if my name is mentioned.}{
|
||||
\f39\fs20\insrsid7485074\charrsid7485074
|
||||
\par }\pard \qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7485074 {\f39\fs20\insrsid7485074\charrsid7485074
|
||||
\par }{\b\f39\fs20\insrsid7485074\charrsid7485074 Andrei Ciubotaru [Hardwired]
|
||||
\par }{\f39\fs20\insrsid7485074\charrsid7485074 Lead Developer ICode&Ideas SRL (}{\field\flddirty{\*\fldinst {\f39\fs20\insrsid7485074\charrsid7485074 HYPERLINK "http://www.icode.ro/" }{\f39\fs20\insrsid7485074\charrsid7485074 {\*\datafield
|
||||
00d0c9ea79f9bace118c8200aa004ba90b02000000170000001500000068007400740070003a002f002f007700770077002e00690063006f00640065002e0072006f002f000000e0c9ea79f9bace118c8200aa004ba90b2a00000068007400740070003a002f002f007700770077002e00690063006f00640065002e007200
|
||||
6f002f000000}}}{\fldrslt {\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 http://www.icode.ro/}}}{\f39\fs20\insrsid7485074\charrsid7485074 )
|
||||
\par }{\field{\*\fldinst {\f39\fs20\insrsid7485074 HYPERLINK "hardwiredteks@gmail.com" }{\f39\fs20\insrsid15940516\charrsid7485074 {\*\datafield
|
||||
00d0c9ea79f9bace118c8200aa004ba90b02000000010000000303000000000000c00000000000004600001800000068617264776972656474656b7340676d61696c2e636f6d00ffffadde000000000000000000000000000000000000000000000000}}}{\fldrslt {
|
||||
\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 hardwiredteks@gmail.com}}}{\f39\fs20\insrsid7485074\charrsid7485074 , }{\field{\*\fldinst {\f39\fs20\insrsid7485074 HYPERLINK "hardwired@icode.ro" }{\f39\fs20\insrsid15940516\charrsid7485074
|
||||
{\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000010000000303000000000000c0000000000000460000130000006861726477697265644069636f64652e726f00ffffadde000000000000000000000000000000000000000000000000}}}{\fldrslt {
|
||||
\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 hardwired@icode.ro}}}{\f39\fs20\insrsid7485074\charrsid7485074
|
||||
\par }}
|
||||
@@ -1,122 +0,0 @@
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
Processes (Processes.dll)
|
||||
Version: 1.0.1.0
|
||||
Release: 24.february.2005
|
||||
Description: Nullsoft Installer (NSIS) plug-in for managing?!
|
||||
Windows processes.
|
||||
|
||||
Copyright: © 2004-2005 Hardwired. No rights reserved.
|
||||
There is no restriction and no guaranty for using
|
||||
this software.
|
||||
|
||||
Author: Andrei Ciubotaru [Hardwired]
|
||||
Lead Developer ICode&Ideas SRL (http://www.icode.ro/)
|
||||
hardwiredteks@gmail.com, hardwired@icode.ro
|
||||
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
INTRODUCTION
|
||||
|
||||
The Need For Plug-in - I need it for the one of my installers.
|
||||
|
||||
Briefly: Use it when you need to find\kill a process when
|
||||
installing\uninstalling some application. Also, use it when you
|
||||
need to test the presence of a device driver.
|
||||
|
||||
|
||||
SUPPORT
|
||||
|
||||
Supported platforms are: WinNT,Win2K,WinXP and Win2003 Server.
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Processes::FindProcess <process_name> ;without ".exe"
|
||||
|
||||
Searches the currently running processes for the given
|
||||
process name.
|
||||
|
||||
return: 1 - the process was found
|
||||
0 - the process was not found
|
||||
|
||||
Processes::KillProcess <process_name> ; without ".exe"
|
||||
|
||||
Searches the currently running processes for the given
|
||||
process name. If the process is found then the it gets
|
||||
killed.
|
||||
|
||||
return: 1 - the process was found and killed
|
||||
0 - the process was not found or the process
|
||||
cannot be killed (insuficient rights)
|
||||
|
||||
Processes::FindDevice <device_base_name>
|
||||
|
||||
Searches the installed devices drivers for the given
|
||||
device base name.
|
||||
(important: I said BASE NAME not FILENAME)
|
||||
|
||||
return: 1 - the device driver was found
|
||||
0 - the device driver was not found
|
||||
|
||||
|
||||
USAGE
|
||||
|
||||
First of all, does not matter where you use it. Ofcourse, the
|
||||
routines must be called inside of a Section/Function scope.
|
||||
|
||||
Processes::FindProcess "process_name"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" make_my_day noooooo
|
||||
|
||||
make_my_day:
|
||||
...
|
||||
|
||||
noooooo:
|
||||
...
|
||||
|
||||
|
||||
Processes::KillProcess "process_name"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" dead_meat why_wont_you_die
|
||||
|
||||
dead_meat:
|
||||
...
|
||||
|
||||
why_wont_you_die:
|
||||
...
|
||||
|
||||
|
||||
Processes::FindDevice "device_base_name"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" blabla more_blabla
|
||||
|
||||
blabla:
|
||||
...
|
||||
|
||||
more_blabla:
|
||||
...
|
||||
|
||||
|
||||
THANKS
|
||||
|
||||
Sunil Kamath for inspiring me. I wanted to use its FindProcDLL
|
||||
but my requirements made it imposible.
|
||||
|
||||
Nullsoft for creating this very powerfull installer. One big,
|
||||
free and full-featured (hmmm... and guiless for the moment) mean
|
||||
install machine!:)
|
||||
|
||||
ME for being such a great coder...
|
||||
... HAHAHAHAHAHAHA!
|
||||
|
||||
ONE MORE THING
|
||||
|
||||
If you use the plugin or it's source-code, I would apreciate
|
||||
if my name is mentioned.
|
||||
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
@@ -1,8 +0,0 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// KillProcDLL.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
// TODO: reference any additional headers you need in STDAFX.H
|
||||
// and not in this file
|
||||
@@ -1,34 +0,0 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#if !defined(AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_)
|
||||
#define AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <string> // String management...
|
||||
|
||||
//From exam28.cpp
|
||||
#include <tlhelp32.h>
|
||||
//#include <iostream.h>
|
||||
|
||||
#ifdef BORLANDC
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#endif
|
||||
|
||||
//To make it a NSIS Plug-In
|
||||
#include "exdll.h"
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_)
|
||||
@@ -1,37 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include "exdll.h"
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
|
||||
HWND g_hwndParent;
|
||||
|
||||
void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
|
||||
char *variables, stack_t **stacktop)
|
||||
{
|
||||
g_hwndParent=hwndParent;
|
||||
|
||||
EXDLL_INIT();
|
||||
|
||||
|
||||
// note if you want parameters from the stack, pop them off in order.
|
||||
// i.e. if you are called via exdll::myFunction file.dat poop.dat
|
||||
// calling popstring() the first time would give you file.dat,
|
||||
// and the second time would give you poop.dat.
|
||||
// you should empty the stack of your parameters, and ONLY your
|
||||
// parameters.
|
||||
|
||||
// do your stuff here
|
||||
{
|
||||
char buf[1024];
|
||||
wsprintf(buf,"$0=%s\n",getuservariable(INST_0));
|
||||
MessageBox(g_hwndParent,buf,0,MB_OK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
g_hInstance=hInst;
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
#ifndef _EXDLL_H_
|
||||
#define _EXDLL_H_
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// only include this file from one place in your DLL.
|
||||
// (it is all static, if you use it in two places it will fail)
|
||||
//
|
||||
#define EXDLL_INIT() { \
|
||||
g_stringsize = string_size; \
|
||||
g_stacktop = stacktop; \
|
||||
g_variables = variables; }
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// For page showing plug-ins
|
||||
//
|
||||
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
|
||||
#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
|
||||
#define NOTIFY_BYE_BYE 'x'
|
||||
|
||||
typedef struct _stack_t
|
||||
{
|
||||
struct _stack_t *next;
|
||||
char text[1]; // this should be the length of string_size
|
||||
} stack_t;
|
||||
|
||||
|
||||
static unsigned int g_stringsize;
|
||||
static stack_t **g_stacktop;
|
||||
static char *g_variables;
|
||||
|
||||
enum
|
||||
{
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// utility functions (not required but often useful)
|
||||
//
|
||||
static int popstring( char *str )
|
||||
{
|
||||
stack_t *th;
|
||||
|
||||
|
||||
if( !g_stacktop ||
|
||||
!*g_stacktop )
|
||||
return 1;
|
||||
|
||||
th = (*g_stacktop);
|
||||
lstrcpy( str, th->text );
|
||||
*g_stacktop = th->next;
|
||||
GlobalFree( (HGLOBAL)th );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void pushstring( char *str )
|
||||
{
|
||||
stack_t *th;
|
||||
|
||||
|
||||
if( !g_stacktop )
|
||||
return;
|
||||
|
||||
th = (stack_t*)GlobalAlloc( GPTR, sizeof(stack_t) + g_stringsize );
|
||||
lstrcpyn( th->text, str, g_stringsize );
|
||||
th->next = *g_stacktop;
|
||||
*g_stacktop = th;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static char *getuservariable( int varnum )
|
||||
{
|
||||
if( varnum < 0 ||
|
||||
varnum >= __INST_LAST )
|
||||
return NULL;
|
||||
|
||||
return (g_variables + varnum*g_stringsize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void setuservariable( int varnum, char *var )
|
||||
{
|
||||
if( var != NULL &&
|
||||
varnum >= 0 &&
|
||||
varnum < __INST_LAST )
|
||||
lstrcpy( g_variables + varnum*g_stringsize, var );
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif//_EXDLL_H_
|
||||
@@ -1,411 +0,0 @@
|
||||
#include "stdafx.h"
|
||||
#include "processes.h"
|
||||
#include "string.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// global variables
|
||||
lpfEnumProcesses EnumProcesses;
|
||||
lpfEnumProcessModules EnumProcessModules;
|
||||
lpfGetModuleBaseName GetModuleBaseName;
|
||||
lpfEnumDeviceDrivers EnumDeviceDrivers;
|
||||
lpfGetDeviceDriverBaseName GetDeviceDriverBaseName;
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
HWND g_hwndParent;
|
||||
HINSTANCE g_hInstLib;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// main DLL entry
|
||||
BOOL WINAPI _DllMainCRTStartup( HANDLE hInst,
|
||||
ULONG ul_reason_for_call,
|
||||
LPVOID lpReserved )
|
||||
{
|
||||
g_hInstance = (struct HINSTANCE__ *)hInst;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// loads the psapi routines
|
||||
bool LoadPSAPIRoutines( void )
|
||||
{
|
||||
if( NULL == (g_hInstLib = LoadLibraryA( "PSAPI.DLL" )) )
|
||||
return false;
|
||||
|
||||
EnumProcesses = (lpfEnumProcesses) GetProcAddress( g_hInstLib, "EnumProcesses" );
|
||||
EnumProcessModules = (lpfEnumProcessModules) GetProcAddress( g_hInstLib, "EnumProcessModules" );
|
||||
GetModuleBaseName = (lpfGetModuleBaseName) GetProcAddress( g_hInstLib, "GetModuleBaseNameA" );
|
||||
EnumDeviceDrivers = (lpfEnumDeviceDrivers) GetProcAddress( g_hInstLib, "EnumDeviceDrivers" );
|
||||
GetDeviceDriverBaseName = (lpfGetDeviceDriverBaseName) GetProcAddress( g_hInstLib, "GetDeviceDriverBaseNameA" );
|
||||
|
||||
if( ( NULL == EnumProcesses ) ||
|
||||
( NULL == EnumProcessModules ) ||
|
||||
( NULL == EnumDeviceDrivers ) ||
|
||||
( NULL == GetModuleBaseName ) ||
|
||||
( NULL == GetDeviceDriverBaseName ) )
|
||||
{
|
||||
FreeLibrary( g_hInstLib );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// free the psapi routines
|
||||
bool FreePSAPIRoutines( void )
|
||||
{
|
||||
EnumProcesses = NULL;
|
||||
EnumProcessModules = NULL;
|
||||
GetModuleBaseName = NULL;
|
||||
EnumDeviceDrivers = NULL;
|
||||
|
||||
if( FALSE == FreeLibrary( g_hInstLib ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// find a process by name
|
||||
// return value: true - process was found
|
||||
// false - process not found
|
||||
bool FindProc( char *szProcess )
|
||||
{
|
||||
char szProcessName[ 1024 ];
|
||||
char szCurrentProcessName[ 1024 ];
|
||||
DWORD dPID[ 1024 ];
|
||||
DWORD dPIDSize( 1024 );
|
||||
DWORD dSize( 1024 );
|
||||
HANDLE hProcess;
|
||||
HMODULE phModule[ 1024 ];
|
||||
|
||||
|
||||
//
|
||||
// make the name lower case
|
||||
//
|
||||
memset( szProcessName, 0, 1024*sizeof(char) );
|
||||
sprintf( szProcessName, "%s", szProcess );
|
||||
strlwr( szProcessName );
|
||||
|
||||
//
|
||||
// load PSAPI routines
|
||||
//
|
||||
if( false == LoadPSAPIRoutines() )
|
||||
return false;
|
||||
|
||||
//
|
||||
// enumerate processes names
|
||||
//
|
||||
if( FALSE == EnumProcesses( dPID, dSize, &dPIDSize ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// walk trough and compare see if the process is running
|
||||
//
|
||||
for( int k( dPIDSize / sizeof( DWORD ) ); k >= 0; k-- )
|
||||
{
|
||||
memset( szCurrentProcessName, 0, 1024*sizeof(char) );
|
||||
|
||||
if( NULL != ( hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dPID[ k ] ) ) )
|
||||
{
|
||||
if( TRUE == EnumProcessModules( hProcess, phModule, sizeof(HMODULE)*1024, &dPIDSize ) )
|
||||
if( GetModuleBaseName( hProcess, phModule[ 0 ], szCurrentProcessName, 1024 ) > 0 )
|
||||
{
|
||||
strlwr( szCurrentProcessName );
|
||||
|
||||
if( NULL != strstr( szCurrentProcessName, szProcessName ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
CloseHandle( hProcess );
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CloseHandle( hProcess );
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// free PSAPI routines
|
||||
//
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// kills a process by name
|
||||
// return value: true - process was found
|
||||
// false - process not found
|
||||
bool KillProc( char *szProcess )
|
||||
{
|
||||
char szProcessName[ 1024 ];
|
||||
char szCurrentProcessName[ 1024 ];
|
||||
DWORD dPID[ 1024 ];
|
||||
DWORD dPIDSize( 1024 );
|
||||
DWORD dSize( 1024 );
|
||||
HANDLE hProcess;
|
||||
HMODULE phModule[ 1024 ];
|
||||
|
||||
|
||||
//
|
||||
// make the name lower case
|
||||
//
|
||||
memset( szProcessName, 0, 1024*sizeof(char) );
|
||||
sprintf( szProcessName, "%s", szProcess );
|
||||
strlwr( szProcessName );
|
||||
|
||||
//
|
||||
// load PSAPI routines
|
||||
//
|
||||
if( false == LoadPSAPIRoutines() )
|
||||
return false;
|
||||
|
||||
//
|
||||
// enumerate processes names
|
||||
//
|
||||
if( FALSE == EnumProcesses( dPID, dSize, &dPIDSize ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// walk trough and compare see if the process is running
|
||||
//
|
||||
for( int k( dPIDSize / sizeof( DWORD ) ); k >= 0; k-- )
|
||||
{
|
||||
memset( szCurrentProcessName, 0, 1024*sizeof(char) );
|
||||
|
||||
if( NULL != ( hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dPID[ k ] ) ) )
|
||||
{
|
||||
if( TRUE == EnumProcessModules( hProcess, phModule, sizeof(HMODULE)*1024, &dPIDSize ) )
|
||||
if( GetModuleBaseName( hProcess, phModule[ 0 ], szCurrentProcessName, 1024 ) > 0 )
|
||||
{
|
||||
strlwr( szCurrentProcessName );
|
||||
|
||||
if( NULL != strstr( szCurrentProcessName, szProcessName ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
|
||||
//
|
||||
// kill process
|
||||
//
|
||||
if( false == TerminateProcess( hProcess, 0 ) )
|
||||
{
|
||||
CloseHandle( hProcess );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// refresh systray
|
||||
//
|
||||
UpdateWindow( FindWindow( NULL, "Shell_TrayWnd" ) );
|
||||
|
||||
//
|
||||
// refresh desktop window
|
||||
//
|
||||
UpdateWindow( GetDesktopWindow() );
|
||||
|
||||
CloseHandle( hProcess );
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CloseHandle( hProcess );
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// free PSAPI routines
|
||||
//
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
bool FindDev( char *szDriverName )
|
||||
{
|
||||
char szDeviceName[ 1024 ];
|
||||
char szCurrentDeviceName[ 1024 ];
|
||||
LPVOID lpDevices[ 1024 ];
|
||||
DWORD dDevicesSize( 1024 );
|
||||
DWORD dSize( 1024 );
|
||||
TCHAR tszCurrentDeviceName[ 1024 ];
|
||||
DWORD dNameSize( 1024 );
|
||||
|
||||
|
||||
//
|
||||
// make the name lower case
|
||||
//
|
||||
memset( szDeviceName, 0, 1024*sizeof(char) );
|
||||
sprintf( szDeviceName, "%s", strlwr( szDriverName ) );
|
||||
|
||||
//
|
||||
// load PSAPI routines
|
||||
//
|
||||
if( false == LoadPSAPIRoutines() )
|
||||
return false;
|
||||
|
||||
//
|
||||
// enumerate devices
|
||||
//
|
||||
if( FALSE == EnumDeviceDrivers( lpDevices, dSize, &dDevicesSize ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// walk trough and compare see if the device driver exists
|
||||
//
|
||||
for( int k( dDevicesSize / sizeof( LPVOID ) ); k >= 0; k-- )
|
||||
{
|
||||
memset( szCurrentDeviceName, 0, 1024*sizeof(char) );
|
||||
memset( tszCurrentDeviceName, 0, 1024*sizeof(TCHAR) );
|
||||
|
||||
if( 0 != GetDeviceDriverBaseName( lpDevices[ k ], tszCurrentDeviceName, dNameSize ) )
|
||||
{
|
||||
sprintf( szCurrentDeviceName, "%S", tszCurrentDeviceName );
|
||||
|
||||
if( 0 == strcmp( strlwr( szCurrentDeviceName ), szDeviceName ) )
|
||||
{
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// free PSAPI routines
|
||||
//
|
||||
FreePSAPIRoutines();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
extern "C" __declspec(dllexport) void FindProcess( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop )
|
||||
{
|
||||
char szParameter[ 1024 ];
|
||||
|
||||
|
||||
g_hwndParent = hwndParent;
|
||||
|
||||
EXDLL_INIT();
|
||||
{
|
||||
popstring( szParameter );
|
||||
|
||||
if( true == FindProc( szParameter ) )
|
||||
wsprintf( szParameter, "1" );
|
||||
else
|
||||
wsprintf( szParameter, "0" );
|
||||
|
||||
setuservariable( INST_R0, szParameter );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
extern "C" __declspec(dllexport) void KillProcess( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop )
|
||||
{
|
||||
char szParameter[ 1024 ];
|
||||
|
||||
|
||||
g_hwndParent = hwndParent;
|
||||
|
||||
EXDLL_INIT();
|
||||
{
|
||||
popstring( szParameter );
|
||||
|
||||
if( true == KillProc( szParameter ) )
|
||||
wsprintf( szParameter, "1" );
|
||||
else
|
||||
wsprintf( szParameter, "0" );
|
||||
|
||||
setuservariable( INST_R0, szParameter );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
extern "C" __declspec(dllexport) void FindDevice( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop )
|
||||
{
|
||||
char szParameter[ 1024 ];
|
||||
|
||||
|
||||
g_hwndParent = hwndParent;
|
||||
|
||||
EXDLL_INIT();
|
||||
{
|
||||
popstring( szParameter );
|
||||
|
||||
if( true == FindDev( szParameter ) )
|
||||
wsprintf( szParameter, "1" );
|
||||
else
|
||||
wsprintf( szParameter, "0" );
|
||||
|
||||
setuservariable( INST_R0, szParameter );
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// PSAPI function pointers
|
||||
typedef BOOL (WINAPI *lpfEnumProcesses) ( DWORD *, DWORD, DWORD * );
|
||||
typedef BOOL (WINAPI *lpfEnumProcessModules) ( HANDLE, HMODULE *, DWORD, LPDWORD );
|
||||
typedef DWORD (WINAPI *lpfGetModuleBaseName) ( HANDLE, HMODULE, LPTSTR, DWORD );
|
||||
typedef BOOL (WINAPI *lpfEnumDeviceDrivers) ( LPVOID *, DWORD, LPDWORD );
|
||||
typedef BOOL (WINAPI *lpfGetDeviceDriverBaseName)( LPVOID, LPTSTR, DWORD );
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// Internal use routines
|
||||
bool LoadPSAPIRoutines( void );
|
||||
bool FreePSAPIRoutines( void );
|
||||
|
||||
bool FindProc( char *szProcess );
|
||||
bool KillProc( char *szProcess );
|
||||
|
||||
bool FindDev( char *szDriverName );
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
// Exported routines
|
||||
extern "C" __declspec(dllexport) void FindProcess( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop );
|
||||
|
||||
extern "C" __declspec(dllexport) void KillProcess( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop );
|
||||
|
||||
extern "C" __declspec(dllexport) void FindDevice( HWND hwndParent,
|
||||
int string_size,
|
||||
char *variables,
|
||||
stack_t **stacktop );
|
||||
@@ -1,103 +0,0 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,1
|
||||
PRODUCTVERSION 1,0,0,1
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "NSIS Plug-in for Windows process management. Only WinNT, Win2K, WinXP and Win2003 Server supported."
|
||||
VALUE "CompanyName", "Andrei Ciubotaru [Hardwired]"
|
||||
VALUE "FileDescription", "Windows Processes Management"
|
||||
VALUE "FileVersion", "1, 0, 0, 1"
|
||||
VALUE "InternalName", "Processes"
|
||||
VALUE "LegalCopyright", "Copyright (c) 2004 Hardwired. No rights reserved."
|
||||
VALUE "OriginalFilename", "Processes.dll"
|
||||
VALUE "ProductName", "Processes"
|
||||
VALUE "ProductVersion", "1, 0, 0, 1"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "processes", "processes.vcproj", "{3438467F-A719-46DC-93E5-137A8B691727}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{3438467F-A719-46DC-93E5-137A8B691727}.Debug.ActiveCfg = Debug|Win32
|
||||
{3438467F-A719-46DC-93E5-137A8B691727}.Debug.Build.0 = Debug|Win32
|
||||
{3438467F-A719-46DC-93E5-137A8B691727}.Release.ActiveCfg = Release|Win32
|
||||
{3438467F-A719-46DC-93E5-137A8B691727}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,122 +0,0 @@
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
Processes (Processes.dll)
|
||||
Version: 1.0.0.1
|
||||
Release: 12.december.2004
|
||||
Description:Nullsoft Installer (NSIS) plug-in for managing?!
|
||||
Windows processes.
|
||||
|
||||
Copyright: © 2004 Hardwired. No rights reserved.
|
||||
There is no restriction and no guaranty for using
|
||||
this software.
|
||||
|
||||
Author: Andrei Ciubotaru [Hardwired]
|
||||
Lead Developer ICode&Ideas SRL (http://www.icode.ro)
|
||||
hardwiredteks@gmail.com, hardwired@icode.ro
|
||||
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
INTRODUCTION
|
||||
|
||||
The Need For Plug-in - I need it for the one of my installers.
|
||||
|
||||
Briefly: Use it when you need to find\kill a process when
|
||||
installing\uninstalling some application. Also, use it when you
|
||||
need to test the presence of a device driver.
|
||||
|
||||
|
||||
SUPPORT
|
||||
|
||||
Supported platforms are: WinNT,Win2K,WinXP and Win2003 Server.
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Processes::FindProcess <process_name.exe>
|
||||
|
||||
Searches the currently running processes for the given
|
||||
process name.
|
||||
|
||||
return: 1 - the process was found
|
||||
0 - the process was not found
|
||||
|
||||
Processes::KillProcess <process_name.exe>
|
||||
|
||||
Searches the currently running processes for the given
|
||||
process name. If the process is found then the it gets
|
||||
killed.
|
||||
|
||||
return: 1 - the process was found and killed
|
||||
0 - the process was not found or the process
|
||||
cannot be killed (insuficient rights)
|
||||
|
||||
Processes::FindDevice <device_base_name>
|
||||
|
||||
Searches the installed devices drivers for the given
|
||||
device base name.
|
||||
(important: I said BASE NAME not FILENAME)
|
||||
|
||||
return: 1 - the device driver was found
|
||||
0 - the device driver was not found
|
||||
|
||||
|
||||
USAGE
|
||||
|
||||
First of all, does not matter where you use it. Ofcourse, the
|
||||
routines must be called inside of a Section/Function scope.
|
||||
|
||||
Processes::FindProcess "process_name.exe"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" make_my_day noooooo
|
||||
|
||||
make_my_day:
|
||||
...
|
||||
|
||||
noooooo:
|
||||
...
|
||||
|
||||
|
||||
Processes::KillProcess "process_name.exe"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" dead_meat why_wont_you_die
|
||||
|
||||
dead_meat:
|
||||
...
|
||||
|
||||
why_wont_you_die:
|
||||
...
|
||||
|
||||
|
||||
Processes::FindDevice "device_base_name"
|
||||
Pop $R0
|
||||
|
||||
StrCmp $R0 "1" blabla more_blabla
|
||||
|
||||
blabla:
|
||||
...
|
||||
|
||||
more_blabla:
|
||||
...
|
||||
|
||||
|
||||
THANKS
|
||||
|
||||
Sunil Kamath for inspiring me. I wanted to use its FindProcDLL
|
||||
but my requirements made it imposible.
|
||||
|
||||
Nullsoft for creating this very powerfull installer. One big,
|
||||
free and full-featured (hmmm... and guiless for the moment) mean
|
||||
install machine!:)
|
||||
|
||||
ME for being such a great coder...
|
||||
... HAHAHAHAHAHAHA!
|
||||
|
||||
ONE MORE THING
|
||||
|
||||
If you use the plugin or it's source-code, I would apreciate
|
||||
if my name is mentioned.
|
||||
|
||||
----------------------------------------------------------------
|
||||
----------------------------------------------------------------
|
||||
@@ -1,222 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="processes"
|
||||
SccProjectName="processes"
|
||||
SccLocalPath=".">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\Debug"
|
||||
IntermediateDirectory=".\Debug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FINDPROCDLL_EXPORTS"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="3"
|
||||
PrecompiledHeaderThrough="stdafx.h"
|
||||
PrecompiledHeaderFile=".\Debug/processes.pch"
|
||||
AssemblerListingLocation=".\Debug/"
|
||||
ObjectFile=".\Debug/"
|
||||
ProgramDataBaseFileName=".\Debug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile=".\Debug/processes.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\Debug/processes.pdb"
|
||||
ImportLibrary=".\Debug/processes.lib"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Debug/processes.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1034"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="..\bin"
|
||||
IntermediateDirectory="..\bin\processes"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="3"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
OptimizeForWindowsApplication="TRUE"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;FINDPROCDLL_EXPORTS"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="0"
|
||||
StructMemberAlignment="1"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="3"
|
||||
PrecompiledHeaderThrough="stdafx.h"
|
||||
PrecompiledHeaderFile="..\bin\processes/processes.pch"
|
||||
AssemblerListingLocation="..\bin\processes/"
|
||||
ObjectFile="..\bin\processes/"
|
||||
ProgramDataBaseFileName="..\bin\processes/"
|
||||
WarningLevel="4"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libc.lib"
|
||||
OutputFile="..\bin/Processes.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
IgnoreAllDefaultLibraries="FALSE"
|
||||
ProgramDatabaseFile="..\bin/processes.pdb"
|
||||
OptimizeForWindows98="1"
|
||||
ImportLibrary="..\bin/processes.lib"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Release/processes.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="processes.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\processes.rc">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="StdAfx.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
|
||||
BasicRuntimeChecks="3"
|
||||
UsePrecompiledHeader="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
|
||||
UsePrecompiledHeader="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="exdll.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\processes.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\resource.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="StdAfx.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="processes.txt">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,15 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by processes.rc
|
||||
//
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,102 +0,0 @@
|
||||
History:
|
||||
--------
|
||||
|
||||
v0.0.11d - 20090705 (AndersK)
|
||||
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi so installing as admin will allow both modes
|
||||
|
||||
v0.0.11c - 20090124 (AndersK)
|
||||
*Checks for seclogon service on NT5 and returns ERROR_SERVICE_NOT_ACTIVE in $0 if not running
|
||||
|
||||
v0.0.11b - 20090102 (AndersK)
|
||||
*Fixed unicode compile bugs
|
||||
|
||||
v0.0.11 - 20081021 (AndersK)
|
||||
+Added UAC_GetUserShellFolderPath.nsi (Uses the new UAC::GetShellFolderPath)
|
||||
|
||||
v0.0.10a - 20081004 (AndersK)
|
||||
+Added SEE_MASK_NOZONECHECKS flag (experimental)
|
||||
|
||||
v0.0.10 - 20080812 (AndersK)
|
||||
+Added ugly hook hack to the shells run-as dialog on xp, defaults to other user
|
||||
|
||||
v0.0.9 - 20080721 (AndersK)
|
||||
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi related bug (Thanks Case)
|
||||
|
||||
v0.0.8 - 20080310 (AndersK)
|
||||
+HTML Readme
|
||||
+Added UAC::GetOuterHwnd (used by UAC_RealWorldFullyLoadedDualModeExample.nsi)
|
||||
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi
|
||||
*Major code cleanup in UAC.cpp
|
||||
-Removed UAC::RunElevatedAndProcessMessages (UAC::RunElevated now supports non NULL $HWNDParent)
|
||||
-Removed several useless sample scripts
|
||||
|
||||
v0.0.7e - 20080229 (AndersK)
|
||||
*Added ugly hack for hackwnd to find correct title and give us a proper taskbar so the elevation dialog does not get lost (2000,XP (This also fixed Alt-Tab icon on Vista))
|
||||
*Should compile with MSVC2005 now (Thanks Case)
|
||||
*More unicode fixes, this time even tested with NSIS Unicode (Only RunElevated and Exec tested)
|
||||
|
||||
v0.0.7d - 20080226 (AndersK)
|
||||
*Fixed a couple of unicode version bugs (Unicode version still untested)
|
||||
*Fixed weird XP string length bug (Thanks kfank)
|
||||
|
||||
v0.0.7c - 20080218 (AndersK)
|
||||
*Fixed SyncVars string length bug
|
||||
|
||||
v0.0.7b - 20080205 (AndersK)
|
||||
*Fixed DelayLoadDlls() problem on NT4
|
||||
|
||||
v0.0.7 - 20080120 (AndersK)
|
||||
+Added UAC::StackPush (For use with ExecCodeSegment)
|
||||
|
||||
v0.0.6d - 20071108 (AndersK)
|
||||
+Now syncs basic registers/variables before calling UAC::*Exec* and UAC::ExecCodeSegment (r0-r9,R0-R9,$CMDLINE,$INSTDIR,$OUTDIR,$EXEDIR,$LANGUAGE)
|
||||
+Added UAC::RunElevatedAndProcessMessages, this can be called after .onInit (Very experimental, DO NOT USE)
|
||||
+New include file with helper macros: UAC.nsh
|
||||
*Replazed Clammerz hack with a better version
|
||||
|
||||
v0.0.6c - 20071014 (AndersK)
|
||||
+Check for and split up "domain\user" style input in RunAs.cpp for CreateProcessWithLogonW
|
||||
*Added a ugly hack to trick messagebox'es in .OnInit to appear correctly on Vista (Thanks Clammerz)
|
||||
|
||||
v0.0.6b - 20070523 (AndersK)
|
||||
*Fixed showwindow flag (Thanks for the help kichik)
|
||||
|
||||
v0.0.6 - 20070512 (AndersK)
|
||||
+Added basic language support for MyRunAs dialog.
|
||||
|
||||
v0.0.5e - 20070509 (AndersK)
|
||||
*Fixed detection of UAC mode?
|
||||
+IPC window is visible (but offscreen) during elevation to help with SetForegroundWindow/Focus problems
|
||||
|
||||
v0.0.5d - 20070324 (AndersK)
|
||||
*Fixed stupid IsAdmin bug
|
||||
|
||||
v0.0.5c - 20070304 (AndersK)
|
||||
*_IsAdmin now uses CheckTokenMembership if it exists ( MSKB:Q118626 / http://blogs.msdn.com/larryosterman/archive/2007/03/14/why-does-kb-118626-use-accesscheck-to-check-if-you-re-a-member-of-the-administrators-group.aspx )
|
||||
|
||||
v0.0.5b - 20070301 (AndersK)
|
||||
*Fixed ExecCodeSegment (Thread now calls CoInitialize)
|
||||
|
||||
v0.0.5 - 20070228 (AndersK)
|
||||
+Added ExecCodeSegment (You can now call ANY code in the context of the original user)
|
||||
|
||||
v0.0.4b - 20070226 (AndersK)
|
||||
*Fixed (My)RunAs font (http://blogs.msdn.com/oldnewthing/archive/2005/02/04/366987.aspx)
|
||||
|
||||
v0.0.4 - 20070225 (AndersK)
|
||||
+Added (My)RunAs dialog, used on Vista when running as LUA with UAC off
|
||||
+Always uses /NCRC for elevated instance
|
||||
*Now compiles as UNICODE (Untested, no UnicodeNSIS to test on)
|
||||
|
||||
v0.0.3 - 20070224 (AndersK)
|
||||
+Added Exec/ExecWait
|
||||
+Added Verb & ShowWindow support for ShellExec[Wait]
|
||||
|
||||
v0.0.2 - 20070219 (AndersK)
|
||||
+Added ShellExecWait
|
||||
*IPC srv wnd now has its own thread and msg loop
|
||||
*Removed CRT dependency
|
||||
*Hopefully loads on Win95 now
|
||||
|
||||
v0.0.1 - 20070215 (AndersK)
|
||||
*Initial release
|
||||
@@ -1,14 +0,0 @@
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
|
||||
ZLIB/LIBPNG LICENSE
|
||||
-------------------
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
@@ -1,149 +0,0 @@
|
||||
/*
|
||||
Alternative to ExDll.h
|
||||
|
||||
v0.0.1 - 20060811 (AndersK)
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <TChar.h>
|
||||
|
||||
|
||||
typedef TCHAR NSISCH;
|
||||
#define NSISCALL __stdcall
|
||||
|
||||
namespace NSIS {
|
||||
|
||||
__forceinline void* NSISCALL MemAlloc(SIZE_T cb) {return GlobalAlloc(LPTR,cb);}
|
||||
__forceinline void NSISCALL MemFree(void* p) {GlobalFree(p);}
|
||||
|
||||
enum {
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST,
|
||||
|
||||
VIDX_TEMP=(INST_LANG+1), //#define state_temp_dir g_usrvars[25]
|
||||
VIDX_PLUGINSDIR,//# define state_plugins_dir g_usrvars[26]
|
||||
VIDX_EXEPATH,//#define state_exe_path g_usrvars[27]
|
||||
VIDX_EXEFILENAME,//#define state_exe_file g_usrvars[28]
|
||||
VIDX_STATECLICKNEXT,//#define state_click_next g_usrvars[30]
|
||||
__VIDX_UNDOCLAST
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
NSISCH text[ANYSIZE_ARRAY];
|
||||
} stack_t;
|
||||
|
||||
typedef struct {
|
||||
int autoclose;
|
||||
int all_user_var;
|
||||
int exec_error;
|
||||
int abort;
|
||||
int exec_reboot;
|
||||
int reboot_called;
|
||||
int XXX_cur_insttype; // deprecated
|
||||
int XXX_insttype_changed; // deprecated
|
||||
int silent;
|
||||
int instdir_error;
|
||||
int rtl;
|
||||
int errlvl;
|
||||
//NSIS v2.3x ?
|
||||
int alter_reg_view;
|
||||
int status_update;
|
||||
} exec_flags_type;
|
||||
|
||||
typedef struct {
|
||||
exec_flags_type *exec_flags;
|
||||
int (NSISCALL *ExecuteCodeSegment)(int, HWND);
|
||||
void (NSISCALL *validate_filename)(char *);
|
||||
} extra_parameters;
|
||||
|
||||
extern UINT StrSize;
|
||||
extern stack_t **StackTop;
|
||||
extern NSISCH*Vars;
|
||||
|
||||
inline bool NSISCALL SetErrLvl(extra_parameters*pExtraParams,int ErrLevel) {return pExtraParams? ((pExtraParams->exec_flags->errlvl=ErrLevel)||true):false;}
|
||||
inline bool NSISCALL SetErrorFlag(extra_parameters*pExtraParams) {return pExtraParams? ((pExtraParams->exec_flags->exec_error=1)||true):false;}
|
||||
inline bool NSISCALL ClearErrorFlag(extra_parameters*pExtraParams) {return pExtraParams?((pExtraParams->exec_flags->exec_error=0)||true):false;}
|
||||
|
||||
__forceinline int NSISCALL ExecuteCodeSegment(extra_parameters*pExtraParams,int pos,HWND hwndProgress=NULL) {
|
||||
return pExtraParams?pExtraParams->ExecuteCodeSegment(pos,hwndProgress):(/*EXEC_ERROR*/0x7FFFFFFF);
|
||||
}
|
||||
|
||||
static NSISCH* __fastcall GetVar(const int varnum)
|
||||
{
|
||||
//ASSERT(NSIS::Vars && NSIS::StrSize);
|
||||
if (varnum < 0 || varnum >= __VIDX_UNDOCLAST) return NULL;
|
||||
return NSIS::Vars+(varnum*NSIS::StrSize);
|
||||
}
|
||||
|
||||
inline void NSISCALL SetVarUINT(const int varnum,UINT Value) {
|
||||
wsprintf(GetVar(varnum),_T("%u"),Value);
|
||||
}
|
||||
|
||||
static stack_t* NSISCALL StackPop() {
|
||||
if (NSIS::StackTop && *NSIS::StackTop) {
|
||||
stack_t*s=(*NSIS::StackTop);
|
||||
*NSIS::StackTop=(*NSIS::StackTop)->next;
|
||||
return s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
__forceinline void NSISCALL StackFreeItem(stack_t*pStackItem) {NSIS::MemFree(pStackItem);}
|
||||
|
||||
static DWORD NSISCALL StackPush(NSISCH*InStr,UINT StackStrSize=NSIS::StrSize) {
|
||||
if (!NSIS::StackTop)return ERROR_INVALID_PARAMETER;
|
||||
stack_t*sNew=(stack_t*)NSIS::MemAlloc(sizeof(stack_t)+(StackStrSize*sizeof(NSISCH)));
|
||||
if (!sNew)return ERROR_OUTOFMEMORY;
|
||||
lstrcpyn(sNew->text,InStr,StackStrSize);
|
||||
sNew->next=*NSIS::StackTop;
|
||||
*NSIS::StackTop=sNew;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
}; /* namespace */
|
||||
|
||||
#define NSISUTIL_INIT() namespace NSIS {static UINT StrSize;static stack_t **StackTop;static NSISCH*Vars;}//Call in only ONE source file
|
||||
#define NSISUTIL_INITEXPORT(_v,_strsize,_stackt) NSIS::Vars=_v;NSIS::StrSize=_strsize;NSIS::StackTop=_stackt
|
||||
|
||||
//#define NSISEXPORT4(_func,_h,_strsize,_v,_stackt) extern "C" void __declspec(dllexport) __cdecl \
|
||||
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
|
||||
//#define NSISEXPORT5(_func,_h,_strsize,_v,_stackt,_eparams) extern "C" void __declspec(dllexport) __cdecl \
|
||||
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt,NSIS::extra_parameters* _eparams) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
|
||||
//#define NSISEXPORT NSISEXPORT5
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define EXPORTNSISFUNC extern "C" void __declspec(dllexport) __cdecl
|
||||
# else
|
||||
# error EXPORTNSISFUNC needs compiler goo, you are on your own!
|
||||
# endif
|
||||
#define NSISFUNCSTART4(_h,_strsize,_v,_stackt) {NSISUTIL_INITEXPORT(_v,_strsize,_stackt);
|
||||
#define NSISFUNCSTART5(_h,_strsize,_v,_stackt,_eparams) NSISFUNCSTART4(_h,_strsize,_v,_stackt)
|
||||
#define NSISFUNCSTART NSISFUNCSTART5
|
||||
#define NSISFUNCEND() }
|
||||
|
||||
@@ -1,277 +0,0 @@
|
||||
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
|
||||
/*
|
||||
If UAC is disabled, the runas verb is broken (Vista RTM) so when running as LUA there is no way to elevate so
|
||||
we provide our own dialog.
|
||||
*/
|
||||
|
||||
#include "UAC.h"
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
#include <Lmcons.h>//UNLEN && GNLEN && PWLEN
|
||||
#include <WindowsX.h>
|
||||
#include "resource.h"
|
||||
#include "NSISUtil.h"
|
||||
using namespace NSIS;
|
||||
#define ERRAPP_TRYAGAIN (0x20000000|1)
|
||||
#define MYMAX_DOMAIN (2+max(GNLEN,MAX_COMPUTERNAME_LENGTH)+1)
|
||||
|
||||
|
||||
static LPCTSTR g_RunAsDlgTitle=_T("Run as");
|
||||
static LPCTSTR g_RunAsHelpText=_T("You may not have the necessary permissions to use all the features of the program you are about to run. You may run this program as a different user or continue to run the program as the current user.");
|
||||
static LPCTSTR g_RunAsCurrUsrFmt=_T("&Current user (%s)");//Max 50 chars!
|
||||
static LPCTSTR g_RunAsSpecHelp=_T("Run the program as the &following user:");
|
||||
|
||||
FORCEINLINE bool MySetDlgItemText(HWND hDlg,int id,LPCTSTR s) {return MySndDlgItemMsg(hDlg,id,WM_SETTEXT,0,(LPARAM)s)!=0;}
|
||||
|
||||
typedef struct {
|
||||
SHELLEXECUTEINFO*pSEI;
|
||||
bool AsSelf;
|
||||
} RUNASDLGDATA;
|
||||
|
||||
void MyRunAsFmtCurrUserRadio(HWND hDlg,LPCTSTR Fmt) {
|
||||
TCHAR bufFullName[MYMAX_DOMAIN+UNLEN+1];
|
||||
TCHAR buf[50+MYMAX_DOMAIN+UNLEN+1];
|
||||
*bufFullName=0;
|
||||
ULONG cch;
|
||||
if ((!_GetUserNameEx || !_GetUserNameEx(NameSamCompatible,bufFullName,&(cch=COUNTOF(bufFullName)))) &&
|
||||
!_GetUserName(bufFullName,&(cch=COUNTOF(bufFullName))) ) {
|
||||
*bufFullName=0;
|
||||
}
|
||||
wsprintf(buf,Fmt,*bufFullName?bufFullName:_T("?"));
|
||||
MySetDlgItemText(hDlg,IDC_RUNASCURR,buf);
|
||||
|
||||
// default the "User name:" to Administrator from shell32
|
||||
if (LoadString(GetModuleHandle(_T("SHELL32.dll")),21763, bufFullName, COUNTOF(bufFullName)) > 0) {
|
||||
MySetDlgItemText(hDlg,IDC_USERNAME,bufFullName);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
|
||||
void MyRunAsTranslateDlgString(LPCTSTR StrID,LPTSTR Ini,HWND hDlg,INT_PTR DlgItemId,int special=0) {
|
||||
TCHAR buf[MAX_PATH*2];
|
||||
DWORD len=GetPrivateProfileString(_T("MyRunAsStrings"),StrID,0,buf,ARRAYSIZE(buf),Ini);
|
||||
if (len) {
|
||||
if (IDC_RUNASCURR==special)
|
||||
MyRunAsFmtCurrUserRadio(hDlg,buf);
|
||||
else
|
||||
(DlgItemId==-1) ? SetWindowText(hDlg,buf) : MySetDlgItemText(hDlg,DlgItemId,buf);
|
||||
}
|
||||
}
|
||||
|
||||
void MyRunAsTranslateDlg(HWND hDlg) {
|
||||
DWORD len;
|
||||
TCHAR buf[MAX_PATH*2];
|
||||
HMODULE hDll=GetWindowInstance(hDlg);ASSERT(hDll);
|
||||
if ( (len=GetModuleFileName(hDll,buf,ARRAYSIZE(buf))) <1)return;
|
||||
buf[len-3]=0;
|
||||
lstrcat(buf,_T("lng"));
|
||||
MyRunAsTranslateDlgString(_T("DlgTitle"),buf,hDlg,-1);
|
||||
MyRunAsTranslateDlgString(_T("HelpText"),buf,hDlg,IDC_HELPTEXT);
|
||||
MyRunAsTranslateDlgString(_T("OptCurrUser"),buf,hDlg,IDC_RUNASCURR,IDC_RUNASCURR);
|
||||
MyRunAsTranslateDlgString(_T("OptOtherUser"),buf,hDlg,IDC_RUNASSPEC);
|
||||
MyRunAsTranslateDlgString(_T("Username"),buf,hDlg,IDC_LBLUSER);
|
||||
MyRunAsTranslateDlgString(_T("Pwd"),buf,hDlg,IDC_LBLPWD);
|
||||
MyRunAsTranslateDlgString(_T("OK"),buf,hDlg,IDOK);
|
||||
MyRunAsTranslateDlgString(_T("Cancel"),buf,hDlg,IDCANCEL);
|
||||
HWND h=GetDlgItem(hDlg,IDC_RUNASCURR);
|
||||
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("DisableCurrUserOpt"),false,buf))EnableWindow(h,false);
|
||||
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("HideCurrUserOpt"),false,buf))ShowWindow(h,false);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool ErrorIsLogonError(DWORD err) {
|
||||
switch (err) {
|
||||
case ERROR_LOGON_FAILURE:
|
||||
case ERROR_ACCOUNT_RESTRICTION:
|
||||
case ERROR_INVALID_LOGON_HOURS:
|
||||
case ERROR_INVALID_WORKSTATION:
|
||||
case ERROR_PASSWORD_EXPIRED:
|
||||
case ERROR_ACCOUNT_DISABLED:
|
||||
case ERROR_NONE_MAPPED:
|
||||
case ERROR_NO_SUCH_USER:
|
||||
case ERROR_INVALID_ACCOUNT_NAME:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void VerifyOKBtn(HWND hDlg,RUNASDLGDATA*pRADD) {
|
||||
const bool HasText=pRADD?(pRADD->AsSelf?true:MySndDlgItemMsg(hDlg,IDC_USERNAME,WM_GETTEXTLENGTH)>0):false;
|
||||
EnableWindow(GetDlgItem(hDlg,IDOK),HasText);
|
||||
}
|
||||
|
||||
void SetDlgState(HWND hDlg,bool AsSelf,RUNASDLGDATA*pRADD) {
|
||||
if (pRADD)pRADD->AsSelf=AsSelf;
|
||||
MySndDlgItemMsg(hDlg,IDC_RUNASCURR,BM_SETCHECK,AsSelf?BST_CHECKED:BST_UNCHECKED);
|
||||
MySndDlgItemMsg(hDlg,IDC_RUNASSPEC,BM_SETCHECK,!AsSelf?BST_CHECKED:BST_UNCHECKED);
|
||||
int ids[]={IDC_USERNAME,IDC_PASSWORD,IDC_LBLUSER,IDC_LBLPWD};
|
||||
for (int i=0; i<COUNTOF(ids);++i)EnableWindow(GetDlgItem(hDlg,ids[i]),!AsSelf);
|
||||
VerifyOKBtn(hDlg,pRADD);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK MyRunAsDlgProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp) {
|
||||
RUNASDLGDATA*pRADD=(RUNASDLGDATA*)GetWindowLongPtr(hwnd,GWLP_USERDATA);
|
||||
switch(uMsg) {
|
||||
//case WM_DESTROY:
|
||||
// break;
|
||||
case WM_CLOSE:
|
||||
return DestroyWindow(hwnd);
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
pRADD=(RUNASDLGDATA*)lp;ASSERT(pRADD);
|
||||
SetWindowLongPtr(hwnd,GWLP_USERDATA,lp);
|
||||
Edit_LimitText(GetDlgItem(hwnd,IDC_USERNAME),UNLEN+1+MYMAX_DOMAIN); //room for "foo@BAR" or "BAR\foo"
|
||||
Edit_LimitText(GetDlgItem(hwnd,IDC_PASSWORD),PWLEN);
|
||||
const HINSTANCE hSh32=GetModuleHandle(_T("SHELL32.dll"));
|
||||
const HICON hIco=(HICON)LoadImage(hSh32,MAKEINTRESOURCE(194),IMAGE_ICON,32,32,LR_SHARED);
|
||||
MySndDlgItemMsg(hwnd,IDC_SHICON,STM_SETICON,(WPARAM)hIco);
|
||||
SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)g_RunAsDlgTitle);
|
||||
MySetDlgItemText(hwnd,IDC_HELPTEXT,g_RunAsHelpText);
|
||||
MyRunAsFmtCurrUserRadio(hwnd,g_RunAsCurrUsrFmt);
|
||||
MySetDlgItemText(hwnd,IDC_RUNASSPEC,g_RunAsSpecHelp);
|
||||
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
|
||||
MyRunAsTranslateDlg(hwnd);
|
||||
#endif
|
||||
SetDlgState(hwnd,false,pRADD);
|
||||
|
||||
#if defined(BUILD_DBG) && 0 //auto login used during testing ;)
|
||||
SetDlgItemText(hwnd,IDC_USERNAME,_T("root"));
|
||||
SetDlgItemText(hwnd,IDC_PASSWORD,_T("???"));
|
||||
Sleep(1);PostMessage(hwnd,WM_COMMAND,IDOK,0);
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch(HIWORD(wp)) {
|
||||
case EN_CHANGE:
|
||||
VerifyOKBtn(hwnd,pRADD);
|
||||
break;
|
||||
case EN_SETFOCUS:
|
||||
case BN_CLICKED:
|
||||
if (LOWORD(wp)<=IDCANCEL)break;
|
||||
SetDlgState(hwnd,LOWORD(wp)==IDC_RUNASCURR,pRADD);
|
||||
return FALSE;
|
||||
}
|
||||
INT_PTR exitcode=!pRADD?-1:IDCANCEL;
|
||||
switch(LOWORD(wp)) {
|
||||
case IDOK:
|
||||
if (pRADD) {
|
||||
SHELLEXECUTEINFO&sei=*pRADD->pSEI;
|
||||
PROCESS_INFORMATION pi={0};
|
||||
DWORD ec=NO_ERROR;
|
||||
WCHAR*wszExec;//Also used as TCHAR buffer in AsSelf mode
|
||||
bool PerformTCharFmt=pRADD->AsSelf;
|
||||
//const DWORD CommonStartupInfoFlags=STARTF_FORCEONFEEDBACK;
|
||||
#ifdef UNICODE
|
||||
PerformTCharFmt=true;
|
||||
#endif
|
||||
wszExec=(WCHAR*)NSIS::MemAlloc( (pRADD->AsSelf?sizeof(TCHAR):sizeof(WCHAR)) *(lstrlen(sei.lpFile)+1+lstrlen(sei.lpParameters)+1));
|
||||
if (!wszExec)ec=ERROR_OUTOFMEMORY;
|
||||
if (PerformTCharFmt)wsprintf((TCHAR*)wszExec,_T("%s%s%s"),sei.lpFile,((sei.lpParameters&&*sei.lpParameters)?_T(" "):_T("")),sei.lpParameters);
|
||||
if (!ec) {
|
||||
if (pRADD->AsSelf) {
|
||||
STARTUPINFO si={sizeof(si)};
|
||||
TRACEF("MyRunAs:CreateProcess:%s|\n",wszExec);
|
||||
ec=(CreateProcess(0,(TCHAR*)wszExec,0,0,false,0,0,0,&si,&pi)?NO_ERROR:GetLastError());
|
||||
}
|
||||
else {
|
||||
//All Wide strings!
|
||||
WCHAR wszPwd[PWLEN+1];
|
||||
WCHAR wszUName[UNLEN+1+MYMAX_DOMAIN+1];
|
||||
STARTUPINFOW siw={sizeof(siw)};
|
||||
WCHAR*p;
|
||||
#ifndef UNICODE
|
||||
//Build unicode string, we already know the buffer is big enough so no error handling
|
||||
p=wszExec;
|
||||
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpFile,-1,p,0xFFFFFF);
|
||||
if (sei.lpParameters && *sei.lpParameters) {
|
||||
p+=lstrlen(sei.lpFile);*p++=L' ';*p=0;
|
||||
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpParameters,-1,p,0xFFFFFF);
|
||||
}
|
||||
#endif
|
||||
SendMessageW(GetDlgItem(hwnd,IDC_USERNAME),WM_GETTEXT,COUNTOF(wszUName),(LPARAM)wszUName);
|
||||
SendMessageW(GetDlgItem(hwnd,IDC_PASSWORD),WM_GETTEXT,COUNTOF(wszPwd),(LPARAM)wszPwd);
|
||||
|
||||
//Try to find [\\]domain\user and split into username and domain strings
|
||||
WCHAR*pUName=wszUName,*pDomain=0;
|
||||
p=wszUName;
|
||||
//if (*p==p[1]=='\\')pUName=(p+=2);else \ //Should we still split things up if the string starts with \\ ? Is it possible to use \\machine\user at all?
|
||||
++p;//Don't parse "\something", require at least one char before backslash "?[*\]something"
|
||||
while(*p && *p!='\\')++p;
|
||||
if (*p=='\\') {
|
||||
pDomain=pUName;
|
||||
pUName=p+1;*p=0;
|
||||
}
|
||||
|
||||
TRACEF("MyRunAs:CreateProcessWithLogonW:%ws|%ws|%ws|%ws|\n",pUName,pDomain?pDomain:L"NO?DOMAIN",wszPwd,wszExec);
|
||||
ec=(_CreateProcessWithLogonW(pUName,pDomain?pDomain:0,wszPwd,LOGON_WITH_PROFILE,0,wszExec,0,0,0,&siw,&pi)?NO_ERROR:GetLastError());
|
||||
TRACEF("MyRunAs:CreateProcessWithLogonW: ret=%u\n",ec);
|
||||
SecureZeroMemory(wszPwd,sizeof(wszPwd));//if (wszPwd) {volatile WCHAR*_p=wszPwd;for(;_p&&*_p;++_p)*_p=1;if (_p)*wszPwd=0;}//Burn password (And attempt to prevent compiler from removing it)
|
||||
if (ec && ErrorIsLogonError(ec)) {
|
||||
LPTSTR szMsg;
|
||||
DWORD ret=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,ec,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&szMsg,0,0);
|
||||
if (ret) {
|
||||
ec=ERRAPP_TRYAGAIN;
|
||||
MessageBox(hwnd,szMsg,0,MB_ICONWARNING);
|
||||
LocalFree(szMsg);
|
||||
}
|
||||
else ec=GetLastError();
|
||||
}
|
||||
}
|
||||
}
|
||||
NSIS::MemFree(wszExec);
|
||||
if (pi.hThread)CloseHandle(pi.hThread);
|
||||
if (ERRAPP_TRYAGAIN==ec)break;
|
||||
if (ec) {
|
||||
SetLastError(ec);
|
||||
exitcode=-1;
|
||||
}
|
||||
else {
|
||||
pRADD->pSEI->hProcess=pi.hProcess;
|
||||
exitcode=IDOK;
|
||||
}
|
||||
}
|
||||
case IDCANCEL:
|
||||
EndDialog(hwnd,exitcode);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei) {
|
||||
INT_PTR ec;
|
||||
ASSERT(sei.cbSize>=sizeof(SHELLEXECUTEINFO) && hInstDll);
|
||||
if (ec=DelayLoadDlls())return ec;
|
||||
ASSERT(_CreateProcessWithLogonW && _GetUserName);
|
||||
RUNASDLGDATA radd={0};
|
||||
radd.pSEI=&sei;
|
||||
ec=DialogBoxParam(hInstDll,MAKEINTRESOURCE(IDD_MYRUNAS),sei.hwnd,MyRunAsDlgProc,(LPARAM)&radd);
|
||||
TRACEF("MyRunAs returned %d (%s|%s)\n",ec,sei.lpFile,sei.lpParameters);
|
||||
switch(ec) {
|
||||
case 0:
|
||||
return ERROR_INVALID_HANDLE;//DialogBoxParam returns 0 on bad hwnd
|
||||
case IDOK:
|
||||
return NO_ERROR;
|
||||
case IDCANCEL:
|
||||
return ERROR_CANCELLED;
|
||||
}
|
||||
//TODO:BUGBUG: on vista, the last error seems to get lost, should probably put it in RUNASDLGDATA and always return IDOK
|
||||
return GetLastError();
|
||||
}
|
||||
|
||||
|
||||
#ifdef BUILD_DBG
|
||||
// RunDll exports are __stdcall, we dont care about that for this debug export, rundll32.exe is able to handle this mistake
|
||||
extern "C" void __declspec(dllexport) __cdecl DBGRDMyRunAs(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow) {
|
||||
SHELLEXECUTEINFO sei={sizeof(sei)};
|
||||
sei.lpFile=_T("Notepad.exe");//sei.lpParameters=_T("param1");
|
||||
TRACEF("ec=%d\n",MyRunAs(GetModuleHandle(_T("UAC.dll")),sei));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* FEAT_CUSTOMRUNASDLG */
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html><head>
|
||||
<title>UAC plug-in readme</title>
|
||||
<script type="text/javascript">
|
||||
function NavGL(q){window.open("http://www.google.com/search?hl=en&btnI=I&num=2&q="+escape(q));return 0;}
|
||||
</script>
|
||||
<style type="text/css">
|
||||
html,body {background-color:#FFF; color:#000;}
|
||||
a:link, a:visited, a:active {color:#00F;}
|
||||
h2 {border-bottom:0.1em solid #000;}
|
||||
#docHdrHdln{text-align:center;}
|
||||
.importanttxt {color:#e00;}
|
||||
.code {font-family:monospace;}
|
||||
.nsisvar {color:#C00;}
|
||||
.str {color:#390}
|
||||
.inifile {background-color:#EEE;border:1px solid #000;padding:0.2em;}
|
||||
.inicomment {background-color:#f5f5c5;color:#555;}
|
||||
table.piexport {text-align:left;margin-bottom:1em;}
|
||||
table.piexport td {vertical-align:top;}
|
||||
table.piexport table.ret {padding:0;margin:0;border:0;}
|
||||
</style>
|
||||
</head><body>
|
||||
<h1 id="docHdrHdln">UAC plug-in</h1>
|
||||
|
||||
|
||||
<code><pre>
|
||||
Interactive User (MediumIL) Admin user(HighIL)
|
||||
+++[Setup.exe]++++++++++++++ +++[Setup.exe]++++++++++++++
|
||||
+ + + +
|
||||
+ ***[.OnInit]************ + + ***[.OnInit]************ +
|
||||
+ * UAC::RunElevated >---+-+------>+ * * +
|
||||
+ * NSIS.Quit() * + + * * +
|
||||
+ ************************ + + ***********||*********** +
|
||||
+ + + || +
|
||||
+ + + \/ +
|
||||
+ ***[Sections]*********** + + ***[Sections]*********** +
|
||||
+ * * + /--+-+-< UAC::Exec * +
|
||||
+ ************************ + | + ************************ +
|
||||
+ + | + +
|
||||
+ Win32.CreateProcess() <-+----/ + +
|
||||
+ + + +
|
||||
++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
|
||||
</pre></code>
|
||||
|
||||
|
||||
<h2>Contents</h2>
|
||||
<ul>
|
||||
<li><a href="#exports">Plugin Functions</a>
|
||||
<li><a href="#lang">Language support</a>
|
||||
<li><a href="#knownissues">Known Issues</a>
|
||||
<li><a href="#glossary">Glossary</a>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="exports"><h2>Plugin Functions</h2></a><div class="CntSec"><p>
|
||||
Every function will try to emulate the basic NSIS instruction (of similar name) when UAC::RunElevated has not "succeeded" or running on a system that does not support elevation (Win9x/NT4)</p>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::RunElevated</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>:
|
||||
<table class="ret">
|
||||
<tr><td>0</td><td>UAC is not supported by the OS</td></tr>
|
||||
<tr><td>1</td><td>Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)</td></tr>
|
||||
<tr><td>2</td><td>The process is already running @ HighIL (Member of admin group)</td></tr>
|
||||
<tr><td>3</td><td>You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
<tr><td><span class="nsisvar">$2</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0 && <span class="nsisvar">$1</span>==1</span>: ExitCode of the elevated fork process (The NSIS errlvl is also set)</td></tr>
|
||||
<tr><td><span class="nsisvar">$3</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>: 1 if the user is a member of the admin group or 0 otherwise</td></tr>
|
||||
</table></td></tr>
|
||||
<tr><td>Description:</td><td>Allows non-admin/UAC.LUA users to re-spawn the installer as another user and UAC.Admin users to elevate.</td></tr>
|
||||
</table>
|
||||
<!--table class="piexport"><tr><th colspan=2>UAC::RunElevatedAndProcessMessages <i style="font-size:smaller;">(Experimental)</i></th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><i>See UAC::RunElevated</i></td></tr>
|
||||
<tr><td>Description:</td><td>Version of UAC::RunElevated that can be called from a page</td></tr>
|
||||
</table-->
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::Unload</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td></td></tr>
|
||||
<tr><td>Description:</td><td>Cleanup, you must call this function in .OnInstFailed, .onUserAbort and .OnInstSuccess</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::Exec</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ExecWait</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ShellExec</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ShellExecWait</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::IsAdmin</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> (BOOL) result</td></tr>
|
||||
<tr><td>Description:</td><td>Check current thread/process token for a non-deny admin group SID entry</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::ExecCodeSegment</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:NSISFunctionAddress></td></tr>
|
||||
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
|
||||
<tr><td>Description:</td><td>Calls NSIS function in LUA/outer instance (If you use instructions that alter the UI or the stack/variables in the code segment (StrCpy,Push/Pop/Exch,DetailPrint etc.) they will affect the hidden wrapper installer and not "your" installer instance)</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::StackPush</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:String></td></tr>
|
||||
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
|
||||
<tr><td>Description:</td><td>Push to outer instance stack (For use with UAC::ExecCodeSegment)</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::GetOuterHwnd</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> HWNDPARENT of outer instance</td></tr>
|
||||
<tr><td>Description:</td><td>For use with ${UAC.RunElevatedAndProcessMessages}</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::SupportsUAC</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> !=0 if supported</td></tr>
|
||||
<tr><td>Description:</td><td>Check if the OS supports UAC (And the user has UAC turned on) <span class="importanttxt">This function only tests if UAC is active, will return 0 on NT5 even though runas is implemented on those platforms, will also return 0 on NT6+ if UAC is off. You should only call this function during testing, NOT to determine if you can call UAC::RunElevated</span></td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::GetElevationType</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td><a href="#" OnClick="return NavGL('TOKEN_ELEVATION_TYPE Enumeration')">TOKEN_ELEVATION_TYPE</a>:
|
||||
<table class="ret">
|
||||
<tr><td>0</td><td>Unsupported/Failed (ErrorFlag is also set)</td></tr>
|
||||
<tr><td>1</td><td>TokenElevationTypeDefault: User is not using a split token (UAC disabled)</td></tr>
|
||||
<tr><td>2</td><td>TokenElevationTypeFull: UAC enabled, the (current) process is elevated</td></tr>
|
||||
<tr><td>3</td><td>TokenElevationTypeLimited: UAC enabled, the process is not elevated</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="lang"><h2>Language support</h2></a><div class="CntSec">
|
||||
<p>If the plugin is built with FEAT_CUSTOMRUNASDLG_TRANSLATE (Enabled by default),
|
||||
you can extract a file named <span class="str">UAC.LNG</span> to <span class="nsisvar">$pluginsdir</span>.
|
||||
It is a ini file with the following sections:
|
||||
</p><pre class="inifile">
|
||||
[MyRunAsCfg]
|
||||
<span class="inicomment">;Set to 1 to disable the radio button</span>
|
||||
DisableCurrUserOpt=
|
||||
<span class="inicomment">;Set to 1 to hide the radio button</span>
|
||||
HideCurrUserOpt=
|
||||
|
||||
[MyRunAsStrings]
|
||||
DlgTitle=Hello There!
|
||||
HelpText=Just do your thing!
|
||||
<span class="inicomment">;Label for current user radio button, %s is replaced with result of GetUserNameEx(NameSamCompatible,...)</span>
|
||||
OptCurrUser=Self service (%s)
|
||||
OptOtherUser=Run as someone:
|
||||
UserName=Who:
|
||||
Pwd=PIN:
|
||||
OK=Okey!
|
||||
Cancel=No Way</pre>
|
||||
</div>
|
||||
|
||||
<a name="knownissues"><h2>Known Issues</h2></a><div class="CntSec">
|
||||
<ul>
|
||||
<li>UACPI.KI#1: DetailPrint in outer process is ignored
|
||||
<li>UACPI.KI#2: Elevation can fail if the installer is located on a remote share that requires authentication
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<a name="glossary"><h2>Glossary</h2></a><div class="CntSec">
|
||||
<ul>
|
||||
<li>AAM: Admin Approval Mode
|
||||
<li>IL: Integrity level (Part of the new MIC/WIC security levels added to NT6)
|
||||
<li>LUA: Limited/Least-privilege User Account
|
||||
<li>MIC: <a href="http://en.wikipedia.org/wiki/Mandatory_Integrity_Control">Mandatory Integrity Controls</a> (Now known as WIC)
|
||||
<li>UAC: User Account Control (Part of the UAP umbrella)
|
||||
<li>UAP: User Account Protection
|
||||
<li>WIC: <a href="http://www.securityfocus.com/infocus/1887">Windows Integrity Controls</a>
|
||||
<li>Win32 error code: Standard windows error codes, ERROR_???
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
@@ -1,191 +0,0 @@
|
||||
/*
|
||||
=======================
|
||||
UAC helper include file
|
||||
.......................
|
||||
|
||||
Macros starting with UAC.I should only be called from the installer and vice versa for UAC.U macros.
|
||||
|
||||
*/
|
||||
!ifndef UAC_HDR__INC
|
||||
!define UAC_HDR__INC
|
||||
!include LogicLib.nsh
|
||||
|
||||
!define UAC.RunElevatedAndProcessMessages 'UAC::RunElevated '
|
||||
!define UAC.Unload 'UAC::Unload '
|
||||
!define UAC.StackPush 'UAC::StackPush '
|
||||
|
||||
/*!macro _UAC.BuildOnInitElevationFunc _funcprefix
|
||||
Function ${_funcprefix}onInit
|
||||
!ifmacrodef
|
||||
FunctionEnd
|
||||
!macroend*/
|
||||
|
||||
!macro _UAC.GenerateSimpleFunction _funcprefix _funcName _funcCode
|
||||
Function ${_funcprefix}${_funcName}
|
||||
${_funcCode}
|
||||
#messagebox mb_ok "${_funcprefix}${_funcName}"
|
||||
FunctionEnd
|
||||
!macroend
|
||||
|
||||
!macro _UAC.TryDef _d _v
|
||||
!ifndef ${_d}
|
||||
!define ${_d} "${_v}"
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
!macro _UAC.InitStrings _modeprefix
|
||||
!insertmacro _UAC.TryDef UACSTR.UnDataFile "UAC.dat"
|
||||
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvWinErr "Unable to elevate , error $0"
|
||||
!ifNdef __UNINSTALL__
|
||||
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvAbortReqAdmin "This installer requires admin access, aborting!"
|
||||
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvMustTryAgain "This installer requires admin access, try again"
|
||||
!else
|
||||
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvAbortReqAdmin "This uninstaller requires admin access, aborting!"
|
||||
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvMustTryAgain "This uninstaller requires admin access, try again"
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
!ifmacroNdef _UAC.GenerateUninstallerTango
|
||||
!macro _UAC.GenerateUninstallerTango UninstallerFileName
|
||||
!ifdef __GLOBAL__
|
||||
!error "UAC: Needs to be called inside a function"
|
||||
!endif
|
||||
!ifNdef __UNINSTALL__
|
||||
!error "UAC: _UAC.GenerateUninstallerTango should only be called by uninstaller, see http://forums.winamp.com/showthread.php?threadid=280330"
|
||||
!endif
|
||||
!ifNdef UAC_UNINSTALLERTANGOFORALLPLATFORMS
|
||||
!include WinVer.nsh
|
||||
!endif
|
||||
!insertmacro _UAC.InitStrings 'U.'
|
||||
ReadIniStr $0 "$ExeDir\${UACSTR.UnDataFile}" UAC "Un.Ready"
|
||||
${IF} $0 != 1
|
||||
!ifNdef UAC_UNINSTALLERTANGOFORALLPLATFORMS
|
||||
${AndIf} ${AtLeastWinVista}
|
||||
!endif
|
||||
InitPluginsDir
|
||||
WriteIniStr "$PluginsDir\${UACSTR.UnDataFile}" UAC "Un.Ready" 1
|
||||
CopyFiles /SILENT "$EXEPATH" "$PluginsDir\${UninstallerFileName}"
|
||||
StrCpy $0 ""
|
||||
${IfThen} ${Silent} ${|} StrCpy $0 "/S " ${|}
|
||||
ExecWait '"$PluginsDir\${UninstallerFileName}" $0/NCRC _?=$INSTDIR' $0
|
||||
SetErrorLevel $0
|
||||
Quit
|
||||
${EndIf}
|
||||
!macroend
|
||||
!endif
|
||||
|
||||
!ifmacroNdef _UAC.GenerateOnInitElevationCode
|
||||
!macro _UAC.GenerateOnInitElevationCode _modeprefix
|
||||
!ifndef __FUNCTION__
|
||||
!error "UAC: Needs to be called inside a function"
|
||||
!endif
|
||||
!insertmacro _UAC.InitStrings ${_modeprefix}
|
||||
!define _UAC.GOIECUniq L${__LINE__}
|
||||
UAC_Elevate_${_UAC.GOIECUniq}:
|
||||
UAC::RunElevated
|
||||
StrCmp 1223 $0 UAC_ElevationAborted_${_UAC.GOIECUniq} ; UAC dialog aborted by user?
|
||||
StrCmp 0 $0 0 UAC_Err_${_UAC.GOIECUniq} ; Error?
|
||||
StrCmp 1 $1 0 UAC_Success_${_UAC.GOIECUniq} ;Are we the real deal or just the wrapper?
|
||||
Quit
|
||||
UAC_Err_${_UAC.GOIECUniq}:
|
||||
MessageBox mb_iconstop "${UACSTR.${_modeprefix}ElvWinErr}"
|
||||
Abort
|
||||
UAC_ElevationAborted_${_UAC.GOIECUniq}:
|
||||
MessageBox mb_iconstop "${UACSTR.${_modeprefix}ElvAbortReqAdmin}"
|
||||
Abort
|
||||
UAC_Success_${_UAC.GOIECUniq}:
|
||||
# if $0==0 && $3==1, we are a member of the admin group (Any OS)
|
||||
# if $0==0 && $1==0, UAC not supported (Probably <NT6), run as normal?
|
||||
# if $0==0 && $1==3, we can try to elevate again
|
||||
StrCmp 1 $3 /*+4*/ UAC_Done_${_UAC.GOIECUniq} ;Admin?
|
||||
StrCmp 3 $1 0 UAC_ElevationAborted_${_UAC.GOIECUniq} ;Try again or abort?
|
||||
MessageBox mb_iconexclamation "${UACSTR.${_modeprefix}ElvMustTryAgain}" ;Inform user...
|
||||
goto UAC_Elevate_${_UAC.GOIECUniq} ;...lets try again
|
||||
UAC_Done_${_UAC.GOIECUniq}:
|
||||
!undef _UAC.GOIECUniq
|
||||
!macroend
|
||||
!endif
|
||||
|
||||
!define UAC.I.Elevate.AdminOnly '!insertmacro UAC.I.Elevate.AdminOnly '
|
||||
!macro UAC.I.Elevate.AdminOnly
|
||||
!insertmacro _UAC.GenerateOnInitElevationCode 'I.'
|
||||
!macroend
|
||||
|
||||
!define UAC.U.Elevate.AdminOnly '!insertmacro UAC.U.Elevate.AdminOnly '
|
||||
!macro UAC.U.Elevate.AdminOnly _UninstallerName
|
||||
!ifNdef UAC_DISABLEUNINSTALLERTANGO
|
||||
!insertmacro _UAC.GenerateUninstallerTango "${_UninstallerName}"
|
||||
!endif
|
||||
!insertmacro _UAC.GenerateOnInitElevationCode 'U.'
|
||||
!macroend
|
||||
|
||||
!define UAC.AutoCodeUnload '!insertmacro UAC.AutoCodeUnload '
|
||||
!macro UAC.AutoCodeUnload _HasUninstaller
|
||||
!insertmacro _UAC.GenerateSimpleFunction "" .OnInstFailed '${UAC.Unload}'
|
||||
!insertmacro _UAC.GenerateSimpleFunction "" .OnInstSuccess '${UAC.Unload}'
|
||||
!ifNdef MUI_INCLUDED
|
||||
!insertmacro _UAC.GenerateSimpleFunction "" .onUserAbort '${UAC.Unload}'
|
||||
!else
|
||||
!ifNdef MUI_CUSTOMFUNCTION_ABORT
|
||||
!error "UAC: must call $$ {UAC.Unload} in MUI_CUSTOMFUNCTION_ABORT!"
|
||||
!endif
|
||||
!endif
|
||||
!if "${_HasUninstaller}" != ""
|
||||
!insertmacro _UAC.GenerateSimpleFunction "un" .onUninstFailed '${UAC.Unload}'
|
||||
!insertmacro _UAC.GenerateSimpleFunction "un" .onUninstSuccess '${UAC.Unload}'
|
||||
!ifNdef MUI_INCLUDED
|
||||
!insertmacro _UAC.GenerateSimpleFunction "un" .onUserAbort '${UAC.Unload}'
|
||||
!else
|
||||
!ifNdef MUI_CUSTOMFUNCTION_ABORT
|
||||
!error "UAC: must call $$ {UAC.Unload} in MUI_CUSTOMFUNCTION_(UN)ABORT!"
|
||||
!endif
|
||||
!endif
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
!define UAC.FastCallFunctionAsUser '!insertmacro UAC.FastCallFunctionAsUser '
|
||||
!macro UAC.FastCallFunctionAsUser _func _var
|
||||
GetFunctionAddress ${_var} ${_func}
|
||||
UAC::ExecCodeSegment ${_var}
|
||||
!macroend
|
||||
!define UAC.CallFunctionAsUser '!insertmacro UAC.CallFunctionAsUser '
|
||||
!macro UAC.CallFunctionAsUser _func
|
||||
push $R9
|
||||
!insertmacro UAC.FastCallFunctionAsUser ${_func} $R9
|
||||
pop $R9
|
||||
!macroend
|
||||
|
||||
!define UAC.FastCallGetOuterInstanceHwndParent UAC::GetOuterHwnd
|
||||
!define UAC.GetOuterInstanceHwndParent '!insertmacro UAC.GetOuterInstanceHwndParent '
|
||||
!macro UAC.GetOuterInstanceHwndParent _var
|
||||
push $0
|
||||
${UAC.FastCallGetOuterInstanceHwndParent}
|
||||
Exch $0
|
||||
Pop ${_var}
|
||||
!macroend
|
||||
|
||||
|
||||
|
||||
!macro _UAC.DumpEx _disp _f _fp _v
|
||||
${_f} ${_fp}
|
||||
DetailPrint "${_disp}=${_v}"
|
||||
!macroend
|
||||
!macro _UAC.Dump _f _fp _v
|
||||
!insertmacro _UAC.DumpEx `${_f}` `${_f}` `${_fp}` `${_v}`
|
||||
!macroend
|
||||
!macro _UAC.DbgDetailPrint
|
||||
push $0
|
||||
push $1
|
||||
System::Call /NoUnload "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})"
|
||||
System::Call "Kernel32::GetComputerName(t.r1,*i${NSIS_MAX_STRLEN})"
|
||||
DetailPrint "$1\$0"
|
||||
;!insertmacro _UAC.DumpEx "User" System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})" $0
|
||||
!insertmacro _UAC.DumpEx "CmdLine" "" "" "$CmdLine"
|
||||
!insertmacro _UAC.Dump UAC::IsAdmin "" $0
|
||||
!insertmacro _UAC.Dump UAC::SupportsUAC "" $0
|
||||
!insertmacro _UAC.Dump UAC::GetElevationType "" $0
|
||||
pop $1
|
||||
pop $0
|
||||
!macroend
|
||||
|
||||
!endif /* ifndef UAC_HDR__INC */
|
||||
@@ -1,62 +0,0 @@
|
||||
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
|
||||
!define APPNAME "UAC_AdminOnly"
|
||||
Name "${APPNAME}"
|
||||
OutFile "${APPNAME}.exe"
|
||||
ShowInstDetails show
|
||||
|
||||
!include UAC.nsh ;<<< New headerfile that does everything for you ;)
|
||||
!include LogicLib.nsh
|
||||
|
||||
!define UACSTR.I.ElvAbortReqAdmin "This fancy app requires admin rights fool" ;custom error string, see _UAC.InitStrings macro in uac.nsh for more
|
||||
|
||||
Function .OnInit
|
||||
${UAC.I.Elevate.AdminOnly}
|
||||
FunctionEnd
|
||||
|
||||
Function .OnInstFailed
|
||||
${UAC.Unload}
|
||||
FunctionEnd
|
||||
Function .OnInstSuccess
|
||||
${UAC.Unload}
|
||||
FunctionEnd
|
||||
|
||||
Function ExecCodeSegmentTest
|
||||
${If} "$1" != "666, the # of the beast"
|
||||
MessageBox mb_ok "uh oh"
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Section "Info"
|
||||
!insertmacro _UAC.DbgDetailPrint
|
||||
|
||||
StrCpy $1 "666, the # of the beast"
|
||||
!insertmacro UAC.CallFunctionAsUser ExecCodeSegmentTest
|
||||
SectionEnd
|
||||
|
||||
page InstFiles
|
||||
|
||||
/* LEGACY CODE: (now uses magic code from UAC.nsh)
|
||||
Function .OnInit
|
||||
UAC_Elevate:
|
||||
UAC::RunElevated
|
||||
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
|
||||
StrCmp 0 $0 0 UAC_Err ; Error?
|
||||
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
|
||||
Quit
|
||||
UAC_Err:
|
||||
MessageBox mb_iconstop "Unable to elevate , error $0"
|
||||
Abort
|
||||
UAC_ElevationAborted:
|
||||
/*System::Call "user32::CreateWindowEx(i ${WS_EX_TRANSPARENT}|${WS_EX_LAYERED}, t 'Button', t 'blah', i 0, i 10, i 10, i 10, i 10, i 0, i 0, i 0) i .r0"
|
||||
ShowWindow $0 ${SW_SHOW}
|
||||
System::Call "user32::SetForegroundWindow(i r0) i."
|
||||
System::Call "user32::DestroyWindow(i r0) i."
|
||||
* /
|
||||
MessageBox mb_iconstop "This installer requires admin access, aborting!"
|
||||
Abort
|
||||
UAC_Success:
|
||||
StrCmp 1 $3 +4 ;Admin?
|
||||
StrCmp 3 $1 0 UAC_ElevationAborted ;Try again or abort?
|
||||
MessageBox mb_iconstop "This installer requires admin access, try again" ;Inform user...
|
||||
goto UAC_Elevate ;... and try again
|
||||
FunctionEnd*/
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
This sample will try to elevate, but it will also allow non admin users to continue if they click cancel in the elevation dialog
|
||||
*/
|
||||
|
||||
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
|
||||
!define APPNAME "UAC_AllowLUA"
|
||||
Name "${APPNAME}"
|
||||
OutFile "${APPNAME}.exe"
|
||||
ShowInstDetails show
|
||||
!include UAC.nsh
|
||||
|
||||
|
||||
Function .OnInstFailed
|
||||
UAC::Unload ;Must call unload!
|
||||
FunctionEnd
|
||||
Function .OnInstSuccess
|
||||
UAC::Unload ;Must call unload!
|
||||
FunctionEnd
|
||||
|
||||
Function .OnInit
|
||||
UAC::RunElevated
|
||||
;MessageBox mb_iconinformation "Debug: UAC::RunElevated: $\n0(Error)=$0 $\n1(UACMode)=$1 $\n2=$2 $\nadmin=$3$\n$\n$CmdLine"
|
||||
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
|
||||
StrCmp 0 $0 0 UAC_Err ; Error?
|
||||
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
|
||||
Quit
|
||||
UAC_Err:
|
||||
MessageBox mb_iconstop "Unable to elevate , error $0"
|
||||
Abort
|
||||
UAC_ElevationAborted:
|
||||
# elevation was aborted, we still run as normal
|
||||
UAC_Success:
|
||||
FunctionEnd
|
||||
|
||||
|
||||
|
||||
Section "Info"
|
||||
!insertmacro _UAC.DbgDetailPrint
|
||||
SectionEnd
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page InstFiles
|
||||
@@ -1,30 +0,0 @@
|
||||
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
|
||||
!define APPNAME "UAC_GetUserShellFolderPath"
|
||||
Name "${APPNAME}"
|
||||
OutFile "${APPNAME}.exe"
|
||||
ShowInstDetails show
|
||||
|
||||
!include UAC.nsh
|
||||
!include LogicLib.nsh
|
||||
|
||||
page instfiles
|
||||
|
||||
Function .onInit
|
||||
${UAC.I.Elevate.AdminOnly}
|
||||
FunctionEnd
|
||||
|
||||
!ifndef CSIDL_PERSONAL
|
||||
!define CSIDL_PERSONAL 0x0005 ;My Documents
|
||||
!endif
|
||||
Section
|
||||
|
||||
/*
|
||||
You can specify a fallback value in the 2nd parameter, it is used if the installer is not elevated
|
||||
or running on NT4/Win9x or on errors.
|
||||
If you just want to check for success, use "" as the 2nd parameter and compare $0 with ""
|
||||
*/
|
||||
UAC::GetShellFolderPath ${CSIDL_PERSONAL} $Documents
|
||||
DetailPrint MyDocs=$0
|
||||
|
||||
|
||||
SectionEnd
|
||||
@@ -1,235 +0,0 @@
|
||||
/*
|
||||
This sample supports two modes, installing as a normal user (single user install) AND as admin (all users install)
|
||||
This sample uses the registry plugin, so you need to download that if you don't already have it
|
||||
*/
|
||||
|
||||
!define APPNAME "UAC_RealWorldFullyLoadedDualMode"
|
||||
!define ELEVATIONTITLE "${APPNAME}: Elevate" ;displayed during elevation on our custom page
|
||||
!define UNINSTALLER_NAME "Uninstall ${APPNAME}.exe"
|
||||
!define UNINSTALLER_REGSECTION "${APPNAME}"
|
||||
!define RegPath.MSUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall"
|
||||
Name "${APPNAME}"
|
||||
OutFile "${APPNAME}.exe"
|
||||
ShowInstDetails show
|
||||
SetCompressor LZMA
|
||||
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
|
||||
!include MUI.nsh
|
||||
!include UAC.nsh
|
||||
!include LogicLib.nsh
|
||||
!include Registry.nsh
|
||||
!include nsDialogs.nsh ;for our custom page
|
||||
!include FileFunc.nsh ;we need to parse the command line
|
||||
|
||||
!insertmacro GetParameters
|
||||
!insertmacro GetOptions
|
||||
|
||||
!define MUI_CUSTOMFUNCTION_ABORT onAbort
|
||||
!define MUI_CUSTOMFUNCTION_GUIINIT onGuiInit
|
||||
!define MUI_COMPONENTSPAGE_NODESC
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
||||
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\llama-blue.ico"
|
||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\llama-blue.ico"
|
||||
!define MUI_WELCOMEPAGE_TITLE_3LINES
|
||||
|
||||
var InstMode # 0: Single user, 1:All users, >1:elevated instance, perform page jump
|
||||
var hKey # Reg hive
|
||||
var hSelModeAdminRadio
|
||||
var StartMenuFolder
|
||||
|
||||
!macro SetMode IsAdmin
|
||||
!if "${IsAdmin}" > 0
|
||||
SetShellVarContext all
|
||||
StrCpy $InstMode 1
|
||||
StrCpy $hKey HKLM
|
||||
!else
|
||||
SetShellVarContext current
|
||||
StrCpy $InstMode 0
|
||||
StrCpy $hKey HKCU
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
Function .OnInit
|
||||
!insertmacro SetMode 0
|
||||
${GetParameters} $R9
|
||||
${GetOptions} "$R9" UAC $0 ;look for special /UAC:???? parameter (sort of undocumented)
|
||||
${Unless} ${Errors}
|
||||
UAC::IsAdmin
|
||||
${If} $0 < 1
|
||||
SetErrorLevel 666 ;special return value for outer instance so it knows we did not have admin rights
|
||||
Quit
|
||||
${EndIf}
|
||||
!insertmacro SetMode 1
|
||||
StrCpy $InstMode 2
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function onGuiInit
|
||||
${If} $InstMode >= 2
|
||||
${UAC.GetOuterInstanceHwndParent} $0
|
||||
${If} $0 <> 0
|
||||
System::Call /NOUNLOAD "*(i,i,i,i)i.r1"
|
||||
System::Call /NOUNLOAD 'user32::GetWindowRect(i $0,i r1)i.r2'
|
||||
${If} $2 <> 0
|
||||
System::Call /NOUNLOAD "*$1(i.r2,i.r3)"
|
||||
System::Call /NOUNLOAD 'user32::SetWindowPos(i $hwndParent,i0,ir2,ir3,i0,i0,i 4|1)'
|
||||
${EndIf}
|
||||
ShowWindow $hwndParent ${SW_SHOW}
|
||||
ShowWindow $0 ${SW_HIDE} ;hide outer instance installer window
|
||||
System::Free $1
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function Un.OnInit
|
||||
!insertmacro SetMode 0
|
||||
ReadRegDWORD $0 HKLM "${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" InstMode ;We saved the "mode" in the installer
|
||||
${If} $0 U> 0
|
||||
; If it was installed for all users, we have to be admin to uninstall it
|
||||
${UAC.U.Elevate.AdminOnly} "${UNINSTALLER_NAME}"
|
||||
!insertmacro SetMode 1
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function onAbort
|
||||
${UAC.Unload}
|
||||
FunctionEnd
|
||||
|
||||
${UAC.AutoCodeUnload} 1 ;Auto-generate .OnInstFailed and .OnInstSuccess functions
|
||||
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageInElvModePreCB
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
Page Custom ModeSelectionPageCreate ModeSelectionPageLeave
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE CmpntsPreCB
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE DirPreCB
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_STARTMENU 1 $StartMenuFolder
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!define MUI_FINISHPAGE_TITLE_3LINES
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
!define MUI_FINISHPAGE_RUN_FUNCTION FinishRunCB
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
!define MUI_WELCOMEPAGE_TITLE_3LINES
|
||||
!insertmacro MUI_UNPAGE_WELCOME
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
|
||||
Function CmpntsPreCB
|
||||
GetDlgItem $0 $hwndparent 3
|
||||
${IfThen} $InstMode >= 1 ${|} EnableWindow $0 0 ${|} ;prevent user from going back and selecting single user so noobs don't end up installing as the wrong user
|
||||
FunctionEnd
|
||||
|
||||
Function SkipPageInElvModePreCB
|
||||
${IfThen} $InstMode > 1 ${|} Abort ${|} ;skip this page so we get to the mode selection page
|
||||
FunctionEnd
|
||||
|
||||
Function ModeSelectionPageCreate
|
||||
${If} $InstMode > 1
|
||||
StrCpy $InstMode 1
|
||||
Abort ;skip this page and contine where the "parent" would have gone
|
||||
${EndIf}
|
||||
!insertmacro MUI_HEADER_TEXT_PAGE "Select install type" "Blah blah blah blah"
|
||||
nsDialogs::Create /NOUNLOAD 1018
|
||||
Pop $0
|
||||
${NSD_CreateLabel} 0 20u 75% 20u "Blah blah blah blah select install type..."
|
||||
Pop $0
|
||||
System::Call "advapi32::GetUserName(t.r0, *i ${NSIS_MAX_STRLEN}r1) i.r2"
|
||||
${NSD_CreateRadioButton} 0 40u 75% 15u "Single User ($0)"
|
||||
Pop $0
|
||||
${IfThen} $InstMode U< 1 ${|} SendMessage $0 ${BM_SETCHECK} 1 0 ${|}
|
||||
${NSD_CreateRadioButton} 0 60u 75% 15u "All users"
|
||||
Pop $hSelModeAdminRadio
|
||||
${IfThen} $InstMode U> 0 ${|} SendMessage $hSelModeAdminRadio ${BM_SETCHECK} 1 0 ${|}
|
||||
nsDialogs::Show
|
||||
FunctionEnd
|
||||
|
||||
!macro EnableCtrl dlg id state
|
||||
push $language
|
||||
GetDlgItem $language ${dlg} ${id}
|
||||
EnableWindow $language ${state}
|
||||
pop $language
|
||||
!macroend
|
||||
|
||||
Function ModeSelectionPageLeave
|
||||
SendMessage $hSelModeAdminRadio ${BM_GETCHECK} 0 0 $9
|
||||
UAC::IsAdmin
|
||||
${If} $9 U> 0
|
||||
${If} $0 <> 0
|
||||
!insertmacro SetMode 1
|
||||
${Else}
|
||||
System::Call /NoUnload 'user32::GetWindowText(i $HwndParent,t.R1,i ${NSIS_MAX_STRLEN})' ;get original window title
|
||||
System::Call /NoUnload 'user32::SetWindowText(i $HwndParent,t "${ELEVATIONTITLE}")' ;set out special title
|
||||
StrCpy $2 "" ;reset special return, only gets set when sub process is executed, not when user cancels
|
||||
!insertmacro EnableCtrl $HWNDParent 1 0 ;Disable next button, just because it looks good ;)
|
||||
${UAC.RunElevatedAndProcessMessages}
|
||||
!insertmacro EnableCtrl $HWNDParent 1 1
|
||||
System::Call 'user32::SetWindowText(i $HwndParent,t "$R1")' ;restore title
|
||||
${If} $2 = 666 ;our special return, the new process was not admin after all
|
||||
MessageBox mb_iconExclamation "You need to login with an account that is a member of the admin group to continue..."
|
||||
Abort
|
||||
${ElseIf} $0 = 1223 ;cancel
|
||||
Abort
|
||||
${Else}
|
||||
${If} $0 <> 0
|
||||
${If} $0 = 1062
|
||||
MessageBox mb_iconstop "Unable to elevate, Secondary Logon service not running!"
|
||||
${Else}
|
||||
MessageBox mb_iconstop "Unable to elevate, error $0 ($1,$2,$3)"
|
||||
${EndIf}
|
||||
Abort
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
Quit ;We now have a new process, the install will continue there, we have nothing left to do here
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function DirPreCB
|
||||
${If} $InstDir == ""
|
||||
${If} $InstMode U> 0
|
||||
StrCpy $InstDir "$ProgramFiles\${APPNAME}"
|
||||
${Else}
|
||||
StrCpy $InstDir "$APPDATA\${APPNAME}"
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function FinishRunCB
|
||||
UAC::Exec "" "Notepad.exe" "$Windir\Win.INI" "$InstDir"
|
||||
FunctionEnd
|
||||
|
||||
Function CreateSMShortcuts
|
||||
CreateShortcut "$SMPrograms\${APPNAME}.lnk" "$Windir\Notepad.exe"
|
||||
FunctionEnd
|
||||
Function CreateDeskShortcuts
|
||||
CreateShortcut "$Desktop\${APPNAME}.lnk" "$Windir\Notepad.exe"
|
||||
FunctionEnd
|
||||
|
||||
Section "!Required files"
|
||||
SectionIn RO
|
||||
SetOutPath -
|
||||
!insertmacro _UAC.DbgDetailPrint ;some debug info, useful during testing
|
||||
;Install files here...
|
||||
WriteUninstaller "$InstDir\${UNINSTALLER_NAME}"
|
||||
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" DisplayName "${APPNAME}" REG_SZ $0
|
||||
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" UninstallString "$InstDir\${UNINSTALLER_NAME}" REG_SZ $0
|
||||
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" InstMode $InstMode REG_DWORD $0
|
||||
${registry::Unload}
|
||||
SectionEnd
|
||||
|
||||
Section "Startmenu Shortcuts"
|
||||
${UAC.CallFunctionAsUser} CreateSMShortcuts
|
||||
SectionEnd
|
||||
Section "Desktop Shortcut"
|
||||
${UAC.CallFunctionAsUser} CreateDeskShortcuts
|
||||
SectionEnd
|
||||
|
||||
Section Uninstall
|
||||
Delete "$InstDir\${UNINSTALLER_NAME}"
|
||||
Delete "$SMPrograms\${APPNAME}.lnk"
|
||||
Delete "$Desktop\${APPNAME}.lnk"
|
||||
|
||||
RMDir "$InstDir"
|
||||
${registry::DeleteKey} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" $0
|
||||
${registry::Unload}
|
||||
SectionEnd
|
||||
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
This script was made in response to http://forums.winamp.com/showthread.php?threadid=280330
|
||||
It is a ugly hack and is mostly here just to have a solution right now.
|
||||
Hopefully, NSIS will add support for changing the RequestExecutionLevel of the uninstaller
|
||||
This code inspired the _UAC.GenerateUninstallerTango macro (called by ${UAC.U.Elevate.AdminOnly} unless you define UAC_DISABLEUNINSTALLERTANGO)
|
||||
*/
|
||||
|
||||
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
|
||||
!define APPNAME "UAC_Uninstaller"
|
||||
Name "${APPNAME}"
|
||||
OutFile "${APPNAME}.exe"
|
||||
ShowInstDetails show
|
||||
!include LogicLib.nsh
|
||||
|
||||
!define UNINSTALLER_UACDATA "uac.ini"
|
||||
!define UNINSTALLER_NAME "Uninstall FooBarBaz"
|
||||
|
||||
Function un.onInit
|
||||
ReadIniStr $0 "$ExeDir\${UNINSTALLER_UACDATA}" UAC "Un.First"
|
||||
${IF} $0 != 1
|
||||
;SetSilent silent
|
||||
InitPluginsDir
|
||||
WriteIniStr "$PluginsDir\${UNINSTALLER_UACDATA}" UAC "Un.First" 1
|
||||
CopyFiles /SILENT "$EXEPATH" "$PluginsDir\${UNINSTALLER_NAME}.exe"
|
||||
StrCpy $0 ""
|
||||
${IfThen} ${Silent} ${|} StrCpy $0 "/S " ${|}
|
||||
ExecWait '"$PluginsDir\${UNINSTALLER_NAME}.exe" $0/NCRC _?=$INSTDIR' $0
|
||||
SetErrorLevel $0
|
||||
Quit
|
||||
${EndIf}
|
||||
|
||||
# UAC code goes here ...
|
||||
FunctionEnd
|
||||
|
||||
Section
|
||||
WriteUninstaller "$exedir\${UNINSTALLER_NAME}.exe"
|
||||
SetAutoClose true
|
||||
DetailPrint "Uninstalling..."
|
||||
Sleep 1111
|
||||
Exec '"$exedir\${UNINSTALLER_NAME}.exe"'
|
||||
SectionEnd
|
||||
|
||||
Section uninstall
|
||||
MessageBox mb_ok "My filename is: $EXEFILE"
|
||||
Delete "$instdir\${UNINSTALLER_NAME}.exe"
|
||||
Delete "$instdir\${APPNAME}.exe" ;delete generated installer aswell, this is just a sample script
|
||||
SectionEnd
|
||||
|
||||
page InstFiles
|
||||
@@ -1,24 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by resource.rc
|
||||
//
|
||||
#define IDD_MYRUNAS 101
|
||||
#define IDC_RUNASCURR 1000
|
||||
#define IDC_RUNASSPEC 1001
|
||||
#define IDC_SHICON 1002
|
||||
#define IDC_HELPTEXT 1003
|
||||
#define IDC_USERNAME 1004
|
||||
#define IDC_PASSWORD 1005
|
||||
#define IDC_LBLUSER 1007
|
||||
#define IDC_LBLPWD 1008
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1009
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,109 +0,0 @@
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
#include "uac.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_MYRUNAS DIALOG DISCARDABLE 0, 0, 250, 145
|
||||
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_SETFOREGROUND | DS_FIXEDSYS |
|
||||
DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "&OK",IDOK,132,122,50,14
|
||||
PUSHBUTTON "Ca&ncel",IDCANCEL,188,122,50,14
|
||||
ICON "",IDC_SHICON,7,7,20,20
|
||||
LTEXT "",IDC_HELPTEXT,34,7,204,35
|
||||
CONTROL "",IDC_RUNASCURR,"Button",BS_AUTORADIOBUTTON,20,49,218,
|
||||
10
|
||||
CONTROL "",IDC_RUNASSPEC,"Button",BS_AUTORADIOBUTTON,20,65,218,
|
||||
10
|
||||
LTEXT "&User name:",IDC_LBLUSER,20,84,42,16
|
||||
EDITTEXT IDC_USERNAME,63,83,175,14,ES_AUTOHSCROLL
|
||||
LTEXT "&Password:",IDC_LBLPWD,20,102,42,20
|
||||
EDITTEXT IDC_PASSWORD,63,100,175,14,ES_PASSWORD | ES_AUTOHSCROLL
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
IDD_MYRUNAS, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 238
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 136
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"#include ""uac.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
|
||||
#pragma once
|
||||
/** /#define BUILD_DBGRELEASE // Include simple debug output in release version */
|
||||
/** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs*/
|
||||
|
||||
/** /#define UNICODE // Unicode build */
|
||||
/**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */
|
||||
/**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/
|
||||
/**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */
|
||||
|
||||
|
||||
#if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED)
|
||||
|
||||
#if (defined(_MSC_VER) && !defined(_DEBUG))
|
||||
#pragma comment(linker,"/opt:nowin98")
|
||||
#pragma comment(linker,"/ignore:4078")
|
||||
#pragma comment(linker,"/merge:.rdata=.text")
|
||||
|
||||
//#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623
|
||||
#endif
|
||||
|
||||
#if defined(UNICODE) && !defined(_UNICODE)
|
||||
#define _UNICODE
|
||||
#endif
|
||||
#ifdef _UNICODE
|
||||
#define TFUNCSUFFIX W
|
||||
#else
|
||||
#define TFUNCSUFFIX A
|
||||
#endif
|
||||
#define _PCJOIN(a,b) a##b
|
||||
#define PCJOIN(a,b) _PCJOIN(a,b)
|
||||
|
||||
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <ShellAPI.h>
|
||||
#include <TChar.h>
|
||||
#include "NSISUtil.h"
|
||||
|
||||
#ifndef SEE_MASK_NOZONECHECKS
|
||||
#define SEE_MASK_NOZONECHECKS 0x00800000
|
||||
#endif
|
||||
|
||||
#define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) )
|
||||
#ifndef ARRAYSIZE
|
||||
#define ARRAYSIZE COUNTOF
|
||||
#endif
|
||||
#define FORCEINLINE __forceinline
|
||||
|
||||
#if _MSC_VER >= 1400
|
||||
extern void* __cdecl memset(void*mem,int c,size_t len);
|
||||
#endif
|
||||
|
||||
FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
|
||||
#ifndef UAC_NOCUSTOMIMPLEMENTATIONS
|
||||
FORCEINLINE HANDLE WINAPI GetCurrentProcess(){return ((HANDLE)(-1));}
|
||||
FORCEINLINE HANDLE WINAPI GetCurrentThread(){return ((HANDLE)(-2));}
|
||||
|
||||
#define MyTStrLen lstrlen
|
||||
|
||||
#undef lstrcpy
|
||||
#define lstrcpy MyTStrCpy
|
||||
FORCEINLINE LPTSTR MyTStrCpy(LPTSTR s1,LPCTSTR s2) {return PCJOIN(lstr,PCJOIN(cpyn,TFUNCSUFFIX))(s1,s2,0x7FFFFFFF);}
|
||||
|
||||
#undef lstrcat
|
||||
#define lstrcat MyTStrCat
|
||||
LPTSTR MyTStrCat(LPTSTR s1,LPCTSTR s2)
|
||||
#ifdef UAC_INITIMPORTS
|
||||
{return s1?MyTStrCpy(&s1[MyTStrLen(s1)],s2):NULL;}
|
||||
#else
|
||||
;
|
||||
#endif //UAC_INITIMPORTS
|
||||
|
||||
#endif //UAC_NOCUSTOMIMPLEMENTATIONS
|
||||
|
||||
|
||||
//DelayLoaded functions:
|
||||
typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId);
|
||||
typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
|
||||
typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle);
|
||||
typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen);
|
||||
typedef BOOL (WINAPI*ALLOCATEANDINITIALIZESID)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD sa0,DWORD sa1,DWORD sa2,DWORD sa3,DWORD sa4,DWORD sa5,DWORD sa6,DWORD sa7,PSID*pSid);
|
||||
typedef PVOID (WINAPI*FREESID)(PSID pSid);
|
||||
typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2);
|
||||
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize);
|
||||
typedef BOOL (WINAPI*CREATEPROCESSWITHLOGONW)(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID pEnv,LPCWSTR WorkDir,LPSTARTUPINFOW pSI,LPPROCESS_INFORMATION pPI);
|
||||
#define SECURITY_WIN32
|
||||
#include <Security.h>//NameSamCompatible
|
||||
typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize);
|
||||
#endif
|
||||
#ifdef UAC_INITIMPORTS
|
||||
ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0;
|
||||
OPENPROCESSTOKEN _OpenProcessToken=0;
|
||||
OPENTHREADTOKEN _OpenThreadToken=0;
|
||||
GETTOKENINFORMATION _GetTokenInformation=0;
|
||||
ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0;
|
||||
FREESID _FreeSid=0;
|
||||
EQUALSID _EqualSid=0;
|
||||
CHECKTOKENMEMBERSHIP _CheckTokenMembership=0;
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
GETUSERNAME _GetUserName=0;
|
||||
GETUSERNAMEEX _GetUserNameEx=0;
|
||||
CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0;
|
||||
#endif
|
||||
#else
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
extern GETUSERNAME _GetUserName;
|
||||
extern GETUSERNAMEEX _GetUserNameEx;
|
||||
extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW;
|
||||
#endif
|
||||
#endif /* UAC_INITIMPORTS */
|
||||
|
||||
|
||||
extern DWORD DelayLoadDlls();
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei);
|
||||
#endif
|
||||
|
||||
#if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK)
|
||||
//#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA)
|
||||
//#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK)
|
||||
enum TOKEN_ELEVATION_TYPE {
|
||||
TokenElevationTypeDefault = 1,
|
||||
TokenElevationTypeFull,
|
||||
TokenElevationTypeLimited
|
||||
};
|
||||
enum _TOKEN_INFORMATION_CLASS___VISTA {
|
||||
TokenElevationType = (TokenOrigin+1),
|
||||
TokenLinkedToken,
|
||||
TokenElevation,
|
||||
TokenHasRestrictions,
|
||||
TokenAccessInformation,
|
||||
TokenVirtualizationAllowed,
|
||||
TokenVirtualizationEnabled,
|
||||
TokenIntegrityLevel,
|
||||
TokenUIAccess,
|
||||
TokenMandatoryPolicy,
|
||||
TokenLogonSid,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(_DEBUG) || defined(BUILD_DBGRELEASE)
|
||||
//Simple debug helpers:
|
||||
#define BUILD_DBG
|
||||
/** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */
|
||||
#define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0)
|
||||
#define _pp_MakeStr_(x) #x
|
||||
#define pp_MakeStr(x) _pp_MakeStr_(x)
|
||||
#define TRACE OutputDebugStringA
|
||||
#define DBGONLY(_x) _x
|
||||
#ifndef ASSERT
|
||||
#define ASSERT(_x) do{if(!(_x)){MessageBoxA(GetActiveWindow(),#_x##"\n\n"##__FILE__##":"## pp_MakeStr(__LINE__),"SimpleAssert",0);/*TRACE(#_x##"\n"##__FILE__##":" pp_MakeStr(__LINE__)"\n");*/}}while(0)
|
||||
#endif
|
||||
#define VERIFY(_x) ASSERT(_x)
|
||||
static void TRACEF(const char*fmt,...) {va_list a;va_start(a,fmt);static TCHAR b[1024*4];if (sizeof(TCHAR)!=sizeof(char)){static TCHAR fmtBuf[COUNTOF(b)];VERIFY(wsprintf(fmtBuf,_T("%hs"),fmt)<COUNTOF(fmtBuf));fmt=(LPCSTR)fmtBuf;}wvsprintf(b,(TCHAR*)fmt,a);OutputDebugString(b);}
|
||||
#else
|
||||
#define TRACE /*(void)0*/
|
||||
#define DBGONLY(_x)
|
||||
#define ASSERT(_x)
|
||||
#define VERIFY(_x) ((void)(_x))
|
||||
#define TRACEF TRACE
|
||||
#endif /* DEBUG */
|
||||
|
||||
#endif /* APSTUDIO_INVOKED */
|
||||
|
||||
2
binary
@@ -16,6 +16,6 @@
|
||||
<file>resources/lock-http@2x.png</file>
|
||||
<file>resources/lock-https.png</file>
|
||||
<file>resources/lock-https@2x.png</file>
|
||||
<file>resources/accounts.png</file>
|
||||
<file>resources/account.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -40,7 +40,7 @@ set(__get_git_revision_description YES)
|
||||
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||
|
||||
function(get_git_head_revision _refspecvar _hashvar)
|
||||
set(GIT_PARENT_DIR "${CMAKE_SOURCE_DIR}")
|
||||
set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
|
||||
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
|
||||
@@ -53,6 +53,13 @@ function(get_git_head_revision _refspecvar _hashvar)
|
||||
endif()
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
endwhile()
|
||||
# check if this is a submodule
|
||||
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||
file(READ ${GIT_DIR} submodule)
|
||||
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
|
||||
endif()
|
||||
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
||||
if(NOT EXISTS "${GIT_DATA}")
|
||||
file(MAKE_DIRECTORY "${GIT_DATA}")
|
||||
|
||||
@@ -264,7 +264,7 @@ FunctionEnd
|
||||
!macro ConfirmEndProcess processName
|
||||
MessageBox MB_YESNO|MB_ICONEXCLAMATION \
|
||||
$ConfirmEndProcess_MESSAGEBOX_TEXT \
|
||||
IDYES process_${processName}_kill IDNO process_${processName}_ended
|
||||
/SD IDYES IDYES process_${processName}_kill IDNO process_${processName}_ended
|
||||
process_${processName}_kill:
|
||||
DetailPrint $ConfirmEndProcess_KILLING_PROCESSES_TEXT
|
||||
Processes::KillProcess ${processName}
|
||||
@@ -441,7 +441,6 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
||||
File "${MING_BIN}\libGLESv2.dll"
|
||||
File "${MING_BIN}\libjpeg-8.dll"
|
||||
File "${MING_BIN}\libpcre16-0.dll"
|
||||
File "${MING_BIN}\libproxy.dll"
|
||||
File "${MING_BIN}\libsqlite3-0.dll"
|
||||
File "${MING_BIN}\libcrypto-10.dll"
|
||||
File "${MING_BIN}\libssl-10.dll"
|
||||
@@ -512,7 +511,9 @@ SectionGroup $SectionGroup_Shortcuts
|
||||
SetDetailsPrint textonly
|
||||
DetailPrint $OPTION_SECTION_SC_DESKTOP_DetailPrint
|
||||
SetDetailsPrint listonly
|
||||
SetShellVarContext all
|
||||
CreateShortCut "$DESKTOP\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}"
|
||||
SetShellVarContext current
|
||||
${MementoSectionEnd}
|
||||
!endif
|
||||
|
||||
@@ -521,8 +522,10 @@ SectionGroup $SectionGroup_Shortcuts
|
||||
SectionIn 1 2
|
||||
SetDetailsPrint textonly
|
||||
DetailPrint $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint
|
||||
SetShellVarContext all
|
||||
SetDetailsPrint listonly
|
||||
CreateShortCut "$QUICKLAUNCH\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}"
|
||||
SetShellVarContext current
|
||||
${MementoSectionEnd}
|
||||
!endif
|
||||
|
||||
@@ -672,18 +675,22 @@ Section Uninstall
|
||||
;Desktop shortcut.
|
||||
!ifdef OPTION_SECTION_SC_DESKTOP
|
||||
${If} ${HasSection} SEC_DESKTOP
|
||||
SetShellVarContext all
|
||||
${If} ${FileExists} "$DESKTOP\${APPLICATION_NAME}.lnk"
|
||||
Delete "$DESKTOP\${APPLICATION_NAME}.lnk"
|
||||
${EndIf}
|
||||
SetShellVarContext current
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
;Quick Launch shortcut.
|
||||
!ifdef OPTION_SECTION_SC_QUICK_LAUNCH
|
||||
${If} ${HasSection} SEC_QUICK_LAUNCH
|
||||
SetShellVarContext all
|
||||
${If} ${FileExists} "$QUICKLAUNCH\${APPLICATION_NAME}.lnk"
|
||||
Delete "$QUICKLAUNCH\${APPLICATION_NAME}.lnk"
|
||||
${EndIf}
|
||||
SetShellVarContext current
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
|
||||
@@ -2,25 +2,21 @@
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING* file.
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
||||
OUTPUT_VARIABLE GCC_VERSION)
|
||||
if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Wno-long-long")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic")
|
||||
else(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
||||
endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
else()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
if(CMAKE_CXX_COMPILER MATCHES "clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
endif(CMAKE_CXX_COMPILER MATCHES "clang")
|
||||
# TODO: handle msvc compilers warnings?
|
||||
|
||||
if(DEFINED MIRALL_FATAL_WARNINGS)
|
||||
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER MATCHES "clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||
endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER MATCHES "clang")
|
||||
# TODO: handle msvc compilers warnings?
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||
endif(DEFINED MIRALL_FATAL_WARNINGS)
|
||||
|
||||
@@ -573,15 +573,6 @@ int csync_commit(CSYNC *ctx) {
|
||||
}
|
||||
ctx->statedb.db = NULL;
|
||||
|
||||
#ifdef USE_NEON
|
||||
rc = owncloud_commit(ctx);
|
||||
if (rc < 0) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "commit failed: %s",
|
||||
ctx->error_string ? ctx->error_string : "");
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
_csync_clean_ctx(ctx);
|
||||
|
||||
ctx->remote.read_from_db = 0;
|
||||
|
||||
@@ -91,6 +91,7 @@ enum csync_status_codes_e {
|
||||
CSYNC_STATUS_OUT_OF_SPACE,
|
||||
CSYNC_STATUS_QUOTA_EXCEEDED, /* UNUSED */
|
||||
CSYNC_STATUS_SERVICE_UNAVAILABLE,
|
||||
CSYNC_STATUS_STORAGE_UNAVAILABLE,
|
||||
CSYNC_STATUS_FILE_SIZE_ERROR,
|
||||
CSYNC_STATUS_CONTEXT_LOST,
|
||||
CSYNC_STATUS_MERGE_FILETREE_ERROR,
|
||||
@@ -104,6 +105,7 @@ enum csync_status_codes_e {
|
||||
CSYNC_STATUS_INDIVIDUAL_IS_HARDLINK,
|
||||
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
|
||||
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
|
||||
CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME,
|
||||
CYSNC_STATUS_FILE_LOCKED_OR_OPEN
|
||||
};
|
||||
|
||||
@@ -335,7 +337,7 @@ int csync_update(CSYNC *ctx);
|
||||
int csync_reconcile(CSYNC *ctx);
|
||||
|
||||
/**
|
||||
* @brief Commit the sync results to journal
|
||||
* @brief Re-initializes the csync context
|
||||
*
|
||||
* @param ctx The context to commit.
|
||||
*
|
||||
|
||||
@@ -231,6 +231,14 @@ CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path
|
||||
goto out;
|
||||
}
|
||||
|
||||
// check the strlen and ignore the file if its name is longer than 254 chars.
|
||||
if (strlen(bname) > 254) {
|
||||
match = CSYNC_FILE_EXCLUDE_LONG_FILENAME;
|
||||
SAFE_FREE(bname);
|
||||
SAFE_FREE(dname);
|
||||
goto out;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Windows cannot sync files ending in spaces (#2176). It also cannot
|
||||
// distinguish files ending in '.' from files without an ending,
|
||||
|
||||
@@ -26,7 +26,8 @@ enum csync_exclude_type_e {
|
||||
CSYNC_FILE_SILENTLY_EXCLUDED,
|
||||
CSYNC_FILE_EXCLUDE_AND_REMOVE,
|
||||
CSYNC_FILE_EXCLUDE_LIST,
|
||||
CSYNC_FILE_EXCLUDE_INVALID_CHAR
|
||||
CSYNC_FILE_EXCLUDE_INVALID_CHAR,
|
||||
CSYNC_FILE_EXCLUDE_LONG_FILENAME
|
||||
};
|
||||
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#define ERRNO_ERROR_STRING CSYNC_CUSTOM_ERRNO_BASE+13
|
||||
#define ERRNO_SERVICE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+14
|
||||
#define ERRNO_USER_ABORT CSYNC_CUSTOM_ERRNO_BASE+16
|
||||
#define ERRNO_STORAGE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+17
|
||||
|
||||
#endif /* _CSYNC_MACROS_H */
|
||||
/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */
|
||||
|
||||
@@ -108,6 +108,9 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
|
||||
case ERRNO_SERVICE_UNAVAILABLE:
|
||||
status = CSYNC_STATUS_SERVICE_UNAVAILABLE; /* Service temporarily down */
|
||||
break;
|
||||
case ERRNO_STORAGE_UNAVAILABLE:
|
||||
status = CSYNC_STATUS_STORAGE_UNAVAILABLE; /* Storage temporarily unavailable */
|
||||
break;
|
||||
case EFBIG:
|
||||
status = CSYNC_STATUS_FILE_SIZE_ERROR; /* File larger than 2MB */
|
||||
break;
|
||||
|
||||
@@ -416,6 +416,8 @@ out:
|
||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST; /* File listed on ignore list. */
|
||||
} else if (excluded == CSYNC_FILE_EXCLUDE_INVALID_CHAR) {
|
||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS; /* File contains invalid characters. */
|
||||
} else if (excluded == CSYNC_FILE_EXCLUDE_LONG_FILENAME) {
|
||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME; /* File name is too long. */
|
||||
}
|
||||
}
|
||||
if (st->instruction != CSYNC_INSTRUCTION_NONE && st->instruction != CSYNC_INSTRUCTION_IGNORE
|
||||
@@ -619,11 +621,11 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
||||
if (asp < 0) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "asprintf failed!");
|
||||
}
|
||||
} else if(errno == ERRNO_SERVICE_UNAVAILABLE) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "Service was not available!");
|
||||
} else if(errno == ERRNO_STORAGE_UNAVAILABLE) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "Storage was not available!");
|
||||
if (ctx->current_fs) {
|
||||
ctx->current_fs->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||
ctx->current_fs->error_status = CSYNC_STATUS_SERVICE_UNAVAILABLE;
|
||||
ctx->current_fs->error_status = CSYNC_STATUS_STORAGE_UNAVAILABLE;
|
||||
/* If a directory has ignored files, put the flag on the parent directory as well */
|
||||
if( previous_fs ) {
|
||||
previous_fs->has_ignored_files = true;
|
||||
|
||||
@@ -50,7 +50,7 @@ csync_vio_handle_t *csync_vio_opendir(CSYNC *ctx, const char *name) {
|
||||
break;
|
||||
case LOCAL_REPLICA:
|
||||
if( ctx->callbacks.update_callback ) {
|
||||
ctx->callbacks.update_callback(ctx->replica, name, ctx->callbacks.update_callback_userdata);
|
||||
ctx->callbacks.update_callback(ctx->replica, name, ctx->callbacks.update_callback_userdata);
|
||||
}
|
||||
return csync_vio_local_opendir(name);
|
||||
break;
|
||||
|
||||
@@ -204,3 +204,70 @@ journal. This function can be used to recreate the journal database.
|
||||
|
||||
.. note:: We recommend that you use this function only when advised to do so by
|
||||
ownCloud support staff.
|
||||
|
||||
Custom WebDAV Properties
|
||||
------------------------
|
||||
|
||||
In the communication between client and server a couple of custom WebDAV properties
|
||||
were introduced. They are either needed for sync functionality or help have a positive
|
||||
effect on synchronization performance.
|
||||
|
||||
This chapter describes additional xml elemeents which the server returns in response
|
||||
to a successful PROPFIND request on a file or directory. The elemnts are returned in
|
||||
the namespace oc.
|
||||
|
||||
###Server Side Permissions
|
||||
|
||||
The XML element <oc:permissions> represents the permission- and sharing state of the
|
||||
item. It is a list of characters, and each of the chars has a meaning as outlined
|
||||
in the table below:
|
||||
|
||||
+------+-------------+-------------------------------------------+
|
||||
| Code | Resource | Description |
|
||||
|======+=============+===========================================|
|
||||
| S | File or Folder | is shared |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| R | File or Folder | can share (includes reshare) |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| M | File or Folder | is mounted (like on DropBox, Samba, etc.) |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| W | File | can write file |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| C | Folder |can create file in folder |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| K | Folder | can create folder (mkdir) |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| D | File or Folder |can delete file or folder |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| N | File or Folder | can rename file or folder |
|
||||
+---+----------------+-------------------------------------------|
|
||||
| V | File or Folder | can move file or folder |
|
||||
+---+----------------+-------------------------------------------|
|
||||
|
||||
Example:
|
||||
```
|
||||
<oc:permissions>RDNVCK</oc:permissions>
|
||||
```
|
||||
|
||||
###File- or Directory Size
|
||||
|
||||
The XML element <oc:size> represents the file- or directory size in bytes. For
|
||||
directories, the size of the whole file tree underneath the directory is accumulated.
|
||||
|
||||
Example:
|
||||
```
|
||||
<oc:size>2429176697</oc:size>
|
||||
```
|
||||
|
||||
###FileID
|
||||
|
||||
|
||||
The XML element <oc:id> represents the so called file ID. It is a non volatile string id
|
||||
that stays constant as long as the file exists. It is not changed if the file changes or
|
||||
is renamed or moved.
|
||||
|
||||
|
||||
Example:
|
||||
```
|
||||
<oc:id>00000020oc5cfy6qqizm</oc:id>
|
||||
```
|
||||
|
||||
@@ -129,30 +129,23 @@ Windows Installer Build (Cross-Compile)
|
||||
|
||||
Due to the large number of dependencies, building the client installer for Windows
|
||||
is **currently only officially supported on openSUSE**, by using the MinGW cross compiler.
|
||||
You can set up openSUSE 12.1, 12.2, or 13.1 in a virtual machine if you do not
|
||||
You can set up openSUSE 13.1, 13.2 or openSUSE Factory in a virtual machine if you do not
|
||||
have it installed already.
|
||||
|
||||
To cross-compile:
|
||||
|
||||
1. Add the following repositories using YaST or ``zypper ar`` (adjust when using openSUSE 12.2 or 13.1)::
|
||||
1. Add the following repositories using YaST or ``zypper ar`` (adjust when using another openSUSE version)::
|
||||
|
||||
zypper ar http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1/windows:mingw:win32.repo
|
||||
zypper ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_13.1/windows:mingw.repo
|
||||
zypper ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_13.2/windows:mingw.repo
|
||||
zypper ar http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.2/windows:mingw:win32.repo
|
||||
|
||||
2. Install the cross-compiler packages and the cross-compiled dependencies::
|
||||
|
||||
zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
|
||||
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
|
||||
mingw32-headers mingw32-runtime site-config mingw32-libqt4-sql \
|
||||
mingw32-libqt4-sql-sqlite mingw32-sqlite mingw32-libsqlite-devel \
|
||||
mingw32-dlfcn-devel mingw32-libssh2-devel kdewin-png2ico \
|
||||
mingw32-libqt4 mingw32-libqt4-devel mingw32-libgcrypt \
|
||||
mingw32-libgnutls mingw32-libneon-openssl mingw32-libneon-devel \
|
||||
mingw32-libbeecrypt mingw32-libopenssl mingw32-openssl \
|
||||
mingw32-libpng-devel mingw32-libsqlite mingw32-qtkeychain \
|
||||
mingw32-qtkeychain-devel mingw32-dlfcn mingw32-libintl-devel \
|
||||
mingw32-libneon-devel mingw32-libopenssl-devel mingw32-libproxy-devel \
|
||||
mingw32-libxml2-devel mingw32-zlib-devel
|
||||
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
|
||||
mingw32-headers mingw32-runtime site-config \
|
||||
mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5* \
|
||||
mingw32-cross-nsis
|
||||
|
||||
3. For the installer, install the NSIS installer package::
|
||||
|
||||
@@ -170,24 +163,43 @@ To cross-compile:
|
||||
.. note:: These files also work for more recent openSUSE versions!
|
||||
|
||||
::
|
||||
# RPM depends on curl for installs from HTTP
|
||||
zypper install curl
|
||||
|
||||
rpm -ivh http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-processes-0-1.1.x86_64.rpm
|
||||
rpm -ivh http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-uac-0-3.1.x86_64.rpm
|
||||
|
||||
6. Follow the `generic build instructions`_
|
||||
|
||||
.. note:: When building for Windows platforms, you must specify a special
|
||||
.. note:: When building for Windows platforms, you must specify a special
|
||||
toolchain file that enables cmake to locate the platform-specific tools. To add
|
||||
this parameter to the call to cmake, enter
|
||||
``-DCMAKE_TOOLCHAIN_FILE=../client/admin/win/Toolchain-mingw32-openSUSE.cmake``.
|
||||
|
||||
7. Build by running ``make``.
|
||||
|
||||
.. note:: Using ``make package`` produces an NSIS-based installer, provided
|
||||
.. note:: Using ``make package`` produces an NSIS-based installer, provided
|
||||
the NSIS mingw32 packages are installed.
|
||||
|
||||
.. _`generic build instructions`:
|
||||
8. If you want to sign the installer, acquire a `Microsoft Authenticode`_ Certificate and install ``osslsigncode`` to sign the installer::
|
||||
|
||||
zypper install osslsigncode
|
||||
|
||||
9. Sign the package::
|
||||
|
||||
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha1 \
|
||||
-pass yourpass \
|
||||
-n "ACME Client" \
|
||||
-i "http://acme.com" \
|
||||
-ts "http://timestamp.server/" \
|
||||
-in ${unsigned_file} \
|
||||
-out ${installer_file}
|
||||
|
||||
for ``-in``, use URL to the time stamping server provided by your CA along with the Authenticode certificate. Alternatively,
|
||||
you may use the official Microsoft ``signtool`` utility on Microsoft Windows.
|
||||
|
||||
|
||||
.. _`generic build instructions`:
|
||||
Generic Build Instructions
|
||||
--------------------------
|
||||
|
||||
@@ -243,4 +255,5 @@ The following are known cmake parameters:
|
||||
.. _Homebrew: http://mxcl.github.com/homebrew/
|
||||
.. _`OpenSSL Windows Build`: http://slproweb.com/products/Win32OpenSSL.html
|
||||
.. _Qt: http://www.qt.io/download
|
||||
.. _`Microsoft Authenticode`: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
|
||||
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
|
||||
|
||||
BIN
resources/account.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
10
resources/account.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs>
|
||||
<linearGradient id="a" y2="69.127" gradientUnits="userSpaceOnUse" x2="-18.398" gradientTransform="matrix(.93749 0 0 .93750 48.705 -2.957)" y1="5.2866" x1="-18.398">
|
||||
<stop offset="0"/>
|
||||
<stop stop-color="#363636" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path opacity=".7" style="block-progression:tb;color:#000000;text-transform:none;text-indent:0" d="m32.014 2.0032c-6.4921 0-12 4.7474-12 10.874 0.04608 1.9365 0.21927 4.3246 1.3749 9.3745v0.125l0.12499 0.125c0.37098 1.0626 0.91084 1.6705 1.6249 2.4999 0.71405 0.82937 1.5653 1.8055 2.3749 2.6249 0.09524 0.0964 0.15627 0.15612 0.24995 0.25003 0.16055 0.69862 0.35503 1.4505 0.49998 2.1249 0.38566 1.7943 0.34611 3.065 0.25003 3.4998-2.7899 0.97997-6.2601 2.1463-9.3744 3.5003-1.7483 0.75997-3.3307 1.4404-4.625 2.2483-1.2943 0.81109-2.5815 1.4239-2.9998 3.2498-0.00516 0.08324-0.00516 0.16675 0 0.25003-0.40882 3.7538-1.0272 9.2737-1.4999 13-0.10204 0.78425 0.31131 1.611 0.99996 1.9999 5.6546 3.0543 14.34 4.2835 22.999 4.2499 8.6584-0.0336 17.275-1.3353 22.749-4.2499 0.68865-0.38891 1.102-1.2156 0.99996-1.9999-0.15092-1.1646-0.33631-3.7907-0.49998-6.3746-0.16367-2.584-0.30575-5.1258-0.49994-6.6246-0.06775-0.37155-0.24343-0.72281-0.49998-0.99996-1.7388-2.0763-4.3366-3.3456-7.3745-4.6246-2.7736-1.1679-6.0249-2.3806-9.2496-3.7498-0.18047-0.40203-0.35975-1.5717 0-3.3748 0.0984-0.48318 0.24959-1.002 0.37678-1.4991 0.30279-0.33919 0.53918-0.61678 0.87476-0.99996 0.71597-0.81717 1.4859-1.6747 2.1259-2.4999 0.63997-0.82517 1.16-1.5327 1.4999-2.4999l0.124-0.1248c1.3065-5.273 1.3072-7.4733 1.3749-9.3745v-0.12852c0-6.127-5.5074-10.874-12-10.874z" fill="url(#a)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.9 KiB |
10
resources/activity.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs>
|
||||
<linearGradient id="a" y2="62.102" gradientUnits="userSpaceOnUse" x2="32" y1="2.1695" x1="32">
|
||||
<stop offset="0"/>
|
||||
<stop stop-color="#363636" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path opacity=".7" d="m32 2-20 36h22l-2 24 20-36h-22z" fill="url(#a)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 597 B |
|
Before Width: | Height: | Size: 739 B After Width: | Height: | Size: 479 B |
5
resources/lock-http.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<path fill="#909090" d="m32 6c-8.284 0-15 6.716-15 15v10h-5v28h40v-28h-5v-10c0-8.284-6.716-15-15-15zm0 6c4.9706 0 9 4.0294 9 9v10h-18v-10c0-4.9706 4.0294-9 9-9z"/>
|
||||
<path d="m26 45h36l-18-30z" fill="#dfae19"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 493 B |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 478 B After Width: | Height: | Size: 291 B |
4
resources/lock-https.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<path fill="#60a149" d="m32 6c-8.284 0-15 6.716-15 15v10h-5v28h40v-28h-5v-10c0-8.284-6.716-15-15-15zm0 6c4.9706 0 9 4.0294 9 9v10h-18v-10c0-4.9706 4.0294-9 9-9z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 447 B |
|
Before Width: | Height: | Size: 731 B After Width: | Height: | Size: 375 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
10
resources/network.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs>
|
||||
<linearGradient id="a" y2="62" gradientUnits="userSpaceOnUse" x2="32" gradientTransform="translate(0,1)" x1="32">
|
||||
<stop offset="0"/>
|
||||
<stop stop-color="#363636" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path opacity=".7" d="m20 1-20 20h12v14h16v-14h12zm16 28v14h-12l20 20 20-20h-12v-14z" fill="url(#a)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 647 B |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.6 KiB |
14
resources/settings.svg
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs>
|
||||
<linearGradient id="d" x1="7.2236" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.2236" y1=".019012" y2="15.035"/>
|
||||
<linearGradient id="a">
|
||||
<stop offset="0"/>
|
||||
<stop stop-color="#363636" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="e" x1="7.493" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.493" y1=".0035527" y2="14.998"/>
|
||||
</defs>
|
||||
<g opacity=".7" fill="url(#d)" transform="matrix(3.7332 0 0 3.7333 2.1334 3.7931)">
|
||||
<path fill="url(#e)" d="m6.9375 0.056c-0.2484 0-0.4375 0.18908-0.4375 0.4375v1.25c-0.5539 0.1422-1.0512 0.3719-1.5312 0.6563l-0.9063-0.9063c-0.17566-0.17566-0.44934-0.17566-0.625 0l-1.5 1.5c-0.17566 0.17566-0.17566 0.44934 0 0.625l0.9063 0.9063c-0.2844 0.48-0.5141 0.9773-0.6563 1.5312h-1.25c-0.24842 0-0.4375 0.1891-0.4375 0.4375v2.125c1e-8 0.24842 0.18908 0.4375 0.4375 0.4375h1.25c0.1422 0.5539 0.37188 1.0512 0.65625 1.5312l-0.9063 0.907c-0.17566 0.17566-0.17566 0.44934 0 0.625l1.5 1.5c0.17566 0.17566 0.44934 0.17566 0.625 0l0.9063-0.907c0.48 0.285 0.9773 0.514 1.5312 0.656v1.25c1e-7 0.24842 0.18908 0.4375 0.4375 0.4375h2.125c0.2484 0 0.4375-0.189 0.4375-0.438v-1.25c0.5539-0.1422 1.0512-0.37188 1.5312-0.65625l0.90625 0.90625c0.17566 0.17566 0.44934 0.17566 0.625 0l1.5-1.5c0.17566-0.17566 0.17566-0.44934 0-0.625l-0.906-0.906c0.285-0.48 0.514-0.9771 0.656-1.531h1.25c0.249 0 0.438-0.1891 0.438-0.4375v-2.125c0-0.2484-0.189-0.4375-0.438-0.4375h-1.25c-0.142-0.5539-0.371-1.0512-0.656-1.5312l0.906-0.9063c0.17566-0.17566 0.17566-0.44934 0-0.625l-1.5-1.5c-0.17566-0.17566-0.44934-0.17566-0.625 0l-0.906 0.9063c-0.48-0.2844-0.977-0.5141-1.531-0.6563v-1.25c0.0004-0.24872-0.1887-0.4378-0.4371-0.4378zm1.0625 4.1573c1.8451 0 3.3427 1.4975 3.3427 3.3427 0 1.8451-1.4975 3.3427-3.3427 3.3427-1.8451 0-3.3427-1.4979-3.3427-3.343s1.4976-3.3427 3.3427-3.3427z" display="block"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -72,7 +72,7 @@ static ContentManager* sharedInstance = nil;
|
||||
_icnWarnSwm = [[IconCache sharedInstance] registerIcon:[base stringByAppendingPathComponent:@"warning_swm.icns"]];
|
||||
_icnErrSwm = [[IconCache sharedInstance] registerIcon:[base stringByAppendingPathComponent:@"error_swm.icns"]];
|
||||
|
||||
NSLog(@"Icon ok identifier: %d from %@", [_icnOk intValue], [base stringByAppendingString:@"ok.icns"]);
|
||||
// NSLog(@"Icon ok identifier: %d from %@", [_icnOk intValue], [base stringByAppendingString:@"ok.icns"]);
|
||||
}
|
||||
|
||||
- (void)enableFileIcons:(BOOL)enable
|
||||
@@ -111,7 +111,7 @@ static ContentManager* sharedInstance = nil;
|
||||
}else if( [result isEqualToString:@"NOP"]) {
|
||||
// Nothing.
|
||||
} else {
|
||||
NSLog(@"Unknown status code %@", result);
|
||||
NSLog(@"SyncState: Unknown status code %@", result);
|
||||
}
|
||||
|
||||
NSString* normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
@@ -129,7 +129,7 @@ static ContentManager* sharedInstance = nil;
|
||||
//NSLog(@"%@ %@", NSStringFromSelector(_cmd), path);
|
||||
if (!_fileIconsEnabled)
|
||||
{
|
||||
NSLog(@"Icons are NOT ENABLED!");
|
||||
NSLog(@"SyncState: Icons are NOT ENABLED!");
|
||||
// return nil;
|
||||
}
|
||||
|
||||
@@ -284,7 +284,7 @@ static ContentManager* sharedInstance = nil;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"OwnCloudFinder: refreshing icon badges failed");
|
||||
NSLog(@"SyncState: refreshing icon badges failed");
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -333,7 +333,7 @@ static ContentManager* sharedInstance = nil;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"OwnCloudFinder: refreshing icon badges failed");
|
||||
NSLog(@"SyncState: refreshing icon badges failed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -44,12 +44,12 @@ static BOOL installed = NO;
|
||||
{
|
||||
if (installed)
|
||||
{
|
||||
NSLog(@"OwnCloudFinder: already installed");
|
||||
// NSLog(@"SyncStateFinder: already installed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"OwnCloudFinder: installing ownCloud Shell extension");
|
||||
// NSLog(@"SyncStateFinder: installing SyncState Shell extension");
|
||||
|
||||
[RequestManager sharedInstance];
|
||||
|
||||
@@ -58,7 +58,7 @@ static BOOL installed = NO;
|
||||
|
||||
[self hookMethod:@selector(drawImage:) inClass:@"IKFinderReflectiveIconCell" toCallToTheNewMethod:@selector(OCIconOverlayHandlers_IKFinderReflectiveIconCell_drawImage:)]; // 10.7 & 10.8 & 10.9 (Icon View arrange by everything else)
|
||||
|
||||
[self hookMethod:@selector(drawIconWithFrame:) inClass:@"TListViewIconAndTextCell" toCallToTheNewMethod:@selector(OCIconOverlayHandlers_drawIconWithFrame:)]; // 10.7 & 10.8 & 10.9 Column View
|
||||
[self hookMethod:@selector(drawIconWithFrame:) inClass:@"TColumnCell" toCallToTheNewMethod:@selector(OCIconOverlayHandlers_drawIconWithFrame:)]; // 10.7 & 10.8 & 10.9 Column View
|
||||
|
||||
[self hookMethod:@selector(drawRect:) inClass:@"TDimmableIconImageView" toCallToTheNewMethod:@selector(OCIconOverlayHandlers_drawRect:)]; // 10.9 (List and Coverflow Views)
|
||||
|
||||
@@ -81,19 +81,19 @@ static BOOL installed = NO;
|
||||
|
||||
installed = YES;
|
||||
|
||||
NSLog(@"OwnCloudFinder: installed");
|
||||
// NSLog(@"SyncStateFinder: installed");
|
||||
}
|
||||
|
||||
+ (void)uninstall
|
||||
{
|
||||
if (!installed)
|
||||
{
|
||||
NSLog(@"OwnCloudFinder: not installed");
|
||||
// NSLog(@"SyncStateFinder: not installed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"OwnCloudFinder: uninstalling");
|
||||
// NSLog(@"SyncStateFinder: uninstalling");
|
||||
|
||||
[[ContentManager sharedInstance] dealloc];
|
||||
|
||||
@@ -119,7 +119,7 @@ static BOOL installed = NO;
|
||||
|
||||
installed = NO;
|
||||
|
||||
NSLog(@"OwnCloudFinder: uninstalled");
|
||||
// NSLog(@"SyncStateFinder: uninstalled");
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
@implementation NSObject (IconOverlayHandlers)
|
||||
|
||||
- (void)IconOverlayHandlers_drawIconWithFrame:(struct CGRect)arg1
|
||||
- (void)OCIconOverlayHandlers_drawIconWithFrame:(struct CGRect)arg1
|
||||
{
|
||||
[self OCIconOverlayHandlers_drawIconWithFrame:arg1];
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ static RequestManager* sharedInstance = nil;
|
||||
ContentManager *contentman = [ContentManager sharedInstance];
|
||||
|
||||
if( chunks && [chunks count] > 0 && tag == READ_TAG ) {
|
||||
NSLog(@"READ from socket (%ld): <%@>", tag, answer);
|
||||
// NSLog(@"READ from socket (%ld): <%@>", tag, answer);
|
||||
if( [[chunks objectAtIndex:0] isEqualToString:@"STATUS"] ) {
|
||||
NSString *path = [chunks objectAtIndex:2];
|
||||
if( [chunks count] > 3 ) {
|
||||
@@ -154,7 +154,7 @@ static RequestManager* sharedInstance = nil;
|
||||
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"REGISTER_PATH"] ) {
|
||||
NSNumber *one = [NSNumber numberWithInt:1];
|
||||
NSString *path = [chunks objectAtIndex:1];
|
||||
NSLog(@"Registering path: %@", path);
|
||||
// NSLog(@"Registering path: %@", path);
|
||||
[_registeredPathes setObject:one forKey:path];
|
||||
|
||||
[contentman repaintAllWindows];
|
||||
@@ -168,12 +168,12 @@ static RequestManager* sharedInstance = nil;
|
||||
[[ContentManager sharedInstance] loadIconResourcePath:path];
|
||||
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"SHARE_MENU_TITLE"] ) {
|
||||
_shareMenuTitle = [[chunks objectAtIndex:1] copy];
|
||||
NSLog(@"Received shar menu title: %@", _shareMenuTitle);
|
||||
// NSLog(@"Received shar menu title: %@", _shareMenuTitle);
|
||||
} else {
|
||||
NSLog(@"Unknown command %@", [chunks objectAtIndex:0]);
|
||||
NSLog(@"SyncState: Unknown command %@", [chunks objectAtIndex:0]);
|
||||
}
|
||||
} else if (tag != READ_TAG) {
|
||||
NSLog(@"Received unknown tag %ld <%@>", tag, answer);
|
||||
NSLog(@"SyncState: Received unknown tag %ld <%@>", tag, answer);
|
||||
}
|
||||
// Read on and on
|
||||
NSData* stop = [@"\n" dataUsingEncoding:NSUTF8StringEncoding];
|
||||
@@ -188,13 +188,13 @@ static RequestManager* sharedInstance = nil;
|
||||
}
|
||||
|
||||
-(void)socket:(GCDAsyncSocket*)socket didConnectToUrl:(NSURL *)url {
|
||||
NSLog( @"Connected to sync client successfully on %@", url);
|
||||
// NSLog( @"Connected to sync client successfully on %@", url);
|
||||
_isConnected = YES;
|
||||
|
||||
[self askOnSocket:@"" query:@"SHARE_MENU_TITLE"];
|
||||
|
||||
if( [_requestQueue count] > 0 ) {
|
||||
NSLog( @"We have to empty the queue");
|
||||
// NSLog( @"We have to empty the queue");
|
||||
for( NSString *path in _requestQueue ) {
|
||||
[self askOnSocket:path query:@"RETRIEVE_FILE_STATUS"];
|
||||
}
|
||||
@@ -211,7 +211,7 @@ static RequestManager* sharedInstance = nil;
|
||||
|
||||
- (void)socketDidDisconnect:(GCDAsyncSocket*)socket withError:(NSError*)err
|
||||
{
|
||||
NSLog(@"Socket DISconnected! %@", [err localizedDescription]);
|
||||
// NSLog(@"Socket DISconnected! %@", [err localizedDescription]);
|
||||
|
||||
_isConnected = NO;
|
||||
|
||||
@@ -272,7 +272,7 @@ static RequestManager* sharedInstance = nil;
|
||||
if (!pnsError && paths && [paths count] > 0) {
|
||||
NSString *currentLatestPath = nil;
|
||||
if (paths.count > 1) {
|
||||
NSLog(@"Possible paths: %@", paths);
|
||||
// NSLog(@"Possible paths: %@", paths);
|
||||
}
|
||||
for (int i = 0; i < paths.count; i++) {
|
||||
NSString *currentPath = [syncStateHelperDir stringByAppendingPathComponent:[paths objectAtIndex:i]];
|
||||
@@ -288,7 +288,7 @@ static RequestManager* sharedInstance = nil;
|
||||
}
|
||||
}
|
||||
if (url) {
|
||||
NSLog(@"Connect Socket to %@", url);
|
||||
// NSLog(@"Connect Socket to %@", url);
|
||||
[_socket connectToUrl:url withTimeout:1 error:&err];
|
||||
}
|
||||
}
|
||||
@@ -296,7 +296,7 @@ static RequestManager* sharedInstance = nil;
|
||||
|
||||
- (void)menuItemClicked:(NSDictionary*)actionDictionary
|
||||
{
|
||||
NSLog(@"RequestManager menuItemClicked %@", actionDictionary);
|
||||
// NSLog(@"RequestManager menuItemClicked %@", actionDictionary);
|
||||
NSArray *filePaths = [actionDictionary valueForKey:@"files"];
|
||||
for (int i = 0; i < filePaths.count; i++) {
|
||||
[self askOnSocket:[filePaths objectAtIndex:i] query:@"SHARE"];
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define WAIT_FOR_APPLE_EVENT_TO_ENTER_HANDLER_IN_SECONDS 1.0
|
||||
#define FINDER_MIN_TESTED_VERSION @"10.7"
|
||||
#define FINDER_MAX_TESTED_VERSION @"10.8.5"
|
||||
#define LIFERAYNATIVITY_INJECTED_NOTIFICATION @"OwnCloudInjectedNotification"
|
||||
#define LIFERAYNATIVITY_INJECTED_NOTIFICATION @"SyncStateInjectedNotification"
|
||||
|
||||
EXPORT OSErr HandleLoadEvent(const AppleEvent* ev, AppleEvent* reply, long refcon);
|
||||
|
||||
@@ -78,14 +78,14 @@ static OSErr loadBundle(LNBundleType type, AppleEvent* reply, long refcon) {
|
||||
minVersion = FINDER_MIN_TESTED_VERSION;
|
||||
break;
|
||||
default:
|
||||
NSLog(@"Failed to load bundle for type %d", type);
|
||||
NSLog(@"SyncStateInjector: Failed to load bundle for type %d", type);
|
||||
return 8;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (isLoaded) {
|
||||
NSLog(@"OwnCloudInjector: %@ already loaded.", bundleName);
|
||||
// NSLog(@"SyncStateInjector: %@ already loaded.", bundleName);
|
||||
return noErr;
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ static OSErr loadBundle(LNBundleType type, AppleEvent* reply, long refcon) {
|
||||
}
|
||||
id principalClassObject = NSClassFromString(NSStringFromClass(principalClass));
|
||||
if ([principalClassObject respondsToSelector:@selector(install)]) {
|
||||
NSLog(@"LiferayNativityInjector: Installing %@ ...", bundleName);
|
||||
// NSLog(@"SyncStateInjector: Installing %@ ...", bundleName);
|
||||
[principalClassObject install];
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ EXPORT OSErr HandleLoadEvent(const AppleEvent* ev, AppleEvent* reply, long refco
|
||||
NSString* injectorVersion = [injectorBundle objectForInfoDictionaryKey:@"CFBundleVersion"];
|
||||
|
||||
if (!injectorVersion || ![injectorVersion isKindOfClass:[NSString class]]) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to determine OwnCloudInjector version!"]);
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to determine SyncStateInjector version!"]);
|
||||
return 7;
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ EXPORT OSErr HandleUnloadEvent(const AppleEvent* ev, AppleEvent* reply, long ref
|
||||
@autoreleasepool {
|
||||
@try {
|
||||
if (!liferayNativityLoaded) {
|
||||
NSLog(@"OwnCloudInjector: not loaded.");
|
||||
// NSLog(@"SyncStateInjector: not loaded.");
|
||||
return noErr;
|
||||
}
|
||||
|
||||
@@ -253,7 +253,7 @@ EXPORT OSErr HandleUnloadEvent(const AppleEvent* ev, AppleEvent* reply, long ref
|
||||
}
|
||||
id principalClassObject = NSClassFromString(NSStringFromClass(principalClass));
|
||||
if ([principalClassObject respondsToSelector:@selector(uninstall)]) {
|
||||
NSLog(@"LiferayNativityInjector: Uninstalling %@ ...", bundleName);
|
||||
// NSLog(@"SyncStateInjector: Uninstalling %@ ...", bundleName);
|
||||
[principalClassObject uninstall];
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,10 @@ from gi.repository import GObject, Nautilus
|
||||
# do not touch the following line.
|
||||
appname = 'ownCloud'
|
||||
|
||||
def get_local_path(path):
|
||||
return path.replace("file://", "")
|
||||
def get_local_path(url):
|
||||
if url[0:7] == 'file://':
|
||||
url = url[7:]
|
||||
return urllib.unquote(url)
|
||||
|
||||
def get_runtime_dir():
|
||||
"""Returns the value of $XDG_RUNTIME_DIR, a directory path.
|
||||
@@ -254,7 +256,7 @@ class SyncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
|
||||
if item.get_uri_scheme() != 'file':
|
||||
return
|
||||
|
||||
filename = urllib.unquote(item.get_uri()[7:])
|
||||
filename = get_local_path(item.get_uri())
|
||||
if item.is_directory():
|
||||
filename += '/'
|
||||
|
||||
|
||||
@@ -50,14 +50,21 @@ OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
|
||||
|
||||
ContextMenuInfo info;
|
||||
std::wstring response;
|
||||
Sleep(50);
|
||||
while (socket.ReadLine(&response)) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
wstring responsePath = response.substr(14); // length of REGISTER_PATH
|
||||
info.watchedDirectories.push_back(responsePath);
|
||||
int sleptCount = 0;
|
||||
while (sleptCount < 5) {
|
||||
if (socket.ReadLine(&response)) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
wstring responsePath = response.substr(14); // length of REGISTER_PATH
|
||||
info.watchedDirectories.push_back(responsePath);
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"SHARE_MENU_TITLE:"))) {
|
||||
info.shareMenuTitle = response.substr(17); // length of SHARE_MENU_TITLE:
|
||||
break; // Stop once we received the last sent request
|
||||
}
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"SHARE_MENU_TITLE:"))) {
|
||||
info.shareMenuTitle = response.substr(17); // length of SHARE_MENU_TITLE:
|
||||
else {
|
||||
Sleep(50);
|
||||
++sleptCount;
|
||||
}
|
||||
}
|
||||
return info;
|
||||
|
||||
@@ -138,6 +138,7 @@
|
||||
<AdditionalDependencies>OCUtil_x64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>OCContextMenu.def</ModuleDefinitionFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -38,9 +39,24 @@ extern HINSTANCE instanceHandle;
|
||||
#define IDM_DISPLAY 0
|
||||
#define IDB_OK 101
|
||||
|
||||
namespace {
|
||||
|
||||
unique_ptr<RemotePathChecker> s_instance;
|
||||
|
||||
RemotePathChecker *getGlobalChecker()
|
||||
{
|
||||
// On Vista we'll run into issue #2680 if we try to create the thread+pipe connection
|
||||
// on any DllGetClassObject of our registered classes.
|
||||
// Work around the issue by creating the static RemotePathChecker only once actually needed.
|
||||
static once_flag s_onceFlag;
|
||||
call_once(s_onceFlag, [] { s_instance.reset(new RemotePathChecker); });
|
||||
|
||||
return s_instance.get();
|
||||
}
|
||||
|
||||
}
|
||||
OCOverlay::OCOverlay(int state)
|
||||
: _referenceCount(1)
|
||||
, _checker(nullptr)
|
||||
, _state(state)
|
||||
{
|
||||
}
|
||||
@@ -49,16 +65,6 @@ OCOverlay::~OCOverlay(void)
|
||||
{
|
||||
}
|
||||
|
||||
void OCOverlay::lazyInit()
|
||||
{
|
||||
// On Vista we'll run into issue #2680 if we try to create the thread+pipe connection
|
||||
// on any DllGetClassObject of our registered classes.
|
||||
// Work around the issue by creating the static RemotePathChecker only once actually needed.
|
||||
if (_checker)
|
||||
return;
|
||||
static RemotePathChecker s_remotePathChecker;
|
||||
_checker = &s_remotePathChecker;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) OCOverlay::AddRef()
|
||||
{
|
||||
@@ -128,9 +134,8 @@ IFACEMETHODIMP OCOverlay::GetPriority(int *pPriority)
|
||||
|
||||
IFACEMETHODIMP OCOverlay::IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib)
|
||||
{
|
||||
lazyInit();
|
||||
assert(_checker);
|
||||
auto watchedDirectories = _checker->WatchedDirectories();
|
||||
RemotePathChecker* checker = getGlobalChecker();
|
||||
auto watchedDirectories = checker->WatchedDirectories();
|
||||
|
||||
wstring wpath(pwszPath);
|
||||
wpath.append(L"\\");
|
||||
@@ -147,7 +152,7 @@ IFACEMETHODIMP OCOverlay::GetPriority(int *pPriority)
|
||||
}
|
||||
|
||||
int state = 0;
|
||||
if (!_checker->IsMonitoredPath(pwszPath, &state)) {
|
||||
if (!checker->IsMonitoredPath(pwszPath, &state)) {
|
||||
return MAKE_HRESULT(S_FALSE, 0, 0);
|
||||
}
|
||||
return MAKE_HRESULT(state == _state ? S_OK : S_FALSE, 0, 0);
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
class RemotePathChecker;
|
||||
|
||||
class OCOverlay : public IShellIconOverlayIdentifier
|
||||
|
||||
{
|
||||
@@ -36,12 +34,8 @@ protected:
|
||||
~OCOverlay();
|
||||
|
||||
private:
|
||||
//bool _GenerateMessage(const wchar_t*, std::wstring*);
|
||||
void lazyInit();
|
||||
|
||||
bool _IsOverlaysEnabled();
|
||||
long _referenceCount;
|
||||
RemotePathChecker* _checker;
|
||||
int _state;
|
||||
};
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
* details.
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "CommunicationSocket.h"
|
||||
#include "UtilConstants.h"
|
||||
#include "StringUtil.h"
|
||||
|
||||
@@ -105,6 +105,7 @@
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@@ -118,6 +119,7 @@
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@@ -133,6 +135,7 @@
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@@ -159,6 +162,8 @@
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="StringUtil.cpp" />
|
||||
</ItemGroup>
|
||||
|
||||
2
src/3rdparty/libcrashreporter-qt
vendored
@@ -50,4 +50,16 @@ if(NOT BUILD_LIBRARIES_ONLY)
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif()
|
||||
|
||||
# FIXME: The following lines are dup in src/gui and src/cmd because it needs to be done after both are installed
|
||||
#FIXME: find a nice solution to make the second if(BUILD_OWNCLOUD_OSX_BUNDLE) unnecessary
|
||||
# currently it needs to be done because the code right above needs to be executed no matter
|
||||
# if building a bundle or not and the install_qt4_executable needs to be called afterwards
|
||||
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||
get_target_property (QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION)
|
||||
install(CODE "
|
||||
message(STATUS \"Deploying (Qt) dependencies and fixing library pathes...\")
|
||||
execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/admin/osx/macdeployqt.py\" ${CMAKE_INSTALL_PREFIX}/${OWNCLOUD_OSX_BUNDLE} ${QT_QMAKE_EXECUTABLE})
|
||||
" COMPONENT RUNTIME)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -156,7 +156,7 @@ void AccountSettings::slotFolderActivated( const QModelIndex& indx )
|
||||
} else {
|
||||
ui->_buttonAdd->setVisible(true);
|
||||
}
|
||||
bool isConnected = _accountState && _accountState->state() == AccountState::Connected;
|
||||
bool isConnected = _accountState && _accountState->isConnected();
|
||||
ui->_buttonAdd->setEnabled(isConnected);
|
||||
ui->_buttonEnable->setEnabled( isValid );
|
||||
ui->_buttonSelectiveSync->setEnabled(isConnected && isValid);
|
||||
@@ -168,7 +168,7 @@ void AccountSettings::slotFolderActivated( const QModelIndex& indx )
|
||||
} else {
|
||||
ui->_buttonEnable->setText( tr( "Resume" ) );
|
||||
}
|
||||
ui->_buttonEnable->setEnabled( _accountState && _accountState->state() == AccountState::Connected);
|
||||
ui->_buttonEnable->setEnabled(isConnected);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,11 +234,7 @@ void AccountSettings::slotAddFolder( Folder *folder )
|
||||
if( ! folder || folder->alias().isEmpty() ) return;
|
||||
|
||||
QStandardItem *item = new QStandardItem();
|
||||
bool isConnected = false;
|
||||
if (_accountState) {
|
||||
isConnected = (_accountState->state() == AccountState::Connected);
|
||||
}
|
||||
folderToModelItem( item, folder, isConnected);
|
||||
folderToModelItem( item, folder, _accountState && _accountState->isConnectedOrMaintenance());
|
||||
_model->appendRow( item );
|
||||
// in order to update the enabled state of the "Sync now" button
|
||||
connect(folder, SIGNAL(syncStateChange()), this, SLOT(slotFolderSyncStateChange()), Qt::UniqueConnection);
|
||||
@@ -541,7 +537,7 @@ void AccountSettings::slotUpdateFolderState( Folder *folder )
|
||||
}
|
||||
|
||||
if( item ) {
|
||||
folderToModelItem( item, folder, _accountState->state() == AccountState::Connected );
|
||||
folderToModelItem( item, folder, _accountState->isConnectedOrMaintenance() );
|
||||
} else {
|
||||
// the dialog is not visible.
|
||||
}
|
||||
@@ -798,7 +794,7 @@ void AccountSettings::slotAccountStateChanged(int state)
|
||||
foreach (Folder *folder, folderMan->map().values()) {
|
||||
slotUpdateFolderState(folder);
|
||||
}
|
||||
if (state == AccountState::Connected) {
|
||||
if (state == AccountState::Connected || state == AccountState::ServerMaintenance) {
|
||||
QString user;
|
||||
if (AbstractCredentials *cred = account->credentials()) {
|
||||
user = cred->user();
|
||||
|
||||
@@ -125,6 +125,8 @@ QString AccountState::stateString(State state)
|
||||
return QLatin1String("Disconnected");
|
||||
case Connected:
|
||||
return QLatin1String("Connected");
|
||||
case ServerMaintenance:
|
||||
return QLatin1String("ServerMaintenance");
|
||||
case NetworkError:
|
||||
return QLatin1String("NetworkError");
|
||||
case ConfigurationError:
|
||||
@@ -152,6 +154,11 @@ bool AccountState::isConnected() const
|
||||
return _state == Connected;
|
||||
}
|
||||
|
||||
bool AccountState::isConnectedOrMaintenance() const
|
||||
{
|
||||
return isConnected() || _state == ServerMaintenance;
|
||||
}
|
||||
|
||||
QuotaInfo *AccountState::quotaInfo()
|
||||
{
|
||||
return _quotaInfo;
|
||||
@@ -214,6 +221,9 @@ void AccountState::slotConnectionValidatorResult(ConnectionValidator::Status sta
|
||||
case ConnectionValidator::UserCanceledCredentials:
|
||||
setState(SignedOut);
|
||||
break;
|
||||
case ConnectionValidator::ServerMaintenance:
|
||||
setState(ServerMaintenance);
|
||||
break;
|
||||
case ConnectionValidator::Timeout:
|
||||
setState(NetworkError);
|
||||
break;
|
||||
|
||||
@@ -67,6 +67,10 @@ public:
|
||||
/// The account is successfully talking to the server.
|
||||
Connected,
|
||||
|
||||
/// The account is talking to the server, but the server is in
|
||||
/// maintenance mode.
|
||||
ServerMaintenance,
|
||||
|
||||
/// Could not communicate with the server for some reason.
|
||||
/// We assume this may resolve itself over time and will try
|
||||
/// again automatically.
|
||||
@@ -96,6 +100,7 @@ public:
|
||||
void setSignedOut(bool signedOut);
|
||||
|
||||
bool isConnected() const;
|
||||
bool isConnectedOrMaintenance() const;
|
||||
|
||||
QuotaInfo *quotaInfo();
|
||||
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2015 by nocteau
|
||||
* Copyright (C) 2015 by Daniel Molkentin <danimo@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "ui_addcertificatedialog.h"
|
||||
#include "addcertificatedialog.h"
|
||||
#include <QFileDialog>
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2015 by nocteau
|
||||
* Copyright (C) 2015 by Daniel Molkentin <danimo@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef ADDCERTIFICATEDIALOG_H
|
||||
#define ADDCERTIFICATEDIALOG_H
|
||||
|
||||
|
||||
@@ -111,7 +111,7 @@ Application::Application(int &argc, char **argv) :
|
||||
|
||||
_folderManager.reset(new FolderMan);
|
||||
|
||||
connect( this, SIGNAL(messageReceived(QString, QObject*)), SLOT(slotParseOptions(QString, QObject*)));
|
||||
connect(this, SIGNAL(messageReceived(QString, QObject*)), SLOT(slotParseMessage(QString, QObject*)));
|
||||
|
||||
// Create the account info manager to ensure it's listening to the
|
||||
// account manager.
|
||||
@@ -149,8 +149,8 @@ Application::Application(int &argc, char **argv) :
|
||||
slotAccountStateAdded(ai);
|
||||
}
|
||||
|
||||
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString)),
|
||||
_gui, SLOT(slotShowShareDialog(QString, QString)));
|
||||
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString, bool)),
|
||||
_gui, SLOT(slotShowShareDialog(QString, QString, bool)));
|
||||
|
||||
// startup procedure.
|
||||
connect(&_checkConnectionTimer, SIGNAL(timeout()), this, SLOT(slotCheckConnection()));
|
||||
@@ -224,7 +224,7 @@ void Application::slotCleanup()
|
||||
if (account) {
|
||||
account->save();
|
||||
}
|
||||
FolderMan::instance()->unloadAllFolders();
|
||||
FolderMan::instance()->unloadAndDeleteAllFolders();
|
||||
|
||||
_gui->slotShutdown();
|
||||
_gui->deleteLater();
|
||||
@@ -260,6 +260,7 @@ void Application::slotAccountStateChanged(int state)
|
||||
folderMan->setSyncEnabled(true);
|
||||
folderMan->slotScheduleAllFolders();
|
||||
break;
|
||||
case AccountState::ServerMaintenance:
|
||||
case AccountState::SignedOut:
|
||||
case AccountState::ConfigurationError:
|
||||
case AccountState::NetworkError:
|
||||
@@ -343,15 +344,16 @@ void Application::slotUseMonoIconsChanged(bool)
|
||||
_gui->slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
void Application::slotParseOptions(const QString &opts, QObject*)
|
||||
void Application::slotParseMessage(const QString &msg, QObject*)
|
||||
{
|
||||
QStringList options = opts.split(QLatin1Char('|'));
|
||||
parseOptions(options);
|
||||
setupLogging();
|
||||
|
||||
//This function is calld happens when someone tries to run another instance of ownCloud
|
||||
// show the settings dialog
|
||||
showSettingsDialog();
|
||||
if (msg.startsWith(QLatin1String("MSG_PARSEOPTIONS:"))) {
|
||||
const int lengthOfMsgPrefix = 17;
|
||||
QStringList options = msg.mid(lengthOfMsgPrefix).split(QLatin1Char('|'));
|
||||
parseOptions(options);
|
||||
setupLogging();
|
||||
} else if (msg.startsWith(QLatin1String("MSG_SHOWSETTINGS"))) {
|
||||
showSettingsDialog();
|
||||
}
|
||||
}
|
||||
|
||||
void Application::parseOptions(const QStringList &options)
|
||||
|
||||
@@ -73,7 +73,7 @@ signals:
|
||||
void folderStateChanged(Folder*);
|
||||
|
||||
protected slots:
|
||||
void slotParseOptions( const QString&, QObject* );
|
||||
void slotParseMessage(const QString&, QObject*);
|
||||
void slotCheckConnection();
|
||||
void slotUpdateConnectionErrors(int accountState);
|
||||
void slotStartUpdateDetector();
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "syncengine.h"
|
||||
#include "syncrunfilelog.h"
|
||||
#include "theme.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
|
||||
#include "creds/abstractcredentials.h"
|
||||
@@ -145,12 +146,12 @@ AccountState* Folder::accountState() const
|
||||
|
||||
void Folder::checkLocalPath()
|
||||
{
|
||||
QFileInfo fi(_path);
|
||||
const QFileInfo fi(_path);
|
||||
|
||||
if( fi.isDir() && fi.isReadable() ) {
|
||||
qDebug() << "Checked local path ok";
|
||||
} else {
|
||||
if( !fi.exists() ) {
|
||||
if( !FileSystem::fileExists(_path) ) {
|
||||
// try to create the local dir
|
||||
QDir d(_path);
|
||||
if( d.mkpath(_path) ) {
|
||||
@@ -158,7 +159,7 @@ void Folder::checkLocalPath()
|
||||
}
|
||||
}
|
||||
// Check directory again
|
||||
if( !fi.exists() ) {
|
||||
if( !FileSystem::fileExists(_path) ) {
|
||||
_syncResult.setErrorString(tr("Local folder %1 does not exist.").arg(_path));
|
||||
_syncResult.setStatus( SyncResult::SetupError );
|
||||
} else if( !fi.isDir() ) {
|
||||
@@ -590,7 +591,7 @@ void Folder::slotThreadTreeWalkResult(const SyncFileItemVector& items)
|
||||
_syncResult.setSyncFileItemVector(items);
|
||||
}
|
||||
|
||||
void Folder::slotAboutToPropagate(const SyncFileItemVector& items)
|
||||
void Folder::slotAboutToPropagate(SyncFileItemVector& items)
|
||||
{
|
||||
// empty the tainted list since the status generation code will use the _syncedItems
|
||||
// (which imply the folder) to generate the syncing state icon now.
|
||||
@@ -791,8 +792,8 @@ void Folder::startSync(const QStringList &pathList)
|
||||
connect(_engine.data(), SIGNAL(rootEtag(QString)), this, SLOT(etagRetreivedFromSyncEngine(QString)));
|
||||
connect( _engine.data(), SIGNAL(treeWalkResult(const SyncFileItemVector&)),
|
||||
this, SLOT(slotThreadTreeWalkResult(const SyncFileItemVector&)), Qt::QueuedConnection);
|
||||
connect( _engine.data(), SIGNAL(aboutToPropagate(const SyncFileItemVector&)),
|
||||
this, SLOT(slotAboutToPropagate(const SyncFileItemVector&)), Qt::QueuedConnection);
|
||||
connect( _engine.data(), SIGNAL(aboutToPropagate(SyncFileItemVector&)),
|
||||
this, SLOT(slotAboutToPropagate(SyncFileItemVector&)));
|
||||
|
||||
connect(_engine.data(), SIGNAL(started()), SLOT(slotSyncStarted()), Qt::QueuedConnection);
|
||||
connect(_engine.data(), SIGNAL(finished()), SLOT(slotSyncFinished()), Qt::QueuedConnection);
|
||||
|
||||
@@ -189,7 +189,7 @@ private slots:
|
||||
void etagRetreived(const QString &);
|
||||
void etagRetreivedFromSyncEngine(const QString &);
|
||||
|
||||
void slotAboutToPropagate(const SyncFileItemVector& );
|
||||
void slotAboutToPropagate(SyncFileItemVector& );
|
||||
void slotThreadTreeWalkResult(const SyncFileItemVector& ); // after sync is done
|
||||
|
||||
void slotEmitFinishedDelayed();
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "account.h"
|
||||
#include "accountmigrator.h"
|
||||
#include "accountstate.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#include <CoreServices/CoreServices.h>
|
||||
@@ -43,8 +44,9 @@ FolderMan* FolderMan::_instance = 0;
|
||||
* The minimum time between a sync being requested and it
|
||||
* being executed in milliseconds.
|
||||
*
|
||||
* This delay must be larger than the minFileAgeForUpload in
|
||||
* the propagator.
|
||||
* This delay must be large enough to ensure fileIsStillChanging()
|
||||
* in the upload propagator doesn't decide to skip the file because
|
||||
* the modification was too recent.
|
||||
*/
|
||||
static qint64 msBetweenRequestAndSync = 2000;
|
||||
|
||||
@@ -93,27 +95,24 @@ OCC::Folder::Map FolderMan::map()
|
||||
return _folderMap;
|
||||
}
|
||||
|
||||
// Attention: this function deletes the folder object to which
|
||||
// the alias refers. Do NOT USE the folder pointer any more after
|
||||
// having this called.
|
||||
void FolderMan::unloadFolder( const QString& alias )
|
||||
{
|
||||
Folder *f = folder(alias);
|
||||
if( f ) {
|
||||
if( _socketApi ) {
|
||||
_socketApi->slotUnregisterPath(alias);
|
||||
}
|
||||
|
||||
_folderChangeSignalMapper->removeMappings(f);
|
||||
if( _folderWatchers.contains(alias)) {
|
||||
_folderWatchers.remove(alias);
|
||||
}
|
||||
_folderMap.remove( alias );
|
||||
delete f;
|
||||
Folder* f = folder(alias);
|
||||
if( !f ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( _socketApi ) {
|
||||
_socketApi->slotUnregisterPath(alias);
|
||||
}
|
||||
|
||||
if( _folderWatchers.contains(alias)) {
|
||||
_folderWatchers.remove(alias);
|
||||
}
|
||||
_folderMap.remove( alias );
|
||||
}
|
||||
|
||||
int FolderMan::unloadAllFolders()
|
||||
int FolderMan::unloadAndDeleteAllFolders()
|
||||
{
|
||||
int cnt = 0;
|
||||
|
||||
@@ -121,7 +120,9 @@ int FolderMan::unloadAllFolders()
|
||||
Folder::MapIterator i(_folderMap);
|
||||
while (i.hasNext()) {
|
||||
i.next();
|
||||
Folder* f = i.value();
|
||||
unloadFolder(i.key());
|
||||
delete f;
|
||||
cnt++;
|
||||
}
|
||||
_lastSyncFolder.clear();
|
||||
@@ -187,7 +188,7 @@ int FolderMan::setupFolders()
|
||||
{
|
||||
qDebug() << "* Setup folders from " << _folderConfigPath;
|
||||
|
||||
unloadAllFolders();
|
||||
unloadAndDeleteAllFolders();
|
||||
|
||||
ConfigFile cfg;
|
||||
QDir storageDir(cfg.configPath());
|
||||
@@ -760,48 +761,37 @@ void FolderMan::removeAllFolderDefinitions()
|
||||
|
||||
void FolderMan::slotRemoveFolder( const QString& alias )
|
||||
{
|
||||
if( alias.isEmpty() ) return;
|
||||
Folder *f = folder(alias);
|
||||
if( !f ) {
|
||||
qDebug() << "!! Can not remove " << alias << ", not in folderMap.";
|
||||
return;
|
||||
}
|
||||
|
||||
if( _currentSyncFolder == alias ) {
|
||||
// terminate if the sync is currently underway.
|
||||
qDebug() << "Removing " << alias;
|
||||
|
||||
const bool currentlyRunning = (_currentSyncFolder == alias);
|
||||
if( currentlyRunning ) {
|
||||
// let the folder delete itself when done and
|
||||
// abort the sync now
|
||||
connect(f, SIGNAL(syncFinished(SyncResult)), f, SLOT(deleteLater()));
|
||||
terminateSyncProcess();
|
||||
}
|
||||
removeFolder(alias);
|
||||
}
|
||||
|
||||
// remove a folder from the map. Should be sure n
|
||||
void FolderMan::removeFolder( const QString& alias )
|
||||
{
|
||||
Folder *f = 0;
|
||||
|
||||
_scheduleQueue.removeAll(alias);
|
||||
|
||||
if( _folderMap.contains( alias )) {
|
||||
qDebug() << "Removing " << alias;
|
||||
f = _folderMap[alias]; // do not remove from the map, that is done in unloadFolder.
|
||||
} else {
|
||||
qDebug() << "!! Can not remove " << alias << ", not in folderMap.";
|
||||
f->wipe();
|
||||
f->setSyncPaused(true);
|
||||
|
||||
// remove the folder configuration
|
||||
QFile file(f->configFile() );
|
||||
if( file.exists() ) {
|
||||
qDebug() << "Remove folder config file " << file.fileName();
|
||||
file.remove();
|
||||
}
|
||||
|
||||
if( f ) {
|
||||
f->wipe();
|
||||
|
||||
// can be removed if we are able to delete the folder object.
|
||||
f->setSyncPaused(true);
|
||||
|
||||
// remove the folder configuration
|
||||
QFile file(f->configFile() );
|
||||
if( file.exists() ) {
|
||||
qDebug() << "Remove folder config file " << file.fileName();
|
||||
file.remove();
|
||||
}
|
||||
|
||||
unloadFolder( alias ); // now the folder object is gone.
|
||||
|
||||
// FIXME: this is a temporar dirty fix against a crash happening because
|
||||
// the csync owncloud module still has static components. Activate the
|
||||
// delete once the module is fixed.
|
||||
// f->deleteLater();
|
||||
unloadFolder( alias );
|
||||
if( !currentlyRunning ) {
|
||||
delete f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -862,9 +852,10 @@ bool FolderMan::startFromScratch( const QString& localFolder )
|
||||
|
||||
// Make a backup of the folder/file.
|
||||
QString newName = getBackupName( parentDir.absoluteFilePath( folderName ) );
|
||||
if( !parentDir.rename( fi.absoluteFilePath(), newName ) ) {
|
||||
QString renameError;
|
||||
if( !FileSystem::rename( fi.absoluteFilePath(), newName, &renameError ) ) {
|
||||
qDebug() << "startFromScratch: Could not rename" << fi.absoluteFilePath()
|
||||
<< "to" << newName;
|
||||
<< "to" << newName << "error:" << renameError;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,10 +121,8 @@ public slots:
|
||||
*/
|
||||
void terminateSyncProcess();
|
||||
|
||||
/* unload and delete on folder object */
|
||||
void unloadFolder( const QString& alias );
|
||||
/* delete all folder objects */
|
||||
int unloadAllFolders();
|
||||
int unloadAndDeleteAllFolders();
|
||||
|
||||
// if enabled is set to false, no new folders will start to sync.
|
||||
// the current one will finish.
|
||||
@@ -150,6 +148,9 @@ private slots:
|
||||
void slotRemoveFoldersForAccount(AccountState* accountState);
|
||||
|
||||
private:
|
||||
/* unloads a folder object, does not delete it */
|
||||
void unloadFolder( const QString& alias );
|
||||
|
||||
/** Will start a sync after a bit of delay. */
|
||||
void startScheduledSyncSoon(qint64 msMinimumDelay = 0);
|
||||
|
||||
@@ -160,8 +161,6 @@ private:
|
||||
|
||||
QString unescapeAlias( const QString& ) const;
|
||||
|
||||
void removeFolder( const QString& );
|
||||
|
||||
QSet<Folder*> _disabledFolders;
|
||||
Folder::Map _folderMap;
|
||||
QString _folderConfigPath;
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "networkjobs.h"
|
||||
#include "account.h"
|
||||
#include "selectivesyncdialog.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDesktopServices>
|
||||
@@ -42,9 +43,9 @@ QString FormatWarningsWizardPage::formatWarnings(const QStringList &warnings) co
|
||||
{
|
||||
QString ret;
|
||||
if (warnings.count() == 1) {
|
||||
ret = tr("<b>Warning:</b> ") + warnings.first();
|
||||
ret = tr("<b>Warning:</b> %1").arg(warnings.first());
|
||||
} else if (warnings.count() > 1) {
|
||||
ret = tr("<b>Warning:</b> ") + "<ul>";
|
||||
ret = tr("<b>Warning:</b>") + " <ul>";
|
||||
Q_FOREACH(QString warning, warnings) {
|
||||
ret += QString::fromLatin1("<li>%1</li>").arg(warning);
|
||||
}
|
||||
@@ -293,8 +294,12 @@ void FolderWizardRemotePath::slotCreateRemoteFolderFinished(QNetworkReply::Netwo
|
||||
void FolderWizardRemotePath::slotHandleNetworkError(QNetworkReply *reply)
|
||||
{
|
||||
qDebug() << "** webdav mkdir request failed:" << reply->error();
|
||||
showWarn(tr("Failed to create the folder on %1. Please check manually.")
|
||||
.arg(Theme::instance()->appNameGUI()));
|
||||
if( reply && !_account->credentials()->stillValid(reply) ) {
|
||||
showWarn(tr("Authentication failed accessing %1").arg(Theme::instance()->appNameGUI()));
|
||||
} else {
|
||||
showWarn(tr("Failed to create the folder on %1. Please check manually.")
|
||||
.arg(Theme::instance()->appNameGUI()));
|
||||
}
|
||||
}
|
||||
|
||||
static QTreeWidgetItem* findFirstChild(QTreeWidgetItem *parent, const QString& text)
|
||||
@@ -357,6 +362,7 @@ void FolderWizardRemotePath::slotUpdateDirectories(const QStringList &list)
|
||||
void FolderWizardRemotePath::slotRefreshFolders()
|
||||
{
|
||||
LsColJob *job = new LsColJob(_account, "/", this);
|
||||
job->setProperties(QList<QByteArray>() << "resourcetype");
|
||||
connect(job, SIGNAL(directoryListingSubfolders(QStringList)),
|
||||
SLOT(slotUpdateDirectories(QStringList)));
|
||||
job->start();
|
||||
@@ -367,6 +373,7 @@ void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
|
||||
{
|
||||
QString dir = item->data(0, Qt::UserRole).toString();
|
||||
LsColJob *job = new LsColJob(_account, dir, this);
|
||||
job->setProperties(QList<QByteArray>() << "resourcetype");
|
||||
connect(job, SIGNAL(directoryListingSubfolders(QStringList)),
|
||||
SLOT(slotUpdateDirectories(QStringList)));
|
||||
job->start();
|
||||
|
||||
@@ -68,7 +68,7 @@ LogBrowser::LogBrowser(QWidget *parent) :
|
||||
mainLayout->addLayout( toolLayout );
|
||||
|
||||
// Search input field
|
||||
QLabel *lab = new QLabel(tr("&Search: "));
|
||||
QLabel *lab = new QLabel(tr("&Search:") + " ");
|
||||
_findTermEdit = new QLineEdit;
|
||||
lab->setBuddy( _findTermEdit );
|
||||
toolLayout->addWidget(lab);
|
||||
@@ -191,7 +191,7 @@ void LogBrowser::slotSave()
|
||||
stream << _logWidget->toPlainText();
|
||||
file.close();
|
||||
} else {
|
||||
QMessageBox::critical(this, tr("Error"), tr("Could not write to log file ")+ saveFile);
|
||||
QMessageBox::critical(this, tr("Error"), tr("Could not write to log file %1").arg(saveFile));
|
||||
}
|
||||
}
|
||||
_saveBtn->setEnabled(true);
|
||||
|
||||
@@ -61,9 +61,8 @@ int main(int argc, char **argv)
|
||||
|
||||
|
||||
#ifdef WITH_CRASHREPORTER
|
||||
CrashReporter::Handler* handler = new CrashReporter::Handler( QDir::tempPath(), true, CRASHREPORTER_EXECUTABLE );
|
||||
ConfigFile cfgFile;
|
||||
handler->setActive(cfgFile.crashReporter());
|
||||
if (ConfigFile().crashReporter())
|
||||
new CrashReporter::Handler( QDir::tempPath(), true, CRASHREPORTER_EXECUTABLE );
|
||||
#endif
|
||||
|
||||
#ifndef Q_OS_WIN
|
||||
@@ -96,14 +95,16 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
// if the application is already running, notify it.
|
||||
if( app.isRunning() ) {
|
||||
if(app.isRunning()) {
|
||||
qDebug() << Q_FUNC_INFO << "Already running, exiting...";
|
||||
QStringList args = app.arguments();
|
||||
if ( args.size() > 1 && ! app.giveHelp() ) {
|
||||
QString msg = args.join( QLatin1String("|") );
|
||||
if( ! app.sendMessage( msg ) )
|
||||
if (args.size() > 1) {
|
||||
QString msg = args.join(QLatin1String("|"));
|
||||
if(!app.sendMessage(QLatin1String("MSG_PARSEOPTIONS:") + msg))
|
||||
return -1;
|
||||
}
|
||||
if(!app.sendMessage(QLatin1String("MSG_SHOWSETTINGS")))
|
||||
return -1;
|
||||
return 0;
|
||||
} else {
|
||||
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||
|
||||
@@ -221,7 +221,7 @@ void ownCloudGui::slotComputeOverallSyncStatus()
|
||||
_tray->setToolTip(tr("Please sign in"));
|
||||
return;
|
||||
}
|
||||
if (!a->isConnected()) {
|
||||
if (!a->isConnectedOrMaintenance()) {
|
||||
_tray->setIcon(Theme::instance()->folderOfflineIcon(true));
|
||||
_tray->setToolTip(tr("Disconnected from server"));
|
||||
return;
|
||||
@@ -432,7 +432,7 @@ void ownCloudGui::setupActions()
|
||||
connect(_actionLogout, SIGNAL(triggered()), _app, SLOT(slotLogout()));
|
||||
|
||||
if(_app->debugMode()) {
|
||||
_actionCrash = new QAction(tr("Crash now"), this);
|
||||
_actionCrash = new QAction(tr("Crash now", "Only shows in debug mode to allow testing the crash handler"), this);
|
||||
connect(_actionCrash, SIGNAL(triggered()), _app, SLOT(slotCrash()));
|
||||
} else {
|
||||
_actionCrash = 0;
|
||||
@@ -642,7 +642,7 @@ void ownCloudGui::raiseDialog( QWidget *raiseWidget )
|
||||
}
|
||||
|
||||
|
||||
void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath)
|
||||
void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed)
|
||||
{
|
||||
AccountPtr account = AccountManager::instance()->account();
|
||||
if (!account) {
|
||||
@@ -651,10 +651,10 @@ void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &l
|
||||
}
|
||||
|
||||
qDebug() << Q_FUNC_INFO << "Opening share dialog";
|
||||
ShareDialog *w = new ShareDialog(account, sharePath, localPath);
|
||||
ShareDialog *w = new ShareDialog(account, sharePath, localPath, resharingAllowed);
|
||||
w->getShares();
|
||||
w->setAttribute( Qt::WA_DeleteOnClose, true );
|
||||
w->show();
|
||||
raiseDialog(w);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public slots:
|
||||
void slotHelp();
|
||||
void slotOpenPath(const QString& path);
|
||||
void slotAccountStateChanged();
|
||||
void slotShowShareDialog(const QString &sharePath, const QString &localPath);
|
||||
void slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed);
|
||||
|
||||
private slots:
|
||||
void slotDisplayIdle();
|
||||
|
||||