3

My website's Facebook Login stopped working after Facebook released a patch yesterday (December 6, 2015 12:00am). Facebook Login worked yesterday afternoon.

It looks like Facebook might have updated their code with a different integer range (from 32-bit to 64-bit) for their video_upload_limits and this is preventing my customers from logging in.

Does anyone know how I can report this bug to the Spring Social Facebook team and give them more details about this issue?

I am on the latest version of Spring Social and Spring Social Facebook.

Thanks if you can forward this or get me in touch with the Spring Social Facebook team.

Here's the full exception:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Numeric value (2505397589) out of range of int
  at [Source: java.io.ByteArrayInputStream@7b5948ea; line: 1, column: 2889] (through reference chain: org.springframework.social.facebook.api.User["video_upload_limits"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Numeric value (2505397589) out of range of int
  at [Source: java.io.ByteArrayInputStream@7b5948ea; line: 1, column: 2889] (through reference chain: org.springframework.social.facebook.api.User["video_upload_limits"])
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:216)
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:208)
  at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549)
  at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:517)
  at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:255)
  at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:214)
  at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:209)
  at org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:53)
  at org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:49)
  at org.springframework.social.facebook.connect.FacebookAdapter.setConnectionValues(FacebookAdapter.java:43)
  at org.springframework.social.facebook.connect.FacebookAdapter.setConnectionValues(FacebookAdapter.java:31)
  at org.springframework.social.connect.support.AbstractConnection.setValues(AbstractConnection.java:175)
  at org.springframework.social.connect.support.AbstractConnection.initKey(AbstractConnection.java:137)
  at org.springframework.social.connect.support.OAuth2Connection.<init>(OAuth2Connection.java:75)
  at org.springframework.social.connect.support.OAuth2ConnectionFactory.createConnection(OAuth2ConnectionFactory.java:93)
  at org.springframework.social.connect.web.ConnectSupport.completeConnection(ConnectSupport.java:161)
  at org.springframework.social.connect.web.ProviderSignInController.oauth2Callback(ProviderSignInController.java:228)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:102)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
  at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
  at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
  at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
  at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
  at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
  at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
  at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
  at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:73)
  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at com.ampedmojo.genesis.web.filter.ApplicationMenuFilter.doFilter(ApplicationMenuFilter.java:70)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at com.ampedmojo.genesis.web.filter.CaptureCurrentRequestFilter.doFilter(CaptureCurrentRequestFilter.java:45)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:177)
  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at com.ampedmojo.genesis.web.filter.GzipFilter.doFilter(GzipFilter.java:72)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
  at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
  at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:745) Caused by: com.fasterxml.jackson.databind.JsonMappingException: Numeric value (2505397589) out of range of int
  at [Source: java.io.ByteArrayInputStream@7b5948ea; line: 1, column: 2889] (through reference chain: org.springframework.social.facebook.api.User["video_upload_limits"])
  at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)
  at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:177)
  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1428)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:240)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
  at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2221)
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:213)     ... 84 more Caused by: com.fasterxml.jackson.core.JsonParseException: Numeric value (2505397589) out of range of int
  at [Source: java.io.ByteArrayInputStream@7b5948ea; line: 1, column: 2889]
  at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1419)
  at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:508)
  at com.fasterxml.jackson.core.base.ParserBase.convertNumberToInt(ParserBase.java:808)
  at com.fasterxml.jackson.core.base.ParserBase.getIntValue(ParserBase.java:608)
  at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:379)
  at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:289)
  at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:271)
  at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
  at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
  at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:106)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:238)    ... 88 more
Jagger
  • 10,350
  • 9
  • 51
  • 93
Eric Wo
  • 71
  • 2
  • I don't see a bug reporter or critical support team, but you could [tweet them](http://spring.io/team), contact [their parent company](https://pivotal.io/), email [legal@pivotal.io](mailto:legal@pivotal.io), fill out [the spring support contact form](https://pivotal.io/contact/spring-support), etc. – Aaron Brager Dec 07 '15 at 07:41
  • 1
    They noticed this already. Here is a link to get in touch with the team. [https://github.com/spring-projects/spring-social-facebook/issues/181](https://github.com/spring-projects/spring-social-facebook/issues/181) – Brian P. Dec 07 '15 at 07:56
  • Thanks Brian. You're awesome!!! – Eric Wo Dec 07 '15 at 08:08

1 Answers1

0

Just wanted to summarize the fixes available, though the question did not ask for a fix.

Until the official fix comes we have below options:

  1. Extend FacebookTemplate class and give only those fields to de-serialize which you require in User.class. :

Sample snippet:

class MyFacebookTemplate extends FacebookTemplate {

// This doesnot contain: video_upload_limits which was causing the issue
static final String[] MY_PROFILE_FIELDS = {
        "id", "about", "age_range", "address", "bio", "birthday", "context", "cover", "currency", "devices", "education", "email", 
        "favorite_athletes", "favorite_teams", "first_name", "gender", "hometown", "inspirational_people", "installed", "install_type",
        "is_verified", "languages", "last_name", "link", "locale", "location", "meeting_for", "middle_name", "name", "name_format", 
        "political", "quotes", "payment_pricepoints", "relationship_status", "religion", "security_settings", "significant_other", 
        "sports", "test_group", "timezone", "third_party_id", "updated_time", "verified", "viewer_can_send_gift", 
        "website", "work"
    };

public MyFacebookTemplate(String accessToken) {
    super(accessToken);

}

//New method, not in the original interface
public User getUserProfile() {
    return this.fetchObject("me", User.class, MY_PROFILE_FIELDS);
}

}

This does minimal code changes as in case if we override the userOperations() method then we also need to have a UserTemplate class of our own as this class is not public.

The usage of this could be like:

    public static void main(String... a) throws Exception {
    MyFacebookTemplate fb = new MyFacebookTemplate("token");
    User user = fb.getUserProfile();
    System.out.println(user.getEmail());
}
  1. As mentioned in the link, use reflection and remove the video_upload_limit from the UserOperations.java.

    @PostConstruct
    private void init() 
    {
      // hack for the login of facebook.
      try {
    
         String[] fieldsToMap = {
            "id", "about", "age_range", "address", "bio", "birthday", "context", "cover", "currency", "devices", "education", "email",
            "favorite_athletes", "favorite_teams", "first_name", "gender", "hometown", "inspirational_people", "installed", "install_type",
            "is_verified", "languages", "last_name", "link", "locale", "location", "meeting_for", "middle_name", "name", "name_format",
            "political", "quotes", "payment_pricepoints", "relationship_status", "religion", "security_settings", "significant_other",
            "sports", "test_group", "timezone", "third_party_id", "updated_time", "verified", "viewer_can_send_gift",
            "website", "work"
        };
    
        Field field = Class.forName("org.springframework.social.facebook.api.UserOperations")
            .getDeclaredField("PROFILE_FIELDS");
        field.setAccessible(true);
    
        Field modifiers = field.getClass().getDeclaredField("modifiers");
        modifiers.setAccessible(true);
        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(null, fieldsToMap);
        } catch (Exception ex) {
            ex.printStackTrace();
    
        }
    }
    
  2. Or you could change the source code itself, its up to you but probably I wouldn't do it.

Sandeep B
  • 765
  • 1
  • 6
  • 19
  • Point 2. will not work, because you copied the code wrong: In your code the variable `field` will never be set. See original answer: http://stackoverflow.com/a/34133450/1943228 – kamwo Dec 08 '15 at 20:06
  • Yes, updated the code, thanks. – Sandeep B Dec 09 '15 at 04:38