日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sonar findbugs plugin源码研究

發(fā)布時間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sonar findbugs plugin源码研究 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先貼一下findbugs plugin 代碼目錄:


代碼:



代碼里面有很幾個關于plugin定義的關鍵類:

language包下面定義了掃描jsp 的思路:

public class Jspextends AbstractLanguage {public static final String KEY = "jsp";public static final String NAME = "JSP";public static final String FILE_SUFFIXES_KEY = "sonar.jsp.file.suffixes";public static final String DEFAULT_FILE_SUFFIXES = ".jsp";private final Settings settings;public Jsp(Settings settings){super("jsp", "JSP");this.settings = settings;}public String[] getFileSuffixes(){String[] suffixes = filterEmptyStrings(this.settings.getStringArray("sonar.jsp.file.suffixes"));if (suffixes.length == 0) {suffixes = StringUtils.split(".jsp", ",");}return suffixes;}private static String[] filterEmptyStrings(String[] stringArray){List<String> nonEmptyStrings = Lists.newArrayList();for (String string : stringArray) {if (StringUtils.isNotBlank(string.trim())) {nonEmptyStrings.add(string.trim());}}return (String[])nonEmptyStrings.toArray(new String[nonEmptyStrings.size()]);} }

JspCodeColorizerFormat 類定義了如何識別標簽掃描jsp

public class JspCodeColorizerFormatextends CodeColorizerFormat {private final List<Tokenizer> tokenizers = new ArrayList();public JspCodeColorizerFormat(){super("jsp");String tagAfter = "</span>";this.tokenizers.add(new RegexpTokenizer("<span class=\"k\">", tagAfter, "</?[:\\w]+>?"));this.tokenizers.add(new RegexpTokenizer("<span class=\"k\">", tagAfter, ">"));this.tokenizers.add(new RegexpTokenizer("<span class=\"j\">", tagAfter, "<!DOCTYPE.*>"));this.tokenizers.add(new MultilinesDocTokenizer("<!--", "-->", "<span class=\"j\">", tagAfter));this.tokenizers.add(new MultilinesDocTokenizer("<%--", "--%>", "<span class=\"j\">", tagAfter));this.tokenizers.add(new MultilinesDocTokenizer("<%@", "%>", "<span class=\"a\">", tagAfter));this.tokenizers.add(new MultilinesDocTokenizer("<%", "%>", "<span class=\"a\">", tagAfter));this.tokenizers.add(new StringTokenizer("<span class=\"s\">", tagAfter));}public List<Tokenizer> getTokenizers(){return this.tokenizers;} }

profiles 包中定義了規(guī)則相關:

FindBugs + FB-Contrib 規(guī)則,針對語言java

public class FindbugsContribProfileextends ProfileDefinition {private static final String FB_CONTRIB_PROFILE_NAME = "FindBugs + FB-Contrib";private final FindbugsProfileImporter importer;public FindbugsContribProfile(FindbugsProfileImporter importer){this.importer = importer;}public RulesProfile createProfile(ValidationMessages messages){Reader findbugsProfile = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/profile-findbugs-and-fb-contrib.xml"));RulesProfile profile = this.importer.importProfile(findbugsProfile, messages);profile.setLanguage("java");profile.setName("FindBugs + FB-Contrib");return profile;} }

定義FindBugs 規(guī)則,針對語言java

public class FindbugsProfileextends ProfileDefinition {private static final String FINDBUGS_PROFILE_NAME = "FindBugs";private final FindbugsProfileImporter importer;public FindbugsProfile(FindbugsProfileImporter importer){this.importer = importer;}public RulesProfile createProfile(ValidationMessages messages){Reader findbugsProfile = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/profile-findbugs-only.xml"));RulesProfile profile = this.importer.importProfile(findbugsProfile, messages);profile.setLanguage("java");profile.setName("FindBugs");return profile;} }

定義了規(guī)則FindBugs Security Audit,針對語言java

public class FindbugsSecurityAuditProfileextends ProfileDefinition {private static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Audit";private final FindbugsProfileImporter importer;public FindbugsSecurityAuditProfile(FindbugsProfileImporter importer){this.importer = importer;}public RulesProfile createProfile(ValidationMessages messages){Reader findbugsProfile = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/profile-findbugs-security-audit.xml"));RulesProfile profile = this.importer.importProfile(findbugsProfile, messages);profile.setLanguage("java");profile.setName("FindBugs Security Audit");return profile;} }

定義檢查規(guī)則FindBugs Security JSP 針對語言:jsp

public class FindbugsSecurityJspProfileextends ProfileDefinition {private static final String FINDBUGS_SECURITY_JSP_PROFILE_NAME = "FindBugs Security JSP";private final FindbugsProfileImporter importer;public FindbugsSecurityJspProfile(FindbugsProfileImporter importer){this.importer = importer;}public RulesProfile createProfile(ValidationMessages messages){Reader findbugsProfile = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/profile-findbugs-security-jsp.xml"));RulesProfile profile = this.importer.importProfile(findbugsProfile, messages);profile.setLanguage("jsp");profile.setName("FindBugs Security JSP");return profile;}

定義規(guī)則:FindBugs Security Minimal 針對語言java

public class FindbugsSecurityMinimalProfileextends ProfileDefinition {private static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Minimal";private final FindbugsProfileImporter importer;public FindbugsSecurityMinimalProfile(FindbugsProfileImporter importer){this.importer = importer;}public RulesProfile createProfile(ValidationMessages messages){Reader findbugsProfile = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/profile-findbugs-security-minimal.xml"));RulesProfile profile = this.importer.importProfile(findbugsProfile, messages);profile.setLanguage("java");profile.setName("FindBugs Security Minimal");return profile;} }

resource包下面定義的類,是加載掃描jsp 相關java類

