Change:
Some users can claim python, new QA, and new infosec certifications without submitting their required projects on .dev. It seems the api does not find the cert challenge and proceeds by setting the related cert flag on the user object to true. The issue can be resolved by reseeding the db locally. I cannot reproduce this issue at the moment, but I will keep this open in case other users are experiencing the same issue.
Hello! I tested this issue, and I was able to claim the certifications without completing the projects.
could you check if you can see the certification after claiming it? I'm just wondering if this is purely a client-side issue.
I am able to see the four certificates I could claim, yes.
Thanks for checking that. In that case, while it seems likely that it will fine if the database is migrated, the api should definitely default to rejecting certifications it does recognise.
Yes We Can Claim Python Certification Without submitting the Projects.
that's really serious

Discussion:
import debug from 'debug'; import { isEmail } from 'validator'; import format from 'date-fns/format'; <ins> import { reportError } from '../middlewares/sentry-error-handler.js'; </ins> import { ifNoUser401 } from '../utils/middleware'; import { observeQuery } from '../utils/rx';

Congratulations on behalf of the freeCodeCamp.org team! `; <ins> const failureMessage = name => dedent` Something went wrong with the verification of ${name}, please try again. If you continue to receive this error, you can send a message to support@freeCodeCamp.org to get help. `; </ins> function ifNoSuperBlock404(req, res, next) { const { superBlock } = req.body; if (superBlock && superBlocks.includes(superBlock)) {

[certType]: true }; <del> if (challenge) { const { id, tests, challengeType } = challenge; if ( !user[certType] && !isCertified(tests, user.completedChallenges) ) { return Observable.just(notCertifiedMessage(certName)); } updateData = { ...updateData, completedChallenges: [ ...user.completedChallenges, { id, completedDate: new Date(), challengeType } ] }; </del> <ins> // certificate doesn't exist or // connection error if (!challenge) { reportError(`Error claiming ${certName}`); return Observable.just(failureMessage(certName)); } const { id, tests, challengeType } = challenge; if (!user[certType] && !isCertified(tests, user.completedChallenges)) { return Observable.just(notCertifiedMessage(certName)); </ins> } <ins> updateData = { ...updateData, completedChallenges: [ ...user.completedChallenges, { id, completedDate: new Date(), challengeType } ] }; </ins> if (!user.name) { return Observable.just(noNameMessage);

is2018DataVisCert, isApisMicroservicesCert, isFrontEndLibsCert, <del> is2020QaCert, is2020InfosecCert, </del> <ins> isInfosecQaCert, </ins> isJsAlgoDataStructCert, isRespWebDesignCert } = this.props;

is2018DataVisCert && isApisMicroservicesCert && isFrontEndLibsCert && <del> is2020QaCert && is2020InfosecCert && </del> <ins> isInfosecQaCert && </ins> isJsAlgoDataStructCert && isRespWebDesignCert;

return ( <FullWidthRow key={superBlock}> <Spacer /> <del> <h3>Full Stack Certification</h3> </del> <ins> <h3>Legacy Full Stack Certification</h3> </ins> <div> <p> Once you've earned the following freeCodeCamp certifications, you'll <del> be able to claim The Full Stack Developer Certification: </del> <ins> be able to claim the Legacy Full Stack Developer Certification: </ins> </p> <ul> <li>Responsive Web Design</li>

<li>Front End Libraries</li> <li>Data Visualization</li> <li>APIs and Microservices</li> <del> <li>Quality Assurance</li> </del> <ins> <li>Legacy Information Security and Quality Assurance</li> </ins> </ul> </div>

<ins> { "name": "Full Stack Certificate", "dashedName": "full-stack-certificate", "order": 5, "time": "", "template": "", "required": [], "superBlock": "certificates", "superOrder": 12, "challengeOrder": [ [ "561add10cb82ac38a17213bd", "Full Stack Certificate" ] ], "isPrivate": true, "fileName": "12-certificates/full-stack-certificate.json" } </ins>

<ins> --- id: 561add10cb82ac38a17213bd title: Full Stack Certificate challengeType: 7 isHidden: false isPrivate: true --- ## Description <section id='description'> </section> ## Instructions <section id='instructions'> </section> ## Tests <section id='tests'> ```yml tests: - id: 561add10cb82ac38a17513bc title: Responsive Web Design Certificate - id: 561abd10cb81ac38a17513bc title: JavaScript Algorithms and Data Structures Certificate - id: 561acd10cb82ac38a17513bc title: Front End Libraries Certificate - id: 5a553ca864b52e1d8bceea14 title: Data Visualization Certificate - id: 561add10cb82ac38a17523bc title: API's and Microservices Certificate - id: 561add10cb82ac38a17213bc title: Legacy Information Security and Quality Assurance Certificate ``` </section> ## Challenge Seed <section id='challengeSeed'> </section> ## Solution <section id='solution'> ```js // solution required ``` </section> </ins>