├── .classpath ├── .gitignore ├── .idea ├── libraries │ └── Spring_4_3_18_RELEASE.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── workspace.xml ├── .project ├── .settings ├── org.eclipse.core.resources.prefs ├── org.eclipse.jdt.core.prefs ├── org.eclipse.m2e.core.prefs └── org.eclipse.wst.common.project.facet.core.xml ├── LICENSE ├── README.md ├── avatar ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg └── default.jpg ├── database ├── export.sql ├── function-procedure.sql ├── model_reverse.mwb ├── model_reverse.mwb.bak ├── mysql_model.mwb ├── mysql_model.mwb.bak ├── mysql_model.mwb.beforefix ├── role.sql └── trigger.sql ├── instagram-api-clone.iml ├── lib ├── aopalliance-1.0.jar ├── commons-logging-1.2.jar ├── spring-aop-4.3.18.RELEASE.jar ├── spring-aspects-4.3.18.RELEASE.jar ├── spring-beans-4.3.18.RELEASE.jar ├── spring-context-4.3.18.RELEASE.jar ├── spring-context-support-4.3.18.RELEASE.jar ├── spring-core-4.3.18.RELEASE.jar ├── spring-expression-4.3.18.RELEASE.jar ├── spring-instrument-4.3.18.RELEASE.jar ├── spring-instrument-tomcat-4.3.18.RELEASE.jar ├── spring-jdbc-4.3.18.RELEASE.jar ├── spring-jms-4.3.18.RELEASE.jar ├── spring-messaging-4.3.18.RELEASE.jar ├── spring-orm-4.3.18.RELEASE.jar ├── spring-oxm-4.3.18.RELEASE.jar ├── spring-test-4.3.18.RELEASE.jar └── spring-tx-4.3.18.RELEASE.jar ├── mvnw ├── mvnw.cmd ├── photo ├── 0.jpg ├── 1.jpg ├── 10.jpg ├── 100.jpg ├── 101.jpg ├── 102.jpg ├── 103.jpg ├── 104.jpg ├── 105.jpg ├── 106.jpg ├── 107.jpg ├── 108.jpg ├── 109.jpg ├── 11.jpg ├── 110.jpg ├── 111.jpg ├── 112.jpg ├── 113.jpg ├── 114.jpg ├── 115.jpg ├── 116.jpg ├── 117.jpg ├── 118.jpg ├── 119.jpg ├── 12.jpg ├── 120.jpg ├── 121.jpg ├── 122.jpg ├── 123.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 150.jpg ├── 151.jpg ├── 152.jpg ├── 153.jpg ├── 154.jpg ├── 155.jpg ├── 156.jpg ├── 157.jpg ├── 158.jpg ├── 159.jpg ├── 16.jpg ├── 160.jpg ├── 161.jpg ├── 162.jpg ├── 163.jpg ├── 164.jpg ├── 165.jpg ├── 166.jpg ├── 167.jpg ├── 168.jpg ├── 169.jpg ├── 17.jpg ├── 170.jpg ├── 171.jpg ├── 172.jpg ├── 173.jpg ├── 174.jpg ├── 175.jpg ├── 176.jpg ├── 177.jpg ├── 178.jpg ├── 179.jpg ├── 18.jpg ├── 180.jpg ├── 181.jpg ├── 182.jpg ├── 183.jpg ├── 184.jpg ├── 185.jpg ├── 186.jpg ├── 187.jpg ├── 188.jpg ├── 189.jpg ├── 19.jpg ├── 190.jpg ├── 191.jpg ├── 192.jpg ├── 193.jpg ├── 194.jpg ├── 2.jpg ├── 20.jpg ├── 200.jpg ├── 201.jpg ├── 202.jpg ├── 203.jpg ├── 204.jpg ├── 205.jpg ├── 206.jpg ├── 207.jpg ├── 208.jpg ├── 209.jpg ├── 21.jpg ├── 210.jpg ├── 211.jpg ├── 212.jpg ├── 213.jpg ├── 214.jpg ├── 215.jpg ├── 216.jpg ├── 217.jpg ├── 218.jpg ├── 219.jpg ├── 22.jpg ├── 220.jpg ├── 221.jpg ├── 222.jpg ├── 223.jpg ├── 224.jpg ├── 225.jpg ├── 226.jpg ├── 227.jpg ├── 228.jpg ├── 229.jpg ├── 23.jpg ├── 250.jpg ├── 251.jpg ├── 252.jpg ├── 253.jpg ├── 254.jpg ├── 255.jpg ├── 256.jpg ├── 257.jpg ├── 258.jpg ├── 259.jpg ├── 260.jpg ├── 261.jpg ├── 262.jpg ├── 263.jpg ├── 264.jpg ├── 265.jpg ├── 266.jpg ├── 267.jpg ├── 268.jpg ├── 269.jpg ├── 270.jpg ├── 271.jpg ├── 272.jpg ├── 273.jpg ├── 274.jpg ├── 275.jpg ├── 276.jpg ├── 277.jpg ├── 278.jpg ├── 279.jpg ├── 280.jpg ├── 281.jpg ├── 282.jpg ├── 283.jpg ├── 284.jpg ├── 285.jpg ├── 286.jpg ├── 287.jpg ├── 288.jpg ├── 289.jpg ├── 290.jpg ├── 291.jpg ├── 292.jpg ├── 293.jpg ├── 294.jpg ├── 295.jpg ├── 296.jpg ├── 297.jpg ├── 3.jpg ├── 307.jpg ├── 308.jpg ├── 309.jpg ├── 4.jpg ├── 5.jpg ├── 50.jpg ├── 51.jpg ├── 52.jpg ├── 53.jpg ├── 54.jpg ├── 55.jpg ├── 56.jpg ├── 57.jpg ├── 58.jpg ├── 59.jpg ├── 6.jpg ├── 60.jpg ├── 61.jpg ├── 62.jpg ├── 63.jpg ├── 64.jpg ├── 65.jpg ├── 66.jpg ├── 67.jpg ├── 68.jpg ├── 69.jpg ├── 7.jpg ├── 70.jpg ├── 71.jpg ├── 72.jpg ├── 73.jpg ├── 74.jpg ├── 75.jpg ├── 76.jpg ├── 77.jpg ├── 78.jpg ├── 79.jpg ├── 8.jpg └── 9.jpg ├── pom.xml ├── server.conf ├── snapshots ├── editprofile.png ├── login.png ├── newfeed.png ├── profile.png ├── search.png ├── signout.png ├── signup.png └── viewprofile.png ├── src ├── main │ ├── java │ │ ├── Beans.xml │ │ └── org │ │ │ └── ititandev │ │ │ ├── Application.java │ │ │ ├── config │ │ │ ├── Config.java │ │ │ ├── DataSourceConfig.java │ │ │ └── WebSecurityConfig.java │ │ │ ├── controller │ │ │ ├── AccountController.java │ │ │ ├── DownloadController.java │ │ │ ├── PhotoController.java │ │ │ ├── ProfileController.java │ │ │ ├── UploadController.java │ │ │ └── test.java │ │ │ ├── dao │ │ │ ├── AccountDAO.java │ │ │ ├── CommentDAO.java │ │ │ ├── PhotoDAO.java │ │ │ ├── ProfileDAO.java │ │ │ └── ReplyDAO.java │ │ │ ├── mapper │ │ │ ├── AccountMapper.java │ │ │ ├── CommentMapper.java │ │ │ ├── PhotoMapper.java │ │ │ ├── ProfileMapper.java │ │ │ ├── ReplyMapper.java │ │ │ ├── SettingMapper.java │ │ │ ├── StoryMapper.java │ │ │ ├── UserMapper.java │ │ │ └── UserPageMapper.java │ │ │ ├── model │ │ │ ├── Account.java │ │ │ ├── Comment.java │ │ │ ├── Photo.java │ │ │ ├── Profile.java │ │ │ ├── ProfilePage.java │ │ │ ├── Reply.java │ │ │ ├── Setting.java │ │ │ ├── Story.java │ │ │ ├── Tag.java │ │ │ └── User.java │ │ │ ├── security │ │ │ ├── JWTAuthenticationEntryPoint.java │ │ │ ├── JWTAuthenticationFilter.java │ │ │ ├── JWTLoginFilter.java │ │ │ └── TokenHandler.java │ │ │ └── service │ │ │ ├── MailService.java │ │ │ ├── TokenAuthenticationService.java │ │ │ └── TokenAuthenticationServiceImpl.java │ └── resources │ │ └── application.properties └── test │ └── java │ └── org │ └── ititandev │ └── DemoApplicationTests.java ├── target └── classes │ ├── Beans.xml │ ├── META-INF │ ├── MANIFEST.MF │ └── maven │ │ └── org.ititandev │ │ └── instagram-api-clone │ │ ├── pom.properties │ │ └── pom.xml │ └── application.properties ├── verify1.html └── verify2.html /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.war 15 | *.ear 16 | *.zip 17 | *.tar.gz 18 | *.rar 19 | 20 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 21 | hs_err_pid* 22 | -------------------------------------------------------------------------------- /.idea/libraries/Spring_4_3_18_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | instagram-api-clone 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.wst.common.project.facet.core.builder 10 | 11 | 12 | 13 | 14 | org.eclipse.jdt.core.javabuilder 15 | 16 | 17 | 18 | 19 | org.springframework.ide.eclipse.core.springbuilder 20 | 21 | 22 | 23 | 24 | org.springframework.ide.eclipse.boot.validation.springbootbuilder 25 | 26 | 27 | 28 | 29 | org.eclipse.m2e.core.maven2Builder 30 | 31 | 32 | 33 | 34 | 35 | org.springframework.ide.eclipse.core.springnature 36 | org.eclipse.jdt.core.javanature 37 | org.eclipse.m2e.core.maven2Nature 38 | org.eclipse.wst.common.project.facet.core.nature 39 | 40 | 41 | -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/main/resources=UTF-8 4 | encoding//src/test/java=UTF-8 5 | encoding/=UTF-8 6 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled 3 | org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore 4 | org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull 5 | org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= 6 | org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault 7 | org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= 8 | org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable 9 | org.eclipse.jdt.core.compiler.annotation.nullable.secondary= 10 | org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled 11 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 12 | org.eclipse.jdt.core.compiler.compliance=1.8 13 | org.eclipse.jdt.core.compiler.problem.APILeak=warning 14 | org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning 15 | org.eclipse.jdt.core.compiler.problem.autoboxing=ignore 16 | org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning 17 | org.eclipse.jdt.core.compiler.problem.deadCode=warning 18 | org.eclipse.jdt.core.compiler.problem.deprecation=warning 19 | org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled 20 | org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled 21 | org.eclipse.jdt.core.compiler.problem.discouragedReference=warning 22 | org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore 23 | org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore 24 | org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore 25 | org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled 26 | org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore 27 | org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning 28 | org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning 29 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 30 | org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning 31 | org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled 32 | org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning 33 | org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning 34 | org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore 35 | org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore 36 | org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=ignore 37 | org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore 38 | org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore 39 | org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled 40 | org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore 41 | org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore 42 | org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled 43 | org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning 44 | org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore 45 | org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning 46 | org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning 47 | org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore 48 | org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning 49 | org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning 50 | org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error 51 | org.eclipse.jdt.core.compiler.problem.nullReference=warning 52 | org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error 53 | org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning 54 | org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning 55 | org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore 56 | org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning 57 | org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore 58 | org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore 59 | org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore 60 | org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning 61 | org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning 62 | org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore 63 | org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore 64 | org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore 65 | org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore 66 | org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore 67 | org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled 68 | org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning 69 | org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled 70 | org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled 71 | org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled 72 | org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore 73 | org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning 74 | org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning 75 | org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled 76 | org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning 77 | org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning 78 | org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore 79 | org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning 80 | org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning 81 | org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled 82 | org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info 83 | org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore 84 | org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore 85 | org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore 86 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore 87 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled 88 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled 89 | org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled 90 | org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore 91 | org.eclipse.jdt.core.compiler.problem.unusedImport=warning 92 | org.eclipse.jdt.core.compiler.problem.unusedLabel=warning 93 | org.eclipse.jdt.core.compiler.problem.unusedLocal=warning 94 | org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore 95 | org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore 96 | org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled 97 | org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled 98 | org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled 99 | org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning 100 | org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore 101 | org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning 102 | org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning 103 | org.eclipse.jdt.core.compiler.source=1.8 104 | -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.project.facet.core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 ititandev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## RESTful Webservice for Instagram Android App Clone 2 | https://github.com/ititandev/instagram-android-using-api-clone 3 | 4 | ## App Snapshots 5 |

6 | 7 |

8 |

9 | 10 |

11 |

12 | 13 |

14 |

15 | 16 |

17 |

18 | 19 |

20 |

21 | 22 |

23 |

24 | 25 |