public class ByteCodeResourceLocatorimplements BatchExtension {private static final Logger LOG = LoggerFactory.getLogger(ByteCodeResourceLocator.class);private static final String[] SOURCE_DIRECTORIES = { "src/main/java", "src/main/webapp", "src/main/resources", "src", "/src/java" };public InputFile findJavaClassFile(String className, FileSystem fs){int indexDollarSign = className.indexOf("$");if (indexDollarSign != -1) {className = className.substring(0, indexDollarSign);}return buildInputFile(className.replaceAll("\\.", "/") + ".java", fs);}public InputFile findJavaOuterClassFile(String className, File classFile, FileSystem fs){try{InputStream in = new FileInputStream(classFile);Throwable localThrowable4 = null;try{DebugExtensionExtractor debug = new DebugExtensionExtractor();String source = debug.getDebugSourceFromClass(in);if (source == null) {return null;}String newClassName = FilenameUtils.getBaseName(source);String packagePrefix = className.lastIndexOf(".") != -1 ? FilenameUtils.getBaseName(className) + "." : "";String fullClassName = packagePrefix + newClassName;return findJavaClassFile(fullClassName, fs);}catch (Throwable localThrowable2){localThrowable4 = localThrowable2;throw localThrowable2;}finally{if (in != null) {if (localThrowable4 != null) {try{in.close();}catch (Throwable localThrowable3){localThrowable4.addSuppressed(localThrowable3);}} else {in.close();}}}return null;}catch (IOException e){LOG.warn("An error occurs while opening classfile : " + classFile.getPath());}}public InputFile findTemplateFile(String className, FileSystem fs){List<String> potentialJspFilenames = new ArrayList();if (className.startsWith("jsp_servlet")){String jspFile = className.substring(11).replaceFirst("\\.__([^\\.]+)$", "/$1\\.jsp").replace("._", "/");potentialJspFilenames.add(jspFile);}String jspFileFromClass;if (className.endsWith("_jsp")){jspFileFromClass = JasperUtils.decodeJspClassName(className);potentialJspFilenames.add(jspFileFromClass);for (String packageName : Arrays.asList(new String[] { "jsp/", "org/apache/jsp/" })) {if (jspFileFromClass.startsWith(packageName)) {potentialJspFilenames.add(jspFileFromClass.substring(packageName.length()));}}}for (String jspFilename : potentialJspFilenames){InputFile file = buildInputFile(jspFilename, fs);if (file != null) {return file;}}return null;}public InputFile buildInputFile(String fileName, FileSystem fs){for (String sourceDir : SOURCE_DIRECTORIES){Iterable<InputFile> files = fs.inputFiles(fs.predicates().hasRelativePath(sourceDir + "/" + fileName));Iterator localIterator = files.iterator();if (localIterator.hasNext()){InputFile f = (InputFile)localIterator.next();return f;}}return null;}@Nullablepublic SmapParser.SmapLocation extractSmapLocation(String className, int originalLine, File classFile){String smap;try{InputStream in = new FileInputStream(classFile);Throwable localThrowable7 = null;try{DebugExtensionExtractor debug = new DebugExtensionExtractor();smap = debug.getDebugExtFromClass(in);if (smap != null) {return getJspLineNumberFromSmap(smap, Integer.valueOf(originalLine));}}catch (Throwable localThrowable2){localThrowable7 = localThrowable2;throw localThrowable2;}finally{if (in != null) {if (localThrowable7 != null) {try{in.close();}catch (Throwable localThrowable3){localThrowable7.addSuppressed(localThrowable3);}} else {in.close();}}}}catch (IOException e){LOG.warn("An error occurs while opening classfile : " + classFile.getPath());}LOG.debug("No smap file found for the class: " + className);File smapFile = new File(classFile.getPath() + ".smap");if (smapFile.exists()) {try{Object smapInputStream = new FileInputStream(smapFile);localThrowable2 = null;try{return getJspLineNumberFromSmap(IOUtils.toString((InputStream)smapInputStream), Integer.valueOf(originalLine));}catch (Throwable localThrowable5){localThrowable2 = localThrowable5;throw localThrowable5;}finally{if (smapInputStream != null) {if (localThrowable2 != null) {try{((InputStream)smapInputStream).close();}catch (Throwable localThrowable6){localThrowable2.addSuppressed(localThrowable6);}} else {((InputStream)smapInputStream).close();}}}LOG.debug("No smap mapping found.");}catch (IOException e){LOG.debug("Unable to open smap file : " + smapFile.getAbsolutePath());}}return null;}private SmapParser.SmapLocation getJspLineNumberFromSmap(String smap, Integer originalLine)throws IOException{SmapParser parser = new SmapParser(smap);return parser.getSmapLocation(originalLine);} } public class SmapParser {private String javaFilename;private final Map<Integer, FileInfo> fileinfo = new HashMap();private final Map<Integer, int[]> java2jsp = new HashMap();private static final Pattern LINE_INFO_PATTERN = Pattern.compile("([0-9]+)(?:#([0-9]+))?(?:,([0-9]+))?:([0-9]+)(?:,([0-9]+))?");private static String getLine(BufferedReader reader)throws IOException{String s = reader.readLine();if (s == null) {throw new IOException("EOF parsing SMAP");}return s;}public SmapParser(String smap)throws IOException{BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(smap.getBytes())));String header = getLine(reader);this.javaFilename = getLine(reader);String jsp = getLine(reader);String stratum = getLine(reader);String f = getLine(reader);if ((!header.equals("SMAP")) || (!stratum.startsWith("*S ")) || (!f.equals("*F"))) {throw new IllegalArgumentException("Unexpected SMAP file format");}String line;while (((line = getLine(reader)) != null) && (!line.equals("*L"))){String path = null;if (line.startsWith("+ ")){path = getLine(reader);line = line.substring(2);}int pos = line.indexOf(" ");int fileNum = Integer.parseInt(line.substring(0, pos));String name = line.substring(pos + 1);this.fileinfo.put(Integer.valueOf(fileNum), new FileInfo(name, path == null ? name : path));}int lastLFI = 0;while (((line = getLine(reader)) != null) && (!line.equals("*E"))) {if (!line.startsWith("*")){Matcher m = LINE_INFO_PATTERN.matcher(line);if (!m.matches()) {throw new IllegalArgumentException(line);}int inputStartLine = Integer.parseInt(m.group(1));int lineFileID = m.group(2) == null ? lastLFI : Integer.parseInt(m.group(2));int repeatCount = m.group(3) == null ? 1 : Integer.parseInt(m.group(3));int outputStartLine = Integer.parseInt(m.group(4));int outputLineIncrement = m.group(5) == null ? 1 : Integer.parseInt(m.group(5));for (int i = 0; i < repeatCount; i++){int[] inputMapping = { lineFileID, inputStartLine + i };int baseOL = outputStartLine + i * outputLineIncrement;for (int ol = baseOL; ol < baseOL + outputLineIncrement; ol++) {if (!this.java2jsp.containsKey(Integer.valueOf(ol))) {this.java2jsp.put(Integer.valueOf(ol), inputMapping);}}}lastLFI = lineFileID;}}}public String getJavaFilename(){return this.javaFilename;}public String getScriptFilename(int fileIndex){FileInfo f = (FileInfo)this.fileinfo.get(Integer.valueOf(fileIndex));return f.name;}public int[] getScriptLineNumber(Integer lineNo){return (int[])this.java2jsp.get(lineNo);}public SmapLocation getSmapLocation(Integer lineNo){int[] origSource = (int[])this.java2jsp.get(lineNo);FileInfo info = (FileInfo)this.fileinfo.get(Integer.valueOf(origSource[0]));return new SmapLocation(info, origSource[1], origSource[0] == 0);}public static class FileInfo{public final String name;public final String path;public FileInfo(String name, String path){this.name = name;this.path = path;}}public static class SmapLocation{public final SmapParser.FileInfo fileInfo;public final int line;public final boolean isPrimaryFile;public SmapLocation(SmapParser.FileInfo fileInfo, int line, boolean isPrimaryFile){this.fileInfo = fileInfo;this.line = line;this.isPrimaryFile = isPrimaryFile;}} } public static String decodeJspClassName(String className){className = className.replaceAll("\\.", "/");for (char ch = '\000'; ch < ''; ch = (char)(ch + '\001')) {if (((isPrintableChar(ch)) && (!Character.isJavaIdentifierPart(ch))) || (ch == '_')) {className = className.replace(mangleChar(ch), "" + ch);}}return className.replaceAll("_jsp", ".jsp");}public static final String mangleChar(char ch){char[] result = new char[5];result[0] = '_';result[1] = Character.forDigit(ch >> '\f' & 0xF, 16);result[2] = Character.forDigit(ch >> '\b' & 0xF, 16);result[3] = Character.forDigit(ch >> '\004' & 0xF, 16);result[4] = Character.forDigit(ch & 0xF, 16);return new String(result);}public static boolean isPrintableChar(char c){Character.UnicodeBlock block = Character.UnicodeBlock.of(c);return (!Character.isISOControl(c)) && (c != 65535) && (block != null) && (block != Character.UnicodeBlock.SPECIALS);} }

xml 包中定義一些規(guī)則相關的bean

FindbugsPlugin 定義類:

public class FindbugsPluginimplements Plugin {public void define(Plugin.Context context){context.addExtensions(FindbugsConfiguration.getPropertyDefinitions());context.addExtensions(Arrays.asList(new Class[] { Jsp.class, JspCodeColorizerFormat.class, FindbugsSensor.class, FindbugsConfiguration.class, FindbugsExecutor.class, FindbugsProfileExporter.class, FindbugsProfileImporter.class, FindbugsProfile.class, FindbugsContribProfile.class, FindbugsSecurityAuditProfile.class, FindbugsSecurityMinimalProfile.class, FindbugsSecurityJspProfile.class, FindbugsRulesDefinition.class, FbContribRulesDefinition.class, FindSecurityBugsRulesDefinition.class, FindSecurityBugsJspRulesDefinition.class, ByteCodeResourceLocator.class }));} }

加載各種定義的 profile類,然后就是FindbugsProfileExporter和FindbugsProfileImporter,規(guī)則文件的到處生產(chǎn)和規(guī)則文件的導入類:

FindbugsProfileExporter類:

