Which are the set of needed Server side permissions to download a google sheet from Google Drive in my...












0















My specific issue is



when I call



driveService.files().export(fileId, "text/csv").executeMediaAndDownloadTo(outputStream);


From my App I get



11-22 00:35:02.489 : com.google.api.client.http.HttpResponseException: 401 Unauthorized
11-22 00:35:02.490 : {
11-22 00:35:02.491 : "error": {
11-22 00:35:02.491 : "errors": [
11-22 00:35:02.491 : {
11-22 00:35:02.491 : "domain": "global",
11-22 00:35:02.491 : "reason": "authError",
11-22 00:35:02.491 : "message": "Invalid Credentials",
11-22 00:35:02.492 : "locationType": "header",
11-22 00:35:02.492 : "location": "Authorization"
11-22 00:35:02.492 : }
11-22 00:35:02.492 : ],
11-22 00:35:02.492 : "code": 401,
11-22 00:35:02.492 : "message": "Invalid Credentials"
11-22 00:35:02.493 : }
11-22 00:35:02.493 : }


When I use APIs Explorer on
Services / Drive API v3 / drive.files.export
I get the data I want.



My Questions are:




  1. How can I fix this issue.


  2. As I get a google account when I sign in... is that not enough to know the user/password I've entered and which is registered in the smartphone ...Am I right?


  3. Which are the minimal set of permissions I need to set in servers side in order to have permissions


  4. How can I check which is the specific permission issue that does not allow to download the google sheet from google drive?



Thanks a lot for any response.



My Java code snippets related to this issue (sign in process)



In server side



My credentials for the app are:




  • Web client

  • Android Client


I use the Client id of "Web client"
If I use the clientId of Android client I don't get the idToken



Enabled Library API:




  • Google Drive API
    Authorize requests using Oauth 2.0 - On drive.files.export

  • Google Sheet API


In Android App



    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(this.googleClientId)
.requestEmail()
.build();

...

mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

...
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
...

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
validateGoogleUser(data);
}
}

...
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(this.dataIntent);
...
GoogleSignInAccount account = task.getResult(ApiException.class);
...
// It returns my account with id / idToken / mail / names / ... more


And then... I continue


In the method I try to download this is the code



        //TODO: move this to a service and to a dao
final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();;
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);



Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
String fileId = idSheet;
//TODO: Check how to check progress and limit size of download or cancel the operation after n seconds
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "text/csv")
.executeMediaAndDownloadTo(outputStream);


NOTE : I don't use
- GoogleIdTokenVerifier.verify



nor I know for what it is ... as I already get my account info.










share|improve this question

























  • Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

    – Mr.Rebot
    Nov 23 '18 at 5:04











  • Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

    – yo no se tampoco
    Nov 23 '18 at 9:44













  • About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

    – yo no se tampoco
    Nov 23 '18 at 9:47


















0















My specific issue is



when I call



driveService.files().export(fileId, "text/csv").executeMediaAndDownloadTo(outputStream);


From my App I get



11-22 00:35:02.489 : com.google.api.client.http.HttpResponseException: 401 Unauthorized
11-22 00:35:02.490 : {
11-22 00:35:02.491 : "error": {
11-22 00:35:02.491 : "errors": [
11-22 00:35:02.491 : {
11-22 00:35:02.491 : "domain": "global",
11-22 00:35:02.491 : "reason": "authError",
11-22 00:35:02.491 : "message": "Invalid Credentials",
11-22 00:35:02.492 : "locationType": "header",
11-22 00:35:02.492 : "location": "Authorization"
11-22 00:35:02.492 : }
11-22 00:35:02.492 : ],
11-22 00:35:02.492 : "code": 401,
11-22 00:35:02.492 : "message": "Invalid Credentials"
11-22 00:35:02.493 : }
11-22 00:35:02.493 : }


When I use APIs Explorer on
Services / Drive API v3 / drive.files.export
I get the data I want.



My Questions are:




  1. How can I fix this issue.


  2. As I get a google account when I sign in... is that not enough to know the user/password I've entered and which is registered in the smartphone ...Am I right?


  3. Which are the minimal set of permissions I need to set in servers side in order to have permissions


  4. How can I check which is the specific permission issue that does not allow to download the google sheet from google drive?



Thanks a lot for any response.



My Java code snippets related to this issue (sign in process)



In server side



My credentials for the app are:




  • Web client

  • Android Client


I use the Client id of "Web client"
If I use the clientId of Android client I don't get the idToken



Enabled Library API:




  • Google Drive API
    Authorize requests using Oauth 2.0 - On drive.files.export

  • Google Sheet API


In Android App



    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(this.googleClientId)
.requestEmail()
.build();

...

mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

...
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
...

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
validateGoogleUser(data);
}
}

