001 package railo.runtime.functions.rest; 002 003 import railo.commons.io.res.Resource; 004 import railo.commons.io.res.util.ResourceUtil; 005 import railo.commons.lang.StringUtil; 006 import railo.runtime.PageContext; 007 import railo.runtime.config.ConfigWebAdmin; 008 import railo.runtime.config.ConfigWebImpl; 009 import railo.runtime.exp.FunctionException; 010 import railo.runtime.exp.PageException; 011 import railo.runtime.exp.SecurityException; 012 import railo.runtime.listener.ApplicationContext; 013 import railo.runtime.listener.ModernApplicationContext; 014 import railo.runtime.op.Caster; 015 import railo.runtime.rest.Mapping; 016 import railo.runtime.rest.RestUtil; 017 import railo.runtime.type.KeyImpl; 018 019 public class RestDeleteApplication { 020 public static String call(PageContext pc , String dirPath) throws PageException { 021 return call(pc, dirPath,null); 022 } 023 024 public static String call(PageContext pc , String dirPath,String webAdminPassword) throws PageException { 025 webAdminPassword=getPassword(pc, webAdminPassword); 026 027 Resource dir=RestDeleteApplication.toResource(pc,dirPath); 028 ConfigWebImpl config=(ConfigWebImpl) pc.getConfig(); 029 030 try { 031 ConfigWebAdmin admin = ConfigWebAdmin.newInstance((ConfigWebImpl)pc.getConfig(),webAdminPassword); 032 Mapping[] mappings = config.getRestMappings(); 033 Mapping mapping; 034 for(int i=0;i<mappings.length;i++){ 035 mapping=mappings[i]; 036 if(RestUtil.isMatch(pc,mapping,dir)){ 037 admin.removeRestMapping(mapping.getVirtual()); 038 admin.store(); 039 } 040 } 041 } 042 catch (Exception e) { 043 throw Caster.toPageException(e); 044 } 045 046 047 return null; 048 } 049 050 static String getPassword(PageContext pc,String password) throws SecurityException { 051 if(!StringUtil.isEmpty(password, true)) { 052 password=password.trim(); 053 } 054 else { 055 ApplicationContext ac = pc.getApplicationContext(); 056 if(ac instanceof ModernApplicationContext) { 057 ModernApplicationContext mac=(ModernApplicationContext) ac; 058 password = Caster.toString(mac.getCustom(KeyImpl.init("webAdminPassword")),null); 059 } 060 } 061 if(StringUtil.isEmpty(password, true)) 062 throw new SecurityException("To manipulate a REST mapping you need to define the password for the current Web Administartor, " + 063 "you can do this as argument with this function or inside the application.cfc with the variable [this.webAdminPassword]."); 064 065 return password; 066 } 067 068 static Resource toResource(PageContext pc, String dirPath) throws PageException { 069 Resource dir = ResourceUtil.toResourceNotExisting(pc.getConfig(), dirPath); 070 pc.getConfig().getSecurityManager().checkFileLocation(dir); 071 if(!dir.isDirectory()) 072 throw new FunctionException(pc, "RestInitApplication", 1, "dirPath", "argument value ["+dirPath+"] must contain a existing directory"); 073 074 return dir; 075 } 076 }