public class FindbugsProfileExporterextends ProfileExporter {public FindbugsProfileExporter(){super("findbugs", "FindBugs");setSupportedLanguages(new String[] { "java", "jsp" });setMimeType("application/xml");}public void exportProfile(RulesProfile profile, Writer writer){try{FindBugsFilter filter = buildFindbugsFilter(Iterables.concat(profile.getActiveRulesByRepository("findbugs"), profile.getActiveRulesByRepository("fb-contrib"), profile.getActiveRulesByRepository("findsecbugs"), profile.getActiveRulesByRepository("findsecbugs-jsp")));XStream xstream = FindBugsFilter.createXStream();writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated by SonarQube -->\n".concat(xstream.toXML(filter)));}catch (IOException e){throw new SonarException("Fail to export the Findbugs profile : " + profile, e);}}public static FindBugsFilter buildFindbugsFilter(Iterable<ActiveRule> activeRules){FindBugsFilter root = new FindBugsFilter();for (ActiveRule activeRule : activeRules) {if (("findbugs".equals(activeRule.getRepositoryKey())) || ("fb-contrib".equals(activeRule.getRepositoryKey())) || ("findsecbugs".equals(activeRule.getRepositoryKey())) || ("findsecbugs-jsp".equals(activeRule.getRepositoryKey()))){Match child = new Match();child.setBug(new Bug(activeRule.getConfigKey()));root.addMatch(child);}}return root;} }

FindbugsProfileImporter規(guī)則導入類:

public class FindbugsProfileImporterextends ProfileImporter {private final RuleFinder ruleFinder;private static final Logger LOG = LoggerFactory.getLogger(FindbugsProfileImporter.class);public FindbugsProfileImporter(RuleFinder ruleFinder){super("findbugs", "FindBugs");setSupportedLanguages(new String[] { "java", "jsp" });this.ruleFinder = ruleFinder;}public RulesProfile importProfile(Reader findbugsConf, ValidationMessages messages){RulesProfile profile = RulesProfile.create();try{XStream xStream = FindBugsFilter.createXStream();FindBugsFilter filter = (FindBugsFilter)xStream.fromXML(findbugsConf);activateRulesByCategory(profile, filter, messages);activateRulesByCode(profile, filter, messages);activateRulesByPattern(profile, filter, messages);return profile;}catch (Exception e){String errorMessage = "The Findbugs configuration file is not valid";messages.addErrorText(errorMessage + " : " + e.getMessage());LOG.error(errorMessage, e);}return profile;}private void activateRulesByPattern(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages){for (Map.Entry<String, String> patternLevel : filter.getPatternLevels(new FindbugsLevelUtils()).entrySet()){Rule rule = this.ruleFinder.findByKey("findbugs", (String)patternLevel.getKey());if (rule == null){rule = this.ruleFinder.findByKey("fb-contrib", (String)patternLevel.getKey());if (rule == null){rule = this.ruleFinder.findByKey("findsecbugs", (String)patternLevel.getKey());if (rule == null) {rule = this.ruleFinder.findByKey("findsecbugs-jsp", (String)patternLevel.getKey());}}}if (rule != null) {profile.activateRule(rule, getPriorityFromSeverity((String)patternLevel.getValue()));} else {messages.addWarningText("Unable to activate unknown rule : '" + (String)patternLevel.getKey() + "'");}}}private void activateRulesByCode(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages){for (Map.Entry<String, String> codeLevel : filter.getCodeLevels(new FindbugsLevelUtils()).entrySet()){boolean someRulesHaveBeenActivated = false;for (Rule rule : rules()) {if ((rule.getKey().equals(codeLevel.getKey())) || (StringUtils.startsWith(rule.getKey(), (String)codeLevel.getKey() + "_"))){someRulesHaveBeenActivated = true;profile.activateRule(rule, getPriorityFromSeverity((String)codeLevel.getValue()));}}if (!someRulesHaveBeenActivated) {messages.addWarningText("Unable to find any rules associated to code : '" + (String)codeLevel.getKey() + "'");}}}private void activateRulesByCategory(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages){for (Map.Entry<String, String> categoryLevel : filter.getCategoryLevels(new FindbugsLevelUtils()).entrySet()){boolean someRulesHaveBeenActivated = false;String sonarCateg = FindbugsCategory.findbugsToSonar((String)categoryLevel.getKey());for (Rule rule : rules()) {if ((sonarCateg != null) && (rule.getName().startsWith(sonarCateg))){someRulesHaveBeenActivated = true;profile.activateRule(rule, getPriorityFromSeverity((String)categoryLevel.getValue()));}}if (!someRulesHaveBeenActivated) {messages.addWarningText("Unable to find any rules associated to category : '" + (String)categoryLevel.getKey() + "'");}}}private static RulePriority getPriorityFromSeverity(String severity){if ("INFO".equals(severity)) {return RulePriority.INFO;}if ("MAJOR".equals(severity)) {return RulePriority.MAJOR;}if ("BLOCKER".equals(severity)) {return RulePriority.BLOCKER;}return null;}private Iterable<Rule> rules(){return Iterables.concat(this.ruleFinder.findAll(RuleQuery.create().withRepositoryKey("findbugs")), this.ruleFinder.findAll(RuleQuery.create().withRepositoryKey("fb-contrib")), this.ruleFinder.findAll(RuleQuery.create().withRepositoryKey("findsecbugs")), this.ruleFinder.findAll(RuleQuery.create().withRepositoryKey("findsecbugs-jsp")));} }

然后加載findbugsSensor類:findbugsSensor定義了,各個profile的引入和掃描jsp文件以及對應的java 的class文件。

package org.sonar.plugins.findbugs;import java.io.File; import java.util.Collection; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.rule.ActiveRule; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.Sensor; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.batch.sensor.issue.NewIssue; import org.sonar.api.batch.sensor.issue.NewIssueLocation; import org.sonar.api.profiles.RulesProfile; import org.sonar.plugins.findbugs.resource.ByteCodeResourceLocator; import org.sonar.plugins.findbugs.resource.ClassMetadataLoadingException; import org.sonar.plugins.findbugs.resource.SmapParser.FileInfo; import org.sonar.plugins.findbugs.resource.SmapParser.SmapLocation; import org.sonar.plugins.java.api.JavaResourceLocator;public class FindbugsSensorimplements Sensor {private static final Logger LOG = LoggerFactory.getLogger(FindbugsSensor.class);private RulesProfile profile;private ActiveRules ruleFinder;private FindbugsExecutor executor;private final JavaResourceLocator javaResourceLocator;private final ByteCodeResourceLocator byteCodeResourceLocator;private final FileSystem fs;private final SensorContext sensorContext;public FindbugsSensor(RulesProfile profile, ActiveRules ruleFinder, SensorContext sensorContext, FindbugsExecutor executor, JavaResourceLocator javaResourceLocator, FileSystem fs, ByteCodeResourceLocator byteCodeResourceLocator){this.profile = profile;this.ruleFinder = ruleFinder;this.sensorContext = sensorContext;this.executor = executor;this.javaResourceLocator = javaResourceLocator;this.byteCodeResourceLocator = byteCodeResourceLocator;this.fs = fs;}private boolean hasActiveFindbugsRules(){return !this.profile.getActiveRulesByRepository("findbugs").isEmpty();}private boolean hasActiveFbContribRules(){return !this.profile.getActiveRulesByRepository("fb-contrib").isEmpty();}private boolean hasActiveFindSecBugsRules(){return !this.profile.getActiveRulesByRepository("findsecbugs").isEmpty();}private boolean hasActiveFindSecBugsJspRules(){return !this.profile.getActiveRulesByRepository("findsecbugs-jsp").isEmpty();}public void execute(SensorContext context){if ((!hasActiveFindbugsRules()) && (!hasActiveFbContribRules()) && (!hasActiveFindSecBugsRules()) && (!hasActiveFindSecBugsJspRules())) {return;}Collection<ReportedBug> collection = this.executor.execute(hasActiveFbContribRules(), (hasActiveFindSecBugsRules()) || (hasActiveFindSecBugsJspRules()));for (ReportedBug bugInstance : collection) {try{String[] repos = { "findbugs", "fb-contrib", "findsecbugs", "findsecbugs-jsp" };ActiveRule rule = null;for (String repoKey : repos){rule = this.ruleFinder.findByInternalKey(repoKey, bugInstance.getType());if (rule != null) {break;}}if (rule == null){LOG.warn("Findbugs rule '{}' is not active in Sonar.", bugInstance.getType());}else{String className = bugInstance.getClassName();String longMessage = bugInstance.getMessage();int line = bugInstance.getStartLine();InputFile resource = null;resource = this.byteCodeResourceLocator.findJavaClassFile(className, this.fs);if (resource != null){insertIssue(rule, resource, line, longMessage);}else{File classFile = findOriginalClassForBug(bugInstance.getClassName());resource = this.byteCodeResourceLocator.findJavaOuterClassFile(className, classFile, this.fs);if (resource != null) {insertIssue(rule, resource, line, longMessage);} else if (classFile != null) {try{SmapParser.SmapLocation location = this.byteCodeResourceLocator.extractSmapLocation(className, line, classFile);if (location != null){if (!location.isPrimaryFile) {continue;}resource = this.byteCodeResourceLocator.buildInputFile(location.fileInfo.path, this.fs);if (resource != null) {insertIssue(rule, resource, location.line, longMessage);}}else{resource = this.byteCodeResourceLocator.findTemplateFile(className, this.fs);if (resource != null){insertIssue(rule, resource, line, longMessage);continue;}}}catch (ClassMetadataLoadingException e){LOG.warn("Failed to load the class file metadata", e);}} else {LOG.warn("The class '" + className + "' could not be matched to its original source file. It might be a dynamically generated class.");}}}}catch (Exception e){String bugInstanceDebug = String.format("[BugInstance type=%s, class=%s, line=%s]", new Object[] { bugInstance.getType(), bugInstance.getClassName(), Integer.valueOf(bugInstance.getStartLine()) });LOG.warn("An error occurs while processing the bug instance " + bugInstanceDebug, e);}}}protected void insertIssue(ActiveRule rule, InputFile resource, int line, String message){NewIssue newIssue = this.sensorContext.newIssue().forRule(rule.ruleKey());NewIssueLocation location = newIssue.newLocation().on(resource).at(resource.selectLine(line > 0 ? line : 1)).message(message);newIssue.at(location);newIssue.save();}private File findOriginalClassForBug(String className){String classFile = className.replaceAll("\\.", "/").concat(".class");for (File classPath : this.javaResourceLocator.classpath()) {if (classPath.isDirectory()){File testClassFile = new File(classPath, classFile);if (testClassFile.exists()) {return testClassFile;}}}return null;}public void describe(SensorDescriptor descriptor){descriptor.onlyOnLanguages(new String[] { "java", "jsp" });descriptor.name("FindBugs Sensor");} }

FindbugsConfiguration類,這個類中定義了findbugs plugin相關工作空間,排除java文件,掃描生成文件等等。

public class FindbugsConfiguration {private static final Logger LOG = LoggerFactory.getLogger(FindbugsExecutor.class);private final FileSystem fileSystem;private final Settings settings;private final RulesProfile profile;private final FindbugsProfileExporter exporter;private final JavaResourceLocator javaResourceLocator;private File jsr305Lib;private File annotationsLib;private File fbContrib;private File findSecBugs;public FindbugsConfiguration(FileSystem fileSystem, Settings settings, RulesProfile profile, FindbugsProfileExporter exporter, JavaResourceLocator javaResourceLocator){this.fileSystem = fileSystem;this.settings = settings;this.profile = profile;this.exporter = exporter;this.javaResourceLocator = javaResourceLocator;}public File getTargetXMLReport(){return new File(this.fileSystem.workDir(), "findbugs-result.xml");}public Project getFindbugsProject()throws IOException{Project findbugsProject = new Project();for (Iterator localIterator1 = getSourceFiles().iterator(); localIterator1.hasNext();){file = (File)localIterator1.next();if (FilenameUtils.getExtension(file.getName()).equals("java")) {findbugsProject.addFile(file.getCanonicalPath());}}File file;Object classFilesToAnalyze = new ArrayList(this.javaResourceLocator.classFilesToAnalyze());for (File file : this.javaResourceLocator.classpath()){if (file.isDirectory()) {((List)classFilesToAnalyze).addAll(scanForAdditionalClasses(file));}findbugsProject.addAuxClasspathEntry(file.getCanonicalPath());}boolean hasJspFiles = this.fileSystem.hasFiles(this.fileSystem.predicates().hasLanguage("jsp"));boolean hasPrecompiledJsp = false;for (File classToAnalyze : (List)classFilesToAnalyze){String absolutePath = classToAnalyze.getCanonicalPath();if ((hasJspFiles) && (!hasPrecompiledJsp) && ((absolutePath.endsWith("_jsp.class")) || (absolutePath.contains("/jsp_servlet/")))) {hasPrecompiledJsp = true;}findbugsProject.addFile(absolutePath);}if (((List)classFilesToAnalyze).isEmpty()){LOG.warn("Findbugs needs sources to be compiled. Please build project before executing sonar or check the location of compiled classes to make it possible for Findbugs to analyse your project.");if (hasSourceFiles()) {throw new IllegalStateException("This project contains Java source files that are not compiled.");}}if ((hasJspFiles) && (!hasPrecompiledJsp)) {LOG.warn("JSP files were found in the current project but FindBugs requires their precompiled form. For more information on how to configure JSP precompilation : https://github.com/find-sec-bugs/find-sec-bugs/wiki/JSP-precompilation");}copyLibs();if (this.annotationsLib != null){findbugsProject.addAuxClasspathEntry(this.annotationsLib.getCanonicalPath());findbugsProject.addAuxClasspathEntry(this.jsr305Lib.getCanonicalPath());}findbugsProject.setCurrentWorkingDirectory(this.fileSystem.workDir());return findbugsProject;}private Iterable<File> getSourceFiles(){FilePredicates pred = this.fileSystem.predicates();return this.fileSystem.files(pred.and(new FilePredicate[] {pred.hasType(InputFile.Type.MAIN), pred.hasLanguage("java"), pred.not(pred.matchesPathPattern("**/package-info.java")) }));}private boolean hasSourceFiles(){FilePredicates pred = this.fileSystem.predicates();return this.fileSystem.hasFiles(pred.and(new FilePredicate[] {pred.hasType(InputFile.Type.MAIN), pred.hasLanguage("java"), pred.not(pred.matchesPathPattern("**/package-info.java")) }));}@VisibleForTestingFile saveIncludeConfigXml()throws IOException{StringWriter conf = new StringWriter();this.exporter.exportProfile(this.profile, conf);File file = new File(this.fileSystem.workDir(), "findbugs-include.xml");FileUtils.write(file, conf.toString(), "UTF-8");return file;}public static List<File> scanForAdditionalClasses(File folder)throws IOException{List<File> allFiles = new ArrayList();Queue<File> dirs = new LinkedList();dirs.add(folder);while (!dirs.isEmpty()){File dirPoll = (File)dirs.poll();if (dirPoll == null) {break;}for (File f : dirPoll.listFiles()) {if (f.isDirectory()) {dirs.add(f);} else if ((f.isFile()) && (f.getName().endsWith(".class"))) {allFiles.add(f);}}}return allFiles;}@VisibleForTestingList<File> getExcludesFilters(){List<File> result = Lists.newArrayList();PathResolver pathResolver = new PathResolver();String[] filters = this.settings.getStringArray("sonar.findbugs.excludesFilters");for (String excludesFilterPath : filters){excludesFilterPath = StringUtils.trim(excludesFilterPath);if (StringUtils.isNotBlank(excludesFilterPath)) {result.add(pathResolver.relativeFile(this.fileSystem.baseDir(), excludesFilterPath));}}return result;}public String getEffort(){return StringUtils.lowerCase(this.settings.getString("sonar.findbugs.effort"));}public String getConfidenceLevel(){return StringUtils.lowerCase(this.settings.getString("sonar.findbugs.confidenceLevel"));}public long getTimeout(){return this.settings.getLong("sonar.findbugs.timeout");}public void copyLibs(){if (this.jsr305Lib == null) {this.jsr305Lib = copyLib("/jsr305.jar");}if (this.annotationsLib == null) {this.annotationsLib = copyLib("/annotations.jar");}if (this.fbContrib == null) {this.fbContrib = copyLib("/fb-contrib.jar");}if (this.findSecBugs == null) {this.findSecBugs = copyLib("/findsecbugs-plugin.jar");}}public void stop(){if (this.jsr305Lib != null) {this.jsr305Lib.delete();}if (this.annotationsLib != null) {this.annotationsLib.delete();}if (this.fbContrib != null) {this.fbContrib.delete();}if (this.findSecBugs != null) {this.findSecBugs.delete();}}private File copyLib(String name){InputStream input = null;try{input = getClass().getResourceAsStream(name);File dir = new File(this.fileSystem.workDir(), "findbugs");FileUtils.forceMkdir(dir);File target = new File(dir, name);FileUtils.copyInputStreamToFile(input, target);return target;}catch (IOException e){throw new IllegalStateException("Fail to extract Findbugs dependency", e);}finally{IOUtils.closeQuietly(input);}}public File getFbContribJar(){return this.fbContrib;}public File getFindSecBugsJar(){return this.findSecBugs;}public static List<PropertyDefinition> getPropertyDefinitions(){String subCategory = "FindBugs";return ImmutableList.of(PropertyDefinition.builder("sonar.findbugs.effort").defaultValue("Default").category("java").subCategory(subCategory).name("Effort").description("Effort of the bug finders. Valid values are Min, Default and Max. Setting 'Max' increases precision but also increases memory consumption.").onQualifiers("TRK", new String[] { "BRC" }).build(), PropertyDefinition.builder("sonar.findbugs.timeout").defaultValue(Long.toString(600000L)).category("java").subCategory(subCategory).name("Timeout").description("Specifies the amount of time, in milliseconds, that FindBugs may run before it is assumed to be hung and is terminated. The default is 600,000 milliseconds, which is ten minutes.").onQualifiers("TRK", new String[] { "BRC" }).type(PropertyType.INTEGER).build(), PropertyDefinition.builder("sonar.findbugs.excludesFilters").category("java").subCategory(subCategory).name("Excludes Filters").description("Paths to findbugs filter-files with exclusions.").onQualifiers("TRK", new String[] { "BRC" }).multiValues(true).build(), PropertyDefinition.builder("sonar.findbugs.confidenceLevel").defaultValue("medium").category("java").subCategory(subCategory).name("Confidence Level").description("Specifies the confidence threshold (previously called \"priority\") for reporting issues. If set to \"low\", confidence is not used to filter bugs. If set to \"medium\" (the default), low confidence issues are supressed. If set to \"high\", only high confidence bugs are reported. ").onQualifiers("TRK", new String[] { "BRC" }).build());} }

FindbugsExecutor 類這個類定義了該plugin 有執(zhí)行掃描功能,去創(chuàng)建線程執(zhí)行,在執(zhí)行之前去加載其他插件。其他plugin可能只提供規(guī)則,但是這個plugin可以具備掃描執(zhí)行能力。

@BatchSide public class FindbugsExecutor {private static final String FINDBUGS_CORE_PLUGIN_ID = "edu.umd.cs.findbugs.plugins.core";private static final Logger LOG = LoggerFactory.getLogger(FindbugsExecutor.class);private static Map<String, Integer> priorityNameToValueMap = new HashMap();static{priorityNameToValueMap.put("high", Integer.valueOf(1));priorityNameToValueMap.put("medium", Integer.valueOf(2));priorityNameToValueMap.put("low", Integer.valueOf(3));priorityNameToValueMap.put("experimental", Integer.valueOf(4));}private static final Integer DEFAULT_PRIORITY = Integer.valueOf(2);private final FindbugsConfiguration configuration;public FindbugsExecutor(FindbugsConfiguration configuration){this.configuration = configuration;}@VisibleForTestingCollection<ReportedBug> execute(){return execute(true);}public Collection<ReportedBug> execute(boolean useAllPlugin){return execute(useAllPlugin, useAllPlugin);}public Collection<ReportedBug> execute(boolean useFbContrib, boolean useFindSecBugs){SecurityManager currentSecurityManager = System.getSecurityManager();ClassLoader initialClassLoader = Thread.currentThread().getContextClassLoader();Thread.currentThread().setContextClassLoader(FindBugs2.class.getClassLoader());Locale initialLocale = Locale.getDefault();Locale.setDefault(Locale.ENGLISH);OutputStream xmlOutput = null;Collection<Plugin> customPlugins = null;ExecutorService executorService = Executors.newSingleThreadExecutor();try{FindBugs2 engine = new FindBugs2();Project project = this.configuration.getFindbugsProject();if (project.getFileCount() == 0){LOG.info("Findbugs analysis skipped for this project.");return new ArrayList();}customPlugins = loadFindbugsPlugins(useFbContrib, useFindSecBugs);disableUpdateChecksOnEveryPlugin();engine.setProject(project);XMLBugReporter xmlBugReporter = new XMLBugReporter(project);xmlBugReporter.setPriorityThreshold(determinePriorityThreshold().intValue());xmlBugReporter.setAddMessages(true);File xmlReport = this.configuration.getTargetXMLReport();LOG.info("Findbugs output report: " + xmlReport.getAbsolutePath());xmlOutput = FileUtils.openOutputStream(xmlReport);xmlBugReporter.setOutputStream(new PrintStream(xmlOutput));engine.setBugReporter(xmlBugReporter);UserPreferences userPreferences = UserPreferences.createDefaultUserPreferences();userPreferences.setEffort(this.configuration.getEffort());engine.setUserPreferences(userPreferences);engine.addFilter(this.configuration.saveIncludeConfigXml().getAbsolutePath(), true);for (Object localObject1 = this.configuration.getExcludesFilters().iterator(); ((Iterator)localObject1).hasNext();){File filterFile = (File)((Iterator)localObject1).next();if (filterFile.isFile()){LOG.info("Use filter-file: {}", filterFile);engine.addFilter(filterFile.getAbsolutePath(), false);}else{LOG.warn("FindBugs filter-file not found: {}", filterFile);}}engine.setDetectorFactoryCollection(DetectorFactoryCollection.instance());engine.setAnalysisFeatureSettings(FindBugs.DEFAULT_EFFORT);engine.finishSettings();executorService.submit(new FindbugsTask(engine)).get(this.configuration.getTimeout(), TimeUnit.MILLISECONDS);return toReportedBugs(xmlBugReporter.getBugCollection());}catch (TimeoutException e){throw new IllegalStateException("Can not execute Findbugs with a timeout threshold value of " + this.configuration.getTimeout() + " milliseconds", e);}catch (Exception e){throw new IllegalStateException("Can not execute Findbugs", e);}finally{System.setSecurityManager(currentSecurityManager);resetCustomPluginList(customPlugins);executorService.shutdown();IOUtils.closeQuietly(xmlOutput);Thread.currentThread().setContextClassLoader(initialClassLoader);Locale.setDefault(initialLocale);}}private static Collection<ReportedBug> toReportedBugs(BugCollection bugCollection){Collection<ReportedBug> bugs = new ArrayList();for (BugInstance bugInstance : bugCollection) {if (bugInstance.getPrimarySourceLineAnnotation() == null) {LOG.warn("No source line for " + bugInstance.getType());} else {bugs.add(new ReportedBug(bugInstance));}}return bugs;}private Integer determinePriorityThreshold(){Integer integer = (Integer)priorityNameToValueMap.get(this.configuration.getConfidenceLevel());if (integer == null) {integer = DEFAULT_PRIORITY;}return integer;}private static class FindbugsTaskimplements Callable<Object>{private final FindBugs2 engine;public FindbugsTask(FindBugs2 engine){this.engine = engine;}public Object call(){try{this.engine.execute();return null;}catch (InterruptedException|IOException e){throw Throwables.propagate(e);}finally{this.engine.dispose();}}}private Collection<Plugin> loadFindbugsPlugins(boolean useFbContrib, boolean useFindSecBugs){ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();List<String> pluginJarPathList = Lists.newArrayList();URL url;try{Enumeration<URL> urls = contextClassLoader.getResources("findbugs.xml");while (urls.hasMoreElements()){url = (URL)urls.nextElement();pluginJarPathList.add(normalizeUrl(url));}if ((useFbContrib) && (this.configuration.getFbContribJar() != null)) {pluginJarPathList.add(this.configuration.getFbContribJar().getAbsolutePath());}if ((useFindSecBugs) && (this.configuration.getFindSecBugsJar() != null)) {pluginJarPathList.add(this.configuration.getFindSecBugsJar().getAbsolutePath());}}catch (IOException e){throw new IllegalStateException(e);}catch (URISyntaxException e){throw new IllegalStateException(e);}List<Plugin> customPluginList = Lists.newArrayList();for (String path : pluginJarPathList) {try{Plugin plugin = Plugin.addCustomPlugin(new File(path).toURI(), contextClassLoader);if (plugin != null){customPluginList.add(plugin);LOG.info("Loading findbugs plugin: " + path);}}catch (PluginException e){LOG.warn("Failed to load plugin for custom detector: " + path);LOG.debug("Cause of failure", e);}catch (DuplicatePluginIdException e){if (!"edu.umd.cs.findbugs.plugins.core".equals(e.getPluginId())) {LOG.debug("Plugin already loaded: exception ignored: " + e.getMessage(), e);}}}return customPluginList;}private static String normalizeUrl(URL url)throws URISyntaxException{return StringUtils.removeStart(StringUtils.substringBefore(url.toURI().getSchemeSpecificPart(), "!"), "file:");}private static void disableUpdateChecksOnEveryPlugin(){for (Plugin plugin : ) {plugin.setMyGlobalOption("noUpdateChecks", "true");}}private static void resetCustomPluginList(Collection<Plugin> customPlugins){if (customPlugins != null) {for (Plugin plugin : customPlugins) {Plugin.removeCustomPlugin(plugin);}}} }

findbugs-result.xml 掃描相關的類:

class FindbugsXmlReportParser {private final File findbugsXmlReport;private final String findbugsXmlReportPath;public FindbugsXmlReportParser(File findbugsXmlReport){this.findbugsXmlReport = findbugsXmlReport;this.findbugsXmlReportPath = findbugsXmlReport.getAbsolutePath();if (!findbugsXmlReport.exists()) {throw new IllegalStateException("The findbugs XML report can't be found at '" + this.findbugsXmlReportPath + "'");}}public List<XmlBugInstance> getBugInstances(){List<XmlBugInstance> result = Lists.newArrayList();try{SMInputFactory inf = new SMInputFactory(XMLInputFactory.newInstance());SMInputCursor cursor = inf.rootElementCursor(this.findbugsXmlReport).advance();SMInputCursor bugInstanceCursor = cursor.childElementCursor("BugInstance").advance();while (bugInstanceCursor.asEvent() != null){XmlBugInstance xmlBugInstance = new XmlBugInstance();xmlBugInstance.type = bugInstanceCursor.getAttrValue("type");xmlBugInstance.longMessage = "";result.add(xmlBugInstance);ImmutableList.Builder<XmlSourceLineAnnotation> lines = ImmutableList.builder();SMInputCursor bugInstanceChildCursor = bugInstanceCursor.childElementCursor().advance();while (bugInstanceChildCursor.asEvent() != null){String nodeName = bugInstanceChildCursor.getLocalName();if ("LongMessage".equals(nodeName)){xmlBugInstance.longMessage = bugInstanceChildCursor.collectDescendantText();}else if ("SourceLine".equals(nodeName)){XmlSourceLineAnnotation xmlSourceLineAnnotation = new XmlSourceLineAnnotation();xmlSourceLineAnnotation.parseStart(bugInstanceChildCursor.getAttrValue("start"));xmlSourceLineAnnotation.parseEnd(bugInstanceChildCursor.getAttrValue("end"));xmlSourceLineAnnotation.parsePrimary(bugInstanceChildCursor.getAttrValue("primary"));xmlSourceLineAnnotation.className = bugInstanceChildCursor.getAttrValue("classname");lines.add(xmlSourceLineAnnotation);}bugInstanceChildCursor.advance();}xmlBugInstance.sourceLines = lines.build();bugInstanceCursor.advance();}cursor.getStreamReader().closeCompletely();}catch (XMLStreamException e){throw new IllegalStateException("Unable to parse the Findbugs XML Report '" + this.findbugsXmlReportPath + "'", e);}return result;}public static class XmlBugInstance{private String type;private String longMessage;private List<FindbugsXmlReportParser.XmlSourceLineAnnotation> sourceLines;public String getType(){return this.type;}public String getLongMessage(){return this.longMessage;}@CheckForNullpublic FindbugsXmlReportParser.XmlSourceLineAnnotation getPrimarySourceLine(){for (FindbugsXmlReportParser.XmlSourceLineAnnotation sourceLine : this.sourceLines) {if (sourceLine.isPrimary()) {return sourceLine;}}return this.sourceLines.isEmpty() ? null : (FindbugsXmlReportParser.XmlSourceLineAnnotation)this.sourceLines.get(0);}}public static class XmlSourceLineAnnotation{private boolean primary;private Integer start;private Integer end;@VisibleForTestingprotected String className;public void parseStart(String attrValue){try{this.start = Integer.valueOf(Integer.parseInt(attrValue));}catch (NumberFormatException e){this.start = null;}}public void parseEnd(String attrValue){try{this.end = Integer.valueOf(Integer.parseInt(attrValue));}catch (NumberFormatException e){this.end = null;}}public void parsePrimary(String attrValue){this.primary = Boolean.parseBoolean(attrValue);}public boolean isPrimary(){return this.primary;}public Integer getStart(){return this.start;}public Integer getEnd(){return this.end;}public String getClassName(){return this.className;}public String getSonarJavaFileKey(){if (this.className.indexOf('$') > -1) {return this.className.substring(0, this.className.indexOf('$'));}return this.className;}} }




總結

以上是生活随笔為你收集整理的sonar findbugs plugin源码研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

天天色天天操综合 | 国产精品麻豆免费版 | 天天插天天操天天干 | 天天插伊人 | 色国产精品一区在线观看 | 亚洲日韩中文字幕在线播放 | 夜夜躁日日躁狠狠久久88av | 丁香六月婷婷开心 | 91在线播放视频 | 久久欧洲视频 | 国产在线一区二区三区播放 | 超碰97国产在线 | 黄网站大全| 麻豆综合网 | 亚洲一区免费在线 | av久久在线 | 国产精品12| 婷婷成人综合 | 国产小视频在线免费观看 | 午夜av激情 | 午夜aaaa| 久久久久女人精品毛片九一 | 亚洲精欧美一区二区精品 | 久久国产成人午夜av影院潦草 | 免费看特级毛片 | 操操操日日 | 在线观看黄a | 99精品久久只有精品 | 超碰国产在线 | 国产精品九色 | 色综合中文综合网 | 9草在线 | 亚洲精品国产综合99久久夜夜嗨 | 97在线精品视频 | 亚洲经典中文字幕 | 久久久网页 | 久久国产女人 | 久久久午夜精品理论片中文字幕 | 精品在线观看一区二区三区 | 国产 欧美 日产久久 | 91一区二区三区在线观看 | www在线观看国产 | 国产99久久久国产精品免费看 | 国产在线观看一 | 日产av在线播放 | 人人爽久久涩噜噜噜网站 | 激情五月亚洲 | 偷拍精偷拍精品欧洲亚洲网站 | 久久99网站| 天堂在线免费视频 | 日韩精品五月天 | 蜜桃传媒一区二区 | 国产精品一区二区久久精品爱微奶 | 99久e精品热线免费 99国产精品久久久久久久久久 | 国产精品porn | 西西444www大胆无视频 | 九九在线视频免费观看 | 8090yy亚洲精品久久 | 9992tv成人免费看片 | 免费看高清毛片 | 国产九九在线 | 国产精品久久久久久久久久妇女 | 欧美激情第八页 | 国产露脸91国语对白 | 亚洲在线看| 日韩精品中文字幕av | 国产精品s色| 精品一区二区三区四区在线 | 最近日本中文字幕a | 久久视频精品在线观看 | 久久综合精品国产一区二区三区 | 国产精品99页 | 国产91精品一区二区麻豆亚洲 | 欧美激情片在线观看 | 丝袜av一区 | 亚洲综合视频在线 | 国产美腿白丝袜足在线av | 精品国产欧美一区二区三区不卡 | 欧美日韩一区二区久久 | 黄色三级免费看 | 日韩精品免费一线在线观看 | 成人久久精品视频 | 天天操天天干天天干 | 国产手机视频在线观看 | 黄色毛片在线观看 | 久久久久福利视频 | 亚洲黄色片 | 在线观看一| 爱干视频| 欧美一二区视频 | 国产精品 国内视频 | 久久人人爽爽 | 国产精品99久久久久久宅男 | 欧美专区国产专区 | 成 人 黄 色 视频播放1 | 成人av片在线观看 | 丁香av| 国内精品久久久久久中文字幕 | 深夜国产福利 | 777视频在线观看 | 91网址在线观看 | 成年人在线免费看视频 | www99久久| 五月婷婷一区二区三区 | 国产探花视频在线播放 | 在线免费黄色毛片 | 在线亚洲欧美日韩 | 97精品一区二区三区 | 国产男女无遮挡猛进猛出在线观看 | 99久久精品免费看国产免费软件 | 午夜美女影院 | 国产成人精品午夜在线播放 | 成人永久在线 | 黄色一级免费网站 | 一级黄色免费 | 国产精品久久久久永久免费 | 久草免费色站 | 国产日产精品久久久久快鸭 | 一区二区av| 国产成人三级在线播放 | 国产视频日韩 | 亚洲国产精品日韩 | 天天爱天天射天天干天天 | 欧美日韩性视频 | 国产精品九九久久99视频 | 51久久成人国产精品麻豆 | 国产97碰免费视频 | 日本黄色免费看 | 国内久久久久久 | 久久久精品欧美一区二区免费 | 九九色在线观看 | 国产精品一级视频 | 香蕉视频在线免费看 | 日日夜夜婷婷 | 91在线免费播放 | 久久国内精品视频 | 999久久a精品合区久久久 | 人人干免费 | 天天想夜夜操 | 成人黄色电影在线 | 超碰97国产在线 | 成人免费视频网 | 国产精品美女久久久 | 99久久精品国产系列 | 久久99国产一区二区三区 | 狠狠操欧美| 激情校园亚洲 | 日韩三级视频 | 高清不卡一区二区三区 | 成人试看120秒 | a级国产乱理论片在线观看 伊人宗合网 | 外国av网 | 91禁看片| 亚洲成年人免费网站 | a黄色影院 | 五月天婷婷丁香花 | 人人舔人人爽 | 日韩a免费 | 在线视频18在线视频4k | 久久精品国产v日韩v亚洲 | av免费电影在线观看 | 色国产视频 | 国产精品一区二区久久精品 | 免费99精品国产自在在线 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产日产高清dvd碟片 | 91探花在线 | 色婷婷综合成人av | 国产成人精品999在线观看 | 日韩性久久 | 久色网| 男女免费av| 天天射一射 | 亚州国产精品视频 | 日韩精品视频免费看 | 国产无套精品久久久久久 | 在线日韩中文字幕 | 一区二区 不卡 | 国产成人精品综合 | 欧美极品久久 | 精品国产99国产精品 | 中文字幕美女免费在线 | 免费观看av网站 | 天天色宗合| 黄色网在线播放 | 欧美福利视频一区 | 亚洲资源在线 | 久久中国精品 | 91超碰免费在线 | 亚洲精品久久久久中文字幕二区 | 人人爱人人舔 | 特级黄色视频毛片 | 在线a亚洲视频播放在线观看 | 婷婷激情综合 | 福利一区在线视频 | 精品国产一二三 | 欧美精品中文字幕亚洲专区 | 亚洲国产日韩一区 | 日本特黄特色aaa大片免费 | 九九视频免费观看视频精品 | 日韩福利在线观看 | 五月天久久久久久 | 免费性网站 | 欧美男同网站 | 日本精品一区二区三区在线观看 | 97理论电影 | 国产高清 不卡 | 在线性视频日韩欧美 | 人人干狠狠干 | av无限看 | 狠狠狠狠狠干 | 97偷拍视频 | 手机成人在线电影 | 伊人黄| 99在线观看视频 | 日韩成人邪恶影片 | 一级片免费视频 | 日韩av高清 | 久久久精品综合 | 国产人成精品一区二区三 | 天天干天天操天天搞 | 久久免费视频1 | 午夜av电影院 | 久久手机免费观看 | 国产网红在线观看 | 黄色性av | 欧美视频在线二区 | 蜜臀久久99精品久久久酒店新书 | 亚洲国产一区在线观看 | 国产视频亚洲 | 成人午夜网址 | 91麻豆精品国产91久久久无限制版 | 97超碰人人模人人人爽人人爱 | 久久免费视频一区 | 欧美日韩99 | 国产伦精品一区二区三区… | 五月激情婷婷丁香 | 精品国产一区二区三区不卡 | 日韩二区在线播放 | 一级久久精品 | 探花视频在线观看免费版 | 开心激情五月网 | 欧美色操 | 99热这里精品 | 国产高清视频免费在线观看 | 久久免费视频这里只有精品 | 久久性生活片 | 亚洲婷婷丁香 | 天天色天天操综合网 | 99热这里只有精品在线观看 | 精品国产不卡 | 亚洲天天 | 日韩激情视频在线观看 | 久久国产视频网站 | 久久久黄色免费网站 | 在线亚洲成人 | 精品国产91亚洲一区二区三区www | 精品超碰 | 99av国产精品欲麻豆 | 久久99九九99精品 | 久久黄色免费视频 | 中文字幕在线播放一区 | 久久伊人免费视频 | 日韩欧美视频 | 亚洲va欧美va | 天堂av最新网址 | 91麻豆国产福利在线观看 | 婷婷激情综合 | 99精品视频99 | 毛片网免费 | 韩国av一区 | 国内视频在线观看 | 中文字幕在线观看网站 | 欧美aⅴ在线观看 | 国产精品久久久久久久久岛 | 久久久精品视频成人 | 国产精品久久久免费看 | 久久久色| 日女人电影 | 久草免费在线 | 欧美日韩高清一区二区三区 | 91精品国产入口 | 在线中文字幕电影 | 欧美狠狠色 | 在线观看的a站 | 日韩精品专区 | 在线观看黄色 | 免费在线观看av网址 | 丰满少妇在线观看资源站 | 热久久免费视频精品 | 91丨九色丨国产女 | 日日干天天操 | 成人精品国产 | 免费观看国产成人 | 国产99久久精品一区二区永久免费 | 国产丝袜网站 | 日韩免费一级电影 | 精品二区视频 | 亚洲 精品在线视频 | 日韩在线观看网站 | 高清色免费| 久久成人久久 | 国产日韩欧美在线影视 | 色婷婷啪啪免费在线电影观看 | 国产精品麻豆免费版 | 久久精品毛片 | 国产精品成人一区二区三区 | 国产中文在线字幕 | 国产专区欧美专区 | 久久五月婷婷丁香社区 | 九九久久精品视频 | 在线免费观看的av网站 | 亚洲精品午夜视频 | 日韩a级免费视频 | 国产黄色精品网站 | 亚洲影视九九影院在线观看 | 精品国产一二三四区 | 中文字幕高清 | 成人一区二区在线 | 91av视频在线观看免费 | 日三级在线 | 久久一区二区三区国产精品 | 福利网址在线观看 | 在线观看网站你懂的 | 精品自拍sae8—视频 | 国产中文字幕一区二区 | 久久亚洲免费视频 | 天天干天天综合 | 99精品在线免费观看 | 久久久久久免费 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 免费看一级 | 91毛片在线观看 | 亚洲japanese制服美女 | 欧美一级电影片 | 久久www免费人成看片高清 | 亚洲综合狠狠干 | 婷婷在线网 | 在线国产一区二区三区 | 日本中文字幕视频 | 高清av免费看| 91资源在线免费观看 | 在线成人小视频 | 蜜臀久久99精品久久久无需会员 | 日韩在线视频线视频免费网站 | av线上看| 91在线免费观看国产 | 久久久国产一区二区 | 国产视频在线观看免费 | 日韩精品在线免费播放 | 国产很黄很色的视频 | 日韩啪啪小视频 | 中日韩在线视频 | 久久综合九色综合久99 | 曰本三级在线 | 亚洲涩涩网 | 中文字幕一区二区在线播放 | 欧洲色综合| 亚洲精品综合在线观看 | 午夜黄网 | 国产精品xxxx18a99 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品美女久久 | 中文字幕二区三区 | 日本中文在线 | 亚洲综合最新在线 | 久久久久久毛片精品免费不卡 | 久久tv视频 | 男女视频久久久 | 精品uu | 成年人网站免费在线观看 | 免费在线观看av的网站 | 久久五月天综合 | 国产色视频一区 | 182午夜在线观看 | 日韩 精品 一区 国产 麻豆 | 久久久久久久久久国产精品 | 亚洲精品午夜久久久久久久久久久 | 99久久综合国产精品二区 | 国产 视频 高清 免费 | 亚洲成熟女人毛片在线 | 免费在线观看日韩欧美 | 911精品视频 | 丰满少妇在线观看网站 | 人人澡人人干 | 欧美成人理伦片 | 天天干天天摸天天操 | 日本高清中文字幕有码在线 | av中文字幕日韩 | 91亚洲精品久久久 | 国产精品第7页 | 久久久久亚洲精品成人网小说 | 激情综合亚洲精品 | 久久国产精品免费看 | 久久成年人视频 | 91毛片在线 | 国产一区二区在线免费观看 | 91精品视频免费观看 | a一片一级 | 91精品国自产在线 | 美女视频黄在线观看 | 91视频免费| 久久久www成人免费精品 | 蜜桃麻豆www久久囤产精品 | 亚洲高清色综合 | 欧美一区二区日韩一区二区 | 日本婷婷色 | 一级成人在线 | 五月激情综合婷婷 | 久久不卡国产精品一区二区 | 免费在线观看一区二区三区 | 超碰国产在线播放 | 人成在线免费视频 | 黄色免费网站 | 日韩精品高清视频 | 国产精品久久久久久久久久免费 | 91九色在线观看视频 | 96香蕉视频 | 久久久久在线 | 久久久久久久久久久综合 | 人成午夜视频 | 中文av在线播放 | 一区二区观看 | 人人爱天天操 | 国产小视频福利在线 | 国产精品成人一区二区三区 | 黄污污网站 | 欧美久久九九 | 色开心| 久久极品| 亚洲伊人网在线观看 | 日日操天天操狠狠操 | 亚洲va欧美va人人爽春色影视 | 天天射成人 | 爱爱av网| 99综合久久 | 国产欧美日韩精品一区二区免费 | 99精品欧美一区二区三区 | 在线一区观看 | 99综合久久 | 国产亚洲人| 日韩婷婷 | 免费涩涩网站 | 欧美狠狠色 | 亚洲 欧美 变态 国产 另类 | 视频 国产区 | 狠狠操狠狠干天天操 | 国产精品毛片一区二区 | 成人av在线一区二区 | 国产成人精品一区二区三区福利 | 91九色在线视频观看 | 国产精品成人一区二区三区吃奶 | 欧美日韩在线视频一区二区 | 免费久久99精品国产 | 国产明星视频三级a三级点| 91精品国产99久久久久 | 97视频免费观看2区 亚洲视屏 | 久久综合九色九九 | 精品美女在线视频 | 久久狠狠干 | 亚洲精品视频在线观看视频 | 欧美日韩视频在线观看一区二区 | 国产美女网站在线观看 | 国产不卡一区二区视频 | aaa毛片视频 | 欧美日韩精品电影 | 亚洲国产手机在线 | 久久久www成人免费精品 | 91精品视频在线观看免费 | 日韩网站一区二区 | 中文字幕制服丝袜av久久 | 久草男人天堂 | 久久99久久99免费视频 | 久草在线这里只有精品 | 成人av日韩 | 亚洲男男gaygay无套同网址 | 日本不卡一区二区三区在线观看 | 最近高清中文在线字幕在线观看 | 精选久久 | 日本中文在线播放 | 亚洲欧洲av在线 | 一级片免费观看视频 | 国产精品麻豆三级一区视频 | 免费看v片网站 | .国产精品成人自产拍在线观看6 | 日本系列中文字幕 | 男女全黄一级一级高潮免费看 | 久久久亚洲国产精品麻豆综合天堂 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 天天综合网天天 | 免费观看福利视频 | av成人免费网站 | 欧美日韩高清不卡 | 免费大片黄在线 | 色美女在线| 丁香高清视频在线看看 | 久久香蕉国产精品麻豆粉嫩av | 天天做综合网 | 国产视频不卡一区 | 超碰在线成人 | 国产亚洲精品久久久久久久久久 | 国内精品久久影院 | 久久精品视频日本 | 欧美日韩精品在线观看视频 | 一级黄色片在线免费观看 | 永久免费在线 | 丝袜足交在线 | 免费在线观看av网址 | 亚洲涩涩色 | 一级精品视频在线观看宜春院 | 日日久视频 | 丁香影院在线 | 成人免费观看完整版电影 | 奇米网在线观看 | 亚洲一级黄色大片 | 免费在线黄色av | 国产精品婷婷 | 国产精品综合久久久久久 | 亚洲精品国产精品国自 | 成人精品国产免费网站 | 国产91全国探花系列在线播放 | 天天插天天射 | 超碰在线最新 | 在线电影日韩 | 91麻豆精品国产91久久久久久久久 | 97电影在线 | 337p西西人体大胆瓣开下部 | 欧美日韩精品综合 | 国产资源网站 | 日本在线中文 | 一区二区三区四区精品 | 久久99精品一区二区三区三区 | 人人爽人人爽人人爽学生一级 | 91精品久久久久久久91蜜桃 | 亚洲精品乱码久久久久久写真 | 午夜国产成人 | 亚洲精品 在线视频 | 91在线影院 | 亚洲一二三久久 | 特级西西444www大精品视频免费看 | 一区二区三区四区在线 | 久草热久草视频 | 四虎国产永久在线精品 | 国产成人333kkk | 中文在线最新版天堂 | 这里有精品在线视频 | 亚洲女欲精品久久久久久久18 | 精品国产电影 | 91视频在线免费下载 | 美女av免费看 | 色综合久 | 在线亚洲精品 | www最近高清中文国语在线观看 | 在线观看中文av | 日韩免费观看av | 在线视频观看亚洲 | 免费看黄网站在线 | 啪啪精品 | 国产99re| 国产午夜精品一区二区三区欧美 | 中文在线免费观看 | 欧美一级性视频 | 99国产精品一区二区 | 亚洲精品麻豆视频 | 激情久久久久久久久久久久久久久久 | 国产成人一区二区三区在线观看 | 成人网看片 | 国产69精品久久99的直播节目 | 国产精品免费久久久 | 中文资源在线观看 | 成人午夜剧场在线观看 | 久久伊人婷婷 | 91精品影视 | 美女视频黄在线 | 国产免费久久久久 | 毛片3 | 国产在线视频一区二区 | 国产韩国日本高清视频 | 麻豆精品传媒视频 | 波多野结衣电影久久 | 啪啪免费观看网站 | 黄色av电影在线观看 | 99久久精品电影 | 中文字幕在线视频一区二区 | av资源网在线播放 | 91成人精品一区在线播放69 | 五月婷婷开心中文字幕 | 国内精品久久久久久久97牛牛 | 精品成人国产 | 波多野结衣视频网址 | 中文字幕在线免费 | 91九色在线| 国产麻豆剧传媒免费观看 | 波多野结衣一区二区 | 中文字幕日本在线观看 | 午夜精品一区二区三区在线观看 | 天天操天天弄 | 91干干干 | 黄色影院在线观看 | 免费h精品视频在线播放 | 在线视频a| 成人小视频在线播放 | 欧美 日韩 国产 成人 在线 | 丰满少妇久久久 | av 一区二区三区四区 | 欧美日韩69 | 日韩一级黄色大片 | 久久精品视频日本 | 国产福利一区二区三区视频 | 色婷婷97 | 久操视频在线观看 | 激情婷婷综合网 | 国产成人亚洲在线电影 | 国产区精品在线观看 | 日韩理论电影在线 | 麻豆久久| 天天躁日日躁狠狠躁av中文 | 在线视频 你懂得 | 国产成人av一区二区三区在线观看 | 久久久高清视频 | 国产成人久久av977小说 | 欧美视屏一区二区 | 五月天电影免费在线观看一区 | 日韩高清免费无专码区 | 日韩亚洲欧美中文字幕 | 国产高清在线免费视频 | 久久亚洲欧美日韩精品专区 | 激情小说久久 | 亚洲传媒在线 | 五月婷婷综合激情网 | 国产精品激情在线观看 | 国产色啪| 五月丁香 | 久久久久久久久毛片 | 色诱亚洲精品久久久久久 | 亚洲视频精选 | 在线播放日韩 | 久久新视频 | 日韩精品在线视频 | av天天干 | 亚洲精品av中文字幕在线在线 | 一二三久久久 | 激情综合一区 | av怡红院 | 97视频总站 | 亚洲成人动漫在线观看 | 亚洲女人天堂成人av在线 | 久久久久免费看 | 久久99视频免费观看 | a亚洲视频 | 成人在线黄色电影 | 99热.com| av观看在线观看 | 中文字幕一区二区三区乱码在线 | 97视频资源 | 黄免费网站 | 久久国产片 | 国产高清视频免费 | 综合色亚洲| 久久公开免费视频 | 日韩黄色免费 | 亚洲欧美国产精品va在线观看 | 国产日韩在线一区 | 狠狠操操操 | 91亚洲精品久久久蜜桃 | 丁香免费视频 | 国产免费观看久久黄 | 四月婷婷在线观看 | 999久久精品| 久草在线免费在线观看 | 久久精品国产第一区二区三区 | 免费在线中文字幕 | 激情小说网站亚洲综合网 | 91九色视频国产 | 国产精品一区二区无线 | 精品日韩在线一区 | av一级片网站 | 免费人成网 | 国产精品h在线观看 | 午夜av不卡 | 亚州成人av在线 | 美女视频黄在线观看 | 国产亚洲精品电影 | 欧美午夜理伦三级在线观看 | 热99在线视频 | 国产精品ssss在线亚洲 | www亚洲精品 | 久久国产精品一区二区三区 | 亚洲欧美综合精品久久成人 | 最新国产精品拍自在线播放 | 黄色资源在线 | 又紧又大又爽精品一区二区 | 国内免费的中文字幕 | 四虎8848免费高清在线观看 | 免费看黄色大全 | 国产成人在线一区 | 欧美色精品天天在线观看视频 | 久久99影院 | 中文字幕在线影视资源 | 亚洲精品动漫在线 | 一性一交视频 | 久久综合五月婷婷 | 91麻豆福利 | 日韩精品在线视频免费观看 | 亚洲性xxxx | 网址你懂的在线观看 | a v在线视频 | 日韩专区在线 | 国产一区二区三区视频在线 | 国产黄在线观看 | 日韩欧美国产视频 | 色多多污污在线观看 | 国产黄在线 | 91精品国自产在线观看欧美 | 美女免费视频一区 | 在线 国产一区 | 91视频免费看网站 | 国产精品观看在线亚洲人成网 | 日日干夜夜操视频 | 亚洲国产日韩一区 | 成人一级影视 | 婷婷伊人五月 | 人人干人人草 | 国产打女人屁股调教97 | 91爱爱免费观看 | 国产热re99久久6国产精品 | 日日夜夜天天久久 | 久久一视频| 久久久久久国产精品免费 | 97超碰在| 综合国产在线 | 99视频偷窥在线精品国自产拍 | 黄色av在| 亚洲成人xxx | 精品国产a| 人人爽人人干 | 成人av电影在线播放 | 欧美综合国产 | 国产黄色免费电影 | 国产男女无遮挡猛进猛出在线观看 | 国产色婷婷精品综合在线手机播放 | 日韩在线首页 | 国产黄在线观看 | 久久国产一区二区 | 在线三级播放 | 成人免费视频网站 | 一区二区三区四区五区在线 | 日本黄色特级片 | 不卡视频国产 | 五月激情婷婷丁香 | 免费的黄色av | 日日爽天天操 | 久久99视频免费 | 中文字幕在线免费观看 | 色激情在线 | 日本中文字幕网 | 久草网站在线观看 | 五月综合色婷婷 | 欧美性视频网站 | 国产免费一区二区三区网站免费 | 毛片网站在线观看 | 亚洲国产精品视频 | 国产91aaa| 亚洲国产日韩在线 | 亚洲最大av在线播放 | 天天想夜夜操 | 天堂在线一区二区 | 午夜精品中文字幕 | 五月激情亚洲 | 国产在线观看一区 | a色视频| 91精品视频播放 | 黄色软件视频大全免费下载 | 国产一线二线三线性视频 | 中文字幕乱码在线播放 | 精品电影一区 | 在线免费av电影 | 免费电影播放 | 日韩免费视频 | 日韩精品无 | 视频福利在线 | 免费av一级电影 | 久久伊人国产精品 | 日韩av一区二区三区在线观看 | 天堂在线视频免费观看 | 国产女v资源在线观看 | 人人超在线公开视频 | 88av网站 | 国产精品一区二 | 免费福利视频网 | 久久久久黄 | 中国一区二区视频 | 992tv又爽又黄的免费视频 | 成年人电影毛片 | 夜色资源网 | 啪啪资源 | 在线观看黄色免费视频 | 欧美精品一级视频 | 外国av网| 国产黄色成人 | 91亚洲网站 | 久久久久免费精品国产小说色大师 | 韩国一区二区三区在线观看 | 免费av黄色 | 亚洲国产精品资源 | 国内精品久久久 | 狠狠色丁香婷婷综合 | 丁香六月婷 | 五月天中文字幕 | aaa毛片视频 | 99久久精品免费看国产四区 | 国产精品国产三级在线专区 | 99精品视频免费在线观看 | 嫩模bbw搡bbbb搡bbbb | 国产三级在线播放 | 国产午夜精品理论片在线 | 久久久免费 | 久久蜜臀av | 99视频在线观看一区三区 | 欧美国产日韩一区二区三区 | 亚洲另类人人澡 | 久久开心激情 | 国产私拍在线 | 国产精品久久久久久欧美 | 97视频人人澡人人爽 | 婷婷综合导航 | 亚洲精品 在线视频 | 一区二区国产精品 | 久久久久中文字幕 | 天天干人人| a√国产免费a | 国产超碰在线观看 | 久久色在线观看 | 国产精品一码二码三码在线 | 午夜精品久久久久99热app | 91麻豆操 | 免费看色视频 | 欧美日本国产在线观看 | 国产精品网红直播 | 国产96av| 99久久99热这里只有精品 | 国产高清综合 | 西西4444www大胆视频 | 99精品视频免费观看视频 | 国产xxxx做受性欧美88 | 在线免费高清一区二区三区 | 2019中文最近的2019中文在线 | 免费高清看电视网站 | 国产成人91 | 国产成人333kkk | 黄色av观看 | 99国产精品久久久久老师 | 亚洲资源在线网 | 最新日本中文字幕 | 国产系列 在线观看 | 亚洲综合一区二区精品导航 | 成人a视频 | 日韩高清一二三区 | 九九免费精品 | 国产一区二区三区黄 | 亚洲经典中文字幕 | 国内精品视频在线 | 色综合亚洲精品激情狠狠 | 亚洲一区二区三区毛片 | 国产精品久久久影视 | 色噜噜日韩精品一区二区三区视频 | 91av观看| 成人h在线 | 亚洲精品自拍 | 久久久久久久99精品免费观看 | 女人18毛片a级毛片一区二区 | 在线精品亚洲一区二区 | 天天操天天射天天 | 国产福利一区二区三区在线观看 | 成人国产精品 | 成人国产网址 | 国产精品视频99 | 91九色视频在线观看 | 午夜视频免费 | 久久国产免费视频 | 亚洲精品久久久久999中文字幕 | 精品成人在线 | 色五月成人 | 99性视频 | 高清av影院 | 久久天天操 | 日日操天天操夜夜操 | 二区视频在线观看 | 亚洲精品美女在线观看 | 日韩av片免费在线观看 | 国产精品日韩精品 | 日韩免费一级电影 | 国产五月色婷婷六月丁香视频 | 天天操天天射天天 | 久青草电影 | 成人免费观看在线视频 | 黄色一区二区在线观看 | 国产精品久久久久9999 | 国产日本高清 | 久久亚洲欧美日韩精品专区 | 91麻豆精品国产91久久久使用方法 | 午夜视频一区二区 | 在线观看免费版高清版 | 91精品免费 | 黄色网址中文字幕 | free. 性欧美.com | 亚洲精品在线免费播放 | 99久久久久免费精品国产 | 久久久国产99久久国产一 | 精品二区视频 | 97精品超碰一区二区三区 | 精品一区精品二区 | 日韩免费久久 | 18av在线视频 | 国产精品一区久久久久 | av丝袜在线 | 欧美 日韩 视频 | 欧美粗又大 | 国产精品美 | 日日夜夜噜噜噜 | 欧美aaa一级 | 国产一级在线免费观看 | 国产亚洲精品女人久久久久久 | 亚洲国产精品va在线看黑人动漫 | 欧美精品国产精品 | 久久成人国产精品一区二区 | 青春草视频在线播放 | 热久久视久久精品18亚洲精品 | 成人全视频免费观看在线看 | 久久久久久久久久久久av | 黄色日批网站 | 国产精品美女在线观看 | 国产视频观看 | 欧美激情视频一区二区三区 | 91网页版免费观看 | 香蕉视频久久 | 超碰97网站 | 91在线看| 韩国在线视频一区 | 黄色片网站大全 | 一区二区三区四区五区六区 | 亚洲成人国产 | 国产精品你懂的在线观看 | 国产小视频在线观看免费 | 国产99久久99热这里精品5 | 欧美一级小视频 | 99亚洲国产 | 亚洲视频免费在线 | 韩国精品福利一区二区三区 | 欧美,日韩 | 亚洲婷婷综合色高清在线 | 久久 在线 | 天天人人| 黄色免费网| 久久国产亚洲视频 | 激情网五月婷婷 | 高清av在线 | 五月天com | 黄色网址在线播放 | 日韩精品一区二区三区丰满 | 怡红院成人在线 | 亚洲伦理精品 | 亚洲欧美怡红院 | 久草| 超碰在线人人艹 | 亚洲精品456在线播放乱码 | 欧美激情综合网 | 国产高清视频色在线www | 国产原创在线观看 | 国产精品久久久久久久久久三级 | 久久久久日本精品一区二区三区 | 在线免费观看黄 | 在线视频1卡二卡三卡 | a视频免费 | 国产成人精品一区二区三区 | 国产精品资源在线观看 | 中文字幕在线看视频国产中文版 | 天天摸日日摸人人看 | 久章草在线| 国产视频一区在线播放 | 97超碰色偷偷 | 午夜三级理论 | 视频二区在线 | 中文字幕中文字幕在线中文字幕三区 | 天天综合亚洲 | 久久小视频 | 麻豆va一区二区三区久久浪 | 五月婷婷色综合 | 丰满少妇在线观看网站 | 久久免费毛片视频 | 欧美日韩视频在线播放 | 国产综合香蕉五月婷在线 | 久久在线看 | 91亚洲激情 | 97精品在线视频 | 国产成本人视频在线观看 | 天天草天天干天天 | 亚洲黄色免费在线看 |