...
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(this.dataIntent);
...
GoogleSignInAccount account = task.getResult(ApiException.class);
...
// It returns my account with id / idToken / mail / names / ... more


And then... I continue


In the method I try to download this is the code



        //TODO: move this to a service and to a dao
final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();;
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);



Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
String fileId = idSheet;
//TODO: Check how to check progress and limit size of download or cancel the operation after n seconds
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "text/csv")
.executeMediaAndDownloadTo(outputStream);


NOTE : I don't use
- GoogleIdTokenVerifier.verify



nor I know for what it is ... as I already get my account info.










share|improve this question

























  • Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

    – Mr.Rebot
    Nov 23 '18 at 5:04











  • Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

    – yo no se tampoco
    Nov 23 '18 at 9:44













  • About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

    – yo no se tampoco
    Nov 23 '18 at 9:47
















0












0








0








My specific issue is



when I call



driveService.files().export(fileId, "text/csv").executeMediaAndDownloadTo(outputStream);


From my App I get



11-22 00:35:02.489 : com.google.api.client.http.HttpResponseException: 401 Unauthorized
11-22 00:35:02.490 : {
11-22 00:35:02.491 : "error": {
11-22 00:35:02.491 : "errors": [
11-22 00:35:02.491 : {
11-22 00:35:02.491 : "domain": "global",
11-22 00:35:02.491 : "reason": "authError",
11-22 00:35:02.491 : "message": "Invalid Credentials",
11-22 00:35:02.492 : "locationType": "header",
11-22 00:35:02.492 : "location": "Authorization"
11-22 00:35:02.492 : }
11-22 00:35:02.492 : ],
11-22 00:35:02.492 : "code": 401,
11-22 00:35:02.492 : "message": "Invalid Credentials"
11-22 00:35:02.493 : }
11-22 00:35:02.493 : }


When I use APIs Explorer on
Services / Drive API v3 / drive.files.export
I get the data I want.



My Questions are:




  1. How can I fix this issue.


  2. As I get a google account when I sign in... is that not enough to know the user/password I've entered and which is registered in the smartphone ...Am I right?


  3. Which are the minimal set of permissions I need to set in servers side in order to have permissions


  4. How can I check which is the specific permission issue that does not allow to download the google sheet from google drive?



Thanks a lot for any response.



My Java code snippets related to this issue (sign in process)



In server side



My credentials for the app are:




  • Web client

  • Android Client


I use the Client id of "Web client"
If I use the clientId of Android client I don't get the idToken



Enabled Library API:




  • Google Drive API
    Authorize requests using Oauth 2.0 - On drive.files.export

  • Google Sheet API


In Android App



    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(this.googleClientId)
.requestEmail()
.build();

...

mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

...
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
...

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
validateGoogleUser(data);
}
}

...
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(this.dataIntent);
...
GoogleSignInAccount account = task.getResult(ApiException.class);
...
// It returns my account with id / idToken / mail / names / ... more


And then... I continue


In the method I try to download this is the code



        //TODO: move this to a service and to a dao
final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();;
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);



Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
String fileId = idSheet;
//TODO: Check how to check progress and limit size of download or cancel the operation after n seconds
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "text/csv")
.executeMediaAndDownloadTo(outputStream);


NOTE : I don't use
- GoogleIdTokenVerifier.verify



nor I know for what it is ... as I already get my account info.










share|improve this question
















My specific issue is



when I call



driveService.files().export(fileId, "text/csv").executeMediaAndDownloadTo(outputStream);


From my App I get



11-22 00:35:02.489 : com.google.api.client.http.HttpResponseException: 401 Unauthorized
11-22 00:35:02.490 : {
11-22 00:35:02.491 : "error": {
11-22 00:35:02.491 : "errors": [
11-22 00:35:02.491 : {
11-22 00:35:02.491 : "domain": "global",
11-22 00:35:02.491 : "reason": "authError",
11-22 00:35:02.491 : "message": "Invalid Credentials",
11-22 00:35:02.492 : "locationType": "header",
11-22 00:35:02.492 : "location": "Authorization"
11-22 00:35:02.492 : }
11-22 00:35:02.492 : ],
11-22 00:35:02.492 : "code": 401,
11-22 00:35:02.492 : "message": "Invalid Credentials"
11-22 00:35:02.493 : }
11-22 00:35:02.493 : }


When I use APIs Explorer on
Services / Drive API v3 / drive.files.export
I get the data I want.



My Questions are:




  1. How can I fix this issue.


  2. As I get a google account when I sign in... is that not enough to know the user/password I've entered and which is registered in the smartphone ...Am I right?


  3. Which are the minimal set of permissions I need to set in servers side in order to have permissions


  4. How can I check which is the specific permission issue that does not allow to download the google sheet from google drive?