-------------------------------------------------------------------------------- /avatar/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/1.jpg -------------------------------------------------------------------------------- /avatar/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/2.jpg -------------------------------------------------------------------------------- /avatar/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/3.jpg -------------------------------------------------------------------------------- /avatar/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/4.jpg -------------------------------------------------------------------------------- /avatar/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/5.jpg -------------------------------------------------------------------------------- /avatar/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/6.jpg -------------------------------------------------------------------------------- /avatar/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/avatar/default.jpg -------------------------------------------------------------------------------- /database/model_reverse.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/database/model_reverse.mwb -------------------------------------------------------------------------------- /database/model_reverse.mwb.bak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/database/model_reverse.mwb.bak -------------------------------------------------------------------------------- /database/mysql_model.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/database/mysql_model.mwb -------------------------------------------------------------------------------- /database/mysql_model.mwb.bak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/database/mysql_model.mwb.bak -------------------------------------------------------------------------------- /database/mysql_model.mwb.beforefix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/database/mysql_model.mwb.beforefix -------------------------------------------------------------------------------- /database/role.sql: -------------------------------------------------------------------------------- 1 | DROP USER IF EXISTS 'db_owner'@'localhost'; 2 | CREATE USER 'db_owner'@'localhost' IDENTIFIED BY 'password'; 3 | GRANT ALL PRIVILEGES 4 | ON instagram.* 5 | TO 'db_owner'@'localhost'; 6 | 7 | DROP USER IF EXISTS 'db_datareader'@'localhost'; 8 | CREATE USER 'db_datareader'@'localhost' IDENTIFIED BY 'password'; 9 | GRANT SELECT 10 | ON instagram.* 11 | TO 'db_datareader'@'localhost'; 12 | 13 | DROP USER IF EXISTS 'db_datawriter'@'localhost'; 14 | CREATE USER 'db_datawriter'@'localhost' IDENTIFIED BY 'password'; 15 | GRANT INSERT, UPDATE, DELETE 16 | ON instagram.* 17 | TO 'db_datawriter'@'localhost'; 18 | 19 | DROP USER IF EXISTS 'db_security'@'localhost'; 20 | CREATE USER 'db_security'@'localhost' IDENTIFIED BY 'password'; 21 | GRANT GRANT OPTION 22 | ON instagram.* 23 | TO 'db_security'@'localhost'; 24 | 25 | GRANT EXECUTE ON FUNCTION get_comment_num TO 'db_datareader'@'localhost'; 26 | GRANT EXECUTE ON FUNCTION get_follower_num TO 'db_datareader'@'localhost'; 27 | GRANT EXECUTE ON FUNCTION get_following_num TO 'db_datareader'@'localhost'; 28 | GRANT EXECUTE ON FUNCTION get_like_num TO 'db_datareader'@'localhost'; 29 | GRANT EXECUTE ON FUNCTION get_name TO 'db_datareader'@'localhost'; 30 | GRANT EXECUTE ON FUNCTION get_photo_num TO 'db_datareader'@'localhost'; 31 | GRANT EXECUTE ON FUNCTION get_reply_num TO 'db_datareader'@'localhost'; 32 | GRANT EXECUTE ON FUNCTION get_avatar TO 'db_datareader'@'localhost'; 33 | 34 | GRANT EXECUTE ON FUNCTION get_comment_num TO 'db_owner'@'localhost'; 35 | GRANT EXECUTE ON FUNCTION get_follower_num TO 'db_owner'@'localhost'; 36 | GRANT EXECUTE ON FUNCTION get_following_num TO 'db_owner'@'localhost'; 37 | GRANT EXECUTE ON FUNCTION get_like_num TO 'db_owner'@'localhost'; 38 | GRANT EXECUTE ON FUNCTION get_name TO 'db_owner'@'localhost'; 39 | GRANT EXECUTE ON FUNCTION get_photo_num TO 'db_owner'@'localhost'; 40 | GRANT EXECUTE ON FUNCTION get_reply_num TO 'db_owner'@'localhost'; 41 | GRANT EXECUTE ON FUNCTION get_avatar TO 'db_owner'@'localhost'; 42 | 43 | GRANT EXECUTE ON PROCEDURE add_block TO 'db_owner'@'localhost'; 44 | GRANT EXECUTE ON PROCEDURE add_like TO 'db_owner'@'localhost'; 45 | GRANT EXECUTE ON PROCEDURE add_unlike TO 'db_owner'@'localhost'; 46 | GRANT EXECUTE ON PROCEDURE check_block TO 'db_owner'@'localhost'; 47 | GRANT EXECUTE ON PROCEDURE check_follow TO 'db_owner'@'localhost'; 48 | GRANT EXECUTE ON PROCEDURE check_private_acc TO 'db_owner'@'localhost'; 49 | GRANT EXECUTE ON PROCEDURE check_user_to_photo TO 'db_owner'@'localhost'; 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /database/trigger.sql: -------------------------------------------------------------------------------- 1 | DELIMITER // 2 | CREATE TRIGGER after_account_insert AFTER INSERT 3 | ON account 4 | FOR EACH ROW 5 | BEGIN 6 | INSERT INTO setting(username,private_acc) 7 | VALUES (NEW.username,1); 8 | INSERT INTO profile (username) 9 | VALUES (NEW.username); 10 | END; 11 | // 12 | 13 | DELIMITER // 14 | CREATE TRIGGER after_comment_insert AFTER INSERT 15 | ON comment 16 | FOR EACH ROW 17 | BEGIN 18 | DECLARE usern VARCHAR(50); 19 | SELECT username 20 | FROM photo 21 | WHERE photo_id = NEW.photo_id 22 | INTO usern; 23 | 24 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 25 | VALUES (usern,0,0,NEW.comment_id); 26 | END; 27 | // 28 | DELIMITER // 29 | CREATE TRIGGER after_reply_insert AFTER INSERT 30 | ON reply 31 | FOR EACH ROW 32 | BEGIN 33 | DECLARE usern VARCHAR(50); 34 | SELECT username 35 | FROM comment 36 | WHERE comment_id = NEW.comment_id 37 | INTO usern; 38 | 39 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 40 | VALUES (usern,0,1,NEW.reply_id); 41 | END; 42 | // 43 | DELIMITER // 44 | CREATE TRIGGER after_follow_insert AFTER INSERT 45 | ON follow 46 | FOR EACH ROW 47 | BEGIN 48 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 49 | VALUES (NEW.username2,0,2,NEW.follow_id); 50 | END; 51 | // 52 | DELIMITER // 53 | CREATE TRIGGER after_like_insert AFTER INSERT 54 | ON `like` 55 | FOR EACH ROW 56 | BEGIN 57 | DECLARE usern VARCHAR(50); 58 | SELECT username 59 | FROM photo 60 | WHERE photo_id = NEW.photo_id 61 | INTO usern; 62 | 63 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 64 | VALUES (usern,0,3,NEW.like_id); 65 | END; 66 | // 67 | DELIMITER // 68 | CREATE TRIGGER after_tag_in_photo_insert AFTER INSERT 69 | ON tag_in_photo 70 | FOR EACH ROW 71 | BEGIN 72 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 73 | VALUES (NEW.username,0,4,NEW.tag_in_photo_id); 74 | END; 75 | // 76 | DELIMITER // 77 | CREATE TRIGGER after_tag_in_comment_insert AFTER INSERT 78 | ON tag_in_comment 79 | FOR EACH ROW 80 | BEGIN 81 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 82 | VALUES (NEW.username,0,5,NEW.tag_in_comment_id); 83 | END; 84 | // 85 | DELIMITER // 86 | CREATE TRIGGER after_tag_in_reply_insert AFTER INSERT 87 | ON tag_in_reply 88 | FOR EACH ROW 89 | BEGIN 90 | INSERT INTO noti(username_rev,`read`,noti_type,type_id) 91 | VALUES (NEW.username,0,6,NEW.tag_in_reply_id); 92 | END; 93 | // 94 | 95 | -------------------------------------------------------------------------------- /instagram-api-clone.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | file://$MODULE_DIR$/src/main/java/Beans.xml 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /lib/aopalliance-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/aopalliance-1.0.jar -------------------------------------------------------------------------------- /lib/commons-logging-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/commons-logging-1.2.jar -------------------------------------------------------------------------------- /lib/spring-aop-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-aop-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-aspects-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-aspects-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-beans-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-beans-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-context-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-context-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-context-support-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-context-support-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-core-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-core-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-expression-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-expression-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-instrument-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-instrument-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-instrument-tomcat-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-instrument-tomcat-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-jdbc-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-jdbc-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-jms-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-jms-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-messaging-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-messaging-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-orm-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-orm-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-oxm-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-oxm-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-test-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-test-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /lib/spring-tx-4.3.18.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/lib/spring-tx-4.3.18.RELEASE.jar -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /photo/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/0.jpg -------------------------------------------------------------------------------- /photo/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/1.jpg -------------------------------------------------------------------------------- /photo/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/10.jpg -------------------------------------------------------------------------------- /photo/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/100.jpg -------------------------------------------------------------------------------- /photo/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/101.jpg -------------------------------------------------------------------------------- /photo/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/102.jpg -------------------------------------------------------------------------------- /photo/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/103.jpg -------------------------------------------------------------------------------- /photo/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/104.jpg -------------------------------------------------------------------------------- /photo/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/105.jpg -------------------------------------------------------------------------------- /photo/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/106.jpg -------------------------------------------------------------------------------- /photo/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/107.jpg -------------------------------------------------------------------------------- /photo/108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/108.jpg -------------------------------------------------------------------------------- /photo/109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/109.jpg -------------------------------------------------------------------------------- /photo/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/11.jpg -------------------------------------------------------------------------------- /photo/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/110.jpg -------------------------------------------------------------------------------- /photo/111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/111.jpg -------------------------------------------------------------------------------- /photo/112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/112.jpg -------------------------------------------------------------------------------- /photo/113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/113.jpg -------------------------------------------------------------------------------- /photo/114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/114.jpg -------------------------------------------------------------------------------- /photo/115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/115.jpg -------------------------------------------------------------------------------- /photo/116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/116.jpg -------------------------------------------------------------------------------- /photo/117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/117.jpg -------------------------------------------------------------------------------- /photo/118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/118.jpg -------------------------------------------------------------------------------- /photo/119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/119.jpg -------------------------------------------------------------------------------- /photo/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/12.jpg -------------------------------------------------------------------------------- /photo/120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/120.jpg -------------------------------------------------------------------------------- /photo/121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/121.jpg -------------------------------------------------------------------------------- /photo/122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/122.jpg -------------------------------------------------------------------------------- /photo/123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/123.jpg -------------------------------------------------------------------------------- /photo/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/13.jpg -------------------------------------------------------------------------------- /photo/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/14.jpg -------------------------------------------------------------------------------- /photo/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/15.jpg -------------------------------------------------------------------------------- /photo/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/150.jpg -------------------------------------------------------------------------------- /photo/151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/151.jpg -------------------------------------------------------------------------------- /photo/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/152.jpg -------------------------------------------------------------------------------- /photo/153.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/153.jpg -------------------------------------------------------------------------------- /photo/154.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/154.jpg -------------------------------------------------------------------------------- /photo/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/155.jpg -------------------------------------------------------------------------------- /photo/156.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/156.jpg -------------------------------------------------------------------------------- /photo/157.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/157.jpg -------------------------------------------------------------------------------- /photo/158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/158.jpg -------------------------------------------------------------------------------- /photo/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/159.jpg -------------------------------------------------------------------------------- /photo/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/16.jpg -------------------------------------------------------------------------------- /photo/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/160.jpg -------------------------------------------------------------------------------- /photo/161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/161.jpg -------------------------------------------------------------------------------- /photo/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/162.jpg -------------------------------------------------------------------------------- /photo/163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/163.jpg -------------------------------------------------------------------------------- /photo/164.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/164.jpg -------------------------------------------------------------------------------- /photo/165.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/165.jpg -------------------------------------------------------------------------------- /photo/166.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/166.jpg -------------------------------------------------------------------------------- /photo/167.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/167.jpg -------------------------------------------------------------------------------- /photo/168.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/168.jpg -------------------------------------------------------------------------------- /photo/169.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/169.jpg -------------------------------------------------------------------------------- /photo/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/17.jpg -------------------------------------------------------------------------------- /photo/170.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/170.jpg -------------------------------------------------------------------------------- /photo/171.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/171.jpg -------------------------------------------------------------------------------- /photo/172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/172.jpg -------------------------------------------------------------------------------- /photo/173.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/173.jpg -------------------------------------------------------------------------------- /photo/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/174.jpg -------------------------------------------------------------------------------- /photo/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/175.jpg -------------------------------------------------------------------------------- /photo/176.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/176.jpg -------------------------------------------------------------------------------- /photo/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/177.jpg -------------------------------------------------------------------------------- /photo/178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/178.jpg -------------------------------------------------------------------------------- /photo/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/179.jpg -------------------------------------------------------------------------------- /photo/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/18.jpg -------------------------------------------------------------------------------- /photo/180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/180.jpg -------------------------------------------------------------------------------- /photo/181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/181.jpg -------------------------------------------------------------------------------- /photo/182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/182.jpg -------------------------------------------------------------------------------- /photo/183.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/183.jpg -------------------------------------------------------------------------------- /photo/184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/184.jpg -------------------------------------------------------------------------------- /photo/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/185.jpg -------------------------------------------------------------------------------- /photo/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/186.jpg -------------------------------------------------------------------------------- /photo/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/187.jpg -------------------------------------------------------------------------------- /photo/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/188.jpg -------------------------------------------------------------------------------- /photo/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/189.jpg -------------------------------------------------------------------------------- /photo/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/19.jpg -------------------------------------------------------------------------------- /photo/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/190.jpg -------------------------------------------------------------------------------- /photo/191.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/191.jpg -------------------------------------------------------------------------------- /photo/192.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/192.jpg -------------------------------------------------------------------------------- /photo/193.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/193.jpg -------------------------------------------------------------------------------- /photo/194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/194.jpg -------------------------------------------------------------------------------- /photo/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/2.jpg -------------------------------------------------------------------------------- /photo/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/20.jpg -------------------------------------------------------------------------------- /photo/200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/200.jpg -------------------------------------------------------------------------------- /photo/201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/201.jpg -------------------------------------------------------------------------------- /photo/202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/202.jpg -------------------------------------------------------------------------------- /photo/203.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/203.jpg -------------------------------------------------------------------------------- /photo/204.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/204.jpg -------------------------------------------------------------------------------- /photo/205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/205.jpg -------------------------------------------------------------------------------- /photo/206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/206.jpg -------------------------------------------------------------------------------- /photo/207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/207.jpg -------------------------------------------------------------------------------- /photo/208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/208.jpg -------------------------------------------------------------------------------- /photo/209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/209.jpg -------------------------------------------------------------------------------- /photo/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/21.jpg -------------------------------------------------------------------------------- /photo/210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/210.jpg -------------------------------------------------------------------------------- /photo/211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/211.jpg -------------------------------------------------------------------------------- /photo/212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/212.jpg -------------------------------------------------------------------------------- /photo/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/213.jpg -------------------------------------------------------------------------------- /photo/214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/214.jpg -------------------------------------------------------------------------------- /photo/215.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/215.jpg -------------------------------------------------------------------------------- /photo/216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/216.jpg -------------------------------------------------------------------------------- /photo/217.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/217.jpg -------------------------------------------------------------------------------- /photo/218.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/218.jpg -------------------------------------------------------------------------------- /photo/219.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/219.jpg -------------------------------------------------------------------------------- /photo/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/22.jpg -------------------------------------------------------------------------------- /photo/220.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/220.jpg -------------------------------------------------------------------------------- /photo/221.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/221.jpg -------------------------------------------------------------------------------- /photo/222.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/222.jpg -------------------------------------------------------------------------------- /photo/223.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/223.jpg -------------------------------------------------------------------------------- /photo/224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/224.jpg -------------------------------------------------------------------------------- /photo/225.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/225.jpg -------------------------------------------------------------------------------- /photo/226.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/226.jpg -------------------------------------------------------------------------------- /photo/227.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/227.jpg -------------------------------------------------------------------------------- /photo/228.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/228.jpg -------------------------------------------------------------------------------- /photo/229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/229.jpg -------------------------------------------------------------------------------- /photo/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/23.jpg -------------------------------------------------------------------------------- /photo/250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/250.jpg -------------------------------------------------------------------------------- /photo/251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/251.jpg -------------------------------------------------------------------------------- /photo/252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/252.jpg -------------------------------------------------------------------------------- /photo/253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/253.jpg -------------------------------------------------------------------------------- /photo/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/254.jpg -------------------------------------------------------------------------------- /photo/255.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/255.jpg -------------------------------------------------------------------------------- /photo/256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/256.jpg -------------------------------------------------------------------------------- /photo/257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/257.jpg -------------------------------------------------------------------------------- /photo/258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/258.jpg -------------------------------------------------------------------------------- /photo/259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/259.jpg -------------------------------------------------------------------------------- /photo/260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/260.jpg -------------------------------------------------------------------------------- /photo/261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/261.jpg -------------------------------------------------------------------------------- /photo/262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/262.jpg -------------------------------------------------------------------------------- /photo/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/263.jpg -------------------------------------------------------------------------------- /photo/264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/264.jpg -------------------------------------------------------------------------------- /photo/265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/265.jpg -------------------------------------------------------------------------------- /photo/266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/266.jpg -------------------------------------------------------------------------------- /photo/267.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/267.jpg -------------------------------------------------------------------------------- /photo/268.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/268.jpg -------------------------------------------------------------------------------- /photo/269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/269.jpg -------------------------------------------------------------------------------- /photo/270.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/270.jpg -------------------------------------------------------------------------------- /photo/271.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/271.jpg -------------------------------------------------------------------------------- /photo/272.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/272.jpg -------------------------------------------------------------------------------- /photo/273.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/273.jpg -------------------------------------------------------------------------------- /photo/274.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/274.jpg -------------------------------------------------------------------------------- /photo/275.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/275.jpg -------------------------------------------------------------------------------- /photo/276.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/276.jpg -------------------------------------------------------------------------------- /photo/277.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/277.jpg -------------------------------------------------------------------------------- /photo/278.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/278.jpg -------------------------------------------------------------------------------- /photo/279.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/279.jpg -------------------------------------------------------------------------------- /photo/280.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/280.jpg -------------------------------------------------------------------------------- /photo/281.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/281.jpg -------------------------------------------------------------------------------- /photo/282.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/282.jpg -------------------------------------------------------------------------------- /photo/283.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/283.jpg -------------------------------------------------------------------------------- /photo/284.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/284.jpg -------------------------------------------------------------------------------- /photo/285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/285.jpg -------------------------------------------------------------------------------- /photo/286.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/286.jpg -------------------------------------------------------------------------------- /photo/287.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/287.jpg -------------------------------------------------------------------------------- /photo/288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/288.jpg -------------------------------------------------------------------------------- /photo/289.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/289.jpg -------------------------------------------------------------------------------- /photo/290.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/290.jpg -------------------------------------------------------------------------------- /photo/291.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/291.jpg -------------------------------------------------------------------------------- /photo/292.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/292.jpg -------------------------------------------------------------------------------- /photo/293.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/293.jpg -------------------------------------------------------------------------------- /photo/294.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/294.jpg -------------------------------------------------------------------------------- /photo/295.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/295.jpg -------------------------------------------------------------------------------- /photo/296.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/296.jpg -------------------------------------------------------------------------------- /photo/297.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/297.jpg -------------------------------------------------------------------------------- /photo/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/3.jpg -------------------------------------------------------------------------------- /photo/307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/307.jpg -------------------------------------------------------------------------------- /photo/308.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/308.jpg -------------------------------------------------------------------------------- /photo/309.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/309.jpg -------------------------------------------------------------------------------- /photo/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/4.jpg -------------------------------------------------------------------------------- /photo/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/5.jpg -------------------------------------------------------------------------------- /photo/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/50.jpg -------------------------------------------------------------------------------- /photo/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/51.jpg -------------------------------------------------------------------------------- /photo/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/52.jpg -------------------------------------------------------------------------------- /photo/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/53.jpg -------------------------------------------------------------------------------- /photo/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/54.jpg -------------------------------------------------------------------------------- /photo/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/55.jpg -------------------------------------------------------------------------------- /photo/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/56.jpg -------------------------------------------------------------------------------- /photo/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/57.jpg -------------------------------------------------------------------------------- /photo/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/58.jpg -------------------------------------------------------------------------------- /photo/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/59.jpg -------------------------------------------------------------------------------- /photo/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/6.jpg -------------------------------------------------------------------------------- /photo/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/60.jpg -------------------------------------------------------------------------------- /photo/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/61.jpg -------------------------------------------------------------------------------- /photo/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/62.jpg -------------------------------------------------------------------------------- /photo/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/63.jpg -------------------------------------------------------------------------------- /photo/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/64.jpg -------------------------------------------------------------------------------- /photo/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/65.jpg -------------------------------------------------------------------------------- /photo/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/66.jpg -------------------------------------------------------------------------------- /photo/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/67.jpg -------------------------------------------------------------------------------- /photo/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/68.jpg -------------------------------------------------------------------------------- /photo/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/69.jpg -------------------------------------------------------------------------------- /photo/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/7.jpg -------------------------------------------------------------------------------- /photo/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/70.jpg -------------------------------------------------------------------------------- /photo/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/71.jpg -------------------------------------------------------------------------------- /photo/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/72.jpg -------------------------------------------------------------------------------- /photo/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/73.jpg -------------------------------------------------------------------------------- /photo/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/74.jpg -------------------------------------------------------------------------------- /photo/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/75.jpg -------------------------------------------------------------------------------- /photo/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/76.jpg -------------------------------------------------------------------------------- /photo/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/77.jpg -------------------------------------------------------------------------------- /photo/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/78.jpg -------------------------------------------------------------------------------- /photo/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/79.jpg -------------------------------------------------------------------------------- /photo/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/8.jpg -------------------------------------------------------------------------------- /photo/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/photo/9.jpg -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | org.ititandev 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | spring-security-jwt-rest-demo 12 | Spring Security JWT Rest Demo 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.4.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-security 32 | 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-web 37 | 38 | 39 | 40 | io.jsonwebtoken 41 | jjwt 42 | 0.6.0 43 | 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-starter-test 48 | test 49 | 50 | 51 | mysql 52 | mysql-connector-java 53 | 8.0.11 54 | 55 | 56 | commons-dbcp 57 | commons-dbcp 58 | 1.4 59 | 60 | 61 | org.springframework 62 | spring-jdbc 63 | 3.0.3.RELEASE 64 | 65 | 66 | commons-io 67 | commons-io 68 | 2.6 69 | 70 | 71 | 72 | org.apache.httpcomponents 73 | httpclient 74 | 75 | 76 | 77 | org.json 78 | json 79 | 80 | 81 | 82 | org.springframework 83 | spring-jdbc 84 | 5.0.5.RELEASE 85 | 86 | 87 | javax.mail 88 | mail 89 | 1.4 90 | 91 | 92 | org.apache.commons 93 | commons-lang3 94 | 3.6 95 | 96 | 97 | 98 | 99 | 100 | 101 | org.springframework.boot 102 | spring-boot-maven-plugin 103 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | instagram-api-clone 117 | 118 | -------------------------------------------------------------------------------- /server.conf: -------------------------------------------------------------------------------- 1 | hostname=http://localhost:8081 2 | #hostname=http://vre.hcmut.edu.vn/instagram 3 | 4 | photo.dir=photo 5 | avatar.dir=avatar 6 | story.dir=story 7 | #photo.dir=/home/traffic/ititan/instagram-api-clone/photo 8 | #avatar.dir=/home/traffic/ititan/instagram-api-clone/avatar 9 | #story.dir=/home/traffic/ititan/instagram-api-clone/story 10 | 11 | mysql.username=root 12 | mysql.password=GTX980TiITitan! 13 | 14 | mail.username=instagram.service.clone 15 | mail.password=instagram.service 16 | 17 | mail.verify.path1=verify1.html 18 | mail.verify.path2=verify2.html 19 | #mail.verify.path1=/home/traffic/ititan/instagram-api-clone/verify1.html 20 | #mail.verify.path2=/home/traffic/ititan/instagram-api-clone/verify2.html -------------------------------------------------------------------------------- /snapshots/editprofile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/editprofile.png -------------------------------------------------------------------------------- /snapshots/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/login.png -------------------------------------------------------------------------------- /snapshots/newfeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/newfeed.png -------------------------------------------------------------------------------- /snapshots/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/profile.png -------------------------------------------------------------------------------- /snapshots/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/search.png -------------------------------------------------------------------------------- /snapshots/signout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/signout.png -------------------------------------------------------------------------------- /snapshots/signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/signup.png -------------------------------------------------------------------------------- /snapshots/viewprofile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ititandev/instagram-api-clone/44798d2bb867df56abaf437a29b56c864a4467ef/snapshots/viewprofile.png -------------------------------------------------------------------------------- /src/main/java/Beans.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | 21 | 23 | 24 | 25 | 27 | 28 | 29 | 31 | 32 | 33 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/Application.java: -------------------------------------------------------------------------------- 1 | package org.ititandev; 2 | 3 | import java.io.IOException; 4 | 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | import org.springframework.context.support.ClassPathXmlApplicationContext; 9 | 10 | @SpringBootApplication 11 | @EnableAutoConfiguration 12 | public class Application { 13 | 14 | public static ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 15 | 16 | public static void main(String[] args) throws IOException { 17 | SpringApplication.run(Application.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/config/Config.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.config; 2 | 3 | import java.io.FileInputStream; 4 | import java.util.Properties; 5 | import org.apache.commons.lang3.SystemUtils; 6 | 7 | public class Config { 8 | private String path; 9 | private Properties properties; 10 | private Properties config; 11 | private static Config instance; 12 | 13 | private Config() { 14 | properties = new Properties(); 15 | config = new Properties(); 16 | try { 17 | properties.load(this.getClass().getClassLoader().getResourceAsStream("application.properties")); 18 | if (SystemUtils.IS_OS_LINUX) 19 | path = "/etc/instagram/server.conf"; 20 | else 21 | path = "server.conf"; 22 | config.load(new FileInputStream(path)); 23 | } catch (Exception e) { 24 | e.printStackTrace(); 25 | } 26 | } 27 | 28 | private String _getProperty(String key) { 29 | return properties.getProperty(key); 30 | } 31 | 32 | private String _getConfig(String key) { 33 | return config.getProperty(key); 34 | } 35 | 36 | public static String getProperty(String key) { 37 | if (instance == null) 38 | instance = new Config(); 39 | return instance._getProperty(key); 40 | } 41 | 42 | public static String getConfig(String key) { 43 | if (instance == null) 44 | instance = new Config(); 45 | return instance._getConfig(key); 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/config/DataSourceConfig.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.config; 2 | 3 | import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import javax.sql.DataSource; 8 | 9 | 10 | @Configuration 11 | public class DataSourceConfig { 12 | 13 | @Bean 14 | public DataSource dataSource() { 15 | DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); 16 | dataSourceBuilder.url("jdbc:mysql://127.0.0.1:3306/instagram"); 17 | dataSourceBuilder.driverClassName("com.mysql.jdbc.Driver"); 18 | dataSourceBuilder.username(Config.getConfig("mysql.username")); 19 | dataSourceBuilder.password(Config.getConfig("mysql.password")); 20 | return dataSourceBuilder.build(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.config; 2 | 3 | import javax.sql.DataSource; 4 | 5 | import org.ititandev.security.JWTAuthenticationEntryPoint; 6 | import org.ititandev.security.JWTAuthenticationFilter; 7 | import org.ititandev.security.JWTLoginFilter; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.context.annotation.Configuration; 10 | import org.springframework.http.HttpMethod; 11 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 12 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 13 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 14 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 15 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 16 | import org.springframework.security.config.http.SessionCreationPolicy; 17 | import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; 18 | 19 | @Configuration 20 | @EnableWebSecurity 21 | @EnableGlobalMethodSecurity(prePostEnabled = true) 22 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 23 | @Autowired 24 | private DataSource dataSource; 25 | 26 | @Autowired 27 | private JWTAuthenticationEntryPoint unauthorizedHandler; 28 | 29 | @Override 30 | protected void configure(HttpSecurity http) throws Exception { 31 | http 32 | .csrf().disable() 33 | .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() 34 | .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 35 | .authorizeRequests() 36 | .antMatchers("/").permitAll() 37 | .antMatchers(HttpMethod.POST, "/login").permitAll() 38 | .antMatchers(HttpMethod.POST, "/signup").permitAll() 39 | .antMatchers(HttpMethod.GET, "/download/photo/{filename}.{ext}").permitAll() 40 | .antMatchers(HttpMethod.GET, "/download/avatar/{filename}.{ext}").permitAll() 41 | .antMatchers(HttpMethod.GET, "/download/story/{filename}.{ext}").permitAll() 42 | .antMatchers(HttpMethod.GET, "/verify/resend/{username}").permitAll() 43 | .antMatchers(HttpMethod.GET, "/verify/{username}/{hash}").permitAll() 44 | .antMatchers(HttpMethod.GET, "/avatar").permitAll() 45 | .antMatchers(HttpMethod.POST, "/kiet").permitAll() 46 | // .anyRequest().authenticated().and() 47 | .and() 48 | .addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class) 49 | .addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 50 | .headers().cacheControl(); 51 | } 52 | 53 | @Override 54 | protected void configure(AuthenticationManagerBuilder auth) throws Exception { 55 | auth.jdbcAuthentication().dataSource(dataSource) 56 | .usersByUsernameQuery("SELECT username, password, NOT `lock` FROM account WHERE username=?") 57 | .authoritiesByUsernameQuery("select username, \"USER_ROLE\" as role from account where username=?"); 58 | // .passwordEncoder(new BCryptPasswordEncoder(16)); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/AccountController.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.nio.charset.StandardCharsets; 6 | import java.nio.file.Files; 7 | import java.nio.file.Paths; 8 | import java.util.List; 9 | 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | 13 | import org.ititandev.Application; 14 | import org.ititandev.config.Config; 15 | import org.ititandev.dao.AccountDAO; 16 | import org.ititandev.model.Account; 17 | import org.ititandev.model.User; 18 | import org.ititandev.security.TokenHandler; 19 | import org.ititandev.service.MailService; 20 | import org.json.JSONException; 21 | import org.json.JSONObject; 22 | import org.springframework.dao.DuplicateKeyException; 23 | import org.springframework.security.core.Authentication; 24 | import org.springframework.security.core.context.SecurityContextHolder; 25 | import org.springframework.web.bind.annotation.GetMapping; 26 | import org.springframework.web.bind.annotation.PathVariable; 27 | import org.springframework.web.bind.annotation.PostMapping; 28 | import org.springframework.web.bind.annotation.PutMapping; 29 | import org.springframework.web.bind.annotation.RequestBody; 30 | import org.springframework.web.bind.annotation.RequestParam; 31 | import org.springframework.web.bind.annotation.RestController; 32 | 33 | @RestController 34 | public class AccountController { 35 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 36 | 37 | @GetMapping("/") 38 | public String root() { 39 | return "Welcome to Instagram API Clone\nIt's for android app to use."; 40 | } 41 | 42 | @PostMapping("/signup") 43 | public Object signUp(HttpServletRequest request, HttpServletResponse response, @RequestBody String body) 44 | throws IOException, JSONException { 45 | JSONObject json = new JSONObject(body); 46 | response.setContentType("application/json"); 47 | int result = 0; 48 | try { 49 | // BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder(); 50 | result = accountDAO.insert(json.getString("username"), json.getString("password"), json.getString("email"), 51 | json.getString("name")); 52 | // int result = accountDAO.insert(json.getString("username"), 53 | // bcrypt.encode(json.getString("password")), json.getString("email"), 54 | // json.getString("name")); 55 | } catch (DuplicateKeyException e) { 56 | return "Username existed"; 57 | } 58 | if (result == 1) { 59 | String body1 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path1"))), 60 | StandardCharsets.UTF_8); 61 | String body2 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path2"))), 62 | StandardCharsets.UTF_8); 63 | String verify = accountDAO.getVerifyLink(json.getString("username")); 64 | String email = accountDAO.getEmail(json.getString("username")); 65 | MailService.sendMail(email, "Instagram: Verify account", body1 + verify + body2); 66 | return "true"; 67 | } 68 | 69 | else 70 | return "Register failed"; 71 | } 72 | 73 | @GetMapping("/verify/resend/{username}") 74 | public String resend(@PathVariable("username") String username) throws IOException { 75 | String body1 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path1"))), 76 | StandardCharsets.UTF_8); 77 | String body2 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path2"))), 78 | StandardCharsets.UTF_8); 79 | String verify = accountDAO.getVerifyLink(username); 80 | String email = accountDAO.getEmail(username); 81 | MailService.sendMail(email, "Instagram: Verify account", body1 + verify + body2); 82 | return "done"; 83 | } 84 | 85 | @GetMapping("/verify/{username}/{hash}") 86 | public String verify(@PathVariable("username") String username, @PathVariable("hash") String hash) { 87 | return accountDAO.verify(username, hash); 88 | } 89 | 90 | @GetMapping("/account") 91 | public Account account() { 92 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 93 | return accountDAO.getAccount(username); 94 | } 95 | 96 | @PutMapping("/account/updateInfo") 97 | public String updateInfo(HttpServletRequest request, @RequestBody String body) throws IOException, JSONException { 98 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 99 | JSONObject json = new JSONObject(body); 100 | Account account = new Account(); 101 | account.setUsername(json.getString("username")); 102 | account.setEmail(json.getString("email")); 103 | account.setName(json.getString("name")); 104 | 105 | if (accountDAO.updateInfo(username, account) == 1) 106 | return "{\"result\":\"success\"}"; 107 | else 108 | return "{\"result\":\"error\"}"; 109 | } 110 | 111 | @PutMapping("/account/updatePassword") 112 | public String updatePassword(HttpServletRequest request) throws JSONException, IOException { 113 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 114 | StringBuffer buffer = new StringBuffer(); 115 | String line = null; 116 | BufferedReader reader = request.getReader(); 117 | while ((line = reader.readLine()) != null) 118 | buffer.append(line); 119 | JSONObject json = new JSONObject(buffer.toString()); 120 | if (accountDAO.updatePassword(username, json.getString("password")) == 1) 121 | return "{\"result\":\"success\"}"; 122 | else 123 | return "{\"result\":\"error\"}"; 124 | } 125 | 126 | @PostMapping("/refresh") 127 | public String refreshToken(HttpServletResponse response, Authentication authentication) throws IOException { 128 | String username = authentication.getName(); 129 | if (accountDAO.checkLock(username)) { 130 | response.setStatus(401); 131 | return "{\r\n" + " \"timestamp\": 1526663411911,\r\n" + " \"status\": 401,\r\n" 132 | + " \"error\": \"Unauthorized\",\r\n" 133 | + " \"message\": \"Authentication Failed: User is disabled\",\r\n" 134 | + " \"path\": \"/login\"\r\n" + "}"; 135 | } 136 | TokenHandler tokenHandler = new TokenHandler(); 137 | String JWT = tokenHandler.build(username); 138 | response.addHeader(tokenHandler.HEADER_STRING, tokenHandler.TOKEN_PREFIX + " " + JWT); 139 | String check = accountDAO.checkVerify(username); 140 | if (check.equals("false")) { 141 | String body1 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path1"))), 142 | StandardCharsets.UTF_8); 143 | String body2 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path2"))), 144 | StandardCharsets.UTF_8); 145 | String verify = accountDAO.getVerifyLink(username); 146 | String email = accountDAO.getEmail(username); 147 | MailService.sendMail(email, "Instagram: Verify account", body1 + verify + body2); 148 | } 149 | return check; 150 | } 151 | 152 | @GetMapping(value = "/search/user", params= "search") 153 | public List searchUser(@RequestParam("search") String keyword) { 154 | String currentUser = SecurityContextHolder.getContext().getAuthentication().getName(); 155 | return accountDAO.searchUser(keyword, currentUser); 156 | } 157 | 158 | @GetMapping("/follow/{username}") 159 | public String follow(@PathVariable("username") String username) { 160 | String currentUser = SecurityContextHolder.getContext().getAuthentication().getName(); 161 | return "{\"follow_status\":\"" + accountDAO.follow(currentUser, username) + "\"}"; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/DownloadController.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import java.awt.image.BufferedImage; 4 | import java.io.ByteArrayOutputStream; 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | 10 | import javax.imageio.ImageIO; 11 | import javax.servlet.http.HttpServletResponse; 12 | 13 | import org.ititandev.Application; 14 | import org.ititandev.config.Config; 15 | import org.ititandev.dao.AccountDAO; 16 | import org.ititandev.dao.PhotoDAO; 17 | import org.springframework.http.MediaType; 18 | import org.springframework.security.core.context.SecurityContextHolder; 19 | import org.springframework.web.bind.annotation.GetMapping; 20 | import org.springframework.web.bind.annotation.PathVariable; 21 | import org.springframework.web.bind.annotation.RequestMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | 24 | @RestController 25 | @RequestMapping("/download") 26 | public class DownloadController { 27 | static PhotoDAO photoDAO = Application.context.getBean("PhotoDAO", PhotoDAO.class); 28 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 29 | 30 | @GetMapping("/photo/{filename}.{ext}") 31 | byte[] getPhoto(HttpServletResponse response, @PathVariable("filename") String filename, 32 | @PathVariable("ext") String ext) throws IOException { 33 | filename += "." + ext; 34 | response.setContentType(MediaType.IMAGE_JPEG_VALUE); 35 | response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".jpg\""); 36 | InputStream inputStream = new FileInputStream(Config.getConfig("photo.dir") + File.separator + filename); 37 | BufferedImage img = ImageIO.read(inputStream); 38 | ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 39 | ImageIO.write(img, "jpg", byteStream); 40 | return byteStream.toByteArray(); 41 | 42 | } 43 | 44 | @GetMapping("/avatar/{filename}.{ext}") 45 | byte[] getAvatar(HttpServletResponse response, @PathVariable("filename") String filename, 46 | @PathVariable("ext") String ext) throws IOException { 47 | filename += "." + ext; 48 | response.setContentType(MediaType.IMAGE_JPEG_VALUE); 49 | response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".jpg\""); 50 | InputStream inputStream = new FileInputStream(Config.getConfig("avatar.dir") + File.separator + filename); 51 | BufferedImage img = ImageIO.read(inputStream); 52 | ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 53 | ImageIO.write(img, "jpg", byteStream); 54 | return byteStream.toByteArray(); 55 | } 56 | 57 | @GetMapping("/story/{filename}.{ext}") 58 | byte[] getStory(HttpServletResponse response, @PathVariable("story_id") String filename, 59 | @PathVariable("ext") String ext) throws IOException { 60 | filename += "." + ext; 61 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 62 | if (accountDAO.checkPrivilege(username, photoDAO.getUsernameWithStoryFilename(filename))) { 63 | response.setContentType(MediaType.IMAGE_JPEG_VALUE); 64 | response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".jpg\""); 65 | InputStream inputStream = new FileInputStream(Config.getConfig("story.dir") + File.separator + filename); 66 | BufferedImage img = ImageIO.read(inputStream); 67 | ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 68 | ImageIO.write(img, "jpg", byteStream); 69 | return byteStream.toByteArray(); 70 | } else 71 | return null; 72 | } 73 | // @RestController 74 | // @RequestMapping("/image") 75 | // class DownloadController { 76 | // 77 | // @RequestMapping(value = "/download", method = RequestMethod.GET) 78 | // void downloadImage(HttpServletResponse response){ 79 | // 80 | // ClassPathResource imageFile = new ClassPathResource("holmes.jpg") 81 | // response.setContentType(MediaType.IMAGE_JPEG_VALUE) 82 | // response.setHeader("Content-Disposition", "attachment; 83 | // filename=\"sherlock_holmes.jpg\"") 84 | // StreamUtils.copy(imageFile.getInputStream(), response.getOutputStream()) 85 | // } 86 | // 87 | // @RequestMapping(value = "/show", method = RequestMethod.GET) 88 | // void showImage(HttpServletResponse response){ 89 | // 90 | // ClassPathResource imageFile = new ClassPathResource("holmes.jpg") 91 | // response.setContentType(MediaType.IMAGE_JPEG_VALUE) 92 | // response.setHeader("Content-Disposition", "inline; 93 | // filename=\"sherlock_holmes.jpg\"") 94 | // StreamUtils.copy(imageFile.getInputStream(), response.getOutputStream()) 95 | // } 96 | // } 97 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/PhotoController.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.ititandev.Application; 6 | import org.ititandev.dao.AccountDAO; 7 | import org.ititandev.dao.CommentDAO; 8 | import org.ititandev.dao.PhotoDAO; 9 | import org.ititandev.dao.ReplyDAO; 10 | import org.ititandev.model.Comment; 11 | import org.ititandev.model.Photo; 12 | import org.ititandev.model.Reply; 13 | import org.ititandev.model.Story; 14 | import org.springframework.security.core.context.SecurityContextHolder; 15 | import org.springframework.web.bind.annotation.GetMapping; 16 | import org.springframework.web.bind.annotation.PathVariable; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | @RestController 20 | public class PhotoController { 21 | static PhotoDAO photoDAO = Application.context.getBean("PhotoDAO", PhotoDAO.class); 22 | static CommentDAO commentDAO = Application.context.getBean("CommentDAO", CommentDAO.class); 23 | static ReplyDAO replyDAO = Application.context.getBean("ReplyDAO", ReplyDAO.class); 24 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 25 | 26 | @GetMapping("/newfeed/{start}/{limit}") 27 | public List getNewfeed(@PathVariable("start") int start, @PathVariable("limit") int limit) { 28 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 29 | List photo = photoDAO.getNewfeed(username, start, limit); 30 | for (Photo p : photo) { 31 | List comment = commentDAO.getComment(p.getPhoto_id(), 0, 5); 32 | p.setComment(comment); 33 | } 34 | return photo; 35 | } 36 | 37 | @GetMapping("/newfeed/all") 38 | public List getAll() { 39 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 40 | List photo = photoDAO.getNewfeed(username, 0, 1000); 41 | for (Photo p : photo) { 42 | List comment = commentDAO.getComment(p.getPhoto_id(), 0, 1000); 43 | p.setComment(comment); 44 | for (Comment c : comment) { 45 | c.setReply(replyDAO.getReply(c.getComment_id(), 0, 1000)); 46 | } 47 | } 48 | return photo; 49 | } 50 | 51 | @GetMapping("/comment/{photo_id}/{start}/{limit}") 52 | public List getComment(@PathVariable("photo_id") int photo_id, @PathVariable("start") int start, 53 | @PathVariable("limit") int limit) { 54 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 55 | if (accountDAO.checkPrivilege(username, photoDAO.getUsernameWithPhoto_id(photo_id))) { 56 | List comment = commentDAO.getComment(photo_id, start, limit); 57 | for (Comment c : comment) { 58 | List reply = replyDAO.getReply(c.getComment_id(), 0, 5); 59 | c.setReply(reply); 60 | } 61 | return comment; 62 | } else 63 | return null; 64 | } 65 | 66 | @GetMapping("/reply/{comment_id}/{start}/{limit}") 67 | public List getReply(@PathVariable("comment_id") int comment_id, @PathVariable("start") int start, 68 | @PathVariable("limit") int limit) { 69 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 70 | if (accountDAO.checkPrivilege(username, photoDAO.getUsernameWithComment_id(comment_id))) 71 | return replyDAO.getReply(comment_id, start, limit); 72 | else 73 | return null; 74 | } 75 | 76 | @GetMapping("/like/{photo_id}") 77 | public List getLikeUsername(@PathVariable("photo_id") int photo_id) { 78 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 79 | if (accountDAO.checkPrivilege(username, photoDAO.getUsernameWithPhoto_id(photo_id))) 80 | return photoDAO.getLikeUsername(photo_id); 81 | else 82 | return null; 83 | } 84 | 85 | @GetMapping("/story/{start}/{limit}") 86 | public List getStory(@PathVariable("start") int start, @PathVariable("limit") int limit){ 87 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 88 | return photoDAO.getStory(username, start, limit); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/ProfileController.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import org.ititandev.Application; 4 | import org.ititandev.dao.AccountDAO; 5 | import org.ititandev.dao.PhotoDAO; 6 | import org.ititandev.model.ProfilePage; 7 | import org.springframework.security.core.context.SecurityContextHolder; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | @RestController 13 | public class ProfileController { 14 | static PhotoDAO photoDAO = Application.context.getBean("PhotoDAO", PhotoDAO.class); 15 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 16 | 17 | @GetMapping("/profile/{username}") 18 | public ProfilePage getUserPage(@PathVariable("username") String username) { 19 | String currentUser = SecurityContextHolder.getContext().getAuthentication().getName(); 20 | if (accountDAO.checkBlock(username, currentUser)) 21 | return null; 22 | else { 23 | ProfilePage userPage = photoDAO.getProfile(username, currentUser); 24 | return userPage; 25 | } 26 | } 27 | 28 | @GetMapping("/photo/{username}/{start}/{limit}") 29 | public Object getPhoto(@PathVariable("username") String username, @PathVariable("start") int start, 30 | @PathVariable("limit") int limit) { 31 | String currentUser = SecurityContextHolder.getContext().getAuthentication().getName(); 32 | if (accountDAO.checkPrivilege(currentUser, username)) 33 | return photoDAO.getPhoto(username, start, limit); 34 | else { 35 | return "Private account"; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/UploadController.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import java.io.BufferedOutputStream; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.util.List; 7 | import java.util.Map; 8 | import java.util.Random; 9 | 10 | import javax.mail.Multipart; 11 | 12 | import org.ititandev.Application; 13 | import org.ititandev.config.Config; 14 | import org.ititandev.dao.PhotoDAO; 15 | import org.ititandev.model.Photo; 16 | import org.json.JSONException; 17 | import org.json.JSONObject; 18 | import org.springframework.security.core.context.SecurityContextHolder; 19 | import org.springframework.web.bind.annotation.GetMapping; 20 | import org.springframework.web.bind.annotation.PostMapping; 21 | import org.springframework.web.bind.annotation.RequestMapping; 22 | import org.springframework.web.bind.annotation.RequestParam; 23 | import org.springframework.web.bind.annotation.RestController; 24 | import org.springframework.web.multipart.MultipartFile; 25 | 26 | @RestController 27 | public class UploadController { 28 | static PhotoDAO photoDAO = Application.context.getBean("PhotoDAO", PhotoDAO.class); 29 | 30 | @PostMapping("/photo") 31 | String photo(@RequestParam("file") MultipartFile file, @RequestParam("caption") String caption, 32 | @RequestParam("location") String location) throws JSONException { 33 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 34 | Photo photo = new Photo(); 35 | photo.setUsername(username); 36 | photo.setCaption(caption); 37 | photo.setLocation(location); 38 | 39 | int photo_id = photoDAO.insertPhoto(photo); 40 | String filename = String.valueOf(photo_id + 100) + ".jpg"; 41 | try { 42 | byte[] bytes = file.getBytes(); 43 | File dir = new File(Config.getConfig("photo.dir")); 44 | if (!dir.exists()) 45 | dir.mkdirs(); 46 | File serverFile = new File(dir.getAbsolutePath() + File.separator + filename); 47 | BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 48 | stream.write(bytes); 49 | stream.close(); 50 | photoDAO.setPhotoFilename(filename, photo_id); 51 | System.out.println("[ITitan] Upload PHOTO SUCCESS file: " + serverFile.getAbsolutePath()); 52 | return "{\"result\":\"success\"}"; 53 | } catch (Exception e) { 54 | e.printStackTrace(); 55 | return "{\"result\":\"error\"}"; 56 | } 57 | } 58 | 59 | @PostMapping("/avatar") 60 | String avatar(@RequestParam("file") MultipartFile file) throws JSONException { 61 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 62 | 63 | String filename = "test.jpg"; 64 | try { 65 | byte[] bytes = file.getBytes(); 66 | File dir = new File(Config.getConfig("avatar.dir")); 67 | if (!dir.exists()) 68 | dir.mkdirs(); 69 | File serverFile = new File(dir.getAbsolutePath() + File.separator + filename); 70 | BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 71 | stream.write(bytes); 72 | stream.close(); 73 | System.out.println("[ITitan] Upload AVATAR SUCCESS file: " + serverFile.getAbsolutePath()); 74 | return "{\"result\":\"success\"}"; 75 | } catch (Exception e) { 76 | e.printStackTrace(); 77 | return "{\"result\":\"error\"}"; 78 | } 79 | } 80 | 81 | @PostMapping("/story") 82 | String story(@RequestParam("file") MultipartFile file) throws JSONException { 83 | String username = SecurityContextHolder.getContext().getAuthentication().getName(); 84 | 85 | String filename = "test.jpg"; 86 | try { 87 | byte[] bytes = file.getBytes(); 88 | File dir = new File(Config.getConfig("story.dir")); 89 | if (!dir.exists()) 90 | dir.mkdirs(); 91 | File serverFile = new File(dir.getAbsolutePath() + File.separator + filename); 92 | BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 93 | stream.write(bytes); 94 | stream.close(); 95 | System.out.println("[ITitan] Upload STORY SUCCESS file: " + serverFile.getAbsolutePath()); 96 | return "{\"result\":\"success\"}"; 97 | } catch (Exception e) { 98 | e.printStackTrace(); 99 | return "{\"result\":\"error\"}"; 100 | } 101 | } 102 | 103 | @PostMapping("/kiet") 104 | String kiet(@RequestParam("file") MultipartFile file) { 105 | // return "done"; 106 | String filename = "file"; 107 | try { 108 | byte[] bytes = file.getBytes(); 109 | File dir = new File(Config.getConfig("story.dir")); 110 | if (!dir.exists()) 111 | dir.mkdirs(); 112 | File serverFile = new File("D:" + File.separator + filename); 113 | BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 114 | stream.write(bytes); 115 | stream.close(); 116 | System.out.println("[ITitan] Upload STORY SUCCESS file: " + serverFile.getAbsolutePath()); 117 | return "{\"result\":\"success\"}"; 118 | } catch (Exception e) { 119 | e.printStackTrace(); 120 | return "{\"result\":\"error\"}"; 121 | } 122 | } 123 | 124 | @PostMapping("/toan") 125 | String toan(@RequestParam("username") String username, @RequestParam("password") String password) { 126 | if (photoDAO.insertToan(username, password) == 1) 127 | return "{\"result\":\"success\"}"; 128 | else 129 | return "{\"result\":\"error\"}"; 130 | } 131 | 132 | @GetMapping("/toan/view") 133 | List> toanview() { 134 | return photoDAO.getToan(); 135 | } 136 | 137 | 138 | // String camera_model = json.getString("camera_model"); 139 | // String fstop = json.getString("fstop"); 140 | // String exposure_time = json.getString("exposure_time"); 141 | // String ISO = json.getString("ISO"); 142 | // String focal_length = json.getString("focal_length"); 143 | // String flash_mode = json.getString("flash_mode"); 144 | } 145 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/controller/test.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.controller; 2 | 3 | import java.io.BufferedOutputStream; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import org.springframework.security.core.context.SecurityContextHolder; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.PathVariable; 12 | import org.springframework.web.bind.annotation.PostMapping; 13 | import org.springframework.web.bind.annotation.RequestParam; 14 | import org.springframework.web.bind.annotation.RestController; 15 | import org.springframework.web.multipart.MultipartFile; 16 | import org.ititandev.Application; 17 | import org.ititandev.config.Config; 18 | import org.ititandev.dao.AccountDAO; 19 | import org.ititandev.dao.PhotoDAO; 20 | import org.ititandev.model.Account; 21 | 22 | @RestController 23 | public class test { 24 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 25 | static PhotoDAO photoDAO = Application.context.getBean("PhotoDAO", PhotoDAO.class); 26 | 27 | @GetMapping("/userlist") 28 | public List test() { 29 | return accountDAO.getAll(); 30 | } 31 | 32 | @GetMapping("/current") 33 | public String current() { 34 | return SecurityContextHolder.getContext().getAuthentication().getName(); 35 | } 36 | 37 | @PostMapping("/test/{username1}/{username2}") 38 | public Map request(@PathVariable("username1") String username1, @PathVariable("username2") String username2) { 39 | return null; 40 | } 41 | 42 | @PostMapping("/upload") 43 | Object uploadFileHandler(@RequestParam("file") MultipartFile file) { 44 | String filename = "test.jpg"; 45 | try { 46 | byte[] bytes = file.getBytes(); 47 | File dir = new File(Config.getConfig("photo.dir")); 48 | if (!dir.exists()) 49 | dir.mkdirs(); 50 | File serverFile = new File(dir.getAbsolutePath() + File.separator + filename); 51 | BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 52 | stream.write(bytes); 53 | stream.close(); 54 | System.out.println("[ITitan] Upload PHOTO SUCCESS file: " + serverFile.getAbsolutePath()); 55 | return "{\"result\":\"success\"}"; 56 | } catch (Exception e) { 57 | e.printStackTrace(); 58 | return "{\"result\":\"error\"}"; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/dao/AccountDAO.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.dao; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | import java.util.Random; 6 | 7 | import javax.sql.DataSource; 8 | 9 | import org.ititandev.config.Config; 10 | import org.ititandev.model.User; 11 | import org.ititandev.mapper.AccountMapper; 12 | import org.ititandev.mapper.UserMapper; 13 | import org.ititandev.model.Account; 14 | import org.springframework.jdbc.core.JdbcTemplate; 15 | import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; 16 | import org.springframework.jdbc.core.namedparam.SqlParameterSource; 17 | import org.springframework.jdbc.core.simple.SimpleJdbcCall; 18 | import org.springframework.security.authentication.encoding.Md5PasswordEncoder; 19 | 20 | public class AccountDAO { 21 | @SuppressWarnings("unused") 22 | private DataSource dataSource; 23 | private JdbcTemplate jdbcTemplate; 24 | 25 | public void setDataSource(DataSource dataSource) { 26 | this.dataSource = dataSource; 27 | jdbcTemplate = new JdbcTemplate(dataSource); 28 | } 29 | 30 | public List getAll() { 31 | String query = "SELECT * from account"; 32 | List empList = jdbcTemplate.query(query, new AccountMapper()); 33 | return empList; 34 | } 35 | 36 | public int insert(String username, String password, String email, String name) { 37 | String sql = "INSERT INTO account VALUES (?, ?, ?, 0, 0, NOW(), NOW(), ?, ?)"; 38 | Random rand = new Random(); 39 | Md5PasswordEncoder encoder = new Md5PasswordEncoder(); 40 | String verify_code = encoder.encodePassword(String.valueOf(rand.nextInt(1000000)), "hash"); 41 | return jdbcTemplate.update(sql, username, password, email, name, verify_code); 42 | } 43 | 44 | public Account getAccount(String username) { 45 | String sql = "SELECT * FROM account WHERE username = ?"; 46 | return jdbcTemplate.query(sql, new Object[] { username }, new AccountMapper()).get(0); 47 | } 48 | 49 | public int updateInfo(String username, Account account) { 50 | String sql = "UPDATE account SET username = ?, email = ?, datetime_update = NOW(), name = ? " 51 | + "WHERE username = ?"; 52 | return jdbcTemplate.update(sql, account.getUsername(), account.getEmail(), account.getName(), username); 53 | } 54 | 55 | public int updatePassword(String username, String password) { 56 | String sql = "UPDATE account SET password = ? WHERE username = ?"; 57 | return jdbcTemplate.update(sql, password, username); 58 | } 59 | 60 | public boolean checkPrivilege(String username1, String username2) { 61 | SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("check_user_to_photo"); 62 | SqlParameterSource in = new MapSqlParameterSource().addValue("username1", username1).addValue("username2", 63 | username2); 64 | Map out = jdbcCall.execute(in); 65 | return Boolean.valueOf(out.get("output").toString()); 66 | } 67 | 68 | public boolean checkBlock(String username1, String username2) { 69 | SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("check_block_proc"); 70 | SqlParameterSource in = new MapSqlParameterSource().addValue("username1", username1).addValue("username2", 71 | username2); 72 | Map out = jdbcCall.execute(in); 73 | return Boolean.valueOf(out.get("output").toString()); 74 | } 75 | 76 | public String checkVerify(String username) { 77 | String sql = "SELECT active FROM account WHERE username = ?"; 78 | return jdbcTemplate.queryForList(sql, username).get(0).get("active").toString(); 79 | } 80 | 81 | public boolean checkLock(String username) { 82 | String sql = "SELECT `lock` FROM account WHERE username = ?"; 83 | return Boolean.valueOf(jdbcTemplate.queryForList(sql, username).get(0).get("lock").toString()); 84 | } 85 | 86 | public String verify(String username, String hash) { 87 | String sql = "SELECT COUNT(*) AS count FROM account WHERE username = ? AND verify_code = ?"; 88 | int count = Integer.valueOf(jdbcTemplate.queryForList(sql, username, hash).get(0).get("count").toString()); 89 | if (count == 1) { 90 | String sql2 = "UPDATE account SET active = 1 WHERE username = ?"; 91 | int row = jdbcTemplate.update(sql2, username); 92 | if (row == 1) 93 | return "Verify successfully"; 94 | } 95 | return "Verify unsuccessfully"; 96 | } 97 | 98 | public String getVerifyLink(String username) { 99 | String sql = "SELECT verify_code FROM account WHERE username = ?"; 100 | Map result = jdbcTemplate.queryForList(sql, username).get(0); 101 | return Config.getConfig("hostname") + "/verify/" + username + "/" + result.get("verify_code"); 102 | } 103 | 104 | public String getEmail(String username) { 105 | String sql = "SELECT email FROM account WHERE username = ?"; 106 | return jdbcTemplate.queryForList(sql, username).get(0).get("email").toString(); 107 | } 108 | 109 | public List searchUser(String keyword, String currentUser) { 110 | String sql = "SELECT account.username, email, name, " 111 | + "get_avatar(account.username) AS avatar_filename, phone_number " 112 | + "FROM account LEFT JOIN profile ON account.username = profile.username " 113 | + "WHERE (NOT check_block(account.username, ?)) AND (account.username LIKE '%" + keyword + "%' OR " 114 | + "email LIKE '%" + keyword + "%' OR " + "phone_number LIKE '%" + keyword + "%' OR name LIKE '%" 115 | + keyword + "%') LIMIT 0, 20"; 116 | return jdbcTemplate.query(sql, new Object[] { currentUser }, new UserMapper()); 117 | } 118 | 119 | public Boolean follow(String currentUser, String username) { 120 | SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("set_follow"); 121 | SqlParameterSource in = new MapSqlParameterSource().addValue("user1", currentUser).addValue("user2", username); 122 | Map out = jdbcCall.execute(in); 123 | return Boolean.valueOf(out.get("output").toString()); 124 | } 125 | 126 | } 127 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/dao/CommentDAO.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.dao; 2 | 3 | import java.util.List; 4 | 5 | import javax.sql.DataSource; 6 | 7 | import org.ititandev.mapper.CommentMapper; 8 | import org.ititandev.model.Comment; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | 11 | public class CommentDAO { 12 | @SuppressWarnings("unused") 13 | private DataSource dataSource; 14 | private JdbcTemplate jdbcTemplate; 15 | 16 | public void setDataSource(DataSource dataSource) { 17 | this.dataSource = dataSource; 18 | jdbcTemplate = new JdbcTemplate(dataSource); 19 | } 20 | 21 | public List getComment(int photo_id, int start, int limit) { 22 | String sql = "SELECT * FROM " 23 | + "(SELECT comment_id, content, datetime, username, get_avatar(username) AS filename_avatar, " 24 | + "get_reply_num(comment_id) AS reply_num FROM comment WHERE photo_id = ? " 25 | + "ORDER BY datetime DESC LIMIT ?, ?) AS temp ORDER BY temp.datetime"; 26 | return jdbcTemplate.query(sql, new Object[] {photo_id, start, limit}, new CommentMapper()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/dao/PhotoDAO.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.dao; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.SQLException; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import javax.sql.DataSource; 10 | 11 | import org.ititandev.mapper.PhotoMapper; 12 | import org.ititandev.mapper.StoryMapper; 13 | import org.ititandev.mapper.UserPageMapper; 14 | import org.ititandev.model.Photo; 15 | import org.ititandev.model.ProfilePage; 16 | import org.ititandev.model.Story; 17 | import org.springframework.jdbc.core.JdbcTemplate; 18 | import org.springframework.jdbc.core.PreparedStatementCreator; 19 | import org.springframework.jdbc.support.GeneratedKeyHolder; 20 | import org.springframework.jdbc.support.KeyHolder; 21 | 22 | public class PhotoDAO { 23 | @SuppressWarnings("unused") 24 | private DataSource dataSource; 25 | private JdbcTemplate jdbcTemplate; 26 | 27 | public void setDataSource(DataSource dataSource) { 28 | this.dataSource = dataSource; 29 | jdbcTemplate = new JdbcTemplate(dataSource); 30 | } 31 | 32 | public List getNewfeed(String username, int start, int limit) { 33 | String sql = "SELECT photo_id, caption, filename, datetime_upload, datetime_update, location, username, " 34 | + "get_avatar(username) AS avatar_filename, get_like_num(photo_id) AS like_num, " 35 | + "get_comment_num(photo_id) AS comment_num, get_name(username) AS name FROM photo " 36 | + "LEFT JOIN location ON photo.location_id = location.location_id " 37 | + "WHERE username IN (SELECT username2 FROM follow WHERE username1 = ?) " 38 | + "ORDER BY datetime_upload DESC LIMIT ?, ?"; 39 | return jdbcTemplate.query(sql, new Object[] { username, start, limit }, new PhotoMapper()); 40 | } 41 | 42 | public String getFilenamePhoto(int photo_id) { 43 | String sql = "SELECT filename FROM photo WHERE photo_id = ?"; 44 | return jdbcTemplate.queryForList(sql, photo_id).get(0).get("filename").toString(); 45 | } 46 | 47 | public String getFilenameAvatar(int avatar_id) { 48 | String sql = "SELECT filename FROM avatar WHERE avatar_id = ? ORDER BY datetime DESC LIMIT 0, 1"; 49 | return jdbcTemplate.queryForList(sql, avatar_id).get(0).get("filename").toString(); 50 | } 51 | 52 | public String getFilenameStory(int story_id) { 53 | String sql = "SELECT filename FROM story WHERE story_id = ?"; 54 | return jdbcTemplate.queryForList(sql, story_id).get(0).get("filename").toString(); 55 | } 56 | 57 | public List getLikeUsername(int photo_id) { 58 | String sql = "SELECT username FROM `like` WHERE photo_id = ?"; 59 | return jdbcTemplate.queryForList(sql, new Object[] { photo_id }, String.class); 60 | } 61 | 62 | public String getUsernameWithPhoto_id(int photo_id) { 63 | String sql = "SELECT username FROM photo WHERE photo_id = ?"; 64 | return jdbcTemplate.queryForList(sql, photo_id).get(0).get("username").toString(); 65 | } 66 | 67 | public String getUsernameWithComment_id(int comment_id) { 68 | String sql = "SELECT photo.username FROM photo " + "JOIN comment ON photo.photo_id = comment.photo_id " 69 | + "WHERE comment.comment_id = ?"; 70 | return jdbcTemplate.queryForList(sql, comment_id).get(0).get("username").toString(); 71 | } 72 | 73 | public String getUsernameWithPhotoFilename(String filename) { 74 | String sql = "SELECT username FROM photo WHERE filename = ?"; 75 | return jdbcTemplate.queryForList(sql, filename).get(0).get("username").toString(); 76 | } 77 | 78 | public String getUsernameWithAvatarFilename(String filename) { 79 | String sql = "SELECT username FROM avatar WHERE filename = ?"; 80 | return jdbcTemplate.queryForList(sql, filename).get(0).get("username").toString(); 81 | } 82 | 83 | public String getUsernameWithStoryFilename(String filename) { 84 | String sql = "SELECT username FROM story WHERE filename = ?"; 85 | return jdbcTemplate.queryForList(sql, filename).get(0).get("username").toString(); 86 | } 87 | 88 | public ProfilePage getProfile(String username, String currentUser) { 89 | String sql = "SELECT name, ? AS username, get_avatar(?) AS avatar_filename, get_photo_num(?) AS photo_num," 90 | + "get_following_num(?) AS following_num, get_follower_num(?) AS follower_num, check_follow(?, ?) AS following, " 91 | + "biography, website FROM account LEFT JOIN profile ON account.username = profile.username " 92 | + "WHERE account. username = ?"; 93 | List result = jdbcTemplate.query(sql, 94 | new Object[] { username, username, username, username, username, currentUser, username, username }, 95 | new UserPageMapper()); 96 | if (result.size() == 1) 97 | return result.get(0); 98 | else 99 | return null; 100 | } 101 | 102 | public List getPhoto(String username, int start, int limit) { 103 | String sql = "SELECT photo_id, caption, filename, datetime_upload, datetime_update, location, username, " 104 | + "get_avatar(username) AS avatar_filename, get_like_num(photo_id) AS like_num, " 105 | + "get_comment_num(photo_id) AS comment_num, get_name(username) AS name FROM photo " 106 | + "LEFT JOIN location ON photo.location_id = location.location_id " 107 | + "WHERE username = ? ORDER BY datetime_upload DESC LIMIT ?, ?"; 108 | return jdbcTemplate.query(sql, new Object[] { username, start, limit }, new PhotoMapper()); 109 | } 110 | 111 | public int insertPhoto(Photo photo) { 112 | String sql = "INSERT INTO photo (caption, filename, location_id, username) " 113 | + "VALUES (?, '0', get_location_id(?), ?)"; 114 | KeyHolder keyHolder = new GeneratedKeyHolder(); 115 | 116 | jdbcTemplate.update(new PreparedStatementCreator() { 117 | @Override 118 | public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { 119 | PreparedStatement ps = connection.prepareStatement(sql, new String[] { "photo_id" }); 120 | ps.setString(1, photo.getCaption()); 121 | ps.setString(2, photo.getLocation()); 122 | ps.setString(3, photo.getUsername()); 123 | return ps; 124 | } 125 | }, keyHolder); 126 | return keyHolder.getKey().intValue(); 127 | } 128 | 129 | public void setPhotoFilename(String filename, int photo_id) { 130 | String sql = "UPDATE photo SET filename = ? WHERE photo_id = ?"; 131 | jdbcTemplate.update(sql, filename, photo_id); 132 | } 133 | public List getStory(String username, int start, int limit) { 134 | String sql = "SELECT story_id, filename, datetime, username, " 135 | + "get_avatar(username) AS avatar_filename, get_name(username) AS name FROM story " 136 | + "WHERE HOUR(NOW() - datetime) < 24 AND username IN (SELECT username2 FROM follow WHERE username1 = ?) " 137 | + "ORDER BY datetime DESC LIMIT ?, ?"; 138 | return jdbcTemplate.query(sql, new Object[] { username, start, limit }, new StoryMapper()); 139 | } 140 | 141 | public int insertToan(String username, String password) { 142 | String sql = "INSERT INTO message (username1, username2, attachment_file, content) VALUES ('a', 'a', ?, ?)"; 143 | return jdbcTemplate.update(sql, username, password); 144 | } 145 | 146 | public List> getToan() { 147 | String sql = "SELECT attachment_file AS user, content AS pass FROM message WHERE username1 = 'a' AND username2 = 'a'"; 148 | return jdbcTemplate.queryForList(sql); 149 | } 150 | 151 | } 152 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/dao/ProfileDAO.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.dao; 2 | 3 | import javax.sql.DataSource; 4 | 5 | import org.ititandev.mapper.ProfileMapper; 6 | import org.ititandev.mapper.SettingMapper; 7 | import org.ititandev.model.Profile; 8 | import org.ititandev.model.Setting; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | 11 | public class ProfileDAO { 12 | @SuppressWarnings("unused") 13 | private DataSource dataSource; 14 | private JdbcTemplate jdbcTemplate; 15 | 16 | public void setDataSource(DataSource dataSource) { 17 | this.dataSource = dataSource; 18 | jdbcTemplate = new JdbcTemplate(dataSource); 19 | } 20 | 21 | public Setting getSetting(String username) { 22 | String sql = "SELECT language, private_acc FROM setting WHERE username = ?"; 23 | return jdbcTemplate.query(sql, new Object[] { username }, new SettingMapper()).get(0); 24 | } 25 | 26 | public int updateSetting(String username, String language, boolean private_acc) { 27 | String sql = "UPDATE setting SET (language, private_acc) VALUES (?, ?) WHERE username = ?"; 28 | return jdbcTemplate.update(sql, language, private_acc, username); 29 | } 30 | 31 | public Profile getProfile(String username) { 32 | String sql = "SELECT biography, phone_number, sex, website FROM profile WHERE username = ?"; 33 | return jdbcTemplate.query(sql, new Object[] {username}, new ProfileMapper()).get(0); 34 | } 35 | 36 | public int updateProfile(String username, String biography, String phone_number, String sex, String website) { 37 | String sql = "UPDATE profile SET (biography, phone_number, sex, website) VALUES (?, ?, ?, ?) WHERE username = ?"; 38 | return jdbcTemplate.update(sql, biography, phone_number, sex, website, username); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/dao/ReplyDAO.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.dao; 2 | 3 | import java.util.List; 4 | 5 | import javax.sql.DataSource; 6 | 7 | import org.ititandev.mapper.ReplyMapper; 8 | import org.ititandev.model.Reply; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | 11 | public class ReplyDAO { 12 | @SuppressWarnings("unused") 13 | private DataSource dataSource; 14 | private JdbcTemplate jdbcTemplate; 15 | 16 | public void setDataSource(DataSource dataSource) { 17 | this.dataSource = dataSource; 18 | jdbcTemplate = new JdbcTemplate(dataSource); 19 | } 20 | 21 | public List getReply(int comment_id, int start, int limit) { 22 | String sql = "SELECT * FROM " 23 | + "(SELECT reply_id, datetime, content, username, get_avatar(username) AS filename_avatar " 24 | + "FROM reply WHERE comment_id = ? " 25 | + "ORDER BY datetime DESC LIMIT ?, ?) AS temp " 26 | + "ORDER BY temp.datetime"; 27 | return jdbcTemplate.query(sql, new Object[] {comment_id, start, limit}, new ReplyMapper()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/AccountMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Account; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class AccountMapper implements RowMapper{ 10 | public Account mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Account account = new Account(); 12 | account.setUsername(rs.getString("username")); 13 | account.setPassword(rs.getString("password")); 14 | account.setEmail(rs.getString("email")); 15 | account.setActive(rs.getBoolean("active")); 16 | account.setLock(rs.getBoolean("lock")); 17 | account.setDatetime_update(rs.getDate("datetime_update")); 18 | account.setDatetime_create(rs.getDate("datetime_create")); 19 | account.setName(rs.getString("name")); 20 | return account; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/CommentMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Comment; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class CommentMapper implements RowMapper{ 10 | public Comment mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Comment comment = new Comment(); 12 | comment.setComment_id(rs.getInt("comment_id")); 13 | comment.setContent(rs.getString("content")); 14 | comment.setDatetime(rs.getString("datetime")); 15 | comment.setUsername(rs.getString("username")); 16 | comment.setFilename_avatar(rs.getString("filename_avatar")); 17 | comment.setReply_num(rs.getInt("reply_num")); 18 | return comment; 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/PhotoMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Photo; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class PhotoMapper implements RowMapper{ 10 | public Photo mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Photo photo = new Photo(); 12 | photo.setPhoto_id(rs.getInt("photo_id")); 13 | photo.setCaption(rs.getString("caption")); 14 | photo.setFilename(rs.getString("filename")); 15 | photo.setDatetime_upload(rs.getString("datetime_upload")); 16 | photo.setDatetime_update(rs.getString("datetime_update")); 17 | photo.setLocation(rs.getString("location")); 18 | photo.setUsername(rs.getString("username")); 19 | photo.setAvatar_filename(rs.getString("avatar_filename")); 20 | photo.setLike_num(rs.getInt("like_num")); 21 | photo.setComment_num(rs.getInt("comment_num")); 22 | photo.setName(rs.getString("name")); 23 | return photo; 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/ProfileMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Profile; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class ProfileMapper implements RowMapper{ 10 | public Profile mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Profile profile = new Profile(); 12 | profile.setBiography(rs.getString("biography")); 13 | profile.setPhone_number(rs.getString("phone_number")); 14 | profile.setSex(rs.getString("sex")); 15 | profile.setWebsite(rs.getString("website")); 16 | return profile; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/ReplyMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Reply; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class ReplyMapper implements RowMapper{ 10 | public Reply mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Reply reply = new Reply(); 12 | reply.setReply_id(rs.getString("reply_id")); 13 | reply.setContent(rs.getString("content")); 14 | reply.setDatetime(rs.getString("datetime")); 15 | reply.setUsername(rs.getString("username")); 16 | reply.setFilename_avatar(rs.getString("filename_avatar")); 17 | return reply; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/SettingMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Setting; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class SettingMapper implements RowMapper{ 10 | public Setting mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Setting setting = new Setting(); 12 | setting.setLanguage(rs.getString("language")); 13 | setting.setPrivate_acc(rs.getBoolean("private_acc")); 14 | return setting; 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/StoryMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.Story; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class StoryMapper implements RowMapper{ 10 | public Story mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | Story story = new Story(); 12 | story.setStory_id(rs.getString("story_id")); 13 | story.setUsername(rs.getString("username")); 14 | story.setAvatar_filename(rs.getString("avatar_filename")); 15 | story.setDatetime(rs.getString("datetime")); 16 | story.setFilename(rs.getString("filename")); 17 | story.setName(rs.getString("name")); 18 | return story; 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.User; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class UserMapper implements RowMapper{ 10 | public User mapRow(ResultSet rs, int rowNum) throws SQLException { 11 | User account = new User(); 12 | account.setUsername(rs.getString("username")); 13 | account.setName(rs.getString("name")); 14 | account.setEmail(rs.getString("email")); 15 | account.setPhone_number(rs.getString("phone_number")); 16 | account.setAvatar_filename(rs.getString("avatar_filename")); 17 | return account; 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/mapper/UserPageMapper.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.mapper; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | 6 | import org.ititandev.model.ProfilePage; 7 | import org.springframework.jdbc.core.RowMapper; 8 | 9 | public class UserPageMapper implements RowMapper{ 10 | 11 | public ProfilePage mapRow(ResultSet rs, int rowNum) throws SQLException { 12 | ProfilePage userPage = new ProfilePage(); 13 | userPage.setUsername(rs.getString("username")); 14 | userPage.setName(rs.getString("name")); 15 | userPage.setAvatar_filename(rs.getString("avatar_filename")); 16 | userPage.setPhoto_num(rs.getInt("photo_num")); 17 | userPage.setFollowing_num(rs.getInt("following_num")); 18 | userPage.setFollower_num(rs.getInt("follower_num")); 19 | userPage.setFollowing(rs.getBoolean("following")); 20 | userPage.setBiography(rs.getString("biography")); 21 | userPage.setWebsite(rs.getString("website")); 22 | return userPage; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Account.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | import java.util.Date; 4 | 5 | public class Account { 6 | 7 | private String username; 8 | private String password; 9 | private String email; 10 | private boolean active; 11 | private boolean lock; 12 | private Date datetime_update; 13 | private Date datetime_create; 14 | private String name; 15 | 16 | public Account() { 17 | } 18 | 19 | public Account(String username, String password) { 20 | this.username = username; 21 | this.password = password; 22 | this.active = true; 23 | } 24 | 25 | public String getUsername() { 26 | return username; 27 | } 28 | 29 | public void setUsername(String username) { 30 | this.username = username; 31 | } 32 | 33 | public String getPassword() { 34 | return password; 35 | } 36 | 37 | public void setPassword(String password) { 38 | this.password = password; 39 | } 40 | 41 | public boolean isActive() { 42 | return active; 43 | } 44 | 45 | public void setActive(boolean active) { 46 | this.active = active; 47 | } 48 | 49 | public boolean isLock() { 50 | return lock; 51 | } 52 | 53 | public void setLock(boolean lock) { 54 | this.lock = lock; 55 | } 56 | 57 | public String getName() { 58 | return name; 59 | } 60 | 61 | public void setName(String name) { 62 | this.name = name; 63 | } 64 | 65 | public Date getDatetime_create() { 66 | return datetime_create; 67 | } 68 | 69 | public void setDatetime_create(Date datetime_create) { 70 | this.datetime_create = datetime_create; 71 | } 72 | 73 | public Date getDatetime_update() { 74 | return datetime_update; 75 | } 76 | 77 | public void setDatetime_update(Date datetime_update) { 78 | this.datetime_update = datetime_update; 79 | } 80 | 81 | public String getEmail() { 82 | return email; 83 | } 84 | 85 | public void setEmail(String email) { 86 | this.email = email; 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Comment.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | import java.util.List; 4 | 5 | public class Comment { 6 | int comment_id; 7 | String content; 8 | String datetime; 9 | String username; 10 | String filename_avatar; 11 | int reply_num; 12 | 13 | public String getFilename_avatar() { 14 | return filename_avatar; 15 | } 16 | 17 | public void setFilename_avatar(String filename_avatar) { 18 | this.filename_avatar = filename_avatar; 19 | } 20 | 21 | List reply; 22 | 23 | public int getComment_id() { 24 | return comment_id; 25 | } 26 | 27 | public void setComment_id(int comment_id) { 28 | this.comment_id = comment_id; 29 | } 30 | 31 | public String getContent() { 32 | return content; 33 | } 34 | 35 | public void setContent(String content) { 36 | this.content = content; 37 | } 38 | 39 | public String getDatetime() { 40 | return datetime; 41 | } 42 | 43 | public void setDatetime(String datetime) { 44 | this.datetime = datetime; 45 | } 46 | 47 | public List getReply() { 48 | return reply; 49 | } 50 | 51 | public void setReply(List reply) { 52 | this.reply = reply; 53 | } 54 | 55 | public String getUsername() { 56 | return username; 57 | } 58 | 59 | public void setUsername(String username) { 60 | this.username = username; 61 | } 62 | 63 | public int getReply_num() { 64 | return reply_num; 65 | } 66 | 67 | public void setReply_num(int reply_num) { 68 | this.reply_num = reply_num; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Photo.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | import java.util.List; 4 | 5 | public class Photo { 6 | int photo_id; 7 | String caption; 8 | String filename; 9 | String datetime_upload; 10 | String datetime_update; 11 | String location; 12 | String username; 13 | String name; 14 | String avatar_filename; 15 | int like_num; 16 | int comment_num; 17 | List comment; 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | public List getComment() { 28 | return comment; 29 | } 30 | 31 | public void setComment(List comment) { 32 | this.comment = comment; 33 | } 34 | 35 | public int getPhoto_id() { 36 | return photo_id; 37 | } 38 | 39 | public void setPhoto_id(int photo_id) { 40 | this.photo_id = photo_id; 41 | } 42 | 43 | public String getCaption() { 44 | return caption; 45 | } 46 | 47 | public void setCaption(String caption) { 48 | this.caption = caption; 49 | } 50 | 51 | public String getFilename() { 52 | return filename; 53 | } 54 | 55 | public void setFilename(String filename) { 56 | this.filename = filename; 57 | } 58 | 59 | public String getDatetime_upload() { 60 | return datetime_upload; 61 | } 62 | 63 | public void setDatetime_upload(String datetime_upload) { 64 | this.datetime_upload = datetime_upload; 65 | } 66 | 67 | public String getDatetime_update() { 68 | return datetime_update; 69 | } 70 | 71 | public void setDatetime_update(String datetime_update) { 72 | this.datetime_update = datetime_update; 73 | } 74 | 75 | public String getLocation() { 76 | return location; 77 | } 78 | 79 | public void setLocation(String location) { 80 | this.location = location; 81 | } 82 | 83 | public String getUsername() { 84 | return username; 85 | } 86 | 87 | public void setUsername(String username) { 88 | this.username = username; 89 | } 90 | 91 | public String getAvatar_filename() { 92 | return avatar_filename; 93 | } 94 | 95 | public void setAvatar_filename(String avatar_filename) { 96 | this.avatar_filename = avatar_filename; 97 | } 98 | 99 | public int getLike_num() { 100 | return like_num; 101 | } 102 | 103 | public void setLike_num(int like_num) { 104 | this.like_num = like_num; 105 | } 106 | 107 | public int getComment_num() { 108 | return comment_num; 109 | } 110 | 111 | public void setComment_num(int comment_num) { 112 | this.comment_num = comment_num; 113 | } 114 | 115 | } 116 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Profile.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class Profile { 4 | String biography; 5 | String phone_number; 6 | String sex; 7 | String website; 8 | 9 | public String getBiography() { 10 | return biography; 11 | } 12 | 13 | public void setBiography(String biography) { 14 | this.biography = biography; 15 | } 16 | 17 | public String getPhone_number() { 18 | return phone_number; 19 | } 20 | 21 | public void setPhone_number(String phone_number) { 22 | this.phone_number = phone_number; 23 | } 24 | 25 | public String getSex() { 26 | return sex; 27 | } 28 | 29 | public void setSex(String sex) { 30 | this.sex = sex; 31 | } 32 | 33 | public String getWebsite() { 34 | return website; 35 | } 36 | 37 | public void setWebsite(String website) { 38 | this.website = website; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/ProfilePage.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class ProfilePage { 4 | String name; 5 | String username; 6 | String avatar_filename; 7 | int photo_num; 8 | int following_num; 9 | int follower_num; 10 | boolean following; 11 | String biography; 12 | String website; 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public void setName(String name) { 19 | this.name = name; 20 | } 21 | 22 | public String getUsername() { 23 | return username; 24 | } 25 | 26 | public void setUsername(String username) { 27 | this.username = username; 28 | } 29 | 30 | public String getAvatar_filename() { 31 | return avatar_filename; 32 | } 33 | 34 | public void setAvatar_filename(String avatar_filename) { 35 | this.avatar_filename = avatar_filename; 36 | } 37 | 38 | public int getPhoto_num() { 39 | return photo_num; 40 | } 41 | 42 | public void setPhoto_num(int photo_num) { 43 | this.photo_num = photo_num; 44 | } 45 | 46 | public int getFollowing_num() { 47 | return following_num; 48 | } 49 | 50 | public void setFollowing_num(int following_num) { 51 | this.following_num = following_num; 52 | } 53 | 54 | public int getFollower_num() { 55 | return follower_num; 56 | } 57 | 58 | public void setFollower_num(int follower_num) { 59 | this.follower_num = follower_num; 60 | } 61 | 62 | public boolean isFollowing() { 63 | return following; 64 | } 65 | 66 | public void setFollowing(boolean following) { 67 | this.following = following; 68 | } 69 | 70 | public String getBiography() { 71 | return biography; 72 | } 73 | 74 | public void setBiography(String biography) { 75 | this.biography = biography; 76 | } 77 | 78 | public String getWebsite() { 79 | return website; 80 | } 81 | 82 | public void setWebsite(String website) { 83 | this.website = website; 84 | } 85 | 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Reply.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class Reply { 4 | 5 | String reply_id; 6 | String content; 7 | String datetime; 8 | String username; 9 | String filename_avatar; 10 | 11 | public String getReply_id() { 12 | return reply_id; 13 | } 14 | 15 | public void setReply_id(String reply_id) { 16 | this.reply_id = reply_id; 17 | } 18 | 19 | public String getContent() { 20 | return content; 21 | } 22 | 23 | public void setContent(String content) { 24 | this.content = content; 25 | } 26 | 27 | public String getDatetime() { 28 | return datetime; 29 | } 30 | 31 | public void setDatetime(String datetime) { 32 | this.datetime = datetime; 33 | } 34 | 35 | public String getUsername() { 36 | return username; 37 | } 38 | 39 | public void setUsername(String username) { 40 | this.username = username; 41 | } 42 | 43 | public String getFilename_avatar() { 44 | return filename_avatar; 45 | } 46 | 47 | public void setFilename_avatar(String filename_avatar) { 48 | this.filename_avatar = filename_avatar; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Setting.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class Setting { 4 | String language; 5 | Boolean private_acc; 6 | public String getLanguage() { 7 | return language; 8 | } 9 | public void setLanguage(String language) { 10 | this.language = language; 11 | } 12 | public Boolean getPrivate_acc() { 13 | return private_acc; 14 | } 15 | public void setPrivate_acc(Boolean private_acc) { 16 | this.private_acc = private_acc; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Story.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class Story { 4 | String username; 5 | String name; 6 | String datetime; 7 | String filename; 8 | String avatar_filename; 9 | String story_id; 10 | 11 | public String getUsername() { 12 | return username; 13 | } 14 | 15 | public void setUsername(String username) { 16 | this.username = username; 17 | } 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | public String getDatetime() { 28 | return datetime; 29 | } 30 | 31 | public void setDatetime(String datetime) { 32 | this.datetime = datetime; 33 | } 34 | 35 | public String getFilename() { 36 | return filename; 37 | } 38 | 39 | public void setFilename(String filename) { 40 | this.filename = filename; 41 | } 42 | 43 | public String getAvatar_filename() { 44 | return avatar_filename; 45 | } 46 | 47 | public void setAvatar_filename(String avatar_filename) { 48 | this.avatar_filename = avatar_filename; 49 | } 50 | 51 | public String getStory_id() { 52 | return story_id; 53 | } 54 | 55 | public void setStory_id(String story_id) { 56 | this.story_id = story_id; 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/Tag.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class Tag { 4 | public int tag_id; 5 | public int x_axis; 6 | // int y_axis; 7 | // String username; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/model/User.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.model; 2 | 3 | public class User { 4 | String username; 5 | String email; 6 | String phone_number; 7 | String avatar_filename; 8 | String name; 9 | 10 | public String getUsername() { 11 | return username; 12 | } 13 | 14 | public void setUsername(String username) { 15 | this.username = username; 16 | } 17 | 18 | public String getEmail() { 19 | return email; 20 | } 21 | 22 | public void setEmail(String email) { 23 | this.email = email; 24 | } 25 | 26 | public String getPhone_number() { 27 | return phone_number; 28 | } 29 | 30 | public void setPhone_number(String phone_number) { 31 | this.phone_number = phone_number; 32 | } 33 | 34 | public String getAvatar_filename() { 35 | return avatar_filename; 36 | } 37 | 38 | public void setAvatar_filename(String avatar_filename) { 39 | this.avatar_filename = avatar_filename; 40 | } 41 | 42 | public String getName() { 43 | return name; 44 | } 45 | 46 | public void setName(String name) { 47 | this.name = name; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/security/JWTAuthenticationEntryPoint.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.security; 2 | 3 | import org.springframework.security.core.AuthenticationException; 4 | import org.springframework.security.web.AuthenticationEntryPoint; 5 | import org.springframework.stereotype.Component; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.Serializable; 11 | 12 | @Component 13 | public class JWTAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable { 14 | 15 | private static final long serialVersionUID = 5907023648091540313L; 16 | 17 | @Override 18 | public void commence(HttpServletRequest request, 19 | HttpServletResponse response, 20 | AuthenticationException authException) throws IOException { 21 | response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/security/JWTAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.security; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.FilterChain; 6 | import javax.servlet.ServletException; 7 | import javax.servlet.ServletRequest; 8 | import javax.servlet.ServletResponse; 9 | import javax.servlet.http.HttpServletRequest; 10 | 11 | import org.ititandev.service.TokenAuthenticationService; 12 | import org.ititandev.service.TokenAuthenticationServiceImpl; 13 | import org.springframework.security.core.Authentication; 14 | import org.springframework.security.core.context.SecurityContextHolder; 15 | import org.springframework.web.filter.GenericFilterBean; 16 | 17 | public class JWTAuthenticationFilter extends GenericFilterBean { 18 | 19 | private TokenAuthenticationService tokenAuthenticationService = new TokenAuthenticationServiceImpl(); 20 | 21 | @Override 22 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 23 | throws IOException, ServletException { 24 | Authentication authentication = tokenAuthenticationService.getAuthentication((HttpServletRequest) request); 25 | SecurityContextHolder.getContext().setAuthentication(authentication); 26 | filterChain.doFilter(request, response); 27 | SecurityContextHolder.getContext().setAuthentication(null); 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/security/JWTLoginFilter.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.security; 2 | 3 | import java.io.IOException; 4 | import java.nio.charset.StandardCharsets; 5 | import java.nio.file.Files; 6 | import java.nio.file.Paths; 7 | import java.util.Collections; 8 | 9 | import javax.servlet.FilterChain; 10 | import javax.servlet.ServletException; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | 14 | import org.ititandev.Application; 15 | import org.ititandev.config.Config; 16 | import org.ititandev.dao.AccountDAO; 17 | import org.ititandev.model.Account; 18 | import org.ititandev.service.MailService; 19 | import org.ititandev.service.TokenAuthenticationService; 20 | import org.ititandev.service.TokenAuthenticationServiceImpl; 21 | import org.springframework.security.authentication.AuthenticationManager; 22 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 23 | import org.springframework.security.core.Authentication; 24 | import org.springframework.security.core.AuthenticationException; 25 | import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; 26 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 27 | 28 | import com.fasterxml.jackson.databind.ObjectMapper; 29 | 30 | public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter { 31 | 32 | private TokenAuthenticationService tokenAuthenticationService = new TokenAuthenticationServiceImpl(); 33 | static AccountDAO accountDAO = Application.context.getBean("AccountDAO", AccountDAO.class); 34 | 35 | public JWTLoginFilter(String url, AuthenticationManager authManager) { 36 | super(new AntPathRequestMatcher(url)); 37 | setAuthenticationManager(authManager); 38 | } 39 | 40 | @Override 41 | public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) 42 | throws AuthenticationException, IOException, ServletException { 43 | 44 | Account account = new ObjectMapper().readValue(req.getInputStream(), Account.class); 45 | 46 | return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(account.getUsername(), 47 | account.getPassword(), Collections.emptyList())); 48 | } 49 | 50 | @Override 51 | protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, 52 | Authentication auth) throws IOException, ServletException { 53 | tokenAuthenticationService.addAuthentication(res, auth); 54 | String username = auth.getName(); 55 | String check = accountDAO.checkVerify(username); 56 | if (check.equals("false")) { 57 | String body1 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path1"))), 58 | StandardCharsets.UTF_8); 59 | String body2 = new String(Files.readAllBytes(Paths.get(Config.getConfig("mail.verify.path2"))), 60 | StandardCharsets.UTF_8); 61 | String verify = accountDAO.getVerifyLink(username); 62 | String email = accountDAO.getEmail(username); 63 | MailService.sendMail(email, "Instagram: Verify account", body1 + verify + body2); 64 | } 65 | res.getOutputStream().print(check); 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/security/TokenHandler.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.security; 2 | 3 | import java.util.Date; 4 | import java.util.UUID; 5 | 6 | import io.jsonwebtoken.Jwts; 7 | import io.jsonwebtoken.SignatureAlgorithm; 8 | 9 | public class TokenHandler { 10 | 11 | final long EXPIRATIONTIME = 7*24*60*60*1000; 12 | 13 | final String SECRET = "make by ititandev"; // private key, better read it from an external file 14 | 15 | final public String TOKEN_PREFIX = "Ins"; // the prefix of the token in the http header 16 | final public String HEADER_STRING = "Authorization"; // the http header containing the prexif + the token 17 | 18 | 19 | public String build(String username) { 20 | 21 | Date now = new Date(); 22 | 23 | String JWT = Jwts.builder() 24 | .setId(UUID.randomUUID().toString()) 25 | .setSubject(username) 26 | .setIssuedAt(now) 27 | .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)) 28 | //.compressWith(CompressionCodecs.DEFLATE) // uncomment to enable token compression 29 | .signWith(SignatureAlgorithm.HS512, SECRET) 30 | .compact(); 31 | 32 | return JWT; 33 | 34 | } 35 | 36 | public String parse(String token) { 37 | 38 | String username = Jwts.parser() 39 | .setSigningKey(SECRET) 40 | .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) 41 | .getBody() 42 | .getSubject(); 43 | 44 | return username; 45 | 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/service/MailService.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.service; 2 | 3 | import java.util.Properties; 4 | 5 | import javax.mail.Message; 6 | import javax.mail.MessagingException; 7 | import javax.mail.Session; 8 | import javax.mail.Transport; 9 | import javax.mail.internet.AddressException; 10 | import javax.mail.internet.InternetAddress; 11 | import javax.mail.internet.MimeMessage; 12 | 13 | import org.ititandev.config.Config; 14 | 15 | public class MailService { 16 | public static void sendMail(String _to, String subject, String body, String from, String pass) { 17 | if (from == null) 18 | from = Config.getConfig("mail.username"); 19 | if (pass == null) 20 | pass = Config.getConfig("mail.password"); 21 | String[] to = { _to }; 22 | Properties props = System.getProperties(); 23 | String host = "smtp.gmail.com"; 24 | props.put("mail.smtp.starttls.enable", "true"); 25 | props.put("mail.smtp.host", host); 26 | props.put("mail.smtp.user", from); 27 | props.put("mail.smtp.password", pass); 28 | props.put("mail.smtp.port", "587"); 29 | props.put("mail.smtp.auth", "true"); 30 | 31 | Session session = Session.getDefaultInstance(props); 32 | MimeMessage message = new MimeMessage(session); 33 | 34 | try { 35 | message.setFrom(new InternetAddress(from)); 36 | InternetAddress[] toAddress = new InternetAddress[to.length]; 37 | 38 | for (int i = 0; i < to.length; i++) { 39 | toAddress[i] = new InternetAddress(to[i]); 40 | } 41 | 42 | for (int i = 0; i < toAddress.length; i++) { 43 | message.addRecipient(Message.RecipientType.TO, toAddress[i]); 44 | } 45 | message.setContent(body, "text/html; charset=utf-8"); 46 | message.setSubject(subject); 47 | Transport transport = session.getTransport("smtp"); 48 | transport.connect(host, from, pass); 49 | transport.sendMessage(message, message.getAllRecipients()); 50 | transport.close(); 51 | System.out.println("Sent message successfully...."); 52 | } catch (AddressException ae) { 53 | ae.printStackTrace(); 54 | } catch (MessagingException me) { 55 | me.printStackTrace(); 56 | } 57 | } 58 | 59 | public static void sendMail(String to, String subject, String body) { 60 | sendMail(to, subject, body, Config.getConfig("mail.username"), Config.getConfig("mail.password")); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/org/ititandev/service/TokenAuthenticationService.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.service; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import org.springframework.security.core.Authentication; 7 | 8 | public interface TokenAuthenticationService { 9 | 10 | /** 11 | * When a user successfully logs into the application, create a token for that user. 12 | * 13 | * @param res An http response that will be filled with an 'Authentication' header containing the token. 14 | * @param username The username mapped to the user. 15 | */ 16 | void addAuthentication(HttpServletResponse res, Authentication authentication); 17 | 18 | /** 19 | * The JWTAuthenticationFilter calls this method to verify the user authentication. 20 | * If the token is not valid, the authentication fails and the request will be refused. 21 | * 22 | * @param request An http request that will be check for authentication token to verify. 23 | * @return 24 | */ 25 | Authentication getAuthentication(HttpServletRequest request); 26 | 27 | } -------------------------------------------------------------------------------- /src/main/java/org/ititandev/service/TokenAuthenticationServiceImpl.java: -------------------------------------------------------------------------------- 1 | package org.ititandev.service; 2 | 3 | import static java.util.Collections.emptyList; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | import org.ititandev.security.TokenHandler; 9 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 10 | import org.springframework.security.core.Authentication; 11 | import org.springframework.stereotype.Service; 12 | 13 | import io.jsonwebtoken.ExpiredJwtException; 14 | import io.jsonwebtoken.MalformedJwtException; 15 | import io.jsonwebtoken.SignatureException; 16 | import io.jsonwebtoken.UnsupportedJwtException; 17 | 18 | @Service 19 | public class TokenAuthenticationServiceImpl implements TokenAuthenticationService { 20 | 21 | private TokenHandler tokenHandler = new TokenHandler(); 22 | 23 | @Override 24 | public void addAuthentication(HttpServletResponse res, Authentication authentication) { 25 | 26 | String user = authentication.getName(); 27 | 28 | String JWT = tokenHandler.build(user); 29 | 30 | res.addHeader(tokenHandler.HEADER_STRING, tokenHandler.TOKEN_PREFIX + " " + JWT); 31 | } 32 | 33 | @Override 34 | public Authentication getAuthentication(HttpServletRequest request) { 35 | 36 | String token = request.getHeader(tokenHandler.HEADER_STRING); 37 | 38 | if (token != null && token.startsWith(tokenHandler.TOKEN_PREFIX)) { 39 | String user = null; 40 | 41 | try { 42 | user = tokenHandler.parse(token); 43 | } catch (ExpiredJwtException e) { 44 | e.printStackTrace(); 45 | } catch (UnsupportedJwtException e) { 46 | e.printStackTrace(); 47 | } catch (MalformedJwtException e) { 48 | e.printStackTrace(); 49 | } catch (SignatureException e) { 50 | e.printStackTrace(); 51 | } catch (IllegalArgumentException e) { 52 | e.printStackTrace(); 53 | } 54 | 55 | if (user != null) { 56 | return new UsernamePasswordAuthenticationToken(user, null, emptyList()); 57 | } else { 58 | return null; 59 | } 60 | } 61 | return null; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port = 8082 2 | #spring.http.multipart.enabled=false 3 | spring.http.multipart.max-file-size=400MB 4 | spring.http.multipart.max-request-size=400MB 5 | 6 | #spring.datasource.url=jdbc:mysql://localhost:3306/instagram 7 | #spring.datasource.username=root 8 | #spring.datasource.password="password" 9 | #spring.datasource.driver-class-name=com.mysql.jdbc.Driver -------------------------------------------------------------------------------- /src/test/java/org/ititandev/DemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package org.ititandev; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class DemoApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | System.out.println("tetsst"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /target/classes/Beans.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | 21 | 23 | 24 | 25 | 27 | 28 | 29 | 31 | 32 | 33 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /target/classes/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Implementation-Title: spring-security-jwt-rest-demo 3 | Implementation-Version: 0.0.1-SNAPSHOT 4 | Built-By: ITitan 5 | Implementation-Vendor-Id: org.ititandev 6 | Build-Jdk: 1.8.0_181 7 | Implementation-URL: http://projects.spring.io/spring-boot/instagram-ap 8 | i-clone/ 9 | Created-By: Maven Integration for Eclipse 10 | Implementation-Vendor: Pivotal Software, Inc. 11 | 12 | -------------------------------------------------------------------------------- /target/classes/META-INF/maven/org.ititandev/instagram-api-clone/pom.properties: -------------------------------------------------------------------------------- 1 | #Generated by Maven Integration for Eclipse 2 | #Mon Oct 22 10:23:14 ICT 2018 3 | version=0.0.1-SNAPSHOT 4 | groupId=org.ititandev 5 | m2e.projectName=instagram-api-clone 6 | m2e.projectLocation=C\:\\Users\\ITitan\\eclipse-workspace\\instagram-api-clone 7 | artifactId=instagram-api-clone 8 | -------------------------------------------------------------------------------- /target/classes/META-INF/maven/org.ititandev/instagram-api-clone/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | org.ititandev 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | spring-security-jwt-rest-demo 12 | Spring Security JWT Rest Demo 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.4.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-security 32 | 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-web 37 | 38 | 39 | 40 | io.jsonwebtoken 41 | jjwt 42 | 0.6.0 43 | 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-starter-test 48 | test 49 | 50 | 51 | mysql 52 | mysql-connector-java 53 | 8.0.11 54 | 55 | 56 | commons-dbcp 57 | commons-dbcp 58 | 1.4 59 | 60 | 61 | org.springframework 62 | spring-jdbc 63 | 3.0.3.RELEASE 64 | 65 | 66 | commons-io 67 | commons-io 68 | 2.6 69 | 70 | 71 | 72 | org.apache.httpcomponents 73 | httpclient 74 | 75 | 76 | 77 | org.json 78 | json 79 | 80 | 81 | 82 | org.springframework 83 | spring-jdbc 84 | 5.0.5.RELEASE 85 | 86 | 87 | javax.mail 88 | mail 89 | 1.4 90 | 91 | 92 | org.apache.commons 93 | commons-lang3 94 | 3.6 95 | 96 | 97 | 98 | 99 | 100 | 101 | org.springframework.boot 102 | spring-boot-maven-plugin 103 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | instagram-api-clone 117 | 118 | -------------------------------------------------------------------------------- /target/classes/application.properties: -------------------------------------------------------------------------------- 1 | server.port = 8082 2 | #spring.http.multipart.enabled=false 3 | spring.http.multipart.max-file-size=400MB 4 | spring.http.multipart.max-request-size=400MB 5 | 6 | #spring.datasource.url=jdbc:mysql://localhost:3306/instagram 7 | #spring.datasource.username=root 8 | #spring.datasource.password="password" 9 | #spring.datasource.driver-class-name=com.mysql.jdbc.Driver -------------------------------------------------------------------------------- /verify1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Simple Transactional Email 7 | 245 | 246 | 247 | 248 | 249 | 250 | 41 | 42 | 43 |
  251 |
252 | 253 | 254 | This is preheader text. Some clients will show this text as a preview. 255 | 256 | 257 | 258 | 259 | 16 | 17 | 18 | 19 |
260 | 261 | 262 | 13 | 14 |
263 |

Verify your email address.

264 |

Thanks for signing up for Instagram! We're excited to have you as an early userfdfsf

265 | 266 | 267 | 268 | 6 | 7 | 8 |
269 | 270 | 271 | 272 | 2 | 3 | 4 |
Verify account
5 |
9 |

10 |

Click the button to verify your account

11 |

Good luck! Hope it works.

12 |
15 |
20 | 21 | 22 | 36 | 37 | 38 | 39 |
40 |
 
44 | 45 | --------------------------------------------------------------------------------