Thanks a lot for any response.



My Java code snippets related to this issue (sign in process)



In server side



My credentials for the app are:




  • Web client

  • Android Client


I use the Client id of "Web client"
If I use the clientId of Android client I don't get the idToken



Enabled Library API:




  • Google Drive API
    Authorize requests using Oauth 2.0 - On drive.files.export

  • Google Sheet API


In Android App



    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(this.googleClientId)
.requestEmail()
.build();

...

mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

...
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
...

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
validateGoogleUser(data);
}
}

...
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(this.dataIntent);
...
GoogleSignInAccount account = task.getResult(ApiException.class);
...
// It returns my account with id / idToken / mail / names / ... more


And then... I continue


In the method I try to download this is the code



        //TODO: move this to a service and to a dao
final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();;
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);



Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
String fileId = idSheet;
//TODO: Check how to check progress and limit size of download or cancel the operation after n seconds
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "text/csv")
.executeMediaAndDownloadTo(outputStream);


NOTE : I don't use
- GoogleIdTokenVerifier.verify



nor I know for what it is ... as I already get my account info.







android oauth-2.0 google-api google-drive-sdk google-signin






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 22 '18 at 9:28









DaImTo

45.2k1162241




45.2k1162241










asked Nov 22 '18 at 9:25









yo no se tampocoyo no se tampoco

1




1













  • Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

    – Mr.Rebot
    Nov 23 '18 at 5:04











  • Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

    – yo no se tampoco
    Nov 23 '18 at 9:44













  • About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

    – yo no se tampoco
    Nov 23 '18 at 9:47





















  • Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

    – Mr.Rebot
    Nov 23 '18 at 5:04











  • Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

    – yo no se tampoco
    Nov 23 '18 at 9:44













  • About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

    – yo no se tampoco
    Nov 23 '18 at 9:47



















Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

– Mr.Rebot
Nov 23 '18 at 5:04





Try following Android or Java quickstart. They both have different client ID types, the first is for Android application which requires you to create Signing-certificate fingerprint while the later is for using Web application client IDs. As long as the scope you are using is not readonly or to be sure, use https://www.googleapis.com/auth/drive this will allow you to any access to read, download, write or upload file content.

– Mr.Rebot
Nov 23 '18 at 5:04













Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

– yo no se tampoco
Nov 23 '18 at 9:44







Thanks... I will check it. I understand now that surely the problem is in the way I'm creating the credential object GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); I will check that code and also found many others that solve the sign in process in different ways using diverse classes from diverse packages.... Buy I will check the one you mention.... Thanks

– yo no se tampoco
Nov 23 '18 at 9:44















About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

– yo no se tampoco
Nov 23 '18 at 9:47







About the fingerprint I'm using the android debug provided certificate in debug environment. And the last error I got with credentials is Caused by: java.lang.SecurityException: caller uid 10058 lacks any of android.permission.GET_ACCOUNTS trying to apply the solution in youtube.com/watch?v=9GlFZ1wWUk4

– yo no se tampoco
Nov 23 '18 at 9:47














1 Answer
1






active

oldest

votes


















0














I've found a solution of the problem. The rights of the server side were ok. But in this project I've forked is the combination of Google Sign in and Google drive connection I need to download or use Google Drive files from my Android app



https://github.com/jguastav/android-GoogleDriveSample






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53427613%2fwhich-are-the-set-of-needed-server-side-permissions-to-download-a-google-sheet-f%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I've found a solution of the problem. The rights of the server side were ok. But in this project I've forked is the combination of Google Sign in and Google drive connection I need to download or use Google Drive files from my Android app



    https://github.com/jguastav/android-GoogleDriveSample






    share|improve this answer




























      0














      I've found a solution of the problem. The rights of the server side were ok. But in this project I've forked is the combination of Google Sign in and Google drive connection I need to download or use Google Drive files from my Android app



      https://github.com/jguastav/android-GoogleDriveSample






      share|improve this answer


























        0












        0








        0







        I've found a solution of the problem. The rights of the server side were ok. But in this project I've forked is the combination of Google Sign in and Google drive connection I need to download or use Google Drive files from my Android app



        https://github.com/jguastav/android-GoogleDriveSample






        share|improve this answer













        I've found a solution of the problem. The rights of the server side were ok. But in this project I've forked is the combination of Google Sign in and Google drive connection I need to download or use Google Drive files from my Android app



        https://github.com/jguastav/android-GoogleDriveSample







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 4 '18 at 5:08









        yo no se tampocoyo no se tampoco

        1




        1
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53427613%2fwhich-are-the-set-of-needed-server-side-permissions-to-download-a-google-sheet-f%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

            Alcedinidae

            RAC Tourist Trophy